From 50c40cc32743fea4efcde506ccc9200d900489fc Mon Sep 17 00:00:00 2001 From: bretg Date: Mon, 3 Jun 2024 13:15:25 -0400 Subject: [PATCH 001/816] Update Gemfile for FFI version (#5384) --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 4d0186505c..752b337f20 100755 --- a/Gemfile +++ b/Gemfile @@ -1,4 +1,4 @@ source 'https://rubygems.org' gem 'github-pages', '>= 228' - +gem 'ffi', '1.16.3' gem "webrick", "~> 1.7" From e7c55da2dd6b60d3f85dec7b153ec4e509f0e3a4 Mon Sep 17 00:00:00 2001 From: Jono Sligh <139150153+jsligh@users.noreply.github.com> Date: Mon, 3 Jun 2024 12:20:13 -0500 Subject: [PATCH 002/816] Fixed typo (c+p error) (#5385) --- prebid-mobile/modules/rendering/ios-sdk-integration-gam.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md b/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md index 26cdd8eb3f..59bb7df5b8 100644 --- a/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md +++ b/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md @@ -34,7 +34,7 @@ If you do not have GMA SDK in the app yet, refer to the [Google Integration Docu Prebid SDK provides rendering integration into GAM setup thru [app events](https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner#app_events) mechanism. To integrate Prebid Event Handlers into your app, add the following line to your Podfile: ```pod -pod 'PrebidMobileAdMobAdapters' +pod 'PrebidMobileGAMEventHandlers' ``` ## Event Handlers Initialization From a99f0671855884fc611ba5c45ab4582ed0706997 Mon Sep 17 00:00:00 2001 From: SmartHubSolutions <87376145+SmartHubSolutions@users.noreply.github.com> Date: Tue, 4 Jun 2024 17:12:58 +0300 Subject: [PATCH 003/816] add adapter Tredio (#5348) * add adapter Tredio * update due review * add aliasCode * end with a single newline character --------- Co-authored-by: Victor --- dev-docs/bidders/tredio.md | 39 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 dev-docs/bidders/tredio.md diff --git a/dev-docs/bidders/tredio.md b/dev-docs/bidders/tredio.md new file mode 100644 index 0000000000..0b820465a0 --- /dev/null +++ b/dev-docs/bidders/tredio.md @@ -0,0 +1,39 @@ +--- +layout: bidder +title: Tredio +description: Tredio Bidder Adapter +biddercode: tredio +aliasCode : smarthub +usp_supported: true +coppa_supported: true +schain_supported: true +dchain_supported: true +media_types: banner, video, native +safeframes_ok: true +deals_supported: true +floors_supported: true +fpd_supported: false +pbjs: true +pbs: true +pbs_app_supported: true +multiformat_supported: true +--- + +### Prebid.js Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|---------------------------------|-------------------------------------|-----------| +| `seat` | required | Seat value | `'9Q20EdGxzgWdfPYShScl'` | `string` | +| `token` | required | Token | `'eKmw6alpP3zWQhRCe3flOpz0wpuwRFjW'` | `string` | +| `iabCat` | optional | Array of IAB content categories that describe the content producer | `['IAB1-1', 'IAB3-1', 'IAB4-3']` | `Array(String)` | +| `minBidfloor` | optional | Minimal CPM value | `0.03` | `float` | +| `pos` | optional | The position of the placement on the page, see Open RTB spec v2.5. | `4` | `number` | + +### Prebid Server Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|---------------------|--------------------------------------|----------| +| `seat` | required | Seat value | `'9Q20EdGxzgWdfPYShScl'` | `string` | +| `token` | required | Token | `'eKmw6alpP3zWQhRCe3flOpz0wpuwRFjW'` | `string` | From c7ace0cbf7fe13ce7073c75ab6678d1cb098e783 Mon Sep 17 00:00:00 2001 From: SmartHubSolutions <87376145+SmartHubSolutions@users.noreply.github.com> Date: Tue, 4 Jun 2024 17:14:41 +0300 Subject: [PATCH 004/816] add adapter JDPMedia (#5339) * add adapter JDPMedia * update docs due review * add aliasCode --------- Co-authored-by: Victor --- dev-docs/bidders/jdpmedia.md | 39 ++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 dev-docs/bidders/jdpmedia.md diff --git a/dev-docs/bidders/jdpmedia.md b/dev-docs/bidders/jdpmedia.md new file mode 100644 index 0000000000..5b2367ed9a --- /dev/null +++ b/dev-docs/bidders/jdpmedia.md @@ -0,0 +1,39 @@ +--- +layout: bidder +title: JDPMedia +description: JDPMedia Bidder Adapter +biddercode: jdpmedia +aliasCode : smarthub +usp_supported: true +coppa_supported: true +schain_supported: true +dchain_supported: true +media_types: banner, video, native +safeframes_ok: true +deals_supported: true +floors_supported: true +fpd_supported: false +pbjs: true +pbs: true +pbs_app_supported: true +multiformat_supported: true +--- + +### Prebid.js Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|---------------------------------|-------------------------------------|-----------| +| `seat` | required | Seat value | `'9Q20EdGxzgWdfPYShScl'` | `string` | +| `token` | required | Token | `'eKmw6alpP3zWQhRCe3flOpz0wpuwRFjW'` | `string` | +| `iabCat` | optional | Array of IAB content categories that describe the content producer | `['IAB1-1', 'IAB3-1', 'IAB4-3']` | `Array(String)` | +| `minBidfloor` | optional | Minimal CPM value | `0.03` | `float` | +| `pos` | optional | The position of the placement on the page, see Open RTB spec v2.5. | `4` | `number` | + +### Prebid Server Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|---------------------|--------------------------------------|----------| +| `seat` | required | Seat value | `'9Q20EdGxzgWdfPYShScl'` | `string` | +| `token` | required | Token | `'eKmw6alpP3zWQhRCe3flOpz0wpuwRFjW'` | `string` | From 46b03bcf9541b6a709650f3bd016e16a507e3977 Mon Sep 17 00:00:00 2001 From: Patrick McCann Date: Tue, 4 Jun 2024 19:36:28 -0400 Subject: [PATCH 005/816] Update integrate-with-the-prebid-analytics-api.md (#5392) documents https://github.com/prebid/Prebid.js/pull/11682 --- dev-docs/integrate-with-the-prebid-analytics-api.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/integrate-with-the-prebid-analytics-api.md b/dev-docs/integrate-with-the-prebid-analytics-api.md index ba1a9dfb42..f7518828c3 100644 --- a/dev-docs/integrate-with-the-prebid-analytics-api.md +++ b/dev-docs/integrate-with-the-prebid-analytics-api.md @@ -150,6 +150,7 @@ There are two error events analytics modules may wish to listen for: auctionDebu * listen only to the events required * batch up calls to the backend for post-auction logging rather than calling immediately after each event. +* consider using the keepalive option on the ajax request to keep the priority low and the request queued after the pageview dies ### Step 3: Add unit tests From fe8201ee9fec88923d06a45667f4207be93f40d1 Mon Sep 17 00:00:00 2001 From: Jeff Mahoney Date: Thu, 6 Jun 2024 14:08:28 -0400 Subject: [PATCH 006/816] Update sharethrough.md (#5374) * Update sharethrough.md * Add some additional information to the bidder documentation. * Update sharethrough.md Lint fix * Update sharethrough.md Include language in code block. --- dev-docs/bidders/sharethrough.md | 73 ++++++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidders/sharethrough.md b/dev-docs/bidders/sharethrough.md index f3673a5291..fa18d284fe 100644 --- a/dev-docs/bidders/sharethrough.md +++ b/dev-docs/bidders/sharethrough.md @@ -21,7 +21,7 @@ ortb_blocking_supported: partial sidebarType: 1 --- -### Note +### Before You Begin The Sharethrough bidder adapter requires additional setup and approval from the Sharethrough Integrations team. Please reach out to your account manager for more information to start using it. @@ -34,8 +34,47 @@ The Sharethrough bidder adapter requires additional setup and approval from the | `bcat` | optional | (deprecated) Array of blocked IAB Categories | `['IAB1-2', 'IAB1-3']` | `string[]` | | `badv` | optional | (deprecated) Array of blocked Advertisers by their domains | `['ford.com', 'pepsi.com']` | `string[]` | -Note: Providing `bcat` and `badv` via Bid Params is deprecated, the First Party Data method should be preferred (see below). -When both methods are provided, first party data values will be used and bid param values will be ignored. +**Note**: Providing `bcat` and `badv` via Bid Params is deprecated, the First Party Data method should be preferred (see below). +When both methods are provided (i.e. when `badv` and `bcat` are specified both as bid params and through the first party ortb2 method), first party data values will be used and bid param values will be ignored. + +#### Configuration + +Sample banner setup: + +```js + +``` #### First Party Data @@ -86,3 +125,31 @@ pbjs.setConfig({ } }); ``` + +### Additional Notes + +#### Request and Response Attributes + +- TTL is 360 for display and native, 3600 for video (in milliseconds). +- Safeframes are supported. +- Advertiser domains are available in bid responses at `meta.advertiserDomains` +- Bids are returned in **net** - that is, the bids returned reflect the bid amount with revenue sharing already taken into account. No adjustment is necessary. +- Sharethrough is GDPR and COPPA compliant. + +#### Supported Media Types + +- Banner +- Native +- Video (instream and outstream) + +#### Default Ad Server Key Value + +- `sharethrough` + +### Prebid Module Support + +For publishers using PBJS version 5 and above, current module support includes: + +- Price Floors +- Supply Chain Object +- User ID From f287fa09aada91cfcb89ef2ada4bc22703f03ff5 Mon Sep 17 00:00:00 2001 From: Carlos Felix Date: Thu, 6 Jun 2024 13:18:15 -0500 Subject: [PATCH 007/816] 33across - use video.plcmt instead of video.placement (#5375) --- dev-docs/bidders/33across.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidders/33across.md b/dev-docs/bidders/33across.md index 4076fae58b..c5dea1516c 100644 --- a/dev-docs/bidders/33across.md +++ b/dev-docs/bidders/33across.md @@ -68,7 +68,7 @@ var adUnits = [ context: 'outstream', // required mimes: ['video/mp4','video/x-flv'], // required protocols: [ 2, 3 ], // required, set at least 1 value in array - placement: 2, // optional, defaults to 2 when context = outstream + plcmt: 2, // optional, defaults to 2 when context = outstream api: [ 1, 2 ], // optional skip: 0, // optional minduration: 5, // optional @@ -104,7 +104,7 @@ var adUnits = [ context: 'instream', // required mimes: ['video/mp4','video/x-flv'], // required protocols: [ 2, 3 ], // required, set at least 1 value in array - placement: 1, // optional, defaults to 1 when context = instream + plcmt: 1, // optional, defaults to 1 when context = instream startdelay: 0, // optional, defaults to 0 when context = instream api: [ 1, 2 ], // optional skip: 0, // optional @@ -147,7 +147,7 @@ var adUnits = [ context: 'outstream', // required mimes: ['video/mp4','video/x-flv'], // required protocols: [ 2, 3 ], // required, set at least 1 value in array - placement: 2, // optional, defaults to 2 when context = outstream + plcmt: 2, // optional, defaults to 2 when context = outstream api: [ 1, 2 ], // optional skip: 0, // optional minduration: 5, // optional From b454d0dce5093673469735f5d9821d4a8b31d1a7 Mon Sep 17 00:00:00 2001 From: Baptiste Haudegand <89531368+github-baptiste-haudegand@users.noreply.github.com> Date: Thu, 6 Jun 2024 22:19:45 +0200 Subject: [PATCH 008/816] Update list of GPP sids for Teads adapter (#5394) --- dev-docs/bidders/teads.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/teads.md b/dev-docs/bidders/teads.md index 3847370dc7..c3f623978a 100644 --- a/dev-docs/bidders/teads.md +++ b/dev-docs/bidders/teads.md @@ -20,7 +20,7 @@ multiformat_supported: will-not-bid ortb_blocking_supported: true floors_supported: true coppa_supported: true -gpp_sids: tcfeu, usp +gpp_sids: tcfeu, tcfca, usnat, usstate_all, usp fpd_supported: false sidebarType: 1 --- From c3fe0f5aeda6cc521a3980da022780600641d62b Mon Sep 17 00:00:00 2001 From: PrecisoSRL <134591565+PrecisoSRL@users.noreply.github.com> Date: Mon, 10 Jun 2024 11:53:40 +0530 Subject: [PATCH 009/816] Preciso: updates docs for new fields (#5191) * bidder Doc: Preciso bidder doc added * added multiformat_support * Changed pbjs as true * corrections on ORTB blocking * Updated preciso documentation * merge conflict fix * Updated preciso documentation * Updated preciso documentation * removed empty lines * features updated * bid params name corrected * SharedId Sample Comfiguration removed and Updated other requested changes * multiple empty lines removed --------- Co-authored-by: Nikhil Gopal Chennissery --- dev-docs/bidders/preciso.md | 104 +++++++++++++++++++++++------------- 1 file changed, 68 insertions(+), 36 deletions(-) diff --git a/dev-docs/bidders/preciso.md b/dev-docs/bidders/preciso.md index 52523c39c1..867d7b1c34 100644 --- a/dev-docs/bidders/preciso.md +++ b/dev-docs/bidders/preciso.md @@ -1,63 +1,95 @@ --- layout: bidder title: Preciso -description: Prebid Preciso Bidder Adapter +description: Prebid Preciso Bid Adapter +gdpr_supported: true gvl_id: 874 -media_types: display, video, native +media_types: display gdpr_supported: true usp_supported: true pbjs: true -pbs: true +pbs: false biddercode: preciso prebid_member: true floors_supported: true safeframes_ok: true schain_supported: true -userIds: id5Id, identityLink, pubProvidedId -pbs_app_supported: true +userIds: sharedId +deals_supported: false coppa_supported: true -multiformat_supported: will-bid-on-any -ortb_blocking_supported: partial +multiformat_supported: will-not-bid +ortb_blocking_supported: true sidebarType: 1 --- +### Modules -### Bid Params +SharedID: We need you to include the [SharedID module](/dev-docs/modules/userid-submodules/sharedid.html) in order to bid effectively on your inventory. + +### Registration + +The preciso Bidding adapter requires setup before beginning. Please contact us at [tech@preciso.net] + +#### OpenRTB Parameters +The following table contains currently supported parameters we parse. {: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|---------------|----------|---------------------|---------------|----------| -| `publisherId` | required | Unique publisher ID | `'ABCDEF'` | `string` | -| `region` | required | Assigned region | `'prebid-eu'` | `string` | -| `bidfloor` | optional | Minimal CPM value | `0.01` | `float` | -| `channel` | optional | Inventory channel identifier, limited to 50 characters | `Partner 1 - News` | `string` | +| Name | Scope | Description | Example | Type | +|--------------------|----------|---------------------------------------------------------------|-------------------|----------------| +| `bcat` | optional | List of blocked advertiser categories (IAB) | `['IAB1-1']` | `string array` | +| `badv` | optional | Blocked Advertiser Domains | `['example.com']` | `string array` | +| `wlang` | optional | Allow List of languages for creatives using ISO-639-1-alpha-2 | `['fr', 'en']` | `string array` | -### ORTB Blocking -Preciso 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. +Example configuration: -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 preciso bidder: -```javascript -pbjs.setBidderConfig({ - bidders: ['preciso'], - config:{ ortb2: { - badv: ["domain1.com", "domain2.com"], - bcat: ["IAB23-1", "IAB23-5", "IAB25-3", "IAB25-2"] + bcat: ['IAB1-1'], + badv: ['example.com'], + wlang: ['fr', 'en'] } - } }); -``` \ No newline at end of file +``` + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|---------------------|---------------|----------| +| `publisherId` | required | Numeric Publisher ID
(as provided by Preciso) | `'123AB123'` | `string` | +| `region` | optional,recommended | 3 letter country code | `'IND'` | `string` | +| `bidFloor` | optional,recommended | Minimum bid for this impression expressed in CPM (USD) | `0.01` | `float` | +| `pageType` | optional, recommended | Kind of content present in the page | `'homepage'` | `String` | +| `bcat` | optional | List of blocked advertiser categories (IAB) | `['IAB1-1']` | `string array` | +| `badv` | optional | Blocked Advertiser Domains| `'example.com'` | `string array`| + +Notes: + +- Preferred to provide the `bcat` and `badv` within the first party data (above). When both methods are provided, first party data values will be prioritized. + +### Example Ad Unit + +``````javascript + var adUnits = [{ + code: 'your-unit-container-id', + mediaTypes: { + banner: { + sizes: [[300, 250], [300,600]] + } + }, + bids: [{ + bidder: 'preciso', + params: { + publisherId: 'your-publisher-id', + region: 'IND', + pageType: 'news',// Optional + bidFloor: 0.25, // Optional - default is 0.0 + bcat: ['IAB1-1'], // Optional - default is [] + badv: ['example.com'] // Optional - default is [] + } + }] +}]; +`````` From ef3aec5cd6061ec81fb9e5723c0398e5766bba08 Mon Sep 17 00:00:00 2001 From: Eugene Dorfman Date: Mon, 10 Jun 2024 13:28:31 +0200 Subject: [PATCH 010/816] 51d: add table styles (#5405) --- dev-docs/modules/51DegreesRtdProvider.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/modules/51DegreesRtdProvider.md b/dev-docs/modules/51DegreesRtdProvider.md index 9d99c83ed2..dda5620d34 100644 --- a/dev-docs/modules/51DegreesRtdProvider.md +++ b/dev-docs/modules/51DegreesRtdProvider.md @@ -133,6 +133,7 @@ pbjs.setConfig({ > Note that `resourceKey` and `onPremiseJSUrl` are mutually exclusive parameters. Use strictly one of them: either a `resourceKey` for cloud integration and `onPremiseJSUrl` for the on-premise self-hosted integration. +{: .table .table-bordered .table-striped } | Name | Type | Description | Default | |:----------------------|:--------|:-------------------------------------------------------------------------------------------------|:-------------------| | name | String | Real time data module name | Always '51Degrees' | From ba31609869a2c183b5223387fd5e739d12396703 Mon Sep 17 00:00:00 2001 From: Keith Petri <74626343+KEPlockr@users.noreply.github.com> Date: Mon, 10 Jun 2024 09:02:34 -0400 Subject: [PATCH 011/816] lockr AIM (#5278) * added the lockr AIM documentation * added the fix for the tables * fixing linter errors * added the changes related to the build and the description updates * wordsmithing * lint --------- Co-authored-by: Avin Co-authored-by: bretg --- .../modules/userid-submodules/lockraim.md | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 dev-docs/modules/userid-submodules/lockraim.md diff --git a/dev-docs/modules/userid-submodules/lockraim.md b/dev-docs/modules/userid-submodules/lockraim.md new file mode 100644 index 0000000000..6a1d8c7373 --- /dev/null +++ b/dev-docs/modules/userid-submodules/lockraim.md @@ -0,0 +1,119 @@ +--- +layout: userid +title: lockr AIM +description: lockr Alternative Identity Manager sub-module +useridmodule: lockrAIMIdSystem +--- + +Alternative Identity Manager (AIM) is a unified container for identity and data management. +AIM includes a self-service platform for publishers to seamlessly integrate and activate alternative IDs like LiveRamp’s Authenticated Traffic Solution (ATS), Unified ID 2.0 (UID2), and ID5. The self-service component allows the publisher to easily enable or disable IDs and to send identity clusters to CDPs or cleanrooms without engaging engineering teams. For more information about AIM and detailed integration docs, please visit [our documentation](https://sso.loc.kr/api/lockr_reference.html#tag/Alternate-Identity-Management-(AIM)). + +### **Account Creation | AIM** + +1. Sign up for an [Identity lockr account.](https://sso.loc.kr/console/signup) +2. Setup your app and activate the AIM library. +3. Compile Prebid with the appropriate configurations, and deploy. + +### **Configuration | AIM** + +Add the lockr’s AIM submodule to your Prebid.js package by running: + +```sh +gulp build –modules=lockrAIMIdSystem,... +``` + +The following configuration parameters are available: +{: .table .table-bordered .table-striped } +| Param | Scope | Type | Description | Example | +|----------------|----------|--------|----------------------------------------|-----------------------| +| name | Required | String | The name of this module: `"lockrAIMId"`| `"lockrAIMId"` | +| params | Required | Object | Details for the configuration. | | +| params.email | Required | String | Email address for identity tokens. | `test@example.com` | +| params.appID | Required | String | Identity lockr appID | `e84afc5f-4adf-4144-949f-1de5bd151fcc` | + +**Google oAuth:** +If you are using Google oAuth (_as an example_), the onSignIn function will subsequently call window.lockr.setAdditionalData function and include a raw email. + +```javascript +function onSignIn(googleUser) { + pbjs.setConfig({ + userSync: { + userIds: [{ + name: 'lockrAIMId', + params: { + email: 'john@example.com', + appID: 'e84afc5f-4adf-4144-949f-1de5bd151fcc' + } + }] + } + }); +} +``` + +**Facebook oAuth:** +If you are using Facebook Login (_as an example_), the statusChangeCallback function will subsequently call window.lockr.setAdditionalData function and include a raw email. + +```javascript +function statusChangeCallback(response) { + console.log('statusChangeCallback'); + console.log(response); + if(response.status === 'connected'){ + pbjs.setConfig({ + userSync: { + userIds: [{ + name: 'lockrAIMId', + params: { + email: 'john@example.com', + appID: 'e84afc5f-4adf-4144-949f-1de5bd151fcc' + } + }] + } + }); + }else{ + document.getElementById('status').innerHTML = 'Please login'; + } +} +``` + +**Note:** The above code can be triggered from anywhere on the domain (i.e. a subscription form). + +**lockr AIM Example** + +```javascript +pbjs.setConfig({ + userSync: { + userIds: [{ + name: 'lockrAIMId', + params: { + email: 'test@example.com', + appID: 'e84afc5f-4adf-4144-949f-1de5bd151fcc' + } + }] + } +}); +``` + +_Note_: lockr’s AIM self-service interface empowers publishers with the ability to pass the alternative IDs activated back to the client as local storage or as a first party cookie. Each Identity Provider can be individually set to restrict from client-side delivery and instead be retained as an authentication event within Identity lockr. In this case no data is lost, but instead maintained for automated or manual sharing to any Data Endpoint. + +**Troubleshooting and Error handling:** + +1. Navigate to the domain where Prebid.js Library is integrated. +2. Go to the 'Network' tab of your Developer Tools. Search for “prebid.js” +3. In the application tab, you can confirm any activated Identity Provider (if client-side storage is turned on in AIM’s Identity Provider settings). +4. Debugging: + Enable the debug flag to true in the setConfig call: + +```javascript +pbjs.setConfig({ + debug: true, + userSync: { + userIds: [{ + name: 'lockrAIMId', + params: { + email: 'test@example.com', + appID: 'e84afc5f-4adf-4144-949f-1de5bd151fcc' + } + }] + } +}); +``` From e03e7478abe3f285d73aa6add0d13737ffa6743d Mon Sep 17 00:00:00 2001 From: qt-io <104574052+qt-io@users.noreply.github.com> Date: Wed, 12 Jun 2024 18:47:39 +0300 Subject: [PATCH 012/816] New Adapter: QT (#5331) * New Adapter: QT * pbs marked as false --- dev-docs/bidders/qt.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 dev-docs/bidders/qt.md diff --git a/dev-docs/bidders/qt.md b/dev-docs/bidders/qt.md new file mode 100644 index 0000000000..c0838c774f --- /dev/null +++ b/dev-docs/bidders/qt.md @@ -0,0 +1,35 @@ +--- +layout: bidder +title: QT +description: Prebid QT Bidder Adapter +biddercode: qt +gpp_sids: usstate_all +tcfeu_supported: false +usp_supported: true +coppa_supported: true +schain_supported: true +deals_supported: false +floors_supported: true +fpd_supported: false +ortb_blocking_supported: false +media_types: banner, video, native +multiformat_supported: will-bid-on-one +userIds: all +pbjs: true +pbs: false +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 a11c1be8f9cd96a45e002eeb43c85c76f1f83ddf Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 13 Jun 2024 04:43:02 -0400 Subject: [PATCH 013/816] PBS request example (#5381) * pbs auction example * cont * lint * trying to work around build failure * Update prebid-server/endpoints/openrtb2/auction-request-example.md --------- Co-authored-by: Muki Seiler --- faq/prebid-server-faq.md | 4 + prebid-server/developers/add-new-bidder-go.md | 2 + .../developers/add-new-bidder-java.md | 2 + .../openrtb2/auction-request-example.md | 245 ++++++++++++++++++ .../openrtb2/pbs-endpoint-auction.md | 1 + 5 files changed, 254 insertions(+) create mode 100644 prebid-server/endpoints/openrtb2/auction-request-example.md diff --git a/faq/prebid-server-faq.md b/faq/prebid-server-faq.md index 26d7946c36..5f6ad81c19 100644 --- a/faq/prebid-server-faq.md +++ b/faq/prebid-server-faq.md @@ -248,6 +248,10 @@ In the long run, if you'd prefer to change the filenames too, that's ok - but ou 1. Submit a PR that changes the filenames and makes the old name a hard-coded alias. 2. Keep both bidder documentation files. +## May I build a server that calls Prebid Server? + +Sure. The main endpoint you're going to utilize is the [auction endpoint](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html). Basically, it's just OpenRTB 2.6, but with quite a few Prebid-specific extensions. See the [auction request example](/prebid-server/endpoints/openrtb2/auction-request-example.html). + ## Should Prebid bidders be in ads.txt? Publishers should be careful to list all their bidding partners in their ads.txt file. Bidders without an entry in ads.txt may be diff --git a/prebid-server/developers/add-new-bidder-go.md b/prebid-server/developers/add-new-bidder-go.md index e2bcf0c114..a7b395f972 100644 --- a/prebid-server/developers/add-new-bidder-go.md +++ b/prebid-server/developers/add-new-bidder-go.md @@ -29,6 +29,8 @@ Bid adapters are responsible for translating a 'Prebid-flavored' OpenRTB Bid Req OpenRTB Bid Requests contain one or more impression objects, each representing a single ad placement. An impression may define multiple sizes and/or multiple ad formats. If your bidding server limits requests to a single ad placement, size, or format, then your adapter will need to split the impression into multiple calls and merge the responses. +See the [example auction request](/prebid-server/endpoints/openrtb2/auction-request-example.html) to get an idea for what your adapter will receive. + ## Plan Your Bid Adapter The job of your bid adapter is to adapt. You'll need to think about currency, floors, mediatypes, and other details as noted below. diff --git a/prebid-server/developers/add-new-bidder-java.md b/prebid-server/developers/add-new-bidder-java.md index a0c4da4e79..0c9d06e2a5 100644 --- a/prebid-server/developers/add-new-bidder-java.md +++ b/prebid-server/developers/add-new-bidder-java.md @@ -29,6 +29,8 @@ Bid adapters are responsible for translating a 'Prebid-flavored' OpenRTB Bid Req OpenRTB Bid Requests contain one or more impression objects, each representing a single ad placement. An impression may define multiple sizes and/or multiple ad formats. If your bidding server limits requests to a single ad placement, size, or format, then your adapter will need to split the impression into multiple calls and merge the responses. +See the [example auction request](/prebid-server/endpoints/openrtb2/auction-request-example.html) to get an idea for what your adapter will receive. + ## Plan Your Bid Adapter ### Choose A Name diff --git a/prebid-server/endpoints/openrtb2/auction-request-example.md b/prebid-server/endpoints/openrtb2/auction-request-example.md new file mode 100644 index 0000000000..261cd9b25f --- /dev/null +++ b/prebid-server/endpoints/openrtb2/auction-request-example.md @@ -0,0 +1,245 @@ +--- +layout: page_v2 +sidebarType: 5 +title: Prebid Server | Endpoints | OpenRTB2 | Auction Example +--- + +# Prebid Server | Endpoints | /openrtb2/auction -- Example + +This is an example of a Prebid Server-flavored OpenRTB auction request with most fields present. +It serves 2 purposes: + +- Give context about what custom server-to-server integrations could implement. i.e. if you're building a server that will sit in front of Prebid Server, these are many of the fields that can be provided. +- Provide an example for bid adapter developers to understand what their code will see for each auction. Prebid Server does modify the auction request before giving it to a bid adapter because individual bidders are not allowed to see details from other adapters. The example is annotated with differences between the incoming auction request and what adapters see. + +## POST /openrtb2/auction + +```json5 +{ + "id": "123456789", + "source": { + "tid": "a64e6b91-7bfd-4f0b-9861-99307e41f971" + }, + "tmax": 1000, + "imp": [ + { + "ext": { + "ae": 1, + "gpid": "/1111/adslot#2", + "data": { + "adserver": { + "name": "gam", + "adslot": "/1111/adslot" + } + }, + "tid": "4f8f2e78-94b0-431b-b735-6da38a6f3ef0", + "prebid": { // bid adapters don't see this object + "bidder": { + "bidderAlias": { // bid adapters don't see this object + "placement": 1001 // The contents of this object are seen by adapters at imp[].ext.bidder + } + }, + "passthrough": { // bid adapters don't see this object + "attr": "val" + } + } + }, + "id": "test-div", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + }, + { + "w": 300, + "h": 600 + }, + { + "w": 728, + "h": 90 + } + ] + }, + "bidfloor": 0.98, + "bidfloorcur": "USD" + } + ], + "test": 1, + "ext": { + "prebid": { + "trace": "verbose", + "returnallbidstatus": true, // bid adapters don't see this object + "auctiontimestamp": 1664308667064, + "cache": { // bid adapters don't see this object + "vastXml": {} + }, + "targeting": { // bid adapters don't see this object + "includewinners": true, + "includebidderkeys": false + }, + "floors": { // bid adapters don't see this object + "enabled": false + }, + "channel": { + "name": "pbjs", + "version": "v7.17.0" + }, + "createtid": false, // bid adapters don't see this object + "integration": "mbjs", + "currency": { + "rates": { + "USD": { "UAH": 24.47, "ETB": 32.04 } + }, + "usepbsrates": true + }, + "debug": true, + "aliases": { // bid adapters don't see this object + "bidderAlias": "bidderA" + }, + "aliasgvlids": { // bid adapters don't see this object + "bidderAlias": 999999 + }, + "bidadjustmentfactors": { // bid adapters don't see this object + "bidderA": 0.9 + }, + "bidderparams": { // bid adapters don't see this object + "bidderA": { + "globalparam": "value" // bid adapter will see this added to the imp.ext.bidder object + } + }, + "schains": [{ + "bidders": ["bidderA"], + "schain": { SCHAIN OBJECT 1} // bid adapters will see their schain on source.[ext.]schain. + }], + "server": { + "externalurl": "https://prebid-server.example.com", + "gvlid": 9999999, + "datacenter": "us-east-1" + }, + "data": { + "eidpermissions": [ // bid adapters don't see this object + {"source": "sharedid.org", "bidders": ["*"]}, // * is the default + ] + }, + "biddercontrols": { // bid adapters don't see this object + "bidderB": { "prefmtype": "video" } + }, + "bidderconfig": [ // bid adapters don't see this object + { + "bidders": [ + "bidderAlias" + ], + "config": { + "ortb2": { + "site": { + "ext": { + "data": { + "customsite": "customsite1" + } + } + }, + "user": { + "ext": { + "data": { + "customuser": "customuser1" + } + } + } + } + } + } + ] + } + }, + "cur": [ + "CAD" + ], + "site": { + "publisher": { + "id": "1001", + "domain": "example.com" + }, + "page": "http://lh.example.com/prebid_server_kitchen_sink.html?pbjs_debug=true", + "domain": "site-domain", + "keywords": "skw1,skw2", + "name": "site-name", + "cat": [ + "site-cat" + ], + "sectioncat": [ + "site-scat" + ], + "pagecat": [ + "site-pcat" + ], + "ref": "site-ref", + "search": "site-search", + "content": { + "userrating": "4", + "data": [ + { + "name": "www.dataprovider1.com", + "ext": { + "segtax": 6 + }, + "segment": [ + { + "id": "123" + }, + { + "id": "456" + } + ] + } + ] + }, + "ext": { + "data": { + "siteextdata": "site-ext-data", + "siteextdata2": "site-ext-data2" + } + } + }, + "device": { + "w": 1434, + "h": 686 + }, + "regs": { + "gdpr": 1, + "coppa": 0, + "gpp": "DBABBg~BVpAAEBY.QA", + "gpp_sid": [7] + }, + "user": { + "ext": { + "consent": "CO_d4kAPPVBUAADABCENB0CoAP_AAE7AAAAAF5wAwAQAA0AXmBecAMAEAANAF5gAAA.YAAAAAAAA4AA", + "data": { + "userextdata": "user-ext-data", + "userextdata2": "user-ext-data2" + } + }, + "keywords": "ukw1,ukw2", + "data": [ + { + "name": "www.dataprovider1.com", + "ext": { + "segtax": 4 + }, + "segment": [ + { + "id": "123" + }, + { + "id": "456" + } + ] + } + ] + } +} +``` + +### Further Reading + +- [PBS auction endpoint](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html) diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md index 17fe73c7f3..3aeb1d1e3e 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -1824,6 +1824,7 @@ The Prebid SDK version comes from: ### Further Reading +- [Example auction request](/prebid-server/endpoints/openrtb2/auction-request-example.html) - [OpenRTB 2.4 Specification](https://iabtechlab.com/wp-content/uploads/2016/04/OpenRTB-API-Specification-Version-2-4-FINAL.pdf) - [OpenRTB 2.5 Specification](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf) - [OpenRTB 2.6 Specification](https://github.com/InteractiveAdvertisingBureau/openrtb2.x/blob/main/2.6.md) From 5df44d31dd2c651ac99c001093b482ca71800ee4 Mon Sep 17 00:00:00 2001 From: Viktor Dreiling <34981284+3link@users.noreply.github.com> Date: Thu, 13 Jun 2024 10:55:54 +0200 Subject: [PATCH 014/816] LiveIntent Identity Module: Expose First Party ID (#5297) * fpid * Revert superfluous changes * Add newline --- .../modules/userid-submodules/liveintent.md | 63 +++++++++++++++++-- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/dev-docs/modules/userid-submodules/liveintent.md b/dev-docs/modules/userid-submodules/liveintent.md index 882209903c..934fc5dca0 100644 --- a/dev-docs/modules/userid-submodules/liveintent.md +++ b/dev-docs/modules/userid-submodules/liveintent.md @@ -82,7 +82,7 @@ pbjs.setConfig({ ### Multiple user IDs -The attributes `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index` and `thetradedesk` are treated specially by LiveIntent's user ID sub-module. Each of these attributes will result in a separate ID returned by the sub-module. +The attributes `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk` and `fpid` are treated specially by LiveIntent's user ID sub-module. Each of these attributes will result in a separate ID returned by the sub-module. Note: `thetradedesk` will be exposed as `tdid` because of historical reasons. For example, in case `uid2` is configured to be requested in addition to the `nonID`, the `request.userId` object would look like the following: @@ -100,9 +100,54 @@ For example, in case `uid2` is configured to be requested in addition to the `no } ``` -NOTE: `uid2` is exposed as part of `lipb` as well as separately as `uid2`. `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index` and `thetradedesk` behave the same way. +NOTE: `uid2` is exposed as part of `lipb` as well as separately as `uid2`. `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk` (as `tdid`) and `fpid` behave the same way. -For the attributes `lipbid` (nonID), `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index` and `thetradedesk`, there is also support for their conversion into OpenRTB EIDS format. Please refer to [User ID Module](../userId.md) documentation for more information on conversion, and [Example of eids array generated by UserId Module](https://github.com/prebid/Prebid.js/blob/master/modules/userId/eids.md) for output format examples. +For the attributes `lipbid` (nonID), `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk` (`tdid`) and `fpid` there is also support for their conversion into OpenRTB EIDS format. Please refer to [User ID Module](../userId.md) documentation for more information on conversion, and [Example of eids array generated by UserId Module](https://github.com/prebid/Prebid.js/blob/master/modules/userId/eids.md) for output format examples. + +### FPID + +The `fpid` is a first party identifier that can be exposed through the liveconnect user ID module. In order to use this functionality tell the module which identifier you want to use as a `fpid` in the config params: + +```javascript +{ + "params": { + "fpid": { + "strategy": "cookie", // "cookie" | "html5" -- Where the identifier should be read from + "name": "foobar" // key in the chosen storage backend + } + } +} +``` + +Additionally, add it to the requested attributes: + +```javascript +{ + //... + "params": { + "fpid": { + "strategy": "cookie", + "name": "foobar" + }, + "requestedAttributesOverrides": {'fpid': true} + } + //... +} +``` + +The user id result will contain both the `fpid` directly in the `lipb` object and separately: + +```javascript +{"lipb":{"fpid":"foobar"},"fpid":{"id":"foobar"}} +``` + +The same applies for the eids: + +```javascript +[{"source":"fpid.liveintent.com","uids":[{"id":"foobar","atype":1}]}] +``` + +NOTE: If COPPA applies, LiveIntent’s user ID module will not return the `fpid`. ### Request uid2 @@ -139,7 +184,7 @@ NOTE: For optimal performance, the LiveIntent ID sub-module should be called at | params.ajaxTimeout |Optional| Number |This configuration parameter defines the maximum duration of a call to the `IdentityResolution` endpoint. By default, 5000 milliseconds.|`5000`| | 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 and additional attributes.|`['my-id']`| -| params.requestedAttributesOverrides | Optional | Object | Object containing booleans used to override the default resolution. Attributes set to `true` will be added to the resolved list, while attributes set to `false` will be removed. Valid attributes are `nonId`, `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index` and `thetradedesk`. | `{'uid2': true}` | +| params.requestedAttributesOverrides | Optional | Object | Object containing booleans used to override the default resolution. Attributes set to `true` will be added to the resolved list, while attributes set to `false` will be removed. Valid attributes are `nonId`, `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk` (`tdid`) and `fpid`. | `{'uid2': true}` | | params.emailHash |Optional| String |The hashed email address of a user. We can accept the hashes, which use the following hashing algorithms: md5, sha1, sha2.|`1a79a4d60de6718e8e5b326e338ae533`| | params.url | Optional| String |Use this to change the default endpoint URL if you can call the LiveIntent Identity Exchange within your own domain.|`https://idx.my-domain.com`| | params.liCollectConfig |Optional| Object |Container of all collector params.|| @@ -148,6 +193,12 @@ NOTE: For optimal performance, the LiveIntent ID sub-module should be called at | params.liCollectConfig.fpiExpirationDays |Optional| Number |The expiration time of an identifier created and updated by LiveConnect. By default, 730 days.|`729`| | params.liCollectConfig.collectorUrl |Optional| String |The parameter defines where the signal pixels are pointing to. The params and paths will be defined subsequently. If the parameter is not set, LiveConnect will by default emit the signal towards `https://rp.liadm.com`.| `https://rp.liadm.com`| | params.liCollectConfig.appId |Optional| String |LiveIntent's media business entity application ID.|`a-0012`| +| params.fpid.name | Optional | String | The parameter is cookie/localstorage key name | `'__super_duper_cookie'`| +| params.fpid.strategy | Optional | String | The parameter defines where to get the identifier from. Either from the cookie jar, `'cookie'`, or from the local storage, `'html5'`. | `'html5'`| +| storage | Required | Object | This object defines where and for how long the results of the call to get a user ID will be stored. | | +| storage.type | Required | String | This parameter defines where the resolved user ID will be stored (either `'cookie'` or `'html5'` localstorage).| `'cookie'` | +| storage.name | Required | String | The name of the cookie or html5 localstorage where the resolved user ID will be stored. | `'pbjs_li_nonid'` | +| storage.expires | Recommended | Integer | How long (in days) the user ID information will be stored. The recommended value is `1` | `1` | ## LiveIntent ID examples @@ -202,6 +253,10 @@ NOTE: For optimal performance, the LiveIntent ID sub-module should be called at fpiExpirationDays: 730, collectorUrl: "https://rp.liadm.com", appId: "a-0012" + }, + fpid: { + strategy: "cookie" + name: "foobar" } } }] From 6cead8037e43546d887ebf609ca8dbcadd351d9e Mon Sep 17 00:00:00 2001 From: Muki Seiler Date: Thu, 13 Jun 2024 11:25:18 +0200 Subject: [PATCH 015/816] Fix growthcode table styling #5359 (#5417) --- dev-docs/analytics/growthcode.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/analytics/growthcode.md b/dev-docs/analytics/growthcode.md index 37ac5e3647..c1947aff27 100644 --- a/dev-docs/analytics/growthcode.md +++ b/dev-docs/analytics/growthcode.md @@ -16,6 +16,7 @@ Please visit [growthcode.io](https://growthcode.io/) for more information. #### Analytics Options +{: .table .table-bordered .table-striped } | Param enableAnalytics | Scope | Type | Description | Example | |-----------------------|----------|--------|---------------------------------------------------------|--------------------------| | provider | Required | String | The name of this Adapter. | `"growthCodeAnalytics"` | From 583df152ea5f7378b3e0e61a4b4ab68cda8b186a Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Fri, 14 Jun 2024 05:26:19 -0700 Subject: [PATCH 016/816] Prebid 9: rename TCF modules (#5410) * rename consentManagement to consentManagementTcf * rename gdprEnforcement to TCF control * linter --- dev-docs/activity-controls.md | 4 +-- dev-docs/add-rtd-submodule.md | 2 +- dev-docs/analytics/sharethrough.md | 2 +- dev-docs/bidder-adaptor.md | 2 +- dev-docs/bidders/aidem.md | 4 +-- dev-docs/bidders/mediakeys.md | 2 +- dev-docs/cmp-best-practices.md | 8 ++--- dev-docs/faq.md | 4 +-- ...integrate-with-the-prebid-analytics-api.md | 2 +- dev-docs/modules/azerionedgeRtdProvider.md | 2 +- dev-docs/modules/consentManagementGpp.md | 2 +- ...tManagement.md => consentManagementTcf.md} | 34 +++++++++---------- dev-docs/modules/consentManagementUsp.md | 2 +- dev-docs/modules/genericAnalyticsAdapter.md | 4 +-- dev-docs/modules/permutiveRtdProvider.md | 2 +- .../{gdprEnforcement.md => tcfControl.md} | 22 ++++++------ dev-docs/modules/userId.md | 4 +-- .../publisher-api-reference/aliasBidder.md | 2 +- dev-docs/publisher-api-reference/setConfig.md | 2 +- features/firstPartyData.md | 2 +- identity/sharedid.md | 4 +-- prebid/prebidjs.md | 2 +- prebid/prebidjsReleases.md | 4 +-- support/privacy-resources.md | 4 +-- 24 files changed, 61 insertions(+), 61 deletions(-) rename dev-docs/modules/{consentManagement.md => consentManagementTcf.md} (90%) rename dev-docs/modules/{gdprEnforcement.md => tcfControl.md} (93%) diff --git a/dev-docs/activity-controls.md b/dev-docs/activity-controls.md index ef227c9d9b..f1f55285bb 100644 --- a/dev-docs/activity-controls.md +++ b/dev-docs/activity-controls.md @@ -152,7 +152,7 @@ For example, this rule would allow bidderX to perform the activity if no higher 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 considered 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. +* 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/tcfControl.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: @@ -234,7 +234,7 @@ If `allow` is not defined, the rule is assumed to assert **true** (i.e. allow th #### Always include a particular bidder in auctions -This is similiar to the 'vendor exception' feature of the [GDPR Enforcement Module](/dev-docs/modules/gdprEnforcement.html). This would always allow bidderA to participate in the auction, even without explicit consent in GDPR scenarios. It might indicate, for instance, that this is a 'first party bidder'. +This is similiar to the 'vendor exception' feature of the [TCF Control Module](/dev-docs/modules/tcfControl.html). This would always allow bidderA to participate in the auction, even without explicit consent in GDPR scenarios. It might indicate, for instance, that this is a 'first party bidder'. ```javascript pbjs.setConfig({ diff --git a/dev-docs/add-rtd-submodule.md b/dev-docs/add-rtd-submodule.md index fbf85669cf..b17f43f36e 100644 --- a/dev-docs/add-rtd-submodule.md +++ b/dev-docs/add-rtd-submodule.md @@ -123,7 +123,7 @@ submodule('realTimeData', subModuleObject); 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 +* [gdpr](/dev-docs/modules/consentManagementTcf.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 diff --git a/dev-docs/analytics/sharethrough.md b/dev-docs/analytics/sharethrough.md index 4c50e6a3ed..a3fb0791db 100644 --- a/dev-docs/analytics/sharethrough.md +++ b/dev-docs/analytics/sharethrough.md @@ -36,7 +36,7 @@ gulp bundle --modules=gptPreAuction,sharethroughBidAdapter,sharethroughAnalytics Please note that the above snippet is a "bare bones" example - you will likely want to include other modules as well. A more realistic example might look something like the example below (with other bid adapters also included in the list as needed): ```sh -gulp bundle --modules=gptPreAuction,consentManagement,consentManagementGpp,consentManagementUsp,enrichmentFpdModule,gdprEnforcement,sharethroughBidAdapter,sharethroughAnalyticsAdapter +gulp bundle --modules=gptPreAuction,consentManagementTcf,consentManagementGpp,consentManagementUsp,enrichmentFpdModule,tcfControl,sharethroughBidAdapter,sharethroughAnalyticsAdapter ``` Enable the Sharethrough Analytics Adapter in Prebid.js using the analytics provider `sharethrough` as seen in the **Example Configuration** section. diff --git a/dev-docs/bidder-adaptor.md b/dev-docs/bidder-adaptor.md index 49fbc7e540..aaeb9dae4c 100644 --- a/dev-docs/bidder-adaptor.md +++ b/dev-docs/bidder-adaptor.md @@ -352,7 +352,7 @@ Notes on parameters in the bidderRequest object: Some of the data in `ortb2` is also made available through other `bidderRequest` fields: * **refererInfo** is provided so you don't have to call any utils functions. See below for more information. -* **gdprConsent** is the object containing data from the [GDPR ConsentManagement](/dev-docs/modules/consentManagement.html) module. For TCF2+, it will contain both the tcfString and the addtlConsent string if the CMP sets the latter as part of the TCData object. +* **gdprConsent** is the object containing data from the [TCF ConsentManagement](/dev-docs/modules/consentManagementTcf.html) module. For TCF2+, it will contain both the tcfString and the addtlConsent string if the CMP sets the latter as part of the TCData object. * **uspConsent** is the object containing data from the [US Privacy ConsentManagement](/dev-docs/modules/consentManagementUsp.html) module. diff --git a/dev-docs/bidders/aidem.md b/dev-docs/bidders/aidem.md index ea8ba9b2ed..6aeb6266eb 100644 --- a/dev-docs/bidders/aidem.md +++ b/dev-docs/bidders/aidem.md @@ -70,7 +70,7 @@ This module is GDPR and CCPA compliant, and no 3rd party userIds are allowed. {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |--------|----------|--------------------------------------------------------------------------------------------------|---------|----------| -| `gdpr` | optional | GDPR Object see [Prebid.js doc](https://docs.prebid.org/dev-docs/modules/consentManagement.html) | `{}` | `Object` | +| `gdpr` | optional | GDPR Object see [Prebid.js doc](https://docs.prebid.org/dev-docs/modules/consentManagementTcf.html) | `{}` | `Object` | | `usp` | optional | USP Object see [Prebid.js doc](https://docs.prebid.org/dev-docs/modules/consentManagementUsp.html) | `{}` | `Object` | #### Example Banner ad unit @@ -212,7 +212,7 @@ For video: gulp serve --modules=aidemBidAdapter,dfpAdServerVideo ## FAQs -#### How do I view AIDEM bid request? +### How do I view AIDEM bid request? Navigate to a page where AIDEM is setup to bid. In the network tab, search for requests to `zero.aidemsrv.com/bid/request`. diff --git a/dev-docs/bidders/mediakeys.md b/dev-docs/bidders/mediakeys.md index 45efb078da..ca43f30489 100644 --- a/dev-docs/bidders/mediakeys.md +++ b/dev-docs/bidders/mediakeys.md @@ -166,7 +166,7 @@ Mediakeys fully supports the following [Prebid.js Modules](https://docs.prebid.o {: .table .table-bordered .table-striped } | Module | Scope | |-------------------------------------------------------------------------------------------------------|-----------------------------| -| [Consent Management - GDPR](https://docs.prebid.org/dev-docs/modules/consentManagement.html) | Required in Europe | +| [Consent Management - GDPR](https://docs.prebid.org/dev-docs/modules/consentManagementTcf.html) | Required in Europe | | [Consent Management - US Privacy](https://docs.prebid.org/dev-docs/modules/consentManagementUsp.html) | Required in US - California | | [Supply Chain Object](https://docs.prebid.org/dev-docs/modules/schain.html) | Required for all traffic | | [Instream Tracking](https://docs.prebid.org/dev-docs/modules/instreamTracking.html) | Required for Instream Video | diff --git a/dev-docs/cmp-best-practices.md b/dev-docs/cmp-best-practices.md index f431b75ea8..1201631c3f 100644 --- a/dev-docs/cmp-best-practices.md +++ b/dev-docs/cmp-best-practices.md @@ -23,7 +23,7 @@ flavored CMPs for that. Instead, here are some general guidelines: -- You can't just automatically turn on the GDPR Enforcement Module when not in GDPR scope. +- You can't just automatically turn on the TCF Control Module when not in GDPR scope. - You need to understand how your CMP works, how you want to handle the "first page" scenario where the user hasn't yet had time to answer CMP questions, and how your site is laid out geographically. - We recommend that the page first load a CMP stub synchronously, then asynchronously load the CMP code and the Prebid code @@ -31,7 +31,7 @@ Instead, here are some general guidelines: ### CMP/TCF gdprApplies -The indicates the determination of whether GDPR applies in this context. The CMP, in most cases, is responsible for this. The publisher provides this value when supplying [static](/dev-docs/modules/consentManagement.html) consent data. +The indicates the determination of whether GDPR applies in this context. The CMP, in most cases, is responsible for this. The publisher provides this value when supplying [static](/dev-docs/modules/consentManagementTcf.html) consent data. ### Prebid gdpr.defaultGdprScope @@ -52,7 +52,7 @@ Here are some approaches where PBJS config can be the same across all geos: In these approaches, the publisher has to be aware of the geo and tell Prebid.js what to do: -- When in the EEA, the page sets `consentManagement` config, but when not in the EEA, the page avoids setting the `consentManagement` config, turning off GDPR enforcement. +- When in the EEA, the page sets `consentManagement` config, but when not in the EEA, the page avoids setting the `consentManagement` config, turning off TCF controls. - When not in the EEA, the page sets `consentManagement` config with defaultGdprScope=false so that if the CMP is slow to respond then enforcement is off. ## CMP Best Practices @@ -76,4 +76,4 @@ Please follow the guidelines in the [Sirdata documentation](https://cmp.docs.sir ## Further Reading - [IAB TCF Implementation Guidelines](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/TCF-Implementation-Guidelines.md) -- [GDPR Enforcement Module](/dev-docs/modules/gdprEnforcement.html) +- [TCF Control Module](/dev-docs/modules/tcfControl.html) diff --git a/dev-docs/faq.md b/dev-docs/faq.md index cfca608b86..bfa14e5e4f 100644 --- a/dev-docs/faq.md +++ b/dev-docs/faq.md @@ -62,7 +62,7 @@ After you’ve determined your legal obligations, consider the tools Prebid make * [Disable User ID modules](/dev-docs/modules/userId.html) - there are controls for different ID modules and which bidders can get which IDs. * [Disable device access](/dev-docs/publisher-api-reference/setConfig.html#setConfig-deviceAccess) - no adapter or module will be able to create a cookie or HTML5 localstorage object. * For GDPR: - * Consider the [GDPR](/dev-docs/modules/consentManagement.html) and [GDPR Enforcement](/dev-docs/modules/gdprEnforcement.html) modules, which flexibly support various actions like cancelling usersyncs, auctions, and analytics. Using these modules, bid adapters can receive the IAB TCF string from the CMP. + * Consider the [TCF](/dev-docs/modules/consentManagementTcf.html) and [TCF Control](/dev-docs/modules/tcfControl.html) modules, which flexibly support various actions like cancelling usersyncs, auctions, and analytics. Using these modules, bid adapters can receive the IAB TCF string from the CMP. * Note that TCF 2.2 is functionally the same as TCF 2.0 from the Prebid.js perspective. The code has always relied on event listeners to get the TCF string, so when `getTCData` was deprecated in 2.2 the modules were unaffected. There are still references in the code only because it is still accepted as a place for statically-supplied data. * Alternatively, the page can just avoid turning on certain bidders or modules. * For CCPA / CPRA / US-Privacy: @@ -84,7 +84,7 @@ This option to the ConsentManagement module was removed a long time ago in PBJS * It was a poorly named flag. What it did was let the auction happen on the first page before the user had responded to the CMP. * It was replaced by a combination of the "defaultGdprScope" flag and the ability for a publisher to disable enforcement of the `basicAds` TCF purpose. -See the [GDPR Enforcement Module](/dev-docs/modules/gdprEnforcement.html) documentation for more details. +See the [TCF Control Module](/dev-docs/modules/tcfControl.html) documentation for more details. ## Implementation diff --git a/dev-docs/integrate-with-the-prebid-analytics-api.md b/dev-docs/integrate-with-the-prebid-analytics-api.md index f7518828c3..b073000889 100644 --- a/dev-docs/integrate-with-the-prebid-analytics-api.md +++ b/dev-docs/integrate-with-the-prebid-analytics-api.md @@ -86,7 +86,7 @@ Analytics adapter for Example.com. Contact prebid@example.com for information. adapter needs to specify an enableAnalytics() function, but it should also call the base class function to set up the events. -5. Doing analytics may require user permissions under [GDPR](/dev-docs/modules/consentManagement.html), which means your adapter will need to be linked to your [IAB Global Vendor List](https://iabeurope.eu/vendor-list-tcf/) ID. If no GVL ID is found, and Purpose 7 (Measurement) is enforced, your analytics adapter will be blocked unless it is specifically listed under vendorExceptions. Your GVL ID can be added to the `registerAnalyticsAdapter()` call. +5. Doing analytics may require user permissions under [GDPR](/dev-docs/modules/consentManagementTcf.html), which means your adapter will need to be linked to your [IAB Global Vendor List](https://iabeurope.eu/vendor-list-tcf/) ID. If no GVL ID is found, and Purpose 7 (Measurement) is enforced, your analytics adapter will be blocked unless it is specifically listed under vendorExceptions. Your GVL ID can be added to the `registerAnalyticsAdapter()` call. #### Basic prototype analytics adapter diff --git a/dev-docs/modules/azerionedgeRtdProvider.md b/dev-docs/modules/azerionedgeRtdProvider.md index 2c3da1eb4d..d58254d1c8 100644 --- a/dev-docs/modules/azerionedgeRtdProvider.md +++ b/dev-docs/modules/azerionedgeRtdProvider.md @@ -74,7 +74,7 @@ received from the user, this module does not require a TCF vendor configuration. provided to the module when the user gives the relevant permissions on the publisher website. As Prebid.js utilizes TCF vendor consent for the RTD module to load, the module needs to be labeled -within the Vendor Exceptions. If the Prebid GDPR enforcement is enabled, the module should be configured +within the Vendor Exceptions. If the Prebid TCF Controls are enabled, the module should be configured as exception, as shown below: ```js diff --git a/dev-docs/modules/consentManagementGpp.md b/dev-docs/modules/consentManagementGpp.md index 1e8ad5cb19..fc95d69784 100644 --- a/dev-docs/modules/consentManagementGpp.md +++ b/dev-docs/modules/consentManagementGpp.md @@ -200,7 +200,7 @@ var idx_gdpr=0; - [IAB Global Privacy Platform Full Specification Repository](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform) - [IAB Global Privacy Platform CMP API Specification](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Core/CMP%20API%20Specification.md) -- [Prebid Consent Management - GDPR Module](/dev-docs/modules/consentManagement.html) +- [Prebid Consent Management - GDPR Module](/dev-docs/modules/consentManagementTcf.html) - [Prebid Consent Management - US Privacy Module](/dev-docs/modules/consentManagementUsp.html) - [Prebid Activity Controls](/dev-docs/activity-controls.html) - [Prebid Activity Controls -- GPP control module - usnat](/dev-docs/modules/gppControl_usnat.html) diff --git a/dev-docs/modules/consentManagement.md b/dev-docs/modules/consentManagementTcf.md similarity index 90% rename from dev-docs/modules/consentManagement.md rename to dev-docs/modules/consentManagementTcf.md index 518ce48a02..d3df05e3ab 100644 --- a/dev-docs/modules/consentManagement.md +++ b/dev-docs/modules/consentManagementTcf.md @@ -1,16 +1,16 @@ --- layout: page_v2 page_type: module -title: Consent Management - GDPR -description: If you have users in Europe, this module works with your Consent Management Platform to pass consent info to bidders and help align with EU regulations. See also the GDPR Enforcement module. -module_code : consentManagement -display_name : Consent Management - GDPR +title: Consent Management - TCF +description: If you have users in Europe, this module works with your Consent Management Platform to pass consent info to bidders and help align with EU regulations. See also the TCF Control module. +display_name : Consent Management - TCF +module_code : consentManagementTcf enable_download : true recommended: true sidebarType : 1 --- -# GDPR Consent Management Module +# TCF Consent Management Module {: .no_toc } - TOC @@ -28,12 +28,12 @@ This module works with supported [Consent Management Platforms](https://www.cmsw Prebid functionality created to address regulatory requirements does not replace each party's responsibility to determine its own legal obligations and comply with all applicable laws. **We recommend consulting with your legal counsel before determining how to utilize these features in support of your overall privacy approach.** -This base EU GDPR consent management module performs these actions: +This base EU TCF consent management module performs these actions: 1. Fetch the user's GDPR & Google additional consent data from the CMP. 2. Incorporate this data into the auction objects for adapters to collect. -The optional [GDPR enforcement module](/dev-docs/modules/gdprEnforcement.html) adds on these actions: +The optional [TCF control module](/dev-docs/modules/tcfControl.html) adds on these actions: 1. Allows the page to define which activities should be enforced at the Prebid.js level. 2. Actively enforces those activities based on user consent data (in the TCF string, not the AC string). @@ -71,16 +71,16 @@ but we recommend migrating to the new config structure as soon as possible. | gdpr.actionTimeout | `integer` | Length of time (in milliseconds) to allow the user to take action to consent if they have not already done so. The actionTimer first waits for the CMP to load, then the actionTimeout begins for the specified duration. Default is `undefined`. | `10000` | | gdpr.defaultGdprScope | `boolean` | Defines what the `gdprApplies` flag should be when the CMP doesn't respond in time or the static data doesn't supply. Defaults to `false`. | `true` | | gdpr.consentData | `Object` | An object representing the GDPR consent data being passed directly; only used when cmpApi is 'static'. Default is `undefined`. | | -| gdpr.consentData.getTCData.tcString | `string` | Base64url-encoded TCF v2.x string with segments. | | -| gdpr.consentData.getTCData.addtlConsent | `string` | Additional consent string if available from the cmp TCData object | | -| gdpr.consentData.getTCData.gdprApplies | `boolean` | Defines whether or not this pageview is in GDPR scope. | | -| gdpr.consentData.getTCData.purpose.consents | `Object` | An object representing the user's consent status for specific purpose IDs. | | -| gdpr.consentData.getTCData.purpose.legitimateInterests | `Object` | An object representing the user's legitimate interest status for specific purpose IDs. | | -| gdpr.consentData.getTCData.vendor.consents | `Object` | An object representing the user's consent status for specific vendor IDs. | | -| gdpr.consentData.getTCData.vendor.legitimateInterests | `Object` | An object representing the user's legitimate interest status for specific vendors IDs. | | +| gdpr.consentData.tcString | `string` | Base64url-encoded TCF v2.x string with segments. | | +| gdpr.consentData.addtlConsent | `string` | Additional consent string if available from the cmp TCData object | | +| gdpr.consentData.gdprApplies | `boolean` | Defines whether or not this pageview is in GDPR scope. | | +| gdpr.consentData.purpose.consents | `Object` | An object representing the user's consent status for specific purpose IDs. | | +| gdpr.consentData.purpose.legitimateInterests | `Object` | An object representing the user's legitimate interest status for specific purpose IDs. | | +| gdpr.consentData.vendor.consents | `Object` | An object representing the user's consent status for specific vendor IDs. | | +| gdpr.consentData.vendor.legitimateInterests | `Object` | An object representing the user's legitimate interest status for specific vendors IDs. | | {: .alert.alert-info :} -NOTE: The `purpose` and `vendor` objects are required if you are using the `gdprEnforcement` module. If the data is not included, your bid adapters, analytics adapters, and/or userId systems will likely be excluded from the auction as Prebid will assume the user has not given consent for these entities. +NOTE: The `purpose` and `vendor` objects are required if you are using the `tcfControl` module. If the data is not included, your bid adapters, analytics adapters, and/or userId systems will likely be excluded from the auction as Prebid will assume the user has not given consent for these entities. A related parameter is `deviceAccess`, which is at the global level of Prebid.js configuration because it can be used GDPR, CCPA, or custom privacy implementations: @@ -210,7 +210,7 @@ Here is a sample of how the data is structured in the `bidderRequest` object: **_consentString_** -This field contains the user's choices on consent, represented as an encoded string value. In certain scenarios, this field might come to you with an `undefined` value; normally this happens when there was an error (or timeout) during the CMP interaction and the publisher turned off GDPR enforcement. If you don't want to pass `undefined` to your system, you can check for this value and replace it with a valid consent string. See the _consent_required_ code in the example below (under "gdprApplies") for a possible approach to checking and replacing values. +This field contains the user's choices on consent, represented as an encoded string value. In certain scenarios, this field might come to you with an `undefined` value; normally this happens when there was an error (or timeout) during the CMP interaction and the publisher turned off TCF controls. If you don't want to pass `undefined` to your system, you can check for this value and replace it with a valid consent string. See the _consent_required_ code in the example below (under "gdprApplies") for a possible approach to checking and replacing values. **_addtlConsent_** @@ -369,7 +369,7 @@ This should be false if there was some error in the consent data; otherwise set ## Further Reading -- [GDPR Enforcement Module](/dev-docs/modules/gdprEnforcement.html) +- [TCF Control Module](/dev-docs/modules/tcfControl.html) - [IAB TCF Implementation Guide](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/TCF-Implementation-Guidelines.md) - [IAB Transparancy and Consent Framework Policies](https://iabeurope.eu/iab-europe-transparency-consent-framework-policies/) - [Prebid Consent Management - US Privacy Module](/dev-docs/modules/consentManagementUsp.html) diff --git a/dev-docs/modules/consentManagementUsp.md b/dev-docs/modules/consentManagementUsp.md index 90aed2ad66..200e273aca 100644 --- a/dev-docs/modules/consentManagementUsp.md +++ b/dev-docs/modules/consentManagementUsp.md @@ -25,7 +25,7 @@ This consent management module is designed to support the California Consumer Pr This module works with an IAB-compatible US Privacy API (USP-API) to fetch an encoded string representing the user's notice and opt-out choices and make it available for adapters to consume and process. In Prebid 7+; the module defaults to working with an IAB-compatible US Privacy API; in prior versions, the module had to be configured to be in effect. {: .alert.alert-info :} -See also the [Prebid Consent Management - GDPR Module](/dev-docs/modules/consentManagement.html) for supporting the EU General Data Protection Regulation (GDPR) +See also the [Prebid Consent Management - GDPR Module](/dev-docs/modules/consentManagementTcf.html) for supporting the EU General Data Protection Regulation (GDPR) Here's a summary of the interaction process: diff --git a/dev-docs/modules/genericAnalyticsAdapter.md b/dev-docs/modules/genericAnalyticsAdapter.md index 8c21311c66..201410e70b 100644 --- a/dev-docs/modules/genericAnalyticsAdapter.md +++ b/dev-docs/modules/genericAnalyticsAdapter.md @@ -28,9 +28,9 @@ This is an analytics adapter that can interface with any backend, meant for publ -### Note on GDPR enforcement +### Note on TCF controls -If you are using the [GDPR enforcement module](/dev-docs/modules/gdprEnforcement.html) to enforce purpose 7, by default this module will be blocked when GDPR is in scope. +If you are using the [TCF control module](/dev-docs/modules/tcfControl.html) to enforce purpose 7, by default this module will be blocked when GDPR is in scope. To enable it, you may either specify the `gvlid` option (if you are interfacing with a partner) or declare a `softVendorException` if you deem that vendor consent is not required for compliance: ```javascript diff --git a/dev-docs/modules/permutiveRtdProvider.md b/dev-docs/modules/permutiveRtdProvider.md index b09e2f0dba..984ff6ccbf 100644 --- a/dev-docs/modules/permutiveRtdProvider.md +++ b/dev-docs/modules/permutiveRtdProvider.md @@ -73,7 +73,7 @@ as well as enabling settings for specific use cases mentioned above (e.g. acbidd Permutive is not listed as a TCF vendor as all data collection is on behalf of the publisher and based on consent the publisher has received from the user. Rather than through the TCF framework, this consent is provided to Permutive when the user gives the relevant permissions on the publisher website which allow the Permutive SDK to run. -This means that if GDPR enforcement is configured _and_ the user consent isn’t given for Permutive to fire, no cohorts will populate. +This means that if TCF controls are enabled _and_ the user consent isn’t given for Permutive to fire, no cohorts will populate. As Prebid utilizes TCF vendor consent, for the Permutive RTD module to load, Permutive needs to be labeled within the Vendor Exceptions ### Instructions diff --git a/dev-docs/modules/gdprEnforcement.md b/dev-docs/modules/tcfControl.md similarity index 93% rename from dev-docs/modules/gdprEnforcement.md rename to dev-docs/modules/tcfControl.md index 27906a944b..42977e1e7c 100644 --- a/dev-docs/modules/gdprEnforcement.md +++ b/dev-docs/modules/tcfControl.md @@ -1,10 +1,10 @@ --- layout: page_v2 page_type: module -title: GDPR Enforcement Module +title: TCF Control Module description: If you have users in Europe, you can use this module to enable actions for processing under the GDPR and ePrivacy -module_code : gdprEnforcement -display_name : GDPR Enforcement +module_code : tcfControl +display_name : TCF Control enable_download : true recommended: true sidebarType : 1 @@ -19,17 +19,17 @@ sidebarType : 1 {% include legal-warning.html %} {: .alert.alert-warning :} -This module requires the [EU GDPR consent management module](/dev-docs/modules/consentManagement.html) (the base consent module), which reads consent values from the Consent Management Platform (CMP). The GDPR Enforcement Module -will then take action based on the results. See the [base module page](/dev-docs/modules/consentManagement.html) for general background, usage, and legal disclaimers. +This module requires the [TCF consent management module](/dev-docs/modules/consentManagementTcf.html) (the base consent module), which reads consent values from the Consent Management Platform (CMP). The TCF Control Module +will then take action based on the results. See the [base module page](/dev-docs/modules/consentManagementTcf.html) for general background, usage, and legal disclaimers. ## Overview -The [base consent module](/dev-docs/modules/consentManagement.html) performs the following actions: +The [base consent module](/dev-docs/modules/consentManagementTcf.html) performs the following actions: 1. Fetches the user's GDPR consent data from the CMP. 2. Incorporates this data into the auction objects for adapters to collect. -The GDPR Enforcement Module adds the following: +The TCF Control Module adds the following: 1. Allows the page to define which activities should be enforced at the Prebid.js level. 2. Actively enforces those activities based on user consent data. @@ -58,10 +58,10 @@ A page needs to define configuration rules about how Prebid.js should enforce ea {: .alert.alert-info :} To turn on Prebid.js enforcement you must: -(1) Include the gdprEnforcement module in the Prebid.js build +(1) Include the tcfControl module in the Prebid.js build and (2) setConfig `consentManagement.gdpr.cmpApi` to either 'iab' or 'static' -The following fields related to GDPR enforcement are supported in the [`consentManagement`](/dev-docs/modules/consentManagement.html) object: +The following fields related to GDPR enforcement are supported in the [`consentManagement`](/dev-docs/modules/consentManagementTcf.html) object: {: .table .table-bordered .table-striped } | Param | Type | Description | Example | @@ -228,14 +228,14 @@ This behavior can be changed to the same "basic enforcement" algorithm described Follow the basic build instructions in the GitHub Prebid.js repo's main [README](https://github.com/prebid/Prebid.js/blob/master/README.md). Include the base consent management module and this enforcement module as additional options on the **gulp build** command: ```bash -gulp build --modules=consentManagement,gdprEnforcement,bidAdapter1,bidAdapter2 +gulp build --modules=consentManagement,tcfControl,bidAdapter1,bidAdapter2 ``` You can also use the [Prebid.js Download](/download.html) page. ## Further Reading -* [EU GDPR Consent Management Module](/dev-docs/modules/consentManagement.html) +* [EU GDPR Consent Management Module](/dev-docs/modules/consentManagementTcf.html) * [IAB TCF Implementation Guidelines](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/TCF-Implementation-Guidelines.md) * [IAB TCF2 Consent String Format](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20Consent%20string%20and%20vendor%20list%20formats%20v2.md) * [Prebid TCF2 Support](https://docs.google.com/document/d/1fBRaodKifv1pYsWY3ia-9K96VHUjd8kKvxZlOsozm8E/edit#) diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md index 3025b6e144..72539387a6 100644 --- a/dev-docs/modules/userId.md +++ b/dev-docs/modules/userId.md @@ -39,7 +39,7 @@ Not all bidder adapters support all forms of user ID. See the tables below for a ## User ID, GDPR, Permissions, and Opt-Out -When paired with the [Consent Management](/dev-docs/modules/consentManagement.html) module, privacy rules are enforced: +When paired with the [Consent Management](/dev-docs/modules/consentManagementTcf.html) module, privacy rules are enforced: * The module checks the GDPR consent string * If no consent string is available OR if the user has not consented to Purpose 1 (local storage): @@ -411,4 +411,4 @@ This will have no effect until you call the `registerSignalSources` API. This me ## Further Reading * [Prebid.js Usersync](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Configure-User-Syncing) -* [GDPR ConsentManagement Module](/dev-docs/modules/consentManagement.html) +* [TCF ConsentManagement Module](/dev-docs/modules/consentManagementTcf.html) diff --git a/dev-docs/publisher-api-reference/aliasBidder.md b/dev-docs/publisher-api-reference/aliasBidder.md index fd0a7248ef..24d7e6aef3 100644 --- a/dev-docs/publisher-api-reference/aliasBidder.md +++ b/dev-docs/publisher-api-reference/aliasBidder.md @@ -27,7 +27,7 @@ The options object supports these parameters: {: .table .table-bordered .table-striped } | Option Parameter | Type | Description | |------------|---------|---------------------------------| -| gvlid | integer | IAB Global Vendor List ID for this alias for use with the [GDPR Enforcement module](/dev-docs/modules/gdprEnforcement.html). | +| gvlid | integer | IAB Global Vendor List ID for this alias for use with the [TCF control module](/dev-docs/modules/tcfControl.html). | {: .alert.alert-info :} Creating an alias for a Prebid Server adapter is done differently. See 'extPrebid' diff --git a/dev-docs/publisher-api-reference/setConfig.md b/dev-docs/publisher-api-reference/setConfig.md index 73ad3d0643..0ee1994b45 100644 --- a/dev-docs/publisher-api-reference/setConfig.md +++ b/dev-docs/publisher-api-reference/setConfig.md @@ -48,7 +48,7 @@ Core config: 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) +* [Consent Management](/dev-docs/modules/consentManagementTcf.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) diff --git a/features/firstPartyData.md b/features/firstPartyData.md index 135f78e363..899956f4fd 100644 --- a/features/firstPartyData.md +++ b/features/firstPartyData.md @@ -188,7 +188,7 @@ pbjs.setConfig({ {: .alert.alert-warning :} Note that supplying first party **user** data may require special -consent in certain regions. By default, Prebid's [gdprEnforcement](/dev-docs/modules/gdprEnforcement.html) module does **not** police the passing +consent in certain regions. By default, Prebid's [tcfControl](/dev-docs/modules/tcfControl.html) module does **not** police the passing of user data, but can optionally do so if the `personalizedAds` rule is enabled. {: .alert.alert-warning :} diff --git a/identity/sharedid.md b/identity/sharedid.md index cd25557eac..bf4f05fa70 100644 --- a/identity/sharedid.md +++ b/identity/sharedid.md @@ -157,7 +157,7 @@ You can find available configuration options for the SharedID module [here](http There are several privacy scenarios in which a user ID is not created or read: 1. The User ID module suppresses all cookie reading and setting activity - when the [GDPR Enforcement Module](/dev-docs/modules/gdprEnforcement.html) is in place and there's no consent for Purpose 1. + when the [TCF Control Module](/dev-docs/modules/tcfControl.html) is in place and there's no consent for Purpose 1. 2. The User ID module infrastructure supports a first-party opt-out, by setting the `_pbjs_id_optout` cookie or local storage to any value. No other cookies will be set if this one is set. 3. The SharedId module will suppress the ID when the COPPA flag is set. @@ -217,7 +217,7 @@ Below are the available configuration options for the PubCID script. | create | boolean | If true, then an id is created automatically by the script if it's missing. Default is true. If your server has a component that generates the id instead, then this should be set to false | | `true` | | expInterval | decimal | Expiration interval in minutes. Default is 525600, or 1 year | | `525600` | | extend | boolean | If true, the the expiration time is automatically extended whenever the script is executed even if the id exists already. Default is true. If false, then the id expires from the time it was initially created. | For publisher server support only. If true, the publisher's server will create the (pubcid) cookie. Default is true. | `true` | -| pixelUrl | string (optional) | For publisher server support only. Where to call out to for a server cookie. | | `/wp-json/pubcid/v1/extend/` +| pixelUrl | string (optional) | For publisher server support only. Where to call out to for a server cookie. | | `/wp-json/pubcid/v1/extend/` | | type | string | Type of storage. It's possible to specify one of the following: 'html5', 'cookie'. Default is 'html5' priority, aka local storage, and fall back to cookie if local storage is unavailable. | If true, the expiration time of the stored IDs will be refreshed during each page load. Default is false. | `cookie` | #### Example Configurations diff --git a/prebid/prebidjs.md b/prebid/prebidjs.md index 9052e11e9e..840091ce64 100644 --- a/prebid/prebidjs.md +++ b/prebid/prebidjs.md @@ -66,7 +66,7 @@ Analytics adapters offer the ability to learn more about latency, revenues, bid Prebid.js Modules also plug into the Prebid.js Core. They add functionality not present in the Core that not every publisher needs. Example modules: -- GDPR support (the [consentManagement]({{site.baseurl}}/dev-docs/modules/consentManagement.html) module) +- GDPR support (the [consentManagementTcf]({{site.baseurl}}/dev-docs/modules/consentManagementTcf.html) module) - Currency conversion (the [currency]({{site.baseurl}}/dev-docs/modules/currency.html) module) - Server-to-server testing (the [s2sTest]({{site.baseurl}}/dev-docs/modules/s2sTesting.html) module) - and [many others](/dev-docs/modules/index.html) diff --git a/prebid/prebidjsReleases.md b/prebid/prebidjsReleases.md index 788231c1df..2b9a176217 100644 --- a/prebid/prebidjsReleases.md +++ b/prebid/prebidjsReleases.md @@ -66,7 +66,7 @@ The table below is a summary of feature changes and important bug fixes in core | 3.17 | UserID module also exports IDs as eids | | 3.16 | isSafariBrowser fixed for Chrome and Firefox on iOS | | 3.15 | Advanced Size Mapping module support adunits of the same name | -| 3.14 | New [GDPR enforcement module](/dev-docs/modules/gdprEnforcement.html) supports enforcing Purpose 1 - DeviceAccess | +| 3.14 | New [GDPR enforcement module](/dev-docs/modules/tcfControl.html) supports enforcing Purpose 1 - DeviceAccess | | 3.13 | GDPR module supports defaultGdprScope option | | 3.12 | Initial support for TCF2 - reading and passing consent strings, added [DeviceAccess](/dev-docs/publisher-api-reference/setConfig.html#setConfig-deviceAccess) configuration setting | | 3.11 | [Advanced Size Mapping module](/dev-docs/modules/sizeMappingV2.html) | @@ -95,7 +95,7 @@ The table below is a summary of feature changes and important bug fixes in core | 2.10 | [User ID module](/dev-docs/modules/userId.html) released with support for PubCommon ID and Unified ID | | 2.10 | A bidder which responded in time is now considered a timely bidder, even if it responded with no bids. See [PR 3696](https://github.com/prebid/Prebid.js/pull/3696) | | 2.9 | Add 'hb_cache_host' targeting for video bids when cache is set to support upcoming video cache redirector | -| 2.9 | remove removeRequestId logic. See [PR 3698](https://github.com/prebid/Prebid.js/pull/3698) +| 2.9 | remove removeRequestId logic. See [PR 3698](https://github.com/prebid/Prebid.js/pull/3698) | | 2.8 | Added [s2sConfig](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Server-to-Server) `syncUrlModifier` option to modify userSync URLs | | 2.8 | Add hb_uuid and hb_cache_id back to dfp module after having been removed in 2.7 | | 2.6 | Update auction algorithm logic for long-form. See [PR 3625](https://github.com/prebid/Prebid.js/pull/3625) | diff --git a/support/privacy-resources.md b/support/privacy-resources.md index ce32906565..b5ab2b8ae1 100644 --- a/support/privacy-resources.md +++ b/support/privacy-resources.md @@ -42,8 +42,8 @@ The privacy tools that Prebid has built in support of European rules may help ad The IAB defined the Transparency and Consent Framework (TCF) to address European GDPR rules. Prebid support for TCF is described: - [Prebid.js CMP Best Practices](/dev-docs/cmp-best-practices.html) -- [Prebid.js GDPR Consent Management Module](/dev-docs/modules/consentManagement.html) -- [Prebid.js GDPR Enforcement Module](/dev-docs/modules/gdprEnforcement.html) +- [Prebid.js GDPR Consent Management Module](/dev-docs/modules/consentManagementTcf.html) +- [Prebid.js GDPR Enforcement Module](/dev-docs/modules/tcfControl.html) - [Prebid Server GDPR Support](/prebid-server/features/pbs-privacy.html#gdpr) - [White paper: Prebid Support for Enforcing TCF 2](https://docs.google.com/document/d/1fBRaodKifv1pYsWY3ia-9K96VHUjd8kKvxZlOsozm8E) From 8c8bc7c69490925373cb335882bb3e5b309e744d Mon Sep 17 00:00:00 2001 From: jsnellbaker <31102355+jsnellbaker@users.noreply.github.com> Date: Fri, 14 Jun 2024 08:32:24 -0400 Subject: [PATCH 017/816] new note for appnexus bidder for 9.0 (#5398) --- dev-docs/bidders/appnexus.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dev-docs/bidders/appnexus.md b/dev-docs/bidders/appnexus.md index a8dff8af88..834f91fe41 100644 --- a/dev-docs/bidders/appnexus.md +++ b/dev-docs/bidders/appnexus.md @@ -45,6 +45,9 @@ All AppNexus (Xandr) placements included in a single call to `requestBids` must #### Bid Params +{: .alert.alert-danger :} +Starting with Prebid.js version 9.0, an update was made to the `appnexusBidAdapter.js` file to remove the support for the `transformBidParams` function. Previously this standard adapter function was used in conjunction of Prebid.js > PBS requests to modify any bid params for that bidder to the bid param format used by the PBS endpoint. Part of the changes for 9.0 in general were to remove these functions from the client-side adapter files, in order to reduce the build size of Prebid.js for those publishers who wanted to make the PBS requests. In the case of our adapter, we instead created a new module named `anPspParamsConverter` that would mimic behavior of the `transformBidParams` function. There's no setup instructions needed on the Prebid.js configs, the module only needs to be included in the Prebid.js build file and it will perform the needed steps. If you have any questions on this change, please reach out to your Microsoft representative and they can help. + {: .alert.alert-danger :} Starting with Prebid.js version 7.36.0, an update was made to the `appnexusBidAdapter.js` file to support bid params in a lower-case underscore format (eg `invCode` to `inv_code`) similar to how the params are formatted for the Prebid Server AppNexus bidder. This change was implemented to streamline publisher setups for both projects instead of maintaining separate versions of the same params depending on what setup is used. To avoid breaking changes, the old 'camelCase' format is still currently supported for all AppNexus bid params in the `appnexusBidAdapter.js` file. If you are using an older version of Prebid.js, you will need to continue to use the older 'camelCase' format as appropriate. From 68872faf4d9f1db46ecee386535911169659dd1c Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Fri, 14 Jun 2024 05:39:20 -0700 Subject: [PATCH 018/816] Prebid 9: PBS adapter: update docs timeout (#5409) --- dev-docs/modules/prebidServer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/modules/prebidServer.md b/dev-docs/modules/prebidServer.md index 22bb4c6737..04be700ad8 100644 --- a/dev-docs/modules/prebidServer.md +++ b/dev-docs/modules/prebidServer.md @@ -85,7 +85,7 @@ There are many configuration options for s2sConfig: | `allowUnknownBidderCodes` | Optional | Boolean | Allow Prebid Server to bid on behalf of bidders that are not explicitly listed in the adUnit. See important [note](#allowUnknownBidderCodes) below. Defaults to `false`. | | `defaultVendor` | Optional | String | Automatically includes all following options in the config with vendor's default values. Individual properties can be overridden by including them in the config along with this setting. See the Additional Notes below for more information. | | `enabled` | Optional | Boolean | Enables this s2sConfig block - defaults to `false` | -| `timeout` | Optional | Integer | Number of milliseconds allowed for the server-side auctions. This should be approximately 200ms-300ms less than your Prebid.js timeout to allow for all bids to be returned in a timely manner. Defaults to 1000ms. | +| `timeout` | Optional | Integer | Number of milliseconds allowed for the server-side auctions. This should be approximately 200ms-300ms less than your Prebid.js timeout to allow for all bids to be returned in a timely manner. Defaults to 75% of [`bidderTimeout`](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Bidder-Timeouts) or 750ms, whichever is lesser. | | `adapter` | Required | String | Adapter to use to connect to Prebid Server. Defaults to 'prebidServer' | | `endpoint` | Required | URL or Object | Defines the auction endpoint for the Prebid Server cluster. See table below for object config properties. | | `syncEndpoint` | Required | URL or Object | Defines the cookie_sync endpoint for the Prebid Server cluster. See table below for object config properties. | From 16cb434746a422226fe77473d8178e4b99f0664d Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 14 Jun 2024 08:49:34 -0400 Subject: [PATCH 019/816] ras rename (#5386) * ras rename * add missing fields to ringieraxelspringer doc (#5413) --------- Co-authored-by: wsusrasp <106743463+wsusrasp@users.noreply.github.com> Co-authored-by: Muki Seiler --- dev-docs/bidders/ras.md | 1 + dev-docs/bidders/ringieraxelspringer.md | 46 +++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 dev-docs/bidders/ringieraxelspringer.md diff --git a/dev-docs/bidders/ras.md b/dev-docs/bidders/ras.md index e8f9ce3837..3c39d03575 100644 --- a/dev-docs/bidders/ras.md +++ b/dev-docs/bidders/ras.md @@ -13,6 +13,7 @@ floors_supported: false fpd_supported: false sidebarType: 1 multiformat_supported: will-bid-on-one +pbjs_version_notes: removed in 9.0 --- diff --git a/dev-docs/bidders/ringieraxelspringer.md b/dev-docs/bidders/ringieraxelspringer.md new file mode 100644 index 0000000000..38c2aad56c --- /dev/null +++ b/dev-docs/bidders/ringieraxelspringer.md @@ -0,0 +1,46 @@ +--- +layout: bidder +title: RingierAxelSpringer +description: Prebid RingierAxelSpringer Bidder Adapter +biddercode: ringieraxelspringer +media_types: banner, native +pbjs: true +pbs: false +prebid_member: false +gvl_id: 1021 +tcfeu_supported: true +safeframes_ok: false +deals_supported: false +floors_supported: false +fpd_supported: false +sidebarType: 1 +multiformat_supported: will-bid-on-one +dsa_supported: true +privacy_sandbox: paapi +ortb_blocking_supported: false +schain_supported: false +dchain_supported: false +gpp_sids: None +coppa_supported: false +usp_supported: false +--- + + + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|------------------|----------|------------------------------------------------------------------------------------------------------|---------------------------------------------|----------| +| `network` | required | Specific identifier provided by RAS | `'4178463'` | `string` | +| `site` | required | Specific identifier name (case-insensitive) that is associated with this ad unit and provided by RAS | `'example_com'` | `string` | +| `area` | required | Ad unit category name; only case-insensitive alphanumeric with underscores and hyphens are allowed | `'sport'` | `string` | +| `slot` | required | Ad unit placement name (case-insensitive) provided by RAS | `'slot'` | `string` | +| `pageContext` | optional | Web page context data | `{}` | `object` | +| `pageContext.dr` | optional | Document referrer URL address | `'https://example.com/'` | `string` | +| `pageContext.du` | optional | Document URL address | `'https://example.com/sport/football/article.html?id=932016a5-02fc-4d5c-b643-fafc2f270f06'` | `string` | +| `pageContext.dv` | optional | Document virtual address as slash-separated path that may consist of any number of parts (case-insensitive alphanumeric with underscores and hyphens); first part should be the same as `site` value and second as `area` value; next parts may reflect website navigation | `'example_com/sport/football'` | `string` | +| `pageContext.keyWords` | optional | List of keywords associated with this ad unit; only case-insensitive alphanumeric with underscores and hyphens are allowed | `['euro', 'lewandowski']` | `string[]` | +| `pageContext.keyValues` | optional | Key-values associated with this ad unit (case-insensitive); following characters are not allowed in the values: `" ' = ! + # * ~ ; ^ ( ) < > ] [ & @` | `{}` | `object` | +| `pageContext.keyValues.ci` | optional | Content unique identifier | `'932016a5-02fc-4d5c-b643-fafc2f270f06'` | `object` | +| `pageContext.keyValues.adunit` | optional | Ad unit name | `'example_com/sport'` | `string` | From c01b58d3ba37d5f91c0c65dc7a3182956a2d5881 Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 14 Jun 2024 12:52:40 -0400 Subject: [PATCH 020/816] update quebec page (#5424) --- features/ac-quebec.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/features/ac-quebec.md b/features/ac-quebec.md index 7a76f77f07..f8555e3530 100644 --- a/features/ac-quebec.md +++ b/features/ac-quebec.md @@ -101,9 +101,6 @@ bidders are in such alignment. An alternate solution would utilize the Prebid Server version of the [Activity Control system](/prebid-server/features/pbs-activitycontrols.html). -{: .alert.alert-info :} -Only the Java version of Prebid Server currently supports targeting Activity Controls to geographic regions. - Here's an example account configuration that utilizes the user's geographic region to determine whether to allow or deny the named activities. Publishers will need to confirm the details with their Prebid Server host company. From 0e09a9ca5162de436c71f0409014d8e29b9ac988 Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Sun, 16 Jun 2024 02:38:30 -0700 Subject: [PATCH 021/816] Document new JS module: topLevelPaapi (#5408) * Document new JS module: topLevelPaapi * linter * add word --------- Co-authored-by: Chris Huie --- dev-docs/modules/topLevelPaapi.md | 124 ++++++++++++++++++ .../publisher-api-reference/getPAAPIBids.md | 93 +++++++++++++ 2 files changed, 217 insertions(+) create mode 100644 dev-docs/modules/topLevelPaapi.md create mode 100644 dev-docs/publisher-api-reference/getPAAPIBids.md diff --git a/dev-docs/modules/topLevelPaapi.md b/dev-docs/modules/topLevelPaapi.md new file mode 100644 index 0000000000..735846a760 --- /dev/null +++ b/dev-docs/modules/topLevelPaapi.md @@ -0,0 +1,124 @@ +--- +layout: page_v2 +page_type: module +title: Module - topLevelPaapi +description: Run top level PAAPI auctions +module_code : topLevelPaapi +display_name : Run top level PAAPI auctions +enable_download : true +sidebarType : 1 +--- + +# Top level PAAPI module + +This module allows Prebid.js to support PAAPI by running on-device auctions as the top level seller. + +## Comparison with paapiForGpt + +Both this module and [paapiForGpt](/dev-docs/modules/paapiForGpt.html) allow bid adapters to participate in PAAPI auctions as component sellers. + +With paapiForGpt, bidders' intent to participate in PAAPI is submitted to GPT, which can then decide how to run the on-device auction. +With topLevelPaapi, Prebid.js directly manages the on-device auction, trading ease of use for more control. + +## Publisher Integration + +To use topLevelPaapi: + +- you'll need a [decision logic URL](https://github.com/WICG/turtledove/blob/main/FLEDGE.md#23-scoring-bids) that has been [attested](https://github.com/privacysandbox/attestation) with Google. How to write decision logic and how to attest it are both out of scope for this document. +- include this module with your Prebid.js bundle; this also automatically includes the [PAAPI module](/dev-docs/modules/paapi.html) + + ```bash + gulp build --modules=topLevelPaapi,... + ``` + +- [configure this module](#config) +- render PAAPI bids (see [examples](#examples)) + + +## Module Configuration + +This module exposes the following settings: + +{: .table .table-bordered .table-striped } +|Name |Type |Description |Notes | +| ------------ | ------------ | ------------ |------------ | +|paapi.topLevelSeller | Object | | | +|paapi.topLevelSeller.auctionConfig | Object | Base [AuctionConfig](https://github.com/WICG/turtledove/blob/main/FLEDGE.md#2-sellers-run-on-device-auctions) to use in `runAdAuction` | Only `seller` and `decisionLogicURL` are required | +|paapi.topLevelSeller.autorun | Boolean | If `true` (the default) , automatically start PAAPI auctions as soon as possible | | +|paapi.topLevelSeller.overrideWinner | Boolean | If `true`, replace contextual winners with PAAPI winners as they are rendered. Default is `false`. | see [example](#overrideWinner) | + + +## Examples + +### Basic Example using renderAd + +```javascript +pbjs.setConfig({ + paapi: { + enabled: true, + defaultForSlots: 1, + topLevelSeller: { + auctionConfig: { + seller: 'https://www.publisher.com', + decisionLogicURL: 'https://www.publisher.com/decisionLogic.js', + }, + } + } +}) +``` + +With the above, `navigator.runAdAuction` is invoked once per ad unit, and the result is made available through [`getPAAPIBids`](/dev-docs/publisher-api-reference/getPAAPIBids.html): + +```javascript +pbjs.requestBids({ + bidsBackHandler: function(contextualBids) { + pbjs.getPAAPIBids().then(paapiBids => { + Object.entries(contextualBids).forEach(([adUnitCode, {bids}]) => { + const paapiWinner = paapiBids[adUnitCode]; + const contextualWinner = bids?.[0]; + const targetDoc = document.getElementById(adUnitCode).contentDocument // assumes there's an iframe with id = adUnitCode + // PAAPI bids can be rendered as if they were "normal" Prebid bids + if (paapiWinner) { + pbjs.renderAd(targetDoc, paapiWinner.adId) + } else { + pbjs.renderAd(targetDoc, contextualWinner.adId) + } + }) + }) + } +}) +``` + + +### Automatically render PAAPI winners instead of contextual bids + +When `overrideWinner` is enabled, rendering a "normal" Prebid bid will instead render a PAAPI bid, if the PAAPI auction for the slot yielded a winner. This is an easy way include the result of PAAPI auctions without having to change the rendering logic. For example: + +```javascript +pbjs.setConfig({ + paapi: { + enabled: true, + defaultForSlots: 1, + topLevelSeller: { + auctionConfig: { + seller: 'https://www.publisher.com', + decisionLogicURL: 'https://www.publisher.com/decisionLogic.js', + }, + overrideWinner: true + } + } +}); + +pbjs.requestBids({ + bidsBackHandler: function() { + // if Prebid wins the GAM auction (and renders a Prebid creative), the following will render PAAPI winners over the Prebid winners + pbjs.setTargetingForGPTAsync(); + } +}) +``` + +## Related Reading + +- [PAAPI module](/dev-docs/modules/paapi.html) +- [FLEDGE](https://github.com/WICG/turtledove/blob/main/FLEDGE.md) +- [getPAAPIBids](/dev-docs/publisher-api-reference/getPAAPIBids.html) diff --git a/dev-docs/publisher-api-reference/getPAAPIBids.md b/dev-docs/publisher-api-reference/getPAAPIBids.md new file mode 100644 index 0000000000..aa6cdb5365 --- /dev/null +++ b/dev-docs/publisher-api-reference/getPAAPIBids.md @@ -0,0 +1,93 @@ +--- +layout: api_prebidjs +title: pbjs.getPAAPIBids(options) +description: getPAAPIBids API +sidebarType: 1 +--- + +Returns a promise of the latest PAAPI bid for each ad unit, optionally filtered by auction or ad unit. + +**Kind**: static method of pbjs API. Only available when the [topLevelPaapi module](/dev-docs/modules/topLevelPaapi.html) is installed. + +**Returns**: `Promise` - Promise to a map from ad unit code to the PAAPI winner for that ad unit, if available. + +**Parameters**: + +{: .table .table-bordered .table-striped } +| Param | Scope | Type | Description | +| --- | --- | --- | --- | +| options | Optional | `Object` | | +| options.adUnitCode | Optional | `String` | Ad unit filter; if provided, only return the PAAPI winner for this ad unit | +| options.auctionId | Optional | `String` | Auction filter; if provided, only return PAAPI winners for this auction | + +**Result**: + +The return value is a map where each value is either `null` (when there is no PAAPI winner), or an object with this format: + +{: .table .table-bordered .table-stripped :} +| Param | Type | Description | +| --- | --- | --- | +| adId | String | Ad ID. can be used with [renderAd](/dev-docs/publisher-api-reference/renderAd.html) | +| auctionId | String | Auction ID tied to this bid | +| adUnitCode | String | Ad unit code tied to this bid | +| source | String | Always `"paapi"` | +| urn | String | Creative URN (only set if `paapi.topLevelSeller.auctionConfig.resolveToConfig` is `false`| +| frameConfig | Object | Creative fenced frame config (only set if `paapi.topLevelSeller.auctionConfig.resolveToConfig` is `true`| +| auctionConfig | Object | The auction config object that was passed to `navigator.runAdAuction` and generated this bid | +| width | Number | Creative width | +| height | Number | Creative height | + +**Example**: + +```js +pbjs.getPAAPIBids({adUnitCode: 'test-slot'}) +``` + +```json +{ + "test-slot": { + "source": "paapi", + "adId": "paapi:/0c00694d-958d-4250-98b3-5fe15cb019ab/:/test-slot", + "width": 300, + "height": 250, + "adUnitCode": "test-slot", + "auctionId": "0c00694d-958d-4250-98b3-5fe15cb019ab", + "urn": "urn:uuid:81005931-5726-4fb4-8bec-9ae74248e1ef", + "auctionConfig": { + "auctionSignals": { + "prebid": { + "bidfloor": 1, + "bidfloorcur": "USD" + } + }, + "requestedSize": { + "width": 300, + "height": 250 + }, + "componentAuctions": [ + { + "requestedSize": { + "width": "300px", + "height": "250px" + }, + "seller": "https://ads.optable.co", + "decisionLogicURL": "https://ads.optable.co/ca/paapi/v1/ssp/decision-logic.js?origin=daa30ba1-5613-4a2c-b7f0-34e2c033202a", + "interestGroupBuyers": [ + "https://ads.optable.co" + ], + "sellerCurrency": "USD", + "perBuyerCurrencies": { + "https://ads.optable.co": "USD" + }, + "perBuyerMultiBidLimits": { + "https://ads.optable.co": 100 + } + } + ], + "resolveToConfig": false, + "seller": "https://publisher.com", + "decisionLogicURL": "https://publisher.com/decisionLogic.js" + } + } +} +``` From b6e6623799e0cffd5938f9ea165d32efa3570055 Mon Sep 17 00:00:00 2001 From: shashidhar-insticator <91495253+shashidhar-insticator@users.noreply.github.com> Date: Sun, 16 Jun 2024 15:08:41 +0530 Subject: [PATCH 022/816] Added publisherId param to bid params in insticator adapter doc (#5406) * Added publisherId param to bid params in insticator adapter doc * chaning userIds from none to all --------- Co-authored-by: shashidharm --- dev-docs/bidders/insticator.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/insticator.md b/dev-docs/bidders/insticator.md index 87880a2ba6..0ec593375a 100644 --- a/dev-docs/bidders/insticator.md +++ b/dev-docs/bidders/insticator.md @@ -16,6 +16,7 @@ multiformat_supported: will-bid-on-any pbjs: true gvl_id: 910 sidebarType: 1 +userIds: all --- ### Bid Params @@ -24,6 +25,7 @@ sidebarType: 1 | Name | Scope | Description | Example | Type | |-----------------------------|----------|-----------------------------------------------------------------------------------------|------------------------------------|----------| | `adUnitId` | Required | The ad unit ID provided by Insticator | `'test'` | `string` | +| `publisherId` | optional | The publisher ID provided by Insticator | `'test'` | `string` | | `yob` | optional | Year of Birth | `'1982'` | `string` | | `gender` | optional | Gender | `'M'` | `string` | | `instl` | optional | 1 = the ad is interstitial or full screen, 0 = not interstitial. | `1` | `number` | @@ -58,7 +60,8 @@ var adUnitsBannerOnly = [ { bidder: 'insticator', params: { - adUnitId: 'example_adunit_id', + adUnitId: 'example_adunit_id', + publisherId: 'example_publisher_id', }, }, ], @@ -170,7 +173,8 @@ var adUnits = [ bids: [{ bidder: 'insticator', params: { - adUnitId: 'example_adunit_id' + adUnitId: 'example_adunit_id', + publisherId: 'example_publisher_id', } }], ... From 80ab0672083d0dc0496e449fdeb12b6b899f161b Mon Sep 17 00:00:00 2001 From: Fatih Kaya Date: Sun, 16 Jun 2024 12:38:53 +0300 Subject: [PATCH 023/816] AdMatic: documenting monetixads alias (#5387) * added simple params * update * Update admatic.md * update * update * Pixad Bid Adapter: added simple params * AdMatic Adapter: Feature update Pixad alias is included in the update. * Update admatic.md * Update pixad.md * gvl_id add * Update pixad.md * admatic && pixad pbs support true * Create monetixads.md --- dev-docs/bidders/monetixads.md | 91 ++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 dev-docs/bidders/monetixads.md diff --git a/dev-docs/bidders/monetixads.md b/dev-docs/bidders/monetixads.md new file mode 100644 index 0000000000..2039fb405e --- /dev/null +++ b/dev-docs/bidders/monetixads.md @@ -0,0 +1,91 @@ +--- +layout: bidder +title: Monetix Ads +description: Prebid Monetix Bidder Adapter. +pbjs: true +pbs: true +biddercode: monetixads +media_types: banner,video,native +gvl_id: 1281 (admatic) +tcfeu_supported: true +usp_supported: true +coppa_supported: true +gpp_sids: tcfeu, tcfca, usnat, usstate_all, usp +schain_supported: true +dchain_supported: false +userIds: criteo, id5Id, sharedId, unifiedId +safeframes_ok: true +floors_supported: true +aliasCode: admatic +multiformat_supported: will-bid-on-any +sidebarType: 1 +--- + +### Description + +Monetix Ads header bidding adapter connects with Monetix Ads demand sources to fetch bids for network ID. Please reach out to your account manager or for more information. + +### Bid params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------------|----------|-------------------------------------|----------|----------| +| `networkId` | required | The network ID from Monetix Ads | `12345` | `number` | +| `host` | required | RTB Host | `rtb.network.monetixads.com` | `string` | + +### Test Parameters + +300x250 banner test + +```javascript +var adUnits = [{ + code: 'your-slot_1-div', + mediaTypes: { + banner: { sizes: [[300, 250]] }, + }, + bids: [{ + bidder: 'monetixads', + params: { + networkId: 12345, + host: 'rtb.network.monetixads.com' + } + }] +},{ + code: 'your-slot_2-div', + mediaTypes: { + native: { ... }, + }, + bids: [{ + bidder: 'monetixads', + params: { + networkId: 12345, + host: 'rtb.network.monetixads.com' + } + }] +},{ + code: 'your-slot_3-div', + mediaTypes: { + video: { ... }, + }, + bids: [{ + bidder: 'monetixads', + params: { + networkId: 12345, + host: 'rtb.network.monetixads.com' + } + }] +}]; +``` + +## UserSync example + +```javascript +pbjs.setConfig({ + userSync: { + iframeEnabled: true, + syncEnabled: true, + syncDelay: 1, + aliasSyncEnabled: true + } +}); +``` From afd3aee16c8f6f44fa66cb9a280633559822af81 Mon Sep 17 00:00:00 2001 From: Kevin Siow Date: Sun, 16 Jun 2024 11:39:20 +0200 Subject: [PATCH 024/816] Dailymotion Bid Adapter: Add support for user sync and new fields (#5356) * Dailymotion Bid Adapter: Add support for user sync and new fields * Dailymotion Bid Adapter: Fix lint MD047/single-trailing-newline * Dailymotion Bid Adapter: change markdown header levels * Dailymotion Bid Adapter: add support for content.url & device.ext.atts --------- Co-authored-by: Kevin Siow --- dev-docs/bidders/dailymotion.md | 55 ++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/dev-docs/bidders/dailymotion.md b/dev-docs/bidders/dailymotion.md index 5557b2befb..e418e7db33 100644 --- a/dev-docs/bidders/dailymotion.md +++ b/dev-docs/bidders/dailymotion.md @@ -24,7 +24,7 @@ To use the adapter with any non-test request, you first need to ask an API key f This API key will ensure proper identification of your inventory and allow you to get real bids. -# Configuration options +### Configuration options Before calling this adapter, you need to at least set a video adUnit in an instream context and the API key in the bid parameters: @@ -49,7 +49,29 @@ const adUnits = [ `apiKey` is your publisher API key. For testing purpose, you can use "dailymotion-testing". -# Test Parameters +#### User Sync + +To enable user synchronization, add the following code. Dailymotion highly recommends using iframes and/or pixels for user syncing. This feature enhances DSP user match rates, resulting in higher bid rates and bid prices. Ensure that `pbjs.setConfig()` is called only once. + +```javascript +pbjs.setConfig({ + userSync: { + syncEnabled: true, + filterSettings: { + iframe: { + bidders: '*', // Or add dailymotion to your list included bidders + filter: 'include' + }, + image: { + bidders: '*', // Or add dailymotion to your list of included bidders + filter: 'include' + }, + }, + }, +}); +``` + +### Test Parameters By setting the following bid parameters, you'll get a constant response to any request, to validate your adapter integration: @@ -74,7 +96,7 @@ const adUnits = [ Please note that failing to set these will result in the adapter not bidding at all. -# Sample video AdUnit +### Sample video AdUnit To allow better targeting, you should provide as much context about the video as possible. There are three ways of doing this depending on if you're using Dailymotion player or a third party one. @@ -130,7 +152,12 @@ const adUnits = [ private: false, tags: 'tag_1,tag_2,tag_3', title: 'test video', + url: 'https://test.com/testvideo' topics: 'topic_1, topic_2', + isCreatedForKids: false, + videoViewsInSession: 1, + autoplay: false, + playerVolume: 8 } } }], @@ -139,6 +166,12 @@ const adUnits = [ video: { api: [2, 7], context: 'instream', + mimes: ['video/mp4'], + minduration: 5, + maxduration: 30, + playbackmethod: [3], + plcmt: 1, + protocols: [7, 8, 11, 12, 13, 14] startdelay: 0, w: 1280, h: 720, @@ -160,10 +193,18 @@ Each of the following video metadata fields can be added in bids.params.video. * `private` - True if video is not publicly available * `tags` - Tags for the video, comma separated * `title` - Video title +* `url` - URL of the content * `topics` - Main topics for the video, comma separated * `xid` - Dailymotion video identifier (only applicable if using the Dailymotion player) +* `isCreatedForKids` - [The content is created for children as primary audience](https://faq.dailymotion.com/hc/en-us/articles/360020920159-Content-created-for-kids) + +The following contextual informations can also be added in bids.params.video. + +* `videoViewsInSession` - Number of videos viewed within the current user session +* `autoplay` - Playback was launched without user interaction +* `playerVolume` - Player volume between 0 (muted, 0%) and 10 (100%) -If you already specify [First-Party data](https://docs.prebid.org/features/firstPartyData.html) through the `ortb2` object when calling [`pbjs.requestBids(requestObj)`](https://docs.prebid.org/dev-docs/publisher-api-reference/requestBids.html), we will fallback to those values when possible. See the mapping below. +If you already specify [First-Party data](https://docs.prebid.org/features/firstPartyData.html) through the `ortb2` object when calling [`pbjs.requestBids(requestObj)`](https://docs.prebid.org/dev-docs/publisher-api-reference/requestBids.html), we will collect the following values and fallback to bids.params.video values when applicable. See the mapping below. | From ortb2 | Metadata fields | |---------------------------------------------------------------------------------|-----------------| @@ -174,3 +215,9 @@ If you already specify [First-Party data](https://docs.prebid.org/features/first | `ortb2.site.content.livestream` | `livestream` | | `ortb2.site.content.keywords` | `tags` | | `ortb2.site.content.title` | `title` | +| `ortb2.site.content.url` | `url` | +| `ortb2.app.bundle` | N/A | +| `ortb2.app.storeurl` | N/A | +| `ortb2.device.lmt` | N/A | +| `ortb2.device.ifa` | N/A | +| `ortb2.device.ext.atts` | N/A | From 6715dcdf0b26066213d0ab2e3519002a8286fe9d Mon Sep 17 00:00:00 2001 From: Carlos Felix Date: Sun, 16 Jun 2024 04:39:38 -0500 Subject: [PATCH 025/816] 33Across User ID Module: Recommend "multiple storage types" option (#5345) * User ID: Add "multiple storage types" option * 33across UIM: Change recommended storage type --- dev-docs/modules/userid-submodules/33across.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/modules/userid-submodules/33across.md b/dev-docs/modules/userid-submodules/33across.md index 903bc2a9df..60542daac9 100644 --- a/dev-docs/modules/userid-submodules/33across.md +++ b/dev-docs/modules/userid-submodules/33across.md @@ -29,7 +29,7 @@ The following configuration parameters are available: | params.storeFpid | Optional | Boolean | Indicates whether a supplemental first-party ID may be stored to improve addressability | `false` (default) or `true` | | storage ||||| | storage.name | Required | String | The name of the cookie or html5 local storage key | `"33acrossId"` (recommended) | -| storage.type | Required | String | This is where the 33across user ID will be stored | `"html5"` (recommended) or `"cookie"` | +| storage.type | Required | String | This is where the 33across user ID will be stored | `"cookie&html5"` (recommended) or `"html5"` or `"cookie"` | | storage.expires | Strongly Recommended | Number | How long (in days) the user ID information will be stored | `30` (recommended) | | storage.refreshInSeconds | Strongly Recommended | Number | How many seconds until the ID is refreshed | `8 * 3600` (recommended) | @@ -46,7 +46,7 @@ pbjs.setConfig({ }, storage: { name: "33acrossId", - type: "html5", + type: "cookie&html5", expires: 30, refreshInSeconds: 8 * 3600 } From 993057b37de059826affa945258b867c4475c020 Mon Sep 17 00:00:00 2001 From: e-volution-tech <61746103+e-volution-tech@users.noreply.github.com> Date: Sun, 16 Jun 2024 12:40:44 +0300 Subject: [PATCH 026/816] e-Volution: Adapter update (#5343) * e-volution doc update * updates for Prebid v5 * add id5id * update adapter --------- Co-authored-by: bretg --- dev-docs/bidders/e_volution.md | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/dev-docs/bidders/e_volution.md b/dev-docs/bidders/e_volution.md index 5282e7589b..0d061f302c 100644 --- a/dev-docs/bidders/e_volution.md +++ b/dev-docs/bidders/e_volution.md @@ -2,16 +2,24 @@ layout: bidder title: E-volution tech description: Prebid E-volution tech Bidder Adapter -pbjs: true biddercode: e_volution +gpp_sids: usstate_all tcfeu_supported: true +usp_supported: true +coppa_supported: true +schain_supported: true +deals_supported: false +floors_supported: true +fpd_supported: false +ortb_blocking_supported: false media_types: banner, video, native gvl_id: 957 +multiformat_supported: will-bid-on-one +userIds: all +pbjs: true pbs: true pbs_app_supported: true -usp_supported: true -schain_supported: true -userIds: id5Id +safeframes_ok: true sidebarType: 1 --- From 973b1555116d5033e863269b8760c12657eef94e Mon Sep 17 00:00:00 2001 From: rishko00 <43280707+rishko00@users.noreply.github.com> Date: Sun, 16 Jun 2024 12:40:59 +0300 Subject: [PATCH 027/816] smartyads analytics doc (#5309) * smartyads analytics doc * smartyads analytics smallfix js format --------- Co-authored-by: vrishko Co-authored-by: Muki Seiler --- dev-docs/analytics/smartyads.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 dev-docs/analytics/smartyads.md diff --git a/dev-docs/analytics/smartyads.md b/dev-docs/analytics/smartyads.md new file mode 100644 index 0000000000..1d522cd655 --- /dev/null +++ b/dev-docs/analytics/smartyads.md @@ -0,0 +1,16 @@ +--- +layout: analytics +title: Smartyads +description: Smartyads Analytics Adapter +modulecode: smartyads +--- + +#### Example Configuration + +```javascript +pbjs.que.push(function () { + pbjs.enableAnalytics({ + provider: 'smartyads' + }); +}); +``` From e593428082cb14c0ab7495f5e44e51f2c7771bec Mon Sep 17 00:00:00 2001 From: Karim Mourra Date: Sun, 16 Jun 2024 06:41:50 -0300 Subject: [PATCH 028/816] updates docs for 9.0 api changes (#5393) --- dev-docs/modules/jwplayerRtdProvider.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/dev-docs/modules/jwplayerRtdProvider.md b/dev-docs/modules/jwplayerRtdProvider.md index dacdf35035..7b973cdbef 100644 --- a/dev-docs/modules/jwplayerRtdProvider.md +++ b/dev-docs/modules/jwplayerRtdProvider.md @@ -42,7 +42,11 @@ To use this module, you'll need to work with [JW Player](https://www.jwplayer.co name: "jwplayer", waitForIt: true, params: { - mediaIDs: ['abc', 'def', 'ghi', 'jkl'] + mediaIDs: ['abc', 'def', 'ghi', 'jkl'], + overrideContentId: 'always', + overrideContentUrl: 'always', + overrideContentTitle: 'always', + overrideContentDescription: 'always' } }] } @@ -65,7 +69,7 @@ To use this module, you'll need to work with [JW Player](https://www.jwplayer.co | waitForIt | Boolean | Required to ensure that the auction is delayed until prefetch is complete | Optional. Defaults to false | | params | Object | | | | params.mediaIDs | Array of Strings | Media Ids for prefetching | Optional | - | params.overrideContentId | String enum: 'always', 'whenEmpty' or 'never' | Determines when the module should update the oRTB site.content.id | Defaults to 'always' | + | params.overrideContentId | String enum: 'always', 'whenEmpty' or 'never' | Determines when the module should update the oRTB site.content.id | Defaults to 'whenEmpty' | | params.overrideContentUrl | String enum: 'always', 'whenEmpty' or 'never' | Determines when the module should update the oRTB site.content.url | Defaults to 'whenEmpty' | | params.overrideContentTitle | String enum: 'always', 'whenEmpty' or 'never' | Determines when the module should update the oRTB site.content.title | Defaults to 'whenEmpty' | | params.overrideContentDescription | String enum: 'always', 'whenEmpty' or 'never' | Determines when the module should update the oRTB site.content.ext.description | Defaults to 'whenEmpty' | @@ -182,6 +186,6 @@ To view an example: * in your browser, navigate to: -`http://localhost:9999/integrationExamples/gpt/jwplayerRtdProvider_example.html` +`http://localhost:9999/integrationExamples/realTimeData/jwplayerRtdProvider_example.html` **Note:** the mediaIds in the example are placeholder values; replace them with your existing IDs. From cca1910363212de2a0ec6063b20b0159ec32e447 Mon Sep 17 00:00:00 2001 From: vladi-mmg Date: Sun, 16 Jun 2024 12:42:04 +0300 Subject: [PATCH 029/816] Marsmeida: remove analytics adapter (#5389) --- dev-docs/analytics/marsmedia.md | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 dev-docs/analytics/marsmedia.md diff --git a/dev-docs/analytics/marsmedia.md b/dev-docs/analytics/marsmedia.md deleted file mode 100644 index c1ebc51008..0000000000 --- a/dev-docs/analytics/marsmedia.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -layout: analytics -title: MarsMedia -description: MarsMedia Analytics Adapter -modulecode: marsmedia ---- - -#### Registration - -Please visit [mars.media](https://mars.media/#!group) for more information. From 8c8d04946046fc4730407df927fb033c5f22ad95 Mon Sep 17 00:00:00 2001 From: mkomorski Date: Sun, 16 Jun 2024 11:42:29 +0200 Subject: [PATCH 030/816] Change default iframes config (#5379) * Change default iframes config * fixing dependency --------- Co-authored-by: Marcin Komorski Co-authored-by: bgorsline --- dev-docs/modules/topicsFpdModule.md | 33 +++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/dev-docs/modules/topicsFpdModule.md b/dev-docs/modules/topicsFpdModule.md index 30eff8b5e0..27346a3c01 100644 --- a/dev-docs/modules/topicsFpdModule.md +++ b/dev-docs/modules/topicsFpdModule.md @@ -55,15 +55,34 @@ pbjs.setConfig({ userSync: { // ..., topics: { - maxTopicCaller: 3, // SSP rotation + maxTopicCaller: 4, bidders: [{ bidder: 'pubmatic', - iframeURL: 'https://ads.pubmatic.com/AdServer/js/topics/topics_frame.html', - expiry: 7 // Configurable expiry days - },{ - bidder: 'appnexus', - iframeURL: 'https://appnexus.com:8080/topics/fpd/topic.html', // dummy URL - expiry: 7 // Configurable expiry days + iframeURL: 'https://ads.pubmatic.com/AdServer/js/topics/topics_frame.html' + }, { + bidder: 'rtbhouse', + iframeURL: 'https://topics.authorizedvault.com/topicsapi.html' + }, { + bidder: 'openx', + iframeURL: 'https://pa.openx.net/topics_frame.html' + }, { + bidder: 'improvedigital', + iframeURL: 'https://hb.360yield.com/privacy-sandbox/topics.html' + }, { + bidder: 'onetag', + iframeURL: 'https://onetag-sys.com/static/topicsapi.html' + }, { + bidder: 'taboola', + iframeURL: 'https://cdn.taboola.com/libtrc/static/topics/taboola-prebid-browsing-topics.html' + }, { + bidder: 'discovery', + iframeURL: 'https://api.popin.cc/topic/prebid-topics-frame.html' + }, { + bidder: 'undertone', + iframeURL: 'https://creative-p.undertone.com/spk-public/topics_frame.html' + }, { + bidder: 'vidazoo', + iframeURL: 'https://static.vidazoo.com/topics_api/topics_frame.html' }] } // ... From 91bf853afe1a0c2b64420e250ea7d83df9a2aa01 Mon Sep 17 00:00:00 2001 From: pm-nitin-shirsat <107102698+pm-nitin-shirsat@users.noreply.github.com> Date: Sun, 16 Jun 2024 15:12:41 +0530 Subject: [PATCH 031/816] Updated, PubMatic bidder doc for plcmt (#5373) --- dev-docs/bidders/pubmatic.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/pubmatic.md b/dev-docs/bidders/pubmatic.md index 26af4168e8..6f1ace23e7 100644 --- a/dev-docs/bidders/pubmatic.md +++ b/dev-docs/bidders/pubmatic.md @@ -98,6 +98,7 @@ The PubMatic adapter supports video as of Prebid v1.16.0 | `video.battr` | optional | Blocked creative attributes, See [OpenRTB 2.5 specification](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf), List 5.3 for values | `[3, 9]` | | `video.linearity` | optional | Indicates if the impression is linear or nonlinear
Values:
`1`: Linear/In-Stream
`2`: Non-Linear/Overlay. | `1` | | `video.placement` | optional | Video placement type. See [OpenRTB 2.5 specification](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf), List 5.9 for Values | `1` | +| `video.plcmt` | optional | Video placement type. See [OpenRTB 2.6 specification - github](https://github.com/InteractiveAdvertisingBureau/openrtb2.x/blob/develop/2.6.md#327---object-video-), For values [plcmt subtypes](https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/develop/AdCOM%20v1.0%20FINAL.md#list_plcmtsubtypesvideo) | `1` | | `video.minbitrate` | optional | Minumim bit rate in Kbps. | 50 | | `video.maxbitrate` | optional | Maximum bit rate in Kbps. | 70 | @@ -120,8 +121,9 @@ var videoAdUnits = [ api: [ 1, 2 ], // optional protocols: [ 2, 3 ], // optional battr: [ 13, 14 ], // optional - linearity: 1, // optional + linearity: 1, // optional placement: 2, // optional + plcmt: 1, // optional minbitrate: 10, // optional maxbitrate: 10 // optional } From 28bacb81a45a5d3e6b2ea5057d528783d03140d6 Mon Sep 17 00:00:00 2001 From: Chris Huie Date: Sun, 16 Jun 2024 03:42:49 -0600 Subject: [PATCH 032/816] Update and rename prebidmanager.md to AsteriobidPbm.md (#5363) * Update and rename prebidmanager.md to AsteriobidPbm.md * Update AsteriobidPbm.md * Update AsteriobidPbm.md --- dev-docs/analytics/{prebidmanager.md => AsteriobidPbm.md} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename dev-docs/analytics/{prebidmanager.md => AsteriobidPbm.md} (59%) diff --git a/dev-docs/analytics/prebidmanager.md b/dev-docs/analytics/AsteriobidPbm.md similarity index 59% rename from dev-docs/analytics/prebidmanager.md rename to dev-docs/analytics/AsteriobidPbm.md index 40f7936fd4..fa22aa4553 100644 --- a/dev-docs/analytics/prebidmanager.md +++ b/dev-docs/analytics/AsteriobidPbm.md @@ -1,8 +1,8 @@ --- layout: analytics -title: PrebidManager -description: PrebidManager Analytics Adapter -modulecode: prebidmanager +title: Asteriobid PBM +description: Asteriobid PBM Analytics Adapter +modulecode: asteriobidpbm --- #### Registration From 5a519200102994c87bdaf75d21347f2bbcf9484e Mon Sep 17 00:00:00 2001 From: Carlos Felix Date: Sun, 16 Jun 2024 04:43:03 -0500 Subject: [PATCH 033/816] 33Across User ID sub-module: Introduce a new supplemental ID (#5361) * 33x supplemental id for addressability * apply CR feedback, the options will default to true on a major release. --- dev-docs/modules/userid-submodules/33across.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dev-docs/modules/userid-submodules/33across.md b/dev-docs/modules/userid-submodules/33across.md index 60542daac9..d63c246e10 100644 --- a/dev-docs/modules/userid-submodules/33across.md +++ b/dev-docs/modules/userid-submodules/33across.md @@ -26,7 +26,8 @@ The following configuration parameters are available: | name | Required | String | The name of this sub-module | `"33acrossId"` | | params ||| Details for the sub-module initialization || | params.pid | Required | String | Partner ID (PID) | Please reach out to [PrebidUIM@33across.com](mailto:PrebidUIM@33across.com) and request your PID | -| params.storeFpid | Optional | Boolean | Indicates whether a supplemental first-party ID may be stored to improve addressability | `false` (default) or `true` | +| params.storeFpid | Optional | Boolean | Indicates whether a supplemental first-party ID may be stored to improve addressability | `true` (default) or `false` | +| params.storeTpid | Optional | Boolean | Indicates whether a supplemental third-party ID may be stored to improve addressability | `true` (default) or `false` | | storage ||||| | storage.name | Required | String | The name of the cookie or html5 local storage key | `"33acrossId"` (recommended) | | storage.type | Required | String | This is where the 33across user ID will be stored | `"cookie&html5"` (recommended) or `"html5"` or `"cookie"` | From 0eb943c1817bbb17e5fe2aebfd9984cbb5e562fe Mon Sep 17 00:00:00 2001 From: Deepthi Neeladri Date: Sun, 16 Jun 2024 15:13:10 +0530 Subject: [PATCH 034/816] Rename yahoosspBidAdapter to yahooAdsBidAdapter for Prebid 9 (#5329) * remove onevideo adapter details * rename * remove space * add 1 space --------- Co-authored-by: dsravana Co-authored-by: dsravana --- dev-docs/bidders/yahooAdvertising.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidders/yahooAdvertising.md b/dev-docs/bidders/yahooAdvertising.md index 219a7a4347..b5543dd165 100644 --- a/dev-docs/bidders/yahooAdvertising.md +++ b/dev-docs/bidders/yahooAdvertising.md @@ -5,7 +5,7 @@ description: Yahoo Advertising Bid Adapter pbs: true pbjs: true media_types: banner, video -filename: yahoosspBidAdapter +filename: yahooAdsBidAdapter biddercode: yahooAds prebid_member: true tcfeu_supported: true @@ -63,7 +63,7 @@ For new partners/publishers joining Yahoo Advertising and legacy "oneVideo" part ### Prebid.js Adapter Supported Features -For further setup details & examples please see +For further setup details & examples please see * Media Types: Banner & Video * Outstream renderer @@ -76,4 +76,3 @@ For further setup details & examples please see Date: Sun, 16 Jun 2024 12:46:24 +0300 Subject: [PATCH 035/816] Updated ImproveDigital bidder docs (#5137) --- dev-docs/bidders/improvedigital.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/improvedigital.md b/dev-docs/bidders/improvedigital.md index 0cc21342ff..893e98b235 100644 --- a/dev-docs/bidders/improvedigital.md +++ b/dev-docs/bidders/improvedigital.md @@ -39,11 +39,11 @@ 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: +By default, the adapter sends Prebid ad unit sizes to Improve Digital's ad server. If the ad server should only respond with creative sizes as defined for each placement in the Origin platform, turn off `usePrebidSizes` adapter parameter like this: ```javascript pbjs.setConfig({ - improvedigital: { usePrebidSizes: true } + improvedigital: { usePrebidSizes: false } }); ``` From 2166b046bca48be8199ebe439787026385678157 Mon Sep 17 00:00:00 2001 From: Sasha Date: Sun, 16 Jun 2024 12:48:34 +0300 Subject: [PATCH 036/816] Brightcom adapter: remove adapters (#5071) --- dev-docs/bidders/brightcom.md | 25 ------------------------- dev-docs/bidders/brightcomssp.md | 30 ------------------------------ 2 files changed, 55 deletions(-) delete mode 100644 dev-docs/bidders/brightcom.md delete mode 100644 dev-docs/bidders/brightcomssp.md diff --git a/dev-docs/bidders/brightcom.md b/dev-docs/bidders/brightcom.md deleted file mode 100644 index 2953aba6a7..0000000000 --- a/dev-docs/bidders/brightcom.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -layout: bidder -title: Brightcom -description: Prebid Brightcom Bidder Adaptor -top_nav_section: dev_docs -nav_section: reference -pbjs: true -biddercode: brightcom -gvl_id: 883 -tcfeu_supported: true -sidebarType: 1 ---- - -### Note - -The Brightcom bidder adapter requires setup and approval from the Brightcom team. Please reach out to your account manager for more information and to start using it. - -### Bid params - -{: .table .table-bordered .table-striped } - -| Name | Scope | Description | Example | Type | -| ---- | ----- | ----------- | ------- | ---- | -| `publisherId` | required | The publisher ID from Brightcom | `2141020` | `integer` | -| `bidFloor` | optional | The minimum bid value desired | `1.23` | `float` | diff --git a/dev-docs/bidders/brightcomssp.md b/dev-docs/bidders/brightcomssp.md deleted file mode 100644 index d78e661a67..0000000000 --- a/dev-docs/bidders/brightcomssp.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -layout: bidder -title: Brightcom SSP -description: Prebid Brightcom SSP Bidder Adaptor -top_nav_section: dev_docs -nav_section: reference -pbjs: true -biddercode: bcmssp -filename: brightcomSSPBidAdapter -tcfeu_supported: true -usp_supported: true -coppa_supported: true -schain_supported: true -sidebarType: 1 -gvl_id: 883 -floors_supported: true ---- - -### Note - -The Brightcom SSP bidder adapter requires setup and approval from the Brightcom team. Please reach out to your account manager for more information and to start using it. - -### Bid params - -{: .table .table-bordered .table-striped } - -| Name | Scope | Description | Example | Type | -| ---- | ----- | ----------- | ------- | ---- | -| `publisherId` | required | The publisher ID from Brightcom | `2141020` | `integer` | -| `bidFloor` | optional | The minimum bid value desired | `1.23` | `float` | From d11775ff0cd77964e17eb2782b474461f7f41519 Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Sun, 16 Jun 2024 02:50:59 -0700 Subject: [PATCH 037/816] Prebid 9: split dfpAdpod from dfpAdserverVideo (#5419) --- dev-docs/modules/dfpAdpod.md | 21 +++++++++++++++++++++ dev-docs/show-long-form-video-with-gam.md | 4 ++-- 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 dev-docs/modules/dfpAdpod.md diff --git a/dev-docs/modules/dfpAdpod.md b/dev-docs/modules/dfpAdpod.md new file mode 100644 index 0000000000..6904af0f8d --- /dev/null +++ b/dev-docs/modules/dfpAdpod.md @@ -0,0 +1,21 @@ +--- +layout: page_v2 +page_type: module +title: Module - Google Ad Manager Adpod Support +description: Required for serving adpod video through Google Ad Manager. +module_code : dfpAdpod +display_name : Google Ad Manager Adpod Support +enable_download : true +vendor_specific: true +sidebarType : 1 +--- + +# Google Ad Manager Adpod Support + +{:.no_toc} + +This module exposes the [`pbjs.adServers.dfp.buildAdpodVideoUrl](/dev-docs/publisher-api-reference/adServers.dfp.buildAdpodVideoUrl.html) method, required to use [adpod](/dev-docs/modules/adpod.md) with Google Ad Manager. + +## Further Reading + +- [Show long form video ads with GAM](/dev-docs/show-long-form-video-with-gam.html) diff --git a/dev-docs/show-long-form-video-with-gam.md b/dev-docs/show-long-form-video-with-gam.md index 7f9d4ef178..fd18bc87b7 100644 --- a/dev-docs/show-long-form-video-with-gam.md +++ b/dev-docs/show-long-form-video-with-gam.md @@ -175,7 +175,7 @@ For instructions on setting custom price buckets, view the [Custom Price Granula ### 5. Send request for bids and build video URL -The `dfpAdServerVideo` module provides a method, `buildAdpodVideoUrl`, that combines publisher-provided parameters with Prebid.js targeting key values to build a GAM video ad tag URL that can be used by a video player. +The `dfpAdpod` module provides a method, `buildAdpodVideoUrl`, that combines publisher-provided parameters with Prebid.js targeting key values to build a GAM video ad tag URL that can be used by a video player. In the example below the callback in the `bidsBackHandler` returns the video ad tag needed by the video player. @@ -196,7 +196,7 @@ pbjs.que.push(function(){ pbjs.requestBids({ bidsBackHandler: function(bids) { - pbjs.adServers.dfp. buildAdpodVideoUrl({ + pbjs.adServers.dfp.buildAdpodVideoUrl({ codes: ['sample-code'], params: { iu: '/123456/testing/prebid.org/adunit1', From 8b8641079892200d7622cab6b3d4ebe03c3f26d8 Mon Sep 17 00:00:00 2001 From: Nepomuk Seiler Date: Sun, 16 Jun 2024 11:58:31 +0200 Subject: [PATCH 038/816] Update ci workflow dependencies --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f72c668240..53536e800d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,15 +15,15 @@ jobs: name: run markdownlint runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: tj-actions/changed-files@v41 + - uses: tj-actions/changed-files@v44 id: changed-files with: files: '**/*.md' separator: "," - - uses: DavidAnson/markdownlint-cli2-action@v15 + - uses: DavidAnson/markdownlint-cli2-action@v16 if: steps.changed-files.outputs.any_changed == 'true' with: globs: "${{ steps.changed-files.outputs.all_changed_files }},!_includes" From cb8867ffd532427be61db1695eefee6ea2d013de Mon Sep 17 00:00:00 2001 From: jsnellbaker <31102355+jsnellbaker@users.noreply.github.com> Date: Sun, 16 Jun 2024 06:12:31 -0400 Subject: [PATCH 039/816] create module page for anPspParamsConverter module (#5423) * create module page for anPspParamsConverter module * fix linting error --------- Co-authored-by: Muki Seiler --- dev-docs/modules/anPspParamsConverter.md | 26 ++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 dev-docs/modules/anPspParamsConverter.md diff --git a/dev-docs/modules/anPspParamsConverter.md b/dev-docs/modules/anPspParamsConverter.md new file mode 100644 index 0000000000..f3c195aab5 --- /dev/null +++ b/dev-docs/modules/anPspParamsConverter.md @@ -0,0 +1,26 @@ +--- +layout: page_v2 +page_type: module +title: Module - anPspParamsConverter +description: Formats bid params for AppNexus PSP requests made through Prebid.js. +module_code : apPspParamsConverter +display_name : apPspParamsConverter +enable_download : true +sidebarType : 1 +--- + +# anPspParamsConverter Module + +{:.no_toc} + +This module is a temporary measure for publishers running Prebid.js 9.0+ and using the AppNexus PSP endpoint through their Prebid.js setup. Please ensure to include this module in your builds of Prebid.js 9.0+, otherwise requests to PSP may not complete successfully. + +## Module's Purpose + +This module replicates certain functionality that was previously stored in the appnexusBidAdapter.js file within a function named transformBidParams. + +This transformBidParams was a standard function in all adapters, which helped to change/modify the params and their values to a format that matched the bidder's request structure on the server-side endpoint. In Prebid.js 9.0, this standard function was removed in all adapter files, so that the whole client-side file (eg appnexusBidAdapter.js) wouldn't have to be included in a prebid.js build file that was meant for server-side bidders. + +## How to use the module as a publisher + +There is no setConfig setup needed for this module. Simply include this module in your Prebid.js build file if you plan to make requests to the AppNexus PSP endpoint through Prebid.js. From b23b472977e4165224ea97862915e2d2dbc67dfd Mon Sep 17 00:00:00 2001 From: Viktor Chernodub <37013688+chernodub@users.noreply.github.com> Date: Mon, 17 Jun 2024 12:14:32 +0300 Subject: [PATCH 040/816] Yandex ID System page (#5268) * feat: add yandex id system docs * fix: add yandex id to adapters table * fix: update docs on how to add user id module * fix: adjust list type * Add storage config --- dev-docs/modules/userId.md | 7 +++- dev-docs/modules/userid-submodules/yandex.md | 37 ++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 dev-docs/modules/userid-submodules/yandex.md diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md index 72539387a6..f18c943810 100644 --- a/dev-docs/modules/userId.md +++ b/dev-docs/modules/userId.md @@ -259,6 +259,7 @@ Bidders that want to support the User ID module in Prebid.js need to update thei | ConnectID | Yahoo | connectId | yahoo.com | {"connectId": "72d04af6..."} | | FreePass ID | FreePass | freepassId | | "1111" | | UtiqMtp ID | Utiq | utiqMtpId | utiq-mtp.com | "1111" | +| Yandex ID | Yandex | yandexId | yandex.com | "11111111111111111" | For example, the adapter code might do something like: @@ -344,7 +345,11 @@ If you're an ID provider that wants to get on this page: * Add your *IdSystem name into the modules/.submodules.json file * Follow all the guidelines in the [contribution page](https://github.com/prebid/Prebid.js/blob/master/CONTRIBUTING.md). * Submit a Pull Request against the [Prebid.js repository](https://github.com/prebid/Prebid.js). -* Fork the prebid.org [documentation repository](https://github.com/prebid/prebid.github.io), modify /dev-docs/modules/userId.md, /download.md, and submit a documentation Pull Request. +* Update the Prebid docs + * Fork the prebid.org [documentation repository](https://github.com/prebid/prebid.github.io) + * Add `/dev-docs/modules/userid-submodules/.md` + * Add a new row to `/dev-docs/modules/userId.md#prebidjs-adapters` + * Submit a documentation Pull Request diff --git a/dev-docs/modules/userid-submodules/yandex.md b/dev-docs/modules/userid-submodules/yandex.md new file mode 100644 index 0000000000..1b0f8bbbbc --- /dev/null +++ b/dev-docs/modules/userid-submodules/yandex.md @@ -0,0 +1,37 @@ +--- +layout: userid +title: Yandex ID +description: Yandex User ID sub-module +useridmodule: yandexIdSystem +--- + +Yandex ID module is designed to improve the personalization of ads for publishers' users. This documentation provides information about the Yandex User ID module, and instructions to install it. + +## Step 1. Add Yandex ID to Prebid.js package + +Add the module to your Prebid.js package: + +{: .alert.alert-info :} +gulp build --modules=yandexIdSystem + +## Step 2. Enable Yandex ID + +Include the following call to `setConfig` in your Prebid.js code: + +```javascript +pbjs.setConfig({ + userSync: { + userIds: [ + { + name: 'yandex', + bidders: ['yandex'], + storage: { + type: 'cookie', + name: '_ym_uid', + expires: 365, + }, + }, + ], + }, +}); +``` From 155cec0197176d896e2cf6ece5eb0a5c95cca300 Mon Sep 17 00:00:00 2001 From: Phaneendra Hegde Date: Mon, 17 Jun 2024 17:46:21 +0530 Subject: [PATCH 041/816] fixed the docs page where in was shown as an object but should be an array (#5427) Co-authored-by: NikhilX --- dev-docs/modules/pubxaiRtdProvider.md | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/dev-docs/modules/pubxaiRtdProvider.md b/dev-docs/modules/pubxaiRtdProvider.md index 26a0f84923..f94758a106 100644 --- a/dev-docs/modules/pubxaiRtdProvider.md +++ b/dev-docs/modules/pubxaiRtdProvider.md @@ -48,18 +48,20 @@ pbjs.setConfig({ ..., realTimeData: { auctionDelay: AUCTION_DELAY, - dataProviders: { - name: "pubxai", - waitForIt: true, - params: { - pubxId: ``, - endpoint: ``, // (optional) - floorMin: ``, // (optional) - enforcement: ``, // (optional) - data: `` // (optional) - } - } - } + dataProviders: [ + { + name: "pubxai", + waitForIt: true, + params: { + pubxId: ``, + endpoint: ``, // (optional) + floorMin: ``, // (optional) + enforcement: ``, // (optional) + data: `` // (optional) + }, + }, + ], + }, // rest of the config ..., }); From 9549bc4c99eeb3d5de03dd3f015ae48148cc2368 Mon Sep 17 00:00:00 2001 From: Chris Huie Date: Mon, 17 Jun 2024 07:29:10 -0600 Subject: [PATCH 042/816] Prebid 9.0 docs updates (#5428) * Update adbookpsp.md * Update bluebillywig * Update ebdr.md * Update eplanning.md * Update idWardRtdProvider.md * Update iqm.md * Update minutemediaplus.md * Update mytarget.md * Update parrable.md * Update richaudience.md * Update sigmoid.md * Update sonobi.md * Update sovrn.md * Update staq.md * Update spotx.md * fix iqm --- dev-docs/analytics/eplanning.md | 1 + dev-docs/analytics/sigmoid.md | 1 + dev-docs/analytics/sonobi.md | 1 + dev-docs/analytics/sovrn.md | 1 + dev-docs/analytics/staq.md | 1 + dev-docs/bidders/adbookpsp.md | 1 + dev-docs/bidders/bluebillywig.md | 1 + dev-docs/bidders/ebdr.md | 1 + dev-docs/bidders/iqm.md | 5 +++-- dev-docs/bidders/minutemediaplus.md | 1 + dev-docs/bidders/mytarget.md | 1 + dev-docs/bidders/richaudience.md | 1 + dev-docs/bidders/spotx.md | 1 + dev-docs/modules/idWardRtdProvider.md | 1 + dev-docs/modules/userid-submodules/parrable.md | 1 + 15 files changed, 17 insertions(+), 2 deletions(-) diff --git a/dev-docs/analytics/eplanning.md b/dev-docs/analytics/eplanning.md index 674a616eb5..70fc8a36b7 100644 --- a/dev-docs/analytics/eplanning.md +++ b/dev-docs/analytics/eplanning.md @@ -3,6 +3,7 @@ layout: analytics title: ePlanning description: ePlanning Analytics Adapter modulecode: eplanning +pbjs_version_notes: removed in 9.0 --- #### Registration diff --git a/dev-docs/analytics/sigmoid.md b/dev-docs/analytics/sigmoid.md index 33596e9fc4..cf4bc79a83 100644 --- a/dev-docs/analytics/sigmoid.md +++ b/dev-docs/analytics/sigmoid.md @@ -2,6 +2,7 @@ layout: analytics title: Sigmoid description: Sigmoid Analytics Adapter +pbjs_version_notes: removed in 9.0 modulecode: sigmoid --- diff --git a/dev-docs/analytics/sonobi.md b/dev-docs/analytics/sonobi.md index 3cf0340b71..c60b4f49de 100644 --- a/dev-docs/analytics/sonobi.md +++ b/dev-docs/analytics/sonobi.md @@ -3,6 +3,7 @@ layout: analytics title: Sonobi description: Sonobi Analytics Adapter modulecode: sonobi +pbjs_version_notes: removed in 9.0 enable_download: false --- diff --git a/dev-docs/analytics/sovrn.md b/dev-docs/analytics/sovrn.md index e9dea298b0..c68bdc5e39 100644 --- a/dev-docs/analytics/sovrn.md +++ b/dev-docs/analytics/sovrn.md @@ -4,6 +4,7 @@ title: Sovrn description: Sovrn Analytics Adapter modulecode: sovrn prebid_member: true +pbjs_version_notes: removed in 9.0 enable_download: false --- diff --git a/dev-docs/analytics/staq.md b/dev-docs/analytics/staq.md index d5e866f490..35ca122e06 100644 --- a/dev-docs/analytics/staq.md +++ b/dev-docs/analytics/staq.md @@ -2,6 +2,7 @@ layout: analytics title: STAQ description: STAQ Analytics Adapter +pbjs_version_notes: removed in 9.0 modulecode: staq --- diff --git a/dev-docs/bidders/adbookpsp.md b/dev-docs/bidders/adbookpsp.md index edef5f1ed2..3e601f64bf 100644 --- a/dev-docs/bidders/adbookpsp.md +++ b/dev-docs/bidders/adbookpsp.md @@ -11,6 +11,7 @@ coppa_supported: true usp_supported: true pbjs: true pbs: false +pbjs_version_notes: removed in 9.0 sidebarType: 1 --- diff --git a/dev-docs/bidders/bluebillywig.md b/dev-docs/bidders/bluebillywig.md index 33c8a43772..53ae1c57c0 100644 --- a/dev-docs/bidders/bluebillywig.md +++ b/dev-docs/bidders/bluebillywig.md @@ -11,6 +11,7 @@ schain_supported: true coppa_supported: true usp_supported: true userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId +pbjs_version_notes: removed in 9.0 sidebarType: 1 --- diff --git a/dev-docs/bidders/ebdr.md b/dev-docs/bidders/ebdr.md index 0fc6be4dd5..d1938b3aff 100644 --- a/dev-docs/bidders/ebdr.md +++ b/dev-docs/bidders/ebdr.md @@ -5,6 +5,7 @@ description: Prebid EngageBDR Bidder Adaptor biddercode: ebdr pbjs: true media_types: video +pbjs_version_notes: removed in 9.0 sidebarType: 1 --- diff --git a/dev-docs/bidders/iqm.md b/dev-docs/bidders/iqm.md index 31b546afcb..d27390b972 100644 --- a/dev-docs/bidders/iqm.md +++ b/dev-docs/bidders/iqm.md @@ -4,6 +4,7 @@ title: iQM description: Prebid iQM Bidder Adaptor pbjs: true biddercode: iqm +pbjs_version_notes: removed in 9.0 sidebarType: 1 --- @@ -23,7 +24,7 @@ Module that connects to iQM demand sources ## Test Parameters -``` +```javascript var adUnits = [{ code: 'div-gpt-ad-1460505748561-0', mediaTypes: { @@ -51,7 +52,7 @@ var adUnits = [{ ## adUnit Video -``` +```javascript var videoAdUnit = { code: 'video1', mediaTypes: { diff --git a/dev-docs/bidders/minutemediaplus.md b/dev-docs/bidders/minutemediaplus.md index 68f867d9de..b1d8ef2c0e 100644 --- a/dev-docs/bidders/minutemediaplus.md +++ b/dev-docs/bidders/minutemediaplus.md @@ -21,6 +21,7 @@ ortb_blocking_supported: false multiformat_supported: will-bid-on-one gvl_id: 918 pbjs: true +pbjs_version_notes: removed in 9.0 sidebarType: 1 --- diff --git a/dev-docs/bidders/mytarget.md b/dev-docs/bidders/mytarget.md index a10bf209fe..854ab029d5 100644 --- a/dev-docs/bidders/mytarget.md +++ b/dev-docs/bidders/mytarget.md @@ -4,6 +4,7 @@ title: myTarget description: Prebid myTarget Bidder Adapter pbjs: true biddercode: mytarget +pbjs_version_notes: removed in 9.0 sidebarType: 1 --- diff --git a/dev-docs/bidders/richaudience.md b/dev-docs/bidders/richaudience.md index f452b0d9a6..689cf7e680 100644 --- a/dev-docs/bidders/richaudience.md +++ b/dev-docs/bidders/richaudience.md @@ -13,6 +13,7 @@ pbjs: true pbs: true schain_supported: true floors_supported: true +pbjs_version_notes: removed in 9.0 sidebarType: 1 --- diff --git a/dev-docs/bidders/spotx.md b/dev-docs/bidders/spotx.md index 0c4fa8ce6b..9f9a9b91d9 100644 --- a/dev-docs/bidders/spotx.md +++ b/dev-docs/bidders/spotx.md @@ -13,6 +13,7 @@ safeframes_ok: false pbjs: true gvl_id: 165 floors_supported: true +pbjs_version_notes: removed in 9.0 sidebarType: 1 --- diff --git a/dev-docs/modules/idWardRtdProvider.md b/dev-docs/modules/idWardRtdProvider.md index 642ae36ddd..9f49220c3d 100644 --- a/dev-docs/modules/idWardRtdProvider.md +++ b/dev-docs/modules/idWardRtdProvider.md @@ -8,6 +8,7 @@ module_type: rtd module_code : idWardRtdProvider enable_download : false vendor_specific: true +pbjs_version_notes: removed in 9.0 sidebarType : 1 --- diff --git a/dev-docs/modules/userid-submodules/parrable.md b/dev-docs/modules/userid-submodules/parrable.md index f022af4c33..d8aa3be3ea 100644 --- a/dev-docs/modules/userid-submodules/parrable.md +++ b/dev-docs/modules/userid-submodules/parrable.md @@ -2,6 +2,7 @@ layout: userid title: Parrable ID description: Parrable ID User ID sub-module +pbjs_version_notes: removed in 9.0 useridmodule: parrableIdSystem --- From 7f6b81ef164ef23a00edbbae6a1cfcfc337d4108 Mon Sep 17 00:00:00 2001 From: Patrick McCann Date: Mon, 17 Jun 2024 09:29:43 -0400 Subject: [PATCH 043/816] Fix download issues pbjs 9: Update enrichmentFpdModule.md (#5429) * Update enrichmentFpdModule.md * Update enrichmentFpdModule.md --------- Co-authored-by: Chris Huie --- 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 d80b64570e..f5a17d9ff2 100644 --- a/dev-docs/modules/enrichmentFpdModule.md +++ b/dev-docs/modules/enrichmentFpdModule.md @@ -6,7 +6,8 @@ description: Injects additional data into the auction stream, including: dom module_code : enrichmentFpdModule display_name : First Party Data Enrichment enable_download : true -recommended: true +recommended: false +pbjs_version_notes: removed in 9.0 sidebarType : 1 --- @@ -15,7 +16,7 @@ sidebarType : 1 {:.no_toc} {: .alert.alert-warning :} -Since version 7.29, this module does nothing; its functionality is instead included by default in all Prebid distributions. +Since version 7.29, this module does nothing; its functionality is instead included by default in all Prebid distributions. Removed in 9.0. This module adds a number of First Party Data (FPD) fields from the environment. From 2e07287237e1d7843a1b8b6521040f6381b227a3 Mon Sep 17 00:00:00 2001 From: hasanideepak <80700939+hasanideepak@users.noreply.github.com> Date: Mon, 17 Jun 2024 19:08:03 +0530 Subject: [PATCH 044/816] RelevateHealth Bid Adapter - initial release (#5377) * added docs for relevatehealth bid adapter * removed blank lines * removed blank lines * added blank line at the end * changed placementId to placement_id * added changes suggested --- dev-docs/bidders/relevatehealth.md | 56 ++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 dev-docs/bidders/relevatehealth.md diff --git a/dev-docs/bidders/relevatehealth.md b/dev-docs/bidders/relevatehealth.md new file mode 100644 index 0000000000..5b9e80ab16 --- /dev/null +++ b/dev-docs/bidders/relevatehealth.md @@ -0,0 +1,56 @@ +--- +layout: bidder +title: RelevateHealth +description: Prebid RelevateHealth Bidder Adaptor +pbjs: true +biddercode: relevatehealth +media_types: banner +tcfeu_supported: false +usp_supported: true +coppa_supported: true +gpp_sids: usstate_all +schain_supported: false +safeframes_ok: false +ortb_blocking_supported: false +dsa_supported: false +deals_supported: true +floors_supported: true +sidebarType: 1 +--- + +### Bid Params + +| Name | Scope | Description | Example | Type | +|---------------|-----------|-----------------------|----------------|----------| +| `placement_id` | mandatory | Placement Id | `110011` | `number` | +| `user_id` | mandatory | Unique id for HCP | `'1111111'` | `string` | +| `height` | optional | Height of the creative| `600` | `number` | +| `width` | optional | Width of the creative | `160` | `number` | +| `domain` | optional | Domain | `'domain.com'` | `string` | +| `bid_floor` | optional | Bid Floor Price | `0.5` | `decimal`| + +### AdUnit Format for Banner + +```javascript +var adUnits = [ + { + code: 'banner-ad', + mediaTypes: { + banner: { + sizes: [[160, 600]] + } + }, + bids: [{ + bidder: 'relevatehealth', + params: { + placement_id: 110011, + user_id: '', + height: 600, + width: 160, + domain: '', + bid_floor: 0.5 + } + }] + } + ]; +``` From dac92fe7c8fc59ace9142290ba313ec1c4be3318 Mon Sep 17 00:00:00 2001 From: Patrick McCann Date: Mon, 17 Jun 2024 10:03:14 -0400 Subject: [PATCH 045/816] PBJS9: Update release-notes.md (#5422) * PBJS9: Update release-notes.md * Add files via upload * Delete dev-docs/pb9-notes.md.txt * Add files via upload * Fix linting --------- Co-authored-by: Muki Seiler Co-authored-by: Chris Huie --- dev-docs/pb9-notes.md | 35 +++++++++++++++++++++++++++++++++++ dev-docs/release-notes.md | 1 + 2 files changed, 36 insertions(+) create mode 100644 dev-docs/pb9-notes.md diff --git a/dev-docs/pb9-notes.md b/dev-docs/pb9-notes.md new file mode 100644 index 0000000000..860b0378bb --- /dev/null +++ b/dev-docs/pb9-notes.md @@ -0,0 +1,35 @@ +--- +layout: page_v2 +title: Prebid.js 9.0 Release Notes & Publisher API Changes +description: Description of the breaking changes included for Prebid.js 9.0 +sidebarType: 1 +--- + +# Prebid.js 9.0 Bidder Interface and Publisher API Changes + +{:.no_toc} + +This document describes the changes included for Prebid.js version 9.0. + +* TOC +{:toc} + +## Publisher Summary + +1. Be aware that a number of modules have been removed. See below for the list. +.... + +Details on all of these below. + +## Removed Modules + +The following modules have been removed from Prebid.js as part of the 9.0 release. Publishers building with one of them will need to point to its replacement or remove the module from their build. + +{: .table .table-bordered .table-striped } +| Module | Replacement | +|:-----------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| ... | ... | + +## Coming Soon + +Placeholder text while we work on the notes. For now see [https://github.com/prebid/Prebid.js/issues/11608](https://github.com/prebid/Prebid.js/issues/11608) diff --git a/dev-docs/release-notes.md b/dev-docs/release-notes.md index e85e26c54f..90b21a65c9 100644 --- a/dev-docs/release-notes.md +++ b/dev-docs/release-notes.md @@ -15,6 +15,7 @@ This page has links to release notes for each of the projects associated with Pr ## Prebid.js + [Release notes on GitHub](https://github.com/prebid/Prebid.js/releases) ++ [Prebid.js 9 Release Notes](/dev-docs/pb9-notes.html) + [Prebid.js 8 Release Notes](/dev-docs/pb8-notes.html) + [Prebid.js 7 Release Notes](/dev-docs/pb7-notes.html) + [Prebid.js 6 Blog Post](https://prebid.org/blog/prebid-6-0-release/) From 89a60a3f984ef56268742592f8a8eb0679de9a18 Mon Sep 17 00:00:00 2001 From: Patrick McCann Date: Mon, 17 Jun 2024 12:14:39 -0400 Subject: [PATCH 046/816] Update userId.md (#5431) --- dev-docs/modules/userId.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md index f18c943810..ff11f4b0e6 100644 --- a/dev-docs/modules/userId.md +++ b/dev-docs/modules/userId.md @@ -88,7 +88,7 @@ The table below has the options that are common across ID systems. See the secti | name | Required | String | May be any of the following values: {% for page in userid_pages -%}{% if count == 1 %}{{ name_string │ append: ", " -}}{% endif %}{% assign count = 1 %}`"{{ name_string │ append: name_string -}}{{ name_string │ append: page.useridmodule -}}"`{% endfor %} | `"unifiedId"` | | params | Based on User ID sub-module | Object | | | | bidders | Optional | Array of Strings | An array of bidder codes to which this user ID may be sent. | `['bidderA', 'bidderB']` | -| storage | Optional | Object | The publisher can specify some kind of local storage in which to store the results of the call to get the user ID. This can be cookie, HTML5 storage or both. This is not needed when `value` is specified or the ID system is managing its own storage | | +| storage | Optional | Object | The publisher can specify some kind of local storage in which to store the results of the call to get the user ID. This can be a cookie, HTML5 storage or both.| | | storage.type | Required | String | Must be `"cookie"`, `"html5"` or `"cookie&html5"`. This is where the results of the user ID will be stored. | `"cookie"` | | storage.name | Required | String | The name of the cookie or html5 local storage where the user ID will be stored. | `"_unifiedId"` | | storage.expires | Strongly Recommended | Integer | How long (in days) the user ID information will be stored. If this parameter isn't specified, session cookies are used in cookie-mode, and local storage mode will create new IDs on every page. | `365` | From e3747b265e44849bf2791ee03837e9dfdfaad830 Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Mon, 17 Jun 2024 10:02:23 -0700 Subject: [PATCH 047/816] Fix download page for Prebid 8 (#5434) --- assets/js/download.js | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/assets/js/download.js b/assets/js/download.js index 09197ae3e7..e5cc8f7538 100644 --- a/assets/js/download.js +++ b/assets/js/download.js @@ -8,7 +8,7 @@ // show all adapters $(".adapters .col-md-4").show(); setPrepickedModules(); - + document.getElementById('download-button').addEventListener('click', function (event) { event.preventDefault(); submit_download(); @@ -112,6 +112,23 @@ }); } + const renameModules = (function() { + const RENAMES = [ + [ + /^8\./, + { + tcfControl: 'gdprEnforcement', + consentManagementTcf: 'consentManagement', + paapiForGpt: 'fledgeForGpt' + } + ] + ]; + return function(version, modules) { + const renames = RENAMES.find(([pat]) => pat.test(version))?.[1] || {}; + return modules.map(mod => renames.hasOwnProperty(mod) ? renames[mod] : mod) + } + })(); + function get_form_data() { var modules = []; var version = $(".selectpicker").val(); @@ -138,7 +155,7 @@ }); return { - modules, + modules: renameModules(version, modules), version, removedModules, }; From 19c8965dcec717590d9641c3f74d4ca9ead1078c Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Mon, 17 Jun 2024 10:10:14 -0700 Subject: [PATCH 048/816] Fix zeta global biddercode (#5435) --- dev-docs/bidders/zeta_global.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/zeta_global.md b/dev-docs/bidders/zeta_global.md index d573119dd8..ef3c43d55f 100644 --- a/dev-docs/bidders/zeta_global.md +++ b/dev-docs/bidders/zeta_global.md @@ -3,7 +3,7 @@ layout: bidder title: Zeta Global description: Zeta Global Prebid Bidder Adapter pbjs: true -biddercode: zeta_global +biddercode: zeta deals_supported: false media_types: banner tcfeu_supported: true From 7f392b215cb816036af583ab882f6f1cba0b236b Mon Sep 17 00:00:00 2001 From: Muki Seiler Date: Mon, 17 Jun 2024 19:12:49 +0200 Subject: [PATCH 049/816] Update gpp documentation with new meta data field (#5425) --- dev-docs/modules/consentManagementGpp.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/modules/consentManagementGpp.md b/dev-docs/modules/consentManagementGpp.md index fc95d69784..9a99ac96ce 100644 --- a/dev-docs/modules/consentManagementGpp.md +++ b/dev-docs/modules/consentManagementGpp.md @@ -129,7 +129,7 @@ You can also use the [Prebid.js Download](/download.html) page. {: .alert.alert-info :} -If you are submitting changes to an adapter to support GPP, please also submit a PR to the [docs repo](https://github.com/prebid/prebid.github.io) to add the `gpp_supported: true` variable to your respective page in the [bidders directory](https://github.com/prebid/prebid.github.io/tree/master/dev-docs/bidders). **This will ensure that your adapter's name will automatically appear on the list of adapters supporting GPP.** +If you are submitting changes to an adapter to support GPP, please also submit a PR to the [docs repo](https://github.com/prebid/prebid.github.io) to add the `gpp_sids` meta data with a comma separated list of section names (`tcfeu`, `tcfca`, `usnat`, `usstate_all`, `usp`) to your respective page in the [bidders directory](https://github.com/prebid/prebid.github.io/tree/master/dev-docs/bidders). **This will ensure that your adapter's name will automatically appear on the list of adapters supporting GPP.** ### Bidder Adapter GPP Integration @@ -172,7 +172,7 @@ Depending on your needs, you could include the consent information in a query of ## Adapters Supporting GPP -Bidders on this list have self-declared their GPP support in their [github.com/prebid/prebid.github.io/tree/master/dev-docs/bidders] md file by adding "gpp_supported: true". +Bidders on this list have self-declared their GPP support in their [github.com/prebid/prebid.github.io/tree/master/dev-docs/bidders] md file by adding "gpp_sids: tcfeu, tcfca, usnat, usstate_all, usp". From 991be22f9d1298fe5be5d026240b3f90bc366795 Mon Sep 17 00:00:00 2001 From: Patrick McCann Date: Mon, 17 Jun 2024 14:14:45 -0400 Subject: [PATCH 050/816] Pb9 rel notes (#5432) * PBJS9: Update release-notes.md * Add files via upload * Delete dev-docs/pb9-notes.md.txt * Add files via upload * Fix linting * Update pb9-notes.md * Update pb9-notes.md * Update pb9-notes.md * Update pb9-notes.md * Update pb9-notes.md * Update pb9-notes.md * add word and sentence swap * Update pb9-notes.md * Update pb9-notes.md * Update pb9-notes.md * Update pb9-notes.md * Update pb9-notes.md * Update pb9-notes.md * Update pb9-notes.md * fix linting * remove extra line --------- Co-authored-by: Muki Seiler Co-authored-by: Chris Huie --- dev-docs/pb9-notes.md | 109 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 99 insertions(+), 10 deletions(-) diff --git a/dev-docs/pb9-notes.md b/dev-docs/pb9-notes.md index 860b0378bb..8d96f37cbe 100644 --- a/dev-docs/pb9-notes.md +++ b/dev-docs/pb9-notes.md @@ -14,13 +14,6 @@ This document describes the changes included for Prebid.js version 9.0. * TOC {:toc} -## Publisher Summary - -1. Be aware that a number of modules have been removed. See below for the list. -.... - -Details on all of these below. - ## Removed Modules The following modules have been removed from Prebid.js as part of the 9.0 release. Publishers building with one of them will need to point to its replacement or remove the module from their build. @@ -28,8 +21,104 @@ The following modules have been removed from Prebid.js as part of the 9.0 releas {: .table .table-bordered .table-striped } | Module | Replacement | |:-----------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| ... | ... | +| Brightcom | OMS Bid Adapter | +| Sovrn Analytics | | +| Empty FPD module file | | +| Adomik | | +| Britepool | | +| SpotX | | +| pirId | | +| Engage BDR | | +| MyTarget | | +| Parrable | | +| Blue BillyWig | | +| Idward RTD | Anonymized RTD | +| Minutemedia Plus | | +| eplanning Analytics | | +| mars media Analytics | | +| sigmoid Analytics | | +| sonobi Analytics | | +| staq Analytics | | +| RichAudience | (Temporary) | +| adbookpsp | | +| yahooSSP | yahooAds | +| GDPR Consent module | TCF Consent module | +| GDPR Enforcement module | TCF Control module | +| Bizzclick | Blasto | +| Utiq | UtiqId | +| Prebid Manager | AsterioBid Prebid Manager | +| Ras | RingierAxelSpringer | +| Fledge for GPT | PAAPI for GPT | +| DFP Video | Split into DFP Video and DFP AdPod | + +## Consent changes + +The USP string was removed from the consent metadata; also USP module is no longer in the recommended build. The GDPR modules were renamed to TCF modules, to reflect their adherence to a technical specification and not imply adherence to the underlying legislation and case law. Support for GPP 1.0 was removed from the GPP module. Of particular importance, "vendorless" modules such as the sharedid module no longer rely on vendor consent in the TCF object, but instead rely on publisher purpose consent. Publishers should check their __tcfapi consent data object to confirm publisher purpose consents are requested by their CMP. + +## Rendering + +This [creative](https://github.com/prebid/Prebid.js/blob/master/integrationExamples/gpt/x-domain/creative.html) is now the preferred creative choice for Google Ad Manager users for web. It is created as part of the build process. This [legacy implementation](https://github.com/prebid/Prebid.js/blob/8.52.0/integrationExamples/gpt/creative_rendering.html) was deleted and examples using the Prebid Universal Creative (PUC) in documentation are being ported over to [the new guidance](https://docs.prebid.org/adops/js-dynamic-creative.html). Publishers also using Prebid Mobile SDK creative for apps may wish to remain on the PUC for ease of operations. + +The legacy method of trafficking native creatives has also had a deprecation warning issued. Publishers should prefer the Ortb2 implementation as sendTargetingKeys for native, hb_native_ASSET, will no longer be supported in a coming version. + +## Video ORTB2 Objects + +The Ortb2 core adapter utility no longer infers placement from context. Context = 'instream' now only refers to the technical integration method the publisher is using to interact with the player and is not relevant to the ortb2 bid requests. Adapters should not infer placement nor plcmt is instream from this value. It is however reasonable to infer plcmt = 4 from context = outstream. Adapters are not permitted to only support placement and not plcmt; they are welcome to pass both. Publishers are advised to set plcmt on their video ad units explicitly to avoid downstream inferences causing buyer inventory quality enforcements. + +## PAAPI + +Any module described as Fledge is now PAAPI. PAAPI Configuration is simplified and publishers experimenting with Fledge in 8.x should refer to the module documentation for updates. + +Publishers wishing to support PAAPI should install the PAAPI module and select the submodule appropriate for their top level seller (TLS). Both gpt.js and publisher designated top level decision logic have submodules. Ad servers wishing to add support for top level selling in Prebid.js may choose to issue instructions compatible with the newly released publisher designated TLS or submit their own submodule. + +Bid adapters can now return either complete auction config or an `igb` object according to the Ortb community extension for PAAPI. Publishers wishing to be or to designate a component seller to handle the `igb` objects returned by some bid modules should configure PAAPI with, for example + +`pbjs.setConfig({ + paapi: { + enabled: true, + componentSeller: { + auctionConfig: { + decisionLogicURL: 'publisher.example' + // ... + } + } + } + })` + +PAAPI for GPT now supports custom slot configuration. Also, the autoConfig option has been removed and replaced with configWithTargeting, defaulting to true, which sets GPT targeting and submits auction configs together. It differs in the previous autoconfig in that it no longer relies on gpt being available at the time of requestBids, only at the time of setTargeting. + +Publishers should be aware this behavior may prohibit submission of auction configuration to GPT sooner than the Prebid.js auction has completed, and will likely prefer to use `setPAAPIConfigForGPT`. We're hoping a futute gpt.js release will enable submission of configuration including unresolved promises earlier than the completion of the Prebid auction, by providing an `allConfigsSubmitted` type utility. Prebid support for other top level sellers will include this functionality in the near future. + +## Miscellaneous configuration changes (publishers) + +Pbadslot has had a deprecation warning issued, it is redundant specifying with imp.ext.gpid. Publishers setting pbadslot explicitly will see a warning. In the future, the pre-auction module will not populate it and setting it in configuration will have no effect. + +We stopped supporting top level site, app, and device configuration directly, eg `setConfig({device: X})`. Please prefer the ortb2 object in configuration (or in requestBids), eg `setConfig({ortb2: {device: X}})` + +s2s tmax and userId module default timings were set to more reasonable defaults. + +The Topics module now requires publishers to choose which external topics gathering frames will be injected. Documentation lists many options. + +We now require node.js 20+ to build. Babel was upgraded; the build target was modernized. The test suite raised its browser version targets. + +transformBidParams was removed from the build so publishers would not need an adapter to use a bidder in prebid server. Appnexus adapter added the anPspParamsConverter module as a temporary measure to solve for their adapter. + +Private functions are no longer available to npm consumers. + +Some adapters changed their configuration, including JW Player RTD, Openweb, Yahoo Ads, Improve Digital and 33Across Id module. See [https://github.com/prebid/Prebid.js/issues/11608](https://github.com/prebid/Prebid.js/issues/11608). + +## Miscellaneous deprecation notices (module maintainers) + +Bidders should prefer the eids object in the bidrequest. The redundant userid object in bid requests will be removed in a future version. + +Userid submodules may no longer be able to access set methods in storage manager in the future. The parent userid module is capable of setting the value returned by the submodule according to publisher configuration. + +A variety of performance degrading functions may become unavailable to adapters. Some already have, including .innerText and .outerText. Bidders should generally rely on the request object to interrogate navigator, and if things are missing from the request object, we invite PRs on it as preferred over redundant module implementations. + +Some modules not using our methods, or using excessive payloads, for storage or network transmission were modified. + +Bidders may no longer import the events system. -## Coming Soon +getConfig is no longer allowed to gather consent, as it may be stale; use the consent object. -Placeholder text while we work on the notes. For now see [https://github.com/prebid/Prebid.js/issues/11608](https://github.com/prebid/Prebid.js/issues/11608) +Bidder companion scripts are now completely removed; only other module types may source js. From e76f1f8b8e4f9bde0fcebd5c7760579e20093bd7 Mon Sep 17 00:00:00 2001 From: Patrick McCann Date: Mon, 17 Jun 2024 14:16:56 -0400 Subject: [PATCH 051/816] Update consentManagementUsp.md (#5430) Remove recommended status --- dev-docs/modules/consentManagementUsp.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dev-docs/modules/consentManagementUsp.md b/dev-docs/modules/consentManagementUsp.md index 200e273aca..ca804d5646 100644 --- a/dev-docs/modules/consentManagementUsp.md +++ b/dev-docs/modules/consentManagementUsp.md @@ -6,7 +6,7 @@ description: If you have users in California, this module works with your Consen module_code : consentManagementUsp display_name : Consent Management - US Privacy enable_download : true -recommended: true +recommended: false sidebarType : 1 --- @@ -22,10 +22,10 @@ sidebarType : 1 This consent management module is designed to support the California Consumer Privacy Act ([CCPA](https://www.iab.com/guidelines/ccpa-framework/)). The IAB has generalized these guidelines to cover future regulations, referring to the feature as "US Privacy." -This module works with an IAB-compatible US Privacy API (USP-API) to fetch an encoded string representing the user's notice and opt-out choices and make it available for adapters to consume and process. In Prebid 7+; the module defaults to working with an IAB-compatible US Privacy API; in prior versions, the module had to be configured to be in effect. +This module works with an IAB-compatible US Privacy API (USP-API) to fetch an encoded string representing the user's notice and opt-out choices and make it available for adapters to consume and process. In Prebid 7+; the module defaults to working with an IAB-compatible US Privacy API; in prior versions, the module had to be configured to be in effect. This module is no longer recommended, as the signal is no longer supported by a contractual framework as of January 31, 2024. {: .alert.alert-info :} -See also the [Prebid Consent Management - GDPR Module](/dev-docs/modules/consentManagementTcf.html) for supporting the EU General Data Protection Regulation (GDPR) +See also the [Prebid Consent Management - TCF Module](/dev-docs/modules/consentManagementTcf.html) for supporting the IABTL Transparency and Consent Framework. Here's a summary of the interaction process: From f6bca8cab9d01bf9103fad4cf4801120862ab3bf Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Mon, 17 Jun 2024 13:00:41 -0700 Subject: [PATCH 052/816] remove enrichmentFpdModule.md (#5436) --- dev-docs/modules/enrichmentFpdModule.md | 81 ------------------------- 1 file changed, 81 deletions(-) delete mode 100644 dev-docs/modules/enrichmentFpdModule.md diff --git a/dev-docs/modules/enrichmentFpdModule.md b/dev-docs/modules/enrichmentFpdModule.md deleted file mode 100644 index f5a17d9ff2..0000000000 --- a/dev-docs/modules/enrichmentFpdModule.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -layout: page_v2 -page_type: module -title: Module - First Party Data Enrichment -description: Injects additional data into the auction stream, including: domain, keywords, and page url. -module_code : enrichmentFpdModule -display_name : First Party Data Enrichment -enable_download : true -recommended: false -pbjs_version_notes: removed in 9.0 -sidebarType : 1 ---- - -# First Party Data Enrichment Module - -{:.no_toc} - -{: .alert.alert-warning :} -Since version 7.29, this module does nothing; its functionality is instead included by default in all Prebid distributions. Removed in 9.0. - -This module adds a number of First Party Data (FPD) fields from the environment. - -Add it to the Prebid.js build with this command: - -```bash -gulp build --modules=enrichmentFpdModule -``` - -If included in the build, it will automatically perform the enrichments unless controlled with setConfig: - -```javascript -pbjs.setConfig({ - firstPartyData: { - skipEnrichments: true // defaults to false - } -}); -``` - -## How it works - -At the beginning of each auction, this module merges a number of values into the `ortb2` [requestBids parameter](/dev-docs/publisher-api-reference/requestBids.html). Specific details below. - -## Enrichments - -{: .table .table-bordered .table-striped } -| Page Source | ortb2 field | Notes | -|---+---+---| -| page URL | site.page | Uses pbjs getRefererInfo().page | -| referer URL | site.ref | Uses pbjs getRefererInfo().ref | -| host domain | site.domain | Pulled from the getRefererInfo().page the host domain is used with the www component dropped. | -| aggregated domain | site.publisher.domain | The highest level domain in which cookies can be set. | -| viewport width | device.w | Hunts for window.innerWidth, window.document.documentElement.clientWidth, window.document.body.clientWidth | -| viewport height | device.w | Hunts for window.innerHeight, window.document.documentElement.clientHeight, window.document.body.clientHeight | -| UA client hints | device.sua | Collects user agent client hints. See [note](#ua-hints) below. | -| meta keywords | site.keywords | Looks for a meta tag. e.g. | -| currency | cur | Collects the currency defined by the [Currency module](/dev-docs/modules/currency.html). | - - - -### User agent client hints - -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({ - firstPartyData: { - uaHints: [ - 'platform', - // ... - ] - } -}) -``` - -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) -- [First Party Data Validation Module](/dev-docs/modules/validationFpdModule) -- [OpenRTB 2.5](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf) From e29b831f286445bfee6f12aeb5e24fe5d92a19dd Mon Sep 17 00:00:00 2001 From: Patrick McCann Date: Tue, 18 Jun 2024 10:48:17 -0400 Subject: [PATCH 053/816] tncid doc (#5399) * tncid doc fixes #5368 * fix tncIdSystem * fix lint --------- Co-authored-by: Chris Huie --- .../modules/userid-submodules/tncIdSystem.md | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 dev-docs/modules/userid-submodules/tncIdSystem.md diff --git a/dev-docs/modules/userid-submodules/tncIdSystem.md b/dev-docs/modules/userid-submodules/tncIdSystem.md new file mode 100644 index 0000000000..6b82fd0250 --- /dev/null +++ b/dev-docs/modules/userid-submodules/tncIdSystem.md @@ -0,0 +1,36 @@ +# TNCID UserID Module + +## Prebid Configuration + +First, make sure to add the TNCID submodule to your Prebid.js package with: + +```bash +gulp build --modules=tncIdSystem,userId +``` + +## TNCIDIdSystem module Configuration + +Disclosure: This module loads external script unreviewed by the prebid.js community + +You can configure this submodule in your `userSync.userIds[]` configuration: + +```javascript +pbjs.setConfig({ + userSync: { + userIds: [{ + name: 'tncId', + params: { + url: 'https://js.tncid.app/remote.min.js' //Optional + } + }], + syncDelay: 5000 + } +}); +``` + +## Configuration Params + +| Param Name | Required | Type | Description | +| --- | --- | --- | --- | +| name | Required | String | ID value for the TNCID module: `"tncId"` | +| params.url | Optional | String | Provide TNC fallback script URL, this script is loaded if there is no TNC script on page | From c0e3fbf1f1994c89ee483f69acc5d51f289c127d Mon Sep 17 00:00:00 2001 From: Patrick McCann Date: Tue, 18 Jun 2024 13:39:57 -0400 Subject: [PATCH 054/816] Update pb9-notes.md (#5439) --- dev-docs/pb9-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/pb9-notes.md b/dev-docs/pb9-notes.md index 8d96f37cbe..39bf23619b 100644 --- a/dev-docs/pb9-notes.md +++ b/dev-docs/pb9-notes.md @@ -39,7 +39,7 @@ The following modules have been removed from Prebid.js as part of the 9.0 releas | sigmoid Analytics | | | sonobi Analytics | | | staq Analytics | | -| RichAudience | (Temporary) | +| RichAudience | Update: added to 9.1.0 | | adbookpsp | | | yahooSSP | yahooAds | | GDPR Consent module | TCF Consent module | From 5d43969240f85cee81493e698242b69938eec825 Mon Sep 17 00:00:00 2001 From: Maksim Kislyakov Date: Wed, 19 Jun 2024 16:50:59 +0300 Subject: [PATCH 055/816] Update docs for Vox adapter (#5433) * Update docs for Vox adapter: set `pbs` flag, add params for PrebidServer. * vox adapter: remove that somehow added comma --- dev-docs/bidders/vox.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/vox.md b/dev-docs/bidders/vox.md index b531bb3079..2d3e9904b3 100644 --- a/dev-docs/bidders/vox.md +++ b/dev-docs/bidders/vox.md @@ -6,6 +6,7 @@ schain_supported: true floors_supported: true userIds: all pbjs: true +pbs: true media_types: banner, video biddercode: vox tcfeu_supported: true @@ -26,6 +27,7 @@ Please reach out to your partners account team before using this plugin to get p | `placementId` | 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://example.com/images/image.jpg'` | `string` | +| `displaySizes` | optional, only supported by inImage format | An array of strings. Each string should be in `x` format (currently, this parameter is supported only by PrebidServer vox adapter) | `["123x90", "720x100"]` | `string[]` | ### Sample Banner Ad Unit @@ -54,7 +56,7 @@ var adUnits = [{ code: 'video_ad_unit', mediaTypes: { video: { - context: 'outstream', // required, possible values: instream, outstream + context: 'outstream', // required, possible values: instream, outstream playerSize: [[640, 480]] // required } }, From ad14699abf27da4eda13432bc2d8a943c4d8f153 Mon Sep 17 00:00:00 2001 From: Tetiana Volkova <126241934+tetianaatsmaato@users.noreply.github.com> Date: Wed, 19 Jun 2024 16:57:30 +0200 Subject: [PATCH 056/816] Update smaato.md to indicate DSA support (#5416) --- dev-docs/bidders/smaato.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/smaato.md b/dev-docs/bidders/smaato.md index f298759132..d553ecbd03 100644 --- a/dev-docs/bidders/smaato.md +++ b/dev-docs/bidders/smaato.md @@ -8,6 +8,7 @@ gvl_id: 82 usp_supported: true coppa_supported: true gpp_supported: true +dsa_supported: true media_types: banner, video, native userIds: all pbjs: true @@ -59,7 +60,7 @@ 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 +#### 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. From dbc95ff1b9164fd6c593cf1d62e7225830737d29 Mon Sep 17 00:00:00 2001 From: Rich Audience Date: Wed, 19 Jun 2024 20:22:06 +0200 Subject: [PATCH 057/816] Update richaudience.md (#5442) * Update richaudience.md * Update richaudience.md --- dev-docs/bidders/richaudience.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/richaudience.md b/dev-docs/bidders/richaudience.md index 689cf7e680..acb20c0fc5 100644 --- a/dev-docs/bidders/richaudience.md +++ b/dev-docs/bidders/richaudience.md @@ -7,13 +7,14 @@ userIds: criteo, id5Id, identityLink, liveIntentId, pubCommonId, unifiedId media_types: banner, video tcfeu_supported: true gvl_id: 108 +gpp_supported: true safeframes_ok: false prebid_member: true pbjs: true pbs: true schain_supported: true floors_supported: true -pbjs_version_notes: removed in 9.0 +pbjs_version_notes: Please use version 9.1; version 9.0 does not support our adapter. sidebarType: 1 --- From d59277d3f1b2631fe473f0dadfbaa629c2ab1531 Mon Sep 17 00:00:00 2001 From: Bernhard Bohne Date: Thu, 20 Jun 2024 19:59:33 +0200 Subject: [PATCH 058/816] Update publisherId parameter (#5443) Co-authored-by: Bernhard Bohne --- dev-docs/bidders/smaato.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/smaato.md b/dev-docs/bidders/smaato.md index d553ecbd03..56227993bf 100644 --- a/dev-docs/bidders/smaato.md +++ b/dev-docs/bidders/smaato.md @@ -275,7 +275,7 @@ Following example includes sample `imp` object with publisherId and adSlot which }, "ext":{ "smaato":{ - "publisherId":"100042525", + "publisherId":"1100042525", "adspaceId":"130563103" } } From 5d154aba06f32e492b1b651fc294553e092a30fb Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 20 Jun 2024 17:46:51 -0400 Subject: [PATCH 059/816] Refine MSPA wording (#5447) * ras rename * refining references to MSPA * lint * lint --- _data/sidebar.yml | 2 +- dev-docs/bidders/ringieraxelspringer.md | 2 -- dev-docs/modules/gppControl_usnat.md | 4 +-- dev-docs/modules/gppControl_usstates.md | 4 +-- features/mspa-usnat.md | 33 +++++++++++---------- prebid-server/developers/add-a-module.md | 8 ++--- prebid-server/features/pbs-privacy.md | 6 ++-- prebid-server/features/pbs-uscustomlogic.md | 8 ++--- prebid-server/features/pbs-usgen.md | 10 +++---- support/privacy-resources.md | 6 ++-- 10 files changed, 42 insertions(+), 41 deletions(-) diff --git a/_data/sidebar.yml b/_data/sidebar.yml index 892a9936d1..bf4ac50cb7 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -1801,7 +1801,7 @@ subgroup: 1 - sbSecId: 7 - title: Prebid and MSPA + title: Prebid US Compliance link: /features/mspa-usnat.html isHeader: 0 isSectionHeader: 0 diff --git a/dev-docs/bidders/ringieraxelspringer.md b/dev-docs/bidders/ringieraxelspringer.md index 38c2aad56c..abb1af0f09 100644 --- a/dev-docs/bidders/ringieraxelspringer.md +++ b/dev-docs/bidders/ringieraxelspringer.md @@ -25,8 +25,6 @@ coppa_supported: false usp_supported: false --- - - ### Bid Params {: .table .table-bordered .table-striped } diff --git a/dev-docs/modules/gppControl_usnat.md b/dev-docs/modules/gppControl_usnat.md index b9de3e0585..b250ae618b 100644 --- a/dev-docs/modules/gppControl_usnat.md +++ b/dev-docs/modules/gppControl_usnat.md @@ -21,7 +21,7 @@ sidebarType : 1 ## Overview -This consent management control module is designed to support the [Global Privacy Platform](https://iabtechlab.com/gpp/) Section 7 string, USNat. For more Prebid-related background, see [Prebid MSPA Support](/features/mspa-usnat.html). In sum, the USNat string is intended to unify various state laws into a single privacy string, with participants' behavior governed by the IAB's ([MSPA](https://www.iabprivacy.com/#)). It is intended to complement, not replace, the GPP consent management module, which gathers GPP consent strings and makes them available to vendor integrations. The goal is to gather sensible and conservative [activity controls](/dev-docs/activity-controls.html) for elements of Prebid.js given various expressions of the [USNat consent string](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/US-National/IAB%20Privacy%E2%80%99s%20National%20Privacy%20Technical%20Specification.md). +This consent management control module is designed to support the [Global Privacy Platform](https://iabtechlab.com/gpp/) Section 7 string, USNat. For more Prebid-related background, see [Prebid US Compliance Support](/features/mspa-usnat.html). In sum, the USNat string is intended to unify various state laws into a single privacy string, with participants' behavior governed by the IAB's ([MSPA](https://www.iabprivacy.com/#)). It is intended to complement, not replace, the GPP consent management module, which gathers GPP consent strings and makes them available to vendor integrations. The goal is to gather sensible and conservative [activity controls](/dev-docs/activity-controls.html) for elements of Prebid.js given various expressions of the [USNat consent string](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/US-National/IAB%20Privacy%E2%80%99s%20National%20Privacy%20Technical%20Specification.md). This module does not support any other GPP section id or local GPP api. For US state section see the [GPP Control - US State module](/dev-docs/modules/gppControl_usstates.html). In order to control activities in a section without a control module, publishers can express their controls directly in the syntax of the [activity control infrastructure](/dev-docs/activity-controls.html). If a publisher wants finer control over section 7 implications on Prebid.js behavior than this module provides (eg not invalidating certain strings), they are able to achieve that using the activity control syntax as an alternative to this module. @@ -47,7 +47,7 @@ You can also use the [Prebid.js Download](/download.html) page. - [IAB Global Privacy Platform Full Specification Repository](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform) - [IAB Global Privacy Platform CMP API Specification](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Core/CMP%20API%20Specification.md) - [IAB Global Privacy Platform USNat string Specification](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/US-National/IAB%20Privacy%E2%80%99s%20National%20Privacy%20Technical%20Specification.md) -- [Prebid MSPA Support](/features/mspa-usnat.html) +- [Prebid US Compliance Support](/features/mspa-usnat.html) - [Prebid Activity Controls](/dev-docs/activity-controls.html) - [Prebid Consent Management - US Privacy Module](/dev-docs/modules/consentManagementUsp.html) - [Prebid Consent Management - GPP Module](/dev-docs/modules/consentManagementGpp.html) diff --git a/dev-docs/modules/gppControl_usstates.md b/dev-docs/modules/gppControl_usstates.md index e82ba32b91..502fe1845b 100644 --- a/dev-docs/modules/gppControl_usstates.md +++ b/dev-docs/modules/gppControl_usstates.md @@ -22,7 +22,7 @@ sidebarType : 1 ## Overview This consent management control module is designed to support the [Global Privacy Platform](https://iabtechlab.com/gpp/) US state strings, [GPP sections](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/Section%20Information.md) 8 through 12. -It works by translating them into an equivalent US national string as detailed in [Interpreting USNat strings](/features/mspa-usnat.html#interpreting-usnat-strings), and using it to apply the same [activity restricitons](/features/mspa-usnat.html#usnat-activity-restrictions). +It works by translating them into an equivalent US national string as detailed in [Interpreting USNat strings](/features/mspa-usnat.html#interpreting-usnat-strings), and using it to apply the same [activity restrictions](/features/mspa-usnat.html#usnat-activity-restrictions). {: .alert.alert-warning :} Prebid functionality created to address regulatory requirements does not replace each party's responsibility to determine its own legal obligations and comply with all applicable laws. **We recommend consulting with your legal counsel before determining how to utilize these features in support of your overall privacy approach. This module is not intended to replace other consent modules; it supplements them.** @@ -118,7 +118,7 @@ You can also use the [Prebid.js Download](/download.html) page. - [IAB Global Privacy Platform Full Specification Repository](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform) - [IAB Global Privacy Platform CMP API Specification](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Core/CMP%20API%20Specification.md) - [IAB Global Privacy Platform USNat string Specification](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/US-National/IAB%20Privacy%E2%80%99s%20National%20Privacy%20Technical%20Specification.md) -- [Prebid MSPA Support](/features/mspa-usnat.html) +- [Prebid US Compliance Support](/features/mspa-usnat.html) - [Prebid Activity Controls](/dev-docs/activity-controls.html) - [Prebid Consent Management - US Privacy Module](/dev-docs/modules/consentManagementUsp.html) - [Prebid Consent Management - GPP Module](/dev-docs/modules/consentManagementGpp.html) diff --git a/features/mspa-usnat.md b/features/mspa-usnat.md index f488fd3a06..635783088d 100644 --- a/features/mspa-usnat.md +++ b/features/mspa-usnat.md @@ -1,11 +1,11 @@ --- layout: page_v2 -title: Prebid MSPA Support -description: Prebid MSPA Support +title: Prebid US Compliance Support +description: Prebid US Compliance Support sidebarType: 7 --- -# Prebid Multi-State Privacy Agreement Support +# Prebid US Compliance Support {: .no_toc} - TOC @@ -17,24 +17,27 @@ sidebarType: 7 Starting July 1st 2023, several US states started enforcing new privacy regulations. -The IAB released the "Multi-State Privacy Agreement" (MSPA) as its proposal for how the advertising ecosystem can support these and future US State regulations. References: +As a result, the IAB released the "Multi-State Privacy Agreement" (MSPA), the Global Privacy Protocol (GPP), and several "sections" of the GPP dedicated to these US states. References: - [IAB's MSPA](https://www.iab.com/news/multi-state-privacy-agreement-mspa/) - IAB Guidance on the [MSPA Decision Tree](https://www.iab.com/wp-content/uploads/2022/12/IAB_MSPA_Decision_Tree.pdf) - IAB's [US National technical protocols](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/tree/main/Sections) +Prebid refers to GPP Sections 7-12 as "US Compliance", which is distinct from the original [US Privacy](https://github.com/InteractiveAdvertisingBureau/USPrivacy/blob/master/CCPA/US%20Privacy%20String.md) approach which has been deprecated. + ### Glossary 1. **Global Privacy Platform (GPP)** - A technical IAB framework that defines a container format for communicating multiple privacy protocols. e.g. GPP can contain existing Transparency and Consent Framework (TCF) strings, various US privacy string formats, and other future implementations. 1. **GPP Section ID (SID)** - the GPP container may contain multiple encoded privacy protocol strings. Each protocol gets its own SID in the overall GPP container. e.g. TCF-EU is assigned SID 2. -1. **Multi-State Privacy Agreement (MSPA)** - the IAB's contractual framework for publishers to manage various US state privacy laws. +1. **Multi-State Privacy Agreement (MSPA)** - the IAB's contractual framework for publishers to manage various US state privacy laws. Note that there are high profile companies in the industry that have not signed the MSPA, but are still able to process the IAB's technical protocol to consider user preferences. 1. **MSPA Covered Transaction** - Whether a given ad auction falls legally under the MSPA's privacy requirements. For MSPA-covered 'transactions' (ad auctions), publishers must declare themselves in one of two modes: "Service Provider Mode" or "Opt-Out Mode". 1. **MSPA Service Provider Mode** - "Service Provider Mode is for First Parties who do not Sell or Share Personal Information, and do not Process Personal Information for Targeted Advertising". This means that personal information is never sent to downstream entities. 1. **MSPA Opt-Out Mode** - For First Parties that may engage in targeted advertising activities or disclose personal information for such purposes. This means that user consent is gathered before privacy-sensitive data is sent to downstream entities. 1. **US National Privacy Technical Specification (USNat)** - the IAB's technical framework for encoding MSPA publisher policies and user consents. Stored in the GPP container as SID 7. 1. **US State Privacy Technical Specifications** - the IAB has defined technical frameworks for 5 states based on their interpretation of state privacy laws. These protocols are similar to the US National protocol and are stored in the GPP container as SIDs 8 through 12. +1. **US Compliance** - the term Prebid uses to encompass both US National Privacy Technical Specification and the US State Privacy Technical Specifications. 1. **Global Privacy Control (GPC)** - a browser-level control for end users. Some US states have referred to a global control so that users don't have to state their preferences on each website they visit. The USNat protocol strings also contain the GPC flag. -1. **US Privacy** - this is the IAB's original version of a US privacy protocol, meant to address CCPA only. It's active during a transition period until September 30, 2023. +1. **US Privacy** - this is the IAB's original, now deprecated, version of a US privacy protocol, meant to address older California laws. 1. **Prebid Activity Controls** - Prebid.js and Prebid Server have identified a set of behaviors for activities that may be in scope for privacy concerns such as transmitting user IDs. These activities may be allowed or suppressed with flexible conditions and exceptions as defined by the publisher. - [Prebid.js Activity Controls](/dev-docs/activity-controls.html) were released with PBJS 7.52 - [Prebid Server Activity Controls](/prebid-server/features/pbs-activitycontrols.html) were released with PBS-Java 1.118 @@ -50,29 +53,29 @@ Prebid's assumptions about the MSPA and the US National Privacy specification: 1. For requests that are in-scope for SIDs 7 through 12 that are not "covered" by MSPA, Prebid treats them as being in "Opt-Out Mode". This implies that CMPs have prompted users for consent and encoded the results in the relevant section of the GPP container. 1. Prebid never changes the GPP string. This means that all downstream vendors will see whatever the CMP set. 1. Prebid has implemented a default way to interpret the US National string (SID 7) in the context of each Prebid Activity. -1. US state privacy rules do not mandate the cancellation of contextual advertising, but rather are focused on protecting user privacy. Therefore, Prebid's MSPA module may anonymize different aspects of a header bidding auction, but will never outright cancel an auction. +1. US state privacy rules do not mandate the cancellation of contextual advertising, but rather are focused on protecting user privacy. Therefore, Prebid's US compliance modules may anonymize different aspects of a header bidding auction, but will never outright cancel an auction. 1. There are differences in the US state-level protocols and the US National protocol as defined by the IAB. (e.g. child consent for targeted advertising is somewhat different across SIDs 7 through 12.) 1. Rather than implementing several very similar modules and forcing publishers to include separate modules for each US state, Prebid handles state differences through a normalization process. The differences for each state are mapped onto the US National (SID 7) string, and that string is interpreted for which activities are allowed or suppressed. As with the rest of Prebid’s approach, this is a default intended to ease publishers’ ability to comply with the state laws, but publishers should make their own determinations about state law obligations and consult legal counsel to ensure that they feel comfortable that this approach allows them to meet their legal obligations. 1. Publishers that do not agree with Prebid's default behavior may override the behavior. This includes the interpretation of the USNat string as well as the normalization of state protocols. 1. The Global Privacy Control (GPC) flag is interpreted as a strong user signal that ad requests should be anonymized. 1. There's no need to support a data-deletion activity for MSPA. -1. Prebid doesn't need to explicitly support mapping US National Privacy SID 6 (legacy US Privacy) for anonymization activities. This is covered by a feature on Prebid Server where SID 6 is pulled out into regs.us_privacy and is covered by documentation in Prebid.js. +1. Prebid doesn't need to explicitly support mapping GPP SID 6 (legacy US Privacy) for anonymization activities. This is covered by a feature on Prebid Server where SID 6 is pulled out into regs.us_privacy and is covered by documentation in Prebid.js. -## USNat Support in Prebid Products +## US Compliance Support in Prebid Products ### Prebid.js Here's a summary of the privacy features in Prebid.js that publishers may use to align with the guidance of their legal counsel: {: .table .table-bordered .table-striped } -| Prebid.js Version | USNat-Related Features | Notes | +| Prebid.js Version | US Compliance-Related Features | Notes | | ----------------- | ---------------------- | ----- | | before 7.30 | None | If you operate in the US, you should consider upgrading. | -| 7.30-7.51 | **GPP module** | The [GPP module](/dev-docs/modules/consentManagementGpp.html) reads the GPP string from a compliant CMP and passes to compliant bid adapters. Not many bid adapters supported GPP in earlier versions. | -| 7.52-8.1 | GPP module
**Activity Controls** | [Activity Controls](/dev-docs/activity-controls.html) provide the ability for publishers to allow or restrict certain privacy-sensitive activities for particular bidders and modules. See examples in that document for supporting CCPA directly. | -| 8.2-8.x | GPP module
Activity Controls
**USNat module** | The [USNat module](/dev-docs/modules/gppControl_usnat.html) processes SID 7. | -| After 8.x | GPP module
Activity Controls
USNat module
**US State module** | The US State module processes SIDs 8 through 12 after normalizing protocol differences. | -| After 8.10 | **GPP Module** | The [GPP module](/dev-docs/modules/consentManagementGpp.html) now understands GPP 1.1 which makes it incompatible with GPP 1.0. Publishers **MUST** upgrade for continued GPP support. | +| 7.30-7.51 | **Consent Mgmt GPP module** | The [GPP module](/dev-docs/modules/consentManagementGpp.html) reads the GPP string from a compliant CMP and passes to compliant bid adapters. Not many bid adapters supported GPP in earlier versions. | +| 7.52-8.1 | Consent Mgmt GPP module
**Activity Controls** | [Activity Controls](/dev-docs/activity-controls.html) provide the ability for publishers to allow or restrict certain privacy-sensitive activities for particular bidders and modules. See examples in that document for supporting CCPA directly. | +| 8.2-8.9 | Consent Mgmt GPP module
Activity Controls
**GPP USNat module** | The [GPP USNat module](/dev-docs/modules/gppControl_usnat.html) processes SID 7. | +| 8.10+ | Consent Mgmt GPP module
Activity Controls
USNat module
**GPP US State module** | The [GPP US State module](/dev-docs/modules/gppControl_usstates.html) processes SIDs 8 through 12 after normalizing protocol differences. | +| 8.10+ | **Consent Mgmt GPP module** | The [GPP module](/dev-docs/modules/consentManagementGpp.html) now understands GPP 1.1 which makes it incompatible with GPP 1.0. Publishers **MUST** upgrade for continued GPP support. | ### Prebid Server diff --git a/prebid-server/developers/add-a-module.md b/prebid-server/developers/add-a-module.md index c6263e096b..010e7cbc2d 100644 --- a/prebid-server/developers/add-a-module.md +++ b/prebid-server/developers/add-a-module.md @@ -2,7 +2,6 @@ layout: page_v2 sidebarType: 5 title: Prebid Server | Developers | Adding a Module - --- # Prebid Server - Adding a Module @@ -11,7 +10,7 @@ title: Prebid Server | Developers | Adding a Module This document guides you through the process of developing a module for host companies to plug into their instance of Prebid Server. We encourage you to look at existing modules for working examples. You can also ask us questions by [submitting a GitHub issue](https://github.com/prebid/prebid-server/issues/new). -* TOC +- TOC {:toc } ## Overview @@ -142,6 +141,7 @@ to the PBS host company. Examples: 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. @@ -173,7 +173,7 @@ The details of the implementation depend on the platform. 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 +- A maintainer email address must be provided and be a group, not an individual. e.g. rather than ### 10. Write the Module Documentation @@ -184,7 +184,7 @@ create a file in /prebid-server/pbs-modules. You can start by copying one of the - Prerequisites: any necessary account activation, other required modules, etc. - Configuration: both init and runtime - Analytics Tag support -- Privacy Support: disclose whether the module has user privacy implications and support for TCF-EU, TCF-CA, CCPA, MSPA, etc. +- Privacy Support: disclose whether the module has user privacy implications and support for TCF-EU, TCF-CA, CCPA, etc. ### 11. Submit the Pull Requests diff --git a/prebid-server/features/pbs-privacy.md b/prebid-server/features/pbs-privacy.md index 727aa94259..bb37c88742 100644 --- a/prebid-server/features/pbs-privacy.md +++ b/prebid-server/features/pbs-privacy.md @@ -127,14 +127,14 @@ Prebid Server support for this protocol: 1. GPP as a TCF and USP wrapper - PBS parses the GPP container for TCF2 and USP strings, extracting them to the original ORTB location. 1. (done for PBS-Java) GPP infrastructure - the ability to plug new regulations into PBS, and the first sub-module, the [US General Privacy Module](/prebid-server/features/pbs-usgen.html). -## MSPA / US National Privacy +## US Compliance -See [Prebid MSPA Support](/features/mspa-usnat.html) for more info. +See [Prebid US Compliance Support](/features/mspa-usnat.html) for more info. There are two modules offered by Prebid Server to process GPP string sections 7-12: 1. The [USGen Privacy Module](/prebid-server/features/pbs-usgen.html) is a high -performance option for interpreting the GPP strings as described in the [Prebid MSPA reference](/features/mspa-usnat.html). (PBS-Java only) +performance option for interpreting the GPP strings as described in the [Prebid US Compliance reference](/features/mspa-usnat.html). (PBS-Java only) 1. The [US Custom Logic Privacy Module](/prebid-server/features/pbs-uscustomlogic.html) is a flexible way for publishers to define their own interpretation of GPP string sections 7-12. Also note that publishers can consider utilizing [Activity Controls](/prebid-server/features/pbs-activitycontrols.html). For PBS-Java, the `gppSid`, `geo`, and `gpc` conditions may be useful tools within a compliance strategy. diff --git a/prebid-server/features/pbs-uscustomlogic.md b/prebid-server/features/pbs-uscustomlogic.md index 3006aa681f..4379a2b05d 100644 --- a/prebid-server/features/pbs-uscustomlogic.md +++ b/prebid-server/features/pbs-uscustomlogic.md @@ -19,7 +19,7 @@ This feature is currently only available in PBS-Java. This module provides a way for publishers to define a custom interpretion for GPP strings in Sections 7-12. If the publisher is satisfied with Prebid's interpretation of GPP SIDs 7-12 as defined in -[Prebid Multi-State Privacy Agreement Support](/features/mspa-usnat.html), it's recommended +[Prebid US Compliance Support](/features/mspa-usnat.html), it's recommended that they utilze the [US Gen Privacy Module](/prebid-server/features/pbs-usgen.html) instead of this one. This module lets publishers define GPP string interpretation with a powerful general syntax @@ -78,7 +78,7 @@ Here are the parameters allowed in the module's `config` section. See below for | Parameter | Type | Scope | Description | |------|------|-------------| | sids | array of integer | required | Process only the named section IDs. | -| normalizeFlags | boolean | optional | Convert the state SIDs 8-12 into SID 7 fields as described in the [Prebid MSPA reference](/features/mspa-usnat.html). Defaults to `true`. | +| normalizeFlags | boolean | optional | Convert the state SIDs 8-12 into SID 7 fields as described in [Prebid US Compliance Support](/features/mspa-usnat.html). Defaults to `true`. | | activityConfig | array of objects | required | Defines what processing to do. | | activityConfig[].activities | array of strings | required | Defines which activity or activities are in scope for this array entry. | | activityConfig[].restrictIfTrue | object | required | [JsonLogic](https://jsonlogic.com) rules object. | @@ -272,7 +272,7 @@ Here's how the module works when called by an Activity Control: 1. If the SID is < 7 or > 12, go on to the next SID 1. Else if the SID is not on the sids list, go on to the next SID 1. Else pull that section of out the GPP string and process it - 1. If the normalizeFlags option is true and the SID is 8-12, normalize the flags to the SID 7 form as described in the Prebid [MSPA/USNat reference](/features/mspa-usnat.html). + 1. If the normalizeFlags option is true and the SID is 8-12, normalize the flags to the SID 7 form as described in [Prebid US Compliance Support](/features/mspa-usnat.html). 1. Find the current activity. If found, run the JsonLogic in the `restrictIfTrue` section as the rule, and pass in the GPP SID flags as the data. If the result is true, then "allow=false". 1. On first "allow: false" immediately return `allow: false` to the Activity Control system. 1. Continue until all SIDs are processed or skipped. @@ -301,7 +301,7 @@ Here's a screenshot showing the usage of that tool: ## Related Topics -- [Prebid Multi-State Privacy Agreement Support](/features/mspa-usnat.html) +- [Prebid US Compliance Support](/features/mspa-usnat.html) - [US General Privacy Module](/prebid-server/features/pbs-usgen.html) - [Activity Control system](/prebid-server/features/pbs-activitycontrols.html) - [IAB US National Privacy Specification](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/US-National/IAB%20Privacy%E2%80%99s%20National%20Privacy%20Technical%20Specification.md) diff --git a/prebid-server/features/pbs-usgen.md b/prebid-server/features/pbs-usgen.md index 254fb5c427..ea5f13a09d 100644 --- a/prebid-server/features/pbs-usgen.md +++ b/prebid-server/features/pbs-usgen.md @@ -19,8 +19,8 @@ This feature is currently only available in PBS-Java. This document covers how to configure the `US General Privacy Module` for Prebid Server. -See the [Prebid Multi-State Privacy Agreement Support](/features/mspa-usnat.html) page for -details on how specifically GPP strings are processed. This module interprets the strings +See the [Prebid US Compliance Support](/features/mspa-usnat.html) page for +details on how specifically US National and State GPP strings are processed. This module interprets the strings as defined in that document. If a publisher wishes to override the interpretation coded into this module, there are two options: @@ -112,8 +112,8 @@ Here's how the module works when called by an Activity Control: 1. If the SID is < 7 or > 12, go on to the next SID 1. Else if the SID is on the skipSids list, go on to the next SID 1. Else pull that section of out the GPP string and process it - 1. If the SID is 8-12, "normalize" the flags to the SID 7 form as described in the Prebid [MSPA/USNat reference](/features/mspa-usnat.html). - 1. Depending on the Activity, compare the string's flags as described in the Prebid MSPA/USNat reference. + 1. If the SID is 8-12, "normalize" the flags to the SID 7 form as described in the Prebid [US Compliance reference](/features/mspa-usnat.html). + 1. Depending on the Activity, compare the string's flags as described in the Prebid US Compliance reference. 1. On first "allow: false" immediately return `allow: false` to the Activity Control system. 1. Continue until all SIDs are processed or skipped. 1. If any SID returns "allow: true", return `allow: true` to the Activity Control system @@ -154,7 +154,7 @@ Additional information about the outcoming of privacy module processing can be o ## Related Topics -* [Prebid Multi-State Privacy Agreement Support](/features/mspa-usnat.html) +* [Prebid US Compliance Support](/features/mspa-usnat.html) * [US Custom Logic Privacy Module](/prebid-server/features/pbs-uscustomlogic.html) * [Activity Control system](/prebid-server/features/pbs-activitycontrols.html) * [IAB US National Privacy Specification](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/US-National/IAB%20Privacy%E2%80%99s%20National%20Privacy%20Technical%20Specification.md) diff --git a/support/privacy-resources.md b/support/privacy-resources.md index b5ab2b8ae1..682e67263d 100644 --- a/support/privacy-resources.md +++ b/support/privacy-resources.md @@ -29,11 +29,11 @@ protocol is described: - [Prebid.js US Privacy Consent Management Module](/dev-docs/modules/consentManagementUsp.html) - [Prebid Server and CCPA/USP](/prebid-server/features/pbs-privacy.html#ccpa--us-privacy) -After more states started making their own privacy regulations, the IAB developed the "Global Privacy Protocol" (GPP) and the -Multi-State Privacy Agreement (MSPA). GPP is just a container that can hold specific regional protocols. +After more states started making their own privacy regulations, the IAB developed the "Global Privacy Protocol" (GPP) and +technical protocols for the US as a whole and for each state that has privacy regulations. GPP is just a container that can hold specific regional protocols. - [Prebid.js support for GPP](/dev-docs/modules/consentManagementGpp.html) -- [Prebid Support for MSPA](/features/mspa-usnat.html). +- [Prebid US Compliance Support](/features/mspa-usnat.html). ### Europe From ac378bb829a1d9c487065953b52b519f86c27b43 Mon Sep 17 00:00:00 2001 From: bretg Date: Mon, 24 Jun 2024 09:54:53 -0400 Subject: [PATCH 060/816] removed PG from sidebar (#5450) --- _data/sidebar.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/_data/sidebar.yml b/_data/sidebar.yml index bf4ac50cb7..5a509cee5d 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -1486,14 +1486,6 @@ sectionTitle: subgroup: 3 -- sbSecId: 5 - title: Programmatic Guaranteed - link: /prebid-server/features/pg/pbs-pg-idx.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 3 - - sbSecId: 5 title: Modules link: /prebid-server/pbs-modules/ From 846b2ecb3457cffb37bb089c8d73e12eeec008a0 Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 25 Jun 2024 15:55:33 -0400 Subject: [PATCH 061/816] fix formatting of sharedid page (#5453) --- identity/sharedid.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/identity/sharedid.md b/identity/sharedid.md index bf4f05fa70..78c7acc23c 100644 --- a/identity/sharedid.md +++ b/identity/sharedid.md @@ -6,11 +6,10 @@ sidebarType: 9 --- # Prebid SharedID - {: .no_toc} - TOC - {:toc} +{:toc} {: .alert.alert-warning :} As of Prebid.js 5.0, PubCommon ID is no longer supported -- it's been merged into SharedId. Also, SharedId no longer syncs to sharedid.org like it did in Prebid.js 4.x. From 4152ac596634bac4ee6f5382e0fbd6eed02ef9c5 Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 26 Jun 2024 09:14:25 -0400 Subject: [PATCH 062/816] PBS interstitials: added link (#5458) * PBS interstitials: added link * lint --- prebid-server/features/pbs-interstitials.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/prebid-server/features/pbs-interstitials.md b/prebid-server/features/pbs-interstitials.md index 4ea307ba8c..979c052680 100644 --- a/prebid-server/features/pbs-interstitials.md +++ b/prebid-server/features/pbs-interstitials.md @@ -7,14 +7,14 @@ title: Prebid Server | Features | Interstitials # Prebid Server | Features | Interstitials -Support for interstitial ads is enabled with the addition of two fields to the OpenRTB request: `device.ext.prebid.interstitial.minwidthperc` -and `device.ext.interstitial.minheightperc` The values will be numbers that indicate the minimum allowed -size for the ad, as a percentage of the base side. For example, a width of 600 and "minwidthperc": 60 +Special support for interstitial ads may be enabled with the addition of two fields to the OpenRTB request: `device.ext.prebid.interstitial.minwidthperc` +and `device.ext.interstitial.minheightperc` The values are numbers that indicate the minimum allowed +size for the ad, as a percentage of the screen size. For example, a screen with width 600 and "minwidthperc": 60 would allow ads with widths from 360 to 600 pixels inclusive. Example: -``` +```json { "imp": [{ ... @@ -49,9 +49,13 @@ Upon receiving a request for an interstitial impression (`instl:1`) and these pa 1. If the `format` array's first object is a size, PBS will take it as the max size for the interstitial. 2. If the first entry in `format` is 1x1, it will use the device's size as the max size. 3. Likewise, if `format` is not present, PBS will also use the device size as the max size. -4. Each PBS host company configures a list of common interstitial ad sizes, generally organized by weighing the larger and more common sizes first. +4. Each PBS host company can configure a list of interstitial ad sizes, generally organized by weighing the larger and more common sizes first. The default list can be seen [here](https://github.com/prebid/prebid-server/blob/master/config/interstitial.go). 5. PBS generates a new format list for the interstitial imp by traversing this configured list and picking the first 10 sizes that fall within the imp's max size and minimum percentage size. 6. There's no attempt to favor aspect ratios closer to the original size's aspect ratio. 7. The limit of 10 is enforced to ensure we don't overload bidders with an overlong list. 8. The `minwidthperc` and `minheightperc` parameters are passed to bidder adapters, so if desired, they may use their own size matching algorithms. +## Further Reading + +- [Prebid Server features](/prebid-server/features/pbs-feature-idx.html) +- [/openrtb2/auction endpoint](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html) From f3fe0f3249f13f384836491983dad77ddd43599b Mon Sep 17 00:00:00 2001 From: Chris Huie Date: Wed, 26 Jun 2024 07:41:10 -0600 Subject: [PATCH 063/816] typo fix (#5459) --- dev-docs/modules/anPspParamsConverter.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/modules/anPspParamsConverter.md b/dev-docs/modules/anPspParamsConverter.md index f3c195aab5..876f29be4e 100644 --- a/dev-docs/modules/anPspParamsConverter.md +++ b/dev-docs/modules/anPspParamsConverter.md @@ -3,8 +3,8 @@ layout: page_v2 page_type: module title: Module - anPspParamsConverter description: Formats bid params for AppNexus PSP requests made through Prebid.js. -module_code : apPspParamsConverter -display_name : apPspParamsConverter +module_code : anPspParamsConverter +display_name : anPspParamsConverter enable_download : true sidebarType : 1 --- From 981456cc4ad73e6e4f0a713cc42c2b18a1061505 Mon Sep 17 00:00:00 2001 From: Chris Huie Date: Wed, 26 Jun 2024 08:08:25 -0600 Subject: [PATCH 064/816] fix download page (#5460) --- dev-docs/modules/fledgeForGpt.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/modules/fledgeForGpt.md b/dev-docs/modules/fledgeForGpt.md index 5f64dfa5a5..221b11d6d3 100644 --- a/dev-docs/modules/fledgeForGpt.md +++ b/dev-docs/modules/fledgeForGpt.md @@ -3,7 +3,7 @@ layout: page_v2 page_type: module title: Module - fledgeForGpt description: how to use PAAPI with GPT -module_code : fledgeForGpt +module_code : paapiForGpt display_name : Fledge (PAAPI) for GPT enable_download : true sidebarType : 1 @@ -24,7 +24,7 @@ To use PAAPI with GPT: - include this module with your Prebid.js bundle; this also automatically includes the [PAAPI module](/dev-docs/modules/paapi.html) ```bash - gulp build --modules=fledgeForGpt,... + gulp build --modules=paapiForGpt,... ``` - [configure PAAPI](/dev-docs/modules/paapi.html#config) From f77420798f088cc078123bae44a68e07d1d7bc00 Mon Sep 17 00:00:00 2001 From: ElgarsG <65354776+eldzis@users.noreply.github.com> Date: Wed, 26 Jun 2024 23:49:29 +0300 Subject: [PATCH 065/816] Update bid params (#5411) --- dev-docs/bidders/setupad.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/setupad.md b/dev-docs/bidders/setupad.md index a6ce0dad27..f48d280776 100644 --- a/dev-docs/bidders/setupad.md +++ b/dev-docs/bidders/setupad.md @@ -27,7 +27,7 @@ sidebarType: 1 | Name | Scope | Description | Example | Type | |----------------+-------+-----------------------------------+-----------+---------| | `placement_id` | required | Placement ID, provided by setupad | `'12345'` | String | -| `account_id` | optional | Account ID, provided by setupad | `'12345'` | String | +| `account_id` | required | Account ID, provided by setupad | `'12345'` | String | ### Additional options From b6190b94c545471ce7176eddea5942f78edd952f Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 27 Jun 2024 09:25:00 -0400 Subject: [PATCH 066/816] PBS client aTags (#5454) * PBS client aTags * lint * lint * Update prebid-server/developers/module-atags.md Co-authored-by: Muki Seiler * Update prebid-server/developers/module-atags.md Co-authored-by: Muki Seiler * Update prebid-server/developers/module-atags.md Co-authored-by: Muki Seiler --------- Co-authored-by: Muki Seiler --- prebid-server/developers/module-atags.md | 139 ++++++++++++++++-- .../openrtb2/pbs-endpoint-auction.md | 25 +++- prebid-server/features/pbs-feature-idx.md | 1 + 3 files changed, 151 insertions(+), 14 deletions(-) diff --git a/prebid-server/developers/module-atags.md b/prebid-server/developers/module-atags.md index f855805fc3..d30754dfc3 100644 --- a/prebid-server/developers/module-atags.md +++ b/prebid-server/developers/module-atags.md @@ -8,29 +8,30 @@ sidebar_entry: /prebid-server/developers/add-a-module.html # Prebid Server - Module Analytics Tags Conventions {: .no_toc} -* TOC +- TOC {:toc } ## Overview -Analytics Tags (aka ‘ATags’) are a log mechanism provided by PBS-core to allow modules +Analytics Tags (aka ‘aTags’) are a log mechanism provided by PBS-core to allow modules to inform analytics adapters about what happened in the request. Use of the Analytics Tag structure is completely optional. It's meant to be used when there are application or reporting reasons for sharing module results. See the [Prebid Server module overview](/prebid-server/developers/add-a-module.html) for background information. This document defines a convention aimed at allowing module developers to create -consistent ATags that can be easily read by analytics adapters. +consistent aTags that can be easily read by analytics adapters. -![Prebid Server ATags](/assets/images/prebid-server/module-atags.png){:class="pb-xlg-img"} +![Prebid Server aTags](/assets/images/prebid-server/module-atags.png){:class="pb-xlg-img"} -1. Modules may return a data structure containing ATags to PBS-Core. -2. PBS-Core adds any ATags to the 'invocation context' data structure. +1. Modules may return a data structure containing aTags to PBS-Core. +2. PBS-Core adds any aTags to the 'invocation context' data structure. 3. Analytics modules have access to the invocation context. ## Analytics Tag Conventions -The general idea is that ATags are a list of module-specific "activities" that have these attributes: +The general idea is that aTags are a list of module-specific "activities" that have these attributes: + - activity name: should be unique within the context of this module. e.g. 'enrich-request' - an overall status - an array of specific results within the activity @@ -41,7 +42,7 @@ The general idea is that ATags are a list of module-specific "activities" that h Here's an example from the [ORTB2 Blocking module](/prebid-server/pbs-modules/ortb2-blocking.html): -``` +```json [{ // scenario: response from bidderA blocked on badv for imp=1 activities: [{ @@ -71,7 +72,7 @@ Here's an example from the [ORTB2 Blocking module](/prebid-server/pbs-modules/or The following table contains the field conventions. {: .table .table-bordered .table-striped } -| ATag Attr | Required? | Description | Type | +| aTag Attr | Required? | Description | Type | |---+---+---+---| | activities | yes | One or more activities carried out by the module. | array of objects | | activities .name | yes | Name of the activity. Must be documented and unique within the module. | string | @@ -86,10 +87,9 @@ The following table contains the field conventions. | activities. results. appliedto. request | no | The service examined the entire openrtb request object. This is in case the module updated something not adunit-specific. | boolean | | activities. results. appliedto. response | no | The service examined the entire openrtb response object. This is in case the module updated something not adunit-specific. | boolean | - ## Designing Analytics Tags -ATags are for reporting. Start by considering what the module's doing that consumers might want to display. Each processing stage the module operates in may be +aTags are for reporting. Start by considering what the module's doing that consumers might want to display. Each processing stage the module operates in may be reported as a separate activity, or perhaps everything the module does is lumped as one activity. @@ -106,7 +106,7 @@ to report on what percentage of responses from each bidder were being thrown away due to blocking rules. This could have been done by defining a separate 'activity' for each of the 4 types of enforcement, but it was decided to just have one kind of activity ('enforce-blocking') and get the specific details as part of the 'value'. There was no requirement to report on the -outbound part of what the module does, so no ATags are created for that part +outbound part of what the module does, so no aTags are created for that part of the functionality. Once you know what reports are desired, figure out which activity 'results' @@ -123,6 +123,7 @@ Be sure to detail the results in your module documentation so that analytics ada aware of what they can look for. Let them know: + - which activities your module supports - what kind of results to expect - whether the results objects have module-specific `values` @@ -142,7 +143,8 @@ In short, to get analytics tags, you'll need to parse this data structure: Here's an example of the data structured as JSON, though the details of the actual object will differ in PBS-Java and PBS-Go. -``` + +```json "stages": [ { "stage": "raw-auction-request", @@ -227,6 +229,117 @@ of the actual object will differ in PBS-Java and PBS-Go. See the implementation guide for your platform for specific syntax. +## Sending aTags to the client-side + +{: .alert.alert-info :} +PBS-Java only + +The use cases for server-side and client-side analytics are different: + +- Server-side analytics are the only game in town when it comes to App, AMP, DOOH, etc. +- However, when Prebid.js is in use and bidders are split between client-side and server-side, it would be far better if auctions were only logged once. + +This feature allows all relevant data passed to the client from Prebid Server so that client-side analytics can be the one to log the results. +To allow the sharing of these details, there are two conditions: + +1. Server-side account configuration must allow sharing of these details by setting `analytics.allow-client-details: true` +1. The ORTB request must contain `ext.prebid.analytics.options.enableclientdetails: true` + +If both are true, then any and all PBS analytics tags will be copied to the response field ext.prebid.analytics.tags. + +### Client aTag example + +The "pb-ortb-blocking" module at the "processed auction" stage adds the following Analytics Tags (from the ORTB2 blocking module) + +```json +[{ + "activities": [{ + "name": "enforce-blocking", + "status": "success", + "results": [{ + "status": "success-block", + "values": { + "attributes": ["badv"], + "adomain": ["bad.com"] + }, + "appliedto": { + "bidder": "bidderA", + "impids": ["1"] + } + },{ + "status": "success-allow", + "appliedto": { + "bidder": "bidderA", + "impids": ["2","3","4"] + } + }] + }] + +Also, the "vendorA-brand-safety" module at the "all processed bid responses" stage adds these aTags: + +```json +[{ + "activities": [{ + "name": "brand-safety", + "status": "success", + "results": [{ + "status": "success-allow", + "appliedto": { + "bidder": "bidderA", + "impids": ["1,","2","3","4"] + } + }] + }] +``` + +The resulting response with the request ext.prebid.analytics.options.enableclientdetails: true and config analytics.options.enableclientdetails:true would be: + +```json5 +// this is actually a nested object - but aggregated for readablility +"ext.prebid.analytics.tags": [{ + "stage": "processed-auction-request", + "module": "pb-ortb-blocking", + "analyticstags": [{ + "activities": [{ + "name": "enforce-blocking", + "status": "success", + "results": [{ + "status": "success-block", + "values": { + "attributes": ["badv"], + "adomain": ["bad.com"] + }, + "appliedto": { + "bidder": "bidderA", + "impids": ["1"] + } + },{ + "status": "success-allow", + "appliedto": { + "bidder": "bidderA", + "impids": ["2","3","4"] + } + }] + }] +},{ + "stage": "all-processed-bid-responses", + "module": "vendorA-brand-safety", + "analyticstags": [{ + "activities": [{ + "name": "brand-safety", + "status": "success", + "results": [{ + "status": "success-allow", + "appliedto": { + "bidder": "bidderA", + "impids": ["1,","2","3","4"] + } + }] +}] +``` + +It's up to the client-side analytics adapters to be able to parse the module-specific contents of the aTags. + ## Further Reading - [PBS Module Overview](/prebid-server/developers/add-a-module.html) diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md index 3aeb1d1e3e..f240b16ce7 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -1492,7 +1492,9 @@ PBS-core creates this block before sending to bid adapters. They receive additio } ``` -##### Analytics Extension +##### Analytics Extensions + +###### Analytics adapter flags Some analytics adapters may support special flags that can be passed on ext.prebid.analytics. e.g. @@ -1506,6 +1508,26 @@ ext.prebid: { } ``` +###### Sending analytics tags to the client-side + +{: .alert.alert-info :} +PBS-Java only + +[Analytics Tags](/prebid-server/developers/module-atags.html) (aka "aTags") are an advanced feature that some [modules](/prebid-server/pbs-modules/) and +features utilize to communicate auction details to server-side analytics adapters. + +When there are Prebid.js-based analytics adapters in use, server-side details can be sent to them with aTags. This allows the client-side analytics systems +to see what's happening within Prebid Server - all analytics tags created by all modules will be sent to the client. + +To allow the sharing of these details, there are two conditions: + +1. Server-side account configuration must allow sharing of these details by setting `analytics.allow-client-details: true` +1. The ORTB request must contain `ext.prebid.analytics.options.enableclientdetails: true` + +If both are true, then any and all PBS analytics tags will be copied to the response field ext.prebid.analytics.tags. + +See the [Analytics Tags](/prebid-server/developers/module-atags.html) page for more information. + ##### Preferred Media Type {: .alert.alert-info :} @@ -1791,6 +1813,7 @@ The Prebid SDK version comes from: | 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 | +| ext.prebid.analytics.options.enableclientdetails | Requests that [aTags](/prebid-server/developers/module-atags.html) be sent to the client-side for analytics. | boolean | 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 | diff --git a/prebid-server/features/pbs-feature-idx.md b/prebid-server/features/pbs-feature-idx.md index 18c6a51ae5..a1287dd202 100644 --- a/prebid-server/features/pbs-feature-idx.md +++ b/prebid-server/features/pbs-feature-idx.md @@ -83,6 +83,7 @@ title: Prebid Server | Features | 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. | check | check | | Auction | [MultiBid](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#multibid) | Allow named bidders to supply more than one response. | check | check | | Analytics | Analytics module support | Allows developers to plug in a [custom analytics adapter](/prebid-server/developers/pbs-build-an-analytics-adapter.html). | check | check | +| Analytics | Client-side analytics support | Share [analytics tags](/prebid-server/developers/module-atags.html) with client-side analytics adapters. | | check | | Bid Response Validation | Validate secure markup | PBS can configurably reject bid responses that don't supply a secure creative when in a secure context. | check | check | | Bid Response Validation | Validate bid sizes | PBS can configurably reject bid responses with sizes that are bigger than the request dimensions. | check | check | | [Bidder Info Endpoints](/prebid-server/endpoints/info/pbs-endpoint-info.html) | Core | Provides details on which bidders and parameters exist in this Prebid Server. | check | check | From 15a58450f9ad70462f2af2248d74e1d0017bd78a Mon Sep 17 00:00:00 2001 From: Vungle-GordonTian <115982294+Vungle-GordonTian@users.noreply.github.com> Date: Thu, 27 Jun 2024 22:28:17 +0800 Subject: [PATCH 067/816] rename Adapter from liftoff to vungle (#5396) --- dev-docs/bidders/{liftoff.md => vungle.md} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename dev-docs/bidders/{liftoff.md => vungle.md} (83%) diff --git a/dev-docs/bidders/liftoff.md b/dev-docs/bidders/vungle.md similarity index 83% rename from dev-docs/bidders/liftoff.md rename to dev-docs/bidders/vungle.md index c55d6febc9..b66c0d254b 100644 --- a/dev-docs/bidders/liftoff.md +++ b/dev-docs/bidders/vungle.md @@ -1,8 +1,8 @@ --- layout: bidder -title: liftoff -description: Prebid liftoff Bidder Adapter -biddercode: liftoff +title: vungle +description: Prebid vungle Bidder Adapter +biddercode: vungle tcfeu_supported: false usp_supported: true gpp_supported: false @@ -25,7 +25,7 @@ sidebarType: 1 ### Note -The Liftoff Bidding adapter requires setup before beginning. Please contact us at . +The Vungle Bidding adapter requires setup before beginning. Please contact us at . ### Bid Params From a81d42c04086a8a3d579a415c1907c8e2c50b80d Mon Sep 17 00:00:00 2001 From: BizzClick <73241175+BizzClick@users.noreply.github.com> Date: Thu, 27 Jun 2024 17:30:12 +0300 Subject: [PATCH 068/816] rename bizzclick to blasto (#5326) Co-authored-by: Muki Seiler --- dev-docs/bidders/{bizzclick.md => blasto.md} | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) rename dev-docs/bidders/{bizzclick.md => blasto.md} (54%) diff --git a/dev-docs/bidders/bizzclick.md b/dev-docs/bidders/blasto.md similarity index 54% rename from dev-docs/bidders/bizzclick.md rename to dev-docs/bidders/blasto.md index 15872a4126..215257b2e9 100644 --- a/dev-docs/bidders/bizzclick.md +++ b/dev-docs/bidders/blasto.md @@ -1,8 +1,8 @@ --- layout: bidder -title: BizzClick -description: Prebid BizzClick Bidder Adaptor -biddercode: bizzclick +title: Blasto +description: Prebid Blasto Bidder Adaptor +biddercode: blasto tcfeu_supported: false usp_supported: true coppa_supported: true @@ -25,16 +25,16 @@ userIds: all ### Note -The Example Bidding adapter requires setup before beginning. Please contact us at .BizzClick will only respond to the first impression and that multiple ad formats of that single impression are not supported. +The Example Bidding adapter requires setup before beginning. Please contact us at . Blasto will only respond to the first impression and that multiple ad formats of that single impression are not supported. ### Bid Params for Prebid Server and Prebid Mobile {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |---------------|----------|-----------------------|-----------|-----------| -| `sourceId` | required | Unique hash provided by bizzclick | `'6dllcEHSxYdSb6yLmCqE'` | `string` | -| `accountId` | required | Unique name provided by bizzclick | `'bizzclick-test'` | `string` | -| `host` | optional | Bizzclick server region. US East by default | `'us-e-node1'` | `string` | +| `sourceId` | required | Unique hash provided by blasto | `'6dllcEHSxYdSb6yLmCqE'` | `string` | +| `accountId` | required | Unique name provided by blasto | `'blasto-test'` | `string` | +| `host` | optional | Blasto server region. US East by default | `'us-e-node1'` | `string` | | `placementId` | required | Deprecated parameter. Please use sourceId instead |`'6dllcEHSxYdSb6yLmCqE'`|`string` | ### Bid Params for Prebid.js @@ -42,6 +42,6 @@ The Example Bidding adapter requires setup before beginning. Please contact us a {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |---------------|----------|-----------------------|-----------|-----------| -| `sourceId` | required | Unique hash provided by bizzclick | `'6dllcEHSxYdSb6yLmCqE'` | `string` | -| `accountId` | required | Unique name provided by bizzclick | `'bizzclick-test'` | `string` | -| `host` | optional | Bizzclick server region. US East by default | `'us-e-node1'` | `string` | +| `sourceId` | required | Unique hash provided by blasto | `'6dllcEHSxYdSb6yLmCqE'` | `string` | +| `accountId` | required | Unique name provided by blasto | `'blasto-test'` | `string` | +| `host` | optional | Blasto server region. US East by default | `'us-e-node1'` | `string` | From feaf2a8f3debdb257be6cc9e4f5fe3082ce2b6b9 Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 27 Jun 2024 15:58:50 -0400 Subject: [PATCH 069/816] privacy-resources: deprecate USP (#5462) --- support/privacy-resources.md | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/support/privacy-resources.md b/support/privacy-resources.md index 682e67263d..5fafff1e87 100644 --- a/support/privacy-resources.md +++ b/support/privacy-resources.md @@ -23,17 +23,19 @@ of user privacy. ### United States -The IAB's original "US Privacy" standard was designed for the California rules known as CCPA or CPRA. Prebid support for the original USP -protocol is described: +To support the complicated US landscape for privacy regulations, the IAB developed the "Global Privacy Protocol" (GPP) and +technical protocols for the US as a whole and for each state that has privacy regulations. -- [Prebid.js US Privacy Consent Management Module](/dev-docs/modules/consentManagementUsp.html) -- [Prebid Server and CCPA/USP](/prebid-server/features/pbs-privacy.html#ccpa--us-privacy) +- [Prebid.js support for GPP](/dev-docs/modules/consentManagementGpp.html) - GPP is just a container that can hold specific regional protocols. +- [Prebid US Compliance Support](/features/mspa-usnat.html) - if you do business in the United States, you should talk to your lawyers about whether Prebid's US Compliance modules would be useful in helping to achieve your company's privacy policies. + +{: .alert.alert-warning :} +The 'US Privacy' approach has been deprecated by both the IAB and Prebid. -After more states started making their own privacy regulations, the IAB developed the "Global Privacy Protocol" (GPP) and -technical protocols for the US as a whole and for each state that has privacy regulations. GPP is just a container that can hold specific regional protocols. +The IAB's original "US Privacy" standard was designed for the California rules known as CCPA or CPRA. -- [Prebid.js support for GPP](/dev-docs/modules/consentManagementGpp.html) -- [Prebid US Compliance Support](/features/mspa-usnat.html). +- [Prebid.js US Privacy Consent Management Module](/dev-docs/modules/consentManagementUsp.html) +- [Prebid Server and CCPA/USP](/prebid-server/features/pbs-privacy.html#ccpa--us-privacy) ### Europe @@ -42,9 +44,9 @@ The privacy tools that Prebid has built in support of European rules may help ad The IAB defined the Transparency and Consent Framework (TCF) to address European GDPR rules. Prebid support for TCF is described: - [Prebid.js CMP Best Practices](/dev-docs/cmp-best-practices.html) -- [Prebid.js GDPR Consent Management Module](/dev-docs/modules/consentManagementTcf.html) -- [Prebid.js GDPR Enforcement Module](/dev-docs/modules/tcfControl.html) -- [Prebid Server GDPR Support](/prebid-server/features/pbs-privacy.html#gdpr) +- [Prebid.js TCF Consent Management Module](/dev-docs/modules/consentManagementTcf.html) +- [Prebid.js TCF Control Module](/dev-docs/modules/tcfControl.html) +- [Prebid Server TCF/GDPR Support](/prebid-server/features/pbs-privacy.html#gdpr) - [White paper: Prebid Support for Enforcing TCF 2](https://docs.google.com/document/d/1fBRaodKifv1pYsWY3ia-9K96VHUjd8kKvxZlOsozm8E) ### Canada From 75bf02458bb27f9c74b4280c9c98f97e6aafa5d9 Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 28 Jun 2024 10:58:07 -0400 Subject: [PATCH 070/816] floors: update noFloorSignalBidders (#5465) * floors: update noFloorSignalBidders * formatting * formatting --- dev-docs/modules/floors.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dev-docs/modules/floors.md b/dev-docs/modules/floors.md index ea86698556..634f61d7b1 100644 --- a/dev-docs/modules/floors.md +++ b/dev-docs/modules/floors.md @@ -371,7 +371,7 @@ a subset that will be merged under the 'data' object. | 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 | -| enforcement.noFloorSignalBidders | array of strings | (Prebid.js 8.31+) Bidders which should not receive floor signals. | none | +| enforcement.noFloorSignalBidders | array of strings | (PBJS 8.31+, PBS-Java 3.4+) This is an array of bidders for which to avoid sending floors. This is useful for bidders where the publishers has established different floor rules in their systems. The value can be `["*"]`. | - | | endpoint | object | Controls behavior for dynamically retrieving floors. | - | | endpoint.url | string | URL of endpoint to retrieve dynamic floor data. | - | | data | object (required) | Floor data used by the module to pass floor data to bidders and floor enforcement. | - | @@ -380,7 +380,7 @@ a subset that will be merged under the 'data' object. | data.skipRate | integer | skipRate is a random function whose input value is any integer 0 through 100 to determine when to skip all floor logic, where 0 is always use floor data and 100 is always skip floor data. The use case is for publishers or floor providers to learn bid behavior when floors are applied or skipped. Analytics adapters will have access to model version (if defined) when skipped is true to signal the module is in floors mode. If skipRate is supplied in both the root level of the floors object and within the data object, the skipRate configuration within the data object shall prevail.| 0 | | data.floorsSchemaVersion | integer | The module supports two version of the data schema. Version 1 allows for only one model to be applied in a given data set, whereas Version 2 allows you to sample multiple models selected by supplied weights. If no schema version is provided, the module will assume version 1 for the sake of backwards compatiblity.| 1 | | data.modelTimestamp | int | Epoch timestamp associated with modelVersion. Can be used to track model creation of floor file for post auction analysis.| - | -| data.noFloorSignalBidders | array of strings | (Prebid.js 8.31+) Bidders which should not receive floor signals. | none | +| data.noFloorSignalBidders | array of strings | (PBJS 8.31+, PBS-Java 3.4+) This is an array of bidders for which to avoid sending floors. This is useful for bidders where the publishers has established different floor rules in their systems. The value can be `["*"]`. | - | | data.modelGroups | array of objects | Array of model objects to be used for A/B sampling multiple models. This field is only used when data.floorsSchemaVersion = 2 | - | | data.modelGroups[].currency | string | Currency of floor data. Floor Module will convert currency where necessary. See Currency section for more details. | 'USD' | | data.modelGroups[].skipRate | integer | skipRate is a random function whose input value is any integer 0 through 100 to determine when to skip all floor logic, where 0 is always use floor data and 100 is always skip floor data. The use case is for publishers or floor providers to learn bid behavior when floors are applied or skipped. Analytics adapters will have access to model version (if defined) when skipped is true to signal the module is in floors mode. | 0 | @@ -393,7 +393,7 @@ a subset that will be merged under the 'data' object. | data.modelGroups[].values."rule key" | string | Delimited field of attribute values that define a floor. | - | | data.modelGroups[].values."rule floor value" | float | The floor value for this key. | - | | data.modelGroups[].default | float | Floor used if no matching rules are found. | - | -| data.modelGroups[].noFloorSignalBidders | array of strings | (Prebid.js 8.31+) Bidders which should not receive floor signals. | none | +| data.modelGroups[].noFloorSignalBidders | array of strings | (PBJS 8.31+, PBS-Java 3.4+) This is an array of bidders for which to avoid sending floors. This is useful for bidders where the publishers has established different floor rules in their systems. The value can be `["*"]`. | - | | additionalSchemaFields | object | Object contain the lookup function to map custom schema.fields. Not supported by Prebid Server. | - | | additionalSchemaFields."custom key" | string | custom key name | - | | additionalSchemaFields."key map function" | function | Function used to lookup the value for that particular custom key | - | From 00c48973524c6e9aa123abbf32b24802fe0d0a13 Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Fri, 28 Jun 2024 08:03:02 -0700 Subject: [PATCH 071/816] consentManagementTcf: add DSA platform config (#5446) --- dev-docs/modules/consentManagementTcf.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/modules/consentManagementTcf.md b/dev-docs/modules/consentManagementTcf.md index d3df05e3ab..de965ca030 100644 --- a/dev-docs/modules/consentManagementTcf.md +++ b/dev-docs/modules/consentManagementTcf.md @@ -71,6 +71,7 @@ but we recommend migrating to the new config structure as soon as possible. | gdpr.actionTimeout | `integer` | Length of time (in milliseconds) to allow the user to take action to consent if they have not already done so. The actionTimer first waits for the CMP to load, then the actionTimeout begins for the specified duration. Default is `undefined`. | `10000` | | gdpr.defaultGdprScope | `boolean` | Defines what the `gdprApplies` flag should be when the CMP doesn't respond in time or the static data doesn't supply. Defaults to `false`. | `true` | | gdpr.consentData | `Object` | An object representing the GDPR consent data being passed directly; only used when cmpApi is 'static'. Default is `undefined`. | | +| gpdr.dsaPlatform | `boolean` | If true, indicates that the publisher is to be considered an "Online Platform" for the purposes of the [Digital Services Act](https://digital-strategy.ec.europa.eu/en/policies/digital-services-act-package) | | | gdpr.consentData.tcString | `string` | Base64url-encoded TCF v2.x string with segments. | | | gdpr.consentData.addtlConsent | `string` | Additional consent string if available from the cmp TCData object | | | gdpr.consentData.gdprApplies | `boolean` | Defines whether or not this pageview is in GDPR scope. | | From 32343aca6131ff1044d848d547603ece836d399d Mon Sep 17 00:00:00 2001 From: Sanved Tapkeer Date: Fri, 28 Jun 2024 11:08:40 -0400 Subject: [PATCH 072/816] Adding docs for customHeader suppor for XHR call to Preid Server (#5444) * Adding docs for customHeader suppor for XHR call to Preid Server * Added extra example --- dev-docs/modules/prebidServer.md | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/dev-docs/modules/prebidServer.md b/dev-docs/modules/prebidServer.md index 04be700ad8..60713aa438 100644 --- a/dev-docs/modules/prebidServer.md +++ b/dev-docs/modules/prebidServer.md @@ -56,20 +56,20 @@ The same bidder cannot be set in both configs. For example: ```javascript pbjs.setConfig({ s2sConfig: [ - { - name: "pbs-appnexus", - accountId: '12345', - bidders: ['appnexus','pubmatic'], - defaultVendor: 'appnexus', - timeout: 300, - }, - { - name: "pbs-rubicon", - accountId: '678910', - bidders: ['rubicon'], - defaultVendor: 'rubicon', - timeout: 300, - }, + { + name: "pbs-appnexus", + accountId: '12345', + bidders: ['appnexus','pubmatic'], + defaultVendor: 'appnexus', + timeout: 300, + }, + { + name: "pbs-rubicon", + accountId: '678910', + bidders: ['rubicon'], + defaultVendor: 'rubicon', + timeout: 300, + }, ], }); ``` @@ -96,6 +96,7 @@ There are many configuration options for s2sConfig: | `defaultTtl` | Optional | Integer | Configures the default TTL in the Prebid Server adapter to use when Prebid Server does not return a bid TTL - 60 if not set | | `adapterOptions` | Optional | Object | Arguments will be added to resulting OpenRTB payload to Prebid Server in every impression object at request.imp[].ext.BIDDER. See the example above. | | `extPrebid` | Optional | Object | Arguments will be added to resulting OpenRTB payload to Prebid Server in request.ext.prebid. See the examples below. | +| `customHeader` | Optional | Object | These custom headers will be included in the XHR call to the bidder's endpoint. This will allow you to send data specific to your use case. The format consists of an object where the keys represent the header names and the values correspond to the respective header values. Here is an example how a customHeader object might look like - `{"Header1": "Value1", "Header2": "Value2"}`| If `endpoint` and `syncEndpoint` are objects, these are the supported properties: From 4c370c895351d79d7f67b2b8c27ed2ec1cb21da2 Mon Sep 17 00:00:00 2001 From: ehb-mtk <163182361+ehb-mtk@users.noreply.github.com> Date: Fri, 28 Jun 2024 11:14:48 -0400 Subject: [PATCH 073/816] initialize documentation for mobian brand safety RTD module (#5420) * initialize documentation for mobian brand safety RTD module * remove blank line --- dev-docs/modules/mobianRtdProvider.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 dev-docs/modules/mobianRtdProvider.md diff --git a/dev-docs/modules/mobianRtdProvider.md b/dev-docs/modules/mobianRtdProvider.md new file mode 100644 index 0000000000..8958fddf85 --- /dev/null +++ b/dev-docs/modules/mobianRtdProvider.md @@ -0,0 +1,19 @@ +--- +layout: page_v2 +title: Mobian Real-Time Data Provider +display_name: Mobian Prebid Brand Safety Evaluation +description: Mobian provides contextual brand safety evaluations of pages given a URL, which publishers can use for targeting as an alternative to keyword-based evaluation. +page_type: module +module_type: rtd +module_code : mobianRtdProvider +enable_download : true +vendor_specific: false +sidebarType : 1 +--- +# Mobian Brand Safety Module + +Mobian uses AI to determine the GARM risk level of articles from our publisher partners. +This methodology is contextual, rather than keyword-based. +Our evaluation of articles is openly available through our API. This prebid header +exposes that API at prebid time so that advertisers can easily target articles with +the desired mobianGarmRisk From 84533dabfe58363775ed04187f914bd0b6522b17 Mon Sep 17 00:00:00 2001 From: Olivier Date: Fri, 28 Jun 2024 17:20:34 +0200 Subject: [PATCH 074/816] Adagio Rtd Provider: add placementSource param (#5415) --- dev-docs/modules/adagioRtdProvider.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/dev-docs/modules/adagioRtdProvider.md b/dev-docs/modules/adagioRtdProvider.md index 2078f4cc30..4f10a192a9 100644 --- a/dev-docs/modules/adagioRtdProvider.md +++ b/dev-docs/modules/adagioRtdProvider.md @@ -34,6 +34,7 @@ pbjs.setConfig({ params: { organizationId: '1000', // Required. Provided by Adagio site: "my-site" // Required. Provided by Adagio + placementSource: 'ortb' // Optional. Possible values: 'ortb' | 'code' | 'gpid' } }] } @@ -43,12 +44,13 @@ pbjs.setConfig({ Syntax details: {: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|-------------------------|----------|-----------------------------------------------|-------------|----------| -| `name` | required | Real time data module name: Always `'adagio'` | `'adagio'` | `string` | -| `params` | required | | | `Object` | -| `params.organizationId` | required | Account id provided by Adagio. | `'1000'` | `string` | -| `params.site` | required | Account site name provided by Adagio. | `'my-site'` | `string` | +| Name | Scope | Description | Example | Type | +|--------------------------|----------|-----------------------------------------------|-------------|----------| +| `name` | required | Real time data module name: Always `'adagio'` | `'adagio'` | `string` | +| `params` | required | | | `Object` | +| `params.organizationId` | required | Account id provided by Adagio. | `'1000'` | `string` | +| `params.site` | required | Account site name provided by Adagio. | `'my-site'` | `string` | +| `params.placementSource` | optional | Programmatically set the `ortb2Imp.ext.data.placement` signal based on location. Possible values: `ortb` (default), `code`, `gpid`. | `'ortb'` | `string` | ## Installation From cd4d4315084324a2f2672048b656da07137bd462 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=E6=80=9D=E6=95=8F?= <506374983@qq.com> Date: Fri, 28 Jun 2024 23:25:28 +0800 Subject: [PATCH 075/816] mediago support prebid server (#5395) * mediago support prebid server * MediaGo Baidu is Prebid member * mark parameters' availability --- dev-docs/bidders/mediago.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/dev-docs/bidders/mediago.md b/dev-docs/bidders/mediago.md index 4b5f4fcd94..3d31348b80 100644 --- a/dev-docs/bidders/mediago.md +++ b/dev-docs/bidders/mediago.md @@ -3,11 +3,14 @@ layout: bidder title: MediaGo description: MediaGo Prebid Bidder Adapter biddercode: mediago -media_types: banner +media_types: banner,native +prebid_member: true +userIds: all (with commercial activation) tcfeu_supported: true coppa_supported: true usp_supported: true pbjs: true +pbs: true floors_supported: true gvl_id: 1020 pbjs_version_notes: not ported to 5.x, added back 7.13 @@ -26,7 +29,8 @@ The MediaGo Bidding adapter requires setup before beginning. Please contact us a {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |---------------|----------|-----------------------|-----------|-----------| -| `token` | required | publisher token | `'1e100887dd614b7f69fdd1360437'` | `string` | -| `test` | recommend | 0(default): production env mode.
1: dev env mode and no charge.we will bid Higher frequency to make debug easier. | `1/0` | `Number` | -| `bidfloor` | recommend | Sets a floor price for the bid | `0.05` | `float` | +| `token` | required | publisher token, This parameter expects all imps to be the same | `'1e100887dd614b7f69fdd1360437'` | `string` | +| `region` | recommend | Server region for PBS request: US for US Region, EU for EU Region, APAC for APAC Region, default is US. This parameter expects all imps to be the same. This parameter is available for PBS only. | `'US'` | `string` | +| `test` | recommend | 0(default): production env mode.
1: dev env mode and no charge.we will bid Higher frequency to make debug easier. This parameter is available for PBJS only. | `1/0` | `Number` | +| `bidfloor` | recommend | Sets a floor price for the bid. This parameter is available for PBJS only. | `0.05` | `float` | | `placementId` | recommend | The AD placement ID | `12341234` | `string` | From 790164b6b6697339b46bc7a01fca0aa03d6910bb Mon Sep 17 00:00:00 2001 From: Gena Date: Fri, 28 Jun 2024 18:30:45 +0300 Subject: [PATCH 076/816] Bidmatic Bid Adapter: initial release (#5391) * Add bidmatic adapter doc * Fix heading * Fix spacing --- dev-docs/bidmatic.md | 60 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 dev-docs/bidmatic.md diff --git a/dev-docs/bidmatic.md b/dev-docs/bidmatic.md new file mode 100644 index 0000000000..3b03d43acb --- /dev/null +++ b/dev-docs/bidmatic.md @@ -0,0 +1,60 @@ +--- +layout: bidder +title: Bidmatic Bid Adapter +description: Prebid example Bidder Adapter +biddercode: bidmatic +tcfeu_supported: true +dsa_supported: true +gvl_id: 1134 +usp_supported: true +coppa_supported: true +gpp_sids: tcfeu, usp +schain_supported: true +dchain_supported: false +userId: all +media_types: banner, video +safeframes_ok: true +deals_supported: false +floors_supported: true +fpd_supported: true +pbjs: true +pbs: true +prebid_member: false +multiformat_supported: will-bid-on-one +ortb_blocking_supported: true +sidebarType: 1 +--- + +### Note + +Unleash the power of fast client-oRTB connection. +Contact us at [advertising@bidmatic.io](mailto:advertising@bidmatic.io). + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|-----------------------|-----------|-----------| +| `source` | required | Traffic source origin id | `'11111'` | `int` | + +### Test Parameters + +``` javascript + var adUnits = [ + // Banner adUnit + { + code: 'elemtId', + mediaTypes:{ + banner:{ + sizes: [[300, 250]] + } + } + bids: [{ + bidder: 'bidmatic', + params: { + source: 886409 + } + }] + } + ]; +``` From 42316daee53e3fde3b6aa496fd572656d5205b71 Mon Sep 17 00:00:00 2001 From: CPMStar Date: Sun, 30 Jun 2024 13:07:04 -0700 Subject: [PATCH 077/816] cpmstarBidAdapter - updated gvlid and tcfeu_supported schain_supported flag (#5464) --- dev-docs/bidders/cpmstar.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/cpmstar.md b/dev-docs/bidders/cpmstar.md index 0573d20d60..0c43369a01 100644 --- a/dev-docs/bidders/cpmstar.md +++ b/dev-docs/bidders/cpmstar.md @@ -6,9 +6,11 @@ pbjs: true pbs: true biddercode: cpmstar media_types: banner, video -tcfeu_supported: false +tcfeu_supported: true +gvl_id: 1317 usp_supported: true coppa_supported: true +schain_supported: true sidebarType: 1 --- From 8b23dbd7b4f572e22d6f246b52ab9bd3a0d1e4ac Mon Sep 17 00:00:00 2001 From: Antonios Sarhanis Date: Mon, 1 Jul 2024 22:39:46 +1000 Subject: [PATCH 078/816] Documentation about Adnuntius advertiserTransparency mode. (#5455) --- dev-docs/bidders/adnuntius.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/adnuntius.md b/dev-docs/bidders/adnuntius.md index d0a04091e8..d720931716 100644 --- a/dev-docs/bidders/adnuntius.md +++ b/dev-docs/bidders/adnuntius.md @@ -86,9 +86,9 @@ pbjs.setBidderConfig({ }); ``` -### Disable cookies for adnuntius +### Disable cookies for Adnuntius -You have the option to tell adnuntius not to set cookies in your browser. This does not mean that third party ads being served through the ad server will not set cookies. Just that Adnuintius will not set it for internal ads. +You have the option to tell adnuntius not to set cookies in your browser. This does not mean that third party ads being served through the ad server will not set cookies. Just that Adnuntius will not set it for internal ads. ```js pbjs.setBidderConfig({ @@ -101,6 +101,21 @@ pbjs.setBidderConfig({ Use cookie will always be set to true by default. Changing it to false will disable cookies. +### Trigger Advertiser Transparency Mode in Adnuntius + +You have the option to tell Adnuntius to only serve ads that have their Advertiser's legal name specified. + +```js +pbjs.setBidderConfig({ + bidders: ['adnuntius'], + config: { + advertiserTransparency: true + } +}); +``` + +By default, `advertiserTransparency` is set to `false`, meaning there is no restriction on which ads can deliver. By setting `advertiserTransparency` to `true`, ad delivery is restricted to those that have their Advertiser's legal name specified. + ### Prebid Server Test Request The following test parameters can be used to verify that Prebid Server is working properly with the server-side Adnuntius adapter. the `auId` below will not return a creative. Please substitute it with your own. From 4c081d34ea30bfaf47da4b9b19d95108b856b50e Mon Sep 17 00:00:00 2001 From: CPG Date: Mon, 1 Jul 2024 16:09:07 +0200 Subject: [PATCH 079/816] Add new appnexus alias stailamedia (#5448) --- dev-docs/bidders/stailamedia.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 dev-docs/bidders/stailamedia.md diff --git a/dev-docs/bidders/stailamedia.md b/dev-docs/bidders/stailamedia.md new file mode 100644 index 0000000000..4b09273bbf --- /dev/null +++ b/dev-docs/bidders/stailamedia.md @@ -0,0 +1,31 @@ +--- +layout: bidder +title: stailamedia +description: stailamedia Bidder Adapter +biddercode: stailamedia +aliasCode: appnexus +tcfeu_supported: true +gvl_id: 32 +schain_supported: true +userId: all +media_types: banner, video, native +safeframes_ok: true +deals_supported: true +pbjs: true +pbs: true +prebid_member: false +multiformat_supported: will-bid-on-any +sidebarType: 1 +--- +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|-----------------------|-----------|-----------| +| `placement_id` (PBS+PBJS) or `placementId` (PBJS) | required | Placement id | `'33037108'` | `string` | + +stailamedia is an aliased bidder for AppNexus. + +### Note + +For setup with stailamedia, please reach out to [prebid@stailamedia.com](mailto:prebid@stailamedia.com) From 4f0ca67c517340e8b181fb1e13451346a01e324b Mon Sep 17 00:00:00 2001 From: bretg Date: Mon, 1 Jul 2024 10:12:15 -0400 Subject: [PATCH 080/816] vendorless-gvlid faq (#5452) * vendorless-gvlid faq * lint --- dev-docs/faq.md | 99 ++++++++++++++++++++++++++++--------------------- 1 file changed, 56 insertions(+), 43 deletions(-) diff --git a/dev-docs/faq.md b/dev-docs/faq.md index bfa14e5e4f..41d2426188 100644 --- a/dev-docs/faq.md +++ b/dev-docs/faq.md @@ -10,7 +10,7 @@ sidebarType: 1 This page has answers to some frequently asked questions about Prebid.js. If you don't find what you're looking for here, there are other ways to [get help](/support/index.html). -* TOC +- TOC {:toc} ## General @@ -19,8 +19,8 @@ This page has answers to some frequently asked questions about Prebid.js. If yo Nope. The only approval process is a code review. There are separate instructions for: -* [adding a bidder in Prebid.js](/dev-docs/bidder-adaptor.html) -* [adding an analytics adapter in Prebid.js](/dev-docs/integrate-with-the-prebid-analytics-api.html) +- [adding a bidder in Prebid.js](/dev-docs/bidder-adaptor.html) +- [adding an analytics adapter in Prebid.js](/dev-docs/integrate-with-the-prebid-analytics-api.html) As for [membership](https://prebid.org/membership/) in Prebid.org, that's entirely optional -- we'd be happy to have you join and participate in the various committees, but it's not necessary for contributing code as a community member. @@ -37,8 +37,8 @@ Prebid.org does not support any version of Prebid.js prior to the previous versi We would love for Amazon to contribute a TAM adapter, but so far that's not happened. Publishers that want to sync IDs across multiple header bidding wrappers should be aware of these resources: -* You can generate the auctionId parameter outside of Prebid and pass it when calling [pbjs.requestBids()](/dev-docs/publisher-api-reference/requestBids.html) -* [Example of Synchronizing Transaction IDs with Another Library](/dev-docs/examples/sync-tid.html) +- You can generate the auctionId parameter outside of Prebid and pass it when calling [pbjs.requestBids()](/dev-docs/publisher-api-reference/requestBids.html) +- [Example of Synchronizing Transaction IDs with Another Library](/dev-docs/examples/sync-tid.html) ### Should Prebid bidders be in ads.txt? @@ -55,34 +55,47 @@ To get started, first talk to your lawyers to determine your legal obligations. After you’ve determined your legal obligations, consider the tools Prebid makes available to publishers so that their pages can determine what actions are needed based on their interpretation of the user’s actions and the company’s policies: -* Consider utilizing an [Activity Control](/dev-docs/activity-controls.html). These are available with Prebid.js 7.48 and may help cover a number of common privacy concerns. -* Turn off Prebid.js usersync: - * [for client-side adapters](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Configure-User-Syncing) - either completely or for certain bidders. - * [for server-side adapters](/dev-docs/modules/prebidServer.html) - override the s2sConfig.syncEndpoint -* [Disable User ID modules](/dev-docs/modules/userId.html) - there are controls for different ID modules and which bidders can get which IDs. -* [Disable device access](/dev-docs/publisher-api-reference/setConfig.html#setConfig-deviceAccess) - no adapter or module will be able to create a cookie or HTML5 localstorage object. -* For GDPR: - * Consider the [TCF](/dev-docs/modules/consentManagementTcf.html) and [TCF Control](/dev-docs/modules/tcfControl.html) modules, which flexibly support various actions like cancelling usersyncs, auctions, and analytics. Using these modules, bid adapters can receive the IAB TCF string from the CMP. - * Note that TCF 2.2 is functionally the same as TCF 2.0 from the Prebid.js perspective. The code has always relied on event listeners to get the TCF string, so when `getTCData` was deprecated in 2.2 the modules were unaffected. There are still references in the code only because it is still accepted as a place for statically-supplied data. - * Alternatively, the page can just avoid turning on certain bidders or modules. -* For CCPA / CPRA / US-Privacy: - * Consider the [US-Privacy](/dev-docs/modules/consentManagementUsp.html) module, which passes the IAB USP string through to bid adapters and supports data deletion events for User ID modules and other interested adapters and modules. - * Also consider implementing an [Activity Control](/dev-docs/activity-controls.html) to suppress activities upon opt-out or in environments without legal notice. An example implementation is available on the activity control documentation page. - * Also consider implementing the [GPP control module - usnat section](/dev-docs/modules/gppControl_usnat.html) to implement reasonable default expressions of activity controls when a usnat string is available as section 7 of a GPP string. -* Set the [COPPA flag](/dev-docs/publisher-api-reference/setConfig.html#setConfig-coppa), which passes this value through to modules and bid adapters. - * Also consider implementing an [Activity Control](/dev-docs/activity-controls.html) to suppress activities when COPPA applies. The implementation is very similar to the example CCPA implementation available on the activity control documentation page. -* The IAB is still refining the definition of [GPP](https://iabtechlab.com/gpp/). Prebid has built a GPP module that supports GPP 1.0, with 1.1 support coming soon after the specification is finalized and merged. Many bid adapters support both statically setting GPP strings, e.g. `pbjs.setConfig({ortb2: {regs: {gpp: "blah", gpp_sid: [1,2]}}});` and module-read consent. -* Avoid adding certain bidders or modules to the AdUnit. -* Turn off header bidding altogether. +- Consider utilizing an [Activity Control](/dev-docs/activity-controls.html). These are available with Prebid.js 7.48 and may help cover a number of common privacy concerns. +- Turn off Prebid.js usersync: + - [for client-side adapters](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Configure-User-Syncing) - either completely or for certain bidders. + - [for server-side adapters](/dev-docs/modules/prebidServer.html) - override the s2sConfig.syncEndpoint +- [Disable User ID modules](/dev-docs/modules/userId.html) - there are controls for different ID modules and which bidders can get which IDs. +- [Disable device access](/dev-docs/publisher-api-reference/setConfig.html#setConfig-deviceAccess) - no adapter or module will be able to create a cookie or HTML5 localstorage object. +- For GDPR: + - Consider the [TCF](/dev-docs/modules/consentManagementTcf.html) and [TCF Control](/dev-docs/modules/tcfControl.html) modules, which flexibly support various actions like cancelling usersyncs, auctions, and analytics. Using these modules, bid adapters can receive the IAB TCF string from the CMP. + - Note that TCF 2.2 is functionally the same as TCF 2.0 from the Prebid.js perspective. The code has always relied on event listeners to get the TCF string, so when `getTCData` was deprecated in 2.2 the modules were unaffected. There are still references in the code only because it is still accepted as a place for statically-supplied data. + - Alternatively, the page can just avoid turning on certain bidders or modules. +- For CCPA / CPRA / US-Privacy: + - Consider the [US-Privacy](/dev-docs/modules/consentManagementUsp.html) module, which passes the IAB USP string through to bid adapters and supports data deletion events for User ID modules and other interested adapters and modules. + - Also consider implementing an [Activity Control](/dev-docs/activity-controls.html) to suppress activities upon opt-out or in environments without legal notice. An example implementation is available on the activity control documentation page. + - Also consider implementing the [GPP control module - usnat section](/dev-docs/modules/gppControl_usnat.html) to implement reasonable default expressions of activity controls when a usnat string is available as section 7 of a GPP string. +- Set the [COPPA flag](/dev-docs/publisher-api-reference/setConfig.html#setConfig-coppa), which passes this value through to modules and bid adapters. + - Also consider implementing an [Activity Control](/dev-docs/activity-controls.html) to suppress activities when COPPA applies. The implementation is very similar to the example CCPA implementation available on the activity control documentation page. +- The IAB is still refining the definition of [GPP](https://iabtechlab.com/gpp/). Prebid has built a GPP module that supports GPP 1.0, with 1.1 support coming soon after the specification is finalized and merged. Many bid adapters support both statically setting GPP strings, e.g. `pbjs.setConfig({ortb2: {regs: {gpp: "blah", gpp_sid: [1,2]}}});` and module-read consent. +- Avoid adding certain bidders or modules to the AdUnit. +- Turn off header bidding altogether. Prebid relies on the IAB and community members to determine what tools are needed to support publishers in meeting their legal obligations. As noted above, if there’s another tool you need, please open an issue in the appropriate repository, or join the org and help us improve the system! +### Why doesn't Prebid.org have a GVL ID? + +Back when there was a 3rd party component to [SharedID](/identity/sharedid.html), Prebid did have a Global Vendor List ID. But that 3rd party aspect of SharedID has been shut down for a long time, so Prebid.org is completely out of the user data path and has not renewed the GVL registration. + +Because Prebid.org doesn't touch data, the only TCF Purpose that's relevant for Prebid.js functionality is Purpose 1: Device Access. The way it works is that several Prebid-based modules support a "VENDORLESS_GVLID". These are seen as the publisher asking Prebid.js to store stuff on their behalf: + +- shared ID - requests to store the sharedId to local storage +- pubProvided ID - requests to store the pubProvidedId to local storage +- consentManagement module - requests to store the CMP state to local storage so PBJS can tell when a change was made to the state. +- geo location module - requests to retrieve the user's location from the browser. + +When the TCF Purpose 1 check is made for one of these VENDORLESS_GVLID scenarios, only the user's purpose consent is checked -- no vendor check is made. This makes sense because the 'vendor' in these scenarios is the publisher, and they're a first party, not a third party. + ### What happened to the allowAuctionWithoutConsent flag? This option to the ConsentManagement module was removed a long time ago in PBJS 4.0. Why? -* It was a poorly named flag. What it did was let the auction happen on the first page before the user had responded to the CMP. -* It was replaced by a combination of the "defaultGdprScope" flag and the ability for a publisher to disable enforcement of the `basicAds` TCF purpose. +- It was a poorly named flag. What it did was let the auction happen on the first page before the user had responded to the CMP. +- It was replaced by a combination of the "defaultGdprScope" flag and the ability for a publisher to disable enforcement of the `basicAds` TCF purpose. See the [TCF Control Module](/dev-docs/modules/tcfControl.html) documentation for more details. @@ -92,8 +105,8 @@ See the [TCF Control Module](/dev-docs/modules/tcfControl.html) documentation fo Below is a set of recommended best practice starting points for your timeout settings: -* 1,000 milliseconds or less for the internal auction timeout -* 3,000 milliseconds or less for the Prebid tag's overall failsafe timeout +- 1,000 milliseconds or less for the internal auction timeout +- 3,000 milliseconds or less for the Prebid tag's overall failsafe timeout The former setting is used to track the auction once it started; if it expires, we will use whichever bidders have responded and select the winner(s) accordingly. @@ -121,10 +134,10 @@ It can. Versions 1.x of Prebid.js would re-consider previous bids under limited The "limited bid caching" feature applies only: -* for the same AdUnit, -* on the same page view, -* for the same user, and -* up to a certain Time-to-Live (TTL) or until the bid wins and is displayed. +- for the same AdUnit, +- on the same page view, +- for the same user, and +- up to a certain Time-to-Live (TTL) or until the bid wins and is displayed. Since the storage is in the browser, cached bids only apply to a single page context. If the user refreshes the page, the bid is lost. @@ -133,9 +146,9 @@ This setting is called “Time to Live” (TTL), documented in the pbjs.ge Examples of scenarios where a bid may be reconsidered in Prebid.js: -* Auto-refresh: Some pages will reload an AdUnit on a set interval (often 60-240 seconds). Previous bids for that particular AdUnit can be reconsidered for subsequent refreshes of that unit up to the TTL or until they win the unit. -* Infinite scroll: As the user scrolls, the same AdUnit may be dynamically created over and over. The bid can be reconsidered for dynamically-created AdUnits with the same name. Again, the bid is only re-considered on that AdUnit up to the bid TTL or until it's displayed. -* Galleries: Some pages feature carousel-style galleries that contain an AdUnit that refreshes as the user cycles through the content in the gallery. +- Auto-refresh: Some pages will reload an AdUnit on a set interval (often 60-240 seconds). Previous bids for that particular AdUnit can be reconsidered for subsequent refreshes of that unit up to the TTL or until they win the unit. +- Infinite scroll: As the user scrolls, the same AdUnit may be dynamically created over and over. The bid can be reconsidered for dynamically-created AdUnits with the same name. Again, the bid is only re-considered on that AdUnit up to the bid TTL or until it's displayed. +- Galleries: Some pages feature carousel-style galleries that contain an AdUnit that refreshes as the user cycles through the content in the gallery. Here's how it works: @@ -162,13 +175,13 @@ Therefore, it requires Prebid.js to run in a blocking/synchronous fashion. **Thi Here are a couple of alternative workarounds: -* **Option 1:** +- **Option 1:** Load a blocking script that has a load time of 300-500ms. This script does nothing but keep the page waiting. In the meantime Prebid.js can run asynchronously and return the bids. After the blocking script finishes loading, GPT can start synchronously; at this point there will be header bidding bids available. For the best user experience, you probably want to insert this blocking script after the above the fold page content has loaded. Or if you're okay with additional 500ms latency added to your page load time, this can be easily done. -* **Option 2:** +- **Option 2:** Use post-bid. The downsides are that post-bid no longer allows your header bidding partners to compete with Google Ad Manager/AdX, but they can still compete with each other. For more information, see [What is post-bid?]({{site.baseurl}}/overview/what-is-post-bid.html). @@ -209,9 +222,9 @@ what's sent to the ad server with [targetingControls.auctionKeyMaxChars](/dev-do It's technically possible, but we don't recommend doing this: -* The code isn't small. For performance reasons you don't want to run two versions if you can help it -* We don't test concurrent versions -* We won't specifically support debugging problems caused by running two concurrent versions. But will take take PRs if someone finds an issue. +- The code isn't small. For performance reasons you don't want to run two versions if you can help it +- We don't test concurrent versions +- We won't specifically support debugging problems caused by running two concurrent versions. But will take take PRs if someone finds an issue. If all this wasn't enough to warn you away from trying, it should work if you name the PBJS global differently for each instance (Update the value of 'globalVarName' in ) @@ -259,6 +272,6 @@ Sometimes the owner of a bid adapter or other kind of module wants to rename the ## Related Reading -* [Prebid.js Troubleshooting Guide](/troubleshooting/troubleshooting-guide.html) -* [Prebid.js Common Issues](/dev-docs/common-issues.html) -* [Prebid.js issues tagged 'question'](https://github.com/prebid/Prebid.js/issues?utf8=%E2%9C%93&q=is%3Aissue%20label%3Aquestion%20) +- [Prebid.js Troubleshooting Guide](/troubleshooting/troubleshooting-guide.html) +- [Prebid.js Common Issues](/dev-docs/common-issues.html) +- [Prebid.js issues tagged 'question'](https://github.com/prebid/Prebid.js/issues?utf8=%E2%9C%93&q=is%3Aissue%20label%3Aquestion%20) From dfa16686c2b97933f5cf880e788439d3f238e0fb Mon Sep 17 00:00:00 2001 From: xmgiddev <133856186+xmgiddev@users.noreply.github.com> Date: Mon, 1 Jul 2024 17:14:46 +0300 Subject: [PATCH 081/816] MGIDX Adapter: Update (#5404) * native support & some optional params added * native support & some optional params added * native support & some optional params added * make placementId optional * update media types with native support * remove optional placementId from integration code samples * new adapter - MgidX * add new required param - * rem host, add region * del region param * upd * upd * upd * MGIDX Adapter: update --------- Co-authored-by: gaudeamus Co-authored-by: Gaudeamus Co-authored-by: velichkin Co-authored-by: Evgeny Nagorny Co-authored-by: xmgiddev <> --- dev-docs/bidders/mgidX.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/mgidX.md b/dev-docs/bidders/mgidX.md index 93bbca96db..d3388edb5a 100644 --- a/dev-docs/bidders/mgidX.md +++ b/dev-docs/bidders/mgidX.md @@ -3,14 +3,18 @@ layout: bidder title: MgidX description: Prebid MgidX Bidder Adapter biddercode: mgidX -usp_supported: true -gdpr_supported: true +gpp_sids: usstate_all tcfeu_supported: true +usp_supported: true coppa_supported: true schain_supported: true +deals_supported: false floors_supported: true +fpd_supported: false +ortb_blocking_supported: false media_types: banner, video, native multiformat_supported: will-not-bid +userIds: all pbjs: true pbs: true pbs_app_supported: true From 1bbc3acc6dd1bfbc964fe74791d2075fdd46a6b0 Mon Sep 17 00:00:00 2001 From: abazylewicz-id5 <106807984+abazylewicz-id5@users.noreply.github.com> Date: Mon, 1 Jul 2024 16:17:33 +0200 Subject: [PATCH 082/816] ID5 UserId - updated id5.md with eids information (#5440) * ID5 UserId - updated id5.md with eids information * ID5 UserId - fixed id5.md lint * ID5 UserId - added docs for provider param * Update dev-docs/modules/userid-submodules/id5.md Use javascript instead of json for proper formatting --------- Co-authored-by: Muki Seiler --- dev-docs/modules/userid-submodules/id5.md | 66 ++++++++++++++++++++++- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/dev-docs/modules/userid-submodules/id5.md b/dev-docs/modules/userid-submodules/id5.md index e6f65a7bfd..1ab7dc315f 100644 --- a/dev-docs/modules/userid-submodules/id5.md +++ b/dev-docs/modules/userid-submodules/id5.md @@ -35,9 +35,10 @@ The following configuration parameters are available: | params.abTesting.enabled | Optional | Boolean | Set this to `true` to turn on this feature | `true` or `false` | | params.abTesting.controlGroupPct | Optional | Number | Must be a number between `0.0` and `1.0` (inclusive) and is used to determine the percentage of requests that fall into the control group (and thus not exposing the ID5 ID). For example, a value of `0.20` will result in 20% of requests without an ID5 ID and 80% with an ID. | `0.1` | | params.disableExtensions | Optional | Boolean | Set this to `true` to force turn off extensions call. Default `false` | `true` or `false` | +| params.provider | Optional | String | An identifier provided by ID5 to technology partners who manage API deployments on behalf of their clients. Reach out to ID5 if you have questions about this parameter. | `"providerName"` | {: .alert.alert-info :} -**NOTE:** The ID5 ID that is delivered to Prebid will be encrypted by ID5 with a rotating key to avoid unauthorized usage and to enforce privacy requirements. Therefore, we strongly recommend setting `storage.refreshInSeconds` to `8` hours (`8*3600` seconds) or less to ensure all demand partners receive an ID that has been encrypted with the latest key, has up-to-date privacy signals, and allows them to transact against it. +**NOTE:** The ID5 ID that is delivered to Prebid will be encrypted by ID5 with a rotating key to avoid unauthorized usage and to enforce privacy requirements. Therefore, we strongly recommend setting `storage.refreshInSeconds` to `2` hours (`7200` seconds) or less to ensure all demand partners receive an ID that has been encrypted with the latest key, has up-to-date privacy signals, and allows them to transact against it. ### A Note on A/B Testing @@ -70,7 +71,7 @@ pbjs.setConfig({ type: 'html5', // "html5" is the required storage type name: 'id5id', // "id5id" is the required storage name expires: 90, // storage lasts for 90 days - refreshInSeconds: 8*3600 // refresh ID every 8 hours to ensure it's fresh + refreshInSeconds: 7200 // refresh ID every 2 hours to ensure it's fresh } }], auctionDelay: 50 // 50ms maximum auction delay, applies to all userId modules @@ -80,3 +81,64 @@ pbjs.setConfig({ {: .alert.alert-warning :} **ATTENTION:** As of Prebid.js v4.14.0, ID5 requires `storage.type` to be `"html5"` and `storage.name` to be `"id5id"`. Using other values will display a warning today, but in an upcoming release, it will prevent the ID5 module from loading. This change is to ensure the ID5 module in Prebid.js interoperates properly with the [ID5 API](https://github.com/id5io/id5-api.js) and to reduce the size of publishers' first-party cookies that are sent to their web servers. For the same reasons it is very important as of Prebid.js v8.33.0 to provide the `externalModuleUrl` parameter and set it to the latest available module version at `https://cdn.id5-sync.com/api/1.0/id5PrebidModule.js`. If you have any questions, please reach out to us at [prebid@id5.io](mailto:prebid@id5.io). + +### Provided eids +The module provides following eids: + +```javascript +[ + { + source: 'id5-sync.com', + uids: [ + { + id: 'some-random-id-value', + atype: 1, + ext: { + linkType: 2, + abTestingControlGroup: false + } + } + ] + }, + { + source: 'true-link-id5-sync.com', + uids: [ + { + id: 'some-publisher-true-link-id', + atype: 1 + } + ] + }, + { + source: 'uidapi.com', + uids: [ + { + id: 'some-uid2', + atype: 3, + ext: { + provider: 'id5-sync.com' + } + } + ] + } +] +``` + +The id from `id5-sync.com` should be always present (though the id provided will be '0' in case of no consent or optout) + +The id from `true-link-id5-sync.com` will be available if the page is integrated with TrueLink (if you are an ID5 partner you can learn more at [ID5 wiki](https://wiki.id5.io/en/identitycloud/retrieve-id5-ids/true-link-integration)) + +The id from `uidapi.com` will be available if the partner that is used in ID5 user module has the EUID2 integration enabled (it has to be enabled on the ID5 side) + +### Providing TrueLinkId as a Google PPID + +TrueLinkId can be provided as a PPID - to use, it the `true-link-id5-sync.com` needs to be provided as a ppid source in prebid userSync configuration: + +```javascript +pbjs.setConfig({ + userSync: { + ppid: 'true-link-id5-sync.com', + userIds: [], //userIds modules should be configured here + } +}); +``` From c55ca862a4d308c61c1e4fa18d8d1cf30eeab0b1 Mon Sep 17 00:00:00 2001 From: Saar Amrani Date: Mon, 1 Jul 2024 17:20:42 +0300 Subject: [PATCH 083/816] Update Vidazoo bidder documentation (#5346) Added `pbs: true` to bidder functionality and updated the `pId` parameter description in the Vidazoo bidder documentation, specifying its use for pbjs only. --- dev-docs/bidders/vidazoo.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/vidazoo.md b/dev-docs/bidders/vidazoo.md index a058e6d9af..84cca015f8 100644 --- a/dev-docs/bidders/vidazoo.md +++ b/dev-docs/bidders/vidazoo.md @@ -10,6 +10,7 @@ tcfeu_supported: true gpp_supported: true usp_supported: true pbjs: true +pbs: true sidebarType: 1 --- @@ -19,6 +20,6 @@ sidebarType: 1 | Name | Scope | Description | Example | Type | |------------|----------|------------------------------------------------------------------------------------------|------------------------------|----------| | `cId` | required | The connection ID from Vidazoo. | `'562524b21b1c1f08117fc7f9'` | `string` | -| `pId` | required | The publisher ID from Vidazoo. | `'59ac17c192832d0011283fe3'` | `string` | +| `pId` | required | The publisher ID from Vidazoo (pbjs only). | `'59ac17c192832d0011283fe3'` | `string` | | `bidFloor` | optional | The minimum bid value desired. Vidazoo will not respond with bids lower than this value. | `0.90` | `float` | | `subDomain`| optional | Sets the server subdomain, default: 'prebid'. | `'prebid'` | `string` | From f62f55c00420b7e6211d51fcc7b319c297d84087 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleksandr=20=C5=A0t=C5=A1epelin?= Date: Mon, 1 Jul 2024 17:21:13 +0300 Subject: [PATCH 084/816] Update cointraffic.md (#5323) --- dev-docs/bidders/cointraffic.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/cointraffic.md b/dev-docs/bidders/cointraffic.md index 336d71f251..e97e89fdf6 100644 --- a/dev-docs/bidders/cointraffic.md +++ b/dev-docs/bidders/cointraffic.md @@ -3,6 +3,7 @@ layout: bidder title: Cointraffic description: Prebid Cointraffic Bidder Adaptor pbjs: true +pbs: true biddercode: cointraffic sidebarType: 1 --- From 27592aa80dfd8c050425fe8b74b000046939c4bd Mon Sep 17 00:00:00 2001 From: BizzClick <73241175+BizzClick@users.noreply.github.com> Date: Mon, 1 Jul 2024 18:31:23 +0300 Subject: [PATCH 085/816] update blasto pbs doc, remove deprecared params (#5466) --- dev-docs/bidders/blasto.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/dev-docs/bidders/blasto.md b/dev-docs/bidders/blasto.md index 215257b2e9..cda556c3a6 100644 --- a/dev-docs/bidders/blasto.md +++ b/dev-docs/bidders/blasto.md @@ -25,17 +25,18 @@ userIds: all ### Note -The Example Bidding adapter requires setup before beginning. Please contact us at . Blasto will only respond to the first impression and that multiple ad formats of that single impression are not supported. +The Example Bidding adapter requires setup before beginning. Please contact us at . +Blasto will only respond to the first impression. -### Bid Params for Prebid Server and Prebid Mobile +### Bid Params for Prebid Server +Blasto supports diffrent regions for the prebid server. By default US East. +Please deploy the prebid config in each of your datacenters with the appropriate regional subdomain. {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |---------------|----------|-----------------------|-----------|-----------| | `sourceId` | required | Unique hash provided by blasto | `'6dllcEHSxYdSb6yLmCqE'` | `string` | | `accountId` | required | Unique name provided by blasto | `'blasto-test'` | `string` | -| `host` | optional | Blasto server region. US East by default | `'us-e-node1'` | `string` | -| `placementId` | required | Deprecated parameter. Please use sourceId instead |`'6dllcEHSxYdSb6yLmCqE'`|`string` | ### Bid Params for Prebid.js From a28786a93de844458066cd6614bb038d1a32dc65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zdravko=20Kosanovi=C4=87?= <41286499+zkosanovic@users.noreply.github.com> Date: Mon, 1 Jul 2024 17:49:20 +0200 Subject: [PATCH 086/816] Openweb adapter: PBS supported (#5468) --- dev-docs/bidders/openweb.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/openweb.md b/dev-docs/bidders/openweb.md index 59c7e50ab1..8f0554cfe7 100644 --- a/dev-docs/bidders/openweb.md +++ b/dev-docs/bidders/openweb.md @@ -13,7 +13,7 @@ gpp_supported: true gpp_sids: tcfeu, usstate_all, usp usp_supported: true safeframes_ok: false -pbs: false +pbs: true floors_supported: true userIds: all fpd_supported: true From 0e41c85e3f97ef75c67518e1b9b00614247620f7 Mon Sep 17 00:00:00 2001 From: DimaIntentIQ <139111483+DimaIntentIQ@users.noreply.github.com> Date: Wed, 3 Jul 2024 00:11:31 +0300 Subject: [PATCH 087/816] Update documentation (#5461) --- .../modules/userid-submodules/intentiq.md | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/dev-docs/modules/userid-submodules/intentiq.md b/dev-docs/modules/userid-submodules/intentiq.md index e99228ef2a..d6540a0326 100644 --- a/dev-docs/modules/userid-submodules/intentiq.md +++ b/dev-docs/modules/userid-submodules/intentiq.md @@ -31,15 +31,16 @@ Please find below list of parameters that could be used in configuring Intent IQ {: .table .table-bordered .table-striped } -| 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"` | -| params.enableCookieStorage | Optional | Boolean | This is a parameter allowing to enable or disable cookie storage. Defaults to false. | `"true"` | +| 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.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.callback | Required | Function | This is a callback which is trigered with data and AB group | `(data, group) => console.log({ data, group })` | +| params.timeoutInMillis | Optional | Number | This is the timeout in milliseconds, which defines the maximum duration before the callback is triggered. The default value is 500. | `450` | +| params.browserBlackList | Optional |  String | This is the name of a browser that can be added to a blacklist. | `"chrome"` | ### Configuration example @@ -51,14 +52,13 @@ pbjs.setConfig({ name: "intentIqId", params: { partner: 123456, // valid partner id - percentage: 95, - enableCookieStorage: true + callback: (data, group) => window.pbjs.requestBids(), }, 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 + expires: 0, + refreshInSeconds: 0, }, }, ], @@ -76,13 +76,14 @@ 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, - enableCookieStorage: false + timeoutInMillis: 500, + browserBlackList: "chrome", + callback: (data, group) => window.pbjs.requestBids() }, storage: { type: "html5", name: "intentIqId", // set localstorage with this name - expires: 60 + expires: 0 } }], syncDelay: 3000 From 4183fc2956dd04e4532d622b59732649cc266eef Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Wed, 3 Jul 2024 12:19:57 -0700 Subject: [PATCH 088/816] Update load-cookie documentation (#5193) * Update load-cookie documentation * wordsmithing * lint * lint * lint * changing alert from April to May * adding the load-cookie update to the amp reference * lint * fix highlighting * fixed highlighting --------- Co-authored-by: bretg --- dev-docs/show-prebid-ads-on-amp-pages.md | 111 ++++++++-------- prebid-server/developers/pbs-cookie-sync.md | 139 +++++++++++--------- 2 files changed, 129 insertions(+), 121 deletions(-) diff --git a/dev-docs/show-prebid-ads-on-amp-pages.md b/dev-docs/show-prebid-ads-on-amp-pages.md index 555b42648b..b9244d2611 100644 --- a/dev-docs/show-prebid-ads-on-amp-pages.md +++ b/dev-docs/show-prebid-ads-on-amp-pages.md @@ -6,7 +6,6 @@ sidebarType: 2 --- # Prebid AMP Implementation Guide - {: .no_toc} This page has instructions for showing ads on Accelerated Mobile Pages (AMP) using Prebid.js. @@ -15,11 +14,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). @@ -27,25 +26,25 @@ For ad ops setup instructions, see [Google Ad Manager with Prebid Step by Step]( {% include alerts/alert_note.html content=tipNote %} -* TOC +- TOC {:toc } ## Prerequisites 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 @@ -54,12 +53,12 @@ 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 +- 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 { @@ -129,10 +128,10 @@ This script provides code libraries that will convert `` properties to t 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: @@ -222,15 +221,15 @@ Replace `MACRO` in the preceding example with the appropriate macro for the ad s ### User Sync -To sync user IDs with Prebid Server, the `amp-iframe` below may be added to your AMP pages referring to `load-cookie.html` or if you're running an IAB-compliant AMP CMP you can use `load-cookie-with-consent.html`. +To sync user IDs with Prebid Server, the `amp-iframe` below may be added to your AMP pages referring to `load-cookie.html`. -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. +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/) +- The `sandbox` parameter to the amp-iframe must include both "allow-scripts" and "allow-same-origin". +- If your PBS host company is using a version of `load-cookie.html` older than July of 2024 and if your AMP page is using a CMP, you should consider using `load-cookie-with-consent.html` instead. It's the same functionality, but older versions of `load-cookie.html` cannot read from CMPs. If you're using AppNexus' managed service, you would enter something like this: @@ -268,44 +267,44 @@ Or you can specify a full URL to another Prebid Server location (including a QA ``` -See [manually initiating a sync](/prebid-server/developers/pbs-cookie-sync.html#manually-initiating-a-sync) for more information about the available parameters. +See [manually initiating a sync](/prebid-server/developers/pbs-cookie-sync.html#manually-initiating-a-sync) for more information about the available parameters and for how to host the load-cookie script. ### AMP RTC If you're using a custom RTC callout rather than one of the pre-defined [vendor callouts](https://github.com/ampproject/amphtml/blob/main/src/service/real-time-config/callout-vendors.js), here are the parameters that can be passed through the RTC string: -* tag_id (this correspondes to the Prebid Server stored request ID) -* w=ATTR(width) -* h=ATTR(height) -* ow=ATTR(data-override-width) -* oh=ATTR(data-override-height) -* ms=ATTR(data-multi-size) -* slot=ATTR(data-slot) -* targeting=TGT -* curl=CANONICAL_URL -* timeout=TIMEOUT -* adc=ADCID -* purl=HREF -* gdpr_consent=CONSENT_STRING -* consent_type=CONSENT_METADATA(consentStringType) -* gdpr_applies=CONSENT_METADATA(gdprApplies) -* attl_consent=CONSENT_METADATA(additionalConsent) +- tag_id (this correspondes to the Prebid Server stored request ID) +- w=ATTR(width) +- h=ATTR(height) +- ow=ATTR(data-override-width) +- oh=ATTR(data-override-height) +- ms=ATTR(data-multi-size) +- slot=ATTR(data-slot) +- targeting=TGT +- curl=CANONICAL_URL +- timeout=TIMEOUT +- adc=ADCID +- purl=HREF +- gdpr_consent=CONSENT_STRING +- consent_type=CONSENT_METADATA(consentStringType) +- gdpr_applies=CONSENT_METADATA(gdprApplies) +- attl_consent=CONSENT_METADATA(additionalConsent) ## Debugging Tips To review that Prebid on AMP is working properly the following aspects can be looked at: -* Include `#development=1` to the URL to review AMP specifc debug messages in the browser console. -* Look for the Prebid server call in the network panel. You can open this URL in a new tab to view additional debugging information relating to the Prebid Server Stored Bid Request. If working properly, Prebid server will display the targeting JSON for AMP to use. -* Look for the network call from the Ad Server to ensure that key values are being passed. (For Google Ad Manager these are in the `scp` query string parameter in the network request) -* Most of the debugging information is omitted from the Prebid Server response unless the `debug=1` parameter is present in the Prebid Server query string. AMP won't add this parameter, so you'll need to grab the Prebid Server URL and manually add it to see the additional information provided. +- Include `#development=1` to the URL to review AMP specifc debug messages in the browser console. +- Look for the Prebid server call in the network panel. You can open this URL in a new tab to view additional debugging information relating to the Prebid Server Stored Bid Request. If working properly, Prebid server will display the targeting JSON for AMP to use. +- Look for the network call from the Ad Server to ensure that key values are being passed. (For Google Ad Manager these are in the `scp` query string parameter in the network request) +- Most of the debugging information is omitted from the Prebid Server response unless the `debug=1` parameter is present in the Prebid Server query string. AMP won't add this parameter, so you'll need to grab the Prebid Server URL and manually add it to see the additional information provided. ## Further Reading -* [Prebid Server and AMP](/prebid-server/use-cases/pbs-amp.html) -* [Google Ad Manager with Prebid Step by Step](/adops/step-by-step.html) (Ad Ops Setup) -* [AMP RTC Overview](https://github.com/ampproject/amphtml/blob/master/extensions/amp-a4a/rtc-documentation.md) -* [callout-vendors.js] +- [Prebid Server and AMP](/prebid-server/use-cases/pbs-amp.html) +- [Google Ad Manager with Prebid Step by Step](/adops/step-by-step.html) (Ad Ops Setup) +- [AMP RTC Overview](https://github.com/ampproject/amphtml/blob/master/extensions/amp-a4a/rtc-documentation.md) +- [callout-vendors.js] diff --git a/prebid-server/developers/pbs-cookie-sync.md b/prebid-server/developers/pbs-cookie-sync.md index 96bcb5e483..fa178b4be4 100644 --- a/prebid-server/developers/pbs-cookie-sync.md +++ b/prebid-server/developers/pbs-cookie-sync.md @@ -33,73 +33,116 @@ Here's how these IDs get placed in the cookie from Prebid.js: ![Prebid Server Cookie Sync](/assets/images/prebid-server/pbs-cookie-sync.png){:class="pb-lg-img"} -1. Prebid.js starts by calling the Prebid Server [`/cookie_sync`](/prebid-server/endpoints/pbs-endpoint-cookieSync.html), letting it know which server-side bidders will be participating in the header bidding auction. +1. When the [s2sConfig](/dev-docs/modules/prebidServer.html) is set, Prebid.js initiates a call to the Prebid Server [`/cookie_sync`](/prebid-server/endpoints/pbs-endpoint-cookieSync.html), letting it know which server-side bidders will be participating in the header bidding auction. - ```text +```text POST https://prebid-server.example.com/cookie_sync {"bidders":["bidderA","bidderB"], "gdpr":1, "gdpr_consent":"...", "us_privacy": "..."} - ``` +``` +{:start="2"} 2. If privacy regulations allow, Prebid Server will look at the `uids` cookie in the host domain and determine whether any bidders are missing or need to be refreshed. It responds with an array of pixel syncs. e.g. - ```javascript +```javascript {"status":"ok","bidder_status":[{"bidder":"bidderA","no_cookie":true,"usersync":{"url":"//biddera.com/getuid?https%3A%2F%2Fprebid-server.example.com%2Fsetuid%3Fbidder%3DbidderA%26gdpr%3D%26gdpr_consent%3D%26us_privacy%3D%26uid%3D%24UID","type":"redirect","supportCORS":false}},{"bidder":"bidderB","no_cookie":true,"usersync":{"url":"https://bidderB.com/u/match?gdpr=&euconsent=&us_privacy=&redir=https%3A%2F%2Fprebid-server.example.com%2Fsetuid%3Fbidder%3DbidderB%26gdpr%3D%26gdpr_consent%3D%26us_privacy%3D%26uid%3D","type":"redirect","supportCORS":false}}]} - ``` +``` -3. When it receives the response, Prebid.js loops through each element of `bidder_status[]`, dropping a pixel for each `bidder_status[].usersync.url`. +{:start="3"} +3. When it receives the response, Prebid.js loops through each element of `bidder_status[]`, creating a pixel for each `bidder_status[].usersync.url`. +{:start="4"} 4. The bidder-specific endpoints read the users' cookie for the bidder's domain and respond with a redirect back to Prebid Server's [`/setuid` endpoint](/prebid-server/endpoints/pbs-endpoint-setuid.html) . This allows that endpoint to read the 3rd party cookie and reflect it back to Prebid Server. Note that if this user doesn't yet have an ID in that 3rd party domain, the sync endpoint is expected to create one. +{:start="5"} 5. When the browser receives this redirect, it contacts Prebid Server, which will once again check the privacy settings and if allowed, update the `uids` cookie. -### Setting the uids cookie from AMP +### Cooperative Syncing + +Prebid Server supports a 'Cooperative Syncing' mode where all enabled bidders may be returned in a sync request even if they aren't on this particular page. This allows bidders to get their IDs in place for the next page where they are utilized. + +Cooperative sync defaults can be configured at the host and account level. See the docs for [PBS-Java](https://github.com/prebid/prebid-server-java/blob/master/docs/config-app.md) and [PBS-Go](https://github.com/prebid/prebid-server/blob/master/config/usersync.go). + +This is how to control the coop syncing behavior from Prebid.js: + +```javascript + pbjs.setConfig({ + s2sConfig: { + ... + coopSync: true, + userSyncLimit: 5 + ... + } + }); +``` + +### Manually initiating a sync -Cookie sync for AMP works in a way quite similar to Prebid.js. +Where Prebid.js isn't present, like on [AMP](/prebid-server/use-cases/pbs-amp.html) pages, the call to [/cookie_sync](/endpoints/pbs-endpoint-cookieSync.html) doesn't happen automatically. +If there are scenarios where Prebid.js isn't around to initiate the /cookie_sync call, publishers can choose to put an iframe on their page. + +This approach works in a way quite similar to Prebid.js except that the [/cookie_sync endpoint](/endpoints/pbs-endpoint-cookieSync.html) is initiated by a separate script that's part of `load-cookie.html'. This file must be placed on a CDN by the publisher's Prebid Server host company. Up until July 2024, the script existed in the [Prebid Universal Creative](https://github.com/prebid/prebid-universal-creative) repository, but has since been moved to the [user-sync](https://github.com/prebid/user-sync) repo. -1. The Prebid Server hosting company places the [load-cookie.html](#manually-initiating-a-sync) file onto a CDN. This script is part of the [Prebid Universal Creative](https://github.com/prebid/prebid-universal-creative/blob/master/src/cookieSync.js) repo. +1. The Prebid Server hosting company places the [load-cookie.html](#manually-initiating-a-sync) file onto a CDN. See [the AMP implementation guide](/dev-docs/show-prebid-ads-on-amp-pages.html#user-sync) for more information. -2. The publisher places the 'load-cookie' iframe into the page: +2. The publisher places a 'load-cookie' iframe into the page: - ```html +For AMP pages: + +```html + src="https://HOST/load-cookie.html?source=amp&endpoint=PBSHOST&max_sync_count=5"> - ``` +``` - {: .alert.alert-info :} - If the publisher has an AMP Consent Management Platform, they should use `load-cookie-with-consent.html`. +On regular web pages: -3. At runtime, the `load-cookie` script just calls the Prebid Server /cookie_sync endpoint. The rest works similar to what's described for Prebid.js above. One difference is that the bidders are not known on the AMP page so those aren't passed. Another difference is that AMP doesn't support iframe syncs, so load-cookie passes instructions to PBS so only pixel syncs are returned. +```html + +
+ {{ content }} +
diff --git a/dev-docs/examples/adunit-refresh.md b/dev-docs/examples/adunit-refresh.md index 4948da6ff5..e79b28718c 100644 --- a/dev-docs/examples/adunit-refresh.md +++ b/dev-docs/examples/adunit-refresh.md @@ -9,9 +9,74 @@ about: - Demonstrates the ability to refresh individual ad units. This is useful for infinite scrolling ad slots. - Keep in mind that 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. See Auction Options for more info. -jsfiddle_link: jsfiddle.net/Prebid_Examples/cu7tpexf/embedded/html,result - -code_height: 1540 pid: 20 --- + +## Individual Ad Unit Refresh / Infinite Scroll + +{% capture htmlCodePrebid %}
Div-1
+ +
+ +
+{% endcapture %} + +{% capture jsCode %}var sizes = [ + [300, 250] +]; +var PREBID_TIMEOUT = 1000; + +var googletag = googletag || {}; +googletag.cmd = googletag.cmd || []; + +var pbjs = pbjs || {}; +pbjs.que = pbjs.que || []; + +var adUnits = [{ + code: '/19968336/header-bid-tag-0', + mediaTypes: { + banner: { + sizes: sizes + } + }, + bids: [{ + bidder: 'appnexus', + params: { + placementId: 13144370 + } + }] +}]; + +pbjs.que.push(function() { + pbjs.addAdUnits(adUnits); +}); + +var slot1; +googletag.cmd.push(function() { + slot1 = googletag.defineSlot('/19968336/header-bid-tag-0', [[300, 250]], 'div-1') + .addService(googletag.pubads()); + googletag.pubads().disableInitialLoad(); + googletag.pubads().enableSingleRequest(); + googletag.enableServices(); +}); + +function refreshBid() { + pbjs.que.push(function() { + pbjs.requestBids({ + timeout: PREBID_TIMEOUT, + adUnitCodes: ['/19968336/header-bid-tag-0'], + bidsBackHandler: function() { + pbjs.setTargetingForGPTAsync(['/19968336/header-bid-tag-0']); + googletag.pubads().refresh([slot1]); + } + }); + }); +} +{% endcapture %} + +{% include code/web-example.html id="basic-prebid-example" html=htmlCodePrebid js=jsCode %} diff --git a/dev-docs/examples/basic-example.md b/dev-docs/examples/basic-example.md index c0690ec44e..6ee2ec1203 100644 --- a/dev-docs/examples/basic-example.md +++ b/dev-docs/examples/basic-example.md @@ -11,9 +11,77 @@ about: - Default keyword targeting setup (reference) - Default price granularity -jsfiddle_link: jsfiddle.net/Prebid_Examples/94jt62b8/embedded/html,result - -code_height: 2300 - pid: 10 --- + +## Basic Prebid.js Example + +{% capture htmlCodePrebid %}
Div-1
+
+ +
+{% endcapture %} + +{% capture jsCode %}var sizes = [ + [300, 250] +]; +var PREBID_TIMEOUT = 700; + +var adUnits = [{ + code: '/19968336/header-bid-tag-1', + mediaTypes: { + banner: { + sizes: sizes + } + }, + bids: [{ + bidder: 'appnexus', + params: { + placementId: 13144370 + } + }] +}]; + +// ======== DO NOT EDIT BELOW THIS LINE =========== // +var googletag = googletag || {}; +googletag.cmd = googletag.cmd || []; +googletag.cmd.push(function() { + googletag.pubads().disableInitialLoad(); +}); + +var pbjs = pbjs || {}; +pbjs.que = pbjs.que || []; + +pbjs.que.push(function() { + pbjs.addAdUnits(adUnits); + pbjs.requestBids({ + bidsBackHandler: initAdserver + }); +}); + +function initAdserver() { + if (pbjs.initAdserverSet) return; + pbjs.initAdserverSet = true; + googletag.cmd.push(function() { + pbjs.setTargetingForGPTAsync && pbjs.setTargetingForGPTAsync(); + googletag.pubads().refresh(); + }); +} + +setTimeout(function() { + initAdserver(); +}, PREBID_TIMEOUT); + +googletag.cmd.push(function() { + googletag.defineSlot('/19968336/header-bid-tag-1', sizes, 'div-1') + .addService(googletag.pubads()); + googletag.pubads().enableSingleRequest(); + googletag.enableServices(); +}); +{% endcapture %} + +{% include code/web-example.html id="basic-prebid-example" html=htmlCodePrebid js=jsCode scripts="pbjs,gpt" %} diff --git a/dev-docs/examples/custom-price-buckets.md b/dev-docs/examples/custom-price-buckets.md index 99bb9da56b..7990cfb310 100644 --- a/dev-docs/examples/custom-price-buckets.md +++ b/dev-docs/examples/custom-price-buckets.md @@ -9,8 +9,111 @@ about: - This example shows custom price granularity buckets using pbjs.setConfig(). - See the API reference for more detail. -jsfiddle_link: jsfiddle.net/Prebid_Examples/vq05dhnj/embedded/html,result +--- -code_height: 2152 +## Custom Price Granularity Buckets ---- +{% capture htmlCodePrebid %}
Div-1
+
+ +
+{% endcapture %} + +{% capture jsCode %}var sizes = [ + [300, 250] +]; +var PREBID_TIMEOUT = 1000; +var FAILSAFE_TIMEOUT = 3000; + +var adUnits = [{ + code: '/19968336/header-bid-tag-1', + mediaTypes: { + banner: { + sizes: sizes + } + }, + bids: [{ + bidder: 'appnexus', + params: { + placementId: 13144370 + } + }] +}]; + +const customConfigObject = { + "buckets": [ + { + "precision": 2, //default is 2 if omitted - means 2.1234 rounded to 2 decimal places = 2.12 + "min": 0, + "max": 5, + "increment": 0.01 + }, + { + "precision": 2, + "min": 5, + "max": 8, + "increment": 0.05 + }, + { + "precision": 2, + "min": 8, + "max": 20, + "increment": 0.5 + }, + { + "precision": 2, + "min": 21, + "max": 99, + "increment": 1.00 + } + ] +}; + +var googletag = googletag || {}; +googletag.cmd = googletag.cmd || []; +googletag.cmd.push(function() { + googletag.pubads().disableInitialLoad(); +}); + +var pbjs = pbjs || {}; +pbjs.que = pbjs.que || []; + +pbjs.que.push(function() { + pbjs.addAdUnits(adUnits); + pbjs.setConfig({ + priceGranularity: customConfigObject + }); + pbjs.requestBids({ + bidsBackHandler: initAdserver, + timeout: PREBID_TIMEOUT + }); +}); + +function initAdserver() { + if (pbjs.initAdserverSet) return; + pbjs.initAdserverSet = true; + googletag.cmd.push(function() { + pbjs.que.push(function() { + pbjs.setTargetingForGPTAsync(); + googletag.pubads().refresh(); + }); + }); +} + +// in case PBJS doesn't load +setTimeout(function() { + initAdserver(); +}, FAILSAFE_TIMEOUT); + +googletag.cmd.push(function() { + googletag.defineSlot('/19968336/header-bid-tag-1', sizes, 'div-1').addService(googletag.pubads()); + googletag.pubads().enableSingleRequest(); + googletag.enableServices(); +}); +{% endcapture %} + +{% include code/web-example.html id="basic-prebid-example" html=htmlCodePrebid js=jsCode %} diff --git a/dev-docs/examples/instream-banner-mix.md b/dev-docs/examples/instream-banner-mix.md index 0394bafa15..4c6c2bab5f 100644 --- a/dev-docs/examples/instream-banner-mix.md +++ b/dev-docs/examples/instream-banner-mix.md @@ -8,8 +8,212 @@ sidebarType: 1 about: - This example shows how to display instream video and banner ads within the same configuration. -jsfiddle_link: jsfiddle.net/Prebid_Examples/nowfejh7/embedded/html,result/ +--- + +## Instream Video and Banner Ad Mixed Page -code_height: 3050 +{% capture htmlCodePrebid %}

Prebid Video - JW Platform

+
+ + + + + + + +

Basic Prebid.js Example

+
Div-1
+
+ +
+ +
Div-2
+
+ +
+{% endcapture %} + +{% capture jsCode %}var div_1_sizes = [ + [300, 250], + [300, 600] +]; +var div_2_sizes = [ + [728, 90], + [970, 250] +]; +var PREBID_TIMEOUT = 1000; +var FAILSAFE_TIMEOUT = 3000; + +var adUnits = [ + { + code: '/19968336/header-bid-tag-0', + mediaTypes: { + banner: { + sizes: div_1_sizes + } + }, + bids: [{ + bidder: 'appnexus', + params: { + placementId: 13144370 + } + }] + }, + { + code: '/19968336/header-bid-tag-1', + mediaTypes: { + banner: { + sizes: div_2_sizes + } + }, + bids: [{ + bidder: 'appnexus', + params: { + placementId: 13144370 + } + }] + } +]; + +var videoAdUnit = { + code: 'video1', + mediaTypes: { + video: { + playerSize: [640, 480], + context: 'instream', + plcmt: 2, + } + }, + bids: [{ + bidder: 'appnexus', + params: { + placementId: 13232361, // Add your own placement id here + video: { + skipppable: true, + playback_method: ['auto_play_sound_off'] + } + } + }] +}; + +var googletag = googletag || {}; +googletag.cmd = googletag.cmd || []; +googletag.cmd.push(function() { + googletag.pubads().disableInitialLoad(); +}); + +// Init Prebid.js +var pbjs = pbjs || {}; +pbjs.que = pbjs.que || []; + +// define invokeVideoPlayer in advance in case we get the bids back from prebid before the entire page loads +var tempTag = false; +var invokeVideoPlayer = function(url) { + tempTag = url; +}; + +pbjs.que.push(function() { + pbjs.addAdUnits(adUnits); + pbjs.addAdUnits(videoAdUnit); + pbjs.setConfig({ + debug: true, + cache: { + url: '' + } + }); + pbjs.requestBids({ + bidsBackHandler: initAdserver, + timeout: PREBID_TIMEOUT, + auctionId: 'auction_1' + }) +}); + +function initAdserver(bids) { + + if (pbjs.initAdserverSet) return; + pbjs.initAdserverSet = true; + + // Get all of the adUnit codes for the display adUnits + var displayAdUnitCodes = []; + adUnits.forEach(function(adUnit) { + displayAdUnitCodes.push(adUnit.code); + }); + + // Set targeting for each display slot + googletag.cmd.push(function() { + pbjs.que.push(function() { + pbjs.setTargetingForGPTAsync(displayAdUnitCodes); + googletag.pubads().refresh(); + }); + }); + + // Build DFP URL with targeting for videoAdUnit + var videoUrl = pbjs.adServers.dfp.buildVideoUrl({ + adUnit: videoAdUnit, + params: { + iu: '/19968336/prebid_cache_video_adunit', + cust_params: { + section: 'blog', + anotherKey: 'anotherValue' + }, + output: 'vast' + } + }); + + // Pass URL to Video player to make final DFP call + invokeVideoPlayer(videoUrl); +} +// in case PBJS doesn't load +setTimeout(function() { + initAdserver(); +}, FAILSAFE_TIMEOUT); + +googletag.cmd.push(function() { + googletag.defineSlot('/19968336/header-bid-tag-0', div_1_sizes, 'div-1').addService(googletag.pubads()); + googletag.pubads().enableSingleRequest(); + googletag.enableServices(); +}); +googletag.cmd.push(function() { + googletag.defineSlot('/19968336/header-bid-tag-1', div_2_sizes, 'div-2').addService(googletag.pubads()); + googletag.pubads().enableSingleRequest(); + googletag.enableServices(); +}); +{% endcapture %} + +{% include code/web-example.html id="basic-prebid-example" html=htmlCodePrebid js=jsCode %} diff --git a/dev-docs/examples/meta-bid-filtering.md b/dev-docs/examples/meta-bid-filtering.md index f31e6bcd0c..d2b8225b66 100644 --- a/dev-docs/examples/meta-bid-filtering.md +++ b/dev-docs/examples/meta-bid-filtering.md @@ -9,7 +9,98 @@ about: - This is an example that filters bid responses based on the metadata object. - Bidders can supply metadata about the bid such as advertiser domain. See the "meta" fields in the bid response for the full list of metadata. -jsfiddle_link: jsfiddle.net/Prebid_Examples/0s4eug1d/embedded/html,result - -code_height: 2300 --- + +## Meta Bid Filtering + +{% capture htmlCodePrebid %}
Div-1
+
+ +
+{% endcapture %} + +{% capture jsCode %}var sizes = [ + [300, 250] +]; +var PREBID_TIMEOUT = 1000; +var FAILSAFE_TIMEOUT = 3000; + +var adUnits = [{ + code: '/19968336/header-bid-tag-1', + mediaTypes: { + banner: { + sizes: sizes + } + }, + bids: [{ + bidder: 'appnexus', + params: { + placementId: 13144370 + }, + + }] +}]; + +// ======== DO NOT EDIT BELOW THIS LINE =========== // +var googletag = googletag || {}; +googletag.cmd = googletag.cmd || []; +googletag.cmd.push(function() { + googletag.pubads().disableInitialLoad(); +}); + +var pbjs = pbjs || {}; +pbjs.que = pbjs.que || []; + +pbjs.que.push(function() { + pbjs.addAdUnits(adUnits); + pbjs.requestBids({ + bidsBackHandler: (bids) => { + // loop through ad units + Object.entries(bids).forEach(([adUnit, bids]) => { + // invalidate blocked ads + bids.forEach(bid => { + if (isBlockedAd(bid.meta)) { + pbjs.markWinningBidAsUsed({ adId: bid.adId }); + } + }) + }) + initAdserver() + }, + timeout: PREBID_TIMEOUT + }); +}); + +function initAdserver() { + if (pbjs.initAdserverSet) return; + pbjs.initAdserverSet = true; + googletag.cmd.push(function() { + pbjs.setTargetingForGPTAsync && pbjs.setTargetingForGPTAsync(); + googletag.pubads().refresh(); + }); +} + +// function for filtering logic or checking if bid.meta has a specific property +function isBlockedAd(metaObject){ + // example that checks if advertiserDomain exists + // metaObject.hasOwnProperty("advertiserDomain") + +} + +// in case PBJS doesn't load +setTimeout(function() { + initAdserver(); +}, FAILSAFE_TIMEOUT); + +googletag.cmd.push(function() { + googletag.defineSlot('/19968336/header-bid-tag-1', sizes, 'div-1') + .addService(googletag.pubads()); + googletag.pubads().enableSingleRequest(); + googletag.enableServices(); +}); +{% endcapture %} + +{% include code/web-example.html id="basic-prebid-example" html=htmlCodePrebid js=jsCode %} diff --git a/dev-docs/examples/multi-format-example.md b/dev-docs/examples/multi-format-example.md index 781c7bf5c9..099211aa33 100644 --- a/dev-docs/examples/multi-format-example.md +++ b/dev-docs/examples/multi-format-example.md @@ -11,8 +11,148 @@ about: - For engineering setup instructions, see Show Multi-Format Ads - For ad ops setup instructions, see Google Ad Manager with Prebid Step by Step -jsfiddle_link: jsfiddle.net/Prebid_Examples/yxsgcj71/embedded/html,result +--- -code_height: 3050 +## Basic Prebid.js Example ---- +{% capture htmlCodePrebid %}

div-banner-native-1

+
+

No response

+ +
+ +

div-banner-native-2

+
+

No response

+ +
+{% endcapture %} + +{% capture jsCode %}var PREBID_TIMEOUT = 1000; +var FAILSAFE_TIMEOUT = 3000; + +var googletag = googletag || {}; +googletag.cmd = googletag.cmd || []; + +var pbjs = pbjs || {}; +pbjs.que = pbjs.que || []; + +function initAdserver() { + if (pbjs.initAdserverSet) return; + + googletag.cmd.push(function() { + pbjs.que.push(function() { + pbjs.setTargetingForGPTAsync(); + googletag.pubads().refresh(); + }); + }); + + pbjs.initAdserverSet = true; +} + +pbjs.que.push(function() { + var adUnits = [{ + code: 'div-banner-native-1', + mediaTypes: { + banner: { + sizes: [ + [300, 250] + ] + }, + native: { + type: 'image' + }, + }, + bids: [{ + bidder: 'appnexus', + params: { + placementId: 13232392, + } + }] + }, + { + code: 'div-banner-native-2', + mediaTypes: { + banner: { + sizes: [ + [300, 250] + ] + }, + native: { + title: { + required: true + }, + image: { + required: true + }, + sponsoredBy: { + required: true + } + } + }, + bids: [{ + bidder: 'appnexus', + params: { + placementId: 13232392, + } + }] + } + ]; + + pbjs.setConfig({ + debug: true, + cache: { + url: false + }, + }); + + pbjs.addAdUnits(adUnits); + pbjs.requestBids({ + timeout: PREBID_TIMEOUT, + bidsBackHandler: function(bidResponses) { + initAdserver(); + } + }); +}); + +// in case PBJS doesn't load +setTimeout(initAdserver, FAILSAFE_TIMEOUT); + +googletag.cmd.push(function() { + googletag + .defineSlot( + '/19968336/prebid_multiformat_test', [ + [300, 250], + [360, 360] + ], + 'div-banner-native-1' + ) + .addService(googletag.pubads()); + + googletag + .defineSlot( + '/19968336/prebid_multiformat_test', [ + [300, 250], + [360, 360] + ], + 'div-banner-native-2' + ) + .addService(googletag.pubads()); + + googletag.pubads().disableInitialLoad(); + googletag.pubads().enableSingleRequest(); + googletag.enableServices(); +}); +{% endcapture %} + +{% include code/web-example.html id="basic-prebid-example" html=htmlCodePrebid js=jsCode %} diff --git a/dev-docs/examples/native-ad-example.md b/dev-docs/examples/native-ad-example.md index 63eca29a7d..79d01f6759 100644 --- a/dev-docs/examples/native-ad-example.md +++ b/dev-docs/examples/native-ad-example.md @@ -10,8 +10,145 @@ about: - For engineering setup instructions, see Show Native Ads - For ad ops setup instructions, see GAM Step by Step - Native Creatives -jsfiddle_link: jsfiddle.net/Prebid_Examples/s5L7p3yd/embedded/html,result/ +--- -code_height: 3050 +## Native Ad Unit ---- +{% capture htmlCodePrebid %}
+

No response

+ +
+ +
+

No response

+ +
+{% endcapture %} + +{% capture jsCode %} var googletag = googletag || {}; +googletag.cmd = googletag.cmd || []; + +var pbjs = pbjs || {}; +pbjs.que = pbjs.que || []; +var PREBID_TIMEOUT = 3000; + +var date = new Date().getTime(); + +function initAdserver() { + if (pbjs.initAdserverSet) return; + + googletag.cmd.push(function() { + pbjs.que.push(function() { + pbjs.setTargetingForGPTAsync(); + googletag.pubads().refresh(); + }); + }); + + pbjs.initAdserverSet = true; +} + +// Load GPT when timeout is reached. +setTimeout(initAdserver, PREBID_TIMEOUT); + +pbjs.que.push(function() { + + pbjs.setConfig({ + debug: true + }); + + var allSlotsBidWon = function allSlotsBidWon() { + console.log('allSlotsBidWon called'); + }; + + pbjs.onEvent('bidWon', allSlotsBidWon); + + var adUnits = [{ + code: '/19968336/prebid_native_example_1', + sizes: [ + [360, 360] + ], + mediaTypes: { + native: { + title: { + required: true + }, + image: { + required: true + }, + sponsoredBy: { + required: true + } + } + }, + bids: [{ + bidder: 'appnexus', + params: { + placementId: 13232354, + allowSmallerSizes: true + } + }] + }, + { + code: '/19968336/prebid_native_example_2', + sizes: [ + [1, 1] + ], + mediaTypes: { + native: { + title: { + required: true + }, + body: { + required: true + }, + image: { + required: true + }, + sponsoredBy: { + required: true + }, + icon: { + required: false + }, + } + }, + bids: [{ + bidder: 'appnexus', + params: { + placementId: 13232354, + allowSmallerSizes: true + } + }] + } + ]; + + pbjs.addAdUnits(adUnits); + pbjs.requestBids({ + bidsBackHandler: function(bidResponses) { + initAdserver(); + } + }); +}); + +// GPT setup +googletag.cmd.push(function() { + var slot1 = googletag.defineSlot('/19968336/prebid_native_example_1', [[360, 360]], 'div-1').addService(googletag.pubads()); + var slot2 = googletag.defineSlot('/19968336/prebid_native_example_2', 'fluid', 'div-2').addService(googletag.pubads()); + googletag.pubads().disableInitialLoad(); + googletag.pubads().enableSingleRequest(); + googletag.enableServices(); +}); + +{% endcapture %} + +{% include code/web-example.html id="basic-prebid-example" html=htmlCodePrebid js=jsCode %} diff --git a/dev-docs/examples/no-adserver.md b/dev-docs/examples/no-adserver.md index 70fb772aac..59ea2cedd2 100644 --- a/dev-docs/examples/no-adserver.md +++ b/dev-docs/examples/no-adserver.md @@ -10,7 +10,115 @@ about: jsfiddle_link: jsfiddle.net/Prebid_Examples/svumodbe/embedded/html,result -code_height: 2300 - -pid: 10 --- + +## Basic Prebid.js Example + +{% capture htmlCodePrebid %}
test-div
+
+
test-div2
+
+{% endcapture %} + +{% capture jsCode %}var adUnits = [ + { + code: 'test-div', + mediaTypes: { + banner: { + sizes: [[300,250]] + } + }, + bids: [ + { + bidder: 'appnexus', + params: { + placementId: 13144370 + } + } + ] + }, + { + code: 'test-div2', + mediaTypes: { + banner: { + sizes: [[728,90]] + } + }, + bids: [ + { + bidder: 'appnexus', + params: { + placementId: 13144370 + } + } + ] + } +]; + +var pbjs = pbjs || {}; +pbjs.que = pbjs.que || []; + +pbjs.que.push(function() { + pbjs.addAdUnits(adUnits); +}); + +// you could instead pass an array of adUnits +// to getHighestCpmBids() if desired +function renderAllAdUnits() { + var winners=pbjs.getHighestCpmBids(); + for (var i = 0; i < winners.length; i++) { + renderOne(winners[i]); + } +} + +function renderOne(winningBid) { +if (winningBid && winningBid.adId) { + var div = document.getElementById(winningBid.adUnitCode); + if (div) { + const iframe = document.createElement('iframe'); + iframe.scrolling = 'no'; + iframe.frameBorder = '0'; + iframe.marginHeight = '0'; + iframe.marginHeight = '0'; + iframe.name = `prebid_ads_iframe_${winningBid.adUnitCode}`; + iframe.title = '3rd party ad content'; + iframe.sandbox.add( + 'allow-forms', + 'allow-popups', + 'allow-popups-to-escape-sandbox', + 'allow-same-origin', + 'allow-scripts', + 'allow-top-navigation-by-user-activation' + ); + iframe.setAttribute('aria-label', 'Advertisment'); + iframe.style.setProperty('border', '0'); + iframe.style.setProperty('margin', '0'); + iframe.style.setProperty('overflow', 'hidden'); + div.appendChild(iframe); + const iframeDoc = iframe.contentWindow.document; + pbjs.renderAd(iframeDoc, winningBid.adId); + + // most browsers have a default margin of 8px . We add those after prebid has written to the iframe. + // internally prebid uses document.write or inserts an element. Either way, this is safe to do here. + // document.write is sync. + // see https://github.com/prebid/Prebid.js/blob/92daa81f277598cbed486cf8be01ce796aa80c8f/src/prebid.js#L555-L588 + + // you may also use "all: unset". + // @see https://www.youtube.com/shorts/z47iLmBeRXY + + const normalizeCss = `/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */button,hr,input{overflow:visible}progress,sub,sup{vertical-align:baseline}[type=checkbox],[type=radio],legend{box-sizing:border-box;padding:0}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}details,main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{padding:.35em .75em .625em}legend{color:inherit;display:table;max-width:100%;white-space:normal}textarea{overflow:auto}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}[hidden],template{display:none}`; + const iframeStyle = iframeDoc.createElement('style'); + iframeStyle.appendChild(iframeDoc.createTextNode(normalizeCss)); + iframeDoc.head.appendChild(iframeStyle); + } + } +} +pbjs.que.push(function() { + pbjs.requestBids({ + timeout: 2000, + bidsBackHandler: renderAllAdUnits + }); +}); +{% endcapture %} + +{% include code/web-example.html id="basic-prebid-example" html=htmlCodePrebid js=jsCode scripts="pbjs" %} diff --git a/dev-docs/examples/postbid.md b/dev-docs/examples/postbid.md index 2a64381aa2..b4e0579047 100644 --- a/dev-docs/examples/postbid.md +++ b/dev-docs/examples/postbid.md @@ -14,7 +14,71 @@ about: - There is no need to create line items for each price bucket as the postbid creative is served after the ad server has chosen the line item. - This postbid creative supports passback. See how this works below. -jsfiddle_link: jsfiddle.net/Prebid_Examples/mtuq7kz0/embedded/html,result - -code_height: 1450 --- + +## Postbid Example + +{% capture htmlCodePrebid %}
postbid iframe
+ +{% endcapture %} + +{% capture jsCode %}var sizes = [ + [300, 250] +]; +var PREBID_TIMEOUT = 1000; +var adUnits = [{ + code: 'postbid_iframe', + mediaTypes: { + banner: { + sizes: sizes + } + }, + bids: [{ + bidder: 'appnexus', + params: { + placementId: 13144370 + } + }] +}]; + +var pbjs = pbjs || {}; +pbjs.que = pbjs.que || []; + +pbjs.que.push(function() { + pbjs.addAdUnits(adUnits); + pbjs.requestBids({ + timeout: PREBID_TIMEOUT, + bidsBackHandler: function() { + var iframe = document.getElementById('postbid_iframe'); + var iframeDoc = iframe.contentWindow.document; + var adServerTargeting = pbjs.getAdserverTargetingForAdUnitCode('postbid_iframe'); + + // If any bidders return any creatives + if (adServerTargeting && adServerTargeting['hb_adid']) { + pbjs.renderAd(iframeDoc, adServerTargeting['hb_adid']); + } else { + iframe.width = sizes[0][0]; + iframe.height = sizes[0][1]; + iframeDoc.write('' + passbackTagHtml + ''); + iframeDoc.close(); + } + } + }); +}); + +// Define the passback HTML tag here. +// Note that this tag is usually in either Script tag form or iFrame form. +var passbackTagHtml = 'TO ADD'; +{% endcapture %} + +{% include code/web-example.html id="basic-prebid-example" html=htmlCodePrebid js=jsCode %} diff --git a/dev-docs/examples/size-mapping.md b/dev-docs/examples/size-mapping.md index eb87f20109..135b18cec2 100644 --- a/dev-docs/examples/size-mapping.md +++ b/dev-docs/examples/size-mapping.md @@ -4,14 +4,124 @@ title: Filter Sizes Dynamically with Labels description: Filter Sizes Dynamically with Labels sidebarType: 1 - - about: - This example demonstrates dynamic filtering on ad unit sizes - Ad unit labels applied based on CSS media queries -jsfiddle_link: jsfiddle.net/Prebid_Examples/qourvse1/embedded/html,result +--- -code_height: 2400 +## Filter Sizes Dynamically with Labels ---- +{% capture htmlCodePrebid %}
Div-1
+
+ +
+{% endcapture %} + +{% capture jsCode %}var desktopSizes = [ + [970, 250], + [300, 600], + [300, 250] +]; +var tabletSizes = [ + [728, 90], + [160, 600], + [300, 250] +]; +var phoneSizes = [ + [320, 100], + [320, 50], + [300, 250] +]; +var allSizes = [ + [970, 250], + [728,90], + [320, 100], + [320, 50], + [300, 600], + [300, 250], + [160,600] +]; +var PREBID_TIMEOUT = 1000; +var FAILSAFE_TIMEOUT = 3000; + +var adUnits = [ + { + code: '/19968336/header-bid-tag-0', + mediaTypes: { + banner: { + sizes: allSizes + } + }, + bids: [ + { + bidder: 'appnexus', + params: { + placementId: 13144370 + } + } + ] + } +]; + +var pbjs = pbjs || {}; +pbjs.que = pbjs.que || []; + +var googletag = googletag || {}; +googletag.cmd = googletag.cmd || []; +googletag.cmd.push(function() { + googletag.pubads().disableInitialLoad(); +}); + +pbjs.que.push(function() { + pbjs.addAdUnits(adUnits); + pbjs.setConfig({ + sizeConfig: [{ + 'mediaQuery': '(min-width: 1025px)', + 'sizesSupported': desktopSizes, + 'labels': ['desktop'] + }, { + 'mediaQuery': '(min-width: 768px) and (max-width: 1024px)', + 'sizesSupported': tabletSizes, + 'labels': ['tablet'] + }, { + 'mediaQuery': '(min-width: 320px) and (max-width: 812px)', + 'sizesSupported': phoneSizes, + 'labels': ['phone'] + }] + }); + pbjs.requestBids({ + bidsBackHandler: sendAdserverRequest, + timeout: PREBID_TIMEOUT + }); +}); + +function sendAdserverRequest() { + if (pbjs.adserverRequestSent) return; + pbjs.adserverRequestSent = true; + googletag.cmd.push(function() { + pbjs.que.push(function() { + pbjs.setTargetingForGPTAsync(); + googletag.pubads().refresh(); + }); + }); +} + +// in case PBJS doesn't load +setTimeout(function() { + sendAdserverRequest(); +}, FAILSAFE_TIMEOUT); + +googletag.cmd.push(function() { + googletag.defineSlot('/19968336/header-bid-tag-0', allSizes, 'div-1') + .addService(googletag.pubads()); + googletag.pubads().enableSingleRequest(); + googletag.enableServices(); +}); +{% endcapture %} + +{% include code/web-example.html id="size-mapping-example" html=htmlCodePrebid js=jsCode %} diff --git a/dev-docs/examples/sync-tid.md b/dev-docs/examples/sync-tid.md index acba990c8d..d6b1e05074 100644 --- a/dev-docs/examples/sync-tid.md +++ b/dev-docs/examples/sync-tid.md @@ -4,14 +4,113 @@ title: Sync Transaction Ids With Another Library description: Synchronize Transaction Ids With Another Library sidebarType: 1 - - about: - imp.ext.tid sync - This example demonstrates sending the same impression transaction identifier (imp.ext.tid) to two on page libraries. -jsfiddle_link: jsfiddle.net/50aqtrck/1/embedded/html,result +--- -code_height: 2400 +## Sync Transaction Ids With Another Library ---- +```javascript +const AUCTION_TIMEOUT = 1500; +const FAILSAFE_TIMEOUT = 3000; + +const requestManager = { + adserverRequestSent: false, + otherLibrary: false, + prebid: false, +}; + +const slots = [ + { + id: 'div-gpt-ad-123-0', + tid: crypto.randomUUID(), + sizes: [ + [300, 250] + ] + } +] + +anotherLibraryTag.fetchBids({ + slots: slots.map((slot) => ({ + // Please confirm precise syntax for this next line with other library documentation + slotID: slot.id, + sizes: slot.sizes, + timeout: AUCTION_TIMEOUT + })), + function() { + googletag.cmd.push(function() { + anotherLibraryTag.setDisplayBids(); + requestManager.otherLibrary = true; + sendBidsToAdServer(); + }); + } +}); + +pbjs.que.push(function() { + pbjs.setConfig({ + debug: true, + }); + pbjs.requestBids({ + bidsBackHandler: prebidBidsBack, + timeout: AUCTION_TIMEOUT, + adUnits: slots.map((slot) => ({ + code: slot.id, + mediaTypes: { + banner: { + sizes: slot.sizes, + }, + }, + ortb2Imp: { + ext: { + tid: slot.tid + } + }, + bids: [ + { + bidder: 'appnexus', + params: { + placementId: 13144370, + }, + }, + ], + })) + }); +}); + +// prebid bids returned +function prebidBidsBack() { + pbjs.initAdserverSet = true; + googletag.cmd.push(function() { + pbjs.setTargetingForGPTAsync && pbjs.setTargetingForGPTAsync(); + requestManager.prebid = true; + sendBidsToAdServer(); + }); +} + +// send all bids to GAM +function sendBidsToAdServer(failsafeTimoutReached) { + if (requestManager.adserverRequestSent === true) return; + + if (failsafeTimoutReached) { + console.warn("AUCTION FAILSAFE TIMEOUT REACHED"); + googletag.cmd.push(function() { + googletag.pubads().refresh(); + }); + requestManager.adserverRequestSent = true; + return; + } + + if (requestManager.otherLibrary && requestManager.prebid) { + googletag.cmd.push(function() { + googletag.pubads().refresh(); + }); + requestManager.adserverRequestSent = true; + } +} + +setTimeout(function() { + sendBidsToAdServer(true); +}, FAILSAFE_TIMEOUT); +``` diff --git a/dev-docs/examples/use-prebid-with-appnexus-ad-server.md b/dev-docs/examples/use-prebid-with-appnexus-ad-server.md index a5d3980f5f..45dbb89fad 100644 --- a/dev-docs/examples/use-prebid-with-appnexus-ad-server.md +++ b/dev-docs/examples/use-prebid-with-appnexus-ad-server.md @@ -10,6 +10,120 @@ about: - See the Seller Tag (AST) documentation for more information. - To configure the Seller Tag to use SafeFrames, refer to the SafeFrame API Reference. -jsfiddle_link: jsfiddle.net/Prebid_Examples/tr1djf9e/embedded/html,result -code_height: 2404 ---- \ No newline at end of file +--- + +## Using Prebid.js with Microsoft Monetize Ad Server + +{% capture htmlCodePrebid %}
Div-1
+
+ +
+ +
+ +
Div-2
+
+ +
+{% endcapture %} + +{% capture jsCode %}var div_1_sizes = [ + [300, 250], + [300, 600] +]; +var div_2_sizes = [ + [728, 90], + [970, 250] +]; +var PREBID_TIMEOUT = 1000; + +var pbjs = pbjs || {}; +pbjs.que = pbjs.que || []; + +var adUnits = [ + { + code: 'div-1', + mediaTypes: { + banner: { + sizes: div_1_sizes + } + }, + bids: [{ + bidder: 'appnexus', + params: { + placementId: 13144370 + } + }] + }, + { + code: 'div-2', + mediaTypes: { + banner: { + sizes: div_2_sizes + } + }, + bids: [{ + bidder: 'appnexus', + params: { + placementId: 13144370 + } + }] + } +]; + +pbjs.que.push(function() { + pbjs.addAdUnits(adUnits); + pbjs.requestBids({ + bidsBackHandler: function(bidResponses) { + initAdserver(); + }, + timeout: PREBID_TIMEOUT + }); + +}); + +// Prebid Config Section END + +var apntag = apntag || {}; +apntag.anq = apntag.anq || []; +apntag.anq.push(function() { + apntag.setPageOpts({ + member: 1543 + }); + apntag.defineTag({ + tagId: 10885450, + sizes: div_1_sizes, + targetId: 'div-1' + }); + apntag.defineTag({ + tagId: 10885450, + sizes: div_2_sizes, + targetId: 'div-2' + }); +}); + +//start loading tags +function initAdserver() { + if (pbjs.requestSent) { + return; + } + pbjs.requestSent = true; + pbjs.que.push(function() { + apntag.anq.push(function() { + pbjs.setTargetingForAst(); + apntag.loadTags(); + }); + }); +} +{% endcapture %} + +{% include code/web-example.html id="basic-prebid-example" html=htmlCodePrebid js=jsCode scripts="pbjs,astjs" %} diff --git a/docs-examples/web-example.md b/docs-examples/web-example.md new file mode 100644 index 0000000000..7e88fe7505 --- /dev/null +++ b/docs-examples/web-example.md @@ -0,0 +1,155 @@ +--- +layout: page_v2 +title: Web Code Example +description: How web code examples can be written +--- + +# How to implement code examples for web + +The prebid documentation uses bootstrap for styling. Bootstrap offers a [tab component](https://getbootstrap.com/docs/4.6/components/navs/#javascript-behavior). + +## Example #1 + +{% capture htmlCode %}

Hello world

+
Ad Slot
+ + +{% endcapture %} + +{% capture jsCode %}console.log('hello world'); +function exampleFunction() { + alert('hey there'); +} +{% endcapture %} + +{% include code/web-example.html id="hello-world" html=htmlCode js=jsCode %} + +## Basic Prebid Example + +{% include prebidjs-non-prod.html %} +{% include gptjs.html %} + +{% capture htmlCodePrebid %}

Basic Prebid.js Example

+
Div-1
+
+ +
+{% endcapture %} + +{% capture jsCode %}var sizes = [ + [300, 250] +]; +var PREBID_TIMEOUT = 700; + +var adUnits = [{ + code: '/19968336/header-bid-tag-1', + mediaTypes: { + banner: { + sizes: sizes + } + }, + bids: [{ + bidder: 'appnexus', + params: { + placementId: 13144370 + } + }] +}]; + +// ======== DO NOT EDIT BELOW THIS LINE =========== // +var googletag = googletag || {}; +googletag.cmd = googletag.cmd || []; +googletag.cmd.push(function() { + googletag.pubads().disableInitialLoad(); +}); + +var pbjs = pbjs || {}; +pbjs.que = pbjs.que || []; + +pbjs.que.push(function() { + pbjs.addAdUnits(adUnits); + pbjs.requestBids({ + bidsBackHandler: initAdserver + }); +}); + +function initAdserver() { + if (pbjs.initAdserverSet) return; + pbjs.initAdserverSet = true; + googletag.cmd.push(function() { + pbjs.setTargetingForGPTAsync && pbjs.setTargetingForGPTAsync(); + googletag.pubads().refresh(); + }); +} + +setTimeout(function() { + initAdserver(); +}, PREBID_TIMEOUT); + +googletag.cmd.push(function() { + googletag.defineSlot('/19968336/header-bid-tag-1', sizes, 'div-1') + .addService(googletag.pubads()); + googletag.pubads().enableSingleRequest(); + googletag.enableServices(); +}); +{% endcapture %} + +{% include code/web-example.html id="basic-prebid-example" html=htmlCodePrebid js=jsCode %} + +## Instructions + +The code you need to for this looks like this + +{% raw %} + +```liquid + +{% include prebidjs-non-prod.html %} +{% include gptjs.html %} + + +{% capture htmlCode %}
+ +
+{% endcapture %} + +{% capture jsCode %}var googletag = googletag || {}; +googletag.cmd = googletag.cmd || []; +googletag.cmd.push(function() { + googletag.pubads().disableInitialLoad(); +}); + +var pbjs = pbjs || {}; +pbjs.que = pbjs.que || []; + + +// ... and all the prebid and google initializing code + +{% endcapture %} + +{% include code/web-example.html id="hello-world" html=htmlCode js=jsCode %} +``` + +{% endraw %} + +There are few things to understand here + +1. The `include` directive requires a unique `id` for the page. Otherwise the tabs won't work properly +2. Capturing the code into a variable makes everything a lot more readable + +## More information + +- [jekyll includes](https://jekyllrb.com/docs/includes/) +- [jekyll includes with parameters](https://jekyllrb.com/docs/includes/#passing-parameter-variables-to-includes) +- [bootstrap tabs](https://getbootstrap.com/docs/4.6/components/navs/#javascript-behavior) From f75cbd4b9af8e9df69427a4844086b209f8b6fe1 Mon Sep 17 00:00:00 2001 From: ahmadlob <109217988+ahmadlob@users.noreply.github.com> Date: Mon, 26 Aug 2024 23:58:18 +0300 Subject: [PATCH 172/816] support app (#5483) --- dev-docs/bidders/taboola.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/taboola.md b/dev-docs/bidders/taboola.md index ed1ced43f7..d4255add4b 100644 --- a/dev-docs/bidders/taboola.md +++ b/dev-docs/bidders/taboola.md @@ -19,7 +19,7 @@ safeframes_ok: true fpd_supported: true ortb_blocking_supported: partial deals_supported: false -pbs_app_supported: false +pbs_app_supported: true multiformat_supported: will-not-bid sidebarType: 1 --- From a7b619774755d7bdb79c0ed501207367b3535445 Mon Sep 17 00:00:00 2001 From: freedomadnetworkdev Date: Tue, 27 Aug 2024 11:12:52 -0400 Subject: [PATCH 173/816] New Adapter: Freedom Ad Network Bidder Adapter (#5560) * Create freedomadnetwork.md * Update freedomadnetwork.md * Update freedomadnetwork.md * Update freedomadnetwork.md --- dev-docs/bidders/freedomadnetwork.md | 36 ++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 dev-docs/bidders/freedomadnetwork.md diff --git a/dev-docs/bidders/freedomadnetwork.md b/dev-docs/bidders/freedomadnetwork.md new file mode 100644 index 0000000000..8ff942e4fb --- /dev/null +++ b/dev-docs/bidders/freedomadnetwork.md @@ -0,0 +1,36 @@ +--- +layout: bidder +title: Freedom Ad Network +description: Freedom Ad Network Bidder Adapter +biddercode: freedomadnetwork +gvl_id: none +coppa_supported: true +media_types: banner, native +multiformat_supported: will-bid-on-any, will-bid-on-one, will-not-bid +safeframes_ok: false +deals_supported: false +floors_supported: false +fpd_supported: false +pbjs: true +prebid_member: false +sidebarType: 1 +tcfeu_supported: false +dsa_supported: false +usp_supported: false +schain_supported: false +dchain_supported: false +pbs: false +ortb_blocking_supported: false +privacy_sandbox: no +--- + +### Note + +The Freedom Ad Network Adapter requires setup before beginning. Please contact us at [info@freedomadnetwork.com](mailto:info@freedomadnetwork.com). + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|-----------------------|-----------|-----------| +| `placementId` | required | Placement ID | `'e6203f1e-bd6d-4f42-9895-d1a19cdb83c8'` | `string` | From 1dde0e72f5839146208b9e065fd9363a44879728 Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 28 Aug 2024 18:00:01 -0400 Subject: [PATCH 174/816] Fixed native example in sidebar (#5574) --- _data/sidebar.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_data/sidebar.yml b/_data/sidebar.yml index 097301e7e0..3cebde6074 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -227,7 +227,7 @@ - sbSecId: 1 title: Native Ads - link: /formats/native.html + link: /dev-docs/examples/native-ad-example.html isHeader: 0 isSectionHeader: 0 sectionTitle: From 99bb9128e7e86f5f6d6355a521ddae2bc445a493 Mon Sep 17 00:00:00 2001 From: Takamasa-Murano Date: Thu, 29 Aug 2024 15:44:28 +0900 Subject: [PATCH 175/816] ssp_geniee Bid Adapter : add ssp_geniee.md (#5551) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ssp_geniee.md追加 * native削除 * 最小構成に修正 * add metadata as possible * modify metadata * temporary update... * parameters comfirmed --------- Co-authored-by: Murano Takamasa --- dev-docs/bidders/ssp_geniee.md | 43 ++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 dev-docs/bidders/ssp_geniee.md diff --git a/dev-docs/bidders/ssp_geniee.md b/dev-docs/bidders/ssp_geniee.md new file mode 100644 index 0000000000..3219657174 --- /dev/null +++ b/dev-docs/bidders/ssp_geniee.md @@ -0,0 +1,43 @@ +--- +layout: bidder +title: Geniee SSP +description: Geniee SSP Bidder Adapter +biddercode: ssp_geniee +userId: imuId +media_types: banner +safeframes_ok: false +sidebarType: 1 +pbjs: true +tcfeu_supported: false +dsa_supported: false +gvl_id: none +usp_supported: false +coppa_supported: false +gpp_sids: none +schain_supported: false +dchain_supported: false +deals_supported: false +floors_supported: false +fpd_supported: false +pbs: false +prebid_member: false +multiformat_supported: will-bid-on-one +ortb_blocking_supported: partial +privacy_sandbox: no +--- +### Note + +This is [Geniee](https://geniee.co.jp) Bidder Adapter for Prebid.js. + +{: .alert.alert-info :} +This is Geniee *SSP* Bidder Adapter. The another adapter named "Geniee Bid Adapter" is Geniee *DSP* Bidder Adapter. + +Please contact us before using the adapter. + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|--------------|----------|-------------------------------------------------|-----------|-----------| +| `zoneId` | required | Zone ID | `123456` | `integer` | +| `currency` | Optional | Currency setting (`'JPY'`(Default) or `'USD'`) | `'JPY'` | `string` | From 45e3b0970b2963607c17558fbe26b9be1777561b Mon Sep 17 00:00:00 2001 From: pm-azhar-mulla <75726247+pm-azhar-mulla@users.noreply.github.com> Date: Thu, 29 Aug 2024 12:15:52 +0530 Subject: [PATCH 176/816] Updated biddercode as per Bid Adapter file (#5575) Co-authored-by: pm-azhar-mulla --- dev-docs/bidders/docereeadmanager.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/docereeadmanager.md b/dev-docs/bidders/docereeadmanager.md index b70e45499b..e848218ba2 100644 --- a/dev-docs/bidders/docereeadmanager.md +++ b/dev-docs/bidders/docereeadmanager.md @@ -3,7 +3,7 @@ layout: bidder title: Doceree AdManager description: Doceree AdManager Prebid Bidder Adapter pbjs: true -biddercode: docereeAdManager +biddercode: docereeadmanager media_types: banner gvl_id: 1063 tcfeu_supported: true From dbacc042b8b3936bcdfbc1ab5c86db10db95bdcb Mon Sep 17 00:00:00 2001 From: jsnellbaker <31102355+jsnellbaker@users.noreply.github.com> Date: Thu, 29 Aug 2024 02:46:46 -0400 Subject: [PATCH 177/816] AppNexus bidders page - update and clarify video params (#5563) --- dev-docs/bidders/appnexus.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/appnexus.md b/dev-docs/bidders/appnexus.md index 834f91fe41..e8f4c9f0b0 100644 --- a/dev-docs/bidders/appnexus.md +++ b/dev-docs/bidders/appnexus.md @@ -28,6 +28,7 @@ sidebarType: 1 - [Video Object](#video-object) - [User Object](#user-object) - [App Object](#app-object) + - [Video Bid params and Video MediaTypes params](#video-bid-params-and-video-mediatypes-params) - [Custom Targeting keys](#custom-targeting-keys) - [Auction Level Keywords](#auction-level-keywords) - [Passing Keys Without Values](#passing-keys-without-values) @@ -80,12 +81,14 @@ The table below will reflect both formats, though it's recommended to use the lo #### Video Object +For details on how these video params work with the params set in the adUnit.mediaTypes.video object, see [Video Bid params and Video MediaTypes params](#appnexus-video-params) section below. + {: .table .table-bordered .table-striped } | Name | Description | Type | |-------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------| | `minduration` | Integer that defines the minimum video ad duration in seconds. | `integer` | | `maxduration` | Integer that defines the maximum video ad duration in seconds. | `integer` | -|`context` | A string that indicates the type of video ad requested. Allowed values: `"pre_roll"`; `"mid_roll"`; `"post_roll"`; `"outstream"`. | `string` | +|`context` | A string that indicates the type of video ad requested. Allowed values: `"pre_roll"`; `"mid_roll"`; `"post_roll"`; `"outstream"`; `"in-banner"`, `"in-feed"`, `"interstitial"`, `"accompanying_content_pre_roll"`, `"accompanying_content_mid_roll"`, `"accompanying_content_post_roll"`. | `string` | | `skippable` | Boolean which, if `true`, means the user can click a button to skip the video ad. Defaults to `false`. | `boolean` | |`skipoffset`| Integer that defines the number of seconds until an ad can be skipped. Assumes `skippable` setting was set to `true`. | `integer` | | `playback_method` | A string that sets the playback method supported by the publisher. Allowed values: `"auto_play_sound_on"`; `"auto_play_sound_off"`; `"click_to_play"`; `"mouse_over"`; `"auto_play_sound_unknown"`. | `string` | @@ -150,6 +153,16 @@ pbjs.bidderSettings = { } ``` + + +#### Video Bid params and Video MediaTypes params + +It is possible to have setup video params within the adUnit's AppNexus bid object as well as in the adUnit's `mediaTypes.video` object. In this case, there is a set of logic that the AppNexus bid adapter follows to resolve which values should be passed along to the ad server request. Generally speaking, the adapter prefers the values from bid param video object over the mediaTypes video object, in order to preserve historical setups. So for instance, if the playbackmethod field was set in both locations, then the bid params `playback_method` would be chosen over the mediaTypes `playbackmethod`. If there are different fields set between the two locations and they don't overlap, then the `mediaTypes.video` params would be included along with the bid params. + +To note - not all the fields between the two locations have a single direct comparison, nor are all fields from the `mediaTypes.video` object are supported by the ad server endpoint. The fields/values set in the `mediaTypes.video` object follow the OpenRTB convention, while our bid params follow the convention for the ad server endpoint (which is **not** a straight OpenRTB endpoint). The AppNexus bid adapter converts the matching fields from the `mediaTypes.video` object where there is a correlation to help support as much as possible. For example, to help infer the `context` field, the adapter will look to the `mediaTypes.video.plcmt`, `mediaTypes.video.startdelay`, and `mediaTypes.video.placement` fields to help determine the appropriate `context` value. The `startdelay` field is included here to help clarify the type of instream video that is used (ie pre/mid/post-roll). + +If you want to transition from video bid params to use the `mediaTypes.video` params (to simplify the adUnit setup), please contact your AppNexus contact to help identify the proper fields/values are populated to ensure a smooth transition. + #### Auction Level Keywords From 380ceb7c213f31a9ddd756f06f73171874dcea1d Mon Sep 17 00:00:00 2001 From: Prebid-Team Date: Thu, 29 Aug 2024 15:36:51 +0530 Subject: [PATCH 178/816] update incrementx.md file with video mediatype (#5568) --- dev-docs/bidders/incrementx.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/incrementx.md b/dev-docs/bidders/incrementx.md index 2182b871ba..d33fcda5a3 100644 --- a/dev-docs/bidders/incrementx.md +++ b/dev-docs/bidders/incrementx.md @@ -4,7 +4,7 @@ title: IncrementX description: Prebid IncrementX Bidder Adaptor pbjs: true biddercode: incrementx -media_types: banner +media_types: banner, video tcfeu_supported: false multiformat_supported: will-bid-on-one filename: incrxBidAdapter From 754f974d2527a6a8793b1a6479affd8f2d960d49 Mon Sep 17 00:00:00 2001 From: Jeff Palladino <1226357+jpalladino84@users.noreply.github.com> Date: Tue, 3 Sep 2024 08:09:03 -0600 Subject: [PATCH 179/816] Symitri dap rtd module update documentation (#5569) * symitriDapRtdModule - update documentation * Update to latest --------- Co-authored-by: Jeff Palladino --- dev-docs/modules/symitriDapRtdProvider.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/dev-docs/modules/symitriDapRtdProvider.md b/dev-docs/modules/symitriDapRtdProvider.md index 99914d3b7b..f44c83f9df 100644 --- a/dev-docs/modules/symitriDapRtdProvider.md +++ b/dev-docs/modules/symitriDapRtdProvider.md @@ -38,14 +38,16 @@ pbjs.setConfig({ auctionDelay: 2000, dataProviders: [ { - name: "dap", + name: "symitriDap", waitForIt: true, params: { apiHostname: '', apiVersion: "x1", + apiAuthToken: '', domain: 'your-domain.com', - identityType: 'email' | 'mobile' | ... | 'dap-signature:1.3.0', - segtax: 504, + identityType: 'hid'| ... | 'dap-signature:1.0.0', + identityValue: '', + segtax: 501, dapEntropyUrl: 'https://sym-dist.symitri.net/dapentropy.js', dapEntropyTimeout: 1500 } @@ -62,13 +64,15 @@ Please reach out to your Symitri account representative() to {: .table .table-bordered .table-striped } | Name |Type | Description | Notes | | :------------ | :------------ | :------------ |:------------ | -| name | String | Symitri Dap Rtd module name | 'dap' always| +| name | String | Symitri Dap Rtd module name | 'symitriDap' always| | waitForIt | Boolean | Required to ensure that the auction is delayed until prefetch is complete | Optional. Defaults to false | | apiHostname | String | Hostname provided by Symitri | Please reach out to your Symitri account representative() for this value| | apiVersion | String | This holds the API version | It should be "x1" always | +| apiAuthToken | String | Symitri API AuthToken | Please reach out to your Symitri account representative() for this value | | domain | String | The domain name of your webpage | | -| identityType | String | Something like this 'email', 'mobile', ... 'dap-signature:1.3.0' | | -| segtax | Integer | The taxonomy for Symitri | The value should be 504 | +| identityType | String | Something like this 'hid', ... 'dap-signature:1.0.0' | | +| identityValue | String | This is optional field to pass user hid. Will be used only if identityType is hid | | +| segtax | Integer | The taxonomy for Symitri | The value should be 501 | | dapEntropyUrl | String | URL to dap entropy script | Optional if the script is directly included on the webpage. Contact your Symitri account rep for more details | | dapEntropyTimeout | Integer | Maximum time allotted for the entropy calculation to happen | | From 12df0045e16e004ba637041219286ad4bd87d039 Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 3 Sep 2024 13:42:21 -0400 Subject: [PATCH 180/816] PBS FPD update (#5578) --- .../openrtb2/pbs-endpoint-auction.md | 85 +++++++++++++++++-- prebid-server/features/pbs-feature-idx.md | 3 +- 2 files changed, 81 insertions(+), 7 deletions(-) diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md index 9a45cae691..da42122863 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -1183,15 +1183,43 @@ See Prebid.org [troubleshooting pages](/troubleshooting/pbs-troubleshooting.html ##### First Party Data Support -This is a standard way for the page (or app) to supply first party data and control which bidders have access to it. +This is a standard way for the page (or app) to supply First Party Data and control which bidders have access to it. -It specifies where in the OpenRTB request non-standard attributes should be passed. For example: +Prebid defines several types of First Party Data (FPD): + +1. Cross-impression contextual information. e.g. the content category of the page. This data goes in the `site.ext.data` object or the `app.ext.data` object. +1. User-level information. e.g. whether the user is a registered user. This data goes in `user.ext.data`. +1. Impression-level information. e.g. the Global Placement ID. This data goes in the `imp.ext.data` object. +1. Seller-Defined Audience (SDA) contextual data. This goes in `site.data[]` or `app.data[]` in accordance with the [IAB segment taxonomy conventions](https://github.com/InteractiveAdvertisingBureau/openrtb/blob/main/extensions/community_extensions/segtax.md). +1. SDA user data goes in `user.data[]` with the same [conventions](https://github.com/InteractiveAdvertisingBureau/openrtb/blob/main/extensions/community_extensions/segtax.md) as the contextual data. + +See below for how to specify these different types of data and how to define which bidders are +allowed to receive which. + +###### Data Permissions + +This approach specifies whether the given bidder(s) are allowed to receive the global (contextual or user) +FPD. + +If a `ext.prebid.data.bidders[]` is specified, it means that {site,app}.ext.data and user.ext.data fields will only be passed to the named bidders. For example: + +```json +{ + "ext": { + "prebid": { + "data": { "bidders": [ "bidderA", "bidderB" ] } // these are the bidders allowed to see the globsl FPD + } + } +} +``` + +For example: ```json { "ext": { "prebid": { - "data": { "bidders": [ "rubicon", "appnexus" ] } // these are the bidders allowed to see protected data + "data": { "bidders": [ "bidderA", "bidderB" ] } // these are the bidders allowed to see protected data } }, "site": { @@ -1203,8 +1231,6 @@ It specifies where in the OpenRTB request non-standard attributes should be pass }, "user": { "keywords": "", - "gender": "", - "yob": 1999, "geo": {}, "ext": { "data": { GLOBAL USER DATA } // only seen by bidders named in ext.prebid.data.bidders[] @@ -1223,7 +1249,9 @@ It specifies where in the OpenRTB request non-standard attributes should be pass } ``` -Bidder-specific data can be defined with ext.prebid.bidderconfig: +###### Bidder-Specific global FPD + +Bidder-specific global (i.e. cross-impression) data can be defined with ext.prebid.bidderconfig: ```json "ext": { @@ -1262,6 +1290,51 @@ Prebid Server enforces data permissioning. So before passing values to the bidde Each adapter must be coded to read the values from the ortb and pass it to their endpoints appropriately. +###### Bidder-Specific Impression-Level FPD + +When Prebid Server sees `imp[].ext.prebid.imp.BIDDER`, the behavior is to: + +1. When passing this imp to that bidder, merge the contents of BIDDER into the imp +1. Remove the imp[].ext.prebid.imp object +1. Leave any imp[].ext.prebid.storedrequest object +1. The imp.ext.prebid.imp.BIDDER object name is case insensitive and supports aliases +1. If imp.ext.prebid.imp.BIDDER does not resolve to an actual bidder or alias in a case-insensitive way, it is ignored with a warning when in debug mode. +1. No validation is done on imp.ext.prebid.imp.BIDDER.ext except that imp.ext.prebid.imp.BIDDER.ext.prebid.BIDDER is removed. +1. The contents of imp.ext.prebid.imp.BIDDER takes precedence in the merge if the field already exists in the request. +1. The resulting imp object must be valid OpenRTB per the system schema. + +Here's an example showing a scenario showing a storedrequest-based scenario: + +```json +{ + imp: [{ + ext: { + prebid: { + storedrequest: { id: "sr1" }, // for the first imp, pull bidders out of a storedrequest + imp: { + bidderA: { + pmp: { + deals: [{ id:"dealA" }] // apply this deal to bidderA + } + } + } + } + },{ + ext: { + prebid: { + storedrequest: { id: "sr2" }, // for the second imp, pull bidders out of a different storedrequest + imp: { + bidderB: { + pmp: { + deals: [{ id:"dealB" }] // apply this deal to bidderB + } + } + } + } + }] +} +``` + ##### Custom Targeting 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. diff --git a/prebid-server/features/pbs-feature-idx.md b/prebid-server/features/pbs-feature-idx.md index 9abdf3d8e6..c83165c10a 100644 --- a/prebid-server/features/pbs-feature-idx.md +++ b/prebid-server/features/pbs-feature-idx.md @@ -54,7 +54,8 @@ title: Prebid Server | Features | [Stored Responses](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#stored-responses) | Stored Auction Responses | Accepts a stored response ID in the OpenRTB, looks it up against a local data store, and merges with the OpenRTB response record. | check | check | | [Stored Responses](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#stored-responses) | Stored Bid Responses | Accepts a stored response ID in the OpenRTB, looks it up against a local data store, and uses that as the bid adapter response. | check | check | | First Party Data | Core | Accepts core [first party data](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#first-party-data-support) attributes and supports ext.prebid.data.bidders. | check | check | -| First Party Data | Bidder-specific data | Accepts bidder-specific first party data attributes. | check | check | +| First Party Data | Bidder-specific global data | Accepts [bidder-specific first party data attributes](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#bidder-specific-global-fpd) for site, app, and user. | check | check | +| First Party Data | Bidder-specific impression data | Accepts [bidder-specific first party data attributes at the imp-level](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#bidder-specific-impression-level-fpd). | check | check | | First Party Data | AMP first party data | Accepts [first party data attributes on an AMP request](/prebid-server/endpoints/openrtb2/pbs-endpoint-amp.html#first-party-data). | check | check | | [Supply Chain](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#supply-chain-support) | Bidder-specific schains | Accepts bidder-specific schain | check | check | | Supply Chain | Host SChain | The host company can supply a global schain that's appended to the list of incoming nodes in source.ext.schain. | check | check | From 60d05c4e7841d79ac1b02620e96c63e2a99d1dc1 Mon Sep 17 00:00:00 2001 From: julietterochon <140074184+julietterochon@users.noreply.github.com> Date: Thu, 5 Sep 2024 17:09:36 +0200 Subject: [PATCH 181/816] [Criteo] Addition of the uid parameter (#5583) --- 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 58901ad55e..a914de31e3 100644 --- a/dev-docs/bidders/criteo.md +++ b/dev-docs/bidders/criteo.md @@ -37,6 +37,7 @@ Prebid-Server support is on alpha test and is currently a non-finished product. | `zoneId` | required | (deprecated) The zone ID from Criteo. Should be replaced by `networkId` when using zone matching. | `234234` | `integer` | | `networkId` | required | The network ID from Criteo. Please reach out your Criteo representative for more details. | `456456` | `integer` | | `pubid` | required | publisher id | `'ABC123'` | `string` | +| `uid` | optional | Ad Unit ID | `'8888'` | `string` | | `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` | From a21ffbc82f08d4fc330400c61ebe26081616d80b Mon Sep 17 00:00:00 2001 From: Komal Kumari <169047654+pm-komal-kumari@users.noreply.github.com> Date: Fri, 6 Sep 2024 17:43:49 +0530 Subject: [PATCH 182/816] Add maxBid documentation for setConfig (#5585) Co-authored-by: Komal Kumari --- dev-docs/publisher-api-reference/setConfig.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/dev-docs/publisher-api-reference/setConfig.md b/dev-docs/publisher-api-reference/setConfig.md index 187b29bc6b..fef8e66c1e 100644 --- a/dev-docs/publisher-api-reference/setConfig.md +++ b/dev-docs/publisher-api-reference/setConfig.md @@ -1347,6 +1347,18 @@ Inversely, if you wish for the alias registry to be private you can do so by usi pbjs.setConfig({aliasRegistry: 'private'}) ``` +### Set Max Bid + + + +Prebid ensures that the bid response price doesn't exceed the maximum bid. If the CPM (after currency conversion) is higher than the maxBid, the bid is rejected. The default maxBid value is 5000. You can adjust maxBid with: + +```javascript +pbjs.setConfig({ + maxBid: 10 +}); +``` + ### General adapter Configuration From 7d395d313f5d8a0ec7f9e78e183807d6bf5732e9 Mon Sep 17 00:00:00 2001 From: julietterochon <140074184+julietterochon@users.noreply.github.com> Date: Fri, 6 Sep 2024 14:26:16 +0200 Subject: [PATCH 183/816] [Criteo] Deprecation of the nativeCallback parameter (#5586) --- dev-docs/bidders/criteo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/criteo.md b/dev-docs/bidders/criteo.md index a914de31e3..c09461da08 100644 --- a/dev-docs/bidders/criteo.md +++ b/dev-docs/bidders/criteo.md @@ -38,7 +38,7 @@ 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` | | `pubid` | required | publisher id | `'ABC123'` | `string` | | `uid` | optional | Ad Unit ID | `'8888'` | `string` | -| `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` | +| `nativeCallback` | optional | (deprecated) (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` | From 73377e7e109cfe5a819c978e2a9928262144723f Mon Sep 17 00:00:00 2001 From: Alexander Pykhteyev Date: Fri, 6 Sep 2024 19:58:02 +0700 Subject: [PATCH 184/816] Tgm bidder adapter: fix typo (#5584) * Doc for embi media * New TGM bidder adapter * Remove unused * Update TGM adapter doc --------- Co-authored-by: apykhteyev --- dev-docs/bidders/tgm.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/dev-docs/bidders/tgm.md b/dev-docs/bidders/tgm.md index ae5d7a809d..44ccfa797c 100644 --- a/dev-docs/bidders/tgm.md +++ b/dev-docs/bidders/tgm.md @@ -24,17 +24,17 @@ sidebarType: 1 {: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|:--------------|:---------|:--------------------------------------------------|:---------------------|:----------| -| `host` | required | Ad network's RTB host | `'ads-gmd.ortb.net'` | `string` | -| `adUnitId` | required | Ad Unit Id will be generated on iionads Platform. | `42` | `integer` | -| `adUnitType` | required | Type of Ad Unit (`'video'`, `'banner'`) | `'banner'` | `string` | -| `publisherId` | required | Publisher ID | `'12345'` | `string` | -| `custom1` | optional | Custom targeting field 1 | `'custom1'` | `string` | -| `custom2` | optional | Custom targeting field 2 | `'custom2'` | `string` | -| `custom3` | optional | Custom targeting field 3 | `'custom3'` | `string` | -| `custom4` | optional | Custom targeting field 4 | `'custom4'` | `string` | -| `custom5` | optional | Custom targeting field 5 | `'custom5'` | `string` | +| Name | Scope | Description | Example | Type | +|:--------------|:---------|:----------------------------------------------|:---------------------|:----------| +| `host` | required | Ad network's RTB host | `'ads-gmd.ortb.net'` | `string` | +| `adUnitId` | required | Ad Unit Id will be generated on TGM Platform. | `42` | `integer` | +| `adUnitType` | required | Type of Ad Unit (`'video'`, `'banner'`) | `'banner'` | `string` | +| `publisherId` | required | Publisher ID | `'12345'` | `string` | +| `custom1` | optional | Custom targeting field 1 | `'custom1'` | `string` | +| `custom2` | optional | Custom targeting field 2 | `'custom2'` | `string` | +| `custom3` | optional | Custom targeting field 3 | `'custom3'` | `string` | +| `custom4` | optional | Custom targeting field 4 | `'custom4'` | `string` | +| `custom5` | optional | Custom targeting field 5 | `'custom5'` | `string` | TGM server-side Prebid Server adapter requires only `publisherId` and `host` parameters. But TGM client-side Prebid.js adapter requires only `host`, `adUnitId`, `adUnitType`. From 4077cba0adf1a706d62e7a745da2e066a0a0f9ba Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 6 Sep 2024 12:50:36 -0400 Subject: [PATCH 185/816] PBS ortb2-blocking update (#5588) * PBS ortb2-blocking update * lint * lint --- prebid-server/pbs-modules/ortb2-blocking.md | 99 ++++++++++++--------- 1 file changed, 58 insertions(+), 41 deletions(-) diff --git a/prebid-server/pbs-modules/ortb2-blocking.md b/prebid-server/pbs-modules/ortb2-blocking.md index 1a7648a61a..f3db5b459e 100644 --- a/prebid-server/pbs-modules/ortb2-blocking.md +++ b/prebid-server/pbs-modules/ortb2-blocking.md @@ -9,7 +9,7 @@ sidebarType : 5 # ORTB2 Blocking Module {:.no_toc} -* TOC +- TOC {:toc } ## Overview @@ -35,7 +35,7 @@ For each of the supported attributes, there are a range of behaviors that can be configured: - **Configure Blocks**: allows host companies to define blocks globally, per-account, or per-account/bidder combination. This blocking config is sent in the OpenRTB requests to all or specific bidders for consideration in bid determination. -- **Enforce Blocks**: PBS can reject bids from bidders that don't conform to the blocking lists sent in the request. +- **Enforce Blocks**: PBS can reject bids from bidders that don't conform to the blocking lists sent in the request. The default is to **not** block. - **Enforce Unknown Values**: for some attributes it may makes sense to reject requests that don't contain a required value. For instance, the publisher may want to drop any bid that doesn't report the advertiser domain. - **Deal Overrides**: Private Marketplace deals may have exceptions to standard blocked attributes. @@ -44,11 +44,11 @@ Here's a summary of the features the module supports: {: .table .table-bordered .table-striped } | Scenario | Configure Blocks | Enforce Blocks | Enforce Unknown Values | Deal Overrides | |---+---+---+---+---| -| Advertiser Domains | | | | | -| Advertiser Categories | | | | | -| Apps | | | | | -| Banner Types | | | | | -| Banner Attributes | | | | | +| Advertiser Domains | check | check | check | check | +| Advertiser Categories | check | check | check | check | +| Apps | check | check | | check | +| Banner Types | check | | | | +| Banner Attributes | check | check | | check | ## Configuration @@ -64,12 +64,13 @@ so the module is only invoked for specific accounts. See below for an example. ### Global Config -There is no host-company level config for this module. +There is no host-company level config for this module except the execution plan may optionally be at the host level. ### Account-Level Config Here's a general template for the account config used in PBS-Java: -``` + +```json { "hooks": { "modules": { @@ -80,7 +81,7 @@ Here's a general template for the account config used in PBS-Java: "action-overrides": { OVERRIDE_SETTING: [{ "conditions": { ... }, - // the value below will be the datatype of the SETTING + // the value below will be the datatype of the SETTING "override": VALUE }] } @@ -95,8 +96,9 @@ Here's a general template for the account config used in PBS-Java: } ``` -PBS-Go version of the same config: -``` +PBS-Go uses underscores instead of dashes, so this is the Go version of the same config: + +```json { "hooks": { "modules": { @@ -128,17 +130,18 @@ The 'ATTRIBUTE' above is one of the 5 blockable entities defined in OpenRTB. A ' The following sections detail each of the 5 blockable entities. Here's a detailed example for PBS-Java: -``` + +```json { "hooks": { "modules": { "ortb2-blocking": { "attributes": { "badv": { - "enforce-blocks": false, - "blocked-adomain": [], + "enforce-blocks": false, // default is false + "blocked-adomain": [], // these are unconditionally blocked domains "action-overrides": { - "blocked-adomain": [ + "blocked-adomain": [ // these are conditionally blocked domains { "override": [ "example.com" ], "conditions": { @@ -149,10 +152,10 @@ Here's a detailed example for PBS-Java: } }, "bcat": { - "enforce-blocks": false, - "blocked-adv-cat": [], + "enforce-blocks": false, // default is false + "blocked-adv-cat": [], // these are unconditionally blocked categories "action-overrides": { - "blocked-adv-cat": [ + "blocked-adv-cat": [ // these are conditionally blocked categories { "override": [ "IAB7" ], "conditions": { @@ -163,9 +166,9 @@ Here's a detailed example for PBS-Java: } }, "battr": { - "enforce-blocks": false, + "enforce-blocks": false, // default is false "action-overrides": { - "blocked-banner-attr": [ + "blocked-banner-attr": [ // these are conditionally blocked categories { "override": [1,3,8,9,10,13,14,17], "conditions": { @@ -176,7 +179,7 @@ Here's a detailed example for PBS-Java: } ] }, - "blocked-banner-attr": [] + "blocked-banner-attr": [] // these are unconditionally blocked categories } } } @@ -224,7 +227,8 @@ Here's a detailed example for PBS-Java: ``` For PBS-Go: -``` + +```json { "hooks": { "modules": { @@ -331,12 +335,13 @@ This attribute is related to the 'badv' of the request, and the 'adomain' of the | Setting | Description | Data Type | Override Conditions Supported | |---+---+---+---| | blocked-adomain | List of adomains not allowed to display on this inventory | array of strings | bidders (array of strings), media-types (array of strings). | -| enforce-blocks | Whether to enforce adomains in responses | boolean | bidders (array of strings), media-types (array of strings) | +| enforce-blocks | Whether to enforce adomains in responses. Default is false. | boolean | bidders (array of strings), media-types (array of strings) | | block-unknown-adomain | Whether to block responses not specifying adomain. Only active if enforce-blocks is true. | boolean | bidders (array of strings), media-types (array of strings) | | allowed-adomain-for-deals | List of adomains allowed for deals in general or a specific dealid. | array of strings | deal-ids (array of strings). This isn't a true override - values are added to the global. | Here's an example account config for PBS-Java with several scenarios: -``` + +```json { "hooks": { "modules": { @@ -396,7 +401,8 @@ Here's an example account config for PBS-Java with several scenarios: ``` For PBS-Go: -``` + +```json { "hooks": { "modules": { @@ -465,12 +471,13 @@ This attribute is related to the 'bcat' of the request and 'cat' of the response | Setting | Description | Data Type | Override Conditions Supported | |---+---+---+---| | blocked-adv-cat | List of IAB categories not allowed to display on this inventory | array of strings | bidders (array of strings), media-types (array of strings) | -| enforce-blocks | Whether to enforce cat in responses | boolean | bidders (array of strings), media-types (array of strings) | +| enforce-blocks | Whether to enforce cat in responses. Default is false. | boolean | bidders (array of strings), media-types (array of strings) | | block-unknown-adv-cat | Whether to block responses not specifying cat. Only active if enforce-blocks is true. | boolean | bidders (array of strings), media-types (array of strings) | | allowed-adv-cat-for-deals | List of adomains allowed for deals in general or a specific dealid. | array of strings | deal-ids (array of strings). This isn't a true override - values are added to the global.| Here's an example account config for PBS-Java with several scenarios: -``` + +```json { "hooks": { "modules": { @@ -530,7 +537,8 @@ Here's an example account config for PBS-Java with several scenarios: ``` For PBS-Go -``` + +```json { "hooks": { "modules": { @@ -599,11 +607,12 @@ This attribute is related to the 'bapp' of the request and 'bundle' of the respo | Setting | Description | Data Type | Override Conditions Supported | |---+---+---+---| | blocked-app | List of bundles not allowed to display on this inventory | array of strings | bidders (array of strings), media-types (array of strings) | -| enforce-blocks | Whether to enforce bundles in responses | boolean | bidders (array of strings), media-types (array of strings) | +| enforce-blocks | Whether to enforce bundles in responses. Default is false. | boolean | bidders (array of strings), media-types (array of strings) | | allowed-bapp-for-deals | List of bundles allowed for deals in general or a specific dealid. | array of strings | deal-ids (array of strings). This isn't a true override - values are added to the global. | Here's an example account config for PBS-Java: -``` + +```json { "hooks": { "modules": { @@ -634,7 +643,8 @@ Here's an example account config for PBS-Java: ``` For PBS-Go -``` + +```json { "hooks": { "modules": { @@ -677,12 +687,13 @@ This attribute is related to the 'btype' of the request. See Table 5.2 in the [OpenRTB 2.5 spec](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf) for the possible values. -Note: no enforcement is possible because the creative type is not explictly +**Note:** no enforcement is possible because the creative type is not explictly part of the response and Prebid Server does not currently contain logic to parse creatives to derive the type. Here's an example account config for PBS-Java: -``` + +```json { "hooks": { "modules": { @@ -711,7 +722,8 @@ Here's an example account config for PBS-Java: ``` For PBS-Go -``` + +```json { "hooks": { "modules": { @@ -749,13 +761,14 @@ This attribute is related to the 'battr' of the request and 'attr' of the respon | Setting | Description | Data Type | Override Conditions Supported | |---+---+---+---| | blocked-banner-attr | List of IAB banner attributes not allowed to display on this inventory | array of int | bidders (array of strings), media-types (array of strings) | -| enforce-blocks | Whether to enforce attr in responses | boolean | bidders (array of strings), media-types (array of strings) | +| enforce-blocks | Whether to enforce attr in responses. Default is false. | boolean | bidders (array of strings), media-types (array of strings) | | allowed-banner-attr-for-deals | List of IAB attributes allowed for deals in general or a specific dealid. | array of strings | deal-ids (array of strings). This isn't a true override - values are added to the global. | See Table 5.3 in the [OpenRTB 2.5 spec](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf) for the possible values. Here's an example account config for PBS-Java: -``` + +```json { "hooks": { "modules": { @@ -786,7 +799,8 @@ Here's an example account config for PBS-Java: ``` For PBS-Go -``` + +```json { "hooks": { "modules": { @@ -819,9 +833,11 @@ For PBS-Go ``` ### Enable for Spring Boot -In order to allow the module to be picked up by Prebid Server, a Spring Boot configuration property `hooks.ortb2-blocking.enabled` must be set to `true`. + +In order to allow the module to be picked up by PBS-Java, a Spring Boot configuration property `hooks.ortb2-blocking.enabled` must be set to `true`. Here's an example of how your PBS configuration YAML should look like: + ```YAML hooks: ortb2-blocking: @@ -851,7 +867,8 @@ It's only applied to attributes where `enforce-blocks` is true, which means 'bty 1. **bidder**: the biddercode of the blocked response Here's an example analytics tag that might be produced for use in an analytics adapter: -``` + +```json [{ activities: [{ name: "enforce-blocking", @@ -908,4 +925,4 @@ Here's an example analytics tag that might be produced for use in an analytics a ## Further Reading - [Prebid Server Module List](/prebid-server/pbs-modules/index.html) -- [Building a Prebid Server Module ](/prebid-server/developers/add-a-module.html) +- [Building a Prebid Server Module](/prebid-server/developers/add-a-module.html) From 56b4b0bed0c60fe2ea6f461e5b8fd61ca3f86213 Mon Sep 17 00:00:00 2001 From: qt-io <104574052+qt-io@users.noreply.github.com> Date: Fri, 6 Sep 2024 20:38:43 +0300 Subject: [PATCH 186/816] QT: add tcfeu support (#5576) * New Adapter: QT * pbs marked as false * pbs set to true * add GVLID --------- Co-authored-by: qt-io --- dev-docs/bidders/qt.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/qt.md b/dev-docs/bidders/qt.md index f12968c8e7..2ccd991c20 100644 --- a/dev-docs/bidders/qt.md +++ b/dev-docs/bidders/qt.md @@ -4,7 +4,8 @@ title: QT description: Prebid QT Bidder Adapter biddercode: qt gpp_sids: usstate_all -tcfeu_supported: false +gvl_id: 1331 +tcfeu_supported: true usp_supported: true coppa_supported: true schain_supported: true From 16f3817c53c44f0388c643d0b6d99f83a413d48a Mon Sep 17 00:00:00 2001 From: Yanivplaydigo <165155195+Yanivplaydigo@users.noreply.github.com> Date: Fri, 6 Sep 2024 21:27:40 +0300 Subject: [PATCH 187/816] Playdigo: add tcfeu support (#5570) * init adapter * add gpp support * upd * add gvl id --- dev-docs/bidders/playdigo.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/playdigo.md b/dev-docs/bidders/playdigo.md index 8dbdb1c13d..a5c968f5e6 100644 --- a/dev-docs/bidders/playdigo.md +++ b/dev-docs/bidders/playdigo.md @@ -4,7 +4,8 @@ title: Playdigo description: Prebid Playdigo Bidder Adapter biddercode: playdigo gpp_sids: usstate_all -tcfeu_supported: false +gvl_id: 1302 +tcfeu_supported: true usp_supported: true coppa_supported: true schain_supported: true From e3af7e76953a0f08be42565b58a30f220e3a7eb8 Mon Sep 17 00:00:00 2001 From: Oleksandr Balashov Date: Fri, 6 Sep 2024 21:40:31 +0300 Subject: [PATCH 188/816] Loopme: Add Bidder (#5564) Co-authored-by: Oleksandr Balashov --- dev-docs/bidders/loopme.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 dev-docs/bidders/loopme.md diff --git a/dev-docs/bidders/loopme.md b/dev-docs/bidders/loopme.md new file mode 100644 index 0000000000..bd289582b4 --- /dev/null +++ b/dev-docs/bidders/loopme.md @@ -0,0 +1,28 @@ +--- +layout: bidder +title: Loopme +description: Loopme Bidder Adapter +biddercode: loopme +gvl_id: 109 +media_types: banner, video, audio, native +coppa_supported: true +tcfeu_supported: true +usp_supported: true +prebid_member: false +pbjs: false +pbs: true +schain_supported: true +floors_supported: true +multiformat_supported: will-bid-on-any +ortb_blocking_supported: true +sidebarType: 1 +--- + +### Prebid Server Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|---------------------------------------------|----------------|-----------| +| `publisherId` | required | A ID which identifies Loopme partner. | `'45qkf5s9zf'` | `string` | +| `bundleId` | required | A ID which identifies app/site in Loopme. | `'v5qvf9fx4f'` | `string` | +| `placementId` | required | A placement ID in Loopme. | `'x6fnvfd7ty'` | `string` | From 028b23f4cc889a049d3627ba4b24fae3bbb7468d Mon Sep 17 00:00:00 2001 From: escalax Date: Fri, 6 Sep 2024 22:05:22 +0300 Subject: [PATCH 189/816] New Adapter: Escalax (#5486) * init escalax adapter * fixes --- dev-docs/bidders/escalax.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 dev-docs/bidders/escalax.md diff --git a/dev-docs/bidders/escalax.md b/dev-docs/bidders/escalax.md new file mode 100644 index 0000000000..f3b1b2cbe9 --- /dev/null +++ b/dev-docs/bidders/escalax.md @@ -0,0 +1,34 @@ +--- +layout: bidder +title: Escalax +description: Prebid Escalax Bidder Adaptor +biddercode: escalax +usp_supported: true +ccpa_supported: true +coppa_supported: true +schain_supported: true +media_types: banner, video, native +safeframes_ok: true +deals_supported: true +pbs: true +sidebarType: 1 +floors_supported: true +prebid_member: false +fpd_supported: false +gvl_id: none +multiformat_supported: will-bid-on-one +ortb_blocking_supported: true +userIds: all +--- + +### Note + +The Escalax Bidding adapter requires setup before beginning. Please contact us at + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|-----------------------|-----------|-----------| +| `sourceId` | required | Patner name | `'partner'` | `string` | +| `accountId` | required | Hash | `'0800fc577294'` | `string` | From 889c68010de3bfbad2c5f392826be4a795a5014d Mon Sep 17 00:00:00 2001 From: benben2001 <145416009+benben2001@users.noreply.github.com> Date: Sat, 7 Sep 2024 03:11:54 +0800 Subject: [PATCH 190/816] Add MeloZen bidder adapter documentation (#5467) * Add MeloZen bidder adapter documentation * Update media_types --- dev-docs/bidders/melozen.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 dev-docs/bidders/melozen.md diff --git a/dev-docs/bidders/melozen.md b/dev-docs/bidders/melozen.md new file mode 100644 index 0000000000..0e0defba15 --- /dev/null +++ b/dev-docs/bidders/melozen.md @@ -0,0 +1,31 @@ +--- +layout: bidder +title: MeloZen +description: Prebid MeloZen Bidder Adaptor +biddercode: melozen +schain_supported: true +dchain_supported: false +media_types: banner, video, native +deals_supported: false +floors_supported: true +fpd_supported: false +pbjs: false +pbs: true +pbs_app_supported: true +prebid_member: false +multiformat_supported: will-bid-on-one +ortb_blocking_supported: false +sidebarType: 1 +--- + +### Note + +The MeloZen Bidding adapter requires setup before beginning. Please contact us at + +### Bid Params + +{: .table .table-bordered .table-striped } + +| Name | Scope | Description | Example | Type | +|---------|----------|-----------------------------------|--------------|----------| +| `pubId` | required | The publisher's ID provided by MeloZen | `'386276e072'` | `string` | From a019ca57df8585c67648521e3641e143c96b54d2 Mon Sep 17 00:00:00 2001 From: Ben Oraki <46795400+BenOraki@users.noreply.github.com> Date: Tue, 10 Sep 2024 15:32:43 +0300 Subject: [PATCH 191/816] New Adapter: Oraki (#5403) --- dev-docs/bidders/oraki.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 dev-docs/bidders/oraki.md diff --git a/dev-docs/bidders/oraki.md b/dev-docs/bidders/oraki.md new file mode 100644 index 0000000000..93aff844ac --- /dev/null +++ b/dev-docs/bidders/oraki.md @@ -0,0 +1,35 @@ +--- +layout: bidder +title: Oraki +description: Prebid Oraki Bidder Adapter +biddercode: oraki +gpp_sids: usstate_all +tcfeu_supported: false +usp_supported: true +coppa_supported: true +schain_supported: true +deals_supported: false +floors_supported: true +fpd_supported: false +ortb_blocking_supported: false +media_types: banner, video, native +multiformat_supported: will-bid-on-one +userIds: all +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 78bfc69102fc9ca9d67fc4e5c9ce63afe90d65d3 Mon Sep 17 00:00:00 2001 From: danijel-ristic <168181386+danijel-ristic@users.noreply.github.com> Date: Thu, 12 Sep 2024 11:29:34 +0200 Subject: [PATCH 192/816] Target video module download docs (#5581) * Add tv module to download page * Fix --------- Co-authored-by: Muki Seiler --- dev-docs/modules/targetVideo_video.md | 30 +++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 dev-docs/modules/targetVideo_video.md diff --git a/dev-docs/modules/targetVideo_video.md b/dev-docs/modules/targetVideo_video.md new file mode 100644 index 0000000000..013e73c4c8 --- /dev/null +++ b/dev-docs/modules/targetVideo_video.md @@ -0,0 +1,30 @@ +--- +layout: page_v2 +page_type: module +title: Module - TargetVideo Video +description: Required for serving instream video through TargetVideo. +module_code : targetVideoAdServerVideo +display_name : TargetVideo Video Support +enable_download : true +vendor_specific: true +sidebarType : 1 +--- + + + +# TargetVideo Video + +{:.no_toc} + +This module is required to use the Prebid Instream video examples with TargetVideo. For instructions showing how to add this module to Prebid.js, see below. + +## Step 1: Prepare the base Prebid file as usual + +The standard options: + +- Build from a locally-cloned git repo +- Receive the email package from the Prebid [Download](/download.html) page + +## Step 2: Integrate into your prebid.js configuration + +The method exposes the [`pbjs.adServers.targetVideo.buildVideoUrl`]({{site.baseurl}}/dev-docs/publisher-api-reference/adServers.targetVideo.buildVideoUrl.html) method to use. From cf0f92b4141ca29a9e7cd7c376ae67e815b2ac39 Mon Sep 17 00:00:00 2001 From: Muki Seiler Date: Thu, 12 Sep 2024 22:34:41 +0200 Subject: [PATCH 193/816] Add tcf configuration information to utiq (#5557) * Add tcf configuration information to utiq * wording updates We changed the name of the "GDPR Enforcement" module a while back --------- Co-authored-by: bretg --- dev-docs/modules/userid-submodules/utiq.md | 24 ++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/dev-docs/modules/userid-submodules/utiq.md b/dev-docs/modules/userid-submodules/utiq.md index 270f93b30b..116f4eaa66 100644 --- a/dev-docs/modules/userid-submodules/utiq.md +++ b/dev-docs/modules/userid-submodules/utiq.md @@ -30,6 +30,30 @@ pbjs.setConfig({ }) ``` +You can find more information at [docs.utiq.com/docs/programmatic-integration](https://docs.utiq.com/docs/programmatic-integration) + +### TCF Activity Integration + +If you use the Prebid.js [TCF Control Module](/dev-docs/modules/tcfControl.html), which prevents access to local storage for non consented vendors, you may need to add a vendor exception for the Utiq user id module to work, as Utiq is not a TCF vendor and will be automatically blocked by Prebid when TCF Control is enabled. Utiq performs its own consent check, outside TCF, to ensure that there is no device storage access in the absence of consent. + +To do that, you can use below configuration: + +```javascript +pbjs.setConfig({ + consentManagement: { + gdpr: { + cmpApi: 'iab', + rules: [{ // these are the default values + purpose: "storage", + enforcePurpose: true, // block localStorage based on purpose 1 of TCF + enforceVendor: true, // block localStorage for non consented / non TCF vendors + vendorExceptions: ["utiqId"] // configuration line to add to make utiq exception + }] + } + } +}); +``` + ## Utiq ID onboarding If you wish to find out more about Utiq, please contact From 75a9b918242418cababc5ab313299069aea66aa9 Mon Sep 17 00:00:00 2001 From: mp4symitri Date: Fri, 13 Sep 2024 02:30:10 +0530 Subject: [PATCH 194/816] symitriDapRtdProvider: describe changes required to support different types of user identifiers and trigger pixel on winning bid. (#5590) * Document updates to describe changes required to support different types of user identifiers and trigger pixel on winning bid. * Fixed tabular format issues * Formatting Issues fixed --------- Co-authored-by: Manan Co-authored-by: Jeff Palladino <1226357+jpalladino84@users.noreply.github.com> --- dev-docs/modules/symitriDapRtdProvider.md | 25 +++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/dev-docs/modules/symitriDapRtdProvider.md b/dev-docs/modules/symitriDapRtdProvider.md index f44c83f9df..34f5207887 100644 --- a/dev-docs/modules/symitriDapRtdProvider.md +++ b/dev-docs/modules/symitriDapRtdProvider.md @@ -45,11 +45,12 @@ pbjs.setConfig({ apiVersion: "x1", apiAuthToken: '', domain: 'your-domain.com', - identityType: 'hid'| ... | 'dap-signature:1.0.0', - identityValue: '', + identityType: 'simpleid'|'compositeid'|'hashedid'|'dap-signature:1.0.0', + identityValue: '', segtax: 501, dapEntropyUrl: 'https://sym-dist.symitri.net/dapentropy.js', - dapEntropyTimeout: 1500 + dapEntropyTimeout: 1500, + pixelUrl: '', } } ] @@ -70,11 +71,27 @@ Please reach out to your Symitri account representative() to | apiVersion | String | This holds the API version | It should be "x1" always | | apiAuthToken | String | Symitri API AuthToken | Please reach out to your Symitri account representative() for this value | | domain | String | The domain name of your webpage | | -| identityType | String | Something like this 'hid', ... 'dap-signature:1.0.0' | | +| identityType | String | 'simpleid' or 'compositeid' or 'hashedid' or 'dap-signature:1.0.0' | See the section below labelled "identityType" for more details. | | identityValue | String | This is optional field to pass user hid. Will be used only if identityType is hid | | | segtax | Integer | The taxonomy for Symitri | The value should be 501 | | dapEntropyUrl | String | URL to dap entropy script | Optional if the script is directly included on the webpage. Contact your Symitri account rep for more details | | dapEntropyTimeout | Integer | Maximum time allotted for the entropy calculation to happen | | +| pixelUrl | String | Pixel URL provided by Symitri which will be triggered when bid matching with Symitri dealid wins and creative gets rendered | | + +### identityType +Use 'simpleid' to pass email or other plain text ids and SymitriRTD Module will hash it. + +Use 'hashedid' to pass in single already hashed id. + +Use 'compositeid' to pass in multiple identifiers as key-value pairs as shown below: + +```bash +{ + "identityType1": "identityValue1", + "identityType2": "identityValue2", + ... +} +``` ### Testing From 622ec2a286d9c1c91908f3cd81db41a7997fb04e Mon Sep 17 00:00:00 2001 From: Copper6SSP Date: Fri, 13 Sep 2024 00:04:39 +0300 Subject: [PATCH 195/816] Copper6ssp: add pbs (#5592) * release adapter Copper6SSP * fix checks * fix doc --- dev-docs/bidders/copper6ssp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/copper6ssp.md b/dev-docs/bidders/copper6ssp.md index d9cb4b2f49..a11dc64104 100644 --- a/dev-docs/bidders/copper6ssp.md +++ b/dev-docs/bidders/copper6ssp.md @@ -16,7 +16,7 @@ media_types: banner, video, native multiformat_supported: will-bid-on-one userIds: all pbjs: true -pbs: false +pbs: true pbs_app_supported: true safeframes_ok: true sidebarType: 1 From 3f44a09e129ea0bda5c7ba973493d958e4cc1d1f Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 13 Sep 2024 06:25:01 -0400 Subject: [PATCH 196/816] added ctv page (#5589) * added ctv page * linking to CTV * removing comment test * Add ctv icon as svg * Use correct icon and remove size constraints * Implement hover effect --------- Co-authored-by: Muki Seiler --- _data/sidebar.yml | 8 +++++++ _includes/icon__format--ctv.svg | 1 + _layouts/home.html | 6 +++++ _sass/components/_card.scss | 7 ++++++ assets/images/homepage/amp_blue.png | Bin 0 -> 7934 bytes assets/images/homepage/amp_grey.png | Bin 0 -> 7826 bytes assets/images/homepage/amp_orange.png | Bin 0 -> 7420 bytes assets/images/homepage/audio_blue.png | Bin 0 -> 7946 bytes assets/images/homepage/audio_grey.png | Bin 0 -> 7575 bytes assets/images/homepage/audio_orange.png | Bin 0 -> 7426 bytes assets/images/homepage/ctv_blue.png | Bin 0 -> 8811 bytes assets/images/homepage/ctv_grey.png | Bin 0 -> 8417 bytes assets/images/homepage/ctv_orange.png | Bin 0 -> 8371 bytes assets/images/homepage/display_blue.png | Bin 0 -> 15816 bytes assets/images/homepage/display_grey.png | Bin 0 -> 15033 bytes assets/images/homepage/display_oramge.png | Bin 0 -> 14888 bytes assets/images/homepage/docs_blue.png | Bin 0 -> 11861 bytes assets/images/homepage/docs_grey.png | Bin 0 -> 11339 bytes assets/images/homepage/docs_orange.png | Bin 0 -> 11114 bytes assets/images/homepage/dooh_blue.png | Bin 0 -> 9406 bytes assets/images/homepage/dooh_grey.png | Bin 0 -> 8641 bytes assets/images/homepage/dooh_orange.png | Bin 0 -> 9027 bytes assets/images/homepage/id_blue.png | Bin 0 -> 14121 bytes assets/images/homepage/id_grey.png | Bin 0 -> 13294 bytes assets/images/homepage/id_orange.png | Bin 0 -> 13159 bytes assets/images/homepage/mobile_blue.png | Bin 0 -> 12542 bytes assets/images/homepage/mobile_grey.png | Bin 0 -> 12270 bytes assets/images/homepage/mobile_orange.png | Bin 0 -> 11906 bytes assets/images/homepage/multi_blue.png | Bin 0 -> 4109 bytes assets/images/homepage/multi_grey.png | Bin 0 -> 4141 bytes assets/images/homepage/multi_orange.png | Bin 0 -> 4108 bytes assets/images/homepage/native_blue.png | Bin 0 -> 10609 bytes assets/images/homepage/native_grey.png | Bin 0 -> 10064 bytes assets/images/homepage/native_orange.png | Bin 0 -> 9937 bytes assets/images/homepage/pbjs_blue.png | Bin 0 -> 11047 bytes assets/images/homepage/pbjs_grey.png | Bin 0 -> 10325 bytes assets/images/homepage/pbjs_orange.png | Bin 0 -> 10272 bytes assets/images/homepage/server_blue.png | Bin 0 -> 17431 bytes assets/images/homepage/server_grey.png | Bin 0 -> 16229 bytes assets/images/homepage/server_orange.png | Bin 0 -> 16220 bytes assets/images/homepage/video_blue.png | Bin 0 -> 12157 bytes assets/images/homepage/video_grey.png | Bin 0 -> 11454 bytes assets/images/homepage/video_orange.png | Bin 0 -> 11493 bytes formats/ctv.md | 26 ++++++++++++++++++++++ formats/video.md | 5 +---- 45 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 _includes/icon__format--ctv.svg create mode 100644 assets/images/homepage/amp_blue.png create mode 100644 assets/images/homepage/amp_grey.png create mode 100644 assets/images/homepage/amp_orange.png create mode 100644 assets/images/homepage/audio_blue.png create mode 100644 assets/images/homepage/audio_grey.png create mode 100644 assets/images/homepage/audio_orange.png create mode 100644 assets/images/homepage/ctv_blue.png create mode 100644 assets/images/homepage/ctv_grey.png create mode 100644 assets/images/homepage/ctv_orange.png create mode 100644 assets/images/homepage/display_blue.png create mode 100644 assets/images/homepage/display_grey.png create mode 100644 assets/images/homepage/display_oramge.png create mode 100644 assets/images/homepage/docs_blue.png create mode 100644 assets/images/homepage/docs_grey.png create mode 100644 assets/images/homepage/docs_orange.png create mode 100644 assets/images/homepage/dooh_blue.png create mode 100644 assets/images/homepage/dooh_grey.png create mode 100644 assets/images/homepage/dooh_orange.png create mode 100644 assets/images/homepage/id_blue.png create mode 100644 assets/images/homepage/id_grey.png create mode 100644 assets/images/homepage/id_orange.png create mode 100644 assets/images/homepage/mobile_blue.png create mode 100644 assets/images/homepage/mobile_grey.png create mode 100644 assets/images/homepage/mobile_orange.png create mode 100644 assets/images/homepage/multi_blue.png create mode 100644 assets/images/homepage/multi_grey.png create mode 100644 assets/images/homepage/multi_orange.png create mode 100644 assets/images/homepage/native_blue.png create mode 100644 assets/images/homepage/native_grey.png create mode 100644 assets/images/homepage/native_orange.png create mode 100644 assets/images/homepage/pbjs_blue.png create mode 100644 assets/images/homepage/pbjs_grey.png create mode 100644 assets/images/homepage/pbjs_orange.png create mode 100644 assets/images/homepage/server_blue.png create mode 100644 assets/images/homepage/server_grey.png create mode 100644 assets/images/homepage/server_orange.png create mode 100644 assets/images/homepage/video_blue.png create mode 100644 assets/images/homepage/video_grey.png create mode 100644 assets/images/homepage/video_orange.png create mode 100644 formats/ctv.md diff --git a/_data/sidebar.yml b/_data/sidebar.yml index 3cebde6074..558c9d7ff8 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -1714,6 +1714,14 @@ sectionTitle: subgroup: 0 +- sbSecId: 6 + title: Connected TV + link: /formats/ctv.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 0 + - sbSecId: 6 title: Native link: /prebid/native-implementation.html diff --git a/_includes/icon__format--ctv.svg b/_includes/icon__format--ctv.svg new file mode 100644 index 0000000000..9c018e0d38 --- /dev/null +++ b/_includes/icon__format--ctv.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_layouts/home.html b/_layouts/home.html index 19af7069e8..e9df870893 100644 --- a/_layouts/home.html +++ b/_layouts/home.html @@ -71,6 +71,12 @@

Formats

{% include icon__format--video.svg %}
+
+
+ Connected TV +
{% include icon__format--ctv.svg %}
+
+
AMP diff --git a/_sass/components/_card.scss b/_sass/components/_card.scss index 956a0d05d8..fc1588d2d5 100644 --- a/_sass/components/_card.scss +++ b/_sass/components/_card.scss @@ -88,6 +88,13 @@ } } } + + /** this is required for the CTV icon the path segment is not painted, but filled */ + + .card-media-ctv { + path { + fill: $t-text-color--reverse; + } + } } + .card-media { diff --git a/assets/images/homepage/amp_blue.png b/assets/images/homepage/amp_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..5352c633c065bf8dcde0619aeb8acf7b6f73035f GIT binary patch literal 7934 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 BWLW?J literal 0 HcmV?d00001 diff --git a/assets/images/homepage/amp_orange.png b/assets/images/homepage/amp_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..77d8befea560266cf77186c6aa3caa1cf16c636c GIT binary patch literal 7420 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 literal 0 HcmV?d00001 diff --git a/assets/images/homepage/audio_grey.png b/assets/images/homepage/audio_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..f1e570f238f4e50910788cf0808e49ae33a71454 GIT binary patch literal 7575 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 V(4kfp{$+4x&+Y^66`u!D{|9wwa>M`t literal 0 HcmV?d00001 diff --git a/assets/images/homepage/audio_orange.png b/assets/images/homepage/audio_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..2cc8e04f8bbf67c82debce1eda245ac084ab9d44 GIT binary patch literal 7426 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 b#c|=LTplj%Qum$)(Uh%?qji<#g)9F7_**+) literal 0 HcmV?d00001 diff --git a/assets/images/homepage/ctv_grey.png b/assets/images/homepage/ctv_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..ef6a1a6a239bf8e11dc00a3b1ec4336ceefdc2ba GIT binary patch literal 8417 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 literal 0 HcmV?d00001 diff --git a/assets/images/homepage/ctv_orange.png b/assets/images/homepage/ctv_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..6849069b98d6a4522fc005cb6459548a55e66587 GIT binary patch literal 8371 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 MaJB#aaKNR10~SM0I{*Lx literal 0 HcmV?d00001 diff --git a/assets/images/homepage/display_blue.png b/assets/images/homepage/display_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd07326ff90cd0d013939893d12e4c9a80f4c65 GIT binary patch literal 15816 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%0Am-; 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

VHcGK=~(xp9B+ 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 K%g^1o^S=P&z{^tr literal 0 HcmV?d00001 diff --git a/assets/images/homepage/docs_blue.png b/assets/images/homepage/docs_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..9a014c9da42c77af86acc9fa1c4f053c27c84ae5 GIT binary patch literal 11861 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

6J&QN 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 literal 0 HcmV?d00001 diff --git a/assets/images/homepage/dooh_orange.png b/assets/images/homepage/dooh_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..7cb4a8a6f74880ecb9166f3c986c58ba72b3ffcc GIT binary patch literal 9027 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 literal 0 HcmV?d00001 diff --git a/assets/images/homepage/id_blue.png b/assets/images/homepage/id_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..e5750c2e3c778fc6055b74506ceacaf48d0755b2 GIT binary patch literal 14121 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 literal 0 HcmV?d00001 diff --git a/assets/images/homepage/id_grey.png b/assets/images/homepage/id_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..afa17e0a87277aa39494f582beb46b9abea962c5 GIT binary patch literal 13294 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 literal 0 HcmV?d00001 diff --git a/assets/images/homepage/id_orange.png b/assets/images/homepage/id_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..9afccb09835fac08b3d91e936146d7a38250e177 GIT binary patch literal 13159 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 literal 0 HcmV?d00001 diff --git a/assets/images/homepage/mobile_blue.png b/assets/images/homepage/mobile_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..d3b6a07f34af69ce0f20986dfbf76dc3cad6db1f GIT binary patch literal 12542 zcmdUVc|4Ts+xR$jjuRCpTbpGfWScmcEHi3SwxTRawk$)!jLZnbpfZ)j*cHOWP>KoJ z4X0Bm+i0pYWUFMxSYw7^Y`b%Q*$zP9JOuDCPS zW;;aoihw|%9Tw)MwjhuYSMc}iFThC0U&D8R$F?AICkzO*^OfLFC|!N$J`iYYgrEI+ z?D^BD4872SS{~kLPo!2@U=RQe0vVfx1$lV+Be4peNMAn`Ol78_Sw+Fm8>Zr@clz+@ zpyS9(e&)Dfq#e%M-V5jNW#Fx10v9n3GXw|(BC#F{VSxcCjA0l|WrMCE@LMnpQ2~I0 zy?qRAO;3IY0p4ILm$29%LkJ`^G*m0}cP(_VFGSnGzyNYs2cn~+2|#FK!cka{FijLj z5uhNVutCEViSY{d3&Q%LQ3?W@9-inBEKEg3MBzK>V_0mkpXU$iD2$fJ#z=?&MGM$8 z#KRi{(bhUFU`s*4coW|6m^Vi7y19rQ^2)}`=39W@#!5jR!5E}{cn}h%VvEF}LxR1K z8x#ac--#R#MtWe8-f*46I=Y&N4Kxq`ZVdS^Q-U@AK{yeHweW^}Lv;;&biJUOUb;tq z*VNTLa#+(q8>*+NtM8$!tNXi-0TikGgU}|*f08-r2~g3~(bLh_Gtk!6h8pM{Is5}* zWAZ=Y?a?7#mjqjZ>-+%wXKVx37$P{`0Kd&c*?9SWDnBqbk8Bh0U)S<~e^uUIKdvb# zBsgG01iZZ<$N*#@5``69lJ@sY^7b;s`e6f*|6I|r0PKHW5g>bp0Ujt{m`a$YH`2!= zBmk=dH${746fC^ZD2#%pg0_1g+S4xp>Fya2g8Xmx_no9M-?v{Evj zc?A7S5dbj54FN_6+oRC|@Z%n+s~*OX|2q8Nva-n?px=O|Lw?u;;N^!!L81UN5)9Z2 zYKPMZ2&4eAFg<1;mNPXd`uv~+o;7P-;Zx+0Rn#!^SWR5Y?8+aH78PP{|B`p{q@;2| z0r<|Hn~yFj!ql-4)0UtM|X>-?Qv3a47E& z`*fnk+}tbEbhI^w14fvKy$N2eKc;Os#7yqc`nV=v$k+)IGLL`jWryspS@Oupo{CMf zW?s&&y5Xsu>ShOeu5sw33bH*?Glp#x^JMbN`$CjP`nVhaCzx% zMab_RWQMMS<;bnpZ!iqvc5(0g*8=*)UUBlN`!*I3P;64vLD?){OG@BTds}3#3jT`( z0(bvyes2YlyI0s$(GI5^BatUgr#($~8;Ma>Dv3PZuM(CuVbp5UP|_J%;o^ScS3med zPQy@cv?6arZ7O$$*)27}Dk@|c=JP%-?|DD_aIPLZ!ZgKo9-aK4{4*Pp$8f+a_5!mRTd^Z}Q57n9d@WfK$A z

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 UM!er{fK@(YeBP)O;u8Ho00~CKnE(I) literal 0 HcmV?d00001 diff --git a/assets/images/homepage/mobile_orange.png b/assets/images/homepage/mobile_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..d64d8d754d315950364117c000db0a5db109b2a6 GIT binary patch literal 11906 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\(j^4wMdkF6J@6Ioa*HPONs@M11e0^n1f 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 A`2YX_ literal 0 HcmV?d00001 diff --git a/assets/images/homepage/multi_blue.png b/assets/images/homepage/multi_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..41f9adf1a4188df8e6d0cfc5c40f525b772352d0 GIT binary patch literal 4109 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 U3ocx5k0lnOl`)FiU+>TV7ybRz>i_@% literal 0 HcmV?d00001 diff --git a/assets/images/homepage/native_blue.png b/assets/images/homepage/native_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..11d04a30f8b36875c89359e75480025f9ed3ce8f GIT binary patch literal 10609 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 literal 0 HcmV?d00001 diff --git a/assets/images/homepage/native_grey.png b/assets/images/homepage/native_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..b0e05104225908041d5ceda3ab79a335f5dcc616 GIT binary patch literal 10064 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 literal 0 HcmV?d00001 diff --git a/assets/images/homepage/native_orange.png b/assets/images/homepage/native_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..1ceb4df5fdff53b23a03d204ca3e57b9f43f290e GIT binary patch literal 9937 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 literal 0 HcmV?d00001 diff --git a/assets/images/homepage/pbjs_blue.png b/assets/images/homepage/pbjs_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..f0637e301f8cc7a1c892ac79c303028768dfd1f5 GIT binary patch literal 11047 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 literal 0 HcmV?d00001 diff --git a/assets/images/homepage/server_blue.png b/assets/images/homepage/server_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..dd0aa9bf920c4388e6b116cc0ba7c0ac6a60ab2f GIT binary patch literal 17431 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 V6&y(mf%A#@1RAtoTANJnX+bdU~_E+v3R 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

M^;ycAWO+L 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 YO+8M&d(VCF-8{%Z*XUZ6&i#o00Z!0ynE(I) literal 0 HcmV?d00001 diff --git a/assets/images/homepage/server_orange.png b/assets/images/homepage/server_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..8a3fc29d8fcf33120957b3f3668d5525f6caa222 GIT binary patch literal 16220 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 literal 0 HcmV?d00001 diff --git a/assets/images/homepage/video_blue.png b/assets/images/homepage/video_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..c73c3fb32408c70dfc406f7b7e67d770a627dc3a GIT binary patch literal 12157 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 RHVG8AFtt5hV(bz7zW|!O(4hbT literal 0 HcmV?d00001 diff --git a/assets/images/homepage/video_grey.png b/assets/images/homepage/video_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..3e715394741f37b93ba452c445aaeda276348eb9 GIT binary patch literal 11454 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�rI6zO84_5qLj7o4=VbE0RyaHdjCeagQW=#Jy!K0;qFz<2z5;w07!yjK7*E?OrQ-$nN&)vmCzN zWNNpMh>23bkdpz;6+7ElRy=w?=19t@a(-<4LPC$PUhKJs;tXiE#FH(u+Y)XnwvlfZ zWGOubF8*nbaYtVae%mYf$Z00c+G^r;B+mv?c^`9jBK=nn!}XK6*p%6vFvdrnZu8ET zL&KX##144+cg7zGg0>^SI5t;$jLpzCG*5Fw+Y-D0Xm_>b)VjWV%tB!v8S<~O7Q(xV z23Z#jLyyGV@X%=^1K%u6)m-yhRoZq)82!+=y5XIdQoPMKlD)!17JrX+THC6<`!7rl zd9J~L`$&^Gr8AxWCf(-w+FAqA=E*veMGChIw%1sn_ZsjfBSQQ8>Oy(D+Ey`Br@cZ| z@5Ic)t3KF7l!x{Av1@uR1JrJjh!QY#GGUTe^BOpTt&hiqPu!hB>}(_NX6 zsV&)V+Qsbb4&?S(G7!C_;8bOxkK{^7uw)jZCKb zNSswVZnQ2r1pxUNHTC$`wKM3&m@d0d1U_D+J*=N+iTDEOvn>xr|Gq{-kVmC#!p7h8 z7A8~+s{r;%-5ht;{AzwP(9q|Eqd1YC>5K3=)mn(Mx6Jb*t<7f%arCVu(}$mxZYoh< zdx=&k+=;eq-V_(b8scT}1E1~40&N?CDU671QAotur>l+gXYV=QQ*F@N)CNGmt$a_d zYwD+ka8}dC-T7%-NuKI$t43WS}MC@8p7t-!o+i^Z9o5o2oZ|$kid}tgeZerpAT& z99bWQcVk-9bYe;?@M1Gq_PsC`kpAo^s`BSAsc%R1nirIs^d-+1B!@S-Ic1lOH)KsI ziXA$C$Ub3ghxtN-ZMK9(hs{}Y!wd5*Nq^2=2EIAL-9_QWp6{S)xdxDN<}r;t@q>tK nItgB^rvH)OvWbK`dt_1d=u_9}uJ{Ze(fEjs)8TTfvlspsWsJ@2yhr+ezUOfskKg&7^UwLi<^6izudmnZ`F`IzV`sT({U7Va z#KbmPojTzlCbo(r`jJ`-thDvf)z1|U#GM1*F9jwU?RA9Pq>Umv8U4bs-u05CKVQ6WgLNR1GLGQeTI z(h`poz6e-oz-43rJVZ&v)5{wkh6JmqtXKNQ+6;*d4eoINQZv~$p>bD3_u3^{wqXg!N`9P5s-TZ!CoQ$V3kM>A74MOuwbN$ z@d-E#p=1Svhai+Rl(eDY0Y1KPC_EHE^ZhRj{KeA<^bc|W3-d1jBgsW+xKwMR1Oxzp zZ92bf1D*`b!jKo?p~hw*z@LyPCC9K(AGnbSZv_Hm|56P8M}7v%^S7h_O_4~i%m1hZ z0L@@2gW;i0aCoq>xmQTIml5bcFaMXSENcf8I8f@K-wgqH_}x-`Lx4UK3N(z}R7Y1a zF(omp6J}14xs!uY&()pJgFesrpL%gYNwx5Vg+yy%;VQ(MlbYA1TKA{iyse~g7tuLI zj0lz5wQsY%lIm8c&)TXFPm6Dr-7bFY#5eI(SueHzGCiItvDfEw7XdnByzSdYBB2a* z_6e5Gn9sLUYT&t*m5ot*2hXN$U21gy7k_;VI!d|KfkFlJ#ARC%RL2_FT}cksn+Sh0 zCGDX}Jf{VILs6|Bjq(AokcP1= z=g`%gJ{-h373f;Q1N$gXY*>iLw@kqPU{tho7)MsCzHFc!M=7 zV=rxr)sEL_T6GZDb35?vVl8J;_URjIe%9AL$$(T3$x8cf2ZoeO0t^aC)Wy9T6`Or^e zPN6#w=tzJcD|ERJ>2S|7aU=L&tvIrWS==s>ZE|o>NA65{ZcJ*8HtTf6p+Ozf z3~%~ua-!ff^xo7iY1N>U`NiDysa=IZRdDoGQ-6;4_XQV=LZK}ayNb{kT;jG4X#qOd z*`_Tn$ing0j9y&h_goQ~auWEvSl2vM} zI81NACTHde(F)WPP8_Sh_x-+EwCE0Qz=_EXpk^PmHD0e zr-Y1WLg52g>zHMsPPn*yvx@jkhJU|jS3Y{a6jzYUn48+0VPXZ(LC>@Olol5syjB-J zI7vU^Gqay8YZxm%yv-}(%W2w#E8(?!8x#W1510qssLwY+G-EouN6s(0gV!OO?FwH% zKXG&MRXc5BKNy6b&talu`G2Lf>)tp|zkQm*_$S_*@aHvG9)ig^aG}T~YH! zZ3WdTv7OJ?A$J$_?^Fbv_c!@XeTPs6y=AEiBl<%otN`DRPGq(0EEozDs4YX@JRBmP zR|RNgw(bAs*MrLvpe}y?2FBL}MUv+iX}gFI+|>Cy?G;U0f6|HVS_QMp%kJx4 zyr6!Z{jL8f^pBaoIfl+YDL9>pC@;0F*}F5$vq$k{9+~;GPLt33#QaHXN#eZF%rHSH zE=dy;&s#5r6pOW6^Z&@ERjUnlY##k@qTk*zn#y6>`vZL<>;PG|pxAP(F~4(g-4E;{<44)I_}Zdf0Bu%@mv z3FXxjP=zsiFpw2;9@QX!D7JGnX;O+faEi1UvtU0_Xq^9{&LI$DOHmnSrzn47d7{t? zcN6uu1J2aBYnoE@gWo(I^L(!J%p=0sHuj(MvAEjtz3(!0M4pw9;moS;OI97yxhh}a zpiAXHuydK61@D(d0AVTddl9Q(h8+z<8A$iwwRF42sV zo%LQ1g;Z9~Ra z^D-R92w^BFO>o<%Jz=g&J|^%(hG!z`#vkEU#33a*lY~omC8y z`RtHmy{WXXJHy~(?NCokt;v3%&V$w~-fuA!8fsJ)&4>3eJ1hv0Y7P0pF!-74;k28k zi#5#Jr}<6wFYHmh8Sy(t6FnX0q`>*YONglpi&X=sTabe?J>`Rb-Z|*kxt2`U!NHh< z)doe*+T-r|az~^%jyBvu5qyU<2cZ+8$_SfZs2uaoL0OLM8H-4tss{mjtNk%L&it4t z|1QFL(%~MtZsZ;^wZEw;b;lTuatFts672}qYf#m9rm~}ui_RWky-G;qd8}7o?ep|0 zdji8)3Tc6NDa7OWzSy3KQ0J~q6WeIiVePuNaexFFk%XOqgsLpdH4)6Q`dG}q!Wc~* za$VYQU@FqJ)2_ITv8F;zhg{%Epf9n!P-p^%N&f7u$lvw6qQA2#vr2KUnF8X`}jI16@0kk?!p?<`44aW*%lv)6%DIec!Sqk<+^q zfe!8Qm)2%w90>|28c0u8A5;-+{RP}^h9PCr+Wc~bYQyXR9J<6r+(Wc$Hle(Yh3dn) zbYa-@V+xA)gc!mu{Nzahs1quVsd?kx6keev{DOkYeWBwxE~Ck&yF?o-J~^|+(Lici zFpkf0q}W=gB)naR6!lPE;Kj~UdN-pQONLG1<9vI_L9p>oW%3$P?=0Ipa)n}^$$~*w(-R?6pjAiwyAVYFQ zNzPk)!S&$+64|D*j*c(L4{=9%_FFCoZd?yi$P&deZ0z{4D3V4(igLqOLV%yLuy~)w^a!J%6 z=%;`ey6i%ffVYuD?5fJQyUCbmiLR{&M=_k|Bfh3%u`W1Z%h zyNgh{CyH*UXmh3IG@sdnF03o53-Ey8r}p-Mf@^WgHYxZcE8f`@+hhr1;31Sf)+uGb zS8ajS>U0GoqPBa)%f;Ii*deQ5iRcU~WNm?=1H0dH$FKB2QR)ZY&Y6G!QOYXhac2Y| ziViRf+9f^Hfy|-64xU`0Lj!cg0j#FlLz zJ=~Y7LuCqr90)>(m3WnH9_?@?L?liRBi7F6^ExQQs=swZ6zb(L&mC?;?ArLVw&D`d zGE~9&zbSRsqJSMro@h+Eu0(ePse()Ht}v}xgW^2bX+}o*dl_5N<=<<-Y<~4WUhme? z26%g@m%mvPe(EeL7`IY3%?hL4DO45a-{93z4Iz2w{~0Pop`{7UP!Nfs8-(>9f{x8t z{-)YJ+5j;hA0D0w$DlCP%JR;rMDrCF?r|)HK+N4B@W}(M)NV;wa0E!VcJH?3X3I<3 zOQs=S*N5>kE~}a=@$S)9f44_0y|X>S~iN zIR`kgOJ)RtT?AnW6oIYXY%j6WRmkGR^EM_sz{LBdN-BlMGCl0u-Ne_b&+gV#82d59M_%CfEXLguX0`@2$ zSE4_r)+o{=ddCl~*pw#45pBScL(a2Xzqy$d8{SW-_exkPzX9Ob5^3GTMN9qcYS}Ws zjgY--c7?Bo8hJQM;g2wT8M8%V1Vz6Hx1Z&PM<2K(;h7ZfLBeqp>)6u_4c%&NOOOVYad79{RTbtE&+;` zYe*fYlRlW=jsYjPLJk>eOswn?8S=m>zfu7ngbGIkm1#HUwW8gGDXZvDrp6@q2aa(~ zV#SBLdzkrat}ncr&0ymgSIt+JYa;fmZ62A_A2YN`$s1Uf%nNi0%&c=xp`C8Ir=U~) z3$=GMVlMx{>iPM}utA%YwCH7VO@EY-+*zPjP$28sx#&b-?|4wqVgd4>bS4b~XVmnm zOQYJXyTFz0=4#&9&H9C|KsarpMdqO{+#(yPamI9A9b8xQp$<6ZsoON?&do$AEqFM`25Un^hwN79gb$g z3;rO52((sa|C-kersFjKuk1DUqyb>FNLLuvo|9fau@Lrcge27yziCa=vG)Yu?yq$N zj)2`!h0wZ>bcF@4b}HC9r4E$5-0Y6Hkv0lxgApb{j0ISCN|g%p8-*y}c~=}G3}e5K zjGpFnkdu)OlwnrnkY)0C_ZR~}A$S_Lo( zxOqP^>*F1{kzLGc9yYN69~58gBX$)4REY(qrE4coLbc7OC#yWc5hMgF&Lb6hrF)op zrPF-r*yfnv;#|?`QmWa{kJxgXedF^THi>j(EaB~IbnO_2^SpTr!PI|YwL#6zuu=|+6^BZEut6XAf|w>>^~twpYgHu+idLJ{C!Ac zkyiR#+g@^ZMM_!_Lv`N|BMcpMdaQ~zDeTKC%LWcxjU== z;;Pdi=mSLadWmb0J#P2~1)P$97aTf_BKT25L*kbN_*tMtZlt zE{~a>XDkGw=`uB2LR1D4`$1%+B9=zb9{V&{`mTeghy5;X?xaqpc6V!sD`iB?H1<3J zZkegF7ip+Tf3U#YsKv1e=uwdo&dETv#IFH%$HPG?+F#uqpBhc3ywHBlOtKljq~ig~ zXDwDu3D0*AA)2DKHgE(hR}D$u$rF7P0Ra^{e57v>b=d$gXQzrh@0KzgMjsW$oN$JLv5Zh3zBM=nN8(T~GS|452-vlj`UJDPQ

f?FCy*Dz=ntn>%VW7ae;JGXmZ-Pj@y?RlbFM_v)u zFH382D`BK(NV8tUTc~e_qu9^O22Mq2fMYa(OCqo_F{kmR@b)U5Ij2V1=QdR0nUvW> z7qiBDr){{Oa8mEk&6)XIXz$Spaok`Ur|v6Tv81%xj-nCYo&_Xm_BF+N7IyKSxZ$bg5G>=?49t}?Hfd&I5o8PUyu zS_=)_OuYivZXWG6u02ZrX}F<=plgMn2ofly`YGq_MqD}9{*E6{`m>rClF>4}hc^Bb z6uR?tGh#jR#v@tlLb#1(%i1U_cHVW@!BA(?_(h;nTDB})&zV(wVnwK&3pzp@kG#^I zuTTdT`1HB>$4D=YN!D=!K!)9U;RT%z*wVst)!`+>eD{`?icRnOEff_IGh>kpC^mKc zOfU8bDSz?8NL5Eu@UQWMNlzCFg=EXex(;R+*ECVt*>9o+?s6~TKpQyWadu(G@Nx$- zDK_!@I+2FtExe)pJ_<&%5phPBx}SJSc0BTlw=`=9Vy^t5%=Q=!ZZF?|0@JsQeW4J- z|48`Ro3XZ1=SFta z{Gn^rrCybf&z}9+ahP7Jm*C+NSo`s`o=LDtH3%Xa-bjgKNS-W{O|ws+_;fnE%yk@d zfI5AaJOm;VWiahCqU&_tqta#e_XY1UJJ}(8R0AmoJ;NCyr*ep^{<`}3Q8=#18qcW7 z!v5XonI8of(C$LJGTM9S6K&f@H+Juq5SW%2Cd?YmQm8V{ugk4a_I^@E#T)~VgiOBV zY5X4ONNNqfhCbNUQ!2{vEtqf8)A3>4T{_o4CIC@e&#<^-U{c%h(s^>Uti)cvhfA$TJU))|qOts+}IZa~T6)o2O*dcFn zlsGZLWH#p|T8U=jd1nt3^UXX9Nwvr>a|%{bemXR~z0G<3jX7!wy#roMi!e5h?d)HN zJZF^}u_aZ_n(O9@=ImKTP(ZNnT-%Gi#QDLSrT!!)pIzp*_5P2i4KGW%Xh^58b+o_3^9B^&~KSZ;27z61ivpChZb>qnU$# z{)F$87LaI!+<7SAC}oq5#7H9r3^Grgo_~8hdK~#GL+@{RJTPMh$96uxH8b~Gc6^}* z$DecrZYQ#^g%kI+Vk~=LHeD~5$LZzS$M!|ro%<17%)bYWunsp(+H7K5@gjQyJn{nj z4gj4Du+DZ5IcqN`mjdSE0!Yk6)=T54Gjd-Ti9a&mTYhG^V1P~apN88WoZk`J6V+a4@) zIa_56y;C&>bp?)UZ}#LAq*QqfzO?80R+U2!f%8uSogGqG{n#6W^*DF&3C=A8;B&YZ z{nma~SN<;)`We=h$!@n1&BXG~_6{lN>Xh37p@M#NeD57yz}nwK?RFEWO0VBMTK;(C z8K*nTY$gRT%CTBae#iaAlH}wbPzWSJ4O}9(Z2D7|Qj?sjMW_dX?t76yKz-UTPy!;& ziSz>oxj=jlC6J@+&z(wIh=W#VFS>->)nuynLutV!<7o=rUzU}9zb{xJTlNe@ZE*VO z5#WViN8cu=oiZ~s9FxP;It_4%Igro!rv7QRB)!fJB|=pI?QLcO#r|PkX$!cR6DbW0 zZ&BTf`1ZvQ1Jl;r4IT+$e8Ksb+u`EY+{WOlNg;kWU(aCOtQD_~GCXhJ09RHc%hvTj zH@;o9x2X(CBG&Kth#QUQX3M zs67EX`f;kLD_4s*O#x?Y9~P$C9mjw%Dnt7})o~(SKeX8ap?v#({%(8Tz&0E1MvtIS z%@_l#0`)<7z@^O)iTa$P8UG!MUHd&$$+ARX^ElFC5y_xn%rm_6u;{*{m#qm_%zT?5 z6YT;la>({!0UcWm^^qHALUhm=zgxy%DnIg#x~f)rZc&>Vw&6;9+?t632kmjOA-NG4 z_b;Zn7_OU{O$4s1UAS3eEC2Qn3|RVrvd^tF9+dG(tSfvImVDO$(xYbxs??kQ+hq=$2De)pLJ4= zcFLbN@H+EtW>GnrEs*f-V~Q-M?&7O!7)%Mr=(Sf^?cPH*hjv)b;Oc1ivlIli87K|G zN6y()4w-`37}uNc<`xaJ4|LZ(NF05Jeq&y^< z#CED5Nkm@HEY*|wT;uvo!5*avyth@Xb=SSR>C~eyR99YFXWh&0?xdV28;m`;%Hwy2 zAot&aH7>h^*)iv@*S}pKjV}RH8y9XA_f(d}mF2$GriW!RqHU>N^&3C%K^83N!Nu(F zy=69Cd(_JZPMLIn^N_ZGbhexuK^S~es?ssn=pQlP*hUF1fq9dD=C5iDiNjkN6mddt zK-0v;q$EV&0z{knf85ZV=r`>6*y#yQaXc8^R$sE?23wka;HnZAL`##mACjBv(Ad<&bzuiUU331rE;Ep#nYSS8@0#kaTNz; zYZz3JIrR3ZheP6*32Ad) zQCy@4EvIV1tVj84$D3QYmQAKz*`L}nER;ZV(GU-75>Pu{4%20QNX&=^JO%C99a@9t8-7x3%*D4?+I z7oZj2&ov)T7t%i5;ZeP@EPIrZ*!CW*Uj7z2XZ0UOpfT0Pk7r`sG7x7RRI;67;ghnze}^DyL|!ZtCRo(XG9-?hyR)dfXhNkWP#6hglkUc6`KFbH>~ z8oHBv`TpXgSm3%B+it9U0BpVI!UJ&!r}N%_70ko&|uja5@; zJ{6T6f0KQwz>us*u?4;x08~_J($P^3Irdt+AV<~|)Gvr=7};0};g~qK?SRKmZ6D@! z=1#LaC<2K}pQ>pS@bt~OI)9fD-z@mnDFPR+!t_AgaM3kc?WWaEqmH(VX<$>CpW42|Sd>swO5IDQVREys=WYchQ?tS|On2|ky zc}R|`uxy)U6esCTq^vP#Ny`x^{Al+j>lBHr$M*c=k-;%vL z7IwMLzuFD|y03keiwhdv)4thw=4xA3af|=j4^eRwL3f9a_&-k?`&09k+*P~wD~7!Y zndiAP9C(%&C)0ekMnis}9X);5%9Z6`OE}QJYSd|D(h1+xNr#u@036O%yIa?8Dr-l4 z=k{6<{7tHRH+e~$GWIEX=E|z7EVR;1G;|U@^$~D4u5^J4XDxc$E&vW1dEU!ZTx_L7 zbE7y5W#^dNjvQ=& zdP%={>U*Q3v}h<>*3QsiY+8U=`z@g%axsg)eMIcuZH!^>r;or(Mhat=le%H`_r0Kt z-D$I$p&S05?+b{ibF;vUIhDL4<^_5R97~BKF()e-54qV*@ULH6<*q)+u0duDiDT|6 z^hJ^CcRd?$hF%0|(85f*^Z(KpGbgvB1N-lf#}D!HiX%E?bKzr+fbU+MIZ|KenD+$5 zKm2hj;j8;m;H#CezBnz(3#XpKOAXxeF3J9qR7T~XhLz5~&34!$F%Hpo}l(k_#a*hqc03oVlC zxtbD%SUUjRshdc(1^Tb&5I_)6yjsBa=Tgr+5NpnN)v4rJ@?mvrt_|GL7aP`POgfpI zBd{a_AeITYiSC&am3OljXpcgGA;blPx%&lx19JBjdKT=s2po1OU`1>6EoUGA?*s6& z>02%e9SHREC-AJP1MQM?v{ho6fxxSh($dQvTLbqnV{!bvljw$?65^%D$_TM@R;&9E z{!%qE_oj3#IsCS~zvqEhHcYnIi_`lWhazvDK|9O6Q}iITxPRaV82d?H_lla5z+qAViMa{VHoXNBu8fcs;d$gk5a63 zqT8|cT9Q{|MPDl@KgWYl6~?HK`P*=%#M&>Q+InWGtW-`(2~n(LKT$i7h=l%M{OoN> dr^@|8Mdr1N@9*wJc#9USPTHNQIDX;Ue*o)P`sV-u literal 0 HcmV?d00001 diff --git a/formats/ctv.md b/formats/ctv.md new file mode 100644 index 0000000000..2bf38be31a --- /dev/null +++ b/formats/ctv.md @@ -0,0 +1,26 @@ +--- +layout: page_v2 +title: Prebid Connected TV +description: Prebid Connected TV +sidebarType: 6 +--- + +# Prebid Connected TV + +Prebid for CTV is a Prebid-based unified auction solution designed for CTV long-form video programmatic needs. + +Prebid aims to create a flexible solution that allows publishers to plug in 160+ video capable adapters for the demand sources either in publishers’ existing stack or as a stand-alone Prebid Server based programmatic demand source. + +Prebid can be the best way to serve programmatic ads into long-form video content, both for remnant inventory as well as the primary demand source. It can be used for both client side and server side ad insertion, and can integrate with the publisher’s ad server of choice. + +Server side ad insertion dominates CTV ad serving ecosystem mainly due to the following reasons: + +- A multitude of CTV device platforms and the complexities of implementing and managing client side ad insertions for all such platforms. +- Superior end user experience with smooth transition between content and the ads with matching video playback quality. + +Prebid Server is the most commonly used methodology for accessing programmatic demand for the server side ad insertion use cases. + +## Further Reading + +- [Ad Server Integration with Prebid Server Architecture and Interface Recommendation](/prebid-server/use-cases/pbs-lfv.html) +- [Prebid for CTV-OTT: Use Cases, Common Integration Architectures, Challenges, Solutions](https://files.prebid.org/docs/Prebid_for_CTV-OTT.pdf) diff --git a/formats/video.md b/formats/video.md index 13bac2ce47..b19763bb26 100644 --- a/formats/video.md +++ b/formats/video.md @@ -29,7 +29,4 @@ Instream ads are for short-form video content within a player generally has simp ## CTV-OTT -Connected TV and 'Over-The-Top' video ads are for long-form video content. They have stronger requirements for ad-podding and category exclusion. - -1. [Prebid CTV+OTT white paper](https://files.prebid.org/docs/Prebid_for_CTV-OTT.pdf) -1. [Prebid Server long-form video ad support](/prebid-server/use-cases/pbs-lfv.html) +See the [Connected TV landing page](/formats/ctv.html). From e9516676d985f97ac00f8cc5cf850dcf7b8ce118 Mon Sep 17 00:00:00 2001 From: Sir-Will Date: Mon, 16 Sep 2024 13:48:03 +0200 Subject: [PATCH 197/816] Fix "customHeaders" in prebidServer module typo (#5599) --- dev-docs/modules/prebidServer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/modules/prebidServer.md b/dev-docs/modules/prebidServer.md index 60713aa438..15aeb0b171 100644 --- a/dev-docs/modules/prebidServer.md +++ b/dev-docs/modules/prebidServer.md @@ -96,7 +96,7 @@ There are many configuration options for s2sConfig: | `defaultTtl` | Optional | Integer | Configures the default TTL in the Prebid Server adapter to use when Prebid Server does not return a bid TTL - 60 if not set | | `adapterOptions` | Optional | Object | Arguments will be added to resulting OpenRTB payload to Prebid Server in every impression object at request.imp[].ext.BIDDER. See the example above. | | `extPrebid` | Optional | Object | Arguments will be added to resulting OpenRTB payload to Prebid Server in request.ext.prebid. See the examples below. | -| `customHeader` | Optional | Object | These custom headers will be included in the XHR call to the bidder's endpoint. This will allow you to send data specific to your use case. The format consists of an object where the keys represent the header names and the values correspond to the respective header values. Here is an example how a customHeader object might look like - `{"Header1": "Value1", "Header2": "Value2"}`| +| `customHeaders` | Optional | Object | These custom headers will be included in the XHR call to the bidder's endpoint. This will allow you to send data specific to your use case. The format consists of an object where the keys represent the header names and the values correspond to the respective header values. Here is an example how a customHeader object might look like - `{"Header1": "Value1", "Header2": "Value2"}`| If `endpoint` and `syncEndpoint` are objects, these are the supported properties: From 53442b70800d32e314fe39747c6a6952acfc99cc Mon Sep 17 00:00:00 2001 From: Takamasa-Murano Date: Mon, 16 Sep 2024 23:11:40 +0900 Subject: [PATCH 198/816] directly push (#5597) Co-authored-by: Murano Takamasa --- dev-docs/bidders/ssp_geniee.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/ssp_geniee.md b/dev-docs/bidders/ssp_geniee.md index 3219657174..0e13b3c5aa 100644 --- a/dev-docs/bidders/ssp_geniee.md +++ b/dev-docs/bidders/ssp_geniee.md @@ -39,5 +39,5 @@ Please contact us before using the adapter. {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |--------------|----------|-------------------------------------------------|-----------|-----------| -| `zoneId` | required | Zone ID | `123456` | `integer` | +| `zoneId` | required | Zone ID | `1573195` | `integer` | | `currency` | Optional | Currency setting (`'JPY'`(Default) or `'USD'`) | `'JPY'` | `string` | From 1f3796fbe1b0181802d33566bd878d250b244b11 Mon Sep 17 00:00:00 2001 From: "Md. Soman Mia Sarker" Date: Mon, 16 Sep 2024 21:37:31 +0600 Subject: [PATCH 199/816] New Adapter AdGrid (#5559) * Added adgrid doc file * Updated note text * Added newline char * Removed blank line * Fixed code block * Fixed adunit code * Fixed EOF * Fixed EOF * Added New Meta Data * Updated Meta Data --- dev-docs/bidders/adgrid.md | 72 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 dev-docs/bidders/adgrid.md diff --git a/dev-docs/bidders/adgrid.md b/dev-docs/bidders/adgrid.md new file mode 100644 index 0000000000..db31ea8a24 --- /dev/null +++ b/dev-docs/bidders/adgrid.md @@ -0,0 +1,72 @@ +--- +layout: bidder +title: AdGrid +description: Prebid AdGrid Bidder Adaptor +biddercode: adgrid +media_types: banner +pbjs: true +tcfeu_supported: false +dsa_supported: false +gvl_id: none +usp_supported: false +coppa_supported: false +gpp_sids: none +schain_supported: true +dchain_supported: false +userId: no +safeframes_ok: false +deals_supported: false +floors_supported: true +fpd_supported: false +prebid_member: false +ortb_blocking_supported: false +privacy_sandbox: no +sidebarType: 1 +--- + +### Note + +The AdGrid Bidding Adapter requires setup and approval before beginning. Please reach out to for more details. + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|------------|----------|--------------|---------|-----------| +| `domainId` | required | Publisher Id | `30164` | `integer` | + +### Test Parameters + +```javascript +var adUnits = [ + // Banner adUnit + { + code: 'test-div-1', + mediaTypes:{ + banner:{ + sizes: [[300, 250]] + } + } + bids: [{ + bidder: 'adgrid', + params: { + domainId: 12345 + } + }] + }, + { + code: 'test-div-2', + mediaTypes:{ + banner:{ + sizes: [[728, 90], [320, 50]] + } + } + bids: [{ + bidder: 'adgrid', + params: { + domainId: 67890 + } + }] + } +]; +``` From 6eebd8889ccdd01f999583ef1887e6db4240e824 Mon Sep 17 00:00:00 2001 From: Muki Seiler Date: Tue, 17 Sep 2024 15:21:52 +0200 Subject: [PATCH 200/816] Add-devcontainer (#5598) * Add devcontainer to ease startup * Use ruby v2 * Extend getting started guide.md --- .devcontainer/devcontainer.json | 11 +++++++++++ guide.md | 22 ++++++++++------------ 2 files changed, 21 insertions(+), 12 deletions(-) create mode 100644 .devcontainer/devcontainer.json diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000000..f18a02c5d7 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,11 @@ +{ + "image": "mcr.microsoft.com/devcontainers/jekyll:2", + "customizations": { + "vscode": { + "extensions": [ + "rebornix.Ruby", + "DavidAnson.vscode-markdownlint" + ] + } + } +} \ No newline at end of file diff --git a/guide.md b/guide.md index aae389fadb..1506d9a2a8 100644 --- a/guide.md +++ b/guide.md @@ -21,16 +21,14 @@ Updated Feb 9, 2023 The easiest way to setup an environment to contribute to the docs or review pull requests is [Github Codespaces](https://github.com/features/codespaces). 1. Open [github.com/prebid/prebid.github.io](https://github.com/prebid/prebid.github.io) -2. Click on the `Code` drop down menu and select "create new codespace from master". If you have no access to prebid.github.io, then you should do this on your fork of the repository -3. Install the [markdownlint extension](https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint) - 1. go to _Extensions_ - 2. search for _markdownlint_ and hit install - 3. now you get direct feedback on linting errors -4. Start the jekyll build as described in the `TERMINAL` of your codespace - 1. `bundle install` - 2. `JEKYLL_ENV=production bundle exec jekyll serve --watch --incremental` - 3. Codespaces will display a notification to open the running instance in the browser. -5. In the `PORTS` tab you find the running instance +2. Click on the `Code` drop down menu and select "create new codespace from master" by clicking on the + icon. + If you have no access to prebid.github.io, then you should do this on your fork of the repository +3. Start the jekyll build as described in the `TERMINAL` of your codespace + 1. `JEKYLL_ENV=production bundle exec jekyll serve --watch --incremental` + 2. Codespaces will display a notification to open the running instance in the browser. +4. In the `PORTS` tab you find the running instance + +This repository contains a [devcontainer.json](.devcontainer/devcontainer.json) that setups the codespace or your favourite IDE. It includes the [markdownlint extension](https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint), ruby and installs all dependency on setup through `bundle install`. ## Reviewing Pull Requests and Issues @@ -185,7 +183,7 @@ Each menu item is represented in the YML map as a collection of key value pairs The collection with the title property "What Is Prebid?" is a child of the collection directly above it with the sectionName "Overview" **Top Nav Menu Collection Properties** -*Note: A collection does not have to contain all properties. For Bools 1 = true, 0 = false* +_Note: A collection does not have to contain all properties. For Bools 1 = true, 0 = false_ | Key | Type | Example | Use | | ------ | ------ | ------ | ------ | @@ -243,7 +241,7 @@ Each menu item is represented in the YML map as a collection of key value pairs ``` **Side Nav Menu Collection Properties** -*Note: A collection does not have to contain all properties. For bools 1 = true, 0 = false** +_Note: A collection does not have to contain all properties. For bools 1 = true, 0 = false_* | Key | Type | Example | Use | | ----- | ----- | ----- | ----- | From c4637da343d14b915222579c78b8247ee4ea742e Mon Sep 17 00:00:00 2001 From: Hrechko Dmytro Date: Tue, 17 Sep 2024 16:35:11 +0200 Subject: [PATCH 201/816] EightPod - edit documentation (#5493) * fix documentation * update First Party Data documentation --- dev-docs/bidders/eightPod.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/eightPod.md b/dev-docs/bidders/eightPod.md index 58dc14f0d3..e9fcf8cf17 100644 --- a/dev-docs/bidders/eightPod.md +++ b/dev-docs/bidders/eightPod.md @@ -11,10 +11,11 @@ gpp_sids: none schain_supported: false dchain_supported: false userId: none -media_types: banner +media_types: banner, video deals_supported: false +userIds: check with bidder floors_supported: false -fpd_supported: false +fpd_supported: true pbjs: true pbs: false prebid_member: false @@ -35,3 +36,16 @@ The EightPod adapter requires setup before beginning. Please contact us at Date: Wed, 18 Sep 2024 14:50:59 -0400 Subject: [PATCH 202/816] PBS floor bidder dimension (#5606) --- prebid-server/features/pbs-floors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/prebid-server/features/pbs-floors.md b/prebid-server/features/pbs-floors.md index 52d72d5228..2c227bb3f9 100644 --- a/prebid-server/features/pbs-floors.md +++ b/prebid-server/features/pbs-floors.md @@ -224,6 +224,7 @@ supported only in Prebid Server, not in Prebid.js. | mediaType | string | "video" | If more than one of the following ORTB objects exists, only the "*" rule value will match: imp.banner, imp.video, imp.native, imp.audio. Otherwise: {::nomarkdown}

  • the "banner" rule value will match if imp.banner exists.
  • the "video-outstream" rule value will match if imp.video exists and imp.video.placement is not 1
  • the "video-instream" rule value will match if imp.video exists and imp.video placement exists and is 1
  • the "video" rule value is treated as "video-instream" above.
  • the "native" rule value will match if imp.native exists
  • the "audio" rule value will match if imp.audio exists
{:/} | | size | string | "300x250" | {::nomarkdown}
  • if ORTB imp.banner exists and only one size exists in imp.banner.format, then the rule value is matched against imp.banner.format[0].w and imp.banner.format[0].h
  • else if ORTB imp.banner exists and there's no imp.banner.format, then match the rule value against imp.banner.w and imp.banner.h
  • else if ORTB imp.video exists, match the rule value against imp.video.w and imp.video.h
  • Otherwise the size rule value only matches the "*" condition
{:/} | | gptSlot | string | "/111/homepage" | if imp.ext.data.adserver.name=="gam" then compare the rule value against imp.ext.data.adserver.adslot. Otherwise compare the rule value against imp.ext.data.pbadslot | +| bidder | string | "bidderA" | Compare the rule value against imp.ext.prebid.bidder.BIDDER (Requires PBS-Java 3.5+) | | **pbAdSlot** | string | "/111/homepage#div1" | Compare the rule value against imp.ext.data.pbadslot | | **country** | string | "USA" | Compare the rule value against device.geo.country (ISO-3166-1-alpha-3) | | **deviceType** | string | "desktop", "phone", "tablet" | This is a very simple device-type algorithm: {::nomarkdown}
  • if ORTB device.ua is not present, only rules specifying a wildcard deviceType will match. In other words, there's no default value unless device.ua exists.
  • otherwise, match a rule value of "phone" if UA matches one of these patterns: "Phone", "iPhone", "Android.*Mobile", "Mobile.*Android"
  • otherwise, match a rule value of "tablet" if UA matches one of these: "tablet", "iPad", "Windows NT.*touch", "touch.*Windows NT", "Android"
  • otherwise assume the rule value "desktop" matches all other user agent strings.
{:/} | From b7f41ec289af1915a073a70cd1cd058d6638e98d Mon Sep 17 00:00:00 2001 From: Chris Huie Date: Wed, 18 Sep 2024 13:56:48 -0600 Subject: [PATCH 203/816] add link for prof prebid (#5605) --- prebid/prebidjs-flow-video.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prebid/prebidjs-flow-video.md b/prebid/prebidjs-flow-video.md index 716a365f7f..046002b9a9 100644 --- a/prebid/prebidjs-flow-video.md +++ b/prebid/prebidjs-flow-video.md @@ -100,5 +100,5 @@ Now, we’ll go through the process in detail. - 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. +- Tools like the [Professor Prebid](https://docs.prebid.org/tools/professor-prebid.html) 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](https://docs.prebid.org). From c5a94232ecdf96ecc73dbca418ff4ab7e4fa0b3d Mon Sep 17 00:00:00 2001 From: Pavlo Kyrylenko Date: Wed, 18 Sep 2024 23:20:19 +0300 Subject: [PATCH 204/816] bidders list updated (#5604) Co-authored-by: Pavlo --- dev-docs/modules/anonymisedRtdProvider.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/modules/anonymisedRtdProvider.md b/dev-docs/modules/anonymisedRtdProvider.md index 72e678faa9..b0a3c1a553 100644 --- a/dev-docs/modules/anonymisedRtdProvider.md +++ b/dev-docs/modules/anonymisedRtdProvider.md @@ -37,7 +37,7 @@ gulp build --modules=rtdModule,anonymisedRtdProvider,... waitForIt: true, params: { cohortStorageKey: "cohort_ids", - bidders: ["smartadserver", "appnexus"], + bidders: ["appnexus", "onetag", "pubmatic", "smartadserver", ...], segtax: 1000 } } From 254911ce67c6548d4a7de7d965e1717880c46190 Mon Sep 17 00:00:00 2001 From: dtbarne <7635750+dtbarne@users.noreply.github.com> Date: Wed, 18 Sep 2024 15:56:59 -0500 Subject: [PATCH 205/816] Update mobilefuse.md (#5596) Noticed lots of differences between our settings and what's available now and bringing it up to date --- dev-docs/bidders/mobilefuse.md | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/dev-docs/bidders/mobilefuse.md b/dev-docs/bidders/mobilefuse.md index fb72ad0ade..38a40c7542 100644 --- a/dev-docs/bidders/mobilefuse.md +++ b/dev-docs/bidders/mobilefuse.md @@ -1,21 +1,28 @@ --- layout: bidder title: MobileFuse -pbs: true -pbjs: false -media_types: banner, video, native -tcfeu_supported: true -gpp_supported: true -schain_supported: true +description: Prebid MobileFuse Bidder Adapter +biddercode: mobilefuse +tcfeu_supported: false +dsa_supported: false +gvl_id: 909 usp_supported: true coppa_supported: true -biddercode: mobilefuse -ccpa_supported: true -prebid_member: true -pbs_app_supported: true +gpp_sids: tcfca, usnat, usstate_all, usp +schain_supported: true +dchain_supported: false +userIds: all +media_types: banner, video, native +deals_supported: true floors_supported: true -gvl_id: 909 +fpd_supported: false +pbjs: false +pbs: true +pbs_app_supported: true +prebid_member: true +multiformat_supported: will-bid-on-any ortb_blocking_supported: true +privacy_sandbox: no sidebarType: 1 --- From 6bcb2758c96881d0909241e3c5b4e2bbe873ca48 Mon Sep 17 00:00:00 2001 From: Muki Seiler Date: Thu, 19 Sep 2024 15:34:25 +0200 Subject: [PATCH 206/816] Update prebidjs-non-prod.html (#5610) Add missing colon in URL for examples --- _includes/prebidjs-non-prod.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_includes/prebidjs-non-prod.html b/_includes/prebidjs-non-prod.html index 1570bd8e9a..e5831486bc 100644 --- a/_includes/prebidjs-non-prod.html +++ b/_includes/prebidjs-non-prod.html @@ -1,3 +1,3 @@ - + From ff6a7d78857b574273e32f5bdce1e6aa39671d2d Mon Sep 17 00:00:00 2001 From: bgorsline Date: Fri, 20 Sep 2024 16:45:03 -0400 Subject: [PATCH 207/816] PBS-java-312 --- prebid-server/developers/add-new-bidder-java.md | 6 ++++++ prebid-server/endpoints/openrtb2/pbs-endpoint-amp.md | 5 +++-- prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md | 2 ++ prebid-server/features/pbs-feature-idx.md | 4 ++++ 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/prebid-server/developers/add-new-bidder-java.md b/prebid-server/developers/add-new-bidder-java.md index 0c9d06e2a5..18b20e2b0b 100644 --- a/prebid-server/developers/add-new-bidder-java.md +++ b/prebid-server/developers/add-new-bidder-java.md @@ -127,11 +127,16 @@ adapters: # Please deploy this config in each of your datacenters with the appropriate regional subdomain endpoint: http://REGION.example.com/openrtb2 endpoint-compression: gzip (or none) + ortb-version: "2.6" geoscope: - USA - CAN + ortb: + multiformat-supported: true meta-info: maintainer-email: maintainer@email.com + currency-accepted: + - USD app-media-types: - banner - video @@ -175,6 +180,7 @@ Modify this template for your bid adapter: - Choose the `supported-vendors` constants: These constants should be unique. The list of existing vendor constants can be found [here](https://github.com/prebid/prebid-server-java/blob/master/src/main/java/org/prebid/server/bidder/ViewabilityVendors.java). - Remove the `capabilities` (app/site/dooh) and `mediaTypes` (banner/video/audio/native) combinations which your adapter does not support. (Note: 'dooh' is [Digital Out Of Home](/prebid-server/use-cases/pbs-dooh.html)) - If your auction endpoint supports gzip compression, setting 'endpoint-compression' to 'gzip' will save on network fees. +- If your auction endpoint or finance systems have limited currency support, you can declare the `meta-info.currency-accepted` array. If you do, your bid adapter will not be called for auctions being conducted outside your set of allowable currencies. If you does not support user syncing, you can remove `usersync` section of configuration. diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-amp.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-amp.md index ffa45dfb38..4f30b78783 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-amp.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-amp.md @@ -103,7 +103,7 @@ The nature of AMP is that user-level FPD is difficult or impossible. All of the Contextual First Party Data must be defined in the stored request entries. -The only field that PBS supports in the AMP call that can be considered FPD is the 'targeting' block. These are key-value pairs that are sent to the ad server. They are also copied to the ORTB JSON in imp[].ext.data. +The only field that PBS supports in the AMP call that can be considered FPD is the 'targeting' block. These are key-value pairs that are sent to the ad server, and they are copied to the OpenRTB JSON in imp[].ext.data. For example, if the AMP JSON targeting provided is: ``` @@ -149,7 +149,8 @@ A sample response payload looks like this: "hb_pb": "0.50", "hb_pb_appnexus": "0.50", "hb_size": "300x250", - "hb_size_appnexus": "300x250" + "hb_size_appnexus": "300x250", + "hb_env": "amp" // PBS-Java only } "errors": { "openx":[ diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md index da42122863..b9ac0966c7 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -1678,6 +1678,8 @@ Prebid Server will generate ad server targeting variables as defined by request 1. If ext.prebid.cache.bids is specified, any targeting objects will also contain hb_cache_id, hb_cache_id_BIDDER, hb_cache_host, and hb_cache_path. 1. If ext.prebid.cache.vastxml is specified, any targeting objects will also contain hb_uuid, hb_uuid_BIDDER, hb_cache_host, and hb_cache_path. 1. If the bid response defines a deal, any targeting objects will also contain hb_deal or hb_deal_BIDDER +1. If the request contains an `app` object, targeting objects will contain hb_env:mobile-app. +1. If the request is for the /amp endpoint, targeting objects will contain hb_env:amp. (PBS-Java 3.12+) 1. If ext.prebid.adservertargeting is defined, arbitrary targeting values may be specified. ```json diff --git a/prebid-server/features/pbs-feature-idx.md b/prebid-server/features/pbs-feature-idx.md index c83165c10a..869dc725f9 100644 --- a/prebid-server/features/pbs-feature-idx.md +++ b/prebid-server/features/pbs-feature-idx.md @@ -14,12 +14,16 @@ title: Prebid Server | Features | [Currency](/prebid-server/features/pbs-currency.html) | Core | Loads currency conversions from an outside source, allows non-supported currencies to come in on the OpenRTB2 request, converts bid currencies to the request's prefered currency. | check | check | | [Currency](/prebid-server/features/pbs-currency.html) | Request-Defined Rates | Allows the request to define its own currency rates. | check | check | | Currency | Convert Currency Method | Allows adapters to convert bid floors to a different currency if needed. | check | check | +| Currency | Bidder Currency Filter | Allows adapters to define their acceptable currencies. PBS will not call them for auctions being conducted outside of this set. | | check | | [Deals](/prebid-server/features/pbs-deals.html) | Core | Basic deal support, creating hb_deal targeting when appropriate. | check | check | | Deals | Deal prioritization | Supports the 'preferdeals' [targeting flag](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#targeting) to give deals the priority when PBS returns ad server targeting. | check | check | | [AMP](/prebid-server/use-cases/pbs-amp.html) | Core | Reads and responds to the /openrtb2/amp endpoint | check | check | | Targeting | Core | Request can specify `includewinners` and `includebidderkeys`. These cause PBS to emit seatbid[].bid[].ext.prebid.targeting values. | check | check | | Targeting | Format | Request can specify `includeformat`, which causes PBS to emit hb_format along with other targeting values like hb_pb, etc. | check | check | | 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. | check | check | +| Targeting | Custom Prefix | The request can specify `ext.prebid.targeting.prefix`, which causes PBS to emit targeting with this value instead of `hb` as a prefix. | | check | +| Targeting | hb_env for mobile app | When called with an app object, PBS emits hb_env:mobile-app in the response targeting. | check | check | +| Targeting | hb_env for AMP | When called by the /amp endpoint, PBS emits hb_env:amp in the response targeting. | | check | | Request Params | Global Params | Publishers can specify [adapter-specific cross-impression attributes](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#global-bid-adapter-parameters). | check | check | | [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. | check | check | | Price Granularity | Mediatype pricegranularity | Request can define different quantization rules for different mediatypes. Bids are quantized before being added to ad server targeting. | check | check | From db86388aa67b5ff7be4f7f83ce2f4548c2f2d854 Mon Sep 17 00:00:00 2001 From: bgorsline Date: Fri, 20 Sep 2024 17:00:18 -0400 Subject: [PATCH 208/816] lint --- .../endpoints/openrtb2/pbs-endpoint-amp.md | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-amp.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-amp.md index 4f30b78783..607ae19342 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-amp.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-amp.md @@ -8,7 +8,7 @@ title: Prebid Server | Endpoints | OpenRTB2 | AMP # Prebid Server | Endpoints | /openrtb2/amp {:.no_toc} -* TOC +- TOC {:toc} This document describes the behavior of the Prebid Server AMP endpoint in detail. @@ -92,6 +92,7 @@ An example Stored Request is given below: ``` Note that other ext.prebid extensions can be specified in the stored request such as: + - [ext.prebid.currency](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#currency-support) - [ext.prebid.aliases](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#bidder-aliases) - [ext.prebid.multibid](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#multibid) @@ -106,7 +107,8 @@ Contextual First Party Data must be defined in the stored request entries. The only field that PBS supports in the AMP call that can be considered FPD is the 'targeting' block. These are key-value pairs that are sent to the ad server, and they are copied to the OpenRTB JSON in imp[].ext.data. For example, if the AMP JSON targeting provided is: -``` + +```html ``` + The AMP URL would be something like this: -``` + +```text GET /openrtb2/amp?tag_id=1001-my-test&w=300&h=250&ow=&oh=&ms=&slot=%2F1111%2Famp_test&targeting=%7B%22attr1%22%3A%22val1%22%2C%22attr2%22%3A%22val2%22%7D&... ``` + And the resulting OpenRTB would merge these targeting values as FPD on imp.ext.data: -``` + +```json { "imp": [{ ... @@ -170,7 +176,7 @@ these targeting params will be sent to Google Ad Manager. If any errors were generated they will appear within `response.ext.errors.{bidderName}`. There are five error codes that could be returned: -``` +```text 0 NoErrorCode 1 TimeoutCode 2 BadInputCode @@ -224,6 +230,7 @@ Specifically: - amp.max-timeout-ms: maximum operation timeout for AMP requests ## Further Reading + - [Prebid and AMP](/formats/amp.html) - [Prebid Server AMP Use Case Overview](/prebid-server/use-cases/pbs-amp.html) - [Prebid Server First Party Data](/prebid-server/features/pbs-fpd.html) From 9e32bfe236981917831171758186e98c954d9f94 Mon Sep 17 00:00:00 2001 From: bgorsline Date: Fri, 20 Sep 2024 17:01:09 -0400 Subject: [PATCH 209/816] lint --- prebid-server/endpoints/openrtb2/pbs-endpoint-amp.md | 1 - 1 file changed, 1 deletion(-) diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-amp.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-amp.md index 607ae19342..c1e56de9ed 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-amp.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-amp.md @@ -195,7 +195,6 @@ See the [/openrtb2/auction endpoint](/prebid-server/endpoints/openrtb2/pbs-endpo | Adding debug information. | 999 | Test set on request but debug not present in response. | Error is logged. | | Encoding the response. | 999 | `/openrtb2/amp` failed to send response. | Error is logged. | - The following errors can occur when loading a stored OpenRTB request for an incoming AMP request. {: .table .table-bordered .table-striped } From f056b9c979e1bec307fbe053b5792c435faf20d7 Mon Sep 17 00:00:00 2001 From: Rares Mihai Preda <54801398+rares-mihai-preda@users.noreply.github.com> Date: Sat, 21 Sep 2024 11:24:36 +0300 Subject: [PATCH 210/816] Connatix update docs viewability (#5539) * md * update docs with new viewability bid params * more specific example --------- Co-authored-by: alexandru.calauz Co-authored-by: Alex Damsa --- dev-docs/bidders/connatix.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dev-docs/bidders/connatix.md b/dev-docs/bidders/connatix.md index e617085efc..5d313e180b 100644 --- a/dev-docs/bidders/connatix.md +++ b/dev-docs/bidders/connatix.md @@ -31,6 +31,8 @@ sidebarType: 1 |---------------|----------|-----------------------|-----------|-----------| | `placementId` | required | Placement id | `'ed8a9c16-88ea-4724-aa0d-013c3e595e49'` | `string` | | `bidfloor` | optional | Floor price | `2.5` | `float` | +| `viewabilityPercentage` | optional | The viewability percentage during the action time must be a value between 0 and 1 | `0.25` | `float` | +| `viewabilityContainerIdentifier` | optional | The container ID for viewability measurement | `'#containerID'` | `string` | ### Media Types @@ -126,6 +128,8 @@ var adUnits = [ params: { placementId: "e4984e88-9ff4-45a3-8b9d-33aabcad634e", // required bidfloor: 2.5, // optional + viewabilityPercentage: 0.25, // optional - 25% in view + viewabilityContainerIdentifier: '#containerID', // optional }, }, // Add more bidders and their parameters as needed From 2f5e56a41f18dc07006e2092c047db16cf160324 Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Sat, 21 Sep 2024 01:33:12 -0700 Subject: [PATCH 211/816] Prebid 9: PAAPI documentation changes (#5401) * Prebid 9: PAAPI documentation changes * thank you linter * update paapiForGpt docs * fix config references to paapiForGpt --- dev-docs/bidders/ix.md | 20 ++-- dev-docs/bidders/medianet.md | 6 +- dev-docs/bidders/rtbhouse.md | 23 ++-- dev-docs/bidders/unruly.md | 22 ++-- dev-docs/modules/paapi.md | 100 +++++++++--------- .../{fledgeForGpt.md => paapiForGpt.md} | 23 ++-- .../setPAAPIConfigForGPT.md | 3 +- .../openrtb2/pbs-endpoint-auction.md | 2 +- support/privacy-resources.md | 12 +-- 9 files changed, 105 insertions(+), 106 deletions(-) rename dev-docs/modules/{fledgeForGpt.md => paapiForGpt.md} (77%) diff --git a/dev-docs/bidders/ix.md b/dev-docs/bidders/ix.md index c4592e1406..a7c84b16e3 100644 --- a/dev-docs/bidders/ix.md +++ b/dev-docs/bidders/ix.md @@ -376,20 +376,20 @@ pbjs.addAdUnits({ **Before you begin:** -* You must have Google Ad Manager and the [fledgeForGpt](/dev-docs/modules/fledgeForGpt.html) module. +* You must have Google Ad Manager and the [paapiForGpt](/dev-docs/modules/paapiForGpt.html) module. * In your Google Ad Manager configuration, make sure that you have not opted out from using the Protected Audience API. For more information about the configuration, see Google's documentation on [Protected Audience API and Ad Manager after Chrome GA](https://support.google.com/admanager/answer/13627134?hl=en&ref_topic=12264880&sjid=10591375417866092080-NA). Depending on the Prebid.js version that you are using, the steps to configure Prebid.js will differ. Follow the steps provided in the appropriate section for the version of Prebid.js that you are using: **Configure Protected Audience API for Prebid.js versions 8.18.0 to 8.36.0** -1. Build the `fledgeForGpt` module in your Prebid.js configuration by adding `fledgeForGpt` to the list of modules that you are already using. For more information about the module, see Prebid's [Protected Audience API (PAAPI) for GPT Module](/dev-docs/modules/fledgeForGpt.html) documentation. -2. Configure your ad units to make them eligible for Protected Audience API demand. You can do this in the global-level configuration, bidder level, or ad-unit level. For more information about the configurations, see Prebid's [Protected Audience API (PAAPI) for GPT Module](/dev-docs/modules/fledgeForGpt.html) documentation. Index recommends that you do this in the global-level configuration by using the `defaultForSlots` parameter with a value of `1`. The following code is an example of the configuration done at the global level: +1. Build the `paapiForGpt` module in your Prebid.js configuration by adding `fledgeForGpt` to the list of modules that you are already using. For more information about the module, see Prebid's [Protected Audience API (PAAPI) for GPT Module](/dev-docs/modules/paapiForGpt.html) documentation. +2. Configure your ad units to make them eligible for Protected Audience API demand. You can do this in the global-level configuration, bidder level, or ad-unit level. For more information about the configurations, see Prebid's [Protected Audience API (PAAPI) for GPT Module](/dev-docs/modules/paapiForGpt.html) documentation. Index recommends that you do this in the global-level configuration by using the `defaultForSlots` parameter with a value of `1`. The following code is an example of the configuration done at the global level: ```javascript pbjs.que.push(function() { pbjs.setConfig({ - fledgeForGpt: { + paapi: { enabled: true, defaultForSlots: 1 } @@ -397,12 +397,12 @@ Depending on the Prebid.js version that you are using, the steps to configure Pr }); ``` - **Note:** If you are using the `fledgeForGpt.bidders[]`, make sure that you include `ix` to the list of bidders as follows: + **Note:** If you are using the `paapiForGpt.bidders[]`, make sure that you include `ix` to the list of bidders as follows: ```javascript pbjs.que.push(function() { pbjs.setConfig({ - fledgeForGpt: { + paapi: { enabled: true, bidders: ['ix', /* any other bidders */], defaultForSlots: 1 @@ -421,16 +421,16 @@ Depending on the Prebid.js version that you are using, the steps to configure Pr ```javascript pbjs.que.push(function() { pbjs.setConfig({ - paapi: { + fledgeForGpt: { enabled: true, - defaultForSlots: 1 + defaultForSlots: 1, bidders: ['ix', /* any other bidders */], }); }); ``` - * In the `paapi.gpt.autoconfig` field, set `autoconfig` to `false`. This step is important because, by default, the `fledgeForGpt` module expects the Google Publisher Tag (GPT) ad units to be loaded before the Protected Audience configuration is added to the ad unit. Setting `autoconfig` to `false` will avoid any race conditions resulting from asynchronous libraries being loaded out of order, which would prevent the ad unit from being properly configured for Protected Audience API.
-**Note:** The `fledgeForGpt.autoconfig` property is also backward compatible and can be used in place of the `paapi.gpt.autoconfig` property. However, Index recommends that you use the `paapi.gpt.autoconfig` property.
+ * In the `paapi.gpt.autoconfig` field, set `autoconfig` to `false`. This step is important because, by default, the `paapiForGpt` module expects the Google Publisher Tag (GPT) ad units to be loaded before the Protected Audience configuration is added to the ad unit. Setting `autoconfig` to `false` will avoid any race conditions resulting from asynchronous libraries being loaded out of order, which would prevent the ad unit from being properly configured for Protected Audience API.
+**Note:** The `paapiForGpt.autoconfig` property is also backward compatible and can be used in place of the `paapi.gpt.autoconfig` property. However, Index recommends that you use the `paapi.gpt.autoconfig` property.
```javascript pbjs.que.push(function() { diff --git a/dev-docs/bidders/medianet.md b/dev-docs/bidders/medianet.md index 8b402d6818..cb8eb86f66 100644 --- a/dev-docs/bidders/medianet.md +++ b/dev-docs/bidders/medianet.md @@ -148,13 +148,13 @@ var adUnits = [{ To enable PAAPI auctions follow the instructions below: -1. Add the `fledgeForGpt` and `paapi` modules to your prebid bundle. +1. Add the `paapiForGpt` and `paapi` modules to your prebid bundle. 2. Add the following configuration for the module ```javascript pbjs.que.push(function() { pbjs.setConfig({ - fledgeForGpt: { + paapi: { enabled: true, bidders: ['medianet'], defaultForSlots: 1 @@ -164,4 +164,4 @@ pbjs.que.push(function() { ``` For a detailed guide to enabling PAAPI auctions follow Prebid's documentation -on [`fledgeForGpt`](https://docs.prebid.org/dev-docs/modules/fledgeForGpt.html) +on [`paapiForGpt`](https://docs.prebid.org/dev-docs/modules/paapiForGpt.html) diff --git a/dev-docs/bidders/rtbhouse.md b/dev-docs/bidders/rtbhouse.md index 9b819d39b5..a1abc7d5d7 100644 --- a/dev-docs/bidders/rtbhouse.md +++ b/dev-docs/bidders/rtbhouse.md @@ -74,30 +74,30 @@ pbjs.setBidderConfig({ If you’re a Prebid Server host company looking to enable the RTB House server-side adapter, you'll need to contact . 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. -### Protected Audience API (FLEDGE) support +### Protected Audience API (PAAPI) 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) +Prebid’s [paapiForGpt](https://docs.prebid.org/dev-docs/modules/paapiForGpt.html) module and Google Ad Manager is currently required. 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) +2. Build and enable PAAPI module as described in +[paapiForGpt](https://docs.prebid.org/dev-docs/modules/paapiForGpt.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: + a. Make sure to enable RTB House bidder to participate in PAAPI. 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 - } - }); + pbjs.setConfig({ + paapi: { + enabled: true, + bidders: ["rtbhouse"] + } + }) ``` b. If you as a publisher have your own [decisionLogicUrl](https://github.com/WICG/turtledove/blob/main/FLEDGE.md#21-initiating-an-on-device-auction) @@ -107,7 +107,6 @@ module documentation. pbjs.setBidderConfig({ bidders: ["rtbhouse"], config: { - fledgeEnabled: true, fledgeConfig: { seller: 'https://seller.domain', decisionLogicUrl: 'https://seller.domain/decisionLogicFile.js', diff --git a/dev-docs/bidders/unruly.md b/dev-docs/bidders/unruly.md index 7a0824c838..644f9ea86b 100644 --- a/dev-docs/bidders/unruly.md +++ b/dev-docs/bidders/unruly.md @@ -30,30 +30,30 @@ sidebarType: 1 | `siteid` | deprecated | The site ID from Unruly. This will be provided to you by your Unruly account manager, this is backward compability. | `123456` | `integer` | | `featureOverrides` | optional | This param is a generic object for configuring Unruly outstream demand. To run UNmissable, set ‘canRunUnmissable’ to true. | `"featureOverrides": {"canRunUnmissable": true}` | `object` | -### Protected Audience API (FLEDGE) support +### Protected Audience API (PAAPI) support There’s an option to receive demand for Protected Audience API (FLEDGE/PAAPI) ads using Unruly's (Nexxen) bid adapter. -Prebid’s [fledgeForGpt](https://docs.prebid.org/dev-docs/modules/fledgeForGpt.html) +Prebid’s [paapiForGpt](https://docs.prebid.org/dev-docs/modules/paapiForGpt.html) module and Google Ad Manager is currently required. The following steps should be taken to setup Protected Audience for Unruly(Nexxen): 1. Reach out to your account manager to coordinate set up: -2. Build and enable FLEDGE module as described in -[fledgeForGpt](https://docs.prebid.org/dev-docs/modules/fledgeForGpt.html) +2. Build and enable PAAPI module as described in +[paapiForGpt](https://docs.prebid.org/dev-docs/modules/paapiForGpt.html) module documentation. - Make sure to enable Unruly bidder to participate in FLEDGE. If there are any other bidders to be allowed for that, add them to the **bidders** array: + Make sure to enable Unruly bidder to participate in PAAPI. If there are any other bidders to be allowed for that, add them to the **bidders** array: ```javascript - pbjs.setBidderConfig({ - bidders: ["unruly"], - config: { - fledgeEnabled: true - } - }); + pbjs.setConfig({ + paapi: { + bidders: ["unruly"], + enabled: true + } + }) ``` ### First Party Data diff --git a/dev-docs/modules/paapi.md b/dev-docs/modules/paapi.md index 8a47f9402e..71df078690 100644 --- a/dev-docs/modules/paapi.md +++ b/dev-docs/modules/paapi.md @@ -16,7 +16,7 @@ This module allows Prebid.js to support PAAPI, formerly known as [FLEDGE](https: This document covers the steps necessary for publishers to enable PAAPI on their inventory. It also describes the changes Bid Adapters need to implement in order to support PAAPI. -A related module, [fledgeForGpt](/dev-docs/modules/fledgeForGpt.html), adds support specifically for GPT's [component auctions](https://developers.google.com/publisher-tag/reference#googletag.config.componentauctionconfig). +A related module, [paapiForGpt](/dev-docs/modules/paapiForGpt.html), adds support specifically for GPT's [component auctions](https://developers.google.com/publisher-tag/reference#googletag.config.componentauctionconfig). ## Publisher Integration @@ -29,7 +29,7 @@ To use PAAPI, publishers must: ``` - enable PAAPI, globally or by ad unit, through [configuration](#config) -- manage the PAAPI auctions. This can be delegated to GPT with the [fledgeForGpt module](/dev-docs/modules/fledgeForGpt.html); homegrown solutions are possible with [getPAAPIConfig](/dev-docs/publisher-api-reference/getPAAPIConfig.html), but out of scope for this document. +- manage the PAAPI auctions. This can be delegated to GPT with the [paapiForGpt module](/dev-docs/modules/paapiForGpt.html); homegrown solutions are possible with [topLevelPaapi](/dev-docs/modules/topLevelPaapi.html).
@@ -43,6 +43,7 @@ This module exposes the following settings: |enabled | Boolean |Enable/disable the module |Defaults to `false` | |bidders | Array[String] |Optional list of bidders |Defaults to all bidders | |defaultForSlots | Number |Default value for `imp.ext.ae` in requests for specified bidders |Should be 1 | +|componentSeller | Object |Configuration for publishers acting as component sellers | See [note](#componentSeller) | As noted above, PAAPI support is disabled by default. To enable it, set the `enabled` value to `true` for this module and configure `defaultForSlots` to be `1` (meaning _Client-side auction_). using the `setConfig` method of Prebid.js: @@ -72,30 +73,6 @@ pbjs.que.push(function() { }); ``` -### Bidder Configuration - -This module adds the following setting for bidders: - -{: .table .table-bordered .table-striped } -|Name |Type |Description |Notes | -| ------------ | ------------ | ------------ |------------ | -| fledgeEnabled | Boolean | Enable/disable a bidder to participate in FLEDGE | Defaults to `false` | -|defaultForSlots | Number |Default value for `imp.ext.ae` in requests for specified bidders |Should be 1| - -In addition to enabling PAAPI at the module level, individual bidders can also be enabled. This allows publishers to -selectively test with one or more bidders as they desire. To enable one or more bidders, use the `setBidderConfig` method -of Prebid.js: - -```js -pbjs.setBidderConfig({ - bidders: ["bidderA"], - config: { - fledgeEnabled: true, - defaultForSlots: 1 - } -}); -``` - ### AdUnit Configuration All adunits can be opted-in to PAAPI in the global config via the `defaultForSlots` parameter. @@ -124,6 +101,18 @@ pbjs.addAdUnits({ }); ``` + +### Advanced usage: publisher-managed component auction + +Bid adapters typically act as PAAPI sellers, each providing one or more [component auctions](https://github.com/WICG/turtledove/blob/main/FLEDGE.md#24-scoring-bids-in-component-auctions) in a multi-seller PAAPI auction. +Some adapters may act as PAAPI buyers: instead of a full component auction, they can reply directly with buyer information. By configuring `componentSeller`, these buyers are collected into one or more publisher-managed component auctions. + +{: .table .table-bordered .table-striped } +|Name |Type |Description | +| ------------ | ------------ | ------------ | +|componentSeller.auctionConfig | Object | [AuctionConfig](https://github.com/WICG/turtledove/blob/main/FLEDGE.md#21-initiating-an-on-device-auction) object to use for the component auction(s) | +|componentSeller.separateAuctions | Boolean | If `true`, generate a component auction for each bid adapter. If `false` (the default), buyers are collected into as few component auctions as possible (typically one, but multiple are possible if multiple bidders reply with the same buyer) | + ## Bid Adapter Integration Chrome has enabled a two-tier auction in PAAPI. This allows multiple sellers (frequently SSPs) to act on behalf of the publisher with @@ -134,49 +123,62 @@ bids to the final layer. To learn more about Component Auctions, go [here](https The PAAPI auction, including Component Auctions, are configured via an `AuctionConfig` object that defines the parameters of the auction for a given seller. This module enables PAAPI support by allowing bid adaptors to return `AuctionConfig` objects in addition to bids. If a bid adaptor returns an -`AuctionConfig` object, Prebid.js will make it available through [`getPAAPIConfig`](/dev-docs/publisher-api-reference/getPAAPIConfig.html), as well as other PAAPI modules such as [fledgeForGpt](/dev-docs/modules/fledgeForGpt.html). +`AuctionConfig` object, Prebid.js will make it available through [`getPAAPIConfig`](/dev-docs/publisher-api-reference/getPAAPIConfig.html), as well as other PAAPI modules such as [paapiForGpt](/dev-docs/modules/paapiForGpt.html). + +{: .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 implements the following using [protected audience community extensions](https://github.com/InteractiveAdvertisingBureau/openrtb/blob/main/extensions/community_extensions/Protected%20Audience%20Support.md) Modifying a bid adapter to support PAAPI is a straightforward process and consists of the following steps: 1. Detecting when a bid request is PAAPI eligible -2. Responding with AuctionConfig +2. Responding with AuctionConfig or InterestGroupBuyer in addition to (or instead of) bids + +### Input parameters + +When PAAPI is configured, the following fields are made available to adapters' [`buildRequests`](/dev-docs/bidder-adaptor.html#building-the-request): + +{: .table .table-bordered .table-striped } +|Name |Type |Description |Notes | +| ------------ | ------------ | ------------ | +| `validBidRequests[].ortb2Imp.ext.ae` | Integer | `1` when the PAAPI is enabled for the request | +| `validBidRequests[].ortb2Imp.ext.igs` | Object | [InterestGroupSupport](https://github.com/InteractiveAdvertisingBureau/openrtb/blob/main/extensions/community_extensions/Protected%20Audience%20Support.md#object-interestgroupauctionsupport) object| +| `validBidRequests[].ortb2Imp.ext.igs.ae` | Integer | duplicate of `ortb2Imp.ext.ae` | +| `validBidRequests[].ortb2Imp.ext.igs.biddable` | Integer | `1` when `ae` is `1` | +| `validBidRequests[].ortb2Imp.ext.paapi.requestedSize` | Object | Size (as an object `{width, height}`) that will be passed as `requestedSize` to [`runAdAuction`](https://github.com/WICG/turtledove/blob/main/FLEDGE.md#21-initiating-an-on-device-auction) | +| `bidderRequest.paapi.enabled` | Boolean | `true` if the publisher has enabled PAAPI and the browser supports it | +| `bidderRequest.paapi.componentSeller` | Boolean | `true` if the publisher can act as a component seller and accept `igb` objects instead of auction configs | -PAAPI eligibility is made available to bid adapters' [`buildRequests`](/dev-docs/bidder-adaptor.html#building-the-request) method through the `ortb2Imp.ext.ae` property of bid requests; it is set to `1` when the browser supports PAAPI and publisher configuration has enabled it as described above. Bid adapters -who wish to participate should read this flag and pass it to their server. +### Output values -When a bid request is PAAPI enabled, a bid adapter can return a tuple consisting of bids and AuctionConfig objects rather than just a list of bids: +When a bid request is PAAPI enabled, a bid adapter can return a tuple consisting of bids and PAAPI objects rather than just a list of bids: ```js function interpretResponse(resp, req) { // Load the bids from the response - this is adapter specific const bids = parseBids(resp); - // Load the auctionConfigs from the response - also adapter specific - const fledgeAuctionConfigs = parseAuctionConfigs(resp); - - if (fledgeAuctionConfigs) { - // Return a tuple of bids and auctionConfigs. It is possible that bids could be null. - return {bids, fledgeAuctionConfigs}; - } else { - return bids; - } + // Load auction configs or igb from the response - also adapter specific + const paapi = parsePaapi(resp); + return {bids, paapi}; } ``` -An AuctionConfig must be associated with an adunit and auction, and this is accomplished using the value in the `bidId` field from the objects in the -`validBidRequests` array passed to the `buildRequests` function - see [here](/dev-docs/bidder-adaptor.html#ad-unit-params-in-the-validbidrequests-array) -for more details. This means that the AuctionConfig objects returned from `interpretResponse` must contain a `bidId` field whose value corresponds to -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 PAAPI auction without returning a contextual bid. +`paapi` must be an array of objects containing: -An example of this can be seen in the OpenX bid adapter [here](https://github.com/prebid/Prebid.js/blob/master/modules/openxBidAdapter.js) or RTB House bid adapter [here](https://github.com/prebid/Prebid.js/blob/master/modules/rtbhouseBidAdapter.js). +{: .table .table-bordered .table-striped } +|Name |Type |Description |Notes | +| ------------ | ------------ | ------------ | +| `bidId` | String | one of the input requests' `bidId`. Used to identify the slot that this object refers to. | +| `igb` | Object | [InterestGroupBuyer](https://github.com/InteractiveAdvertisingBureau/openrtb/blob/main/extensions/community_extensions/Protected%20Audience%20Support.md#object-interestgroupauctionsupport) object| +| `config` | Object | [AuctionConfig](https://github.com/WICG/turtledove/blob/main/FLEDGE.md#21-initiating-an-on-device-auction) object | + +Each object must specify exactly one of `igb` or `config`. -Other than the addition of the `bidId` field, the `AuctionConfig` object should adhere to the requirements set forth in PAAPI. The details of creating an -`AuctionConfig` object are beyond the scope of this document. +An example of this can be seen in the OpenX bid adapter [here](https://github.com/prebid/Prebid.js/blob/master/modules/openxBidAdapter.js) or RTB House bid adapter [here](https://github.com/prebid/Prebid.js/blob/master/modules/rtbhouseBidAdapter.js). ## Related Reading -- [fledgeForGpt module](/dev-docs/modules/fledgeForGpt.html) +- [paapiForGpt module](/dev-docs/modules/paapiForGpt.html) - [Protected Audience API (PAAPI)](https://github.com/WICG/turtledove/blob/main/FLEDGE.md), formerly FLEDGE - [Component Auctions](https://github.com/WICG/turtledove/blob/main/FLEDGE.md#21-initiating-an-on-device-auction) - [getPAAPIConfig](/dev-docs/publisher-api-reference/getPAAPIConfig.html) diff --git a/dev-docs/modules/fledgeForGpt.md b/dev-docs/modules/paapiForGpt.md similarity index 77% rename from dev-docs/modules/fledgeForGpt.md rename to dev-docs/modules/paapiForGpt.md index 82d725f0d2..5e13485bdb 100644 --- a/dev-docs/modules/fledgeForGpt.md +++ b/dev-docs/modules/paapiForGpt.md @@ -1,7 +1,7 @@ --- layout: page_v2 page_type: module -title: Module - fledgeForGpt +title: Module - paapiForGpt description: how to use PAAPI with GPT module_code : paapiForGpt display_name : Fledge (PAAPI) for GPT @@ -30,30 +30,27 @@ To use PAAPI with GPT: - [configure PAAPI](/dev-docs/modules/paapi.html#config) - (optional) invoke [setPAAPIConfigForGPT](/dev-docs/publisher-api-reference/setPAAPIConfigForGPT.html) at end of auction. -By default, Prebid.js attempts to configure GPT slots for PAAPI at the end of each auction. This requires GPT to be loaded before the first Prebid auction is started; to avoid this requirement, or for more control in general over GPT slot configuration, you can use [`setPAAPIConfigForGPT`](/dev-docs/publisher-api-reference/setPAAPIConfigForGPT.html). - ## Explicit configuration -First, disable automatic configuration of GPT slots: +By default, Prebid.js attempts to configure GPT slots for PAAPI together with their targeting (that is, when [setTargetingForGPTAsync](/dev-docs/publisher-api-reference/setTargetingForGPTAsync.html) is called). + +For more control how GPT slots are configured, you can set `configWithTargeting: false` and explicitly call [setPAAPIConfigForGPT](/dev-docs/publisher-api-reference/setPAAPIConfigForGPT.html). For example: ```js pbjs.setConfig({ paapi: { + enabled: true, + defaultForSlots: 1, gpt: { - autoconfig: false + configWithTargeting: false } } }) -``` - -You may then use `setPAAPIConfigForGPT`, typically from a `bidsBackHandler`: - -```js pbjs.requestBids({ // ... - bidsBackHandler: function(bids, timedOut, auctionId) { - pbjs.setPAAPIConfigForGPT(); - // ... + bidsBackHandler: function(bids, timedOut, auctionId) { + pbjs.setPAAPIConfigForGPT(); + // ... } }) ``` diff --git a/dev-docs/publisher-api-reference/setPAAPIConfigForGPT.md b/dev-docs/publisher-api-reference/setPAAPIConfigForGPT.md index cf47f90a4c..e1b882cffc 100644 --- a/dev-docs/publisher-api-reference/setPAAPIConfigForGPT.md +++ b/dev-docs/publisher-api-reference/setPAAPIConfigForGPT.md @@ -7,7 +7,7 @@ sidebarType: 1 Configure GPT slots to use PAAPI. -**Kind**: static method of pbjs API. Only available when the [fledgeForGpt module](/dev-docs/modules/fledgeForGpt.html) is installed. +**Kind**: static method of pbjs API. Only available when the [paapiForGpt module](/dev-docs/modules/paapiForGpt.html) is installed. **Parameters**: @@ -17,6 +17,7 @@ Configure GPT slots to use PAAPI. | options | Optional | `Object` | | | options.adUnitCode | Optional | `String` | Ad unit filter; if provided, only configure the GPT slot that matches this ad unit | | options.auctionId | Optional | `String` | Auction filter; if provided, only configure GPT slots with PAAPI configs from this auction | +| customSlotMatching | Optional | `Function` | Custom slot matching function - of the same type used by [setTargetingForGPTAsync](/dev-docs/publisher-api-reference/setTargetingForGPTAsync.html) | **Example**: diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md index b9ac0966c7..60dab62a76 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -120,7 +120,7 @@ Prebid Server's support for Fledge is a passthrough: 1. If the request contains `imp.ext.ae: 1` 2. Bid adapters may respond with 'auction config' that's placed in `ext.prebid.fledge.auctionconfigs[]`. -The auction config must then be used by the client. See the Prebid.js [Fledge for GPT](/dev-docs/modules/fledgeForGpt.html) module for more information. +The auction config must then be used by the client. See the Prebid.js [PAAPI for GPT](/dev-docs/modules/paapiForGpt.html) module for more information. ### OpenRTB Fields diff --git a/support/privacy-resources.md b/support/privacy-resources.md index 5fafff1e87..5666071a65 100644 --- a/support/privacy-resources.md +++ b/support/privacy-resources.md @@ -76,7 +76,7 @@ the contextual auction. If the in-browser auction wins, it can override the ad c See [Chrome's PAAPI documentation](https://developers.google.com/privacy-sandbox/relevance/protected-audience) for the full background. -To enable Interest Group bidding in Prebid, you can add the Prebid [Fledge For GPT Module](/dev-docs/modules/fledgeForGpt.html). +To enable Interest Group bidding in Prebid, you can add the Prebid [PAAPI For GPT Module](/dev-docs/modules/paapiForGpt.html). {: .alert.alert-info :} Note that 'FLEDGE' was the original name of the Protected Audience feature. The name of the Prebid.js module may change in the future. @@ -84,7 +84,7 @@ Note that 'FLEDGE' was the original name of the Protected Audience feature. The ##### Prebid.js and the PAA Test Period During the first part of 2024, Chrome and GAM are running a test of PAAPI on a limited subset of traffic. However, the -[Fledge For GPT Module](/dev-docs/modules/fledgeForGpt.html) enables Interest Group auctions 100% of the time. During the test +[PAAPI For GPT Module](/dev-docs/modules/paapiForGpt.html) enables Interest Group auctions 100% of the time. During the test period, publishers can better align browser and programmatic ad behavior by only enabling Prebid interest group bids for the relevant Chrome testing labels. @@ -93,7 +93,7 @@ If you want to gather interest group bids only when InterestGroup (IG) auctions ```javascript Promise.resolve(navigator.cookieDeprecationLabel?.getValue?.()).then(label => { pbjs.setConfig({ - fledgeForGpt: { + paapi: { enabled: !label || label.startsWith("treatment_") || label === 'label_only_5' } }); @@ -105,7 +105,7 @@ If you want to gather interest group bids whenever when IG auctions _might_ run, ```javascript Promise.resolve(navigator.cookieDeprecationLabel?.getValue?.()).then(label => { pbjs.setConfig({ - fledgeForGpt: { + paapi: { enabled: !label || label.startsWith("treatment_") || label != 'label_only_1' } }); @@ -126,8 +126,8 @@ This table may be useful to publishers trying to decide which version of Prebid. | Prebid.js Version | Notes | |-------------------|-------| | 8.22| Makes Prebid FPD available to the PAAPI generateBid, scoreAds, and reportResult functions | -| 8.15| Added floor signal to the fledgeForGpt module | -| 8.9| Initial release of the fledgeForGpt module, Sec-Browsing-Topics header enabled | +| 8.15| Added floor signal to the paapiForGpt module | +| 8.9| Initial release of the paapiForGpt module, Sec-Browsing-Topics header enabled | | 8.8| The topicsFpd module is released, allowing bidders to share topics | #### Prebid Server Versions Supporting Privacy Sandbox From a687f59b22c85f67453230891f2f0fdd88d3538e Mon Sep 17 00:00:00 2001 From: Robert Kawecki Date: Sat, 21 Sep 2024 11:19:38 +0200 Subject: [PATCH 212/816] New bidder adapter: AdTonos (#5543) * Add docs for AdTonos bidder * Add missing quotes to AdTonos params in bidder docs --- dev-docs/bidders/adtonos.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 dev-docs/bidders/adtonos.md diff --git a/dev-docs/bidders/adtonos.md b/dev-docs/bidders/adtonos.md new file mode 100644 index 0000000000..c3d95b7305 --- /dev/null +++ b/dev-docs/bidders/adtonos.md @@ -0,0 +1,31 @@ +--- +layout: bidder +title: AdTonos +description: Prebid AdTonos Bidder Adapter +biddercode: adtonos +media_types: no-banner, video, audio +tcfeu_supported: true +gvl_id: 682 +gpp_supported: false +schain_supported: true +coppa_supported: true +usp_supported: true +deals_supported: true +floors_supported: true +safeframes_ok: true +prebid_member: true +pbjs: false +pbs: true +sidebarType: 1 +--- + +### Note + +The AdTonos Bidding adapter requires setup before beginning. Please contact us at + +### Bid params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|-----------------------|-----------------------|----------| +| `supplierId` | required | Supplier account id | `'1YZxxxyDMCXWv7SwY'` | `string` | From b6cb9015f26718cb6e21769056c51cd55999bb1c Mon Sep 17 00:00:00 2001 From: Bohdan <25197509+BohdanVV@users.noreply.github.com> Date: Tue, 24 Sep 2024 15:25:07 +0300 Subject: [PATCH 213/816] 51DegreesRtdProvider: replace wrong URL (#5609) --- dev-docs/modules/51DegreesRtdProvider.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/modules/51DegreesRtdProvider.md b/dev-docs/modules/51DegreesRtdProvider.md index bacd0e6733..30a672d05c 100644 --- a/dev-docs/modules/51DegreesRtdProvider.md +++ b/dev-docs/modules/51DegreesRtdProvider.md @@ -32,7 +32,7 @@ The Cloud API is **free** to integrate and use. To increase limits please check The module supports on premise and cloud device detection services with free options for both. -A free resource key for use with 51Degrees cloud service can be obtained from [51Degrees cloud configuration](https://configure.51degrees.com/tWrhNfY6). This is the simplest approach to trial the module. +A free resource key for use with 51Degrees cloud service can be obtained from [51Degrees cloud configuration](https://configure.51degrees.com/HNZ75HT1). This is the simplest approach to trial the module. An interface compatible self hosted service can be used with .NET, Java, Node, PHP, and Python. See [51Degrees examples](https://51degrees.com/documentation/_examples__device_detection__getting_started__web__on_premise.html). From 2170d114cff9d70f5086bc0bc2a78d7ed9b48b8e Mon Sep 17 00:00:00 2001 From: Denis <7009699+someden@users.noreply.github.com> Date: Wed, 25 Sep 2024 17:03:18 +0300 Subject: [PATCH 214/816] Yandex Bidder Adapter: add info about User ID Module (#5608) --- dev-docs/bidders/yandex.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/yandex.md b/dev-docs/bidders/yandex.md index 0f284b1d8c..3aed7f78a4 100644 --- a/dev-docs/bidders/yandex.md +++ b/dev-docs/bidders/yandex.md @@ -15,7 +15,10 @@ privacy_sandbox: topics This Adapter integrates with Yandex's ad services. {: .alert.alert-info :} -Note: For detailed auction analytics, check out our [Analytics Adapter](https://docs.prebid.org/dev-docs/analytics/yandex.html). +For detailed auction analytics, check out our [Analytics Adapter](/dev-docs/analytics/yandex.html). + +{: .alert.alert-info :} +To improve the personalization of ads for publishers’ users, check out our [User ID Module](/dev-docs/modules/userid-submodules/yandex.html). #### Client Bid Params From 3f5eaff0404745a28cdaa9d8bfa06fab83de8fc6 Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 25 Sep 2024 13:08:12 -0400 Subject: [PATCH 215/816] PBS floor adUnitCode support (#5621) --- prebid-server/features/pbs-floors.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/prebid-server/features/pbs-floors.md b/prebid-server/features/pbs-floors.md index 2c227bb3f9..be0b30fabc 100644 --- a/prebid-server/features/pbs-floors.md +++ b/prebid-server/features/pbs-floors.md @@ -225,7 +225,8 @@ supported only in Prebid Server, not in Prebid.js. | size | string | "300x250" | {::nomarkdown}
  • if ORTB imp.banner exists and only one size exists in imp.banner.format, then the rule value is matched against imp.banner.format[0].w and imp.banner.format[0].h
  • else if ORTB imp.banner exists and there's no imp.banner.format, then match the rule value against imp.banner.w and imp.banner.h
  • else if ORTB imp.video exists, match the rule value against imp.video.w and imp.video.h
  • Otherwise the size rule value only matches the "*" condition
{:/} | | gptSlot | string | "/111/homepage" | if imp.ext.data.adserver.name=="gam" then compare the rule value against imp.ext.data.adserver.adslot. Otherwise compare the rule value against imp.ext.data.pbadslot | | bidder | string | "bidderA" | Compare the rule value against imp.ext.prebid.bidder.BIDDER (Requires PBS-Java 3.5+) | -| **pbAdSlot** | string | "/111/homepage#div1" | Compare the rule value against imp.ext.data.pbadslot | +| **adUnitCode** | string | "/111/homepage" | (PBS-Java 1.101+) Compares the rule value against ORTB fields in this order: {::nomarkdown}
  • imp.ext.gpid
  • imp.tagid
  • imp.ext.data.pbadslot
  • imp.ext.prebid.storedrequest.id
{:/} | +| **pbAdSlot** | string | "/111/homepage#div1" | Deprecated - we suggest using adUnitCode instead. Compare the rule value against imp.ext.data.pbadslot | | **country** | string | "USA" | Compare the rule value against device.geo.country (ISO-3166-1-alpha-3) | | **deviceType** | string | "desktop", "phone", "tablet" | This is a very simple device-type algorithm: {::nomarkdown}
  • if ORTB device.ua is not present, only rules specifying a wildcard deviceType will match. In other words, there's no default value unless device.ua exists.
  • otherwise, match a rule value of "phone" if UA matches one of these patterns: "Phone", "iPhone", "Android.*Mobile", "Mobile.*Android"
  • otherwise, match a rule value of "tablet" if UA matches one of these: "tablet", "iPad", "Windows NT.*touch", "touch.*Windows NT", "Android"
  • otherwise assume the rule value "desktop" matches all other user agent strings.
{:/} | From b8c521247c2007b6e604f73bbf074a9e9b32ffd0 Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 26 Sep 2024 13:34:25 -0400 Subject: [PATCH 216/816] Update PBSDK to add UID2 reference (#5550) * mobile uid2 * Update prebid-mobile/pbm-api/ios/pbm-targeting-ios.md Co-authored-by: Muki Seiler * review update * review update --------- Co-authored-by: Muki Seiler --- .../android/pbm-targeting-params-android.md | 17 ++++++++++++++++- prebid-mobile/pbm-api/ios/pbm-targeting-ios.md | 18 +++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/prebid-mobile/pbm-api/android/pbm-targeting-params-android.md b/prebid-mobile/pbm-api/android/pbm-targeting-params-android.md index e470e326d3..883e28a3ac 100755 --- a/prebid-mobile/pbm-api/android/pbm-targeting-params-android.md +++ b/prebid-mobile/pbm-api/android/pbm-targeting-params-android.md @@ -584,7 +584,22 @@ Example: PrebidMobile.storeExternalUserId(externalUserIdArray); ``` ---- +### IDs that Require Additional SDKs + +Certain identity vendors require an external dependency to generate user identity and then to pass it via Prebid SDK. Please note that these are references to a 3rd party code and Prebid has not inspected it. Links to the documentations of those references will be listed in this section. + +#### Unified ID 2.0 (UID2) + +UID2 provides a [native library](https://unifiedid.com/docs/guides/integration-mobile-client-side#optional-uid2-prebid-mobile-sdk-integration) for automatically updating latest UID2 +token stored inside [UID2 SDK for Android](https://unifiedid.com/docs/sdks/sdk-ref-android) into Prebid's external user's ID list. + +App developers are not required to manually call ```PrebidMobile.setExternalUserId``` method as the native library will do so automatically. + +Note: + +- [Github repo](https://github.com/IABTechLab/uid2-android-sdk) +- [UID2 Android Integration Documentation](https://unifiedid.com/docs/guides/integration-mobile-overview) +- [UID2+Prebid Integration Instruction](https://unifiedid.com/docs/guides/integration-mobile-client-side#optional-uid2-prebid-mobile-sdk-integration) ## Targeting Class Methods diff --git a/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md b/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md index 2556415d82..1fdc17b6c0 100644 --- a/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md +++ b/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md @@ -456,7 +456,23 @@ Targeting.shared.removeStoredExternalUserId("sharedid.org") Targeting.shared.removeStoredExternalUserIds() ``` ---- +### IDs that Require Additional SDKs + +Certain identity vendors require an external dependency to generate user identity and then to pass it via Prebid SDK. Please note that these are references to a 3rd party code and Prebid has not inspected it. Links to the documentations of those references will be listed in this section. + +#### Unified ID 2.0 (UID2) + +UID2 provides a [native library](https://unifiedid.com/docs/guides/integration-mobile-client-side#optional-uid2-prebid-mobile-sdk-integration) for automatically updating latest UID2 +token stored inside [UID2 SDK for iOS](https://unifiedid.com/docs/sdks/sdk-ref-ios) into Prebid's external user's ID list. + +App developers are not required to manually call ```Prebid.shared.externalUserIdArray = latestExternalUserIdArray``` +as the native library will do so automatically + +Note: + +- [Github repo](https://github.com/IABTechLab/uid2-ios-sdk) +- [UID2 iOS Integration Documentation](https://unifiedid.com/docs/guides/integration-mobile-overview) +- [UID2+Prebid Integration Instruction](https://unifiedid.com/docs/guides/integration-mobile-client-side#optional-uid2-prebid-mobile-sdk-integration) ## Targeting Class Properties and Methods From f2ef30a52f61f37b2f24cdfa55bdeb7c944de70a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Boisvert?= Date: Fri, 27 Sep 2024 02:45:29 -0400 Subject: [PATCH 217/816] Fix duplicated key 'pos' in adUnit.mediaTypes.video (#5622) * Fix duplicated key 'pos' in adUnit.mediaTypes.video * Fix double lines problem --- dev-docs/adunit-reference.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dev-docs/adunit-reference.md b/dev-docs/adunit-reference.md index b745357059..1369862c23 100644 --- a/dev-docs/adunit-reference.md +++ b/dev-docs/adunit-reference.md @@ -101,7 +101,7 @@ See [Prebid Native Implementation](/prebid/native-implementation.html) for detai {: .table .table-bordered .table-striped } | Name | Scope | Type | Description | |------------------+-------------+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `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 | +| `pos` | Optional | Integer | Ad position on screen, see [OpenRTB 2.5 spec][openRTB]. OpenRTB page position value: 0=unknown, 1=above-the-fold, 3=below-the-fold, 4=header, 5=footer, 6=sidebar, 7=full-screen | | `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. | @@ -123,7 +123,6 @@ See [Prebid Native Implementation](/prebid/native-implementation.html) for detai | `minbitrate` | Optional | Integer | Minimum bit rate in Kbps., see [OpenRTB 2.5 spec][openRTB]. | | `maxbitrate` | Optional | Integer | Maximum bit rate in Kbps., see [OpenRTB 2.5 spec][openRTB]. | | `delivery` | Optional | Array[Integer] | Supported delivery methods (e.g., streaming, progressive), see [OpenRTB 2.5 spec][openRTB]. | -| `pos` | Optional | Integer | Ad position on screen, see [OpenRTB 2.5 spec][openRTB]. | | `playbackend` | Optional | Integer | The event that causes playback to end, see [OpenRTB 2.5 spec][openRTB]. | If `'video.context'` is set to `'adpod'` then the following parameters are also available. From f2b4cd96171c477d3296b9778bc6b6f8f2c53307 Mon Sep 17 00:00:00 2001 From: Andrius Versockas Date: Wed, 2 Oct 2024 16:14:54 +0300 Subject: [PATCH 218/816] Eskimi adapter documentation update (#5626) Co-authored-by: Andrius Versockas --- dev-docs/bidders/eskimi.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/eskimi.md b/dev-docs/bidders/eskimi.md index 9b5e9e9be3..ce45645705 100644 --- a/dev-docs/bidders/eskimi.md +++ b/dev-docs/bidders/eskimi.md @@ -5,14 +5,19 @@ description: Prebid Eskimi Bidder Adapter pbjs: true pbs: false biddercode: eskimi -deals_supported: false media_types: banner, video -gvl_id: 814 schain_supported: true +tcfeu_supported: true +usp_supported: true +coppa_supported: true +gpp_supported: true +deals_supported: false floors_supported: true safeframes_ok: false multiformat_supported: will-bid-on-any ortb_blocking_supported: true +fpd_supported: true +gvl_id: 814 sidebarType: 1 --- From fc17b5734d75fc97cbb11175b384deab0f563f23 Mon Sep 17 00:00:00 2001 From: Desvillettes <30619957+AurelienMozoo@users.noreply.github.com> Date: Thu, 3 Oct 2024 16:00:27 +0200 Subject: [PATCH 219/816] Add gpp_sids supported in ogury adapter doc (#5629) --- dev-docs/bidders/ogury.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/ogury.md b/dev-docs/bidders/ogury.md index e80db70e7e..a8207a4412 100644 --- a/dev-docs/bidders/ogury.md +++ b/dev-docs/bidders/ogury.md @@ -17,6 +17,7 @@ pbjs: true pbs: false prebid_member: false sidebarType: 1 +gpp_sids: tcfeu, usnat, usstate_all --- ### Registration From bfa0366e3ec8a93d8fa9a90e690e1b354503c9f4 Mon Sep 17 00:00:00 2001 From: artemAdp <133973660+artemAdp@users.noreply.github.com> Date: Thu, 3 Oct 2024 18:11:11 +0300 Subject: [PATCH 220/816] add documentation for AdPlayer.Pro video module (#5615) Co-authored-by: artem --- dev-docs/modules/adplayerproVideoProvider.md | 24 +++ prebid-video/video-module.md | 3 + .../integration-examples/adplayerpro.html | 154 ++++++++++++++++++ 3 files changed, 181 insertions(+) create mode 100644 dev-docs/modules/adplayerproVideoProvider.md create mode 100644 prebid-video/video-module/integration-examples/adplayerpro.html diff --git a/dev-docs/modules/adplayerproVideoProvider.md b/dev-docs/modules/adplayerproVideoProvider.md new file mode 100644 index 0000000000..8543baa3b3 --- /dev/null +++ b/dev-docs/modules/adplayerproVideoProvider.md @@ -0,0 +1,24 @@ +--- +layout: page_v2 +page_type: module +title: Module - AdPlayer.Pro Video Submodule +description: Allows Prebid to integrate directly with AdPlayer.Pro video player. +module_code : adplayerproVideoProvider +display_name : AdPlayer.Pro Video Provider +enable_download : true +vendor_specific: true +sidebarType : 1 +--- + +# AdPlayer.Pro Video Provider + +The AdPlayer.Pro Video Provider is a submodule of the Prebid Video Module. + +The AdPlayer.Pro Vendor Code for the Video Module is `3`. + +For information on how to use the Video Module with AdPlayer.Pro please visit the [docs]({{site.github.url}}/prebid-video/video-module.html). + +## Additional Information + +- If you would like to further customize your AdPlayer.Pro experience, please visit our [Developer docs](https://docs.adplayer.pro/whitelabel-standalone-script/). +- To learn more [about us](https://adplayer.pro/). diff --git a/prebid-video/video-module.md b/prebid-video/video-module.md index 4c580e5dfd..19ac1c5219 100644 --- a/prebid-video/video-module.md +++ b/prebid-video/video-module.md @@ -41,6 +41,7 @@ The following Video Players are currently supported: |--------------|----------------|-------------| | [JW Player](https://info.jwplayer.com/sign-up/?utm_source=developer&utm_medium=CTA) | jwplayerVideoProvider | 1 | | [video.js](https://videojs.com/) | videojsVideoProvider | 2 | +| [AdPlayer.Pro](https://adplayer.pro/) | adplayerproVideoProvider | 3 | Not seeing your desired video player ? Learn how to add support by reading our [contribution guide](#Video-Module-Contributing) @@ -69,6 +70,8 @@ For the list of properties in the `video` object of the ad unit please visit the [JW Player]({{site.baseurl}}/prebid-video/video-module/integration-examples/jwplayer.html) +[AdPlayer.Pro]({{site.baseurl}}/prebid-video/video-module/integration-examples/adplayerpro.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/adplayerpro.html b/prebid-video/video-module/integration-examples/adplayerpro.html new file mode 100644 index 0000000000..15a0865779 --- /dev/null +++ b/prebid-video/video-module/integration-examples/adplayerpro.html @@ -0,0 +1,154 @@ + + + + + + + AdPlayer.Pro Event Listeners + + + + + + + + +

AdPlayer.Pro Event Listeners

+ +
Div-1: Player placeholder div
+
+ + + From 77436d861b6b13866c2c5e18b474faf6a0ca9af5 Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 4 Oct 2024 13:07:51 -0400 Subject: [PATCH 221/816] Floors: add useFetchDataRate feature (#4643) * Floors: add useFetchDataRate feature Per https://github.com/prebid/prebid-server/issues/2755 * Add alt text to images * 50px for mile logo too * Update floors.md --------- Co-authored-by: Muki Seiler --- dev-docs/modules/floors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/modules/floors.md b/dev-docs/modules/floors.md index 634f61d7b1..20abc03706 100644 --- a/dev-docs/modules/floors.md +++ b/dev-docs/modules/floors.md @@ -378,6 +378,7 @@ a subset that will be merged under the 'data' object. | data.floorProvider | string | Optional atribute (as of prebid version 4.2) used to signal to the Floor Provider's Analytics adapter their floors are being applied. They can opt to log only floors that are applied when they are the provider. If floorProvider is supplied in both the top level of the floors object and within the data object, the data object's configuration shall prevail.| - | | data.currency | string | Currency of floor data. The module will convert currency where necessary. See Currency section for more details. | 'USD' | | data.skipRate | integer | skipRate is a random function whose input value is any integer 0 through 100 to determine when to skip all floor logic, where 0 is always use floor data and 100 is always skip floor data. The use case is for publishers or floor providers to learn bid behavior when floors are applied or skipped. Analytics adapters will have access to model version (if defined) when skipped is true to signal the module is in floors mode. If skipRate is supplied in both the root level of the floors object and within the data object, the skipRate configuration within the data object shall prevail.| 0 | +| data.useFetchDataRate | integer | (PBS-Go 2.6+) useFetchDataRate is a random function whose input value is any integer 0 through 100 to determine when to skip dynamic floor data and fall back to static floor data. 0 means always use static floor data and 100 means always use dynamic floor data. The use case is for publishers or floor providers to confirm how dynamic floors data compares to static floors data. Analytics adapters will have access to the location of the actual floors data used, either "request" or "fetch". | 100 | | data.floorsSchemaVersion | integer | The module supports two version of the data schema. Version 1 allows for only one model to be applied in a given data set, whereas Version 2 allows you to sample multiple models selected by supplied weights. If no schema version is provided, the module will assume version 1 for the sake of backwards compatiblity.| 1 | | data.modelTimestamp | int | Epoch timestamp associated with modelVersion. Can be used to track model creation of floor file for post auction analysis.| - | | data.noFloorSignalBidders | array of strings | (PBJS 8.31+, PBS-Java 3.4+) This is an array of bidders for which to avoid sending floors. This is useful for bidders where the publishers has established different floor rules in their systems. The value can be `["*"]`. | - | From 1cb353204728a94e26345424ac7d535b6aa16232 Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 4 Oct 2024 17:10:00 -0400 Subject: [PATCH 222/816] final training videos (#5633) * final training videos * lint * lint --- features/timeouts-video.md | 84 ++++++++++++++++++++++++++++++++ features/timeouts.md | 9 ++++ overview/all-videos.md | 2 + tools/prof-prebid-video.md | 99 ++++++++++++++++++++++++++++++++++++++ tools/professor-prebid.md | 81 +++++++++++++++++-------------- 5 files changed, 238 insertions(+), 37 deletions(-) create mode 100644 features/timeouts-video.md create mode 100644 tools/prof-prebid-video.md diff --git a/features/timeouts-video.md b/features/timeouts-video.md new file mode 100644 index 0000000000..b346612ec2 --- /dev/null +++ b/features/timeouts-video.md @@ -0,0 +1,84 @@ +--- +layout: page_v2 +title: Video Intro to Timeouts in Prebid.js +description: A video overview of Prebid.js Timeouts +sidebarType: 1 +--- + +# A Video Overview of Timeouts in Prebid.js + +{% include vimeo-iframe.html id="1014195522" title="1014195522" %} + +Further Content: + +- [Prebid.js Timeouts](/features/timeout.html) +- [All videos](/overview/all-videos.html) + +Related Videos + +- [Prebid.js Impression Flow](/prebid/prebidjs-flow-video.html) +- [Introduction to Server-Side Header Bidding](/dev-docs/pbsBidAdapter-video-overview.html) + +## Transcript + +This video covers the topic of bidder timeouts in Prebid auctions. + +We’ll explain how and why timeouts occur in Prebid auctions, how they can affect your monetization, and what strategies you can use to minimize timeouts and maximize performance in Prebid.js and Prebid Server. + +This video will be most useful to those with a strong understanding of the Prebid auction process. If you need a refresher, we recommend watching the Prebid.js Impression Flow and the Introduction to Server-Side Header bidding videos. These videos are detailed step-by-step walkthroughs of a Prebid auction. + +Bidder timeouts are important to track because they affect your monetization. Timeouts represent lost bids, which means less competition for your ad impressions and weaker monetization than the scenario in which there are fewer timeouts. Later in this video, we’ll discuss strategies for optimizing monetization and bidder timeouts. + +There are five general factors that influence whether or not a bidder's response will be time out. We’ll walk through each of these. + +First make sure that you have solid measurement in place before beginning to optimize. Prebid’s robust analytics framework can be used to measure timeout rate, response time, and other critical metrics. + +Optimizing a Prebid auction should always start with a clear understanding of what you are trying to achieve. Optimization is about finding the best balance in a tradeoff for you and your business. In this section, we’ll outline some basic principles and best practices to remember as you work to optimize your own auctions. + +Next, understand what you are able to control to influence timeouts. You can make Prebid run more efficiently by fine-tuning your pre-auction processes and by optimizing the web page itself. You can also directly influence timeout rates by adjusting the timeout duration. This is the amount of time that you allow Prebid to execute its auction before concluding the auction and proceeding without timed out bids. + +Timeout duration affects timeout rates: shorter timeout durations give bidders less time to respond and result in more timeouts. Longer durations are the opposite, resulting in lower timeouts and higher bid density. + +However, it’s important to remember that there’s a tradeoff here. Timeout duration also affects the total auction time, and there are costs to longer auctions. The longer your timeout duration, the longer it will take on average for Prebid.js to complete its auction, call the primary ad server, and, ultimately, deliver ads to the website. Waiting too long to serve ads can result in lost impressions, which hurts monetization and creates a bad experience for demand partners. Slow-to-load ads can also contribute to poor user experience. + +Therefore, timeout duration optimization is about striking a balance. It is rarely optimal to completely eliminate bidder timeouts, because this will result in costly tradeoffs. So you’ll want to determine a panel of metrics that allow you to measure performance holistically, then test variations on timeout duration and bidder selection continually to discover optimal setup. + +Continual testing can be labor intensive, so many publishers use automated optimization tools. Some companies that offer analytics and Prebid management solutions also offer automated optimization services. + +Make sure that the analytics solution you choose can measure the bidder timeout rate, which is the percentage of total bid requests to the bidder that timed out. Ideally, this metric is available for a variety of user locations and page types. It’s also helpful but not essential to be able to see the average response time for each bidder. + +Check the video description for links to other videos and documentation about Prebid analytics. + +If you’re unfamiliar with this type of hybrid setup, you can find the necessary context in our video on Server-Side Auctions with Prebid.js. The link is in the video description below. + +The first is the timeout duration set in Prebid.js or Prebid Server. The more time that these auction systems give bidders to respond, the less likely those bidders are to time out. As a publisher, you have control over this setting for your auctions, and this setting is perhaps the most powerful tool you have for managing timeouts. + +The second is the time that Prebid.js sometimes spends retrieving or processing data before sending bid requests. For example, Prebid.js might make requests to set user ID cookies, to gather first-party data, or to interact with a consent management platform. + +Depending on your Prebid.js configuration settings, these pre-auction processes may delay the sending of bid requests, leaving bidders less time to respond and making timeouts more likely. Usually, these processes don’t occur on every auction, and are more likely to occur on the first page view of a user’s session within the domain. + +Publishers also have lots of control: in the Prebid.js configuration, you’re able to set the amount of time that you will allow these processes, and you can also decide whether or not they should delay bid requests. + +The third factor affecting timeouts is the speed of the bidder’s own internal processes for generating a bid. Some bidders are able to receive a bid request, determine their bid, and respond quite quickly, while others respond more slowly. A bidder’s average response time is an important metric to consider when you evaluate its performance. + +The fourth factor is the network latency, which refers to the amount of time that the request and response messages spend traveling between the user’s device and the demand source’s server. This includes the user’s internet connection speed, their physical distance from the server that is receiving the request, and other factors. While you can’t always control these factors directly, you can fine-tune auction settings like the timeout duration and bidder selection according to the user’s location or connection type. + +The fifth and final factor affecting timeouts is the web page itself. User’s devices are limited in their ability to perform processes and request data from server-side sources, and Prebid is just one of many components that need resources on a modern webpage. A busier page can result in more timeouts by slowing Prebid’s ability to run its auction. + +Thanks for watching this video on timeouts in Prebid.js. Check out the link in the description below for more resources. + +Let’s start with the basics: what is a timeout, and why is it important? + +In this section, we’ll explain why timeouts happen. + +Next we’ll discuss how to optimize timeouts in a Prebid auction. + +We’d like to share one final best practice that relates to auctions on websites that include server-side bidders. + +Each time the Prebid auction sends bid requests, it starts a timer and expects to receive responses from the bidders before the timer is finished. + +A timeout occurs when a bidder fails to respond before the end of the timer. + +When bidders are set up server side, Prebid.js will make a request to Prebid Server, which in turn makes server-side requests to bidders. Prebid.js and Prebid Server have independent bidder timeout settings, and it’s important to make sure that these are closely coordinated. If they aren’t, you can inadvertently cause your Prebid Server’s response to Prebid.js to time out and lose valuable server-side bids. + +Thanks for watching this video on timeouts in Prebid.js. Check out the link in the description below for more resources. diff --git a/features/timeouts.md b/features/timeouts.md index ea3045a0da..d34b540059 100644 --- a/features/timeouts.md +++ b/features/timeouts.md @@ -18,6 +18,15 @@ pages to delay the ad server call for just long enough to get bids, but not so long as to reduce overall revenue. This delay is controlled by a number of timeouts and adjustments. +{% include vimeo-iframe.html id="1014195522" title="1014195522" %} + +Related content: + +- [Transcript of this video](/features/timeouts-video.html) +- [Prebid.js Impression Flow](/prebid/prebidjs-flow-video.html) + +## Different kinds of timeouts + This diagram summarizes timeouts in Prebid.js and Prebid Server: ![Timeout](/assets/images/dev-docs/prebid-timeouts.png){:class="pb-xlg-img"} diff --git a/overview/all-videos.md b/overview/all-videos.md index ce5cfba1af..ea808cb303 100644 --- a/overview/all-videos.md +++ b/overview/all-videos.md @@ -20,7 +20,9 @@ Multimedia overviews covering various aspect of Header Bidding and Prebid. 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. 1. [Prebid.js and The Video Ad Format](/prebid-video/video-overview-video.html) - An introduction to how video works with Prebid.js. 1. [Analytics in Prebid.js](/overview/analytics-video.html) - An introduction for how to utilize reporting with Prebid.js. +1. [Prebid.js timeouts](/features/timeouts-video.html) - An overview of Timeouts in Prebid.js. 1. [Prebid and Ad Operations](/adops/adops-overview-video.html) - An overview of the process of planning a Prebid integration for ad operations. 1. [Floors in Prebid.js and Prebid Server](/dev-docs/floors-video-overview.html) - An overview of the Prebid.js and Prebid Server price floor features. 1. [Prebid Mobile Impression Flow](/prebid-mobile/prebid-mobile-video-flow.html) - A step-by-step walkthrough of a typical Prebid Mobile auction. 1. [Prebid Mobile Planning Guide](/prebid-mobile/prebid-mobile-video-planning.html) - A video guide to planning your first Prebid Mobile integration. +1. [Professor Prebid Browser Extension](/tools/prof-prebid-video.html) - A video overview of the Professor Prebid browser extension. diff --git a/tools/prof-prebid-video.md b/tools/prof-prebid-video.md new file mode 100644 index 0000000000..260093209c --- /dev/null +++ b/tools/prof-prebid-video.md @@ -0,0 +1,99 @@ +--- +layout: page_v2 +title: Video Intro to the Professor Prebid browser extension +description: A video overview of Professor Prebid +sidebarType: 1 +--- + +# A Video Overview of the Professor Prebid Browser Extension + +{% include vimeo-iframe.html id="1003776317" title="1003776317" %} + +Further Content: + +- [Professor Prebid](/tools/professor-prebid.html) +- [Professor Prebid in the Chrome Web Store](https://chromewebstore.google.com/detail/professor-prebid/kdnllijdimhbledmfdbljampcdphcbdc) +- [Prebid.js Config Documentation](/dev-docs/publisher-api-reference/setConfig.html) +- [All videos](/overview/all-videos.html) + +Related Videos + +- [Prebid.js Impression Flow](/prebid/prebidjs-flow-video.html) + +## Transcript + +This video shows you how to use the Professor Prebid browser extension. + +Anybody who needs to inspect, troubleshoot, or debug a Prebid.js integration will find Professor Prebid useful, particularly publisher developers and AdOps team members. + +One final note before we jump in: like the other components of Prebid, Professor Prebid is constantly being improved. As a result, the look and feel of the UI may change over time. + +Professor Prebid is an extension for the Chrome browser that displays detailed real-time information about auctions that occur during your browsing session, allowing you to examine Prebid.js auctions as they occur under a range of scenarios. + +The ability to watch Prebid.js work in real time is useful for testing and validating updates to your Prebid.js configuration. It’s also an invaluable tool for uncovering and fixing problems that hamper Prebid.js’s performance. + +Now, we’ll walk through Professor Prebid step-by-step. + +To use Professor Prebid, open Chrome, visit the Chrome Web Store, and install Professor Prebid. + +Then, visit the page you would like to inspect and click the Prebid icon in your browser’s toolbar. + +If Prebid.js isn’t installed or isn’t triggering auctions, you’ll see a message explaining that Professor Prebid doesn’t detect an instance of Prebid.js. + +In the upper right hand corner of the extension window, there are buttons to open Professor Prebid’s documentation in a new tab and to refresh the page. + +Next, let’s explore the Ad Units Section. + +The Ad Units section shows essential auction statistics and list of the Ad Units for which Prebid Requested bids. This tab shows all of the essential information about your Prebid session in one place. + +At the top of the window, you’ll see the Prebid.js version, the timeout duration that is configured for the active instance of Prebid.js, the number of Prebid Ad Units that are active on the page, the number of bidders that are active, the total number of bids received from bidders, the total number of “no bid” responses, and the number of console or warning errors that have occurred during the session. + +Clicking the Events button will open up a window that shows the warning and error messages. The messages are useful for troubleshooting issues related to bidders, user identification, consent management, and much more. The main content of the Ad Units Tab is a table that includes a row for each active ad unit. The first column shows the code that identifies the ad unit. + +The second column includes information about the media types that the ad unit supports. Media types are also known as ad formats. Clicking inside this column will open a window that shows the full media type JSON. It’s easy to copy the JSON and paste it into your favorite text editor for closer inspection. + +The third, right-most column shows the list of bidders that are enabled for the ad unit. Bidders that returned valid bids will be shown in blue, along with their bid CPMs. Bidders who were selected to display ads by the primary ad server will be shown in orange. Clicking any bidder will display the bid request and bid response JSON objects for the bidder on the specific ad unit. + +The bids section is next. It shows a list of bid responses that Prebid.js received from your bidders across all of the active ad units on the page. The list can be filtered to show bids only, or no bid responses only. + +The bids table identifies bidders using their bidder code. If you use alias bidders, then the bidder code will be the alias name. It also shows the bid CPM, the bid currency, the code of the ad unit associated with the bid, the dimensions of the banner ad or video that the bidder returned, and the media type associated with the bid. + +Clicking the arrow next to any row will expand the row to show detailed information about the bid. The icon in the upper left hand corner will expand all of the rows. + +The bid details will include additional information about the contents and attributes of the bidder’s bid response. These include the bidder’s response time in milliseconds, and the bid source, which is “client” for bidders that are integrated to Prebid.js using the bidder’s own client-side Prebid adapter, and “s2s” for bidders that are integrated through Prebid Server. + +The Bid Cache Period is the amount of time in seconds that Prebid.js will cache valid bids for use in future auctions on the same ad unit. The ad server targeting section contains a list of the key- value pairs that Prebid.js sent to the primary ad server for the bid. + +Next, we’ll look at the timeline section, which allows you to investigate auction timing and bidder timeouts. It shows a chart of bidder response times for each auction that Prebid.js has run during your session. This chart can be useful for identifying issues with bidder timeouts and for fine-tuning the bid timeout settings. The Auction time represents the total amount of time in milliseconds that Prebid.js took to execute the auction. + +The bid timeout setting in the Prebid.js configuration sets the maximum possible auction time, but auction times may be shorter in cases where all bidders respond within the bid timeout window. For more information about bid timeouts, check out our Guide to Timeouts in Prebid video. + +The next section, Config, displays your Prebid.js configuration in an easy-to-read format. It includes the most important parameters of Prebid.js, including price granularity, auction settings, bidder settings, Prebid Server configuration and user ID settings, The cards on this view can be clicked to show an expanded detail view. The contents of this view will depend on the modules you’ve installed. For example, if you have installed Consent Management modules, you’ll see configurations relevant to them here. + +Please note that this tab is a summary of the Prebid.js configuration. For a more detailed look, use the pbjs.getConfig(); method in the browser console. A link to the documentation on the Prebid.js configuration can be found in the notes below. + +The User ID section comes next. It allows you to see UserID module configurations and verify that user IDs are being set correctly. This section includes a table that shows the user IDs that the Prebid.js User ID module is able to access. The table shows the source, the User IDs, and the atype, which is the user agent type as defined by the Open RTB Extended Identifiers specification. + +The Config tab within the User ID screen shows the User ID configuration for each User ID submodule that has been installed to Prebid.js. For more information on user ID module configuration, check out our video on the subject. You can find the link in the description below. + +The next section, tools, includes a collection of powerful utilities for testing, troubleshooting, and debugging Prebid.js The Tools tab includes a shortcut button to the Google Ad Manager console, a button that opens the Professor Prebid debug tab inside of the Chrome developer tools, and a button that clears your Prebid session data from Professor Prebid. After pressing the Delete Tabinfos button, you’ll need to refresh the page to see auction info again. + +You can also enable the Ad Unit Info Overlay, which places a semi-transparent overlay over the divs in the web page that are linked to Prebid Ad Units. + +The overlay includes information about the ad server line item and creative that were delivered to the slot. If a Prebid bid won this slot, the overlay will include essential bid information such as bidder name, CPM, and response time. + +Below the Ad Unit Info Overlay toggle is a toggle that enables Prebid debug mode, which causes Prebid to print information about its activity to the browser console. + +The final section of the Tools tab is rules, which allows you to simulate specific auction scenarios for testing and troubleshooting. This is a powerful tool that saves time during the troubleshooting process, because you’ll spend less time searching for an auction that meets the conditions you need to test. + +Let’s say for example that you want to test to make sure that a specific bidder’s ads are rendering properly. Testing this scenario on a normal test page or production page could be difficult, because the bidder won’t always win the auction. Rules will allow you to override the bidder’s CPM with a high price and cause that bidder to win the auction reliably, triggering the rendering process. + +Rules can be applied to specific ad units, specific bidders, or a combination of the two, + +and the aspects of the auction they are able to override include bid CPMs, deal IDs, bid media types, and more. Rules are a powerful feature that allow developers and QA teams to test changes to Prebid.js quickly and thoroughly before going live. + +The final section, version displays information about the Prebid.js version running on the page. + +Prebid.js is constantly being improved by the open-source community. To take advantage of all that Prebid.js has to offer, you’ll want to keep your installation up-to-date. The version section of Professor Prebid will display the version of Prebid.js that’s installed to the page. When the installed version is older than the current version in Prebid’s main branch, this tab will outline the key differences between the two versions. + +That’s it for this overview of Professor Prebid. To learn more, check out the documentation at docs.prebid.org. To install the extension, visit the Chrome Web Store. diff --git a/tools/professor-prebid.md b/tools/professor-prebid.md index 59386541ca..dc8bc15eaa 100644 --- a/tools/professor-prebid.md +++ b/tools/professor-prebid.md @@ -9,13 +9,20 @@ sidebarType: 8 {:.no_toc} -* TOC +- TOC {:toc} ## Introduction Professor Prebid is an open source Chrome extension to allow easy debugging and troubleshooting on publisher websites using Prebid.js. +{% include vimeo-iframe.html id="1003776317" title="1003776317" %} + +Further Content: + +- [Transcript of this video](/tools/prof-prebid-video.html) +- [Prebid.js Config Documentation](/dev-docs/publisher-api-reference/setConfig.html) + ## Installation Simply visit the dedicated [Chrome Store link](https://chrome.google.com/webstore/detail/professor-prebid-v02/kdnllijdimhbledmfdbljampcdphcbdc) and click on `Add to Chrome`. Don't forget to pin it so you can have one-click access. @@ -47,10 +54,10 @@ Finally, you can also spot who is the winning bidder and whether its ad was rend This screen allows you to verify and compare all the bids placed via Prebid.js and their metadata including: -* Bid value -* Bid currency -* Response time -* Adserver Targeting keywords +- Bid value +- Bid currency +- Response time +- Adserver Targeting keywords ![Professor Prebid bids screen](/assets/images/tools/professor-prebid-5.png) @@ -58,11 +65,11 @@ This screen allows you to verify and compare all the bids placed via Prebid.js a This view shows you the auction's main milestones: -* Auction start timestamp -* Bidders calling sequence and timestamp -* Each bidder response time -* Timeout threshold -* Auction end timestamp +- Auction start timestamp +- Bidders calling sequence and timestamp +- Each bidder response time +- Timeout threshold +- Auction end timestamp ![Professor Prebid timeline screen](/assets/images/tools/professor-prebid-6.png) @@ -72,11 +79,11 @@ Professor Prebid renders different timeline views using the auction id as key. T You will find here the main modules and their configuration: -* Price Granularity: low/medium/high/auto/dense/custom -* Bidder settings: calling order, timeout, … -* Prebid Server: id, bidders, endpoints, … -* CMP: Support different compliance frameworks (TCF, CCPA...), encoded consent string, decoded consent string -* User ID modules +- Price Granularity: low/medium/high/auto/dense/custom +- Bidder settings: calling order, timeout, … +- Prebid Server: id, bidders, endpoints, … +- CMP: Support different compliance frameworks (TCF, CCPA...), encoded consent string, decoded consent string +- User ID modules ![Professor Prebid config screen](/assets/images/tools/professor-prebid-7.png) @@ -90,11 +97,11 @@ This view displays the configuration and the outcome of the different id provide This tab provides advanced troubleshooting tools: -* Shortcut to GAM console -* Activation of Prebid Debug data on console -* Bid filtering: allowlist of bidders -* Bid CPM override -* Adunit overlay: shows details about the winner over the creative on page +- Shortcut to GAM console +- Activation of Prebid Debug data on console +- Bid filtering: allowlist of bidders +- Bid CPM override +- Adunit overlay: shows details about the winner over the creative on page ![Professor Prebid tools screen](/assets/images/tools/professor-prebid-9.png) @@ -118,12 +125,12 @@ The goal of this tool doesn’t attempt to fix scenarios where compliance params {: .alert.alert-info :} Note: It is advised when testing User Sync URL's that you clear cookies relative to the domain you are testing. This will ensure that results are in-line with an initial visit to the current page. Additionally, the first resource matching the root URL will be used to generate the initiator request chain. -* With the Professor Prebid extension on, open the Chrome developer tools by right-clicking anywhere on a webpage and selecting `Inspect`. -* Navigate to the `Profressor Prebid` panel (top-right), then to the `Network Inspector` tab in the submenu directly below. -* Enable the feature by sliding the toggle below. -* Enter a User Sync root URL to listen for as the page loads to generate a request chain from, then click the "Set URL" button. For example, `https://ads.pubmatic.com/AdServer/js/user_sync.html?kdntuid=1&p=159096&us_privacy=1YNY` -* Close the developer tools window, re-open the Chrome Dev Tools again (for changes to reflect, a new instance of the developer tools is required) and navigate back to `Professor Prebid --> Network Inspector` -* Lastly, click the icon (top-right). This will refresh the page and generate a new initiator request chain below (If one is present for the provided User Sync Root URL). +- With the Professor Prebid extension on, open the Chrome developer tools by right-clicking anywhere on a webpage and selecting `Inspect`. +- Navigate to the `Profressor Prebid` panel (top-right), then to the `Network Inspector` tab in the submenu directly below. +- Enable the feature by sliding the toggle below. +- Enter a User Sync root URL to listen for as the page loads to generate a request chain from, then click the "Set URL" button. For example, `https://ads.pubmatic.com/AdServer/js/user_sync.html?kdntuid=1&p=159096&us_privacy=1YNY` +- Close the developer tools window, re-open the Chrome Dev Tools again (for changes to reflect, a new instance of the developer tools is required) and navigate back to `Professor Prebid --> Network Inspector` +- Lastly, click the screenshot icon (top-right). This will refresh the page and generate a new initiator request chain below (If one is present for the provided User Sync Root URL). The UI of the User Sync Network Inspector: @@ -142,9 +149,9 @@ Note: `redirectsTo` means a resource explicitly redirected to another resource. This tool will detect which Prebid.js build is currently running on a publisher page and then compare it against the latest Prebid.js build that has been released. In doing so, the following data will be displayed: -* How much time has passed since the currently used Prebid.js build has been released. -* An approximate number count of new features, maintenance updates and bug fixes that have been deployed since the most recent Prebid.js release compared to the currently used Prebid.js build. -* Explicit release notes for all releases ranging from the currently used Prebid.js build detected on a publisher page to the latest Prebid.js release. +- How much time has passed since the currently used Prebid.js build has been released. +- An approximate number count of new features, maintenance updates and bug fixes that have been deployed since the most recent Prebid.js release compared to the currently used Prebid.js build. +- Explicit release notes for all releases ranging from the currently used Prebid.js build detected on a publisher page to the latest Prebid.js release. ![Prebid.js Analyzer Tool](/assets/images/tools/professor-prebid-14.png) @@ -152,13 +159,13 @@ The version analyzer tool can be accessed 2 ways: Scenario #1 -* Open Professor Prebid from it's Chrome Extension icon (Top-Right of the Chrome tab window) -* Within the `ADUNITS` tab (selected by default), click the `Version` tab below (displayed in the format: `Version: vX.XX.X}`) +- Open Professor Prebid from it's Chrome Extension icon (Top-Right of the Chrome tab window) +- Within the `ADUNITS` tab (selected by default), click the `Version` tab below (displayed in the format: `Version: vX.XX.X}`) Scenario #2 -* Open Professor Prebid from the Chrome Devtools (Right-Click anywhere on a publisher page, select `Inspect` and then click `Professor Prebid` from the tab menu on the top-right of the Chrome Devtools window) -* Then select `VERSION` from the menu below. +- Open Professor Prebid from the Chrome Devtools (Right-Click anywhere on a publisher page, select `Inspect` and then click `Professor Prebid` from the tab menu on the top-right of the Chrome Devtools window) +- Then select `VERSION` from the menu below. ## How can I submit a feature request ? @@ -168,10 +175,10 @@ Please open an GitHub issue on [github.com/prebid/professor-prebid/issues](https Please submit a GitHub issue on [github.com/prebid/professor-prebid/issues](https://github.com/prebid/professor-prebid/issues) providing as much details as possible: -* Steps to reproduce the issue -* Example of website where you face the issue -* Professor Prebid version +- Steps to reproduce the issue +- Example of website where you face the issue +- Professor Prebid version ## Related Reading -* [Prebid.js troubleshooting guide](/troubleshooting/troubleshooting-guide.html) +- [Prebid.js troubleshooting guide](/troubleshooting/troubleshooting-guide.html) From d5ca94abdc6b690836ab8c415386caa5c886f736 Mon Sep 17 00:00:00 2001 From: bretg Date: Sat, 5 Oct 2024 01:55:16 -0400 Subject: [PATCH 223/816] Update reviewer guidelines (#5634) * Update reviewer guidelines * lint * lint --- guide.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/guide.md b/guide.md index 1506d9a2a8..a9609b567d 100644 --- a/guide.md +++ b/guide.md @@ -3,7 +3,6 @@ layout: page_v2 title: prebid.org website guide description: details about how the site works isNew: false - sidebarType: 0 --- @@ -37,16 +36,21 @@ Being a reviewer means you're in weekly rotation where you keep an eye on pull r ### PR Review Guidelines 1. Make sure no inappropriate changes are made. This covers obvious things like bad language and content, but we also don't allow overt marketing language on the site. Phrases like "we're the best BLAH" or "number one FOOZIT" need to be toned down. -2. Make sure competitors aren't messing with each other's docs. This can be hard to tell because we don't know which github handles belong to which companies, but in general, if a destructive or suspicious change is being made to a doc, check on the Prebid Slack channel to confirm that the affected company approves the change. +2. Make sure competitors aren't messing with each other's docs. This can be hard to tell because we don't know which github handles belong to which companies, but in general, if a destructive or suspicious change is being made to a doc, check on the Prebid Slack channel or the original github author to confirm that the affected company approves the change. 3. Make sure the change doesn't break formatting. It's not always necessary to preview locally, but for large changes, it's worthwhile verifying visually because markdown can be cranky. 4. Help the author with basic readability - if you as a reviewer don't understand a sentence, probably others will have trouble too. Push back and ask questions about what they're really trying to say. -5. We don't generally merge a docs PR until the related code is released. Prebid.js releases happen on Weds or Thurs, and people really like to have their docs PRs merged shortly after the code is released. For Prebid Server, it's ok to merge the docs after the code is merged. +5. We don't generally merge a docs PR until the related code is released. Prebid.js releases happen on Weds or Thurs, and people really like to have their docs PRs merged shortly after the code is released. For Prebid Server, it's ok to merge the docs after the code is merged. If they don't link a code PR, you can go search for it or just ask them to provide a link. 6. Fix broken or out-of-date things you run across. At least flag it in the team slack channel so we can fix it someday. 7. Bid Adapter Guidelines - 1. Check the front-matter: required fields are title and either pbjs or pbs. + 1. Check the metadata (aka front-matter): required fields are title and either pbjs or pbs, but in general, the adapter should supply at least half of the available fields. If they don't you should add a "request changes" note like "This document is missing quite a few pieces of adapter metadata. Please fill out the metadata as documented at [https://docs.prebid.org/dev-docs/bidder-adaptor.html#submitting-your-adapter](https://docs.prebid.org/dev-docs/bidder-adaptor.html#submitting-your-adapter)" 2. Every adapter needs a parameters table that contains exactly 5 columns in this order: Name, Scope, Description, Example, Type. 3. Discourage full-page HTML examples. Better to have just the bidder-specific logic and a pointer to a standard Prebid.js example. 4. All headers must be level 3, 4, or 5. + 5. As for the `media_types` metadata, if they don't support display, then the need to define "no-display". This is because the default metadata table in pbs-bidders.md assumes everyone supports display. + 6. If they claim `tcfeu_support: true`, they must also supply a `gvl_id`. You should check on the [TCF vendor list](https://vendor-list.consensu.org/v3/vendor-list.json) that the GVL ID supplied makes sense. If it's an alias they may define the GVL ID like this: `gvl_id: 14 (adkernel)` + 7. Don't let them claim both pbjs and pbs if they don't have both a Prebid.js and Prebid Server adapter. It's ok to have either a PBS-Go or PBS-Java adapter. + 8. They cannot claim `fpd_supported` unless the body of their documentation has a section describing how exactly they support First Party Data. You can reject this with a note like "Sorry - you can't claim FPD support unless the document has a description of what kind of First Party data. See the [http://docs.prebid.org/dev-docs/bidder-adaptor.html#submitting-your-adapter](http://docs.prebid.org/dev-docs/bidder-adaptor.html#submitting-your-adapter). We recommend looking at how other adapters have done this. e.g. you can declare that you support site first party data, user first party data, impression-level data, seller-define audience, etc." + 9. If they claim to be a `prebid_member`, you can check that on the [prebid.org membership page](https://prebid.org/member-directory/) ## Core Technologies From 5c42be4c18b29b831562b7e0fe0a62004f466da8 Mon Sep 17 00:00:00 2001 From: Chris Huie Date: Mon, 7 Oct 2024 09:45:10 -0600 Subject: [PATCH 224/816] britepool no longer in js (#5638) --- dev-docs/modules/userid-submodules/britepool.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/modules/userid-submodules/britepool.md b/dev-docs/modules/userid-submodules/britepool.md index 1ad65a74ff..9e24d92391 100644 --- a/dev-docs/modules/userid-submodules/britepool.md +++ b/dev-docs/modules/userid-submodules/britepool.md @@ -3,6 +3,7 @@ layout: userid title: BritePool description: BritePool User ID sub-module useridmodule: britepoolIdSystem +enable_download: false --- {: .alert.alert-warning :} From b5da5b8372847165cfceb893779b56d29a20170a Mon Sep 17 00:00:00 2001 From: Chris Huie Date: Mon, 7 Oct 2024 10:32:26 -0600 Subject: [PATCH 225/816] fix deepintent download (#5637) --- dev-docs/modules/userid-submodules/deepintent.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/modules/userid-submodules/deepintent.md b/dev-docs/modules/userid-submodules/deepintent.md index 6a56d887d6..4640088296 100644 --- a/dev-docs/modules/userid-submodules/deepintent.md +++ b/dev-docs/modules/userid-submodules/deepintent.md @@ -2,7 +2,7 @@ layout: userid title: Deepintent description: Deepintent User ID sub-module -useridmodule: deepintentIdSystem +useridmodule: deepintentDpesIdSystem --- From ee762449fc65a0e28c82d5533313141c15e06ab3 Mon Sep 17 00:00:00 2001 From: Atharva Jangada Date: Mon, 7 Oct 2024 22:19:45 +0530 Subject: [PATCH 226/816] DeepIntent Bid Adapter: update docs with bid floor support (#5616) * feat: add bid floor param to DI adapter doc * feat: add floors_supported metadata to DI adapter docs --------- Co-authored-by: Atharva Jangada --- dev-docs/bidders/deepintent.md | 129 ++++++++++++++++++--------------- 1 file changed, 69 insertions(+), 60 deletions(-) diff --git a/dev-docs/bidders/deepintent.md b/dev-docs/bidders/deepintent.md index edb31fd240..080e4a07aa 100644 --- a/dev-docs/bidders/deepintent.md +++ b/dev-docs/bidders/deepintent.md @@ -6,6 +6,7 @@ pbjs: true pbs: true biddercode: deepintent media_types: banner, video +floors_supported: true tcfeu_supported: true usp_supported: true coppa_supported: true @@ -19,6 +20,7 @@ sidebarType: 1 | Name | Scope | Description | Example | Type | |---------------|----------|--------------------|------------------------------|----------| | `tagId` | mandatory| Ad Tag Id | `'1399'` | `string` | +| `bidfloor` | optional | bid floor price in USD| `1.5` | `number` | | `height` | optional | height of the creative| `350` | `number` | | `width` | optional | width of the creative | `250` | `number` | | `custom` | optional | custom key value params| `'{"position":"right-box"}''`| `object` | @@ -46,36 +48,39 @@ pbjs.setConfig({ ```javascript var adUnits = [ - { - code: 'div-22', - mediaTypes: { - banner: { - sizes: [ - [300, 250], - [300, 600] - ] - } - }, - bids: [{ - bidder: 'deepintent', - params: { - tagId: "1399", - height: 300, - width: 250, - pos: 1, - user: { - gender: "F", - uid: "publisher_uid", - buyeruid: "test_buyeruid", - yob: 2000 - }, - custom: { - "position": "right-box" - } - } - }] - } - ]; + { + code: "div-22", + mediaTypes: { + banner: { + sizes: [ + [300, 250], + [300, 600], + ], + }, + }, + bids: [ + { + bidder: "deepintent", + params: { + tagId: "1399", + bidfloor: 1.5, + height: 300, + width: 250, + pos: 1, + user: { + gender: "F", + uid: "publisher_uid", + buyeruid: "test_buyeruid", + yob: 2000, + }, + custom: { + position: "right-box", + }, + }, + }, + ], + }, +]; ``` ### video parameters @@ -103,36 +108,40 @@ Deepintent supports video as of Prebid v1.16.0 ```javascript var videoAdUnits = [ -{ - code: 'test-div-video', + { + code: "test-div-video", mediaTypes: { - video: { - playerSize: [640, 480], - context: 'instream' - } + video: { + playerSize: [640, 480], + context: "instream", + }, }, - bids: [{ - bidder: 'deepintent', - params: { - tagId: "1399", // required - publisherId: '32572', // required - adSlot: '38519891@300x250' // required - video: { - mimes: ['video/mp4','video/x-flv'], // required - skip: 1, // optional - minduration: 5, // optional - maxduration: 30, // optional - startdelay: 5, // optional - playbackmethod: [1,3], // optional - api: [ 1, 2 ], // optional - protocols: [ 2, 3 ], // optional - battr: [ 13, 14 ], // optional - linearity: 1, // optional - placement: 2, // optional - minbitrate: 10, // optional - maxbitrate: 10 // optional - } - } - }] -}] + bids: [ + { + bidder: "deepintent", + params: { + tagId: "1399", // required + publisherId: "32572", // required + adSlot: "38519891@300x250", // required + bidfloor: 1.5, // optional + video: { + mimes: ["video/mp4", "video/x-flv"], // required + skip: 1, // optional + minduration: 5, // optional + maxduration: 30, // optional + startdelay: 5, // optional + playbackmethod: [1, 3], // optional + api: [1, 2], // optional + protocols: [2, 3], // optional + battr: [13, 14], // optional + linearity: 1, // optional + placement: 2, // optional + minbitrate: 10, // optional + maxbitrate: 10, // optional + }, + }, + }, + ], + }, +]; ``` From ddcc3cded8fc0583dd85363a1c9bfe3174ad5b9e Mon Sep 17 00:00:00 2001 From: digital-matter Date: Tue, 8 Oct 2024 16:52:43 +0300 Subject: [PATCH 227/816] New Adapter: Digital Matter (#5617) * New Adapter: Digital Matter * Digital Matter: update doc * fixes couple of the metadata fields should be 'none' instead of 'false'. Fixed. Also fixed copy-paste error with company name. --------- Co-authored-by: bretg --- dev-docs/bidders/digitalmatter.md | 39 +++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 dev-docs/bidders/digitalmatter.md diff --git a/dev-docs/bidders/digitalmatter.md b/dev-docs/bidders/digitalmatter.md new file mode 100644 index 0000000000..b2aef8fd69 --- /dev/null +++ b/dev-docs/bidders/digitalmatter.md @@ -0,0 +1,39 @@ +--- +layout: bidder +title: Digital Matter +description: Digital Matter Prebid Bidder Adapter +biddercode: digitalMatter +pbjs: true +pbs: false +media_types: banner +sidebarType: 1 +gvl_id: 1345 +tcfeu_supported: true +usp_supported: false +safeframes_ok: false +prebid_member: false +deals_supported: false +floors_supported: false +multiformat_supported: will-bid-on-one +ortb_blocking_supported: false +userIds: none +fpd_supported: false +schain_supported: false +dchain_supported: false +coppa_supported: false +dsa_supported: false +privacy_sandbox: none +gpp_sids: none +--- + +### Note + +The Digital Matter bid adapter requires setup before beginning. Please contact us at + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------------|----------|-----------------------------------------|-----------------|----------| +| `accountId` | required | Account ID, provided by Digital Matter | `'123456'` | `string` | +| `siteId` | required | Site ID, provided by Digital Matter | `'123-456-789'` | `string` | From 597addf7c4fb3b98e10c53035b381ec6746221a5 Mon Sep 17 00:00:00 2001 From: Chris Huie Date: Tue, 8 Oct 2024 16:44:01 -0600 Subject: [PATCH 228/816] fix lemmadigital on download page (#5642) --- dev-docs/bidders/lemmadigital.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/lemmadigital.md b/dev-docs/bidders/lemmadigital.md index 9fb79336dc..b70df62d9f 100644 --- a/dev-docs/bidders/lemmadigital.md +++ b/dev-docs/bidders/lemmadigital.md @@ -13,6 +13,7 @@ multiformat_supported: will-bid-on-one safeframes_ok: true ortb_blocking_supported: partial userIds: all +filename: lemmaDigitalBidAdapter sidebarType: 1 --- From c6641e9973ede99a3daba4257542930e8c873911 Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 9 Oct 2024 15:40:19 -0400 Subject: [PATCH 229/816] Adding pbsAnalytics event (#5646) this was missed a while back --- dev-docs/publisher-api-reference/getEvents.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dev-docs/publisher-api-reference/getEvents.md b/dev-docs/publisher-api-reference/getEvents.md index ccf5c2711f..f3751a21f2 100644 --- a/dev-docs/publisher-api-reference/getEvents.md +++ b/dev-docs/publisher-api-reference/getEvents.md @@ -31,7 +31,8 @@ The available events are: | beforeBidderHttp | bidder network request is about be triggered | Array of Bid request objects | | bidRequested | A bid was requested from a specific bidder | Bid request object | | bidResponse | A bid response has arrived | Bid response object | -| seatNonBid | Prebid Server has returned nonbid information. Must be enabled in s2sConfig.extPrebid | None | +| pbsAnalytics | Prebid Server has returned extra information for analytics adapters. | { [seatnonbid](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#seat-non-bid), auctionId, [atag](/prebid-server/developers/module-atags.html) } | +| seatNonBid | DEPRECATED - use pbsAnalytics instead. Prebid Server has returned nonbid information. Must be enabled in s2sConfig.extPrebid | None | | bidRejected | A bid was rejected | Bid response object | | bidAdjustment | A bid was adjusted | Bid response object | | bidWon | A bid has won | Bid response object | From 60c10e0490c6da4d9007ae81ba85f112321546c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20D=C3=A9pierre?= <146739800+github-richard-depierre@users.noreply.github.com> Date: Thu, 10 Oct 2024 15:46:43 +0200 Subject: [PATCH 230/816] Added iOS Prebid Plugin Renderer (#5580) * added iOS Prebid Plugin Renderer * fix naming of the PluginEventDelegate * added Global Initialization and Controller-Level Registration for both use cases * removed empty table * fix lint --- _data/sidebar.yml | 8 + .../pbm-api/ios/pbm-plugin-renderer.md | 214 ++++++++++++++++++ 2 files changed, 222 insertions(+) create mode 100755 prebid-mobile/pbm-api/ios/pbm-plugin-renderer.md diff --git a/_data/sidebar.yml b/_data/sidebar.yml index 558c9d7ff8..f0dafdb9cf 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -782,6 +782,14 @@ sectionTitle: subgroup: 2 +- sbSecId: 2 + title: Prebid Plugin Renderer + link: /prebid-mobile/pbm-api/ios/pbm-plugin-renderer.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 2 + - sbSecId: 2 title: "For Android" link: diff --git a/prebid-mobile/pbm-api/ios/pbm-plugin-renderer.md b/prebid-mobile/pbm-api/ios/pbm-plugin-renderer.md new file mode 100755 index 0000000000..845bb00fe7 --- /dev/null +++ b/prebid-mobile/pbm-api/ios/pbm-plugin-renderer.md @@ -0,0 +1,214 @@ +--- +layout: page_v2 +title: Plugin Renderer - iOS +description: Guide to implement a Plugin Renderer +top_nav_section: prebid-mobile +nav_section: prebid-mobile +sidebarType: 2 +--- + +# Prebid Plugin Renderer +{:.no_toc} + +* TOC +{:toc} + +## Overview +Plugin Renderer is a feature that enables the ability to delegate the ad rendering to a component of yours. Such feature turn possible, for instance, the rendering of non-standard ad responses that Prebid Mobile SDK can not render by itself. This integration require from you, in first place, to have a Bidder Adapter implemented in order to handle bid requests from the Prebid Mobile SDK that include your Plugin Renderer. + +![Plugin Renderer big picture](/assets/images/prebid-mobile/prebid-plugin-renderer.png) + +### Ad view transposing + +Everytime that a bid response is received and it reaches the rendering stage, Prebid SDK will delegate the ad view rendering to an existing Plugin Renderer, such as a custom one if this is elected or the default one in any other case. + +Take the example on the image below where a BannerView will have its ad view transposed accordingly to the Plugin Renderer status. The inner ad view is handled totally under the hood from the app owner point of view, what makes unnecessary any change on the BannerView loading or initialization. + +{: .alert.alert-info :} +In case of Interstitial ad this is just inflated in the foreground regardless the view hierarchy. + +![Plugin Renderer big picture](/assets/images/prebid-mobile/prebid-plugin-renderer-ad-view-injection.png) + +### Setup + +* Provide your Prebid Bidder Adapter + * [Go integration](/prebid-server/developers/add-new-bidder-go.html) + * [Java integration](/prebid-server/developers/add-new-bidder-java.html) +* Create your implementation from the interface `PrebidMobilePluginRenderer` +* Initialise your Plugin Renderer before starting to request ads +* Take advantage of the Plugin Renderer fields + +{: .alert.alert-info :} +Please notice that all implementation on mobile related to the Plugin Renderer should be provided externally, not in the PBM SDK itself. For instance, an app owner or third party SDK would implement it and initialise it on their own context. + +___ + +#### Create your implementation from the interface PrebidMobilePluginRenderer + +```swift +public class SampleCustomRenderer: NSObject, PrebidMobilePluginRenderer { + + public let name = "SampleCustomRenderer" + + public let version = "1.0.0" + + public var data: [AnyHashable: Any]? = nil + + private var adViewManager: PBMAdViewManager? + + public func isSupportRendering(for format: AdFormat?) -> Bool {} + + public func setupBid(_ bid: Bid, adConfiguration: AdUnitConfig, connection: PrebidServerConnectionProtocol) {} + + public func createBannerAdView(with frame: CGRect, bid: Bid, adConfiguration: AdUnitConfig, + connection: PrebidServerConnectionProtocol, adViewDelegate: (any PBMAdViewDelegate)?) { + // TODO "Handle bid response as you want and display your banner ad" + } + + public func createInterstitialController(bid: Bid, adConfiguration: AdUnitConfig, connection: PrebidServerConnectionProtocol, + adViewManagerDelegate adViewDelegate: InterstitialController?, videoControlsConfig: VideoControlsConfiguration?) { + // TODO "Handle bid response as you want and display your interstitial ad" + } +} + +``` + +#### Global Initialization of Plugin Renderer + +It is recommended to register your Plugin Renderer globally during the app launch, right after the Prebid SDK initialization. This way, you avoid registering the plugin in each part of the app where it is needed. + +For example, in your `AppDelegate`: + +```swift +import PrebidMobile + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + let sampleCustomRenderer = SampleCustomRenderer() + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Initialize the Prebid SDK + Prebid.shared.initializeSDK() + + // Register the Plugin Renderer globally + Prebid.registerPluginRenderer(sampleCustomRenderer) + + return true + } +} +``` + +Don't forget to unregister the plugin when it's no longer needed: + +```swift +func applicationWillTerminate(_ application: UIApplication) { + Prebid.unregisterPluginRenderer(sampleCustomRenderer) +} +``` + +#### Controller-Level Registration (for specific use cases) + +If you need to handle plugin registration in a specific view or controller for more granular control, you can still register the Plugin Renderer at that level: + +```swift +class CustomRendererBannerController: NSObject, AdaptedController, PrebidConfigurableBannerController, BannerViewDelegate { + + required init(rootController: AdapterViewController) { + super.init() + self.rootController = rootController + Prebid.registerPluginRenderer(sampleCustomRenderer) + setupAdapterController() + } + + deinit { + Prebid.unregisterPluginRenderer(sampleCustomRenderer) + } +} +``` + +## Limitations + +### Supported Ad Formats +Currently the interface `PrebidMobilePluginRenderer` provide the ability to render `BANNER` and `INTERSTITIAL` only. The compability with more ad formats can be supported in future releases. + +It is important to notice that the compliant formats you set on `isSupportRenderingFor` implementation are taken into account to add your Plugin Renderer to the bid request or not, according to the ad unit configuration that is bid requesting. + +### Original API + +The Plugin Renderer feature does not work with [GAM Original API](/prebid-mobile/pbm-api/android/android-sdk-integration-gam-original-api.html) since the ad rendering does not happen in the Prebid SDK but externally. Despite that if you are using the regular GAM integration it will work fine. + +## Ad Event Listeners +An optional dedicated generic ad event listener is offered in case of the existing event listeners are insufficient to keep your ad consumer fully aware of your ad lifecycle. + +![Plugin Event Listener big picture](/assets/images/prebid-mobile/prebid-plugin-renderer-event-listeners.png) + +### Setup + +* Create your implementation from the interface `PluginEventDelegate` +* Handle your plugin event listener on your Plugin Renderer +* Implement the interface on the class you want to listen the events +* Set your listener on your `BannerView` instance or `InterstitialAdUnit` instance + +___ + +#### Create your implementation from the interface PluginEventDelegate + +```swift +@objc class SampleCustomRendererEventDelegate: NSObject, PluginEventDelegate { + func getPluginName() -> String { + return "SamplePluginRenderer" + } + + func onImpression() { + // TODO on impressions + } +} + +``` + +#### Handle your plugin event delegate on your Plugin Renderer + +```swift +public class SampleCustomRenderer: NSObject, PrebidMobilePluginRenderer { + + // Store your listeners + private var pluginEventDelegateMap = [String: SampleCustomRendererEventDelegate]() + + public let name = "SampleCustomRenderer" + + public let version = "1.0.0" + + public var data: [AnyHashable: Any]? = nil + + private var adViewManager: PBMAdViewManager? + + public func isSupportRendering(for format: AdFormat?) -> Bool {} + + public func registerEventDelegate(pluginEventDelegate: any PluginEventDelegate, adUnitConfigFingerprint: String) { + pluginEventDelegateMap[adUnitConfigFingerprint] = pluginEventDelegate as? SampleCustomRendererEventDelegate + } + + public func unregisterEventDelegate(pluginEventDelegate: any PluginEventDelegate, adUnitConfigFingerprint: String) { + pluginEventDelegateMap.removeValue(forKey: adUnitConfigFingerprint) + } + + public func setupBid(_ bid: Bid, adConfiguration: AdUnitConfig, connection: PrebidServerConnectionProtocol) {} + + public func createBannerAdView(with frame: CGRect, bid: Bid, adConfiguration: AdUnitConfig, + connection: PrebidServerConnectionProtocol, adViewDelegate: (any PBMAdViewDelegate)?) { + } + + public func createInterstitialController(bid: Bid, adConfiguration: AdUnitConfig, connection: PrebidServerConnectionProtocol, + adViewManagerDelegate adViewDelegate: InterstitialController?, videoControlsConfig: VideoControlsConfiguration?) { + } +} +``` + +## Resources + +In addition to this documentation you have samples on hand which can be get from the Prebid Mobile SDK repository: + +* [PrebidMobilePluginRenderer](https://github.com/prebid/prebid-mobile-ios/blob/master/PrebidMobile/PrebidMobileRendering/PluginRenderer/PrebidMobilePluginRenderer.swift) +* [PluginEventDelegate](https://github.com/prebid/prebid-mobile-ios/blob/master/PrebidMobile/PrebidMobileRendering/PluginRenderer/PluginEventDelegate.swift) From 7c608dc7d65e3f63e278a007f15bc9e2ba02c03c Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 10 Oct 2024 09:56:20 -0400 Subject: [PATCH 231/816] PBS module doc update (#5594) * PBS module doc update * Update prebid-server/developers/add-a-module.md Co-authored-by: Sheridan C Rawlins <41922797+scr-oath@users.noreply.github.com> * Update prebid-server/developers/add-a-module.md Co-authored-by: Sheridan C Rawlins <41922797+scr-oath@users.noreply.github.com> * go details * lint * lint --------- Co-authored-by: Sheridan C Rawlins <41922797+scr-oath@users.noreply.github.com> --- .../images/prebid-server/module-example.png | Bin 319222 -> 165636 bytes prebid-server/developers/add-a-module-go.md | 30 +++++++++++++++++- prebid-server/developers/add-a-module.md | 4 +-- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/assets/images/prebid-server/module-example.png b/assets/images/prebid-server/module-example.png index 3b1433eb5a58e18681936fc4658ccc364a829dac..24cc9d32ed73f6f07d992ea4cdaf78aa34e100c2 100644 GIT binary patch literal 165636 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

aa~AHu|Zh`VKeG0g`y1o8QoO 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 literal 319222 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%0AKbA!7k1#QN}zPX$6>lY<0Im3 z*!j-;@9t7VS>;JB>4k-u}V*ngyMbkbT zpFjg`^1?Fs136pq`AKhphsd)YCjc469FBVY1Ez(e0>4BK4A8}_Ra;%jz$;>&`~m-I zyvQ{eW5ur&#NvJbZ|RdoIXrg0G`iVY9W^zxEVD%|bM@{Fpg{_E=il9n;IexVDMI%o z;nqz+ruG4%ZRicQlxv?bu5xu+HA^6wEpeP_xP_fLY<@j=;OST}<;%MoQh2IQTsJ#y z%hlrx%7JRpClN^KEZcb=zepV|2bYvU`297gbuDLCrM3SHpWOthyM_V}u4%Huap3$D zj&pv(w}LSi!EGb2x0b#vUE7-U09Ne#d1>OlAMos_P`JnS+_$5zi?1L22m-T}mr9Gr z?pmyM-y#-KS7ST%F2Q!HJmIWcNK|1@KkwiA6UUTKybjoz0%>;?*<(8Yd+lT89<#hh zC+I>CT&LVeEg4j7{}Fa!3_-BRORursRY}Cf{J2}*X3TC@bzfm5v zYyUTBwNUE`PQC>=xmE)E^(XxD-y3EuP5T#yxECSGb6L$kFTLb-v{<)1HDNo=lN^#Z zHg0>3p+Dq|`^z4FMy6kGp{9}cx@;svEE4tDX86~I=)BDvv(}i8k^er3@Ad3ll}_UHm(V1Dkol%n?xTfw&V-^0mV&&ymm<06xvwXRXZ!?(Rz>-?Jt z*mx&U&D37kXk>{~|Nio8H?qD%?b|}->Z?X1wo{}XIM@6noGzQnTwF8OcLf**)D`{> zrmh;+Ic0B6XRpl)uC8s$Uw$6|OZPP;seZ+?m`rJ(FIV*^zcWK`|FYV8K}Nz;=%d9` znB!rVyZ7=hr(e!X1*WP4fZtSl(dW8e;onak|84+3Ve!2dDT0Z>7V5#IWvbyzk>d=O zzY8$g6B2BZ!up(Pp2^Ee(J1~QlaFu1x|2=L$}PlfAQnRH4cI>WZ%_QM2W|+djG@$w z{-9Gc+VVsUA{=wQxMG|#4%X!X_t_>mb#CMC<)>z8O4F%cZ?lFohxJB+&mPBf;kDQL zeiwC6nG(GE3c21>_#hyCYypqwnw|hy0SfS?wQEdh=2F8`JN%^s0E;Lk9r6BqN-@Z# z$2vp|b<8~H2NEr}!iX84Oq-NlUcZ6x_&q43ll$S(RQHd7HKS`hU*hALv6R7bw)bgh zQ7nn{eta!ZtmLA$0t^os|%<+nd=jr3rTEHAwab@sc$#nov zR|3MloYnQq|E&@m`0GCfD}rT?G)G_Qf3%p{7?RkIl6J6N&m~)pQqfbAZ-AhV8A!(| zydH^77Too~VN>KT{&2(KJt;4<7o@uQmSulGx)(&|@_2#M)Di@bgzir@KC$#P1?O77 zmsR!6VG>@qY4ZON0TL*$uYbC&w@0eA-qqpP#_CLm8ZK`;slS6li&-6d!y*M}U}{KY z&--`|N2v>|$3z@@`EI4$$=~wsJD?L}&)5Y*lPVy1REo3z-&^&S6q@)@nQ(R0+tAh7 zfvdQ(x@wTf;gnVDEIEW&vSVi_G1OY`##qVUPc0D^_$4K8+*NCO;hyYAhgch%wd*70 zFA>9;jCXF=ds`GpOF}Z0-BB9p)bK(LA5`|!FTM|R6FG8xU6Nl1XR2PG3Y_#%;Mpg5 z^QJZMRTg?RZW{iF6`ev22p$BZucw`bmN))x5kckA-?U_}=215KH6LIW<8)S8bASk7 z{Ib^0PvjaWd948x^gG?Bjbr;dJv4Q&?(X&T;Lqm{DbEG!S1d-vR}1dzAfkj`$V~C) zstx|%jnM?!%F+keGGZWEC8r9^MU|2(N3~=-Gh-$fZY=whY`1&8hpKK8@VKf5WOms9 z8Q@4ckV82M1l4se2Ww30)ITyezRYa)Ru_M;u>^0H5)uGIO2K@tq2PFwuzOH^Qcp6X z0_EOgfus~phBF5k6{!Mk;v|rot^t+Pla;K$JJOiE2@r%jfPMG!E0`K2qtw}lL4@fW z_xEj~KOYDG9d}Ejpi8l-Rpm+l#;p+`Fxmj#d;neg4ASn#-M?I3&%v1DEQlU;0iHi` z9u7@eJ_h*@Tx|&*r{88~Hf~dungcoN6iBw3I-GE19v=JO8R$Y0bPcTmBb$!;UG*l~ z>Bari&Gh!GG*=h-_0Q`vPK7ER@$_PTOT()pA2VyuHfvqwMF*SyZF+c^Kp5Z}LoWu> zOphAsB%)my#b$78ho7{}{j1OJ>rK-Q0ym zf|zY?#%x;LM9qzD?%o|=^wQG&uP@k4hB~cIHRyJ&Rndy26KMm<(X9Vx0%O1(@@XB} z&JQtyIs^&Y4HL{X>1H@=0u8o9966&tgE$1O8dj=wd6Q`n+!xa8_U zufw$15hNH*kc}`(9R4zwrYi?VMQ=({x&Dc$;%{PtG?dzPV61X`??GIQyVV_OiT@rT ze&%nJrzD5$VY!dI%-K1Cn8$pJ!=$vxB+yS%4x)fSIvmNsO-Vw z!ql+gPuJh3O8I7I*IVKilobEd&f`~;fD&x1KP8F4ABEd7nG*p^N68 z`sj))=AqlT;%xJ$Zofs6!H1Dik*O)b$AU(ZNc)Y?=-wn3QLKR5&;NGN4lxJ-TA$no9TsvGu$kNYg(6oLXW6M;Vf_`aE%D6L3Ll&0`UjeG+&7l9gc0q{r45 zIG#gz0WscLnZlMYY5@UpSKfW_x(Eb&EesL_A~=QxHu)cyx90HKv(D#N+nI z0e1%k9S}Q=!!w>H{u>w>See;(eA!;#vp-*rroy+FH^*NMRu1WI`7O|jJ=+LrxCkSn zKlN%G@wxlQMZe|mDMm>j1h$x7Lm>Wd$Y%7MoUT7vv-9kbKclKOdVhT+s9!ITWd6(0 zCt`W(a8-5Qxk!m979(AzSl>^d5pRDQdW?Oi(1jIm0Jk@AiogQMI@q;u(Wxu{KTN%K zT$Eq5Jq$R&&_g3RLra%} z`@a9mXB>E*efHUVt+m(IR}0e#$jk%{b`79rC%}Ndjb!tUeQ-{WnGN#|N2Qk1nf|M= z*P$`hZu#p{JDw$+L^Xo-C)ULU&(8km?qHY4@*1uDMPnjz9pE(>+0kWXSmD&WJ)4n! zUhDE5)at@h7Nz+Sx1ao%KXk02LK$&j^ljM7Gy3<$yeQ!mmwI6^74O+nTG3W2WnZMv zz>_N}FjJ?;=QR57niqn+pbiGW*6nK9+y9ew7V`5yy#Y`4LjBG3QSz!rXVC6Vo{F5Pyo)oR9*{qA!o~z6ja2 z3#<5~d(y_(Us$IJZdCiN{f`4Gplnin3e~~{y08J8 z@h)vh$b4XaUE@sSq2Nz9<$PmfSw;9Xd1FEMZpSq_;pqkGTT9^C6BbB|93R9HOZt}niiyLK=s)|@w7U-s={c2`TSWWAgK^X%K0 z0{NX0g?HQ|{~|yJfi}?d)w&TCD3Dzyc4k{J>J;A95SSp=nXJ3Itgp1FP3p6os8Ay99!*aFP_7)Kn)2{7R`(X2( zhJ&YN6Ch@F#z0#CSXP3}@@LD3VBK1pO?+ci89<)cUAl-%6 z5l|~d@YMFyf?w+u?gNX6s2ckx%m&>fzml`0rUS3*j*CNdk3s7Z)ipZ57CliESkvy* zFqvsHxcOf}WTrT?x_mYJFatO{^3xm}+XB&+p8O1u8|?S#B+~BT^(mb4NYn1U@&u*; zQZZlTPaCe!8|*2FcEKwxW)lKR2yrk7RPyAH|M83UVgAnQZq!Dz8|`4Zlj-q@O?hMb zVRU>j-l4CHZa!Dc7I1EHMknV4**zu>W>g5W`*hcB2^9+_3n;|>p2rnB=8-T1g~kie zop)E0KCY6_@Wv;hUqF3QHGtOW1J-XCXwc9s@?!S=jdeg;S3ic4*I!+p=Zz_8)CXS7 zvurISX&*TN^<_pHPzd#$>XTadZr&cwH{bYU%pX3sjPpw^<3`q!0kW`eZxXapn4_8{@vzlO^6;MKf-GE^#d)}h49qDZ#Ert z^HEuf_T0q$R+iqYxObgmno_eHxKpZaO;hm9SCgEGV5s9sFBz-H7bm;I@nWC7(zy!0 z-u~Ad!Hvl6eXRslI+Z>Et3XWmP?ev*nrs8z;ltHc{uzwVydn#_ocFKA&%ymZefb?> zn~dsn+LKnx+dH5Zb14qL^-u)5lOCm_TOV|fIg)Ry{MX#vR>idc_N!R5&B?-VoLsVN zJG$GNdo0+O7G^_JJK4~Arx9N--Sx5;m^Q(4^7AMk2jE=kr`9>z zlq%7O9+Bn8qjs59;Mgd|Ipv)|FLqkUNGZCCDriteY8CCE^{&PY)|8E4h)fIbMe4v; zXTbGu`RX7~E_6xrb%Yno-^apF6<@s-vQo&|$X-s31OCW!0hfov{rg|o=X4hVNBjcg zkjPQ92%bqW6>J4~OQwlAB=(I~8`y|Dj;&Cso6umIKZAdOl2LmEPg?^#t>I#fQvZ{d zugIrT%#bSn3cwRYIVVZGIdN7g3{HHA64hBFmj(0%J8$Z8kcTX8Gdk3z{j*N(q@Z@Y{By(mdcb1S(J$pFriwO`_U^OK8$Vi)$IJ_eUM%3p+z%y@T{AW3^K zk&;T(^?$8{iK`Y8?_bohI`G9uCWP)+vbIBWl?6K;atJM{A8ca^`A=H>&z&^ABTKsf z)>HjfP5I@o@C0e-y^x z*Ae|}8rCTYF=nudQPFZlg_ufI%=|poIG&r=zEf$lo-tn@aQ)KdX;&i0z>eTs=Njoh zEbRF+P3f5Nia7#E3Z|3>PGTo~9gJ=47~7QYjS)NNWU^tZ&=~`H+ErgBz3%CfQeRNt}&y(=hd&ANBDXtmbn80Bwc9+ z9kyJP>{7T}O?~+Dd-_J|tz=gSJg3Zga;)OUE^Us0RbZX!Jgn~9~0mBqcH(-XrNa)2nL5b^mbG5|aDfG2CSlGsU4rr3BA5pR<)0fprs!9$+<`w>>kNutwW%=4u;xa z;4``F98hfp@cYR3M)1(z94BK9a#ZN#k)#ofzWsZfWl787xt~xC#=rw)bq`4XABjo- z`rZ4}TR@apSF>2iYellefrCCG7j(CNG?X3GoRLsEsvDC9d@(=GSG{6ke+`No{Uf^o<&vm+I6eWVaArmn6CVY0DYD#cYh<)wQwl z1&SkCN+HZHb%!bAU#(vDX{$E9B$FN41l16xayfEq22hv|Yj)ruM}C%g_QqCq0lb#g z>QxvS3vh#rMA%aJdvDhr*V+kp)}lUZguQHsh7j8v0}?T(D`pgPb*=1%^?;dx=y6aU z%A_z}A2(bdp6mr`NY19h={eZgbq$Fu22)kQK$lbn@VY#|i(W>qX>hKf->VQYdtCwE z;odsi5Z$)N7w9p@%#P94;p?1*Rbf8BQ6FCBYyi#RnqpnZM`jhw75Dn~=6V$2&zzI? zqLI}~$+j6TG6HCJML^SYe;s$~}Ta=CsVk%^O4xpQq5{fX^%t%B$6#G)z=W*VV z^Tdkr_J_!Bn!|}gK;$01q4LuJc0NU)v-3Y6np90FWU)u`SRuSVR)`dfehMRKRcjwo zVn;6Vzh!7%Q@xYYJtF8vZSx{kHfH+(_kCg)xEog+g`Q;~SaTX0ca%u&i!fe! zkZHDEi~A%$!xsg{dTzRWm%gJzp+wzY2#ijvvs9?7T;Ph&FX6rr+~yXr4PgSqa&Xk? zv8?}qA$*QDRzZ)y9m(^7`p*OIz6;HFV!PSR$ZN~&-=WU zr^ajVQqXX>JAXjV>a2OR5-A-G$1B7d) z751GXU!*ESmHq&-!>eQ>zW8YLbbYQhu%&j{ocR6qJuJi8*BV+m&_U|Euusg)IbnHoy0ry@Cv05I6C;#@Qlws4m!^DJs)T~fSGij7@`*e``hAk_BMYxjp zrrD_y*2~T|T3VE@gJ-*%^VCL-C~50T&8KSF8-y`~pyiD6vFb*({6!kV`nT)4+IO-P z-tBbWmFZopjrjunoeyjZw8*wZU(HQM?@Du*g$@X+&On#uQ}0Gs@p6kC{nm~#MK@43 znMU;ZCZ^b5DU$saSTPle6xY_#a##1rh!_@MVqEIg-%%4A4k8%lF_Dqx3ewIwOtq~X zIh|0#?3LI8r1xPr2{S6WCfh47hS$gQ+;MWk&f;Jb`2t#8Wos7vVh|bsSr6=kIF1Xv zU<-?Z;o;gyp{0m>P)(0&2`GpjmOoov>V3Z+J&<@Geqpo4u(v^K_;(dJ%;KJQG zf21y3+bEP02yCsipsX+v;Echf4pen5*Vn+HbEDD-ww9&+dRY>&(iPqgY-!vv@;B|@ zfm(8x?)am)gX9oSg?!38gk+*K*t$x6!ss9Aa)ANF-oa<~+o0-q2R1bICCq|6(p>$r zXRdPH4+Ft&;mew5skCXpjq+C@46BI{n`KL8OL6Nbu)!P1+XmR~tL2RciW%~Lc;^qS zq0d>KU&hmB)=c02>}3}D$B7!F4?Thb;{WKY))x*y2dc(j6sYm>{r!ey(mvQX6=Ab0t>t@Y9YIxR+-g152J@T= z#y@i>4k*p~Y0XjXMrwmtyers#ul|IFjouWI#O`xX67{8$^UYy8^Ga?h}xH@mq&-2agYuO>($Y8Kl0!-I#PRQj(} zz7w`?A^OQ72aknWShib&*So93uZ1QUrjXXdzwo%wHa%0)BcI9@C|j~whI0uLm;jS{ z1VUgmV8eDp<#XCM{kWf2?36M`=OGDlV?-LpGFA%=d#m+7N3=3+WpgaYMwsImStVD! zar{!*KF9g2q#ZETwYU$uNxD&>X_~_CQpenuwW4#oY|W+L1maL0pMJaE^}8u&UphWK zLkNMnscl4vg}JAzqqxI_=FRPy0gtiD+uKxV2G$L-3_1;U=3p=??V1J~j)ym+uYI8q z6z%LOl}I}fF#|Mdlkl+|0O}^@>uh_7S6ll`gop9?rrFuqn%}&!LN70Cu-h`+MRt%+GP?Hk)Hq!A66J#f$8A*Lz31D3`#`ibc3@ec73?y zc+(QN)dch=#!JTg!ZRZ3DeCcXNSuO2Kiq`Uqe>AABxkePN`3f)RloqUW^1y>*MG$q zY$Wklwc5$mRMiC5?~xQL_6*i4&!@oJFK;n-$xV5z*(>;aUz{AMt;7~bCu`43;Ee8Z zpiOj{C4*k36#8pn4a`{|UrRT6D9S0=ys&f#)={E&yR|9O@h#&%H~U%JrG)c@gtkNo zvISr6=NmyUu$b!4pOF9pHmq5aZMn`N-|$KzsWR?annFoT_y2$Fchf>|G`lskfi!V; z;Jft6Hh!M~lLN-B{pVFrtf5dGX$g8=<^Hcu0&GF+>h(_++stiO_kWwcA5-bd{%@$U zlMrV=!({H^kB0UN573d<3|j`u@NPb216XLlQnP);t{TxkgJoJY`exZedNJ?Y1W^-< zsV}y(RCS#!W)~kO@3Y}a2tUP(4Wt`FpO8Q4$*rZs8zoD8>oFPW-tV8C0l(L@zZ+Be zx($A7;hoSRk+%jhHf-jn_G#t_s1PT#O$}`sQ=b%-xD(M(`-MiWAA!+;$F-V{a9`+( z>zi*-JtbE1W}MT58d!!-v%&=O8C;qaXII`=cwiIxAwCZKbNE?VXC>1eJ2hE%iWjOQ ze(WBqSEyE`xi;NRMVt1KUX*rymQaNV*KS}m`j^^6E~wyZf`a>fPUtOcL2{XCNS_*W zxlaI5nxk=awtx~P$}i+BsgODOkLNxt7+`lN*9Q7>MOI7|&z*z4k~KUZ=c$wD?)EjD zaAFXi@I11lM4%bax4LLLZxildoF^a_VU|yCj3B$4vLhH{1tW#0?NBP9{|b@o;)b-6 zt1!-%17WjbKT;jO5KZH5Qyip((9=_*j-Zd%w6}y<-)Myl!rf+)sjLZXiP2XgnK6ua z^`ew2P>fBVg1KH@9#2mLcBm7xqR7X>6PoP-pgXBf@%R{op^jklh4-)9!>Am5RBx(q zi?2~aX=y0&4YgFsO2hcz1)FJbSl96bfMsR`f}UAkoE3kSE4KobKonn8gGG4T>5a|)b> zC#=GmmK34cmO9M78^QoMUp@tkDuuEuXrPkP6$%l-SRKN{8bsS6J(2MTmD>n1@~7Mz zvcrqd8dji~%_-_%t54gVosrYM$|XJOK$U>}f^lBddnsFM#g>nr&w1cd>s`ojr#cAt zzGTl+W>OGEu|XD(5Hj`>a7~N!x%XV=?79|pl~m=bxqadM+-eNv{0-2ZL~lTgo|V+# z;>O_8k$?|jP7e(ZD!;{ssab)}lJhMcP8Y17=;dyV?%Dbw{H7A1ou-?KU#>2MGO~sB zDfLD8H~Y?R^6K26mm7ZjmDB9h_0EH7Jj>p_3r9UqOueJLO1(h178FlGC1c3N zx~^7*ny+BiPKr$!0xoM+h|fvP=al4<{o#A)XNn>76&VH1(iJBP4c7xFIkXFO{15X` z`@*M)6BsKFfpyldnwVv@3YAb!V2>5+YL8-1@@v{TMz^o9l@GGxOM*CbS#2%t^7#6$ z+eJQ-x$jRGzH4qZwxrz~hiecp|4$z0cu({6PyS+^7LvJtK4pkJ?laEY9ALh!%YZd6 zVq=~fVMne?sj5b9K=*xDI_hh$hSUl!LC9qm5)yn7G^wD9kR+Re!*^!KRYJ0O~J#h0nbM^ zW=T5{2`Br&;RLtBg(N9CHJ}B}dEaOVzd?etTEhKAp2UCJ#y#3iM2jb7332@?HXpZq z2^{CgeMJ)b@1fL!%^)|S+gvOB+W}2JK)<;XdC%-SAR|2b}Qfo=qUoeeNmN;#%VDUa9s z#>AG-j`wtSzohz;omcFWwbAc+al3SyUzrqVydVcSL~8f+znQWPlh3T%S+9}DX$kg}gyTMW0!;)(M!(*DVf+Hxzc?|%|Ml9OrfVcAvC=US+|tohO0 z{O{3E7M!tl`8&NUBwCl3ny}%3eH8v(oVU2qfb1Z4=fL z;Yhlr&S=-zvq5TemD(!pwV`VJ$wSopZnKYSOhZiRL}gk{ZaGAzlg`gG`j=Bn5PzRL z4U%hWkx;lbuQeI-Wc+$&236#4_Ga*E^rV}w@ zK;(22Qnt&#g3CUlMq|NYD_>jEezN&>pGOHvW_1aj`)RXq#!79MP>fOd$2Tkx_20SOU}q7dTddkBuuAcbF@V9!ggoWh zU+>ta=W6h@8Z#Y*Uw-XJR`ZXM3vxG|s!_6Ww_GUs$DA%`+H$|XLs3Mg$~@Z6@aDEf zS8b`PdF0YZclX3vt9^7vwEY{K*tiu6mjaK4yTN;rXz7c1rHn_Qdq^^Zrm7^@R+~B8 zVqnjQ%`E~bd(VQa{`$(7g*lY)rsEFJH(-9LeJ@Dk8xR_^ls_q{JKDQG2TJc)2h$`< zG2PIr8`k(%o^bgYgD4$=U39+`s_g`Luifv-CG6veX+swk>}i`<_)JRK&+3B&PzOQJ zgYjP}*^+lME`S`TLao3`p&oWuwfRhkWf@`8lPNbH{u)6thiesIKIv&nItlU+10@B1 zP7h`Rss(b}VX)PgA;EQ;7J4zDMEx~%MPcMUsuWPbavddRRfCp95wB5}v-IT7MB5y& zdzJTA-l^_%DnPkxL1{bX_-f&eFShhl!1*Sf3vXgL|1s_H03eu_#uvvN%1!M^L{>?W zxBe|*<04i?_&Nr4SdZs&?vLQv-F5KVJ#;>rradE$2jbQU-^!DZ8yeoqNI|?{c{*}s zxewv*hetTN3usfDiOJ7u$qmHv%UQy(1f^kyN>5~kn%|Fqiev;_HxNGr#~_5Z-*OZi zoICnmw$=v#q($^^ihz#2?56b;_)LU%d+j&+runP8gzw=+ zt!yTpXUMP4=5ZU2aVA6fe7<`_e-(248&rm#DFWtekt8==${6p!0F^;a zC`bb{q#(!;1@yz>@IhDjK<4xB@ls0Y^u}+T`Cl^#chQIAilld2cYD&f%P0{Z&|t-t zH;H?nLzZC*LlH>B?11K)nU6N7dy5tg7zv0?^8lKFWnQ5diztFSo(?XHCRj$a_S2v# z(5^HtJql>~aAp~wO3)HXD)dDlKVX@vvc>zsGm*W}umkcOLR-4C@DA8sN0Md0Y1^=J zDq<}}?8a`yR|Qa7?zGv5AIl907YY<}R7Q4?7he{de9tjiv3^6S9PU*eu_H_qCRA^Lkorm+}wRS%OCKg9E8`+%Ve(uENM(FqTK6(#LGnBoWv zr6L@dQYU0c?*)C{U&np@b^ptfW_ja>K786FcZPBoXb_fQT5aLaW`|HhsdE^T3n*c+ zME+@Ta-oGNo7jTiJATu6MCxGI)=Zl~ZtTNF?`SN`_UQYIIqo5X8$x(b2l`yPVge)g z*6d2==<0-qsFOeE#72IhNcOmS*^~OYgkJ9GcNYVnW5*&<@ISD_;eLsuzFcFG`KfI? zc4hUlj=0rcZvA`EGM<-|h)#XJ9e*2gFp~C+IGh-P7}J5>&|@tn+z+i~q5i1YbnM^B z279v8$dOUlyaxEaFnK}V(vlWZI;B;rZ(gU^L`}V>JuK27-o_OwF>3xmuqEIp;g5(=rz>YK{DCjGg zj;BE6_lvKM0bQL!+QKBBLJwF}bK!l~sbUYne(u*SgI%%WQ!8M}&HOUtdBn0eL@ye~ zg8m%RK{eLm`xa_TEW1_*$f?V_P|6Pu!9YQePsRt_1ndr8!wiH@SloJqWf>X9QO(lr zzC^ZS5j>a<{R}LK9RC3%ceLvOByh19saErm>>zG~+J{AD7$T4XLj*GHvTp(nrVtX?vHoE)+BU1W`W<^^ zi@|;sE1zrK7lvFRgJ{{U{h~Up;~BsIA>y`Le()>J{#%6Pfj6^r8?JD)ke}{jYbXTB zD_8UCh;-CkCiB0g-F7PbzXS;f29tv3Kj`yR)}Od)3-&8%kGw*_z{O2`ix6&QMT$YE zYz%U0&qjF-<}Hm`q7?N9B*6_Rfz2mb?CosT!c?c8qF zFLX-^G|_^ibXp}Isdrvc#t!>PKhYqeV7is5%FUt;|0R@%?C!@C>C!f(gZ$`xsK9eM z)T&iW8sQ}zYm`&J?m16R-<9-AYjpvap@}PokBaykmq#w8(l2+2qDA%ao%d(_E}rBo zgCC>C^?$F;1RGT`_;__!;@DL*{Qc#>q&!V(LwuZv;i4FG2&d%eh^B$FO^NZ&U6W3N z^dV6E+sUpqpJ;cov~wsdwI%^o?3s=*j8VNgm$3CExVGD1(jiWY2anP}#X+Z-nf(t2 z6f%%Isu*(;an#Nu?Y~(p2h?QTXr4jGp_ni6tUJ{>CU|7LP&B3Ho!!U;x%7@S;wddS zb{*(LWU1m_vrQ+cFt0-6*cJ#7`A9rTAmH$aKGNh&u6|5JilGjUZG$b)z9C9Dx?wQs zGTbjvGC>evY$~r}D8?#}tbj=|{;nFmkrrj-+fB#Ss5LPk2PkimFw}#2~xgOCr040L3D<09CuT+ZgBS*cRezNqCI140! zl;G(IXLs7O;9Dm@Qilo}UMGu<)8m8$Wss@*KHgO<-r809=>Yx(LxO@upQDFlWVBy= zf;%Hv4IO&f8k?D-eL5+%rDtg$C*Arrybb{Om?t*6YBZ{9woN7x?f;UY^|NP_)jwRg z?2*xTiamu`bHe|I{vH#e-@ZmniRNrM=HsbK4`mVMjNczJ$~3uD<0|2KQnLudzAW_q zkGs0Msbck)lF01*zR$TQU#nUBY_HFavpR`UI)QG7Ia~*yjU?%3g0ZMOZvoP&-F@II z<_5)c)_h1%e#=H~Ka5Vbtlmd%s8Q4tV5HWUN10j{4r%=R^)tC@ylBzH zxaaV9op;|CuYbGT3l1WEBkZ)N<7H7JDmvv_>pGvzfT4Am?mY*oFiQeNT>@|~K&a~@ zE`9-0Do4GYEq{i9v>9u?0w(#l&?Kq9W*$&A=0Kq(y~}2*L@ntGw$CWZXv*{5yz|Uh ztW2{kDS@dr0XY`BfwlV53x8LY(kwSc*z}FI2g@9hEp=@T^4%%$yzw8vGzJ;C(O!E3*UPY^( z_?gw?C(Yy=U^uM^8wi9b5NB8{)E$=o6o~fmPm}g8tpNm?e|=)DR=vV`5)DrLn}f?A z0h2gJ9@8flDTDbFB7gx$8e(RC3}>~bQvZ)w;@y5Rxca8j$kO+B3$jPSOa&;L0SXc= zyFelK&4#Mi$sX#xE$C-bU^8V` z#UX#M*CcCU(S$!q;hh6#k-TpV*EIg)mZwG55+=69U!+~@my!_(Wqi?z*a9s2PEa{TY(t@heMTsc3qGb@>t%m%0VFjW1n~H1 zipY3|E;$TJ9h7kKLXZlq2fFj*T;!RoG^id?~_tSyAc1Bm?X-0?S+-KnTN zI_XO;1|tmHuYDA()Fh#bq6fziDW|gezf`>+n_({I-o?e-ySPh33_$t9XQqX8VY?1f7DYVIWy1DTA_ZSqFdR29_VPU$G9>jBnmi;kIvuGk%y#lb|(K&DBjK1cW7t)Rd2u}N+B*~GrJCWnP-y%p| zsJ3|ng^P9XQD%M#myICZ?Y?hHPfMeQxDnakm$)Owb_fP=v9M!U{j8#UGGyB?e>`Su z$n28)Pr7r}L0gT%9Hh?d_vupAdcK=fa3-N+f9|>uD3R`=fARV-+WLj}G}AF?AEf5j zCEF+3#QRYc-aqC_HHy1za%=J_tKicNW6#VeNKB9{la)lrmvKpc4Dqk6^$F1aq+MG} zKd%p!pwG-&re95S+9$&%{sRZgF5*Xkv1O0uqC}#RV!F5`ET{=OS-(oT4hcEe zIVF}C?OdPbOv|6`_T9y>gxbG20ot?MKLAv+6=0FQcDt2Xm~rlIQxc(-=am1kd1e6E zJB!+8&1VpinoYH8eV|P(bvLjV0Md7K zjI$r6ss@}XiD!R=#$jPZnW^{ZBQxxzJl3d4%-ek#EnH;JH$=Cca9w0~Gvpf+#4?=wPfqVpvrC|B9D{pMKB5bS>{NU5nTNnS&_<$FJNdw@rcisb5#; z3UO3qSsF;p(B&iOYg$N%g+bWli=uUZ^Nzhi|Mfh~zvAFr;(-CBDczmgwqXOl=0{3E zgbBg!tfEU+3b`k)7FY47{oWpgfN{*8w(k+O*we6^i)GowHuQKELQNk<4-sRjUEeGU zWAdWu&O1vYd7Ae4st1R^UUOaErdteYmyb0uw!FobsAX}>W_&Lk>zHn9Nx9yvp>^}y zdGU+Xfz4HZ$*ScyR508B83=qga8$Ur0qppDY;6p5csD~|x>>nJbKYa8A3l^&HGfz5 zd0D94rZ+V9=j-3-&Kbt6j(~2_ddGSCMe@3K+OWusJ|UlhZ6W_uu6~uy*Yf`M_uUB{ z!}lM~E&e%UXMLN6Z@KjoUy9ylEL(8SDfApiL_2k*N|K4p$;!jzp)(?AIBeXx<`=KW z!xqYk=BlL9oSBZyXU{wS%5*qgUg1wOqwxvw-%{gttFg)FbOTUi86zo!u2%ptV@DR2 z$&H+5%!W8|wc0k93}_cIDwgmk0MZiH4~f zOT7>nNcmO=HWt>)oPBlp&8aP`s(-I{S1yQ_^z2t^bTLf44EY3}8E*(TK&F#*13l^H zzgFoRq>l}-e22`MogKzM)1h}@`tYkV0PPruo&#~c%u!4YbR^0v8Bi|!iebdNbm|hU zgQ(%A8>Fd<0$)tNe>#4iOCW(61_KL*kC)ZLiCd%$b&TzhE)jR2wr>D&&C8iKLDaVU zx%sl=qS+tY6|(>`Ishw+;pIf@cPP7*EznS3UA>l;ydbl%X7*kn-@d8Z`!mIxik0RV z6-r1gZ99^f5lZ2hx{}gw_nhmWfUOC-+$pz+<4+JAD5UHbk z99Cij{|&lv&qG(dXII$B4lNA2QE!TTG0`3c^(zZ_DYfu=Av?F;umNNMLUX;beg!F27GB_7XU}x-Nr7o>g}$U@L2+Ox zc~bg~=QG7TV!jZSO~|H(Ud+~P*M#gr+SS@k5bls=x;+Oy;$yf+yf)hN-~x6ptKUX$ zk?ywxt@%jDqX>Z>BUZqw_YN2}lOtY#Bt8LbI@3q(-LKT|=iVQaTwHNkSd1ZA5O0I1 z*(u9edqigxSrWc_-w%hfgZkZ#sT%R9$G5nhE5>hLbUd?G5$mPIRB2^zXR8!`r54lp z+2yl~)rrd|;*XzV%bx(t}P?R@CT>B0iK!r2YA;Wg93n#)1?y z$!|8M=1JSHvdCGi6Hqk76b9Te6;YtxJoN#?O;X``5OFU$a#wr)YwZdlzIyuqxhM?S_SmVj6{K z@%Ah(d@w89n4l90u*4$p8bfwjZOxcF05iPjFg1Hojmip)QL~(v!56(Yn_{`bEHW?v z`B||0oR|F*Mxe&>TU+{L{5?}>C30=aCn8AhIK&LUT_WQ40xsDZK|NX{gz6>oZ_+yJ z;YhhHY$otKSV1z-ozfuoo5`z?JR~OwG~n@e7)Z23AoY$a=5*Zno#Fn*tES5m!R#4| zcx&^fXXrnrd@gjxAT;%pUudx3*E16@P9`7EUUC+viE4(eX^b~rmD0hRk)fj4q}zDJvb~6&|3wFBW;qU^8UT_sy$~-ZwIe zJ7t9Y<7YTDVr0tyNW?eLZad@qa(d13RNb-P^8Ve8t&P{ye#auBQu`YkdJay0liFi? zDjw-;9)cfK)jQ5PBK6$`1=@FJlU}ur;hP>i4i@N3<%$h$b#1X5sYxM<-!;ZoP^u4) z>yw`ASv`(J-?9*UZTtQB!RVnz;)d?qLyezm_z6*5W3sQn)Sd%3v5v!8QDunl>S~(V z@Z*PC@hAOkeU(L?l6)awBCkGNnNbBLMG>f0BFH1r#A?06!dDh%Jw;vqPKw`~33*T8 z0|PF+Y-EesMYbD;cPMZ_`%3@|BO;|aiXuMauW${O)A6g&@_;H}wU;a1Ei*tPOJR%( zj%}q^J2d}xFtiL*&-&cGI;kzBQha74$^|*7ykmIL&Sx+BZT2W#Z+%0-@_{-aX$T!B zRI_z>Zz!GsH7WRF%oQA-&Z0e31)=t7cr(*ha}ve#kU)tQd`NasRA2VR!&xO9;>%|y zekg)x?2oFB#vJR6Q2JA6Oza^H-{ zHJl7BhjSW-trbCTeDJ$uhdq%43?TMdB~OvCm3*gvj@$xBY8 z`%Tj%RCzM9HI%{dksbkKr0#~1^KO^wFeRDqn?H}X{5SXf}#57xp~$89KrFV zbWV}m2{bG_hgQjN@ZyTTAB_c{oWN^ibEPjJ#fQUHc>0fRga_g{vB~pWzqp$7V{4wQ zIGR`0*S+ydnzA<*sTn)SkMx==5qQ3AfqG155IFu&hI;sjV8o}G@tcxfq(O!6Kse`( z+g-FJnH*xe{;NjQQF*zN2IZfbZY>SppKw4td!{)^T*J?~S&Z%!F=@TPlaP=}Ti zx6udr?{%07AM|*qbz5c97;e^W2(%mDVFYMZw#-LPr~5ya)fLP0HJ_1FpZG-}*I1jUx#z$AKtJ0OcDa2Zh^a0F!H~;64+x?_c z8#DLfn3*Ei-KQlFM>!M*?(hTae?Q}fvGXf4Yoem=Y%c=>{nsUs8}xEXSf1CH$7K5n z{%gk@fRd7ZI@*Dm*qdGBKlA;o&NEirKAgG8&Wha$mOs-L3$X4+PT7(9sX|D7gBkpu#KR&bWk25pyX5<=k2n5 z*7{(=z{|0XW_?b9x=0{rnZtA%lxRAg2vhcqfpS@}@x_|^;_Eoh=)pzRnDJ%oXY)74 z?L?96u$$7T=apkAtpe)eU0tNEtK$_Vzf%<2CV2h^A^E+z zo1^naGP>`0(hRK!2qkH==zqBiEPlMwGB2mNaCEy z@mnPsZYS0Vz$Uk+LUPX63OQ*YaGj{2&5AF-oCLS=q9L(6ULOfFhJB$1^qD=*zAW?3 zHQ#63?lGx*Xu19i?t~yiu}Yw=Z_c^iADpiCKboj#7S?$JMP}g=5Ram~j`v!{TNuIO z#i8f0uejg200s#WgK{K5zDYaEN>@j`Tesme@Q>)?yY=w zf8Fp(0$K*azT|g&WORT2CzD6()K*-BTsB9kKp8-Vtx;=WIK-Jkp)(u{rszImEnItU(pmVKj3lyz1fRVk}a-|i#t79ylnPq zRZq{I`5(KP{!}UOw`ZV=gt%Mue5oI5Z7|d}0b3rTqA2|QJ|2R3(XctfqH;unvM|?f zu+q(kvkD=kP6fHt!ms1f%hv|F;cG5=kvvh0*OE{yws8=Nt8GJ8c7pWQyj1)4v5#&)Vy&ftH-^qmzJYz&+%Mqjd-JNO zwZ-i{6SmVA_wHMHXoBMJM_A%lUl>a7r@w|{1sfuQbUqq< zzeS*Ak}gCPip0V>l%L6yyZlmfG8f&_oZ&r|u(dEBsLz6%_Zk+2EFkZHvvoFSuJuy) z%!e2s8}k9Dv_{M8Go$0A%nNp&*4%jkFE$mi$tfN}ofgV-t0+VMvkp0W!v{rHDeNS{ zJy3Q61CjgbXn21Z0VBxzv-zYv&An33ww&uf&HCqjj6MJ(i!~lEot9)T?0r&yv_AmL z#UfJfyu5(-b3$7~c{W!akM8VZ36-+qJWNoXQ@q>W$*Z6OM(1QZ=J}Ov z^s=(NROWJ_WzwOkgn80UP{W<#d57>(N?%9?Pnl7UQNxiMXUtR4TGh#%V|dJ3byVnTQG8+~ z>;2o)(P!q>VC+xm;U>qy3^3P#vj^#f%Aw1VNKCAc=CJiWzG5G z^|@PXB7YDo)&K8Rx#H~d2lh&Ds(S71$~|?Jih5kRjNR~DeCkCYDvduVO1HUTiokwc z;L_6K>6eeq^M=75Ihjf;T1>Zb33Pre2Xz zaYa6+Ss~dkbEwghm;jpCw^G1E%n_N+jsVAJA+r&nRP)7EOYi!1{4euM9{szW9!52G z11hQBW8x z0{^%LQkjE(WdFp+iO=YlNKJwjm*38(Zq35@Ro?^r-8J{wUBRFAm;kQtU^4Zk3WTDP z`$=EGyg=RDr~Y}&uz17erpy2LvYwT8ac%+E6T z_a^06)2nB-13pbDa)Dm=-8bT01=zvKDdPmuT%;z4Z~>vG(_6Em?$s>FaFjP?6DKoq zIBYqMO8S@YJ(RM*f_02HkyWIn-`=$IWRv5N?&>Wb2s|DihfMk+X8g%=3+sas9Bzds z0&uW`%_veOTyw^Of;PSUDq;L__^(OLVX<1vaOS(`%eB#0H*2pmSxi122gcr*!6Z>6 zJQIRhY!>2kmM$9S(Q*0g+K-;W_{Vjew(E8E)mFc(6Sh0ZfR$iycKNRb@k@}BbhaTI zW?zgayv8}4H47@B^sOpDOP(DdAEuI}&OvTpByExC#7c8|jvKnsewPe;vZ3VDb7jUeA z5vS>uca)fKgLUEuSE@el*p79rusH7Uqcdua@|rsDkDa`N9be&-uwY}TGGNi-;SAJL z%GNU^;L%{=6e&0MCUu8dzDK1>%@46X{K>c%iUoP93VIllS;M5VqM&v2&pD5mhNnT* z)}FQ<$_>`B;pA}y{a5HkHfl+2QU$E$ifq?)98VYo+UZqhWXL@ZMNUCCJo+QIro|^| z-+D~Ac2v3b$%t1kfrJG@?BN@v*#}m~;)Xr4E&LkiKhOXl#28#pHhx1D|Fzf@l}rd~M}%HtzucXj2mbuewgDEko;j&;DX?XIu&p+he~ zMKhmJ`+><_N5hLF3X=i|#(0>o*Jr(GIR$7KkMzX46Uc*4p7MB29?({78nTJ1zqiHw zj`}JyjV%GI#nnf>+o*j zeO64+zciGU3@v+{kV$sV@xNXGQ7SaF1qW+?c&Q3vfZ-JWEcCw@r_|UR*9}qPDLQ}y zi8epxjS)2qaPgXwv+28P{S+Y`J;8V0nh;d*0~6do#(@&9TV5@dp2FBRLHS+s88H7I zE9%k>SP{mKY3*L>Xb*$UJhR~i1CA28pWMTis5 zeCX&knp~kI44m$Cyt+7I$8nU!|J~%Ebw%_uEAcQ7edv1dGTA`OU0Y^9@%TmISNd$s zRRt(jzKiDfwP{8|}AsZ8)OYeOcY$glZfd4Kd=-JB7!|(uAX5}x|3JeW#-7{C8;)E7IPuURmq2oe1hi`hAP>;Un>fukk zdo=c+Yv+SG)Ba~?X4vJd05IWmLT1}0`>QyH3m+vMJAzY!3+=X%{GU1g_s_uHeA=26 zAkAO#fArs^?a6H+p1cI2-0~+rj{f4-#Ns(aaR(%OaI)vGqp`$62H;0s23<%RK{F_X z)^gH`SLR05FbhO68^ADbx*4-|RW!oAKN){sl@q!Pn78S4}UtXTVi1!GVGR zP*MpGU_UnWVt#e?hgvUNS-~`c9VozJD!rs`rA>7b$SHlDq4s{3iNH63NIWN^?4Ajy89L)IudEMusGK^r zUvvOd(4{o*CDWHw3RDBQtRqfiA8SyGdDjgi#2o?N@6f|tYvX8gf}p+a#qJJNk|me2 zM84fb=EWcX7p}WX0RmZ#?s|cJXixt4&`VkEM>Vyp4KL;?Y{3BB+xbnYjQRV#tm9ZZ zocWV({XTWELO=wy753THC-}#IUKtDK27kr#hrISqE|+5cIN>k<6q6B$hG?3$fa$7L zWl)%E6@Pt#{trh8Zr8W2=u2<&PCruHW#WIG;*HIq@n@n8&T~sqkxw)smbGE^CRrV( z#EU#bGpYK;uInHlew$I=8_r1QmdS}o!hN*%vk6F+tbvB~SkB7%c71y7#kDty z{>PjABOFs%Y~RFXS->YmaUJlb`GcweCLraVP|k&MeX6pMVgEA54nFZ=RMOhTfk`px zrL~q$A=ooWVC-1y(E`(Ez*|FaFS?6W{_1Bi4-gSFtoFhe_%r2+@}KU3mJdp&vN=X7 z@daJ*TMA(wG)ULT;?=QRY%^|Z<(v57=t)2-ngNbdm!df`-WUQCkicRh*beh zkLCF$dVtM5adg}##MVB-0|VZu9a=I2`ll}kk)||wv+_TlfB5^0<*27$g|U>_m_*oB zLqgoYnmE_OeoW|)vR~|+!ZyBS6H@MAGti;uy4&bkq94nx-y+ur_@+#I3mH(t;_aSM zohK4shjJ*gORaj$F6aB;V}~P09Rl{C@C{NQ>60y(pF-D^S39T$bQQHykDS`Q3QTfD zS7F)V%=HkT%fmNsP1Wf81LuCJfJ(+-|H){L393pv-e7t`ADrga=R5coCRxy;b=W2p z<4*WrY+0Kk=Z>29;YcwH^RNno1W-CUp^?TuI^NgOLj;lvR|YN%^=}!R1Vx1ad4zc0*RH2K-ur4s_N<%2I`m{2h*Y!; zU`0!aC1-Wp9}LRGUIxBpu! z?kUfv$|T{mar~>%Hh|L1P63Fm_4f3r7KCei`F-*uqjQgr+KplN-%r%(mA0AI-mE@! z!PcCYtg^-T&479Hy18CWuvTemtxY9lpcE$?FBh;}YzF!~pI!HKErV1O0p|DJz;~Up zrW~tYC+UV(96o=S<>C|?YmtyTJ{|%NICB%WZ1m}dXGz#)6Yp4ZNzWvR`SsgHK;0!eb%^l6SOXqR&PUn1K!4LwjoJjY?r!NZoJ*9Z ziy;TOd@}ZaLN%rIdRj;`{>d)LTKSZ3?kdIWkxE~NGky>hs%f#VG4VIBf!7DZ!G+5va_tvM%DPhgG?Q zS-V=W98lUjVKMeIOw7zIlb#`0DKF3k;fN$e8L%onUp_9n)w3tbV40un&3WYb4=X>% zg7d5U$40Sh`mLxJ+#GC2Ad#ZP)glKPLKr^WdvZ--{Z`b;@~8)+jb{}uv52qZM^vfu z9@o}6(9;O`8RZMBR@IE>pSpA_dJ{$fn65{Hj!2#Us?3+Zit(bYhpUZJ65?$fcloWn zjfG0wNb_6=ze#c+#ngGo_lC!0&xkDntBok#{2%R+M-Ib<}Z{y7oB27PpZa03G|0G z9XA|{xb%yJ8g6V3U$USe|!$!kI|}&xAZnB$S$I2TT(RLeoD~o~^<+o;P!Fbk@3G z?WrzcbS8aLZVt|OH;>dY1Hv-a{wg&Mitxj1`LHI&)6@0K#*tsXCPA4l-UZEuAHRqT zV1mP&uw7Sb{nJ{3(1Rr~AP9ruMvr8%>8vY+M`)>!f8resc5ME`KYeLNRT&pQ;`(cM$a3n5c>J~?p+ zBd+Pf+Ky_lDK;AvIiJt8#`(ZxTEgAO%nsv^b#=3GPcWA;y1F=3W+W5w+3xsGwM3&8=78$N1U3W4tcuedxItU&iBLez8?_7aLz-kHk2lTMshWK>1Wc(@d)SWKXil%yD@lK%&CPF+=H4Ko*&4b-!Csvw|KZMrDWFSQ~ zB0kst>~mV;ucpq#+l+EEV{lOq>-(Po4XmGHtf!1doeD&Gq&|E{iQ(`ne%38ekN{Of zycx4C(AHq{HLLlAAMis=aOeCdJ%Dk6byzi`#ei+g+1=k(R1W2XiZn7J>)g|@0N z#JEdYjf6^~Gm?1!7~jh&CCyv07G!T&Xu+T0^f^C#Q}-CHA2q2Dlyr>;eNr{ZfDCaC?t2gOG=JUcl-2qQ~mf7(@ckoH6?LEw^v$4jn zn}30Z5MgxI7_LZ55$bq4-M-)@u4*T%Tw0fL>(_wIzgxB22A!sRkWZi%5urZslY!{b zy?C8T@=L_SdAvjRf#np-K?g7a4b5HNX3)sp@KyYM7DQctczY}H zSoAw%lH2m{tr2w<5EK3+eco)-if|ud3ZzZxR?Be&+H0|sJ|i)Yrio&|wewj2GA-jO zGw>wUQlOXDo7aB9o~@UOm007nP7Yg%`0z&WY5G$0rrLLSf$oqdXEW(XKAQxE68;ly zgr1%F`$M^~$b6=(3WccK`aI-_OzV@Tu3KH_#3u zJNYM2l;4F35T2k1mf8L^SE_j$98_B%BEm zzsYTkUcQJ4CEnzq-6qu*%Y5J7uPdeEXR@@^noqED?hF4uZII~(HWiW{40?(Ro;l_` zkXIk;R`(LTH1$`R>Dd40eLsz#B0i}_tED}=w`2)hwyQu>gS+8m-cRxTz+gJjb)$K! ztM!Ou=U>{-rZ3u86t=I-8{NnByj!_|<&&sREv|D>4o|wM81it!)SO^j zvAFqXuci(Ds5mu*l|qyc%huFGjid77Tbr82g7e|>yQ9lpr-BC1G$h`-Co0voL0=s* zi(-UG_q^S7dY0|^ayciRC(vfBzY?!~zB|mZijAuxe#wzNhW@JJ@eZJc0@DFW$h#kZ zj$J6%z1><;(GV9YI7Zpoqgpx#^TczPj58@DrO3?ZU5ZMwd*v1XaC$a*lCTO0 z{qI=^$_q(eA!!7Vm9iU8c17kSE9v79+ zy?)f&?RX|78d_f5aGmkT9B(a;{#{;ChOZ*duMh#eV5_}ef)$nk^~SdkJjD?Bo~!|t zUb=QgEo2Khj$K${x8kF+YzEpgx+51a_Pc`>)aXt|W14`>Iu-sJQZ&tRq;#A(w*W3b zgQOZzR=e&LvvX)XZ=IQ{-G1f$H!Y18-TF6@ie#=ruo|tqzeC#}goh&E+ACKfpu#zq zd&~ol{H+F+M9MtRn^}P1ct9@RLIXrOcHeWtH+PIT24e=tu4@dxr*}}*R}E*q?;q{R zebN9cJIMEg}?lxpBR+p<*?>@9%ub}YIGCD67rk~d{ zdMySda6Ly@I)S+fe@3#x!eH(-QIP}E+r-oFsOytO&YmOB8Xw9`q`;N8H8T^C8Wk_V zk27A-<2B%JG*N~|pD<@?KEc1LU``2tKH8xN6h-b*T85lQhF|}ru08z*5<4`0=8A!> zDIAnQLzJg+%&^>d-m>Y@^+$Qlc{{^2R>urrsYeDhFBpx4%A7xE#4SPt$MDx!Go#57 z$jsZ*YW_dk4W8Q2wF}P5!P_rw1lzmKpv5%MNk?cg?U}20Oo-3mH`IC&C(inU{gd#f z1c8sQeY>S7^fd_QR+6_sOKANBggo@mD0jg?r=N2S+y6c;laU^tEQAx>a|PV(Q}8== zfj=f0_m+PdGv1(7mrSg}!&R^?b{fPRq`@nY;;V9a$*amS*9j!d=$Z9xqy+G?kiN!H zTFc=~RjP(9~xLo%DBT_7Z4*u-gWuo!^ z>*Gz-s{~nLP}hOjXyJwdFVx<$+|IQmM;_0W*T6J%tYeXP^z-$1H~rVNM=#H=*Vfff z<)Tt+__jtma<&eYw~rePv_zomW);@n?MkPd^t4_=8AXF$bi`a|9}TZL!R*m_irw6gGiaK zaJ6uCdU^{;JOV1v6kBP^$~&C4FlJH`@M$;JV!=qfQMf$r@wGs?0Sr z>)0!0&+Gn50(lvy!hVIZZiv&z$y~3Yz%VPG#S5XIUMi)BrCtP)w2pBhd&0H3KxMRRu z6M4VAmFtGLS_}P^v&;amIkTQOr*%W@&S-{lgaJgADl0`ogh=$>o7*a%4ZLYYgkyH7xK3Si>xc?9 zD7B)&kT8)W9TzaohIkw^88vZ)VQ;`GyS3-T&*K4&J~`$r=7@aJ4CZ!bfh zT$SvnAk@lKn|N_&E@;Ds#dGNuwGu#%+<~P2mm^`;7?Iq<5-oKFPtIP?C>q(^SNoMw zuAw!t5Wus$$3|DUgzX8+`o5yHJ+P5Tn$lXp25%+F^>4H7Zu=>R5QciYTnUt_BaD{% zDtQJpW%6XB+1?QrA7&4gZ7+^y*s)g4J3)o()r=RM*$W%Q$6{9ymh(!7xfJDUL-ZxMB;HIC;yGQCB69_ zsvTLyl&OhNu@q!YiGc>&&U*~6hD^<>=cpgxvl0-!=DQZSSiLU9xyw16)z2oo0XXf> zVwbBbQv<1Q?t^zB0N#a)J4Mb2F@(Nz9qFojV`uZZUaB6c2e6Q_8M#ZJ(J7>rjB<-a z`)(S3vR2(yn9umTZmmq?1y%=*+GP|$kf3Hv6`mC}X**!M7tsc> z4k-qBWA;;Lqe_ir6%yCD^8Lu4FU$5y=R>%iZLDU~=vHY5#c=prWmX(Nh@x`7SRjcl;-PR$Ejr1< z1o1lVJf?sQ_a4O0-5S0m=iFk4TKW2L2$8WGZDG;mO9562ADK$N3E`L3|FkvV{!)W} zQ)xw9JMa;|Idd+J!rQHzH-?4cLKG)+J>XtagzSu5+f1r&sne64Lbz&jgapQyWgt(V zR7=WugzSGHJeh%P-qsUL>wLvfG%}IP_X`{m^>Z9h(7wnU`ZsTZ-bO3_y+`R=G)>tlcHGlDXLNs2%8mh`1e{auZCt#}x zqa;}0uLSTbQgx&ZSLWknfLSOw(e(UjcXnM!Typh9St{XLZ_0aEvK{#u3r+0eyG|yl zjV(p>AdLi&RZB?KU?sF6K=LjoKPvaEB{?H4w}2P~N0Y;lLtxblWq}r_m10+ra-zF1 zYrn<8RkWEdcKw{Y1t7aE2$(Ue+kmU6$}PiH78WKNl+@_^0*9Y*6>N$zd-XzxOU=F= z<85M^MD+5}DoIqgB?)-^LXRi-9_}qDpDY~X5F@mm9#+7 za}$O^rSPOgl1Yb>|HtTE+}V+x7GMOXBt`vRdJuZniZ`MOVeM;XQ)SN4#Ic>N9W$vL zoe7ze(eg6T2+TbWe@Qy4k9C}8`7PsTVtpMk%)MBdnjCfYV>H~|_q2sD+A%r0e{L>X zbtXnV8kh#n|34EX(m4^EcTRh^(Lljb(cPdhIuSt{qa%f4^2x=tCm3*&cs}f?n3T<( z4xy>tD)?|5DFPXNG^DzAw>6uDJ|PH|Zaqr7kUsI~V~p;Yq4$L&{;Ano^=hfi6VE_R|D z?zgc?iL2J9Wu|6|>Lx5}zgDS3vU!M)0rmcbtI%4!=?I5cN5{&q_e0T<%AFL1=Fp77 zed}}K-K)r6^?yg!La2MeKE4*)?Za$Ni68Rk$;)1e`sUnTDt6!&eb8xx6Gfc!fcAM8t^0tjF(eXNm=Pms zBwbu{Y{*^B=b8NbVy@he0W?oOG3mSm)S&xY4nIY1L+<5G2R9~@_Pm`t5G8Sei^31z z3nvtYjP}%+Z_4LChK`?%mrf<|D%BNvhE%J;Ih1n+r=H7MdkhbinkkXgkAp97?+)_W z#|GcNQ9Nbgvf?XdkGdy=?kW0O0pKk6t1jLGFcZ41O9Bxx+q(xd6fERSg>v{_L;@yl z=oESgXI$AvfOb%gJ!WmEV_^c{UQK2MZ6HR&!GRT#RF+Gee8xsS(cl$)fPVY;{@yoG zUFq?bq%wQehwvQh;Ka(eoL%tq5fAhfczcIC`273z`1rmghfGzb5YJLQKOk@c&dFEH zk)+`kp2}jT2 z5IQG0uijrb!n6;>+{A3m`KDbLSdMqPzJ7+?i8j%#kB-TQ(GMdF)X;I!@KXb;4nw1J<%ExZPk_)tjs}BD7K5+TtvoPYYI3l&C zkFW_jk1o|TRv2B4E>KaPqFX)%+peb~a4F(Wi3ZxcmBbF~jYfx@SbdH;~SaB|*0C zD(gJ%$GC0nX3OpAL}z5~9}(d=74XnYH@3;vDcnMa&r~zd>_zc>o{%G!2NQg)dKDyJ)q_*K!1r0`XRH!rsaEj8^lmGeC!6f#fU;jyS^UQ&*GV$S}m_%L~aUmc5GD(@)c)_8XJNy<#^d3JEE@(o21;~gE|A!dd*U^7fSy&D( zPPC`)`qXsmQ*TgP>4TLpZ%TqOIe}n6c_qIJgOO00rN21NV7%+Z=o_Y*0r9YlI`wQF z$V)egZx@mOch4%g`CKj+c@O3IABLQ{JQ$$YwY#A}h^NS7 z#EFl@h+o%i6|%7BgrX_Jt;txP4ikjMUVa%@Qq0xk-fuyq&jJPZQF6qYJs-@(7)sYm zSp{Du<%~sVnhpzTBoHhQ+k0jUUMlBxLsc5Yh~<7aON?-lqhII1A<$ldnL`7@al74C zT#masj!usxGLV!wObfQ)FR&{UQ9vqszOt$?0{xUF(N8%PMh|X+wBLJ$h`@T2Bin1| z&{DXdB3tMDhbd(8=HlJZ7jNac-g2MkfxqrxP$;z+Ps~lGOWmKmK7?u8aQY!T+;jxd zMhm%U3tC)1+ZWhpZ0-j1B7Gxt_c{?tc?o72ZYh;<+lbHKt-Y`1UM^b2hqg!(XKT-z-K0hfCKTfoX7O>mjgu-d^&<{%Qx| zWsZ;ki|zn#GS&A&J*w$nvJai|Lo3x|Fz;zcjPEN?!c=`c5c3h~t_&GyPn>SOFr8n^ zFQRMgb-IgbbD3)aoUZN=+`HTfs#a%mSlXgn+igkj=|x3gt=%MV)f2HHzXuX5f^FzP z#gfJEDC;*R7ifQ{V~7>jj#CFvz@OM^UV&9_Qixe2w%1ShDZZd?>ysBO9u9F{TbpbE zo+%mb<59#@?kP+aDLOd*_pw1T=JKb-H#Yb`Z(!;4F}K+HZb7*-&mZY+?QX3AcFk-E z%hI^fOmh@`NhhxW*IJ+17%JQsiDThp&!aln{lg(p9L+rfmSByx1Qz7q15oLa7y(J{ zv-QRnGA$ORBwa#ve`Vr)S*C#^!$v<3J<`17p4D$Lt$)2YBT1)yZZ8TA$R)b@sO&<` zU$Kjzeshy+nUFYL7`m@!W-z@LyG*pmPdSlit;uan<}9i!WhnF#DCHwvV55!-n_63cb8_87Ik$ltUJnx6(W+a!QR^X$=d-y!?5Y#5ERg@+6s=UglY4rA{UU3`ZS{b%3jZe zNnch4kgX94b@MRq8K&VD6$#74$5wrcxo^pHdU|GgX?w!{s6piTG>Tfwuy7@t0$+)xiw@_FsSJCzXZiEs`9DFi-i`>Y z)9Cq?*5IF&63$&%ml0o{8?!Wv-9#CcM!GPtcSH=7Pj3iBMlz}%e=VZG)$lIv83zd( zn$dU57fI}DH$>{Pz_s8va~b4cS5T@Z;v-~1ncS7nt0~0xn@_c%A(~=^1y2omo{1G? z_CB}x$UygWL}h>ey%4rF$X2Zlw7VXz!WGBOC{ z0G5ydYbk5!CHsq^H5jk@Azl71Z?(x`2>=m%ciktD(Fg-}kz_65g2bGW+M2Zuwe5|( z8O{EliA@rlbCSxJ4`?nHZhVjS7Dp#msK5!C%>v1{o1@{m(}{&~7BQtlvv&Wu3IeyL zsDunOAa=ogYl5ppZXC!HE`$53T^Pv1R?O;P_|_o4?;t-IvwiyVGhmg_150^VFD}< z;y(CeOz?3vgj(j7x3#W=1naNS22FBow92VN>m28^=FFE@JS>hLsRjzuT;37gF)4ZxDY=zC11HuSp;N zM#sHhWSyc#ydacueNYiORY~A~Mx0Z(+d-`q+<=J7=b{;y8iG~!#VKtq42oj^O?=fT z@z8Dka%=0H&RUHP%9=%{Rj%I(Iv>-EqI3c103!qfjPXX6He6J*9%9qdr)ZV;Nw7U8*{j$mpczZiL*R|(&xtIIBRLYXwY}9O;qbD)PY|q z=B0D?{yAD*;G{;DkK9ugS<$aEfICM6Sg}zK9Xf@dX2VMhwIA-g-)`l#2 zQ|Oa8VJtR|3h1VP0CmX71E>?uV~yM}NK8qV;(42Xy=w7ZcfQ?AIbEJJDo-R>f;cs# zz%vET3REsAmXug#FXsGMelb;Zh4L{vRQ08I)%%^h!z_sSkN=^c_Qjme?hzg2Lon?t@;C^M6X>~gmBV&P8hUfF+~ zK(w<+4O(Jw3NRA40Ah9D#{nyZ3$F9@2Z}$%`gcdG8O83<1L}x%yVD`YE%dw(c3I@!D}|#8nJ74Frn&3|G9}5C9BultO1(TY3@@hv+d9b z+Fdx0ZFu7Mvdt){c^#fSPv2WUiwg4Xk*hpd8TT~8@+H~s!R9Z}rv^b65#}!B1E?M? zM^eyUK!6|1IH}iKAu4~-oMBw--u)pS-`bHr{74BHN70d#Sp9H81wwa|S~@zj?9g0| zR^PHzi!k@>t(WuRe!aSWo@lL>MhUk852Q9?+R0|Jyx3iAhtrsOBBLD5!pqqlM(maj zBesw9+e370s3WzqJE5vnR@Mb1Bon!xmgdtGPcx%6jq8Asgsa}PF=7*UR(735U$olP|-=-yO+!3&HC+Qw{lr_7I}^Gk`q`4E7*QLi8qojP#IZ?>v!w9o2fRBt zEk9|WB)Fh_2wUSYe(9%{-OG+A-dXO$cC^{5#FuV!$wmF6Th@L(cAA7mpg$^i=q>DG zm`r}3+V0#m{EFq%fm5Bzi`?EalFtAkMA+K-UqteEKvf~ETBQDDu%9zLh1 z|1=8Y@@S%fAPe9wLh$|LV7NG%a ze<2Lz$-I_oktRGPlASyH%lDes*oC%>-6GFj(c>l-cp$aa^>+^vCd!NYJRDrPMS1MX zpi|wd?=$Qbq-F6(3Ravp!xCTI{hE_;*Wah?Ie}BM{B$sO!+U^_offoP zb=LNksp=~3qJ8Ddf3TJO{yIkIG-LgUUkz7 zTsST7w4Ui$IRS+b3wg=4)ukU!D_6^()=)k@)@Kir2zM|p!0=BSnypXNl@)JGRq;Z1 zDnBWaOf(9_5@V+30OaqRpYzs7e;Y4u;b+KL4}u#K%R2GaR%a=@SWEK#u=+V`?STQY z3rFO|f%p1Pv3KnpIk1%!D1^aP}{+mR&O*A4uGQ;z3vw%|ha&R{N1IZYGHKMvx0d}U#5 zA;Eyji}SoA&RRJJR4Eo@>G09}Nn0V?Rqv{E=dgMK5~4XAG}Wt@_=oCJ!+Em(F;=5V zTC{SaAlWx9EnUk@KFG8c-q@`ampCJZxT?KlP67F-RA0qwv&5m%*&J_Cg5=8M%2n$h znwDLs_H$A#V$okl7ZYrTR3d*lb{qN+UWGJ$dGea4UGw_21M`QsG|wW-_%a+6OToU4 z)qo(Di}&xw_rIjvog8XmX}4SVRuMfl<^2WtQA*l<8mBefW##Bj0mYTH0IV?3U%VP~ zq+#;o^@6dGx?=fIqtA75;%+|d6Bwed%{7zfe9<(-CQ_DJ4x17S_iERH%!@@7cs8nSD1{-bM8g8DOlc{sk)KHkrCfre5#i(a37AE-VDrjg<7uJ5MHk5)7^93FlkCukqbY*5yUYY5#vEbSFC z;6Zta8a%7zz{#%}YgAa#Q$DOIT6h!AczxoI+E=5gP?}%fX1Ah}2{?o%`i!Xy*Hf=% zpS0^So57fDN-mJ4*FZ`&%~_f;T1D)Vw}ihHLB9ysKM{Rl(&|LgI*Yzx1_E?cnPY!Q zO_=xap@3NZWuZ($LrjFlQrWv?R^9wqU$7YWt5}SoqU0A=Ox-V^8=^eGlA#vE5}cq% z>-e8)x2mL4p3X3i$Cvqpj7zbgn^p`1HJIH*uumJ~&nA}#i{NTjpJ7f4Z?-_{@(hD& z;K+~~>HCq|d$mu2(xE%6@Za9lCbaL7Dw(gNB z`!yK^YMkj^|JtGZ*e~df5*>HLxC!k2(`q<1#;{lt5sns<-tQMK1|}0s!UMJ6kq>#Y zWFLHE1#^oE7|7D;qPR5p@_v8hzcgO>ChFJE$6psqpFF&aJ^(ZoJVBPz@Ue#F(mhqF zBlT>rHQU>OGFbBst?Wo>UA;lk@$=0)vpWw_$lk zta#aqzaxGP1UHknps=9dS@2&j50t$3f+a;^-|deh{Pp}W(uldJb870oHUz!jgk*nk z4UE=R12Bs9YcmNrR4)v$E>oGQJeFSyGR|7m8MD81e+@ zG5R04y>1RI>vOoAx@KlAoY$OG9-%K0-y}J89e|`Gw^XYmfGgO-o51Q!qF}W;e&&Y8 zJSDS@<;N}2>dsRR1&~x$!ya8e^pFJM=g;>mG38No7C)uP9jGQpOOeD(cA#!3^l(9v zUU@SN=whN*(;S1PNP&$q^j;(NAaxGPvWQT0N^*77S+oh8E~ zTP1)mVDWnTa-1$lqTJDrLGSb|-Yz&UbCl6b=rPgNSL)}t4M@pfF$^eTBzvD(N(k)( zE>`X7{yz#OCom7oO`2`92FLEGyqQHs-UqxL0gni5O~)hg=gKvK@kbmilllF^&Z-lOCMUNVkG`~g*#_d=Tjd&um%`V7ESP)ZDSCs!Hly7I-me{om0sbYeuMC~l=^TS z(9LDUBmJ)woV^IsowG(bU>ru_Mt@T!ehn2n%8!}F*nV8gcL>HKBBaicrgUXl)k zIjk69Q2b-R=y?H{GW*w(uBG(0v*8y6UR6CBrd5r~&cx(iTW73qr=*Mh~WhI|!nWlIR8L~`3hCF8O=mb-he=vbYD>3|qd-z-G zeW2;fdXKlE=THX$EuX8oKVy!NNH7_<#|5B=;myI?5ZxT?I7oCGu_ZbCp8zXdH}JaL zj1aKGkwyoOpWmc-FhlP4=qxY{7+@>L^Kp@8$R?yE$2eSH><`^3jsO0TxF8`-Q~hi0 z;Nw>oJZx-LW^*4a2`XiZ+kQ7 z;b5NjH|luaeQ$V`8Kc|%&LIOX+Afh|fCFg#0#@cD(^0y2Cts`$d$?7ucC6oPiTdg+ zy{Qz4A99Ym86q9Id-HPt-n?AhaT+{f%V;tv$-xTADhI@ic1auZGfuySY!eddFAjOM z10Wn}KTdY}=Lo5eF#tzM-oUzMo>(1;Y@{OpcL|8ZyHz-QM9?cB*_cxGw zXPzL0=riJqyE*c|n3zJZSA29Gsqgt7NzSepH9GUuA4J51P4liJ)mR^a-Ulk8U5|IX z+x#Gl8q>e}O?uIU2loujl*aaTiU^4+^?sW=k2I%8v@UG)2n2yd^t|SMEQgmrgdFDEO8*)-28GRu z7i#@QG3f|M`B$IS(1M@HL^3e8ZT0@ZgJqoCqPtur;!cMrbHoAIlj>LkwAxBk^Xav>$nNP%o~v=7{#ZIsjEw=4n+0s55adJ7((A>@y)zwTnn6p{V0;06 zT~EORVx=E94|Xd2hZ;0O~ax#`h{OLiyXIb0;fma#%bxH(c`&EF9>!$ zqUm8@8i8s=pbX0^#{+v*D!XppQ`qFL@)BA^Gzru%sm6c%BS)qAj#m#=qIX3w8ofIL$AQMRRi`47CvX*tHGoVgJ(t zc;x$nCB-}W3!5{cHcBvNJ!W-CfH=!yURA+p0ptd2I2P7(s#SZE{;pBQ0w5cctAZj#i>}L?~)iJEz zmzTzd5tqpRRV#!T2au&XcQlS!Y*2v@VcY>??J{Ykph~UJBChO1-bp*A#MwMQT74(? zsRdma<|zCpyxe%f#mR(hzoLxtgu0^~L>}jM{q@@ka*yU<1B{F6hKv@86g7-94nA&q zcJt~tOJyr*A()0;_&8tK-%Re{VFk8Cf!R*|T%0dpVCDu@21|-R^xed#=@IlpABXp=8tXystIuq=B=K-g09oW7sq_2 zubCFFZ20o0*tebwu!IJXqVjhTJE48xJa+e%L`aN`Ov?S+;~YcGR0$kRgR4DS1k-SJLgf4QY@go7Gv-fsw~vqRRCLyuWuf81&rM ze$P_SR2%G1e0tDXQsw;_CZb^U6+NF1#V5Z);#ut zm?7_L6E@2K1?x7>1^?UA9dhljCfBbOX3mkzsMI%s_D$N6A?QiF0|>NYwB;jp%tye} z2Yk;5$M0fKbQ-~UEvvA6N`a^`vn`lM)8qe4tw@fK!-D7Etmg&&1`-n8)Dpd`bG0|it}MLY1G0wKKw)_eJQu+tl0DKdEZRiqD!1S)}3~W{Wo*L zT6(*88U%|F%y=hfw`Y??-sM&47P^I38a4Y__&v2GtQ?YiZ8&XK>-?@tUcQxL12jjP zxX~geLYQc-(l3n%ZJf;+CRHuk_MYpB-I!Jl1dG?oT$<{CQr4;33UC;TaFaM;r7iXp{oq#+y__q9`xV8MBLHK3P0TKTnr+OxSZTCGK{wL&j8GuG;VpJvoO zqC$oG9e^6P?5SC>-O5H0zXVO6Y)i^k@Pkf^EC($_ZVZ0$U?=t7@zfAPrEm2M3ru> zTI=!XmUM!pUR7YSss?Oc=M&z0sriooKE|rG4(!u&Yed10c{`id=d^vd{bjN?*a4Vl z7sSGdx@vZeCr;xnh>#PPzZkYzo7KzFD>~3)nk*et z(3N!=cnN#u=A^SwSLkP4wqLHSYpUpz_`Ue>7u#oTdv%h2vwHi!)t>5Q+j0$a%*w2m zZi&l4>^3cpM|HISdw%1G*y`n@H=fcE<7}Y4sA}&le)}cpi)g)$WKnSd_{vY5hp>4L z2h&`*)UhWRtXI!g+=F#WHh>)-X`AwOmp`9M(KnjTF}d4Vn7iLa9UeH}xmQ38`&D`} zj~!iVq)0_*k&pSo`^c?oFBqQfaX$42lu2CcBYhe*x~{}`VDK~-%23U7XC_$vAUv;X z4g2r!7ukzK-|eikl;X*8HOfuo$qQ#%TprSn_E{X-1<{Y`eyn&B!HRd&?Xp12TlHf8 zasuO???{;Imx%|CB;qE2SS(eDckML?s{8Xi&Av-Q+icnyIGm>&koij~guBLqO{Zi& z+T@?XBynR=W&kQ8vZ)PM>7rVUymtGt5u~$G*V=wkNn8S+VP zDA8*|nvAOFVvUD(j7zlmZRjtIpMLpny;}QS>Wgt2Zx-dkQy%^PcYQedVMno3^5$|0 z(_?YpFRSz0@!U&oFKRpxcfCNB`);gqbuI7rjN&{@=NNG8 z<$R43hAt}l-!;qw0c1ow{*!f?w3BD7;htvN?v)B&GIW=c<7VLKYldn4#fJ26J|SRZ zhiWX_)4m68{W#V5WReI&iGtFK`|y#vH?8G6(q-$30W|kZGc~=5O0<;yxi-6TQnw~q zifS2UL9um<$|GL4VfTjKhiIg+&shgGv87G*80VX6U)OQjc^jQ>J1yfyQDyY zGpog1%kX-OU$^Y`5fXFAaMb$2hOX zc+<|FB$_>aVm3I~A$o~LFNcbu&qeKSqCt=W$1CoV#g&}zbiofYYs3BKo?CY(%}6H* zNsLrlg(d8^9FE7ZA_92Jy80bQzgKnLHW@E9iFI%A;iY@6{gNHYsuSFNvtcxq6G1^a z_G>S}Z=TE7WB3klLlybsL@lhEFhJPpw}p6#au5+*ACOOj1A|^hVG6^o#X_CqK(o60 zMBOv8#_84N+EZ;zFFsWRIWa$b#*?u9Q@b(7g~rw5s>zQY(ftT}3aH)#rAj~wdrE1b zNtoTi_zU1wh>*3#-Se5jKn7p3gjRM`yq{ovsq!rVYdQKc)Yit}Tjn0N1vSvd3-K#J zvB@vhUoz&UnF#{Wi?^^7-dcUavICi?#_X0&tfqWAv*sUy-!$~VayIQB18ht3;9w+O z10q|a52sGCC7tHM7-~_(@S2I8t%XR!^!zT41GuHu2s$D`%h~zz8-McR^D^kIyUC$1 zo+_}!7=C`{hx)Sh3QBe&HsEQQ-@5c0Y`deHrZHOCvcJMUR@W0aaaJgZ z=z9T|WtzkaCS7&!+ikg*Dx`*26?n*oLr-*Ixt`|8KkdH;y+9KFSw02H@zcM2$8oWe z{l&+ODTpFieMTabro7zxg&OMxwsE%=eNt3z8j6XW4m4mkO9!J=;{g}wly_*fWJA+fUsO#M; z+yspz@tj2ltuwMa_`Tc!oA5a#TwObb*2ymj?mv47$Ip*(U~a!cYd)5su4KKJKv^Mo z3auh15#^?ZQUB#F-X+SVrNZqrH{b_Jq~-Ar{5XK0=l}P=er5a-!Lt2`VEF-(q`!aL zf4&NE;{x3U7oG@{Ue{|6V9g<3u>X9|-+t^{nIF-f`VTPi5jk+@{`PJEHfrT{DW`UU`fy0opLE)uKJBhUTA?F4u#i5p{$Ao;1P{@JDghxPUfaL?jWx;U=; zbB#V_qxpy1`3K1+k>slRxK*ulU zbL~CR=Kbw?{pYK9iDgoj0k;$Ufgeo~djI?&n12W$$A1OzuVVRM0sKFxfd2~M-|DLW z3gCaLq+cfTzZUSXise`{|JMTkA57bSE#Tif3;%UN|K1t;uM7J39^$qC7cOYI{RwK0 z#wDws4}*oB%2UV6?5`@0i<95x`!Z15Qww5>xSRucrs*tpqkjPPmoXwWKM;q1g-<(b z->Y?dTw#Y>pq=y2BY%`Y{p+8{a&U?L8bFBG#xNTuWk*PTT&+V48V8;840-&ygyht| z9KY|E1v+<@r?TtqOZy*v!hd6x9+AGeBGe`2IgBcxTew1Gu=ul?Ckpt%uF+3qx%@4# z(Toy&wLaK{gtBNCULHlMUzUDrDam5@-3*cmD5(WWRn+lPd|#B6sY1FF@16 z$^VzfAAiza9P6WnRiM#&ejmWKh!3lPZD%F>R!i{i{f|Aq<^zNlrPiv!|M9hdtovgD zb+IcJ$O&!T0Uj4%KbV7*@%HBeS+KGE^^;%d0Z+M4N%^;T=Nsdn64n6IqHs8KiYmBT zKQR}drUZOF#sB2~^uoz1+({Q}&hxLUwGPO-C)H1~^?%>2 z!=DogmzT#n9eH$Cc`Gklc!gf96QKMyLXRaMk$Cj^)`N=@kAh4-O;Y-pw@jW=`*u0) zvd^36?Cy{SxHIz*<9yc#A5quyk~rLigsat%sSny3p^;%DICD zn!-vXImZ%E+hCRKX^{>~EvhpYpMScf@cl*ItqP!D#49+SI_fx(f3$qP|M6MxeNRXO68B`&%gPJT zL<$)+$v>ZahS~i&qwn5PfpSm^KoC5{QM{!;0VEUbi%!fOYfJtbVB6Ji-8(pb;rHji zxEcN&G0LiU(;5QwJ~UN07C{GqRw{Z{M&NOg0GG?nEBtFe*ztjH57cx5TAD=A?|*Iu zfX=!r{Me0mWo~Cd9aBbC2Jj_7vO^<)fe3fofhD}VaC!GwDV3iEbTseFxO;!|WuM=z zWBE?hQXPik00HUKg0Vc*_F2$!t1`fl_|Xzrg6iovKF7yl6??dXT^0fUsuk!51nEW`u!P7zXa1dOybk0#75D|u9zXi`wb>Yu`1UXX4^a!$ z&R{5f=ChLk{55fT31BOIrw+hL?a!TwST6Cl-35*zz77pS_5O> zjg|tScy$UXoOVklH-c43|FoeGx`KOm{P)`k3=LEJDI!h8^Z&nIqF$tIbRd)W*IKtF zs`*_1bm`cMcNd3X9^?$7#j7dE0>aRPSjh*$N-LEBpY?p4&}t$!u=xbK02ESJP+;vd zW29J*L>!EX*nP`Z8HWQSMRe)S=Cw|^8gwjhIx@3kLJHu#JI9CdzA(}8(HgMN;m=)3Eb!kMr@X}Pfvl3BsIDtgD^ z6P1R*ty&L^XRr(=&R^_6(_Tv&n0_@>&dAR1%4B zMYm%|d9Z9W&n}16l)3%Vgn+L4hnjGF?ex8DbM*2e zbMm25c0U&G2%f_YUQItVRmkqY%Khp6?;Dw&_(NQC5{+GXh=xr6{KyX_a_YGt37{hB zfRBClIF0&PkAdIZ^`XlpcBczlbzL@gZlM7K^G$ft>GLjsEv_MjFp}!7hz_2(BI5WV zlt~Inw8VBCQIg>h4(nB5+{x(P#*81v=Ha`=|^#axyWpiUsra}%nesSxeyAAUI8 zF~-@KP$$#;z^6FIYp%N{$s>x|qtDYBb4lRa!7^?HXs2O`1))SjNp*4DkeguNk6Z*Ec+Inm9WOF#j2+mERvraqm27`I!_|V2Z{GCHAN@WLGU! zuaPrJj=Wn1$?^-cfA!e`Sk!8tg@k_rVSxq|^4(?X1gcECKBv9!(3=}M(B-1!5jOeW z2SBfBw?;=>HI3Hp+Jqlp3v)se8G|VQYx-31n~WOQH`4fLfSd{gEm)u0WriE(KknO; z*J_D42MgSMfv(8_he+EOTne<#mZo}kBOpo2Cm?T^)u*LsC)7S))FMA32g6!d&DU?y zu4zwH4FMbdshOe%I|H?OH!DZpX(Q|ocF&h=_|8hKQD9i}2(!|8LXO?s&@atV$;MN`wGQG&F5{jPLod-r8k)ikm!f__jGrMUq z5MwkZM3jpOQUvrUa3zUm4zWY&@C-AJ`UE?aRD^Cs~mOa90Y9~(`3>YqkG|MWjG`X8mvg3M_yk#fBA*QXNX z5HGuS^LjR$mxHR+L9?|lQ<0(Ug&m+-rj3oXZA8g{odLALn)o(USiq58l%|L(cS+cN zb>urIa!5i6V?a6r6fDiRGNFaeu)nlmk&)i*D&3Q>tIwO~Sqsj}wrwbPEZJA(+K7V( z=Qx;06)UWO)CL|3Sts*{9p>$585roW7`+LZ&z!A~{QjiEXy%rY7Advf3q|{a_bsJJ z5A|_VpgrSLkqxA!CVuhW>K#o=xq`AGiM;)4_R`np3{H6uD(0_dEjk4rfN+|g$vcy6 zo?8b>R+GZgc|&}Np`r#+RptBJCMqyyd^M5|iQ7yV?nenSTjRr{ZA2SJ)Z+JQ2 zbHgEQz9)1mud1m$WjCEuoAK&XF}g#EZ?nuhX!XwxtJh(9ILKWI5IuKn*^GS9p7@gJ7@6CkRt2lB7wsX(+@$f6nq{^ z-|=XV-*hzei zk;^)LNF~>j#tdT93Bhp!i~v+yq9Rhes8E}QAHtOONC^TmQAplNgOfrbLQVw<)5;#Z2X-mdnpZAviK#OT_bMX#?AGd?twHzavs znxIJM+>WFp5=1`G4UOH|ZNu<(i{N*KTia=VPx636e|dJ#{*h;gR>`J%kuCcwva9i? zSB|B{C00+$*HxWr&lM$--MX%-xvPHV63h4Ztw=9qR)f^@wd5tgPwy@Rp+@es0iKnA zxS^|_?44j|wrj70_D5t)cOH^1jF=Aw?TvCem-&sNwi=0R3-i7Vm-nNf5HqfQZ-w*_FAIcCPx`i4rsE=EDbu zq>%mB-DCP{4?BlA$9KdMn|B7u`=_Z#aWS#{Se~uvjibW`Omdq}yECcZoq))8^W_Ay zaGn&^)gozCBW{(XVabI%K!=@r=_JleRGUWl=JA9f8f6rKS!M5QevLTXAIt4y0?>7tl*OWK7i>mQ_PRA6!%QNh=th!7HH zX#RFR28S%N%aVpNVB~fug{2DVc5NJy0|hlz{Uuvhe!qTEKT!{L^7dr_Gtjdh;Bq`kd+Jw55N6E`g4#c;IktoUtl@(bU^3W8S*OZNPBF|R&YkSu3xk0Skj{wp*)O& zQL**gm9{bhSkIkGul7Nkf;aozqCF_M- zBovc{i>6<$bQ>PI6~(mlaQ1~v(xDYXr)G*2MpC7B%74mp5eJj@L#XtU)XWUl-S%Dx zou5$bWARF(nV}>M5S*~fqh;XC+tqX&``!%$rPW9mU5YOBWH3y_|ZcM7zvJ>N9mPI3+0!&8ac*A(usJ*NnyCw+(OAQPg2=60rc}1PH4x=J*Kb<287(BhhPa{Zk|C!8 z%0qLF9ucAd#XP?Uz)M#F7a`|Qs-Io&L_EU_z;-xpMQAB%`WoR(#J!Ap zN8{&8A}Xou7vXu)?-BO7g%`tlRom7K)49*i?yJM2l;xE!wxmh-V|EO`{K4*B_iRPD z-9Gsb&9=o*nxgr9`-)61F*~4djlv-L4+@G%Gik~sXmVi(CGMMd^jTS@*mr%K(?g!q z{Xi!+zuS=a!I9S>?9h8Qh_gP?Oa!fA21%{q@y4!R;rg=$D!sPttw0Z>fwj zW}XLluFp1{?2v)dK=WEdG-prea+~0>r$kgv<+Q&587=^U`zL^mdh=>j1eNm*fw2#n z{@GCTycma248B6Ak}5#??c2g@scF1yXLVlc$pq^v5fa+4}vnpWo7Kan2LdBcFMA*1^#o10G#)eSM80(*}}Z%m}OB=iTaD z^E(p#vEo=?pZu%7c0R}U5%zH(U}OX%ZL=zt07j8>A0Ff4sepl_6{hm%kHZ6DAgHCT z*<-7vnif~JbTO*1w2wh3jslhK^4IOCvXuEh5@=xhc^n*X!LC$ghK(Uf3Vp%y93@|Z z4${M&+Cy}(@p(nPDY@*+x&`L<04l#PC3lxssJ|cN&qpB*G3=FA|Ln2-7S1nhpH$xS&VyHTAXV?{jX;JdI9ei#3p?v{9+dj>>&)Y^)rb=>1 zp|au)%|fhoLRDr7jCa^*9s~~mMlBae&dBwpp)~9$N7xBnuvgWCDNsB_#oAeHGW@Qh zL)m`723J+wQ~7`|Ygis6K?Gy<%pyDaF56K|5Q@7+XWj@;Y!8g(oYX2MclF4gOzB84 zFoO;{)~@N}hUp2V06*XmxlCo%Gou;{nw1!z!!-$vAqG!gg@NNH!=(0a7~2kNW?VSh zrbZyi3{VbRe4@$dTAXI(r29ylVS6xeD;o%(EHYA#TzrNV_HG1L3)`9?nVh| zO&=BNrR#Kv~bUETw{kKW==3T!Y+vKz_F*oMryVbQE-Et zPg`wl=(heFDZ~)GGZ%UZ(ws-)5|PGL+>E)$yS0hZg%=((Ve+(?<;Y&`T0&Q%;V z&r?<3)Ge@eQn^8wK-b-D{qPuWCjwr*L%(omeE@g(7i8%0COMSQCA`!>DD8=93jXXB zOIA)MVglc+iAit{di@B_bY@IYOWHs{X1ZDqj5z6iXWvW=WLo*XdyeixneIU%lj17O zN@ff?3|70+(1!IHO=C?i_L@&<(-d1FS=n4zCKPL{{sH=MG&2YriIyuY!>xIJlHT8o z;vjrXg_Q>pKHUZ`&**))VSg>AA`e`Fj|sBL0fUULI1ezoFaD|IZ|GRHHRRqg%Bdgc zjPrS;oq;d7LV1iK^WOwyP$O=SZTZuSlNz$G?KD)h*=@e15E!OP-T>N-~y?kf4UJ*is6= zK`GlWf|4 zU(t$2_k(=QyEc}=12YN@r5aRe}YYtF=Asd{E+)R6u96h%wQrh}#p< zNEO331QpOWmH@6keti7$Ayni1=;r)Yi_l?7W0_>04dd;Uyef^NsH%UZ27c%u@T*_` z0qD0#s=amZ+l-cR5d=2^lRnVm?}arp`}9Xtt}scwvUptTqjBK&Rl(o^VMZ&j{%!JO z5mP(+Bj=rtvZ3mIfL{r{9o19H%~!{9IJ1^WF=?*GSLfCww-0o;qP4gSteG1L5xjMW zPT=pStViy{@z0vtYzv#<6VH;#7Ci#+K3#Pwc|%Xa$X!PcRR-S~S|s;~!o+lT|bb+x6h$FWOq3`vvbTDZTH-zhLE9UN=MDUK{(PGpkuCW+16 zWSLU0nCFi8%E8OA&JZlmXK3N6qpZVY`ueTrSD)6U%R+@(^9w;t?`{l>LPJZbTBIXB zu-m-7ad#^ynx)iNo(U>tm-CbwH|Way!)J!^T~KbD284JG5MoD#FXv>eD4UFCusA8F zWE%&w#Ps}JI>3C3O3HQX)|bWS-dMuX8he}AUE#*^mhPacwrdrcYY#>MufocxZR9XM z!y;7J3r5kmsAe_g^b3NWD2JQ zH*@M(@&nvr*Tmnx{=|%$p-w3^cqwQ?YO((Pvqo-#C8+bOT4m-i&_>*de12#TRqeoK zTG|4%;t6bFJJN}dy4AY8VP3mQ6?-|d-P1W1PbJ%U1On;mvz^pE0g`9)&$08_``NaV z?2UM%<(g{cPcsT!-bvAHyDDz%pLf#c!?)K}JR3TvB^^eJi)EUP0VG3G9lHMv5zL9C zF$tLl05ufcAtiWz`ikAewpfD!eo{M`hv=>xIW}+Had%k4D8}6FY)jmcKH#babihHD zMa(tX3+7!^hc=iMiByc{VO`9m5@4KXcuO_TS6qr}9B$lyru%Sn2_9uSk^(<}kk3(K z_91~_n!amcw8+MMK+lNlh;4oMoD)hY9a0shD$04%K*0w+indNL&B}+L2{wfJ%_{No zPLfjW6FHTR^Jy=Hm4780?*5i+u(XgYLfljvu!-pQxTR^Ch~yji zq;t{E_%1*0s15_pS{oY+%3?&V3&hW?hYn9F`wN6cdy;&kSHaVOe=AMOg9A;RGfVIL73{lxX1;+(%$*xzaikGmxqllEPQZg7V-7( zzRnhfk2|_{3mQZ%7&4oBZP2XLekRXMbMnPmEC_+W?!@jX6}ZT39w|A5Ct}GgFfn@6 zVt_N@kQrxfXTx*Q7AC04^nlWHaWOs7XSKH%xGk$82zYsc2y$}Lcc!2h?ZFsZC5Vvd zjyde6dgVB&#+A1^hQI5xGdJ8sV8L`G+$tL!HYzAK8$Dgruo(}o?HPLf9_)_n2op=u zy7@A#bU~+EMmE~c(v#TG{v#Rg!}255_(uP}kUsNk`{?Kk8l22&;QHL$z{ob690 zn+9W|-|9cST4l7gk|d;90bN>9aHcEBnrGO50->Asj1M{LR^;U~b&6%z3py&Ncw)>4 z7@n{hTb@uuu;ge9M(I*_b7O5T>;p{gEU3H?X`%CQ&Z4hD{<4uV7-4vHlnY#=lZ_ngCyWn_v*1;C z{;fiQK=RD5OexK8H3CoWzd^CJ;q&+FW|{TdLY+466Rs1!p5F~jbBV84hV;T_ncctZ z2v28@5hE#;W-b{J4;E7q&gk;(b2MU!9we$$5fv_dDEdZbKwS{&!p&pPXka7&j>j3g zdQL}hHkHVg^$6z`6i>TUZkMVV96S`=qmtNqcW-J72sdsAG5F#f4y~usa`X3KpVoyp zq>)E1VP>sLQwI|ssL?fvRWL$&r@mVdCFy=3mNjx!Y&vY%)N3NiYtvA7bwEob5zm$5 zUW$y*6V7)D;+oCA9~N&ewN?LTWzRuk(}EF{tZq+LVyRl!FQ-`wm>n%&+Bjh4J{Y0H zCnyv>2je(34omg~@K_;`*;X0lIyuHOY>Vs)yc9>V=YT~Kbj;!q39L#Iidp0D?2UJH~ zv5x`D^RTvkdh+GG-B?pP!Yz9= z{y}#MNT%CNpygTb$U)AW1S5f?d1D6>gll%~9t)Q~T@X6mySJ&kjkoW4XkQVXh>a<9 zF1kV6GCR!O6UY5KnuHYpg^AexR-|(KX6r%{R9cMInh$pX_`xD@dfK^>)Y9eN(_%e}Tsi79)T(BT zJ*(Hlz(10t)ygE{{sDsP_Q2wIQGu+k^Knj&10`~Gn1Sx0iI1IZ5WF8IlGWX@VMDl% zP(*SuGW}QtTgTxMtcCF6*ihRb}#7t6C;UQ)Kq2PJiVU!(e50MA^2sO*=PU^Ij(m_0i4HJSstZ{p>NF{j3W`VX1Bkiu}P@ZJSghjAaE=lbPuCO zp3q$&JCsqD=R!fZG)lu{{2TZQC$>g|;elw$yNn7jPiLK{k@W=k4-fJzh zuuyEAh78^<#Yik1fz6yG8(#LJ%10M|9FuT^~?XJ_zg(|ZcQh3%IBr_2qCKA ze0aNeCBA1&FRWb*$CouaZ|o#)o0XjG8~6G)IWjF)>hQZo3Q{q7Ryk2ZX&g+I+a-k= zcSn4s9D2M)nvt9aXu`b_Z?uoieT~`ub(_pME7dT%*w?iOr^*+D-Dho1V`zE>s z2=PYee2IP3%CH#>%*g-=o^Y8c_zZ2mVtv+}0)*e=q0G0Drm9u8aYZn~%HZ%rBNp?x zNmK8YQTh7YaxJkWJPo@m)Y6z|pVr))H>kPX^)8HeKZjbAJPu$=e0G#m*&>_(nrtMj zoxx^B51mi0QYMkeB9jz*V<4dH=vY5bOYe5zg-s4Wih8YRReHrb{<>cNzS(VSP;B4$ z4uxLgFfJ<5r+rjd?sk?patl%aXbfDdw#WrDpkTJkD~!++v3(SEEo(tKaMW)%?1E_v ztgvQ5wfUMWvM%VZB0$C(1QlE01EWsvmP=8WsOS$EQHV}msB<47-f>n~xMsKzX+{9!_@_YsDHm+DdRv)m2mTJZTx~M*u4Kj&tjA5x~a_0FK=8F<9&D zH_ea0tih=fcF^OG6_69T*c1!*&9FOmxUy@qzgtPbzi9bcl_yZ-%>(2w|UTbn7Js}BGiDsH=FwGzI(ipQqIaVT>^~q9Ckdg&( zfCLM#ctb8Gca1(Kr}xIQV`1F4P|e|C@nZAE(3BH_rr9StCxgDqzdQ|c@!E+V{!$_$ zeqTBDQjif;JvS!5^gz{pkXPIh;w+458Z=uWe(c+{+z(R;kRx zl@=~Y&q(?lY*@>|{V2vz6^GoLr-6j6gX?qU%3N~ z`EHR%=20wy+B0}svVB|45W`BL$(5B)(;9Jc0cm*%EQd#LxsRb4QXynudpjMAx`IE0 zY*{d+O6<5qs%1@ z@n<8jOYR?4`0r@AkVJ=>EPL(!iLH~*PM5m&;#*wS1$D0VaVG4L3!&;wXf-C&YAbXm z+8HRvKMnFdcA9(pi8YPHEA&bJ1aa0(+lA}i@4u$=qEymTg$7{sD>kw97D32O$=83$ z^Z@BD-kjR)Pdj73OBFputb)kQ20b$$cvg#~FM?k&{opc0s`3){Y^AZu^qx9P zpCal=NraL_o`NcIwPEEb1;e1y5{yf#7JSWmOLBoq_to2HLl_4-6KB&q6oayCv!2^2 zZB1n-DMp9c9NVePKlluta$hnFAbI?Sh@e`3@KJ3EcU)5r>k*rM&iZoCvabd9q)O&# zNVoV3kA{OZepYv-6d8~b9AK&r49p>7N}~dtOgdL|X(SGqyhsu)LCMzjkoT4$@1tj!=@R{LJ+q^3Q}x&4cm87jD)YP*K^W|pT+;iiy% z(3o!nxJgF3TYM~Ec>U#oV0ghkml)JGi`V@;NRACzz0_mxFlEN8x1rnFU5BZU)e{%{ zrYJ+W&p-Tti1YHA*q8QEinlQ!5stOkm`CubOjxC05B($fUQ4V^TM|Qq-v9)d+F9)4$Q)_`!BQ z?u#HkZL*RcW0M9=a;<7`FJTRrafl4QgM#cPGD4J5!Jn4ixSn}141~s&{lHC#j=n~I ztRFZ60lc|AMak@}I@61uM2Q5b+aW~(n)g&I|D?mkb z`_Jk8 z|Im-w)_!aeDpP1>F#gmq+gC^6sR%*cU(ko0<#NztS|iJQb%gdh?zWx9(MFZI3#4>x z(lzeQ{5XgUkGj6Zezh)mvBe<3K#)x!QMeiwmG)**Ei8M~x1j)hSdDNZmG~7e6W;7Q908VT4mZUAR5lb!VqNOSi7~%F{ob) zuF8@U-VD+PrxOhExlGn<)&{2T&qVu`cg0INOpj*iPx-I>V+UCq?MWE{2AOLa#AUu+0Fh zJ{{!9t&2X3je&komD|)o)ZZR@jS7)Q9YqVcv3laGx0s#K0`M3y|%FSEP9uDAJdC#5121)<}$~SZ`O53Gcfu?zSwL z8SSEX%XJV9m*xMgLV0YlNhe%*>pS8zd~)>#T*{Jhe)*9{c>SQ>V|j41MpYmeW3KsT zV8w9p^OX0;f>>y0WG@+2?se`0NSR>uWY1!E%U)~ZfL zvc_HQ)2m7MV7X6e0O%J@t~NFr&rRfp(ua2pb8aRN(h}BcIT%`4aX!?aJO8ZPJ@+y` zj2qt*F!3}e2dS>_GvB^I1#qMW@688D6z0B;0(=EnrPJ<7bdXZgxfSQFiDCWLubVq? zK0<8%ej#=@J-+jHCtsqTbB*NcFwa;FG(bBeBS?_xUuR8hg!#=%{PnCget~l_zn!&u z^Nqe2xgH-pyPmIWw`DL4V%D|UEf*CG0+u<;x~20>ymwB~=-gdxz=h#PnkXc%hINVw zieVLAzSAP$Y+1gJbhWa}hOko$d=;uP1&Rl<5s6ikU?pax2t(5rF4~}+K9Ut+>nRD` zJ+DOiOj(|b1iGoDf{x#f|;)?z=q0OT}FaX}1$FP%oZO#SC z(Zq~Q1>`xNb6(ndth8I&K!HrlUCaPLXzpRJEZM{{ z)`6YcKJ>N`$R_OPDftg*|J?) zeb$=o!|U$LLDm5fq1l5F>c^dSkF#fRA8dv%)JcygLwjyk4q}b<$nMb?x*Z|_x;*AX z$)jmG8t3*Xm5c-vSfN`QYn-Mg$$hv9Rs=h0Z8lPc@*Qhlc<73VYd%WaQOhk`w8<8m zKg?LF&QhQ?P7gA%hX4&0MzdFblGFh*tVjjCpd7#VAFX~r&tCWRuMjkz<=<)f+mtha zLm%~8n!L&fQ!68>_v$SGt_zH}%~)(t)vF;YcVLBYQW4=&hyLisCTT1X>WqlfyH&dK ziAgZnZY_Ro1EVI$ONo=eC|UF4^~Nr|0I- zhstMXyY#SIkLKFvN9tK#iPqByamCvwkq2G20_HPphlYLY(~-3kmtGo)3R6y)h3aQS;%k{10Ln%5 zF3Q2x{XJ`yRsmlTlS_duFQ{A5eq>=p?pz(YT9~Q$O|h3MZTE5xLNCKUFpz#*_?WiZ zH!I2};N|x1q%a0S<66oPRxgu7RW{(yB>>p;yDV?_jTN4{VV}FM^7%!wWSR~&?x22JM!BLswB=WMI9WKZorbPD0AeR{`skQ=DrZb5uMuJpe18ZhCfUo?{) zOZM?Uh`8eWm%lQsw6wovSc5JTaLEMZ{0i8D8M5c>>AAC>QVAeV{y12;*YJ=DB<<<9 zj)*p9D<7ubw0`F?4fj&IBu2*EjE63R`<1e7G*mjzM_>8zRhFH;K<+NFT4|E)Kq;}b zmk6KmG80u@1oGm>3p+=b%s>t9C`ZIK%U%IlkxAzY-rD9=cY+iJ(ix&ztQ9#jY`Pns zf>Z;YX%89Dk{-Jyy<7UIbc{)2Y$J=oM8H5H%7T2wes=IL#6lFSOJrJDDN@D^ zCMYJm$nS&35YDECXPJ7Xv%J%e4%dyeKU9nQyU5R>Pv@=Q_E_sFP&DXnaq7#JKiRfikkVJ;*qUQ&I zLw#INNMWPZU6Js@ebg*~BihZ1+!nrk~ zNtpD+Cu8%{FA2iqt8}2ld6g+O_@d(%MtLH)apiH@&!zo#Qu!|9oZ6a zJ(d<5K73>g-$xgrzkSAoTQs?w4dR9coEj{A*6NcRcIL-aPDR$N9?5^b*4Oen!Ldq? zLiF}_gtGakQBEstI0cSv&_FNxN#&^Z`4UIuvzfgPQvz8E4Ee5C}Stb{&`!TDTb%h0c`v7F=_j zX01Pb`NofY0zu3Ms#7Ys-RKKP`gh#Pn?q_AI~?E!W6jFIR04e>DlH5ZZAvmWTfF>c zx@jM@#2al^fCvxH3C&D^ic92TrlQY@2Cl;ViQz^|xsqs@4(JaxhDJ1R7>USsM)G%X?8>`sH8MB2Qc83JPCT|@pQ=f8E& zVpxAR(@X&rq{oeS9rACqqz~SqOLx|$KHJ$BIxLt$HRoPm2JI}?FCSp1aLl8v#txTr z)0DePo2=?a7U@hYGh$5pZ^5zC*B-n*2|BTFk@ZaO8Eug4Y15~*&-S;F(VvBv>N6US zmg(=M_Yv};DswR)ZcM3TVf8GR#7?tdl!Z~_dFZX0Wxmg=kz2R4!jieAXk>zOu)75$;JAZ~U>>*eLCFDVNnfS;mU61!-HF`+nX{vlc)eJK~BE`#5W-aVS{ zJsDOk5rAS0D;mui!@73`QHRfX9mVMY^YSLXIE#wM%r|nbmB(2pJ!R-Sj|eLTi;Rj@ z-;a*ox<&tOb(upt%xDdT15&`>lNwetbc#r}Itv?mhfEj3E8NJ0!#R~C(8Fn2ko}g} zsRtQwX_o}v!@O4-Ct@IVjF#d7N=ow=>W<8f9be74;3o;gXVCBEaL6nI{?4BEGdhsu z2F-naLrBK#`|QrVb0D{_w|l```DNX929s_%_`(4U*NkfKb}xkD%v3vo0NI8Ryh}Rj z>_l|3@1r61Qb1Md|JpVK6)zP)#S0}9L$8mS#9}d?%luDLE%%AqKq-8)>y+mu(1|`B zu|P&oy^HP_E_+6T>jv~`teGL}CC^Ns;ICOdaNkEE4HuH_h&2^+_|x`aJEz8t7~bmj z6GMb9>Q$|ke2`acc-<5AO$hC%hrZqqmebQd(_*U7OW>UzbNl}yTOMUt>^V57K|+} zAu!VWO9GjUbZ`xNe&bp8e4n5g?IKVpRZb>si0G-AT~$?}V7yYkByK`Y*-4R-+ipTZ zMlop2m8dI%klA`^;&L>X;?fCx3#%=@_mE3ExyDi9x#=#`0$C$F1{0T()cDyn1-m76 zsq6A7;+tq;ldYzZxt(?IJakq00Ak5ZU_vG*Y_qCvjiRwf(&MgZK-T8%8O1L#Kv~eW z^$`og+7MvmUq;K{$6+QrrRfQV7o{fldkbi+Y(+d!M+OpyAJfo4R9;E$+HFfA<6-8q z-OI;i1;CjWRVWwhJ>LP7VKy2k{rq}0)M9lWHy?ax^2(Oem~#~v96iX%(D$y=zJLe@ zhe*yGi*~Ovfbv~cp*H*7m>=u+M;*tFbGpAZ&T%}_t9S!d+NEflUTilDxKOzxVp{a& z!E{)oQj){4nO7Pw{7Y%&a(v#1Zn)GFzR;sOmDj0hM)U8tVrhI}Y`q8cMG1P=SH@?* zUIpFq`tC&WN|p5tQ)v-;%(V#cjJl&^O~IT@64%bE>mTCJxes>BaeW~H-RSF+!PMiO z26V)C*_BQ_VcgmTVz&|CBGGcyemSf_h#$0J(2p zdRqJ@5+H%K_d|%H+`7V$81bWIvc^Sq+~71k*G*!_Ul837zd)K?rN)K)5UJaz*tW4P zwr7LmqI|!ooHMpoCzkX2w%X#4I8a(Dyb^GS5*cm^rAcjm!3%r1H0#!?@Ke)BGHD}Yv z07WMXdl$%#^?ehusrj-h!(UlLeqM+dHv@hl|AxPnVaGk+Kv_&yNVy}2k9H7MU;OHn zChg#c^CB9TQEuJ5?wcD~97+}H)~>2m#`of<_6E5IRg!rw{20X ztTOn$D0HKfh{S=vbhJRc4{M4JP;OS0LT5%<+XLVvQ8U2@Becd&R)Srka?~EvM^KlC zyzGe;VyY9T)ZyJvVCRCkrAc{Dj?y9b{cha}Z2&xvQAUdK$o!^N zja4JuNm*d_@t>{#YJ{gGx`Z!Tr2p0>e0R)YQ2Dz{_-U^z3V{qWc012(mG~^?>4y#m z#(A4B4^kscswO8I)#XX;a=S{Fq4%Pu2QZK^ z+s=vA(AgUd6*7mm&sJg?mdftBly`3jiOvpawZ@0-)JRh5`)+Pl1?y7&5*>mkp1&e><5eRlnADa%WA z(0bYRvYRH?7@NkuE{L;F%&%lQ`UXNF`b%G;mq1Awg?2e3daqO;>JyP8P32eQos3Ae z=e`tnV5A*kT4ZXc$PqC#Xf@EXP z-d%TDfEG7Y$#$(nxcov+bYGdL%^{hVb~-wXwTfAJl@FN8rmicxi_iyUM!c~ycCfcj zMqxY;%ˆ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 ChRo^! diff --git a/prebid-server/developers/add-a-module-go.md b/prebid-server/developers/add-a-module-go.md index 88bd17d86e..7d3b30e766 100644 --- a/prebid-server/developers/add-a-module-go.md +++ b/prebid-server/developers/add-a-module-go.md @@ -131,6 +131,11 @@ These are the available hooks that can be implemented in a module: In a module it is not necessary to implement all mentioned interfaces but at least one is required by your functionality. +Notes: + +- Modules at the `BidderRequest` and `RawBidderResponse` stages are called in parallel for each bidder. +- Modules that want to change the request context in the `BidderRequest` or `RawBidderResponse` stages should also supply an `Entrypoint` hook that returns a module context with a [sync.Map](https://pkg.go.dev/sync#Map) entry. See the example below. + ### Examples 1. To **update** the request in the `BidderRequest`, your implementation would return a hook result with a change set: @@ -238,7 +243,30 @@ In a module it is not necessary to implement all mentioned interfaces but at lea } ``` -More test implementations for each hook can be found in unit-tests at [github.com/prebid/prebid-server/tree/master/modules/prebid/ortb2blocking](https://github.com/prebid/prebid-server/tree/master/modules/prebid/ortb2blocking) folder. +4. Writing to the module context from the `BidderRequest` or `RawBidderResponse` stages requires synchronization between parallel instances of a module. The recommended approach is for the module to supply an `Entrypoint` hook that returns a module context with a [sync.Map](https://pkg.go.dev/sync#Map) entry. + +In the `Entrypoint` stage: + +```go +return hookstage.HookResult[hookstage.EntrypointPayload]{ + ModuleContext: hookstage.ModuleContext{ + dealsContextKey: &sync.Map{}, + blockingDataParamKey: &sync.Map{}, + impsContextKey: &sync.Map{}, + }, +} +``` + +In the `BidderRequest` or `RawBidderResponse` stage: + +```go + ... + miCtx.ModuleContext[dealsContextKey].(*sync.Map) + ... +``` + +{:start="5"} +5. More test implementations for each hook can be found in unit-tests at [github.com/prebid/prebid-server/tree/master/modules/prebid/ortb2blocking](https://github.com/prebid/prebid-server/tree/master/modules/prebid/ortb2blocking) folder. ### Configuration diff --git a/prebid-server/developers/add-a-module.md b/prebid-server/developers/add-a-module.md index 010e7cbc2d..74059d93a3 100644 --- a/prebid-server/developers/add-a-module.md +++ b/prebid-server/developers/add-a-module.md @@ -67,8 +67,8 @@ Here's a description of the Stages of a PBS request that modules can tap into fo | Entrypoint | Hook functions can see the raw request before PBS has processed or validated anything | auction, amp, video | A/B testing of account parameters, Alternate account validation, AMP pre-processing | | Raw Auction Request | Validations have been done, but no enrichments | auction, amp, video | A/B testing of StoredRequests, Advanced device detection, Traffic Quality | | Processed Auction Request | Any stored requests have been merged in and all PBS enrichments are done | auction, amp, video | Inject First Party Data, Channel determination, Bid floors, Bidder optimization | -| Bidder Request | The request has been customized for a particular bidder in the auction | auction, amp, video | Bidder-specific bcat/badv, Bidder-specific deals | -| Raw Bidder Response | Hook functions can get access to the unprocessed bidder response | auction, amp, video | Response validations | +| Bidder Request | The request has been customized for a particular bidder in the auction. Note that the module will be called in parallel for each bidder in the auction. | auction, amp, video | Bidder-specific bcat/badv, Bidder-specific deals | +| Raw Bidder Response | Hook functions can get access to the unprocessed bidder response. Note that the module will be called in parallel for each bidder in the auction. | auction, amp, video | Response validations | | All Processed Bid Responses | All bids are back and PBS-core bid validations are done. | auction, amp, video | Creative validation, advanced bid validations. | | Auction Response | Last step before the response goes back to the client | auction, amp, video | Inject ad server targeting, alternate auction winner logic | From 94cb573b998cd427ca97916cc98623959eeb208a Mon Sep 17 00:00:00 2001 From: Chris Huie Date: Thu, 10 Oct 2024 08:15:22 -0600 Subject: [PATCH 232/816] Update docereeadmanager.md (#5651) --- dev-docs/bidders/docereeadmanager.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/docereeadmanager.md b/dev-docs/bidders/docereeadmanager.md index e848218ba2..4d1dee9725 100644 --- a/dev-docs/bidders/docereeadmanager.md +++ b/dev-docs/bidders/docereeadmanager.md @@ -15,7 +15,7 @@ deals_supported: true floors_supported: true fpd_supported: false privacy_sandbox: no - +filename: docereeAdManagerBidAdapter --- ### Bid Params From 848de566c467f8734099cc50ad120a4ef4626274 Mon Sep 17 00:00:00 2001 From: IrinLen <166819146+IrinLen@users.noreply.github.com> Date: Thu, 10 Oct 2024 18:09:29 +0300 Subject: [PATCH 233/816] Video Overview, Formats, Getting Started: documentation updates (#5628) * change video module - section 1 * adding links - section 1 * in-renderer link added * in-player integration (formerly: instream) changes * in-renderer integration (formerly: outstream) updates * 1st part updates * map-out of Prebid integrations w/ IAB plcmt types * map-out in a form of a table * instream section update * outstream section updates * 2 links to overview page updated * 2 links to overview page updated * added space for better table headline formatting * removed part of headline * space added (formatting issue fix) * code text formatting fix * list fix * minor unordered list fix * removed empty line * extra spaces between sentences removed * Update formats/video.md Co-authored-by: Muki Seiler * Update formats/video.md Co-authored-by: Muki Seiler * Update formats/video.md Co-authored-by: Muki Seiler * Update prebid-video/video-getting-started.md Co-authored-by: Muki Seiler * Update prebid-video/video-getting-started.md Co-authored-by: Muki Seiler * Update prebid-video/video-overview.md Co-authored-by: Muki Seiler * Relative link without html * Relative link without html * Relative link without html * Relative link without html * Relative link without html * Relative link without html * Relative link without html * Relative link without html --------- Co-authored-by: Muki Seiler --- formats/video.md | 38 ++++++++++++++++++++------- prebid-video/video-getting-started.md | 10 +++---- prebid-video/video-overview.md | 28 +++++++++++--------- 3 files changed, 48 insertions(+), 28 deletions(-) diff --git a/formats/video.md b/formats/video.md index b19763bb26..9434356410 100644 --- a/formats/video.md +++ b/formats/video.md @@ -11,21 +11,39 @@ Welcome to Prebid video ad support. This is a collection of resources covering how Prebid can help you monetize video. If you're new to Prebid video, a good place to start would be the [Prebid.js-focused training video overview](/prebid-video/video-overview-video.html). -## Instream +## Mapping Out Prebid Integration with the IAB Use Cases/Video Placement Types -Instream ads are for short-form video content within a player generally has simple video ad requirements, e.g. a single pre-roll ad. +The IAB has identified the [four types of video placements](https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/main/AdCOM%20v1.0%20FINAL.md#list_plcmtsubtypesvideo) for the introduced `plcmt` attribute in `Object:Video`, in accordance with the IAB Digital Video Guidelines: -1. [Prebid.js instream video overview](/prebid-video/video-overview.html#instream-video) -1. [Prebid.js: Getting started with Prebid video](/prebid-video/video-getting-started.html) -1. [Prebid Server video ad support](/prebid-server/use-cases/pbs-pbjs.html) +1. **Instream:** pre-roll, mid-roll and post-roll ads that are played before, during or after the streaming video content, which the viewer has requested. Instream video must be set to “sound on” by default at player start, or have explicitly clear user intent to watch the video content. While there may be other content surrounding the player, the video content must be the focus of the user’s visit. -## Outstream +2. **Accompanying Content:** the video player loads and plays before, between, or after paragraphs of text or graphical content. -'Outstream' ads are packaged with a separate player, or the publisher provides a special player for them. They aren't embedded within video content, but rather exist as standalone video players somewhere on the page. +3. **Interstitial:** video ads that are played without video content. During playback, the video ad must be the primary focus of the page, take up the majority of the viewport and cannot be scrolled out of view. -1. [Prebid.js outstream video overview](/prebid-video/video-overview.html#outstream-video) -1. [Prebid.js: Getting started with Prebid video](/prebid-video/video-getting-started.html) -1. [Prebid Server video ad support](/prebid-server/use-cases/pbs-pbjs.html) +4. **No Content/Standalone:** video ads that are played without the streaming video content. + +However, for the described four use cases/placement types, there are only two types of integration from the Prebid perspective: + +1. [**In-player.**](/prebid-video/video-overview#in-player-integration) There's already a video player on the page. The publisher has to use the [Video Module](/prebid-video/video-module) or implement a javascript function that passes bid responses to the player. In this scenario, Prebid handles video bid caching server-side, then maps it to a unique cache ID, which will be passed to the ad server via key-value targeting. + + The player calls the ad server, and the latter matches Prebid.js key-value pairs to a pre-configured line item, followed by the player’s rendering of the video ad from the winning bidder. + +2. [**In-renderer.**](/prebid-video/video-overview#in-renderer-integration) In this scenario, the Demand partner’s response to bid requests includes a [renderer](/overview/glossary#renderer) script, followed by Prebid’s handling of the following: + + (a) Prebid communicates with the ad server as normal. + (b) If it wins the auction and needs to render the ad, there is special rendering activity required. + (c) Prebid needs to create an `iframe` and do the appropriate thing to load and invoke the renderer. + +**Here’s how Prebid implementation types are mapped out with the IAB use cases:** + +{: .table .table-bordered .table-striped } +| IAB Use Case | Prebid Implementation | +| ------------- | ------------- | +| Instream | In-player | +| Accompanying Content | In-player | +| Interstitial | In-player or in-renderer depending on implementation | +| No Content/Standalone | In-player or in-renderer depending on implementation | ## CTV-OTT diff --git a/prebid-video/video-getting-started.md b/prebid-video/video-getting-started.md index b7bed07f67..056f2a2f13 100644 --- a/prebid-video/video-getting-started.md +++ b/prebid-video/video-getting-started.md @@ -30,22 +30,22 @@ Start by reading [Ad Ops Getting Started](/adops/before-you-start.html). This wi One thing to keep in mind as you set up your line items is price granularity. Be sure to communicate your price granularity requirements to your developers, as they might need to define custom configuration settings, depending on your granularity. -#### Instream +#### In-player Integration -If you already have a Prebid integration for banner, you must create a separate set of ad server line items to enable Prebid to monetize instream video. +If you already have a Prebid integration for banner, you must create a separate set of ad server line items to enable the Prebid [in-player integration of video ads](/prebid-video/video-overview#in-player-integration). If you’re using Google Ad Manager as your ad server: Once you understand the general setup requirements, follow the instructions for video-specific line item setup in [Setting Up Prebid Video in Google Ad Manager](/adops/setting-up-prebid-video-in-dfp.html). If you’re using another ad server: -Follow the instructions for your ad server to create line items for instream video content. The primary points to keep in mind as you set up your line items include: +Follow the instructions for your ad server to create line items for the in-player integration. The primary points to keep in mind as you set up your line items include: - Line items must target Prebid key-values. - The VAST creative URL must be in the format `https://prebid.adnxs.com/pbc/v1/cache?uuid={hb_cache_id}`, where `{hb_cache_id}` is the value passed to the ad server from Prebid.js. -#### Outstream +#### In-renderer Integration -If you already have a Prebid integration for banner, you don’t need to do anything differently for outstream video. Outstream units use the same creative and line item targeting setup as banner creatives. See the [Step by Step Guide to Google Ad Manager Setup](/adops/step-by-step.html) for instructions. (If you’re not using Google Ad Manager as your ad server, follow your ad server’s guidelines for setting up your line items.) +If you already have a Prebid integration for banner, you don’t need to do anything differently to integrate ads through the [in-renderer integration](/prebid-video/video-overview#in-renderer-integration). [No-content/standalone ad units](/formats/video) use the same creative and line item targeting setup as banner creatives. See the [Step by Step Guide to Google Ad Manager Setup](/adops/step-by-step) for instructions. (If you’re not using Google Ad Manager as your ad server, follow your ad server’s guidelines for setting up your line items.) {: .alert.alert-info :} **Prebid Server** If you’ve decided to conduct your header bidding auctions server-side rather than on the client, you need to have a Prebid Server account or set up your own. See the [Prebid Server Overview](/prebid-server/overview/prebid-server-overview.html) to begin your integration. diff --git a/prebid-video/video-overview.md b/prebid-video/video-overview.md index 6aa791fc03..69eb164f9a 100644 --- a/prebid-video/video-overview.md +++ b/prebid-video/video-overview.md @@ -14,7 +14,9 @@ sidebarType: 4 - TOC {:toc} -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. +Prebid.js provides tools that allow header bidding video demand to compete with your ad server video demand. Prebid.js provides tools that allow header bidding video demand to compete with your ad server video demand. Prebid video demand can be incorporated through the in-player and [in-renderer](/overview/glossary#renderer) integration. + +**Note!** Learn more about mapping out IAB use cases with the Prebid implementation specs on the [Prebid Video Ads](/formats/video) page. 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-). @@ -38,23 +40,23 @@ An introduction to how the video ad format works with Prebid.js. ## How It Works -### Instream Video +### In-player Integration -Here’s a high-level diagram showing how video header bidding works for instream video (with more details outlined in the steps below): +Here’s a high-level diagram showing how video header bidding works for the in-player integration (formerly known as “instream”), with more details outlined in the steps below: -![Instream Video Diagram]({{site.baseurl}}/assets/images/prebid-video/instream-video.png){: .pb-img.pb-lg-img :} +![In-player Integration Diagram]({{site.baseurl}}/assets/images/prebid-video/instream-video.png){: .pb-img.pb-lg-img :} 1. **Prebid sends bid requests.** Prebid.js code loads within the page header and sends a bid request to each video demand partner included on a given Prebid video ad unit. 2. **Demand partners respond.** -Each response includes the bid price and the video creative in the form of a VAST tag URL which returns a VAST XML wrapper. This video creative will be rendered by the video player if the bid is selected in the ad server. +Each response includes the bid price and the video creative in the form of a VAST tag URL which returns a VAST XML wrapper. This video creative will be rendered by the video player if the bid is selected in the ad server. 3. **Prebid.js caches video bids.** Each video bid is cached server-side and mapped to a unique cache ID which will be passed to the ad server via key-value targeting. The [Prebid.js video creative]({{site.github.url}}/adops/setting-up-prebid-video-in-dfp.html#creative-setup) configured in the ad server contains a macro that references this cache ID. (Note: Some bidders will cache before responding to Prebid.js. In those cases, the bidder will provide a `bidResponse.videoCacheKey` and this step will be skipped. See [Notes on Prebid Cache]({{site.github.url}}/dev-docs/show-video-with-a-dfp-video-tag.html#notes-on-prebid-cache) for details.) 4. **Prebid creates new master video ad server tag URL.** -Prebid combines an existing video ad server tag with Prebid key-value targeting pairs to create a new master video ad server tag URL. This URL will be passed into the video player. +Prebid combines an existing video ad server tag with Prebid key-value targeting pairs to create a new master video ad server tag URL. This URL will be passed into the video player. 5. **Video player calls ad server.** The video player loads the master video ad server tag URL, which makes a call to the ad server. @@ -66,29 +68,29 @@ The video player loads the master video ad server tag URL, which makes a call to b. The Prebid.js video creative returns a VAST XML document containing the cached video bid, which was returned by the Prebid demand partner in its bid response. c. The demand partner’s VAST tag URL is rendered in the video player. -### Outstream Video +### In-renderer Integration -Outstream video is displayed in banner ad slots using video renderers that are provided either by the demand partner with the bid response or by a renderer that the publisher has associated with the ad unit. This is a high-level diagram showing how header bidding works with outstream video: +In-renderer integration (formerly known as “outstream”) implies that a video ad is displayed using video renderers that are provided either by the demand partner with the bid response or by a [renderer](/overview/glossary#renderer) that the publisher has associated with the ad unit. This is a high-level diagram showing how header bidding works with this type of integration: -![Outstream Video Diagram]({{site.baseurl}}/assets/images/prebid-video/outstream-video.png){: .pb-img.pb-lg-img :} +![In-renderer Integration Diagram]({{site.baseurl}}/assets/images/prebid-video/outstream-video.png){: .pb-img.pb-lg-img :} 1. **Prebid sends request to demand partners.** Prebid.js code loads within the page header and sends a bid request to each video demand partner included on a given Prebid video ad unit. 2. **Demand partners respond.** -Demand partners respond with their respective bids, which may contain a video renderer. (Publishers are encouraged to associate their own video renderer with each outstream video ad unit to include video demand that was not returned with its own renderer.) +Demand partners respond with their respective bids, which may contain a video renderer. (Publishers are encouraged to associate their own video renderer with each video ad unit to include video demand that was not returned with its own renderer.) 3. **Prebid.js may cache video bids.** If the configuration is set up, video bids are cached server-side and mapped to a unique cache ID. This may be used at render time. See [Notes on Prebid Cache](/dev-docs/show-video-with-a-dfp-video-tag.html#notes-on-prebid-cache) for details. 4. **Prebid passes key-value targeting to ad server.** -Prebid assigns a unique hb_adid to each video bid/renderer combination, and passes this ID to the ad server via key-value targeting (along with other standard Prebid key-value pairs). This ad ID serves the same role for outstream video ad units as it does for banner ad units. +Prebid assigns a unique hb_adid to each video bid/renderer combination, and passes this ID to the ad server via key-value targeting (along with other standard Prebid key-value pairs). This ad ID serves the same role for [standalone/no-content video ad units](/formats/video) as it does for banner ad units. 5. **Ad server chooses winning line item.** The ad server chooses the winning line item. If a Prebid line item is selected, the Prebid creative is returned. The creative can be the standard call to `renderAd` or the Universal Creative. -6. **Prebid renders the outstream video.** -Prebid retrieves the winning outstream video bid and renderer from the ad ID (hb_adid). Prebid renders the outstream video into the banner slot. It is up to the rendering code to retrieve the VAST, which may have been returned fully-formed to the browser, or it may be just a URL where the VAST is cached that the renderer has to load. +6. **Prebid renders the video.** +Prebid retrieves the winning video bid and renderer from the ad ID (hb_adid). Prebid then places the renderer into the ad slot. It is up to the rendering code to retrieve the VAST, which may have been returned fully-formed to the browser, or it may be just a URL where the VAST is cached that the renderer has to load. ### Long-form Video From 7228af6c978bee8ab3f00717c6a844bc66ee4fbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Boisvert?= Date: Thu, 10 Oct 2024 12:26:39 -0400 Subject: [PATCH 234/816] PBS: fix very minor annoyances in the Prebid Server documentation (#5645) * PBS: fix very minor annoyances in the Prebid Server documentation * PBS: fix linting errors * Update pbs-endpoint-admin.md thanks, but we've been trying to standardize on dash as the list symbol --------- Co-authored-by: bretg --- prebid-server/endpoints/pbs-endpoint-admin.md | 14 ++++++++++---- prebid-server/endpoints/pbs-endpoint-cookieSync.md | 2 +- prebid-server/endpoints/pbs-endpoint-event.md | 2 +- prebid-server/endpoints/pbs-endpoint-status.md | 2 +- prebid-server/overview/prebid-server-overview.md | 2 +- 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/prebid-server/endpoints/pbs-endpoint-admin.md b/prebid-server/endpoints/pbs-endpoint-admin.md index bca308651e..a1a824c098 100644 --- a/prebid-server/endpoints/pbs-endpoint-admin.md +++ b/prebid-server/endpoints/pbs-endpoint-admin.md @@ -10,13 +10,14 @@ title: Prebid Server | Admin Endpoints There are several endpoints on the special `admin` port that a host company may utilize that aren't available to external users. This port defaults to 8060, but can be set in the `admin.port` config. -* TOC +- TOC {:toc} ## GET /currency/rates This endpoint exposes active currency rate converter information in the server. Information are: + - `info.active`: true if currency converter is active - `info.source`: URL from which rates are fetched - `info.fetchingIntervalNs`: Fetching interval from source in nanoseconds @@ -24,7 +25,9 @@ Information are: - `info.rates`: Internal rates values ### Sample responses + #### Rate converter active + ```json { "active": true, @@ -109,6 +112,7 @@ Information are: ``` #### Rate converter set with constant rates + ```json { "active": true, @@ -119,13 +123,14 @@ Information are: ``` #### Rate converter not set + ```json { "active": false } ``` -## /logging/httpinteraction +## GET /logging/httpinteraction (PBS-Java only) @@ -134,19 +139,20 @@ This endpoint turns on temporary logging of raw HTTP requests and responses, mai Interaction is logged at INFO level using http-interaction logback logger so make sure this logger has at least INFO or more verbose level set (logback configuration bundled in JAR file sets this logger to INFO level). Query Params + - endpoint - endpoint to be affected; valid values: auction, amp; if omitted all valid endpoints will be affected - statusCode - specifies that only interactions resulting in this response status code should be logged; valid values: >=200 and <=500 - account - specifies that only interactions involving this account should be logged - limit - number of interactions to log; there is an upper threshold for this value set in configuration - bidder - name of the bidder whose adapter request will be logged -## /logging/changelevel +## GET /logging/changelevel (PBS-Java only) This endpoint allows changing org.prebid.server logger level temporarily, mainly for troubleshooting production issues. Query Params + - level - desired logging level to set; must be one of error, warn, info, debug - duration - for how long (in milliseconds) to change level before it gets reset to original; there is an upper threshold for this value set in configuration - diff --git a/prebid-server/endpoints/pbs-endpoint-cookieSync.md b/prebid-server/endpoints/pbs-endpoint-cookieSync.md index 1ef335f891..56a2ae1eba 100644 --- a/prebid-server/endpoints/pbs-endpoint-cookieSync.md +++ b/prebid-server/endpoints/pbs-endpoint-cookieSync.md @@ -9,7 +9,7 @@ title: Prebid Server | Endpoints | /cookie_sync This endpoint is used to initiate cookie syncs. -## Invoking /cookie_sync +## POST /cookie_sync Generally, two clients invoke the /cookie_sync endpoint: diff --git a/prebid-server/endpoints/pbs-endpoint-event.md b/prebid-server/endpoints/pbs-endpoint-event.md index 19c1e12b92..d8a432d34a 100644 --- a/prebid-server/endpoints/pbs-endpoint-event.md +++ b/prebid-server/endpoints/pbs-endpoint-event.md @@ -34,7 +34,7 @@ This endpoint alerts Prebid Server to process the event and informing the analyt GET https://prebid.site.com/event?t=win&b=1234567890&bidder=rubicon&f=i ``` -## `POST /vtrack` +## POST /vtrack ### Intended Usage diff --git a/prebid-server/endpoints/pbs-endpoint-status.md b/prebid-server/endpoints/pbs-endpoint-status.md index 892299925b..231a94942e 100644 --- a/prebid-server/endpoints/pbs-endpoint-status.md +++ b/prebid-server/endpoints/pbs-endpoint-status.md @@ -11,7 +11,7 @@ title: Prebid Server | Endpoints | /status This endpoint will return an HTTP 200 response whenever Prebid Server is ready to serve requests. Its exact response can be configured with the `status_response` -config option. For eample, in `pbs.yaml`: +config option. For example, in `pbs.yaml`: ```yaml status_response: "ok" diff --git a/prebid-server/overview/prebid-server-overview.md b/prebid-server/overview/prebid-server-overview.md index 32230037b1..1cb34d1842 100644 --- a/prebid-server/overview/prebid-server-overview.md +++ b/prebid-server/overview/prebid-server-overview.md @@ -42,7 +42,7 @@ Further Reading: ## 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. +Unlike Prebid.js, Prebid Server is a server. It needs somewhere to run, and that somewhere ought to be scalable, distributed, and fast. ### Hosted From 02a1fa762be1b23928fee25bb64f0e4e12a511b6 Mon Sep 17 00:00:00 2001 From: mp4symitri Date: Thu, 10 Oct 2024 21:59:13 +0530 Subject: [PATCH 235/816] Segment Taxonomy value changed from 501 to 708 (#5648) Co-authored-by: Manan --- dev-docs/modules/symitriDapRtdProvider.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/modules/symitriDapRtdProvider.md b/dev-docs/modules/symitriDapRtdProvider.md index 34f5207887..0717bc10bf 100644 --- a/dev-docs/modules/symitriDapRtdProvider.md +++ b/dev-docs/modules/symitriDapRtdProvider.md @@ -47,7 +47,7 @@ pbjs.setConfig({ domain: 'your-domain.com', identityType: 'simpleid'|'compositeid'|'hashedid'|'dap-signature:1.0.0', identityValue: '', - segtax: 501, + segtax: 708, dapEntropyUrl: 'https://sym-dist.symitri.net/dapentropy.js', dapEntropyTimeout: 1500, pixelUrl: '', @@ -73,7 +73,7 @@ Please reach out to your Symitri account representative() to | domain | String | The domain name of your webpage | | | identityType | String | 'simpleid' or 'compositeid' or 'hashedid' or 'dap-signature:1.0.0' | See the section below labelled "identityType" for more details. | | identityValue | String | This is optional field to pass user hid. Will be used only if identityType is hid | | -| segtax | Integer | The taxonomy for Symitri | The value should be 501 | +| segtax | Integer | The taxonomy for Symitri | The value should be 708 | | dapEntropyUrl | String | URL to dap entropy script | Optional if the script is directly included on the webpage. Contact your Symitri account rep for more details | | dapEntropyTimeout | Integer | Maximum time allotted for the entropy calculation to happen | | | pixelUrl | String | Pixel URL provided by Symitri which will be triggered when bid matching with Symitri dealid wins and creative gets rendered | | From e92c1fbc67706bf3ffdfc52b9eed8ac3c7afaf01 Mon Sep 17 00:00:00 2001 From: IQZoneAdx <88879712+IQZoneAdx@users.noreply.github.com> Date: Thu, 10 Oct 2024 19:31:09 +0300 Subject: [PATCH 236/816] Fix IQZone params title (#5649) * add IQZone adapter doc * add new bid param * fix * updates * add endpointId param * updated adapter * removed redundant symbol * Fix IQZone params title --------- Co-authored-by: Bohdan Lashko --- dev-docs/bidders/iqzone.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/iqzone.md b/dev-docs/bidders/iqzone.md index 8a3278dc03..75a04d32ca 100644 --- a/dev-docs/bidders/iqzone.md +++ b/dev-docs/bidders/iqzone.md @@ -22,7 +22,7 @@ safeframes_ok: true sidebarType: 1 --- -### Prebid.js Bid Params +### Bid Params {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | From 9ad8c90a2390ed523518b18a53d4f2db8000108a Mon Sep 17 00:00:00 2001 From: tanguylemeur-sparteo <163292075+tanguylemeur-sparteo@users.noreply.github.com> Date: Fri, 11 Oct 2024 15:09:36 +0200 Subject: [PATCH 237/816] Sparteo: Update Docs (#5644) --- dev-docs/bidders/sparteo.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/dev-docs/bidders/sparteo.md b/dev-docs/bidders/sparteo.md index 7a5d574333..8928357e7b 100644 --- a/dev-docs/bidders/sparteo.md +++ b/dev-docs/bidders/sparteo.md @@ -10,10 +10,10 @@ tcfeu_supported: true gvl_id: 1028 usp_supported: true prebid_member: false -schain_supported: false +schain_supported: true safeframes_ok: true deals_supported: false -floors_supported: false +floors_supported: true fpd_supported: false ortb_blocking_supported: false multiformat_supported: will-bid-on-any @@ -27,12 +27,14 @@ Sparteo Header Bidding adapter requires setup and approval. Please reach out to ### Bid params {: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|---------------|----------|-----------------------------------------------------------------------------------------|------------|-----------| -| `publisherId` | required | Your publisher ID. This information will be given to you by the Sparteo team. | `1234` | `integer` | -| `networkId` | required | Your network ID. This information will be given to you by the Sparteo team. | `1234` | `integer` | - -Only the `publisherId` OR `networkId` is required. +| Name | Scope | Description | Example | Type | +|---------------|----------|-------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------|-----------| +| `networkId` | required | Your network ID. This information will be given to you by the Sparteo team. | `'9061ab7e-f01e-43a5-b801-c1a56156f105'` | `String` | +| `custom1` | optional | To be used in reporting. Alphanumeric strings ; case sensitive ; max 40 characters ; only allowed symbols are hyphen and underscore.| `'Test-datapoint_42'` | `String` | +| `custom2` | optional | To be used in reporting. Alphanumeric strings ; case sensitive ; max 40 characters ; only allowed symbols are hyphen and underscore.| `'Test-datapoint_42'` | `String` | +| `custom3` | optional | To be used in reporting. Alphanumeric strings ; case sensitive ; max 40 characters ; only allowed symbols are hyphen and underscore.| `'Test-datapoint_42'` | `String` | +| `custom4` | optional | To be used in reporting. Alphanumeric strings ; case sensitive ; max 40 characters ; only allowed symbols are hyphen and underscore.| `'Test-datapoint_42'` | `String` | +| `custom5` | optional | To be used in reporting. Alphanumeric strings ; case sensitive ; max 40 characters ; only allowed symbols are hyphen and underscore.| `'Test-datapoint_42'` | `String` | ### Banner Object @@ -47,12 +49,12 @@ Only the `publisherId` OR `networkId` is required. {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |------------------|----------|--------------------------------------------------------------------------|----------------|------------------| -| `context` | required | The video context, either 'instream', 'outstream'. | `'instream'` | `String` | +| `context` | required | The video context, either 'instream', 'outstream'. | `'instream'` | `String` | | `playerSize` | required | The size (width, height) of the video player on the page, in pixels. | `[640, 480]` | `Array` | | `playbackmethod` | optional | Defines how the video inventory is initiated following the OpenRTB spec. | `[4, 5]` | `Array` | | `protocols` | optional | Defines the video protocols allowed. | `[1, 2]` | `Array` | | `api` | optional | Defines the video api allowed. | `[1, 2]` | `Array` | -| `mimes` | optional | Defines the video mimes allowed. | `['video/mp4']` | `Array` | +| `mimes` | optional | Defines the video mimes allowed. | `['video/mp4']`| `Array` | | `skip` | optional | Defines if skip is allowed. | `1` | `integer` | | `startdelay` | optional | Defines the startDelay. | `0` | `integer` | | `placement` | optional | Defines the placement. | `1` | `integer` | From e5d48d25c071e038bc971ea6465cc3fa992ee5f4 Mon Sep 17 00:00:00 2001 From: couchcrew-thomas Date: Fri, 11 Oct 2024 15:22:55 +0200 Subject: [PATCH 238/816] updated feedad adapter documentation (#5655) Added a description of the optional `sdkOptions` parameter --- dev-docs/bidders/feedad.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/feedad.md b/dev-docs/bidders/feedad.md index 64201463b9..f5dd216cb8 100644 --- a/dev-docs/bidders/feedad.md +++ b/dev-docs/bidders/feedad.md @@ -18,3 +18,4 @@ sidebarType: 1 | `clientToken` | required | Your FeedAd client token. Check your FeedAd admin panel. | `'EiRjZDFiYzI2ZC03OTA2LTQyOTEtOGFmMC0xYzMyZmMwNTFkMDU='` | `string` | | `placementId` | required | A FeedAd placement ID of your choice | `'prebid-test'` | `string` | | `decoration` | optional | A decoration to apply to the ad slot. See our [documentation](https://docs.feedad.com/web/feed_ad/#decorations) | `'sticky bottom height=200px'` | `string` | +| `sdkOptions` | optional | Only required if you are using Prebid.JS in an app environment (aka hybrid App). See our [documentation](https://docs.feedad.com/web/configuration/#hybrid-app-config-parameters) | `{ hybrid_app: true, hybrid_platform: "android", bundle_id: "your.app.bundle", app_name: "Your App", limit_ad_tracking: false, advertising_id: "the user's ad id" }` | `object` | From 0f9b9cdc73f6c523ac570c705e667bfde8b55a2b Mon Sep 17 00:00:00 2001 From: AdsInteractive Date: Fri, 11 Oct 2024 18:53:05 +0300 Subject: [PATCH 239/816] add new adapter ads_interactive (#5602) --- dev-docs/bidders/ads_interactive.md | 35 +++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 dev-docs/bidders/ads_interactive.md diff --git a/dev-docs/bidders/ads_interactive.md b/dev-docs/bidders/ads_interactive.md new file mode 100644 index 0000000000..06b692b25c --- /dev/null +++ b/dev-docs/bidders/ads_interactive.md @@ -0,0 +1,35 @@ +--- +layout: bidder +title: Ads Ineractive +description: Prebid Ads Interactive Bidder Adapter +biddercode: ads_interactive +gpp_sids: usstate_all +tcfeu_supported: false +usp_supported: true +coppa_supported: true +schain_supported: true +deals_supported: false +floors_supported: true +fpd_supported: false +ortb_blocking_supported: false +media_types: banner, video, native +multiformat_supported: will-bid-on-one +userIds: all +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 a1b5477f21939c6c600a5e4b1fb48641c8fcc44a Mon Sep 17 00:00:00 2001 From: Philip Watson Date: Sat, 12 Oct 2024 05:01:19 +1300 Subject: [PATCH 240/816] StroeerCore Bid Adapter: add optional 'sfp' param (#5625) --- dev-docs/bidders/stroeerCore.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidders/stroeerCore.md b/dev-docs/bidders/stroeerCore.md index 4a8875fbe1..f0865f811e 100644 --- a/dev-docs/bidders/stroeerCore.md +++ b/dev-docs/bidders/stroeerCore.md @@ -26,9 +26,10 @@ sidebarType: 1 ### Bid Params {: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|---------------|----------|--------------------|-----------------------------------------|----------| -| `sid` | required | Slot ID | `'06b782cc-091b-4f53-9cd2-0291679aa1ac'`| `string` | +| Name | Scope | Description | Example | Type | +|-------|----------|------------------------------------------------------------------------------------------------------------------|------------------------------------------|----------| +| `sid` | required | Slot ID | `'06b782cc-091b-4f53-9cd2-0291679aa1ac'` | `string` | +| `sfp` | optional | Params for rendering special ad formats like Dynamic Sitebar. Contact your Account Manager for more information. | `{}` | `object` | ### Ad Unit Configuration From ea7f26e1603fa8d532effeca4ec5bc0983fd6a27 Mon Sep 17 00:00:00 2001 From: Fatih Kaya Date: Fri, 11 Oct 2024 19:08:24 +0300 Subject: [PATCH 241/816] AdMatic: documenting admaticde and netaddiction alias (#5639) * added simple params * update * Update admatic.md * update * update * Pixad Bid Adapter: added simple params * AdMatic Adapter: Feature update Pixad alias is included in the update. * Update admatic.md * Update pixad.md * gvl_id add * Update pixad.md * admatic && pixad pbs support true * Create monetixads.md * new alias --- dev-docs/bidders/admaticde.md | 91 ++++++++++++++++++++++++++++++++ dev-docs/bidders/netaddiction.md | 91 ++++++++++++++++++++++++++++++++ 2 files changed, 182 insertions(+) create mode 100644 dev-docs/bidders/admaticde.md create mode 100644 dev-docs/bidders/netaddiction.md diff --git a/dev-docs/bidders/admaticde.md b/dev-docs/bidders/admaticde.md new file mode 100644 index 0000000000..e3458ad22f --- /dev/null +++ b/dev-docs/bidders/admaticde.md @@ -0,0 +1,91 @@ +--- +layout: bidder +title: AdMatic GMBH +description: Prebid AdMatic GMBH Bidder Adapter. +pbjs: true +pbs: true +biddercode: admaticde +media_types: banner,video,native +gvl_id: 1281 (admatic) +tcfeu_supported: true +usp_supported: true +coppa_supported: true +gpp_sids: tcfeu, tcfca, usnat, usstate_all, usp +schain_supported: true +dchain_supported: false +userIds: criteo, id5Id, sharedId, unifiedId +safeframes_ok: true +floors_supported: true +aliasCode: admatic +multiformat_supported: will-bid-on-any +sidebarType: 1 +--- + +### Description + +AdMatic GMBH header bidding adapter connects with AdMatic GMBH demand sources to fetch bids for network ID. Please reach out to your account manager or for more information. + +### Bid params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------------|----------|-------------------------------------|----------|----------| +| `networkId` | required | The network ID from AdMatic GMBH | `12345` | `number` | +| `host` | required | RTB Host | `rtb.network.admatic.de` | `string` | + +### Test Parameters + +300x250 banner test + +```javascript +var adUnits = [{ + code: 'your-slot_1-div', + mediaTypes: { + banner: { sizes: [[300, 250]] }, + }, + bids: [{ + bidder: 'admaticde', + params: { + networkId: 12345, + host: 'rtb.network.admatic.de' + } + }] +},{ + code: 'your-slot_2-div', + mediaTypes: { + native: { ... }, + }, + bids: [{ + bidder: 'admaticde', + params: { + networkId: 12345, + host: 'rtb.network.admatic.de' + } + }] +},{ + code: 'your-slot_3-div', + mediaTypes: { + video: { ... }, + }, + bids: [{ + bidder: 'admaticde', + params: { + networkId: 12345, + host: 'rtb.network.admatic.de' + } + }] +}]; +``` + +## UserSync example + +```javascript +pbjs.setConfig({ + userSync: { + iframeEnabled: true, + syncEnabled: true, + syncDelay: 1, + aliasSyncEnabled: true + } +}); +``` diff --git a/dev-docs/bidders/netaddiction.md b/dev-docs/bidders/netaddiction.md new file mode 100644 index 0000000000..959bd0f575 --- /dev/null +++ b/dev-docs/bidders/netaddiction.md @@ -0,0 +1,91 @@ +--- +layout: bidder +title: NetAddiction +description: Prebid NetAddiction Bidder Adapter. +pbjs: true +pbs: true +biddercode: netaddiction +media_types: banner,video,native +gvl_id: 1281 (admatic) +tcfeu_supported: true +usp_supported: true +coppa_supported: true +gpp_sids: tcfeu, tcfca, usnat, usstate_all, usp +schain_supported: true +dchain_supported: false +userIds: criteo, id5Id, sharedId, unifiedId +safeframes_ok: true +floors_supported: true +aliasCode: admatic +multiformat_supported: will-bid-on-any +sidebarType: 1 +--- + +### Description + +NetAddiction header bidding adapter connects with NetAddiction demand sources to fetch bids for network ID. Please reach out to your account manager or for more information. + +### Bid params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------------|----------|-------------------------------------|----------|----------| +| `networkId` | required | The network ID from NetAddiction | `12345` | `number` | +| `host` | required | RTB Host | `netaddiction.rtb.netaddiction.tech` | `string` | + +### Test Parameters + +300x250 banner test + +```javascript +var adUnits = [{ + code: 'your-slot_1-div', + mediaTypes: { + banner: { sizes: [[300, 250]] }, + }, + bids: [{ + bidder: 'netaddiction', + params: { + networkId: 12345, + host: 'rtb.network.netaddiction.tech' + } + }] +},{ + code: 'your-slot_2-div', + mediaTypes: { + native: { ... }, + }, + bids: [{ + bidder: 'netaddiction', + params: { + networkId: 12345, + host: 'rtb.network.netaddiction.tech' + } + }] +},{ + code: 'your-slot_3-div', + mediaTypes: { + video: { ... }, + }, + bids: [{ + bidder: 'netaddiction', + params: { + networkId: 12345, + host: 'rtb.network.netaddiction.tech' + } + }] +}]; +``` + +## UserSync example + +```javascript +pbjs.setConfig({ + userSync: { + iframeEnabled: true, + syncEnabled: true, + syncDelay: 1, + aliasSyncEnabled: true + } +}); +``` From 371432852330e995f2e9f505cbe4e73a96e6ae4e Mon Sep 17 00:00:00 2001 From: mkomorski Date: Fri, 11 Oct 2024 18:16:45 +0200 Subject: [PATCH 242/816] loadExternalScript activity controls (#5643) * loadExternalScript activity controls * change file --------- Co-authored-by: Marcin Komorski --- dev-docs/activity-controls.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/activity-controls.md b/dev-docs/activity-controls.md index f1f55285bb..6642727951 100644 --- a/dev-docs/activity-controls.md +++ b/dev-docs/activity-controls.md @@ -120,6 +120,7 @@ Here's the list of the 'potentially restricted activities' that Prebid.js core c | `transmitPreciseGeo` | A bid adapter or RTD submodule wants to access and/or transmit precise geolocation data to their endpoint | Component is allowed only 2-digit precision for latitude and longitude | [`configName`](#params-fetchBids) | | `transmitTid` | A bid adapter or RTD submodule wants to access and/or transmit globally unique transaction IDs to their endpoint | Transaction IDs are hidden from the component | [`configName`](#params-fetchBids) | | `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) | +| `loadExternalScript` | A bid adapter, analytics adapter, or module wants to load external script | Module is not allowed to load external script from `adloader.js` | None | From 9dc937d1bc4daf48940d4369c55c096d9fe91cb1 Mon Sep 17 00:00:00 2001 From: Harshad Mane Date: Fri, 11 Oct 2024 09:57:13 -0700 Subject: [PATCH 243/816] Fixing a typo in 1st party storage name (#5514) Co-authored-by: bretg --- dev-docs/modules/userid-submodules/pair.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dev-docs/modules/userid-submodules/pair.md b/dev-docs/modules/userid-submodules/pair.md index 1db7acd1a8..db98f896af 100644 --- a/dev-docs/modules/userid-submodules/pair.md +++ b/dev-docs/modules/userid-submodules/pair.md @@ -45,8 +45,7 @@ Or if to use cleanrooms provided implementation, it can be specified by adding t ```javascript -// value in 'pairid' local storage/cookie entry will be combined with ids provided by cleanroom liveramp - +// value in 'pairId' local storage/cookie entry will be combined with ids provided by cleamroom liveramp pbjs.setConfig({ userSync: { userIds: [{ From 59e17274f64a2c2172d39b979268cf72266679e8 Mon Sep 17 00:00:00 2001 From: mustafa kemal Date: Fri, 11 Oct 2024 19:58:45 +0300 Subject: [PATCH 244/816] Update theAdx.md (#5388) * Update theAdx.md * deal with case inconsistency --------- Co-authored-by: bretg --- dev-docs/bidders/theAdx.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/theAdx.md b/dev-docs/bidders/theAdx.md index 261206bc27..4dda7bf1d1 100644 --- a/dev-docs/bidders/theAdx.md +++ b/dev-docs/bidders/theAdx.md @@ -1,11 +1,12 @@ --- layout: bidder -title: theadx +title: TheAdx description: Prebid TheAdx Bidder Adapter pbs: true pbs_app_supported: true pbjs: true biddercode: theadx +filename: theAdxBidAdapter tcfeu_supported: true usp_supported: true schain_supported: true From 0b5c30069e2f3ff84046e60bccc9bbff1d38b5c3 Mon Sep 17 00:00:00 2001 From: Viktor Dreiling <34981284+3link@users.noreply.github.com> Date: Fri, 11 Oct 2024 19:44:39 +0200 Subject: [PATCH 245/816] LiveIntent User ID Module: Eliminating live-connect NPM Dependency (#5567) * CM-1260 Implement LiveIntent Prebid User Id Module Based On The Hub * adjust location * Update dev-docs/modules/userid-submodules/liveintent.md Co-authored-by: Viktor Dreiling <34981284+3link@users.noreply.github.com> * Update dev-docs/modules/userid-submodules/liveintent.md Co-authored-by: Viktor Dreiling <34981284+3link@users.noreply.github.com> * rename * remove mention of Hub * rephrase * fix * Update liveintent.md * Update liveintent.md * Update liveintent.md --------- Co-authored-by: Peixun Zhang Co-authored-by: PeiZ <74068135+peixunzhang@users.noreply.github.com> Co-authored-by: Deepthi Venkitaramanan --- .../modules/userid-submodules/liveintent.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/dev-docs/modules/userid-submodules/liveintent.md b/dev-docs/modules/userid-submodules/liveintent.md index 934fc5dca0..f2a1b66783 100644 --- a/dev-docs/modules/userid-submodules/liveintent.md +++ b/dev-docs/modules/userid-submodules/liveintent.md @@ -27,6 +27,15 @@ There are two ways to add the functionality of LiveIntent Identity sub-module to LiveConnectMode=minimal gulp build --modules=liveIntentIdSystem ``` +3. The external version, which requires a LiveConnect tag (>=3.0.0) installed on your page in addition to Prebid. Please contact LiveIntent for support in setting up LiveConnect. +This will significantly reduce the size of your Prebid.js bundle and allow you to use the newest features of LiveConnect. All other versions will be deprecated in the future. + + Add the **external** LiveIntent Identity module to your Prebid.js package with: + + ```bash + LiveConnectMode=external gulp build --modules=liveIntentIdSystem + ``` + This is an example of how the `request.userId.lipb` object, which contains the resolution result, would look like: ```json @@ -36,6 +45,13 @@ This is an example of how the `request.userId.lipb` object, which contains the r } ``` +## Configure the LiveConnect Tag +Configuring the LiveConnect tag is a critical step in setting up effective identity resolution on your website. This tag helps capture user interactions, generate first-party cookies, and link these interactions to stable identifiers. By doing so, the LiveConnect tag transforms anonymous site traffic into actionable data, enabling you to better understand and engage with your audience. + +For detailed configuration instructions, refer to the following resources: +[LiveConnect for HIRO Clients Configuration Guide](https://support.liveintent.com/hc/en-us/articles/30245171256724-LiveConnect-Configuration-Guide-for-HIRO-Clients) + +If you need a publisher id or distributor id for the LiveConnect script on the page, please connect your LiveIntent representative for it. If you're not already a LiveIntent customer, feel free to [reach out](https://www.liveintent.com/get-in-touch/) to us. You can also explore the [LiveIntent’s privacy policies](https://www.liveintent.com/services-privacy-policy/). ## How LiveIntent user ID sub-module works @@ -82,7 +98,7 @@ pbjs.setConfig({ ### Multiple user IDs -The attributes `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk` and `fpid` are treated specially by LiveIntent's user ID sub-module. Each of these attributes will result in a separate ID returned by the sub-module. Note: `thetradedesk` will be exposed as `tdid` because of historical reasons. +The attributes `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk` and `fpid` are treated specially by LiveIntent's user ID sub-module. Each of these attributes will result in a separate ID returned by the sub-module. Note: `thetradedesk` will be exposed as `tdid` because of historical reasons. For example, in case `uid2` is configured to be requested in addition to the `nonID`, the `request.userId` object would look like the following: From 4b1c34e5d3ecf87f07847048723788d169708f03 Mon Sep 17 00:00:00 2001 From: Pranav Sheth <57259342+pranavsheth@users.noreply.github.com> Date: Fri, 11 Oct 2024 23:19:28 +0530 Subject: [PATCH 246/816] New Bidder: dexerto (#5573) * New Bidder: dexerto * removed domain as requested --- dev-docs/bidders/dexerto.md | 52 +++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 dev-docs/bidders/dexerto.md diff --git a/dev-docs/bidders/dexerto.md b/dev-docs/bidders/dexerto.md new file mode 100644 index 0000000000..66e6a697a9 --- /dev/null +++ b/dev-docs/bidders/dexerto.md @@ -0,0 +1,52 @@ +--- +layout: bidder +title: Dexerto +description: Prebid dexerto Bidder Adaptor +pbjs: true +biddercode: dexerto +media_types: banner +tcfeu_supported: false +usp_supported: true +coppa_supported: true +gpp_sids: usstate_all +schain_supported: false +safeframes_ok: false +ortb_blocking_supported: false +dsa_supported: false +deals_supported: true +floors_supported: true +sidebarType: 1 +--- + +### Bid Params + +| Name | Scope | Description | Example | Type | +|---------------|-----------|-----------------------|----------------|----------| +| `placement_id`| mandatory | Placement Id | `110003` | `number` | +| `height` | optional | Height of the creative| `250` | `number` | +| `width` | optional | Width of the creative | `300` | `number` | +| `bid_floor` | optional | Bid Floor Price | `0.5` | `decimal`| + +### AdUnit Format for Banner + +```javascript +var adUnits = [ + { + code: 'display-ad', + mediaTypes: { + banner: { + sizes: [[300, 250]] + } + }, + bids: [{ + bidder: 'dexerto', + params: { + placement_id: 110003, + height: 250, + width: 300, + bid_floor: 0.5 + } + }] + } + ]; +``` From b131f26abffea3a2e530fbccea022254ddd1508c Mon Sep 17 00:00:00 2001 From: Alexander Pykhteyev Date: Sat, 12 Oct 2024 00:50:47 +0700 Subject: [PATCH 247/816] New Adapter: Streamlyn (#5579) * Doc for embi media * Add new adapter Streamlyn * Fix formatting * Remove unused --------- Co-authored-by: apykhteyev --- dev-docs/bidders/streamlyn.md | 39 +++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 dev-docs/bidders/streamlyn.md diff --git a/dev-docs/bidders/streamlyn.md b/dev-docs/bidders/streamlyn.md new file mode 100644 index 0000000000..e4f012dbd9 --- /dev/null +++ b/dev-docs/bidders/streamlyn.md @@ -0,0 +1,39 @@ +--- +layout: bidder +title: Streamlyn +description: Streamlyn Bidder Adaptor +biddercode: streamlyn +pbjs: false +pbs: true +media_types: video, banner, audio, native +userIds: all +fpd_supported: false +tcfeu_supported: false +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 | `'rtba.bidsxchange.com'` | `string` | +| `publisherId` | required | Publisher ID | `'12345'` | `string` | +| `custom1` | optional | Custom targeting field 1 | `'custom1'` | `string` | +| `custom2` | optional | Custom targeting field 2 | `'custom2'` | `string` | +| `custom3` | optional | Custom targeting field 3 | `'custom3'` | `string` | +| `custom4` | optional | Custom targeting field 4 | `'custom4'` | `string` | +| `custom5` | optional | Custom targeting field 5 | `'custom5'` | `string` | + +Streamlyn server-side Prebid Server adapter requires only `publisherId` and `host` parameters. + +Streamlyn server-side Prebid Server adapter supports only `banner`, `video`, `audio`, `native` media types. From 31dc630e8def746283751db568a4bc5457743cf1 Mon Sep 17 00:00:00 2001 From: mkomorski Date: Fri, 11 Oct 2024 20:01:39 +0200 Subject: [PATCH 248/816] useBaseGvlid added to aliasBidder (#5601) * useBaseGvlid added to aliasBidder * new scope column * Update aliasBidder.md --------- Co-authored-by: Marcin Komorski Co-authored-by: bretg --- dev-docs/publisher-api-reference/aliasBidder.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/dev-docs/publisher-api-reference/aliasBidder.md b/dev-docs/publisher-api-reference/aliasBidder.md index 24d7e6aef3..590cfc3584 100644 --- a/dev-docs/publisher-api-reference/aliasBidder.md +++ b/dev-docs/publisher-api-reference/aliasBidder.md @@ -9,7 +9,7 @@ To define an alias for a bidder adapter, call this method at runtime: ```javascript -pbjs.aliasBidder('appnexus', 'newAlias', optionsObject ); +pbjs.aliasBidder('appnexus', 'newAlias', optionsObject); ``` @@ -25,9 +25,10 @@ If you define an alias and are using `pbjs.sendAllBids`, you must also set up ad The options object supports these parameters: {: .table .table-bordered .table-striped } -| Option Parameter | Type | Description | -|------------|---------|---------------------------------| -| gvlid | integer | IAB Global Vendor List ID for this alias for use with the [TCF control module](/dev-docs/modules/tcfControl.html). | +| Option Parameter | Scope | Type | Description | +|------------|---------|---------|---------------------------------| +| gvlid | optional | integer | IAB Global Vendor List ID for this alias for use with the [TCF control module](/dev-docs/modules/tcfControl.html). | +| useBaseGvlid | optional | boolean | Flag determining if the GVL ID of the original adapter should be re-used. (PBJS 9.14+) | {: .alert.alert-info :} Creating an alias for a Prebid Server adapter is done differently. See 'extPrebid' From e51f5b52edeb71f8dc333846c17ec8b65299b555 Mon Sep 17 00:00:00 2001 From: mefjush Date: Fri, 11 Oct 2024 20:05:15 +0200 Subject: [PATCH 249/816] [Adhese] Document pbs ext parameters (#5618) * [Adhese] Document pbs ext parameters * [Adhese] Document adapter limitations * Update adhese.md Updated to align with the way that others have dealt with differences between their client-side and server-side adapters -- have different rows with comments. --------- Co-authored-by: bretg --- dev-docs/bidders/adhese.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/dev-docs/bidders/adhese.md b/dev-docs/bidders/adhese.md index cc2d9499f0..ab232eabe2 100644 --- a/dev-docs/bidders/adhese.md +++ b/dev-docs/bidders/adhese.md @@ -19,15 +19,20 @@ The Adhese bid adapter may require an additional setup from the Adhese team, eve Prebid Server host companies need to work with Adhese for each additional publisher. +### Note + +Adhese will only respond to the first impression. Multiple ad formats in single request are not supported. + ### Bid Params {: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|---------------|----------|--------------------|------------------------------|----------| -| `account` | required | Adhese account name | `'demo'` | `string` | -| `location` | required | Adhese location name | `'_adhese_prebid_demo_'` | `string` | -| `format` | required | Adhese format name | `'leaderboard'` | `string` | -| `data` | optional | Custom target data | `{ 'ci': [9000, 9050] }` | `object` | +| Pbjs param name | Scope | Description | Example | Type | +|-----------------|--------------------|----------|-----------------------|---------------------------| +| `account` | required | Adhese account name | `'demo'` | `string` | +| `location` | required | Adhese location name | `'_adhese_prebid_demo_'` | `string` | +| `format` | required | Adhese format name | `'leaderboard'` | `string` | +| `data` | optional | (PBJS only) Custom target data | `{ 'ci': [9000, 9050] }` | `object` | +| `targets` | optional | (PBS only) Custom target data | `{ 'ci': [9000, 9050] }` | `object` | ### Configuration From 749ccfcdac47eb045f124e8d86b7207b83c39907 Mon Sep 17 00:00:00 2001 From: Leandro Marty Date: Fri, 11 Oct 2024 20:05:59 +0200 Subject: [PATCH 250/816] New Adapter: Smoot (#5619) * New Adapter: Smoot * New Adapter: Smoot * correct tcfeu_supported value to false * remove docs about pbs Co-authored-by: Muki Seiler --------- Co-authored-by: Muki Seiler --- dev-docs/bidders/smoot.md | 40 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 dev-docs/bidders/smoot.md diff --git a/dev-docs/bidders/smoot.md b/dev-docs/bidders/smoot.md new file mode 100644 index 0000000000..f155453e48 --- /dev/null +++ b/dev-docs/bidders/smoot.md @@ -0,0 +1,40 @@ +--- +layout: bidder +title: Smoot +description: Prebid Smoot Bidder Adapter +biddercode: smoot +gpp_sids: usstate_all +tcfeu_supported: false +usp_supported: true +coppa_supported: true +schain_supported: true +deals_supported: false +floors_supported: true +fpd_supported: false +ortb_blocking_supported: false +media_types: banner, video, native +multiformat_supported: will-bid-on-one +userIds: all +pbjs: true +pbs: false +pbs_app_supported: false +safeframes_ok: true +sidebarType: 1 +--- + +### Note + +The Smoot Bidding adapter requires setup before beginning. Please contact us at + +### 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 prebid.js you only need to use one parameter: either placementId or endpointId From 2d310bd82331b24042d46430e200d52b1c6844e2 Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 11 Oct 2024 14:38:48 -0400 Subject: [PATCH 251/816] PBS fix image (#5656) --- .../images/prebid-server/module-example.png | Bin 165636 -> 164802 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/images/prebid-server/module-example.png b/assets/images/prebid-server/module-example.png index 24cc9d32ed73f6f07d992ea4cdaf78aa34e100c2..ea864b1c1579fab9ce280cf682d40998e5149207 100644 GIT binary patch literal 164802 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 y`&9|Od7vk;egfc$tQ~w z$Z}DSbtpcCdr*=-Fj==Sfv0h=>iAMgS1q}If^xuxD4<$?2u00e%cx;ebJ2Nz%Am`h z!k9)!`FLh@S}tA_rq}rUkhVjd75hs4u&wptpt}XS@?xtE08e{C(k<_{7s)aR4&)9W zZP-=Eagn~)l?*Rv|K->Lph59-%yp|Fcy*n3k1T+2Irc@i-lOdcQCng>eIjqoJ^L%f zDNf|iX6UI4e}6`Jt1l`+?l5|si|gQB2Kl~TNFUb&tHEfLyrIj4XmkvI&NF8=@L`UB zp?^EAu&>*iO7_=4PUJ`bTns#URyLy{@2i1UoX6T2&PCr_+<)_j+p5^{h?nTzCu=({ zs8W>`-J$43aooI1_TI(jigD?KXeY}-)(ZayR9+qP^zE=xM3%sAp~Xr%dn{IX3_Wbl?PgwAJbvY67gkxPH_BqQ zD)+|9c|<HDkOR zyQH$h4DX$QFAm;+(QPHXXz8270E`)+zxxp(9j2`ee3-zc$M`vy*L*q0)>a;l{uZa) z+K1pnU4zQRp5Rb3J46f|-!3$E$Hh#Dc7y4nvWwjJbIG@w@*hnrmWr4WN_ol%E}vaL z(DWBw4B?L}y!Y@tT>M$IIy1%uDTNQ+EzIMMAIwd)%-CY#r(;H)yuq}Hlw%12@LEe3 z>~O8(TrRUJu|&r`gNG1P2~lVsRAf0Gft-~ZQ>uF7o)sA}$GQGo;cl*2xKu0ELemHw zD6u3#lePhaPh!7lX-y23UmfT$;ov*>B+)hMeZk|~iMulIFvkoy)@Fq#uwTV&P3s~o zO7K}|kER3qZ*2hd$YFSH!5Qg@R+!|PfG`(J)RX5g9uS&5Ck6SO&+zomKZp(XejmoM z7vV?31ix1mV2pzb7vhh*Gqu#gB#Gw%ooY{q$%+NY#+2~dfxwn~lRR4$G7Ai+Ce5D0 zR_Yo&o<|o-9hAB!%ZHQp@`p`AqF5m!cgf?@_$GMikm$_j_0l!dV_4Em{FOU-P&h;6UOc}(-pB`|H zyG0o^f?}X&|2+1U@&f^#%|T7bDmkx7f41(}c*m5kMMPhc>Iw7l`;qv-+(b+C`w7>{ zl<3Jrtl~2F;<~B$=2r=xptu3^Jo_w{+RJt_IN7i4a)#$+yNexBSAdB03i-FP*MYVs zoY7)YAq_<(6zWm&163i#YRvPC1;>yrVj$4!Tzyo{!ZL|aPqc9JN#p_E0Bo|acG%d; zlSy~2JXUNW@==d}<7B9ktJ5C%=H5ssLS%<&4w$elg7Ddrr*!s^m3jq$Az12reJ3~WZ#G{K`Rc@*4}Hp$PqoL@ORRZ~gD$*8 zc7*sDH7caj9>_x?w!Iz0z+Z;P9Zfw8(o76qP|b>~te3qHIFFgSvqf$99c`m**N?l@ z@bASMGGs!06~^r}!FZCXF~gV&nnozK{DuYQ3N@ImKA~=Dj?QC?GOqwH)IPcK-R+cH z<99nlFKg2fUoy$J83*5qMuF<|d;*&|oIhpPKptNZzZFfugd@M-NfEK$A#=ji=y&!3 zxksduG~9z9R?mh1CFMVcLb?ZE`J6{U$KIzQz@u#viK+RoMg-#v(N=pn@5T8hgE41f zAsX=W6uT5>2Y+bKv58AL;k8E?FPSf3iLXJjn>to+zrF1Qykd3Jb2>Mncl$!qOl4c9 z4qEfUyvFJi`en{q7T4FRe6?4^61TLDw>eRz!@5hdAKWTj6J3Tw07C=J)!@w7?qT1Hg;8NIMg+ zAMHqXa&vbbb2QHn<~OdJ&psC@hv=42fY-e)Cto7E`+-Y|Q_taD`^maa-4nr3d3TUG z3Yq0`Y6;FKt(%N$jKMeE^|X~ga*~O#PJTgR{6VODTQ?sHLxhz8spved$Bg&Ff%3vr z+>I1Qj=Y>B0>PJrBRc*;xY6d1nQYRD)A0A7O5i{q>6O|ltQMYS1Xf{+p6I8?n*|qEU+>8yo?*m+OaeV}dZX8QY+4B@AU0c8{gZQ@Y)J;Cz zUg?xRT2gUralCF?9GN!URo--`quPxmu0BDZD!zar8IP5Prxh}j25!o?C|c?`aDE*u zL3Yp$)mh>A##qrRjv1#x4|oH0V@Y; zE~^{p_2;@yzAQWEojZ_r7N*C|_Y8q7(wj?p=bRrE7il0%do#udNuF*5>YO!@2I!+d zpFcNGFUgnx66U4Bx#F|~Ur`6CO-Mwwdo1~A`tHRGxFexyVrtE0dK3q(aNN_^s%r0;nSzUt`^y5Z4>TMeS6`?@F&I4jKDsf^G{>_&}oK#!1m{9GWiv<=6q>$y)} zR39qpK?jyx#GGpq_@Om9UhaJ8Vu6OoV^SX3_cRtpo+bN_O9J4>aaR_oCIV^ab&D?d zIJa?C^1!S5MEqZb0EbeB8Mo6Q&fl5P*oyOWYE9}x)uR&9;Qcfc0mG|BQl_uysOj+? z0+NQeJ=R489Kv>bl<}c=-^`GrJAq*|UzMCrJ_YKf<86!R`bq}sfK#`i+*mwF-Sz6% z;)XlST^<3eHp+fnGx*Q0;63jQioYK;c(v2tF_k|pbR-v|et9&QoVC9(ACJ>8oK;v} zwziq!l$TpcOTDU_jjcjlXP!0ubo$KhB|SO3el7;1-{0%9BTmiDwBx!{={`D}>GEMt zM&IRC?!1foiZEa7I$1pA2mu@RXGG3+NXpgyvD-beYB`{!{4iUqD62^gP8zu{T`w}A zF)hd!WG;3X5X*b?D8HX^51Y!5uLvC?A!m`=3Ln?3)Xw4gfX zBR5V~<){BMGjpM03H9=&>~``g=-L=^EXt03JpT&f9mD?F5)c9ygmSV$0!6lz(|_A1 z7s^!=|3_XiUBURR=-jz)%a|FkNi^ zJRPE)FSKVC(z-5j>#sjf!p!%=6FhyyJxahDZ75%m&#{YaXu8pwd3lt@Z^ ziAni#gDD*Nq7;trV0lP;@P#$Gu`uBI)3<2f%7Z(r+IBs54GU6K%(dBxkd6=~^ z8;WdfmNs7mq!#fcPba9eZdAy7Q)J20P&=qzNOZjq!y`+16nW7kge1bDb<4aUk@an~ z8n5^gcX7+Ta<6#ftS%=Wk{Wx_k)f;40$-eoJ!&a`!6|}9!CE|{wQG%0D#2qPxVXw* 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

  • D|v|hkfOt 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 literal 165636 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

    aa~AHu|Zh`VKeG0g`y1o8QoO z+-=?`pfs5P*SW7_q(Hkn=}^7MV0D*t^B)(B%q})2rs#@2xsYzk2Ry+C;;j;PoPc2~B5`k>@W#f~#t8ozaKJR_vaR)MHP$U!r1CYP0Y?7+iJChPU)Yinj^8JjW> zEbJi>+*JpB+GPO)?XPKH;_wEHn@v#FV+{{TXZuviC?n#1A@P3U-JKPx*a~jm)>o)c zdN$2a@oH;47Udz-j#B<>BsbGlbrcc(&?Md4(wBT6%C$c z^U2=qySpRHALZO2oXw*iI@x-^WpF32=+uXYD-={c5_xz_E=r@Ylix=QvLLy#RTU7pbrU ze?biD#x7kmgvYH$db@kY1=%Sa(h1kflA{##dZn)t6?=;LG)OeJ86~9p$sTpHtp%m_ zlrm=ahLc~G8lxJc;$n~dS3ycp+d)I8L+xWk(=&~Iz;EDm)T-FXE?v-9w%MTiSYT!M zfI^LlbUY;M6Fncjxb6o+BteP(0#69jN~7J+i?4$26$RpTN)M#Bg~)glLe8N?rv|Mh~sY= zxUup&7joG8^Ao_Lw(6v8@_ESiWNF+Vr5+^nhhM+97OyhZu|^|pp&D>o zO`4BIb+;c<|K5`LqLxuif{0^sF~hEXuQJXJn$c9ETWK+7PB@1kw)YBpSEIkFgrIk2 zi*iN3FIR^v-#rk0eg>2;=#4|=cfEF>6nI_;>)giQ9)36RW}TTV+L7TWpNo(tZ(YIP z23}hh?QBV|t*;)V$Ax(UJV-|>^)l0!L+afbVz}t7qY3-Sk{P$rq_qBxA(zYw2-6m9 z^)gQuLn~E0$Nwi@$Ba5*@i!iZW_TC6DF`x=g-~_OctyIU0^CMSiM3#;DrYpXbXUOLS7Q*Um^T=DGh-E+b zIQp7dmkQGNvUC|}VO;Q9Uc32B+#e`k9;lG}paOfTGdC;+u;`Ad%co1H%Smjo-55TH(&HNlPJ`BKIj6EZ)7nsLKPdknl?yP=Ob9IK7rQ?|UY~t|BV^1>mGUdHL-L zi(-bb#DirHDk#D>#0uD$Xd2J)9ge790*Se6LY@7jb0NK4u?!&)H7|pbqExzu=bhYA z#dzr(wwF8Fg`inK6~e=-{qeZ%3bC}-r2Jlu7x1o3C8-?UiF~cqblKjTJOhAadiRNBV^-VwIM}iu-9QdXBL#_ z>D+x4gu)}*)51ETt2Tsf<3U2x_pm-ne_0!3EZHgmx5?`&>R!G3LqV>Pu#)k3@5Rz! z@}XtO3<}#zdJE;0ag>Gu-E`x9-YV6*hA$mGOG*Dy<5k1}Cm25g9cq`Zd#(Lm81n}Y zdCUOUp61@b|BkIT&>5KO8Sn&`uRoxkQ8tfR+VY=RJvo7`Wbi9StaR2dD9tZ$`(`*B zgv;@mSKlD}uBDrPDureOhbK?an_WLoTq~cV2V{K0K<{8j$Jao)&iS|l2YI`MM))eK zljm}s-Vw1Cp5w85xD(fgeXjL+LRV%7Yazou>n?y*l>w#7J~XVTSy9)6L|e>z->N0& zr!EiZmOQGiwJ*B}5r%mOC<>@;jj(R%fNbhhR+3i!^Fzx@)8!gRvmNY%KX6A~;&(;m zo;x}7Ch3AwUOrM?HcmarU`>?!zsi=5fWt3{)}z0Wg`oxpd4D$>{?1JPCG-uoO21oG z&dH4lQioPcF88$5XUCQSdJf|aylo0B?zbv=jOGg=$MnE#x2`ZWJ7>SY=y=ZyG&;J2TH0L!fbtakS$)wR>T z|8{`wz1j2sGmdNw^isGgYvk`M(m*WOB)Bd%yBykYhsqOaD^xUa-p9r}$-66YtW+@BfFV>kdn@@BT?t+S2lAn3|TE zrKzR46Sd(?P0g)fxd)Lu!I^DyugqDloH%iUw%kfCa8oIwpyEOV9KYM=ec#`8-G6dj z+~<7H_uOZGK5&2I@R2VGMv)%l)%1h-)D&O$^8 zDlP|rA1Z=p!7o{DKNR2Ve9Ag3V}V!d zvpl{-X@Zl-T0G-J-oq#C6nha3n5z(?^685rgL_hhgr#hHz9qZ@Md=H)Zrj-IT1qXU z?>X9#rFVd6Xn^6?9e}{qmF?clHW;*ppc5?6lFWm{U5>`MRHGj@w}JG9K$A zD!x+Y{93>-pxI6D+yVo^rD2p%1FLEAE5Qq;g^{$kvUH)S^Amd+Jiv~QIL;?w+Q4*D z*@?M3&8eL}D_L|vucgilme$_E^?3YkLVwYzR{s#`IJLdkZ@Wi)3y(&RIoS*t4`BZ^ zQcywPj=U}U&J8dl+~fQSi}aIU(WUMXRkn5dfMs#o$@hj;App&zJiT%#G?8 z%SNj4M5rJMjmbI7Dv5u0eOZcv!7)a}qkPvPuEGP|LEJt4-&3@aT=rf!`?`57GF~gF z?*-HQRGIAxaat**m4@$)SyGZQj&m}RAKs1*)dq2o6O`Ue77*|$;qw!k#T;U@TKV;R zwuuHCh0m@U9-w=yfA&l+>2udttV0=0RdcdkD1}QOZ5)l$c1c^GgLih4zPbrnC?kB0 zgm1j|#aS;zXCicjZtP!f<_C>kL+u({ImSaxziDj%B86%>7&&}JrtJU6V0MvP7tfaX z60CXkMtm08m2L2_ufe!*#I~i#Wju&l_(egCu-K^Ga^%3k9CuHpzxqKhsF*i=hj1pa z{9fi1a0FBDfX)_z^LBnJqnpxS6)k)vxLSHa`PFqh!Ov-bF9`N&4clngf(km-B3l|R z+rSH+S4cP5m9IUN63uEhXt)ncDeTc}34kV$?9mE=WwIKbQ(>ROfM$WcrDq2`|I59u zUD4wX0rd-Tstdh0GraP|g)m9b*rj9}L9z~6Hmvy(b*fK}7$2#5@w!q)c$VQ%eW)C0 zpxR7!%57_I^oE7jPS3jS{vYJ~J;Sum-QhO^{N7$-x{5id1;!jt@xpj#&s|a#!g*MwtFGj{R^A;2jg?Hz; z6M`(d_Ug#KN1cC}Zx@noa{5HQ^dzipeaIg?fNH{z+;-yT731?)eKA2)e-&4<@?u!! zHjF^p2B0Y?U6;?W%92LnVl#V+q9?KAqc3y2-^7tlalzvZGMtnH$$lSsI~a|0uagwoQ){Dqx;V2`o;dU%(0jodL70z zLww@?HV+k@mXb`kyL~R@CCHrz6tKB2q^S@(_xqfrV`{!{6wLoDsyq&8D*P4zh`-uI zuwD?~7Rjq{CS-KhU+9h_>D-&1oPx@KUL8+Ry>7EHy?V6o<5bY9%)BSuuHcq)htD29 zOG#OnB2vFR!D3zi?} zd>Z~PvO=ku_6DG~lgv)RotJ}JM0q|d>b38Biu)ga6nYoFzin>x&ZAeX815X`K(Mca z1uI$sbh2BbOR?q(WsbR^Wpq@+%R_8sYC@GLt9F=*bALX{J`rXBTRmvz1E5;8HHHkWX*POkl{LYojo@35e- znc(9XYxaxmeuKO9=Z{5*b2)a#WC_C$W{bxH=}yiI-V3+?mK}Z)rLM0!uC_ zz;uDNi>G1WUrp^je=-~@;Wk@m+k3d|=s%b>X@h5LRqZ}SH!`skt{GEaC zRe2w7^{hAe%Gjf4g5keMOw}GN*pV0ZYrEP$!Ai=wf2Trdel3@*+aHh1Xe|c8^Y^b; z#Uu!Y0X(b3T@hw;yc}@9fvMX=033EZ{^j;LGesHLb=6Rrxkp0a;D8V8{QH^w&-B8O zQv=ywjqe*zD>xki{kUV)E%~W=CF+^S8rom;LGG(A_3q|TxOYzSad{Gn|3u!wh!8$2 zj!z6qmf>~q#Kfzu^LtRh-Lo;R$mBcic0aO4W%l#i@Nade-k4Qc^w6tm!#s)p(MSry z_-c+i*D97bIYI{$t1L6CAZYuR%XQ`A+|38Efxq$`qyC=`$SxKbZ(XCb?z}IOJ$K?d zB<#uDiZVF3U@qj&2$nVx9@gg8(>)ji6ybQQ|JVRzHBa;dPF=~gwH31UG0KnZ>MOZ6 zZvOOxKQQ=Kpl$oSb?HZpyrP!a?c<=e6C-!#$5>IkR1b*?ANPl&VdVDC^H+h^Z+4+g_jzGjj z{X$%KRrAjMN!b(%~CkIwmOsxx%okkW{0^1Fi2@d zVcv%C{~;-+9N#g)9E*5NIp2An6A`4YQU@76+ue%ps)8~v@r^v!r2cN%X2{xFY5j|R z0+6!-Mk61gT9mfG&3Ehjs@{m~${yR$C7$_%V2GH5NKA+tZg*nU^DUka{KA%7S{7IV z7OMVp1wims5>Gvnq;-r(zFpbsVofx6|4eO=^2i^KjUX}lLuz{ber!r@sbx@E&tmG# z)EqZRRx27K`V;~xa*gFaoj29v8M_Wg2FMCaZT+f--kU*P6wPeiZJFTjN3BRkc95~! z)7aa@T4Zu;N~x@L>V7Ovme!4`6FU@{3J>TKa}|kN2J61Z!z3n~XAnBfvd_ev96>B3?nln5pGuc!~yC zIgiHgxASni=1%W*dAsH5ma-gZi|}Z~@2gmz=9<2!vVQ9~6coKTfeayNx6w!JT z+#Em|s2QUdg#}%n?K`;mZ(B#xAe+!O+WDyPs#oBR(q>IwMxw$0Q7X z)!%*1IS<;XmE}1YmAxJwGCTL;{5Q@puo1}H-K`8Tm>y;81bR7sZ8%8V_qx2=j)^cN zyEwnD=+108CDI0z;eTnjB8M7mKD%m6n^R3hPES;o2CA@{fOppwlcleX77vpSl-bcS zDyAF2p#^2b8~z0*DC16Q#5C(LpWHi(-19Pvr66l3(o1(T_gpk7_`pt7>ASY5Mp!*dz6nA$3_nHK<4@*Yb{Qe#!KC2HO4 z?Kx(kjwrFA+&9{Fa)fVQF2PTHr7Z{F9X$2Goa{x;;c zB6;-Sw3+3$Tys6L2i$qCYy|_+~i|2$hGt?0keZ>bHbkr2!wPVBw7> z#(jWJ^vWYYF|b!&#it3k0lrf}d|?56#t{nkb^j1NdsqOS!0!EzT2gfTrRJ?{k_<_V zcmXBJ(p(B4W4oChaLW@NBl``Xg|~j-wxX!E=ra#zX6=L|E}c3py-o9}y#S;L6KA++ zb`-=A_9HeQLyr$Y&s4@p!(pi<$L71w9Ei)<8vKjPPWQy)Lr9$9lwR_^rjQdI6fXll zD^u3!g|p3cA>mHIn&aoPegGk~p61}cZ9zb1dr#{{@B-NEiOz@a(>El~6^dOzFS>Qi zT4$4u8~XNR+a9V;+0lb(_5O2p{JqEbQEY?m0PBqvydXj~iU!q7RUIbIP5JtxXSI-L zCZ#Uvie5hsQkVn=pmFz1X|^jJG}B#|$&?-K0>ku;`%RV~a!@Vkqh&O^aa9_5o0+m! z-W-sbuJ74=%~v=`Bx0;O!8vG>vfe;YfsvRdRKLyMtfyZawZ`t*K2XF(* z?=c~$EOk{s^xlrK=LuzfrpLn(9I+2x7C2sy3Gt^_*>Efb0uV>i(B#naj1s@t)b|{0 zC>pMgDqE!|Wut>r%%h3D6bnYe)EISmxItRhf7vpL^&GwDr~p|2h8V6jV91Cov4an| z5C44}u7myDh_1a6lZU*>5alMXibogw^uaUrx;k%`QkCVOW|e`@SG9{dyq^E)P{Fv? z$ZY5aPjV(2oSldlE9#bp-AWVD!U9-&M61Q5l)%m=qJ?w0OC)r6n{9jHjE3lM*MSB} zVunGO1N(XU(WR6K*f9+nY~P_f84G9ZYb6l`@37JxkQ z=4{{-bi%bvw?=}i(M7jghs4Kj@o>%C)1cAa>}MYD2b$)lt|m=cwpcI^Uj?0^+sY!& zubiIbtTb<}#FBm|%3Q_*eA(FBe@VOBB-i~37+J09(TWg{4;yCCrce93ap+p_$>AV@ zR{uDnPcnmy9S3$F?7-Z7_Od0=6oGXQx+dpx@3zH)}Vy0a22@?l-`parXNx4Sjh;z_Gk?=#27rE`;?rUV~ug?Q4 zwtG~%1VF|;D&7C;9MF73GIyS14^i48;Khj~H{c)MaF_aLtVq|La9y*O)1yd=zF!I< zG|PRYb8o`-FIV*i-mh;w&jmOtIi20dOsIyd?p|>TI@$_wxXJ2o{Q3msgARuQfy}rk zbAaS~kIH?og!G@sK?gi@bdZAI-Bv(U_JvoVZQ)lBMW|hHXdiv}3sg9o>Ea)3E&S%g z;lsA1lSya8jN+dPfCyMKts}c?`=CSCuVl-{xpj9xqsBKMta*V`sL;^SKclpW{)pDB zJzj49-l%85mzn!nBe2H&Kg;4jQQ>&sURBp5AX|$EmI?<*k0dTSv|GzMEQB90s+K4Z zpKhyp$kac%PWN8pqEzx#EM*=(OLG?Xqg(kZHQvPdqqH8;Y@lrd0OdUb0nYQ?8+DZR z^+U5~oinkn`$9#Rg}^&u8&lBH6yXNKxI}pfiG1#12cMV`?Bh*xSG-p4ox?AMIz^8K z)cv%~`AW&@T;k6=`f}`d(=QjH%*qV`RBWc8=BL>V^XgE@-BNS&eRA=e;a#^cQ0#!n z{XiQ~ct3D3UPf~th%bB}Sae^+L9RoWoAn4^R!_Y7)%HQD)5gCevNe;t!abm{f2siO z8H~Qxy8A@_xSP5N*P-`1B7{G(Y8ePSX4MGJa*;v6t=6$wEA1j0F{n{(H9loIu3&n+ z&Y^M9r(OVmMyxu-jBr9U>)Ty%?*IMe)5D-CAwl^2A~Enw;~N=ggZ6>EJ_l7vDYw1=6$Mx17|H#C}J@K)1VD>}g$>)AE(KpHrbo59YPfayqCeDm^ddGw-ep)YF zy4jX{tVjhuKK${R)pFs3I>AUW_pB9c6|-3D5vk6=F#*TvU@}cLY{;Hjwz)XZJ5xL4 zc-G%aA}((^DQtjVLPZRf(Aep;@! zFAWOE;(O8+nq7irMH1}pBsKCWYXE{!M83zS@&N*!)%|}FTBW(K!DHNWUGdSCmbdZI zWhNpu0ln)TF32w5olp=qdVp!G=o%6EGuPqe%@Y+Lrh|Ui7~m`+p7hoqO)BJ9HIaX% z)7ObyNdti}@hdmhCb~kS?$FZmRl#rWxrUgwex{&UIeo}1oy4;&=%^%#(+3EVv#^YX z@Q*B(p-PQI())9fM)Etl{_sMw4W!dq2)}m(Yi_(`ltL;sxC#RK;&@W%!c#b4va;84 z(4^&Ke~%o!Z2#{K0S@AK0$4lUaV*XhNtqpa%_X}@j+SP)&ySyJI3Z`Ydtmm{<2%4X zG<>t_3vPO@x$-J;{$;Ta&a&4H2mQ)~yt}r&d|y8EKI>Y-!E_Gg&}mHv1K{oJ@|qH#$m(c02IqYlh6NiLtNa=FEnMU z%>JB;{5INBD`?vwP*qczk2pQABZtlN5f}bxqv1J_yNd4`ZBy8Qj1`O_lf7bIlJtfS zMUzjN(Z^41@eEDB50F*<6jX$GeYLCsA2V1DzosX0OK>@9_t$p$r4$1uM}Eg89U4~R z-|H(CB&}YJgOh3ItM%!;+xm|tM+Xl1b6b>7H{4r{r<rwqvGb&qCGTzv zjSr!Z325YfK+4Y2N=tu+7ze3G)>kctv8~fDHCaFz$%HQJwsr+YjlqI(R6Z8pBRE=p z@7#eXo_`QpLYaKecq1m7Y>*q+_HV>G_IFv{xojAEBjg+w07cot-N+2 z0JjqI_gzR9WA?PAC{dhZmGpXgzjBY;!0hZuZ5v}_82-uwBQU}p)=*-V=vrjm?0 zhF<%qT@~9^bZnFsy`cbae1e8Yzh-#!_=S*vyc%86R#H+NQ04Fm>yh|%Nh(c-33BQ% zg;j;B&t3VlWjm7=u1#3g(1YgNgnm^Um$tzCW64BQ5$*d+vv+K#uP45yXMUw%5WwmO$NiYb%WHrlwbMlSIxAs6%ZvdgC(ss2#)Vmy0odBAK? zcPA~tGrMZiBwYn^HFqsOqstjhY-;SQxm41qp0047P=;i%J~szSFl-k*EFH=SdE=cy>y*GT~8&qwvwnb zXY=q6LfMj>4@r+uoz(C~^?kC3!PTH(r>#}b zw&O(XTD-$gl#Yf{;^4_%QuXFk)^4}LSchyQ6zhsYCYsTMqcsv@yri~G*+OI#_HRJ- z6Y7Hoc5c#6(Z)*dH*`zS*C1&Y09WiX2Jh5^jQgRwjMHtaMqP}{iNqvx+Z4QFa$$gd z0n*4o(V(qSd##T>C zK3U@FOawbUYieD-crc+7hG3oS%!^q!??bTS*24z+i>ooR1G!G9d^1I6!h)HPy0CnH z^r-Bx-neAyH8cBpY%Z@kNkmVK1kAk`iVV=WXD<7AEKZ)WrnpgXOqzNc(?_}+vL0+P zH7G5Trb=yqe`M@0msOt+tm2hi+q?qPQ)GWZ=@t#UY&aJ+SDD&2#29h1`qQgw4H@63 zKd*V25od=J46x=h&b_8Og-Q0^SDnici_Mi2S?yVLGO2t)<#5e`2qIsHE2?`JTafJN zenB(1bfxti_qCJ1F8?CDJ=0#slPdz~w$-0|{W*Wxu}IoFvRq>7nL9kjDpK+NdSckS z@+U(xE}gom<0Y$44BDr(z}>L$CZ`>I}u6P3;v=ZHUtK(#k2RK1%(4(d~E28wp#QhVv43 zDQufiea1jxUJMlHRBEYMoMk$U&>*gviQJBcZBU{=yI8=9$;b`YP&}s8H&DbQ%QJR! zs`dwA7{P+N|H2jpgnYq_u$!=8 zS~X#+o@&s-w&0{fRN)3~n-9z;mgZO&meRN_E=9A}2(K?HFhfLoJXI}v^EqOj6zQ&m}#2*ZqV30RGM4;M)eW03;} zab8Mm(t~Q{?sZhRQ4`u+qk_c1)Cq}hef*cKuGkODSRJ8LUe8;FB7*T$^|jfXnT4l; z68`&BDd*!f5Bm6LMNC~&%b7>q=#2P#?qL8f7I7m+`@&un;qXyY=A(3;;c@u=IbHVs zR>3Rsx3sr>4@5E8p&68 zyCPRpgEhM_ePr9D1y{c;oC#4~c7)mky9IXV?oKDkh&%QQ2vCGQ7Y{mYeA2~J}`oAV?1@=Kp5i8oOR%;1-qM_2pHTG}9_cyC9 z32c@{RU)x3tfIc==N*fw)jOh9cq?#9D)#t4uASqW^exFqJ)T066lUc+#*c>}?Jj39|17qv9-C=UE-7=B!HsSsl> zF{pc)Mh+TN>+W34^P)C$f~2gzx>$!<)C8kFJhN(p4PgA@VjvvCys*w2E|R1AST-#` zFHmB8Q@E5VW6mhb8Z)a>$MoZVZfx54+ZR&JMoobhDudxP5!23OrJzGP8dU?; zGi@y>u7=X25?sZGI_=G4W-<@Zo@||Ce=5}+0Jusu>~nPd9vOgamZj!5yF{PLJXmW! z)!e%(&1tM%3VyUatAm;M5vlfCY*<1(Z}%)R`PVT|gOP$x$ROsyZ_{IFsrl%#e8V_# zkbL?j=ze?+xe6sxL=Xb*|St}W~BB}%EVd`NDe zC1`UBeGTc_ptYd-F}4xy*Q~#)-cX<+O?nJ_K({7!4vG$q!q+!4Q1 zI=yC*P3W+VjY%0~Ei`+S<%(wq%&VGt_SnfZur1~6EJj@gt2gwCxiq)V@=T=!6%Q&4 zisSPgI`O?+?PLcfto#wW=Q)B87UTzHK%nDbV9a@ErKwp~fM23v-)hjokW8gd?<8CJ ze%-dey1%P$4Tx3V!31u(#Mgp^%=f&BANLGs)O@|UY3yJcXQK-k5X1P$7u4zfJ$5-d zTImro#2v6{#*F-~NyCr{zV_fR>U z$(8baAtRQa4NaG^EmxE?cu46tpH#BlQWE=S01`1|qLH>$>Na1A z_fDhDzA~THL&F6b7sm0vw1j8_{K-1;^ZM>)a$UhpSG|@|>0yrB2N*B^+ySYjE%@I( zKh5jUOMRA~#4KW`plr)R*+FGhR2Y(pp_5bYmqhp2(qc^&@zvS$u~jjPme568!eCHI z`PvWfwm=(-d~j*5e-bobs9In=WyZxS^yUOhq1#8~Mr3(`4x z8_lDs?DIi?(ihR=P|vk6K$aw||PYP~NpDH^pFai>iLwxet*9w8t@P?6=J*{Mnz4gJaxNkr@*K-zO$;Uy4N~1 ze=UVB{vbI2M1kzT?FcV1LIsf*asag{^5dAMMBl2m-sDXIf4wMSabWg8ET_I#R{ECk zEkZ-6OG0ED_`R!}$srJ5{ly47zLGHHE9y_E&VVXtYJyJ<{`}TQpGcP)y}$lX(dz0) z%-f5oHVMXRKGp3$1LNZhH;xQ<21t)rTQj6NRKT#2A#t>0^imR^t}J$sXxlYtNeOe2m-?o(nc`&#a+ItX5+Wcm z5cG?uR&ln;MTc9T?+5_OwE#762Z$_Hoec=9Q^t8XdiKuR5EdClwf)nL2CHS!=R0LO zi;U2dI?jxqzFyT@6EifhYk$xpdC=e3!Z{ZsUU+F+9V&8aQ{i6DlN5L90*99|uEt2p zA3RIM^`F5rWutL@(W}iAozUA@3wzcP&gUdUNps_FOwFU2CQ}4$0$*lfErn>CB_Ka< zT=k#6li0@TE1@TgTONKm#5+5;!<;~gFt%+rusd&BDoRUhHL7@vA%9F-BqyH~{;STN z0&=XWM3T#Vc1o^eJ~>yz&C{%kmfmMjH5?IL z>D2;3Jx)=fy7&`r@RUsT2PTo4MN3%bj#IGc<)?33b zI(2kW^5^lxOwc#eg7Au#{5;>2;68oLBZ}e&ERmgI?>+)u8t!;r-~+2CdIsyklsQ6D z7Z^MZ7OfDDsD6@SPU=47i%A!Ad$kV?HQqUU$>yd{KNd`}!We44s0z~oT`Hg~g^TYS_>%#387B9MT^ePo#djqlh0#dPZpda{N zfxNH_*AE|6<10lR<_Nj*)$?;c#x=F6R*aX54Dniq8Su{RF9VA18H5$C=rQ`O2gig&2!-B|-mmP6l}e=>mLrG)tJ zmJG?YSSrf+-RbHJ%UYtO@ue!5cKCt-bD5NizG@b<#iO z59?oPrfW|2^w`+^zPi%;H}9JYAk#H2#m+48H@5(*dqO<;z0F5s(4cXB!x5eoN5m-Yz^H zgHcw$Qhv2M1t)#~!L!3+$)dk59Xx1Iyp{GLw?XLsJsQFecNoQu0uJno1c=pWDdy|hsI2v=El z%sRzrkooQpUSl`-bkYbAE^0cQ;-Y`oo0}B*RTM_pl}T?ZIrzQ{5L=vEsFMi=UC9h@ zl?AT~FUfdv@BFxFwyOrhwq6gr%~pHZ#gH*h=ruXl>>?R}tji3gEC=HcPwK^Iph!H`jMd!~!RDetT5>P#jG7 z!_=wYZw1%tnLArIBLHKNDY)Yx0rE;%1b+nDMiJlnez7|}3j?wItFGI;^1|1_z}0%& zdLkI{gi2M(345)*SDygl5*>DUU$V+z9fz-@77UC##5C=P(#MV}U&REs#MPvh;mnw;7rDrJh~^qmO}3Fy}Vn!h@tBx~jdwyIO){X)n-oU0OR?+*9f7Y&hJiIb1Lgb|6* z#B~E0EZ^STa)?yg|MZRTvd;i8SX!YcG+pl;J`w?oZU~jzUjEK2k_vv4*u}y7{&Dr3 z+78R|I-~tPMT}tf17G$I5XoNgp$35wEC)cw#ya4Y9HEgB79B3jcjV@!+=kKip zhwLi0e4Heu9ejP&Oa1@~@HLhvJ9u?g#S<(O?hz-sXE;K8s>hwl1;63!|G+<4J910$ z?X)mZ(ns8nd2Ax3dyUkdoeAmUesl;tr4w#g#jGSXIfvyKEM}1pXbYazXP{G`38RA< zFToM6+%wvvQ2HxY)=$o`d@fUUG&uERzvS-PbgV{bf)EdI&j3%|lr^e$$!A;HgS6Y; zK;ido7O{Q}soqFmjO5e}ogq$hM^v9&R<9&BGD|Zm1c9iF1z~ph!t*#^oHe#qUD2VC zV(-`y^3MZ(%P1t9P_aXNdKtUVGd@oY=t}ySXyP+c@f^Vt(ZzZ=#e-Wt7K#ajsViW=N6F3^b4q3V>Ql+Uz_X(v<0IX!mb`u ztb<~jV>Iq)YzR8rAYX-3lKd7{C>vXUgo5evxf?dtoD7{BLLgelPjr8T+DTnfQ#nxRHb zDz5 zQMOHVJ0NJ;rPV6`e>MU!-Wx3~u+FDp3X)VM(z-}w%hZPRB?zY@2R40vIS*mpPawYvF(P2Sz*SQ7a4=zFz=r~bzT;T}$D|I|R=R2d0}kz~t$ z)}I+KGkzNoo&Wnf_!dU-jfM*RKjQ){`lXp&@^?Mrr8s<``tBgTj<8=RCr;4U-_Qrl zsrd5|ygD@^r~79gkoQ}yePMSA(3Z{RlfLYaxDm1Sdo=|Raf*=DHu4RXifnOxWed@P zVMD8z1k|W+%H|`TC$q|98=;sop$p600F#B+JW8bUm;iuH2n=7zzaMxW9Xdi%*US+7 zal7EBMJT@?m)Ork7q5>EbyPt`mChWhjiIL!9#2FqO8Sc4{7|JS3hOdY7F_{de|O<2 z7bwuK2kJ0#o_agPh_V*yzGmdl$jz(0E8B3N2HvhoV9cfE=7j})avF_|f}t6dTzeSp zhy>9*tvi#V3Tce-y9!)`5Mk-*(E4ccbhASgig+CDQyJ(7Ybn1WeT~yRQ~sy{pt5Fr zUDt%%rt9hF243K#DC~4R6!&aOs+;MaNTC)R<3elTo#=S;bp3f9A~mkriLh=fXOu9E zKi4GP?HvX>Cq>e+J$O|JKr{Hs?2D}?#y1w$J`obHWQ2^{I9lvJ@OPK7f;!LBwNa+# z##rd!p>7$*Pli)<==l|;+#Q>+^HMD-&9po_TC;cwQYEJ_)hh4UBYewCa zEua->r_`RNf;M~q{!Z<+>Qs(CJq`7WRlHaFdfJ=EZE5BMY5Ti;yYSU(k*%KGGv{(3 z^3Xw$O^l{y=%i<4uu*Il&7FB4Yo}2|I4hZYOm)MwE6Co2HmmC2S-ucBoJ(_xClhGV zj@8|&Vl10jn(v8@hGz4)iy??Uj&FQpLG8SfOLo-N!8IxC!h7Wsg^e3}(kkRyr^&3~ zg0B4BWSgpT0I3?ay7A{DiQtG0TId|#DNU!Ss}Kcl*e28-kKydOIrF&Zyp&sz0$ic5 zFkvu-iD2Za^p#OyT^8Gofu|lM#R#YsZ+(PV5#$=nL%cKNTPk@8l>kk(d7Xr3`j0#F z@&3hUV+dq*jkIZr^SL;t-!(>)L?OE<^UMgOlFGxE?Rzx4QZ+;;B-LZS zm-TryMbwK2(|ivRIJOmAp_=9E^`0ZP&N(cNw<`;RG|ybT|)^ zoA9b=jFc>SxO|{=G9|gkrb+w`QiLmZ(t@7du$zzi;Y$lqhZuLC7o0TP5SOM6GT)%f z<>w(O2$N!FXjie_s)w=My!=Cq(`)L`&GAFs<|rHd3rm(B{wI~s)DJE{|idEs7@Vet@y*0pC+Bo5ruPV2V~ z*azOfYEPstQl@|w$*(W7V2ir-oQ=U~zfj9@R92Cue%O=T`ppYihwQKa@h z14S0gOrVV>v#B=PKKj;$V@}v?&(M||g~7gqLH3BNv3^jH3LRs!JA*pAMzQkEXTOT~ zAA3&-_NKA~IZ@CcxEYS%ekt9zmQ5MDYCnv>DoYz$y+#|ve)krGjI}Z~CDP;{8@-giRq?uPBl|Exy>txr;^|dg>IUizlM`-w+uPm9B%1+73N=ZYrK3_ zCA4_lLxWrrS~r=Hh!bckF-$N!SIcQQ*n$H0*pqFyQOVHpnLEE1z)STQAl2Wn=9Fx+ z3jLGv4;7vNmAA&|U8s#=EyMBRe*n(q^G`I80f`N!xclc%~2GJvHu$l%JN;c7(Si?znXx>Vk}x zTvFLqcGf^*ipnXCPUNP{42=Xs4svyXNUP)6(Ue=LHE`8pqwSKD?)cJ4Mo=>RDNchc zcH07{q~wiS^Vx-F=icMI5by++N~Q{fcAZ1%JH4v8ib%!s`8!lyHF**nxl#ONECaca zs{`P61OknHY*6!1xsy%+2l^0OqsEAtfjgE>Zw(bGX5_&%{(csbSR3$1<0Y#n6U+tk zR6w%@W8gQG55V5k^85BdW{}Y^tz35bXOGVe7DH@2bM=hXAgga$<2^}Hj#9UQWhp5_03R*%|wCf5$- zg!7M$QO``7A600&T-m%Xo({#04|{iFO1l9->}SW}r}CDYM&`0qMQS~*G9aEsI_EUR zSw`7mPCsPv`B`E9!&#)tW~%gj1<=6}nI~1n^i4kL`>C)~29S1P)EJT)iO$KXiY^@6 zb?e1ZTrFO_GhvTO`f-%#OJHO)&i6^vd3&8|x&Y$~TWzwsY^X78ZKsbz7swv=Xi82E zaZ7g1Vqf8S!t5m$dqeAQ#XeCAx^$>+&{N8PzBwOFm>;g5^e_lunvSJzcW*5i4?7Ba zss+Wy&Xhp9%|mLTW9{nD`E@iSI;i)U_{J9G`tlKAYJ!{3I9K(_Jq;%elBMw&@B5d^ zmGfF|UKQN@+bov)-0fisxcNiL5k(;Kx%VHFH3BtQJ><2zp5-f4c@88E4Ds1MEKf{L zzr;w(!mi6VGlDI#{c9v-RoR5@M|+f&@p+W0eW5ck;k~o}!Z3W^up!>7tev64vzawQ zMHlkrDK9naW}7SF$?{1xiWcWs!?A~3wpQ&D!rhaUO@- z-)W-HPucWidpHk*h7ZkbXF57Gh;L_!88Ezz&sXyf>vYI)UZzYI=}<64f6pMOEuwZb zq_YuYz(#d$fAR7Rp#jb4AoD)r6A3bE+EqXVwRlO1n7qS2bHQ%baZHYLt(WDjE;J6l zsiRK8Y(6z=GWWRvpr!@d*#ZNkiTKHk8djV}P~CM6AUlzQ4VXJWJS~ayavD0|iinpO zwW}EJO&aQDsqoA^_bxfJ;hXT)gF7QVJo2AXo<8*$b=q13sl;r}HvMWYrG<?lS9--9D zp1GVp8h3D-QW$64IBYktB_#7NOo7~Dvlbi{BzDGpt}+elY6nvuh^+~Zq1NvtgmM7h z!2#>R`-1a2Hlb~*@YiV980mB!ByzDy1nV>Y7w6PeT{Y03K#$HIU#}FWRheX)7Y@sg z!-eH_mR1DxvuV$oM`-D;+J@X8G~33O{swaMq1KI&>q;-3LS+Vw#)NyG@OAvO5S})% zE?)gxBGc3Sf9$bIv{Iy`S&%egN_$VgL7Dd#$zC zUgfuLH*dEP_6ITQJ^8Q7YCn@a+;FT5 z{X~{{ks6m|)oL85q)DY3wrR0(9ZPJl$`bnYfL?79jmz#Urqe7iN)yNmd!y~_1nS$) zg%C<#VDS($+rAocQjdEGhcck3LRO$4e<`+-Ijw*il~@RC=bdfRTyzRICh!}t>kh^@ z_3QOXv@C_(C{18I?{o`SIv(CgG$!$<`rY~1)Asfni;e^t2m(1~=LUh3wcJlHnwdh} zQMohOVOQEj+EX^npHcEOc(v!<7*bkjRBPK+|4eb)U8DUedE$uOR^f+Um9vH0R97~u zo$!;E#+@(N*7@Zy(XCK%-)b6Bz=~}fwl(?19J0OiYELspNUyF-lY`J(q%YR@R))lo zYep)*xL?PnETlP;6;!m(sG_tByAcinDlIo`o2pdU)vUaXPI8r%TaBIu=xFG}jyV6z zk4>2yr}rg?B!@llva)!xdnQL~YF?oT;1op{Z zSii<#WR+!b*Ht=3x;6|$i1*G-Mp@x`rx(yg9(ne}AhlHo#*uW1eVF2^Jn7yPDE}R? z)s&BQYxHh;LE3$aS{lOCf)(tD@Z0@vEb9Ph)Y0+9r(|OA19jxx?5EqWwN9AIIZJFI z)Sn8vSG17(6LiLo@A!H8rGJ=k*2b9@+w?qI{^ebAcV&b{j(4ir!c;mu7TOz=G~C9= zl4d5OLc=>O(kpNwYx$IR3;WFcdWO>rM*jq&y_o_{Z)Hx~q;h)!0WkxULVKse}mlVpuk!p5sv**P#-T}AyfqagOf;4EBXjrFj5 z^2U>T%1~Ph7qj24&ajCqlBvhupoXvu3=X1fi7lVb>NZ*GK2hm41F3)@k__P?)+1zZ z;F|Sb$(jy59gU-{dS~j~yM)j8sKLxxBAht^Z3I_5b6VmgJrg63D4D**O|XUBVZI<( zI`OZ>h9!bzR~={G6n;i4t$pbOyK5IDf8b!p`fPY>+Z<`R-(42Mct_M4*iwg&E!2m5 zO;?)9D4=CqW+JQ1J z8hea|Ywp+AQZp`JR2R*7X|VY?Yme^0vGWKcpW7iYtJ_;2x>>89ds7cBTPaj^qZ_8R z8Tz#&NM0BF%ZkV=@<Wy0+VHV@q=CV18 z{J^$6$x2P_klf8f@94QVq!4L?xU+-QNt}({4tB)Pb5j#5h`QA}e zZgxM%owuF+hMU0JyI^#JeA)_|wqRqsn3I=ij#P6#Q)ox-$_zW@W|OsGLt0phs4ZJ4 z-4WK?mI%*TeUd+(V2V*ekj}KY*OXN{IVDhx8vG0;W_QckYA-`AQ%z-LdF5Hw+`YYp zoS!L#q;LvKrKU$k+d;3~BW0m-ms-W0;&F0cG1o?q-|+&KP|qk;&OmF)?2^tjJZR%l z$cPVFDqOhB>o=5E9E2{aq{Hp_#6CFxAVG2Dv}H>&p2JISiD*yB0g{s$D>Y^X7k<}YVfU1Pqy{C6RA}< zs<)yc_(T1 zYGe}Ukpkx-6Qa09m@Id_B3^z>c9`;lMo{#JJL3_d7v|EDn&a4}*y3?p z-nPkhX2qb_d|0JFd6$V~QX9JW?83vc^xzEI*p;<5oV74Hx%V`}jx?Ghdm5H2F;dMHK=&1uCZp&2i@Bb~)s&2RKNWk9d{9BDnOf+<{^6N?7V$Z1Ce6Mr#l!t+YpLP`*R8;9T9wVCEA z+Od}hDr&Rh?LzY{A!X#^1O_nNR;Dz9n-Z&^$LdNha1=naqAgOM99z!pjUS)IxjC7# zCz=wiRq36r;i65dZT22Ns$_LG7sb%~p|U9l?mBm4vr0I(&ct~JwXnv6HFCVL)M95| zUlC19KD1~o7~9{J+}Up0@8x2vhZtU2ZFA%fQp31B0*{et`8iNj$802q=?6f~zD_Ub zz0W8J(+okWS8WGjq=*Olj@kHc#vhcP9}9h_Eu_&pr?+uRUqo)i{7ihGAABr)Q;vBD zhWhwckKAYZS3ANtQ4;$$PFWsa7Zstfp=q))<1(7RnKeAN7lxu;AKbT14i-BV5g2m5 z3GVl6Lz1ZLP$?(nbXkux`_YE^twxEDm|M5(NH}!&t}rt=UjMvA`@@F9t>eL8Pi`Bu z+O@wCg!xtFzjd0Q31PN9-u=^s2OI7+jIiE{P^OWKAL47BfAo^SFtQ!o&`>`o#`t8@ z;+2ONAI3K+K71s0!wAGJwV;tD47sMHb+e*#(#zJ|L-}%s7e*3A7TneZg@bx6kuN}m z%1^vG`V471O~$k&a)Zd^)+yqTGnt?7FwHAipmurJ)cqsp^)7+Y)L3!DQ3jijEpfZo z`p>Oz+A{GKnXsK^baaIG*hfq@C@}^OnWN!8aAeYVk}lko1`J5QFI};eDg5!khBg1r zL-~im)BQz!FVt`hXQprdd`jf%AhO~ zcJ1(fu)HnXukJFIqbgD-kn}D7eX82y*6#~00%{2THgQ6D8i`(YtFgIOusuRibR0S4 zr03O$0@YW))tjx zkXmCvbO!Jgy94|6A8_VB zejNs}L*9+g>))X&BFb6SBNTq&Cl$*{_l+n+>Wj0rhX7*e%5~zK1sRvCs!SufeKmlh zVPh7thwdVTYmzOUW5r&@Nv}}yU~5B#$Kt@AEA2ji>j6k|(K{HFD{15mf|t9ScY#u{ zrVNn1Av#X!cOvZq0)kldurptuAgoo#F7=HM@70dJ0E!!L+<^MtnEp`&FW*po9DnKJ zW}udL3$Mk!t@W!iuNZP28D<<7kMRac3$h|Ht1?fSZZ80x?G)nhoL1+!x|!uKXczHj z_C}#mmslIJmd{Sd;R};TnNCMxfuE0q12pS!9Ev*`o~-j|&(ERfePhS8kPtkX{<==X$!$AJf2e2OR;-VD)+X(Ie5XZ&OHtOhmJf@uinh7>M7Kc*SJ8bkhCdr*)}eK3B* z`>*mbKWI3`17_a#yl7vsN8geA5`o@l-oF2)+<{(@l#?L$`#(zAz9|y1>o`W3vh(O3 zxvb2+O=T(D%=Cip&zAqDC0Y*(Jc4r}M7@;&ka4&nB3t}hq$I*xs~hQzC$t1mzFv+1 z85JP$f-~sFl>FrbR{i0}Rv07j-ANER|DL>r46KOa*U3lk#5zVB%q0!Gl{TPK^;VQS zf0}bT${<}z788q)Mr{fN7>$sUSvut#vKWT%wS=-Rm_)#EX9p4E5d`Eui$lFQ7Py?*N0d`q-5P^0FPx=pOpFy(i(%)Q$< z^E>IQ>Mr3awYBFK9%{~T($+jbI5j>EgT@+^iO=l;dA1=DK^fw9!z(K^l&Q}X}$;4`?pSPKyEny6(W_ivF51QmhiX6D-Njm zxt|)wm{8}54{)~b)kTy(hiOUSq=wsjU?-GT0#)S;H4F&(N@?^toY z_9!w|Eu6j>+E}5zObJoE@9*sUSOF1Z{AvP8T(*;nG2T}!cM3Rgf2~_~23TF1_g;2o z)Y~~I<6Jf@C@fnV#c2hDn!Zh_eJzx4Y{bOZg_lfN|9rQFerWxyHnAzu9O5|V(y8c^ zkpny|$8;T^%3o6;$?=UzFj>N&XvYm-yD{ft3BCORO zwY%_zMZeOaFEhLqszZ2QWgodc!jWVR5|laMNJ z*b!t=W@U0RNA4O~Wk9ZOrdshE4%uFCPb!QUA0EG}*2 z+8Ci%DXF~MGsTmdbZC5^;so?Fs0uG&E>l7$sqqe9QhBgVVPhS48&Y#az8((MG8(J(=kjx=~Z!kn&dNoIOTDcUDR*2LP zq#c%RovTp2@L-v}I8}NeoJ-aZ_nH}aqJ6Srh+`Bx@Z{cu`-VnQ_h#;E7z`mTIk&EB zkTjB^3x47n4B~3C`0TWF|ETpiyMY3xpvsAr#KqF-!{R`&@X*I?*no>lqyJbrf$koQs zoQdCX&i1oGlbno@a|4xpO9*lKjifyX2T)@wN|QUP?A&J9O8(ZFj6oo>nmk}yP;Zyg`)!?0IBFFs-g zgI2vVx*v>GXj(T}^|QKlDohVdnV|ozMMa0PTZKgv^m=IcNLlM70UcKlFRb-?xWLzG zt9Kx{70*1s;ee)B`M*PFuh~N0L5&&~6=-bnnOi_(e z_?twgyG^5BKGrJKhn^K@#zxr?##vT;>`Xt=z7e~u6&n`TcQQ#+l|Jpr=-uHxL0(Fv zx#A{2FW}Vp7`>R--M6EMhY2-}1Dx_2RzV^^F7&;8@GQYdFP|JUCzN!&r3o{)H7VM^ z*zt}nX^mOgQ%&Hn#+@9TsP}=z42oOudlG|@{G_3-%DkBgFg0RJV*Oy`;YubbbUg-I zI)7dy7?rba0QJN6wgAuKR+Ysn(JyZvpFJ8Er9SVeQdIQVK@ssBnuFYicRW^-gt}8V zz@$4WV>52TzT%F!3~McU`GtS7WMI2qg1~8Dn>f1G^24n~@5%>j7e^2xGcPZ`oanZ< ztB)x^J5lNFE??9e%(RElv02kaEYmBPFQI?N3AW3*;{+XFPWt! zoE14bFu2XZvtzAp0;W6&Q{?9j*x{fv($D0T?usR&Xwf_81J_~6 z78lDRb2ar04g7u@OPQXNeP$*BC_60TyW=Km)jJ*QjoL6z`juLuuZS`Ga_LHx$aU0% z{Xu@;1jmwtYL_SOWV`QsGNeAQS9c{1Yh{te@vprKD4U1NTJzw-2G55nT-%osxc=j^ z-I)xKpGOq?{BqP{eTinlHC0Gs9lQyTzbvCqq`AVZJPa3S{c6}|DQk&j3`w!#6FpJc zE{kN6<{6aK;e(mbQsQN;kaQiC-kBkksy!_*=iC&~dN%2}lU{7QGoaX`hyASTt^1wI z5~hDqZcS;8N$?IK-bW+mqJpfu62s3^d%D=#ZbH{NXMv=h$9uKFdQ@SqzvO10SDReC za>BIEGu_@D;uZ+171;FS#S2DUCC#p2P&gRm4t{K7NwX^-)wzax?I22%!?Yb%aJCLj zb1i|;rj0-i!klBIL)oOM#emJA*?NCPbv3Ch7%}{UQ+aU$1D}YOk$-i1FGM=?2InP6 z(>@q!pvPm5ZUkwE9&2!S=wOE-XOyYBs%WCU8)@H6O;ruube# ztg^0??({F!NDw@>ie;oKu;IEP%xWEIs2l1SP7QCjc9@=vl3dx!6K@$my z>?R!~4JqmxHRxG7j4LL;NF@i$%esR;4i(eLZi_;1u4bEi<_Q$Ogtl!spqIH?WW}!N zm|=2eeb5%}AMT|+XsqBujmzz-+hY!h-QN-sLMvM1NH5KPIVv=&drbD#jy2W!Rk?9t z=68PGW@fME@GV;6*_^ROSRNcuHR~!FrgAyORk_$@AlVBw?K4AI41!fAZK7p*h=fKq zEQ$Djoh6Oa`jyq9*-asNohD?2p&kroKjWp_4Lr0s^Vd~sDB24_NFrh2bG6jMdU~|K zNm;dR>K)YyM3!TT-3msv)ykoQ;inR&x?8NN_Cn)1#pHreXUYO@z>&0Tje~?%YAz{M zvWp3+Z1E*cb-A}Bj_tY^4;Hr6#JLHsGO@1RWvooxDoDMuS50#ZBTl*w6k83Bago9@ zfzoR8WvOSAi4eTq^_OigQ9us*6gy4wWy{-}BWq#?3-N&@;=5=-L*>w%!QL;NSDkJI zE8@|le5Za|+LGZyVc@tOl8<2=Oxb#W2+{sWMfQD>g&@=#=YBH2^RVzov`f$r=9(?= zQ`;O8mP6V%k+Wmu5G;wO_W4*fhhqZ+j(xcylbnI%oftxZA1Ugi;}v)0ok&Kz%aSG> znMWvGkD-kc-RaUsS$da7&Wi-Yw%Ip7?ytSq>QSWes_H2rk>%CVgCx02XI5uTx1!=L zv={qP6=|wC)5832UmWHlS~hvHJf9kDqe?!S++D7ijyTU07bDc#TEaD&x$W*I4tTq; zOZv+c$zQ0Xa#hQ@?fNTqW|d*T=^2e3(Vsp`*N1yBLzNdxk<)!$chahqLUVZKJ*l$Mv8|Ypre+0zDGz?CBxaAg1^jv`Bkw~y<>T6H8=vf1@Zdy7GjkX zgN?ArZw1>Dzm$oQC8aeb!wWg_Yk6UvgCZZ_Vdf?-#lxZF7e{W3ENB8U-VVTbfsRV( zoS;2UnqS}*68pGm_Hp);MMkRcdI(0+7iOCGO}i!|JhihQy+Mrsc5(u_lDznZLHo_u z7>j90)T8B}tWGc@7jOIG!A<8f1H8TaeKa5mn`z+U0xFNN*NVc!EQp)ady#P@`uC(}+*9!mape zJzaNdvYg~4+qiv2gWWJmSxCjnvA(0PRt)aG>6lEaS*DOb3$*8e$LeKtru}+<0yu}s zDOp#0nf>Z73K>;1ORUajl9pq*se#u#j(XDVv?RIFkCpCGwl!oBr@cyF;92Ek{Irycuo*Dj93^kXx}mI zVi@*@=I74OXPD`03LB&>OrGOzYaIxm;@^21SYf(x}7zRn(5Hl=zT zR#|x|3CF{vVoCTCBvVgqYTbV8xSuYcY0p!0IS0TfP4=M^#HmiW#akNAwy1j|(05M@ zowrv#fvFty)GmFL(bU-V<+qcd-!st&lgk}E=E8WwUz9@$%=fRTTerG2Slu<>m zOp8`7JSm0l$iE$P>+8oi-Jm>E;Knd`J6isw*~5t*q?xTwK8@V+q}E; z7?$l#cCE;S4kuF*yMrvSq&iUB6_j~h^BdXxL_8b~VFq|w;@`tqaFz4<0R&o3tbKQa zz5W*%O_Hh$2&a!NWDkLCqrY)SAYNt#N)hK|O3G7}OurEr^Qrcc7zM&4Hl&^0MfAW0 zfB+Cs>EM~MTHzrF2WG{6;_DmlPz{7hn z3^-h-Af&J(D`T)7o1@x&J-l+Rw-dR|Lc&ZG^Y6FU~_vN$2=``==gDfV9$aSJNk_na_oy-NHzq|gWLE)YzXr92SL zz(G^uPE5A!ie7%!)uiIG)}*eo_;#a-Ww*hu@FmvczNYDy0Y$S(=uc?OoDIsJ2MrpZ z9?TRS_tW7slO#c8aA8XCb9MdJ>qAkg+RE7*4MrY=Gi3Yg&y^pD&!pb0bh)jB`D}g~i7IqHVV02-L)jM1(z@X=*iwU>qg}Qo z)~hXG?yfh0+nCW2$Dg}%aLf^JSIF_Pv(7`#&9&fN$Lo^!gQJ98$jEWN3dWr6?{7md zcC&YbuVMr`3?4oR;Z^7dvLy}H=M3ejnTBCYCXS$7|IS(G zz7)zW+oB0uvlTqtELcq?D;Y;Ij5I?Ntq zwJHw2?eqkgD*RiRiR^OcFgNK5w{%^IGCdnk$9xU8(|hK^}tMRfcP&mfu?&7uJZjZ;X2=c{cj<?& z6Ut!PtqD6!vehZgS5u6en#sKtClm)0{SWrr@QS%y%NLGi7+AVIPWFc|(6le-9LmO? z_KcR~%#g=d3(5w`@^QqOFMeN5bQKLka=#3{Rn0bcR5h#@8~nW8`qIdC5yL18iL8_Z zo?5{3t}M2{RP9JnbewjHns0ZW_mr~SYTkKvh}AdxBY)oDE5K>~GnSF3Glo2uxwA34n{^Af{kH01QZg=0+Yt}Sdfm{Nlsg!+(Xd%CHFF+)yPo; z*S4lA1w7H*c|LU7gODErr;r1>d|hn4y&~Dk-n&28(X%p_ ztR90Gse0Lgx1ZH6 zMr>4If1wviMCR(yTcdaS#7!R?9@t*UxN((>In--nZzKinBAa-A;NJ@x7^&CEGb1tj zA#S+$ARYK?y-w#;Cc|e&cd&+6;G$HnNqXa3TAy~aJUFEH!K0?x~_9(G(=eY+&!EybV{|X0LM8 zLG@RumybL}559P??^X6E#cjk(JEaZ5_k9k(Wift8%Z=Wx0RJUUE>471@3!ORWxOsY z__9=?-a59CwxgWNXZZB*FTUx0H&aT!bZ!(0v5rZLRMnxpyKR;nf-Y%Xm+_g!Vz1x> zS%-{EVXO~&gCzO+`mhk@;&$iKpIbOZx?3Lirz6!vSr6?PY?u#fWJsB=Y@R=N zKA`S~LvzK`w}aO{f4(4kd%m!WwLpwo-*Pkz%uj6pp3hpB3OV`9)|2LHzkGUg;g<%E zNd4)&J!mUW6`v>NdWEiYLAr|&@|pV5VUefBFdC5V#S*d>#G{x)g{ z6`3M=L7%)QbspDceC@u9{miA20T3~Bz8SJrj1Va1p|M+3f)M!pcBrCURkersi#M}C zoGi#Tvefv&^7%_@l~34;o&5&qJKz1>q9qJ{umoMrjgBTG%nCtCyur;K5$g0Ec(?M$ z$_S!i11vswS8<^;G+iw5{NOR!CW<=V&K9K2WR!n+K^Fg}{rc?SzG{bZrj6uU^-oXg z0e%#?c!};;jn7&AL1f&AO?Zvyu~7YrM7lPEXx0fKT@QW=eObIasnfU&xJ~?CEq`1& z-L$EgB>wr0Ux#qwzIFEVco0C9`*tj%-&`%+z?>mgbw5$Vmw9v~`fdM%x3d$2dzdm9 z7&exPn|#+*tS7YM9O8r8rN9$Q9rj327kSQ+6nE%PZkP?rD7kwrRksG-B*GATcL2ol z_wBa?RjT_x_M3}Hl+*STl^`u`>q$l_c)$pDN8h@4KYuWv{?`C<9n_kO#8PiEy;TRRhlo=y=nIWX%lQm_ z%#OODarc}|YE&TyoTuwiJCuikhLbyGd=vipqNnt`&zk8TZw!Jr389VM&wcDUD)iMZ z&ZwzQv?Pd{5H0y`B$Mfs9e@j9Ao+SzbW4kQoV-?|bmoIlCTfjAL{;sCnk-WkE+*<< zY`~KMLu8!mYKpvP=zk3Oz@a|@k`!OTTY`>-=YFFW+>t1kionG?sA}Lgu-SWrC0?2S zdJOQ2++AtmSdr(wNDX3{+LooMr(`+UFYha&UVW6wz9hvw{B|kSB489rRd=9y?V}<) z?|qno1EhoMiKr!X1l4G1^kXdH`3GfCw!L%|l->J`N>v#>xWBPri`B}rpGsxZUx}#kKqJ1zu+CizZH4?($3S zv@=_#U|dI*4A3H+E=ARfr7C`VhCzpx#d=Cpwe>fnOVZZZNkG;r_HkO{FYW`d82{i~ z)VrsSAB&`jUZWV&?x?%6D;TXr2QXMi%cXFGa z>RM$_0m!ouBoru&7(9vvd;X4yz*(Ygn9B5BoI*@qGv-QheUe8gEEXC&?r>QvgJ3Jm z29Dy;t$j4^6K3WZbs?Mi4OgM@eNw9hn$6im=E0r(DSu}2H!HGz9_)8cFc_H;ssDL0o69T1L=Hgf*6#9+NI%9lH#d4%m7Tj0 zrDG}{B$|=%0POF~C+$%5K(&7FikUCpC}djxjG9LD%m~s5XoLn`QLvB#=oqqEnm2>& zb(ox3!6v@~NhuE+?tuhVz0MmtUR#AmBflJ4J|d**8d_BwsOkxC(vCq~XmO`&8%Agd zvO)|-T1Benrb=~tm<|DM5*QzZ^c!E&;iNreFpj*)EF?5>CxJ7qvxo@I?^(p%igODJ zQ`BSa1-UO74?>G$yAttsU~P2m+!;G?A8uXMA&5(He*gmm6HwrV*@C|GV0mQYuR&C? z=0~usy6a9;TKcgnHOeSWl#^WWz2liGX|@zIp1@QT2#Uc?ec_sbWRXp21>r>907p0f-^&zi0eE?`P^I8pKf_6^)qu!aRhp=xSX z3C?AJ)gUS+3)7LQ06ldt^@$1KC8L&2&4 zZ!01T^ri3^zy%b3cxB(ee=Z>6-`{<^5hylo14`{y!GUK8@*e+f$bb2lvI}6YUfxdo)|2R^7rhy(EXqtC=R z3VNED@8|!^g#TYw1SSf|{^MoWFa{_3jfOLW-kOVEf*-|&X$Um|+f36vKgBKH;1V~*$oFT_9g2S9f%cca!= zpZtYCI$!g*@Kt@d;oiRP@@>H4{zr=t1K`q|TfUB9?9L7RS99jBhH&`u2U$J-8i%lc z3beLdm>RyP`p`#AmAK9GpC)mFU=a1Ek3Ii&j13V^z%YYGuEZcEMV^p5c64Y=+Jzw=L66U?{9B@f7vhx%r*3-uqNDg@Zd>N%s*_%2%!jVy!DQ| z*94%1e+?&i*_R2dVMH_YT?(+N;(m z_XdEf{SIa+*u4M+0gar5y7&M4S_K!ZO$NEk-x;Xw$o-`=8$W^(_=Iq-{u+9nVV~3t zSSmqeEoFTroIfsiT4>bxw)GzZQJ*T9DfGD*;$N5q+(+}jGbZy7#*F_2AWQb`wiFUh z7c`TWbolWPM$P+9vI9H!{(~L9@89_3#^E5e?7-^uAivu|M|HO#I!L zY46#CCqQ<>zf9x1#V=e)H5S@kat z5xo3vz-ToG4z+<j?ZuQ|Nh8R<^p-?zFY7&4f4l8->+V=G-y6RCH8M6ioKr^)-9y(+c<1ve#B>;Py0vBvwDa@n zZC7C*g>1avlo2?H)>;Z7YcuI~>>av)Tb>Kpg{BbCX$n#j!w+;6mkT?M5dNsT`I(kz ziQvY$NxA3`&eS;kmSbwOIRGmv23eP=J$K-jl%h~0xt8|oA3pOr>uXf~<97o-$`#Lc z8Fqf}*LCnrTGT?!ZR9|3-s1Sn02Dtfkl?_--xQkZrTMq>vQH4NK|JSB+HQCZYhXb5 zC{;;lbl=9Gq(y86w`yStn?JTkYIh$mxAlS;B7d)FP+s~Eq~odY9?f~o4p=QoN93ps zwy*epl%p3gcgi63<}`Pe4cT@+wd2JF-h(VSEx}569ja9*rj zTfPNkGYn~Uw@t$jfAIAFcWzW4Nn~VX-M6gMx0E<&^jaa?X^+hQzR(OA9L=&Pn;Q3UpuHiH<6O5cZ-w zmYeHpU%ei0AEqnyb`~>@clGO3yVUO{<&?}u*4pITI0u!UX0Y|ygE7$IDtf$MwfamQ zy^2d)<4)CP(NyYeniz%QrCJ!(7nUZPP5>!^>DblKxwq?-(~Sn9{6}t;WkeMh+?`4W zBF)Xgh(5oH$g~_R`|vjvHKHa|>W2&C0(j-Xx5{FDNL82j8BWgxWK;VuENG%yzw=wq zhVr%_DPu^X@I(lE~9tM||5un2xMXDsaYp*`tFu&#TS2T`u=5gb!HE>LRdi7tqs=463WQu0$tC5GDd~@t- za^`{pb9~>OE$5ZvyGa zA+)rb4^D@qe{c2`%az%9~y0@_Z}F>s7eVO?u%Yl$j72Y!M$ z|M|Y@`t2;cm7;7LZ*3XP0X)g^AiE8&u-@8R>r|bbUoz8!cjMXE0#LxhY6aTLx8@rj zsG>P#STth5Cdk9N$SE6N^bZ>70!2$zlbo2vrJSyCLjw?Y)uRFp^&biF>f#PtS9_%q zIT6XX1&E50nPe~3<~L{Z<9D_dd+*q89|o5#%G}x4gSRKdsAeB&&Y$!sj#Wu~CsiS}izfbVqmR_fi(>~yJUjN0gIKqD4scGY2c(6tM69(T_?E|bWw)lATG(niDl%mI6VKS7 z5rtQMN~{90$J5f*+%vu8HC^#6t-_cW1HHQdj`E*|&?^g2_>M9!c4gw8C+|SgKn>mL zd;jH}vDv)W^RAn9@^Ij_oXw_Z#I7Se?2}A~wE_(;3+e+M#tpzqZG<7H#tGM1us&%6~fZCW`J4V}*nS8o6`W!KM zr4T~Hg|R_J1}~|;YZ6B@7-#}`@qg%ycY;>lbVFaTN(2dR1W_pzFlKxB z+oQR;IWB9mRujEpWnYwn@~Z}eCUYv*2{`S^^6}b*je6W4*MvJW$}Stg9$t#<{84Go zh(X*2L;tr@B?W!YL~g_jDOsNI*r|Jj7bH?>l)I(SuF)Yw?Pn!vZlFv zPdPDrakL@7aGRkCWTdWx_EK4mhd!?COJ%H0X{8oDi&7Vl!E&I^XkDI#%gLtu>qTq! zUePqi4%}MC(onS-x3Y&0X&oeY(D7HJdxH!4%`T;Q6>r?qmvEIp#vKWQ8>97fmWL*c z(&ZPRly}Q7t9L1pf7Is_4H2UgwX)01w^MeDkTB2&!0c)W5ZW=yuuThE3Y6p(X}e=L z&u2QRKVfb^AsrzteBh(@TQh)put7+8%hnA3>!Ncf8Yj(U={t(=(M>yEwA;f{Swk*( z3Y;5(q2p~489vh4UmYlrnqbD*5N48Est(g{34&RSg$0{u)A}+F zz@WjXJR8zGaygb`&p3UBq1ni{b*k(;K&)A!a(c$NLlATw<2ogG83G%wlXO-u=_SKv zkVSnNq4(;yIjeI#3U1BlM3v6BS~7Vn1s<=^UqQJ0`*KHe zMQ@8S>k>S|Q_9h`F77ZfYQN3H<<3`KyZa8kx=_Ed4d6!sy4;Ox=$9=DwsP@`VV7ez zw_UG1q63S5o>liU6LLk|uE}c{OcK4As>@n#g%FL zWLTvf0HrWX$m>B%v-!y9S-8^}c9uKCfiM%)8U$xn4%D@Py-ohUw>)Cl3q>PhCOya< zd(a*olUuKj^)Kt=sxb6Crh}%(#FS$`Z`g2(V0`(4b!-sMmMT&0eU^)!D0A?b-X;T+uQ{mI&^b2yh-<2gsX7TZQwp}SsPYhPm;I{URVfqML7-yvY%LoI&m zr@GA+&!zSs_!t<_D~DGr@D~XX(5T@|64-PR(St|sE=3mEXCEG)_YgzjEraW_(9G!I!nD#b8k4h(UH{pB|Ur$XAh}td?Bx%yE{pr ze`C->R*GCYY3m#9qPrfChJ~9_DhH}{qAL6FDFfj;iwDR1UewWU1mh9|?@+ohB`AG< zkR<9$?mJyFX=ZQ~>t2;y=b7=z$G*<@InBQFWi=~f_*r3Jh6hI1ji9@}tVN$FpuN)1 z-nB7Iz}nyEA7X0oa2ax>cwgt*Nf%6N!e#+)^D}mgIbZQv>Q}lnf3lje#$_k( z(_PDEhI4xJQG9>XJ||kv`;@V6V%WkAc$fK=ts8bQDbNQ_SWj8!&!iBRdoT5YZ+GCh zQ%nM{Hw@JjGIR+&PvQLRNT)Etb5u^qekXUIs(^-+g8foPp`r)!d$W) zCP`n?(<%`#?@o*UOR-L#=Sftjd?$8ff!TElw_W)tk<>pwDj(tPLQu_r-QVv zcN-nU#lB-}X0JQU6~P16-N{O2ouT~Tlir_5x{URMfRb!qsDm0ARZAUjK8@UYB7E{W zsb=y|LW(UL0!m6nsh|avG&MIOev!jhe)H3Kg7i}!s}P6mmdhLL?5Y?tz4Eq zf1I`X9{TG!;3OF?y^!&kwk!Nw_LeB*Hoo#p6uBjx+Nhds^l>X1?Uf7<){xFqlO|D8^Ab#|Jr z)`Mv2)@Em^HB(eFwAM~;GqW_G6ez29b^V?qi{`mg$eVzW|)$8`Yug`V8ulM!zxj(nKN5Ytiuu^EP zQL*zxFCA64dyA$HZR2|t6GUJT`mv%90A~~`IV1u@neSXM5=KTeg%Db@Q)CA?Rvr~z zI7!TQ391vLO{@-$#o)vV!L$K7;~qmeeihYP!q*kD<^BhGRb74hdOaeV6dFsAP~n$D zoAy0HqJ`~a9TwTjtsi+DIs4b9v1}H%J;YJ|{k}DW9{atbGiQ*C73rGJIGxLWez)SJ z{}$1WJ=@hD-S*hIx%?omW1(zQC-#%FltP(NwPp^kk2~?mdre>tG*LD0IPLA2%>Skw z{{FmIqsPBL1v|k2@XoGUVr+Zffsbv%F?JmV@AaG|IYLk3i%~Jx-U@9|%!eRJg5&En z*WlB0xnq6{=(gcRGQVrab&67yHqav#>jHP61aP%`P=&15Pw1qA!th4_iAGh2O;N?L zu*mwhQ@YNY)ws=}Tmb@uW`qO#Pp{IqRnT{*eV@!CQXjL`3% zTa%>#C(U&_i47on<$|obz8IXsxXPmD z(o#ss{5&RTnpsjBFpz`Z?ErlbT`4D%E^-dY-}NT%1Siib?LL(vI^HfJPI^y#yOV2NAz+drHn$Z|cq6 zXkiKxGn~lqQ1cazk~vNu&pCQx)KHPa)>G^0Cl1LT#0WxTXjgEwoA9LUEbUAK!vHI& z91xZ?v|cY(zpb`UN9dus3Ddn%20v;Kvr66EmE2NRg$PLZq9d6;iNPF>-pLbJwI{on zAk4Q8_3|E&w83~M4(U4#9j*8Dg?b;R-vG8Hc%cv%6KVjjYk{vFJmJ(&_h#0-TXjl64H)J*-%WSxYOXc#z3^G z?qDRUQs@QhG#gdukVBr?D_s2MTgD4wCMFj5(!5vI9|3F`o;j$SJu}eQzEw4{|WS`Y29R>mtTU8hVJkk}5I% zn)`*oLS?!_ezAfc#)DzhdAi^fylTN=`bL2V-Rbg#M%=NBp%{(V;?H_vM`$yAxjLRT zFM;?d9JN{~o(#Uzu}Q*E`UpctdI*c#>79Z58yOmZfwsSYPJw^FYKjhD1nP2_+J=nU zu^EHeDM%tMF&M}tPM9KX(&D&!mo6}=BL=v8J;!{_po?ybawnYlIvaBJV(XQfaMI6n z_E#>eK)eatiKP-^=GV8c9^=A2=-^oSso-5ZH)C*BE_>`f(?vKkqVGOFoPIr4P9_wz zB%Ke}gV&0~vDp)PhNMCKjcT%|9o`USN1$UY)c1Bhp;GIukF9OW?;pNv3bB;HI49LkPTdVYdbyC-PTJ;#)-821YGZEQG4Xg#{8# zEUC4jp#EB!B!J<}kO#%w#2oUH^hfmV!n&3*`fvid9?}4|pgz%avOUP()So1iO=?bF zG$k~yX>_xADDVDJ<20+NVeVIR;u+Sye#(_o$Hd5;a7>g={_9=W%ePZPm8M|cgmsm$ z3oBOl;LNp`o9D03-1bg03E1EO)j(If<|_RbR5tldWuBqLjMxg>91ib!qBBbsRieUu*16U z5@QUVv3QfR;@q#@HRCCHW1n`0#_-}c`(3;_LWf7Cwtgp$fT%l*|0&mZH`r_@ z7~OMc2XLqM;5yysJY6mbEvmuJEg;NH)t&WTN7KT8zFzUSVFr)JMa-3(MXT#Oq8ICb ziI$+?zex;?q0amQsK5Sni+Y#K1wDMLTeO#VW{sP=JU&FwjQ84r7!q|TNo=Vtq75!@ zGhDKvWWza%3D|a5NjViFTPvgF3=#QhK~j#qlFkM@OV3hi9+Y$?K53IagxM&)7vD~- zkPll8VPYB(7)1moOSrcPH?1sxTY1vrKLPWMZl9EC8dFk^;|?ZSLYfWKD->2y{k{l6 zC;FNrbQ;fM%7u_GSjw#*(cD~Lt8NaCNgxY^5G##No2LsH@=@w%eLUAwa4p%1TG)`1 zePF^psoenA?nsFxF}k~s3jc}F&k*6L`B4LcB0;I<>(u))XQXvgUd`KI0&uMGb^BZ9-}i(juZyVNu4I zPJiEvv{@9DtsgiWi{RliYY5Uy6jGkhk>9*iK%1BLHr;RF-k~Gp(TZ#4u5#braZ3V#5YE6Umm2nAy6?c2JJLdZ!*2F09 zbJ_!?`56X=cCYTIvgTkZbD^L}8J=yFk9*4&rKOJsi2V;}D|>L8i-@`h=ko&9xe-3N zJh})n-{8WKWx^5M*$D<=>;Xao7k&w8E@OsYSmK_Bt*2Ye1J$o2gA*K|damgQHFR%g zvTRMwGS-A~7J4%T_B);33Frlks{3SRX>a9~-JQq}L(n^RMD{@_DS=poWXn{YP1+$@ zy4-;#i{#D1)d5IJZ}ForDJL%uQ9H*j*^`EaRwKjvu*iC$QWC8{b~{&57bHv&OKges z`eTtMb=B0FJT`Kk+V_M(pW3ql3Azym6@NXq9avPK)n90;;+Pr1q!t(B+@fa;)Ewgs z#Wo-WRpGv!(vQXkEp7E1ye|93hKm`{U0gNS?EpV5up=1`o4eAR(1o4SF~b=cQin2; z)*?7QHkXT6rvJ4@9Dy5UPa6(1E!C6rQeAgJUi3Jq{*pAcV zcZ_Qib|QG~?@UWxGA-c+)6(U?`md`3@JWu@r89fz9wewL>EHaF*isRDksP*Uf~^!<%}Ij#~NvKf#)Wp68sUlMw5tb{DHYKL8+Ysn7Isd+=|J9=SMasS!3U*2 z?=^F8{{%|IaC?n!_Au-L(-uu?u)&O?P^u2~kdL4py?X~qTbCzR4GmEZbv}vO?s&gY zjPjl&f8^ri&h*KOVD938&6fK+1WK)gs81bmb-YKNtHs#(=-*aqL4_eKWRc6E%2O6a zC2^aVT;nm_q`yY{hu}oeC51i><_MFZ3(pCfzh*F;R4aAx`PD~IPesKz*p+5)^GyHO z>CK?TKn?xK4~{7ypCa!NiIvDp0`{E!b^gqy&5Ym)C{^zRhBc@K{G%{bfBJ|q%4m*s zJBNv>l2%F=g3oW`=b9zRunSEYb+54?ytJdKs?W%5xvuG}b?Iletr=YRtK*Y$s=y>F zdx8MoJbGSOYNW|q9G~-+qKbVDB~CS6uOJML1HCcWwG#I3vf7zP(Wk7_89N$r)Rv%# z`6!M5)})w&x@NYloGX{lW zlCij3eUB+d)NjmpzFaZG>KynubH*XjboeKr>7-XX7Y=J@6-C_eJLDw4iv!G#%SCf7 z8<7odMb-yxHX+8d%_k8O=h-=}GI)0Asbc{me|0HCoqaw-r4HEAr}Bsz7vDzXxl?4L zTKZ1Jk6rVJfX1}{_} zY7atBpm zy)X40qqD>{J2b@@-Sv6k1FE#q`qgCUkY&7G<_9cwF ze{AZ%*q}4rxji>z?!?vnMyuwXtx@Xvw9ZB^MK9szoKa8PXZ&{e*#O3~jKwq6geU#u z=kbKLkXatxy}|=LH|bbD*q#IK|HfK(!+sGQ(tK)kxCuuFRdVuNu%h(MKt8bi7J1t2 zNFHM?(i@tVu45IYRs1DFnWd444{D&8u0r&=6OCb8F+s73G^r#kKLA!PF2T`)&^H55p%5JxAi#KY$2q{95Ms?dSUPG?&a8j!8d z;;%6*wzq$KeJ@Hb>LVwUj8IVB?4XfgG;DuJxkHf~FTIgEs~$sBW4i8jc#e2fpF93SnJ*vP1@3Zglw z+_ubzv>(yrTJstRo9(NepYdWwF*w-g-9-*%XlMGugQlMB+B=}p++h#HegwMhVo;lz zT_@jp1Hfc+Na+$RGcs2K_6ijI$b3_GVOUJA1?GF44?uqqMPtx zKWMOX5W$xo3VKQUA>!3)w`uf1hd}9+B$pIIkQ!^sO$^i0XQ4M~q-eqeDsKGrAUbk) z`MF_b+>mr#_|Q-1pYdy%Kf}!sFRQ$L*b-r?5Bhhzwhk`X9IT5cH~dr`R% z>SpL$n+Kh1AgZrAZ-DU{_e2=SyhBIQvOzC5dJFul{0Ng}5Mit(jPB5h+cfkhjlKah z$>wd6`5L5iTBfusz&puL)s^D~yNWv7McgHo2n-M_j36XIQqV|8s0*4LI7sB>B3P;G zvu5M}=Q_;}R^=QJh*22l@+lfLLku~JL0$JyNKY3)f1J~9p-4u4DCz95p~Tcyot>WJ z9f-hIO|;gFqAD?d{a1Zt?Hy;@spaH*4fHZqKHonwtq22^Uh<`uf7TETSBE4a(>HkG zZqK$l_2GnEMIyShXwDqUGqQCxlFBQfb2_TWS7o2S*pxk`nk7j2?r-=c`#eix9;!@v z^~Wz4!yKVlY8_i@{DjUnJIs?njs_y-vG6Sq?v^Kt(F6D2YM0`M3m0z=;O8F?V!iOi z4tZ6>6O&rJj{sU-)J}+HK)K>ksNT>=v$q2$(iVu0NDKw=Bt&o|3tlNows)P4hE|UF zMr>xyt7Y-k!R$0XHGWe>fb&& zh4K;jd`lS2Rr%_^R>E8^AidnPymI?@MW1CTsaZnajU*jM91ij8>}Ty(-LsVjU`1km z)rjS%jXq4adGvC6>-{&7lstd~|4$Qbb`A%8NdH4VWS8AzCAK%N4sv20IL?z4>PQ+wsBhqd*J8Wh}H1=Gt3G;yJ_3Q(@p(A_;EJ@hON@dL^rU~lhUA5v- zl7=JeNgMdFth`v!S(li0ro12lQC^YFFeyDH3MhR-DIAR6!J36D#uHnjQg!13vG2i_ zohd?H{f3;v`H%vS_P(Jh{QGAMhn@`)fg70eh}$pe?omDdxKXF@andc9g{k0yQp=xm z(`l=Ja;+-iAcRNO43;}-J0PW&lu#_q2{v~`N$-gw8kJiX%Dl{5A6T!z)r- zuN*jvT`7QsV0^!URHU+c@BhQcdCv5;>yw2gJ=crfe&O-Do4(@C->Qp-(nosN_HE`J z=odo>jVX=5*%^Fosq6+ zZGlj7Zoz&+wL8X43r7Cmv+WLJ4{OaHgoICQl@R_~$rxY=2PNVgBjs$#-!a*tNri6h z9%6Tn?Dzv*URt&l<`JfglR)d!&b0LmP1P~_P=PEF|`}>C4i9Im_NlaDimr--r!X??~zU=CoWr^;>@sF z&#gL8q<%Wz2UQTkl=J88c`5f2QBKTG^ufIgTxWAow^OtqJg&A8jkfkN-|phypBYPW zPPZ0@C4PVJnz;(5xW(&fqJY|`4xd@hQ%1ajN+l`ww6n`N!>tR)51V|BaT80sIcYt_ ziEE+d$DLBe_5_GNsE9o?_C~cz5=LUj)plueZx~yp%1xM%_HdAXK~Tm59~&#*xjNu> zc=X+nh3Wa>Ie=7A0ke`~oXy!fX(@DCz!55>WuE&(S!f^ld{KTD>{(T?%KH7U(~AUL zjeKcvdRm9taT;Wqnom2eOygPhA7>WD6Ha}P))Z5tWA?t6gmobasGdOpZ?$5|5oq+D zY+trh+--W>5$(>ATd>A+RLt##aVLrLW9gg>)ydxC)gI2Q?u2{d_-t==n;TE0B_gIq z4V%>gExP_R29%0}F7lvbbCs%QX&n*+)iH-5*_D*Vkav))NYLr-9%&A?>U{W)wA9K9 zX*QJ|L@JY8--dciCB!LWWxe|SAsG6QO$7!U-7sHUBAr~Yn+lSK73*B3=OIbYdj7Vj zubEnqJug?rh)xnZ&X#}HMfu1_@J(BzD-lTtAgiNbpd+Qc@^TDOASp^h_E*_=2=v>YMeGI@2>-BVeP zn}M075Y_>)&sHcqcpkMTe9BG|V}9KY7quhbS(?*fb2EWPrdHFn^TT2JBtl#FCL|`d zNA2Gjx|JV5{kB|y6X>kKDu{h9P+_FEP7f42b1aC<3BkoCx4PA8Fkxe4_ zbr&7w8S3=>JwC$PJbstqd#i0Xp4PA6Y!p-MKgM`Ac>u#H%13qHV5pTmM-dcF!dNI@dw|1T6#XI zLAROO+50)mEk@`C?ArXj4?h4ULDR|io>-Xjs%g;ROuo2G%O>DITxlvV?=Cloz@8=F zch;@4w)LyzA($&XUrglv%&k20XVmbD%TvccbxX*m{lI#Q!fN&tL6O_iEe7+*1 z2?R3p;_FXz6SFk65x9e|TRbmz#yV59dmFht)o9#T*lIIBpM>Sz09&cjRuUKMy;5(E znu;C?qw%*t?p$Y@0cpu8^47{#dp-mP zc=P0kOMZT5vuWTm_C}2Va>`@6bw<63>WUklD$$o^$o%R3JMXSosoMUSl|D0Bkv_+_ zkwMEof1bg9qouoHGmC8?k+O>=V?*%=T_=k5)cC@!X zx6C{yVeULK0qE{i05!)vr|O`kG10%8ES`G;5X9ZoFSD6_3Y#0gPags9cFANj+UZU2 zJbUiak20Vr_134ek2hJ*8V#!~Lf$m#cKsXse+Q8>CWs6_g~)N&=VY*7nr8g_vnNgP zXDTh+0f3QhdSYhWa30w24}{4lbeP8`oZr|a>&$U@+SVDH_H5ek)kM_v+Kd{@M3%Vt2-N! zsgv8&6O1FmbiBL4Y2&EuL_>;3E>cPuiX7zK3ucqA*Iubw?!iAyvlz80m!8LWy$Gb0 zbO%5Y29@44;=>Xe^PD|rhjY#^ZXX;<*C#O+6pJ$q^$F6YW&Az%f0biYcyZ?Ri@$nt zx+Z!yK8GY=@0nvOi8^yHqSkM5X2`r$s@Q%sbEbA!T|+mU-0W1ce52n90S18F^qEqj80*7^tM?V%2{> zb@_jmXms7z*@zD_XHI@L`E%0`JlRC-MPH;& zuZ1*wzupe^BfqGx=WhM*1h|y@h2a*EH|{&f7uWIPU%7)&GqZBIIPVu*&#(~UpFMvk zXuQt6+V5?WcU>%aYwr&)zOx!|*EU<5#;?pK@BMq~IkJ0kMZn6*mf+Hz4?WR9UdqYW zpY!wokopkl^ns((M&EO}ki8+d=+BU!Y34tacKS;|8>{bn@BDUO z>Q6ry|LpmQbKug~YqCx9+V!sZG~CCKmSwBuCjjnam(V|P{q#0*=+OMGQa?1TBXF>L4z1Eb|SgEr4^T` zAqSxsif$Zm|C4q9WyQv|zt}G9#p;CV3!31f^o7~i!Ww`4GyGe)hud;tg=UlM$s6@n z&4~{LnANv>=%M8J&PQ^d@lV%l#+&ewUX04p~5?=s#WKe?B1 cWBPTEk(uK^d|dbn`1i>_4}C=c@Yt9C1K<*5C;$Ke From cda7a99ec7194646fb9feb29dbf6e4aec539c82a Mon Sep 17 00:00:00 2001 From: mkomorski Date: Sat, 12 Oct 2024 08:13:21 +0200 Subject: [PATCH 252/816] bidResponseFilter module docs (#5647) * bidResponseFilter module docs * fix * end line * change example config * change example config * description change --------- Co-authored-by: Marcin Komorski --- dev-docs/modules/bidResponseFilter.md | 50 +++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 dev-docs/modules/bidResponseFilter.md diff --git a/dev-docs/modules/bidResponseFilter.md b/dev-docs/modules/bidResponseFilter.md new file mode 100644 index 0000000000..654ba6d49b --- /dev/null +++ b/dev-docs/modules/bidResponseFilter.md @@ -0,0 +1,50 @@ +--- +layout: page_v2 +page_type: module +title: Module - Bid response filter +description: Validates bid's ortb2 data against its meta data +module_code : bidResponseFilter +display_name : Bid Response Filter +enable_download : true +sidebarType : 1 + +--- + +## Overview + +This optional module will trigger validation of each bid on the bid response. Validation of a particular bid is based on its `ortb2` values compared to the values in the `bid.meta`. The module configuration allows you to specify whether to enforce validation of particular fields or not. It also lets to specify if the bid should be rejected if selected field metadata value is not present. + +## Configuration + +Fields that can be configured: + +- `cat` - Banned categories ids +- `adv` - Banned advertiser domains +- `attr` - Banned attributes + +### Field configuration object + +{: .table .table-bordered .table-striped } +| Field | Scope | Type | Description | Default | +| -------------- | -------- | ------- | ------------------------------------------------------------------------------------------------------- | ------- | +| `enforce` | optional | boolean | Specifies whether to enforce validation for the field | `true` | +| `blockUnknown` | optional | boolean | Specifies whether it should reject the bid if the corresponding value in the bid metadata is undefined | `true` | + +### Example module configuration + +```javascript + pbjs.setConfig({ + bidResponseFilter: { + cat: { + blockUnknown: false // setting only one of parameters will keep the other one as default + }, + adv: { + enforce: false + }, + attr: { + enforce: false, + blockUnknown: false + } + } + }); +``` From 0f8d447cfcdd0d4da321dfffe18fed3516442601 Mon Sep 17 00:00:00 2001 From: AdsInteractive Date: Mon, 14 Oct 2024 16:54:19 +0300 Subject: [PATCH 253/816] Ads Interactive: fix bidder name + add gvlid (#5657) * add new adapter ads_interactive * fix name + upd --- dev-docs/bidders/ads_interactive.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/ads_interactive.md b/dev-docs/bidders/ads_interactive.md index 06b692b25c..1043fa08e0 100644 --- a/dev-docs/bidders/ads_interactive.md +++ b/dev-docs/bidders/ads_interactive.md @@ -1,10 +1,11 @@ --- layout: bidder -title: Ads Ineractive +title: Ads Interactive description: Prebid Ads Interactive Bidder Adapter biddercode: ads_interactive gpp_sids: usstate_all -tcfeu_supported: false +gvl_id: 1212 +tcfeu_supported: true usp_supported: true coppa_supported: true schain_supported: true @@ -19,6 +20,7 @@ pbjs: true pbs: true pbs_app_supported: true safeframes_ok: true +prebid_member: true sidebarType: 1 --- From 923fa9f8d1af7e31668419b85ae185c9f3f7b424 Mon Sep 17 00:00:00 2001 From: bretg Date: Mon, 14 Oct 2024 10:03:20 -0400 Subject: [PATCH 254/816] Mobile refactoring: adops focus (#5507) * initial control * adops pages, outstream * wordsmithing, linting * lint * lint * prebid-rendered approach * renamed * lint * renaming * custom integration * mediation platforms * lint * lint * typos, wordsmithing * wordsmithing * Update _includes/mobile/intro-bidding-only.md * Update _includes/mobile/intro-bidding-only.md * review updates * review update * review update * review update * Update prebid-mobile/modules/rendering/android-sdk-integration-gam.md * review update * review update Applovin to AppLovin * review update * Update step-by-step.md * typo * typo * Update intro-custom.md * Update ios-sdk-integration-admob.md * updated diagrams * refine custom * tweaks --- _data/sidebar.yml | 34 +- _includes/mobile/adunit-config-android.md | 35 + _includes/mobile/adunit-config-ios.md | 31 + _includes/mobile/banner-params.md | 23 + _includes/mobile/intro-admob.md | 60 + _includes/mobile/intro-applovin.md | 60 + _includes/mobile/intro-bidding-only.md | 117 ++ _includes/mobile/intro-custom.md | 102 ++ _includes/mobile/intro-prebid-rendered.md | 128 ++ _includes/mobile/native-params.md | 61 + _includes/mobile/video-params.md | 80 + adops/ad-server-integration.md | 8 +- adops/adops-general-sbs.md | 16 +- adops/adops-planning-guide.md | 2 + adops/creative-considerations.md | 182 +- adops/gam-creative-banner-sbs.md | 68 +- adops/gam-hbt-step-by-step.md | 2 +- adops/gam-native.md | 76 +- adops/key-values.md | 8 +- adops/line-item-creation.md | 142 +- adops/mobile-adops.md | 35 + .../mobile-rendering-admob-line-item-setup.md | 7 + adops/mobile-rendering-gam-line-item-setup.md | 73 +- adops/mobile-rendering-max-line-item-setup.md | 9 +- adops/setting-up-prebid-video-in-dfp.md | 11 +- adops/setting-up-prebid-video-in-freewheel.md | 5 + adops/step-by-step.md | 93 +- .../mobile-details-custom-bidding-only.png | Bin 0 -> 42424 bytes .../mobile-details-custom-prebid-rendered.png | Bin 0 -> 39261 bytes .../mobile-details-gam-bidding-only.png | Bin 0 -> 49353 bytes .../mobile-details-gam-prebid-rendered.png | Bin 0 -> 65145 bytes .../rendering/In-App-Bidding-Integration.png | Bin 124636 -> 121956 bytes .../modules/rendering/order-gam-create.png | Bin 45610 -> 0 bytes .../modules/rendering/order-gam-li-create.png | Bin 81051 -> 0 bytes .../rendering/order-gam-li-targeting.png | Bin 64286 -> 0 bytes ...ebid-in-app-bidding-overview-mediation.png | Bin 99293 -> 132401 bytes ...n-app-bidding-overview-prebid-original.png | Bin 104694 -> 129733 bytes dev-docs/bidders/ix-server.md | 5 +- faq/prebid-mobile-faq.md | 4 +- overview/prebid-universal-creative.md | 18 +- .../android-sdk-integration-admob.md | 111 +- .../rendering/android-sdk-integration-gam.md | 114 +- .../rendering/android-sdk-integration-max.md | 60 +- .../rendering/android-sdk-integration-pb.md | 114 +- .../rendering/ios-sdk-integration-admob.md | 94 +- .../rendering/ios-sdk-integration-gam.md | 105 +- .../rendering/ios-sdk-integration-max.md | 55 +- .../rendering/ios-sdk-integration-pb.md | 118 +- ...ndroid-sdk-integration-gam-original-api.md | 1477 +---------------- .../android/code-integration-android.md | 2 +- ...ms-android.md => pbm-targeting-android.md} | 9 + .../pbm-api/ios/code-integration-ios.md | 2 +- .../ios-sdk-integration-gam-original-api.md | 1309 +-------------- .../pbm-api/ios/pbm-targeting-ios.md | 9 + .../prebid-mobile-privacy-regulation.md | 2 +- prebid-mobile/prebid-mobile.md | 118 +- .../android/gam-bidding-only-html-banner.md | 124 ++ .../gam-bidding-only-interstitial-banner.md | 92 + .../gam-bidding-only-interstitial-video.md | 121 ++ ...m-bidding-only-multiformat-interstitial.md | 83 + .../android/gam-bidding-only-multiformat.md | 259 +++ .../android/gam-bidding-only-native-in-app.md | 273 +++ .../gam-bidding-only-native-in-webview.md | 163 ++ .../gam-bidding-only-rewarded-video.md | 101 ++ .../gam-bidding-only-video-instream.md | 143 ++ .../gam-bidding-only-video-outstream.md | 119 ++ .../ios/gam-bidding-only-html-banner.md | 113 ++ .../gam-bidding-only-interstitial-banner.md | 72 + .../gam-bidding-only-interstitial-video.md | 76 + ...m-bidding-only-multiformat-interstitial.md | 98 ++ .../ios/gam-bidding-only-multiformat.md | 177 ++ .../ios/gam-bidding-only-native-in-app.md | 202 +++ .../ios/gam-bidding-only-native-in-webview.md | 122 ++ .../ios/gam-bidding-only-rewarded-video.md | 78 + .../ios/gam-bidding-only-video-instream.md | 148 ++ .../ios/gam-bidding-only-video-outstream.md | 93 ++ 76 files changed, 4338 insertions(+), 3513 deletions(-) create mode 100644 _includes/mobile/adunit-config-android.md create mode 100644 _includes/mobile/adunit-config-ios.md create mode 100644 _includes/mobile/banner-params.md create mode 100644 _includes/mobile/intro-admob.md create mode 100644 _includes/mobile/intro-applovin.md create mode 100644 _includes/mobile/intro-bidding-only.md create mode 100644 _includes/mobile/intro-custom.md create mode 100644 _includes/mobile/intro-prebid-rendered.md create mode 100644 _includes/mobile/native-params.md create mode 100644 _includes/mobile/video-params.md create mode 100644 adops/mobile-adops.md create mode 100644 assets/images/prebid-mobile/mobile-details-custom-bidding-only.png create mode 100644 assets/images/prebid-mobile/mobile-details-custom-prebid-rendered.png create mode 100644 assets/images/prebid-mobile/mobile-details-gam-bidding-only.png create mode 100644 assets/images/prebid-mobile/mobile-details-gam-prebid-rendered.png delete mode 100644 assets/images/prebid-mobile/modules/rendering/order-gam-create.png delete mode 100644 assets/images/prebid-mobile/modules/rendering/order-gam-li-create.png delete mode 100644 assets/images/prebid-mobile/modules/rendering/order-gam-li-targeting.png rename prebid-mobile/pbm-api/android/{pbm-targeting-params-android.md => pbm-targeting-android.md} (98%) create mode 100644 prebid-mobile/recipes/subrecipes/android/gam-bidding-only-html-banner.md create mode 100644 prebid-mobile/recipes/subrecipes/android/gam-bidding-only-interstitial-banner.md create mode 100644 prebid-mobile/recipes/subrecipes/android/gam-bidding-only-interstitial-video.md create mode 100644 prebid-mobile/recipes/subrecipes/android/gam-bidding-only-multiformat-interstitial.md create mode 100644 prebid-mobile/recipes/subrecipes/android/gam-bidding-only-multiformat.md create mode 100644 prebid-mobile/recipes/subrecipes/android/gam-bidding-only-native-in-app.md create mode 100644 prebid-mobile/recipes/subrecipes/android/gam-bidding-only-native-in-webview.md create mode 100644 prebid-mobile/recipes/subrecipes/android/gam-bidding-only-rewarded-video.md create mode 100644 prebid-mobile/recipes/subrecipes/android/gam-bidding-only-video-instream.md create mode 100644 prebid-mobile/recipes/subrecipes/android/gam-bidding-only-video-outstream.md create mode 100644 prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-html-banner.md create mode 100644 prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-interstitial-banner.md create mode 100644 prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-interstitial-video.md create mode 100644 prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-multiformat-interstitial.md create mode 100644 prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-multiformat.md create mode 100644 prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-native-in-app.md create mode 100644 prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-native-in-webview.md create mode 100644 prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-rewarded-video.md create mode 100644 prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-video-instream.md create mode 100644 prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-video-outstream.md diff --git a/_data/sidebar.yml b/_data/sidebar.yml index f0dafdb9cf..14813a6bc3 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -727,7 +727,7 @@ subgroup: 2 - sbSecId: 2 - title: GAM Original Integration + title: GAM Bidding-Only Integration link: /prebid-mobile/pbm-api/ios/ios-sdk-integration-gam-original-api.html isHeader: 0 isSectionHeader: 0 @@ -735,8 +735,8 @@ subgroup: 2 - sbSecId: 2 - title: Custom or No mediation - link: /prebid-mobile/modules/rendering/ios-sdk-integration-pb.html + title: GAM Prebid-Rendered Integration + link: /prebid-mobile/modules/rendering/ios-sdk-integration-gam.html isHeader: 0 isSectionHeader: 0 sectionTitle: @@ -759,8 +759,8 @@ subgroup: 2 - sbSecId: 2 - title: GAM Rendering Integration - link: /prebid-mobile/modules/rendering/ios-sdk-integration-gam.html + title: Custom Integration + link: /prebid-mobile/modules/rendering/ios-sdk-integration-pb.html isHeader: 0 isSectionHeader: 0 sectionTitle: @@ -809,14 +809,14 @@ - sbSecId: 2 title: Global Parameters - link: /prebid-mobile/pbm-api/android/pbm-targeting-params-android.html + link: /prebid-mobile/pbm-api/android/pbm-targeting-android.html isHeader: 0 isSectionHeader: 0 sectionTitle: subgroup: 3 - sbSecId: 2 - title: GAM Original Integration + title: GAM Bidding-Only Integration link: /prebid-mobile/pbm-api/android/android-sdk-integration-gam-original-api.html isHeader: 0 isSectionHeader: 0 @@ -824,8 +824,8 @@ subgroup: 3 - sbSecId: 2 - title: Custom or No mediation - link: /prebid-mobile/modules/rendering/android-sdk-integration-pb.html + title: GAM Prebid-Rendered Integration + link: /prebid-mobile/modules/rendering/android-sdk-integration-gam.html isHeader: 0 isSectionHeader: 0 sectionTitle: @@ -848,8 +848,8 @@ subgroup: 3 - sbSecId: 2 - title: GAM Rendering Integration - link: /prebid-mobile/modules/rendering/android-sdk-integration-gam.html + title: Custom Integration + link: /prebid-mobile/modules/rendering/android-sdk-integration-pb.html isHeader: 0 isSectionHeader: 0 sectionTitle: @@ -974,6 +974,14 @@ sectionTitle: subgroup: 1 +- sbSecId: 3 + title: 'Prebid Mobile AdOps' + link: /adops/mobile-adops.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 1 + - sbSecId: 3 title: "Ad Ops Information" link: @@ -1042,7 +1050,7 @@ subgroup: 2 - sbSecId: 3 - title: 'Creative Setup: Banner/Outstream/AMP' + title: 'Creative Setup: Banner/In-Renderer/AMP' link: /adops/gam-creative-banner-sbs.html isHeader: 0 isSectionHeader: 0 @@ -1066,7 +1074,7 @@ subgroup: 2 - sbSecId: 3 - title: "Setting up Order for Mobile Rendering API" + title: "Mobile: Setting up GAM for Prebid-Rendered" link: /adops/mobile-rendering-gam-line-item-setup.html isHeader: 0 isSectionHeader: 0 diff --git a/_includes/mobile/adunit-config-android.md b/_includes/mobile/adunit-config-android.md new file mode 100644 index 0000000000..0cce97bcb2 --- /dev/null +++ b/_includes/mobile/adunit-config-android.md @@ -0,0 +1,35 @@ +Each ad unit in the Original API is a subclass of the `AdUnit` class, which provides the following properties and methods for additional configuration. + +### Auto Refresh + +#### setAutoRefreshPeriodMillis +{:.no_toc} + +If set on a given Prebid Mobile ad unit, the `fetchDemand` function will be called every `periodMillis` until `stopAutoRefresh` is called. Each call to `fetchDemand` will invoke the `onComplete` function. This refresh only pertains to Prebid Mobile and not to any ad server refresh processes. It is suggested that the adServers refresh be turned off. + +**Parameters** + +- `periodMillis`: Integer defining the refresh time in milliseconds. + +#### startAutoRefresh +{:.no_toc} + +Starts the auto-refresh behavior for a given Prebid Mobile ad unit. + +#### stopAutoRefresh +{:.no_toc} + +Halts the auto-refresh behavior for a given Prebid Mobile ad unit. If no auto-refresh behavior has been set, `stopAutoRefresh` will be ignored. + +### GPID + +(requires SDK v2.1.6) + +The Global Placement ID (GPID) is a key that uniquely identifies a specific instance of an adunit. Some bidders require this value. An important scenario is "infinite scroll" -- if your app creates instances +of an adunit dynamically as the user scrolls through content, the the GPID must be different for each by appending some kind of sequence or ID. e.g. "/newsfeed#7" + +Using the following method, you can set the impression-level [GPID](https://docs.prebid.org/features/pbAdSlot.html#the-gpid) value to the bid request: + +``` kotlin +adUnit?.gpid = "/36117602/hnp-sfgate.com/Homepage/AP300" +``` diff --git a/_includes/mobile/adunit-config-ios.md b/_includes/mobile/adunit-config-ios.md new file mode 100644 index 0000000000..42ba1f2aec --- /dev/null +++ b/_includes/mobile/adunit-config-ios.md @@ -0,0 +1,31 @@ +Each ad unit in the original integration method is a subclass of the `AdUnit` class, which provides the following properties and methods for the additional configuration. + +### Autorefresh + +#### setAutoRefreshMillis +{:.no_toc} + +If set on a given banner adunit, the `fetchDemand` function will be called every `periodMillis` until `stopAutoRefresh` is called. Each call to `fetchDemand` will invoke the `onComplete` function. This refresh only pertains to Prebid Mobile and not to any ad server refresh processes. It is suggested that the adServes refresh be turned off. + +#### stopAutoRefresh +{:.no_toc} + +Halts the auto-refresh behavior for a given Prebid Mobile ad unit. If no auto-refresh behavior has been set, `stopAutoRefresh` will be ignored. + +#### resumeAutoRefresh +{:.no_toc} + +Resumes a stopped autorefresh for the ad unit with the previously-defined autorefresh value. + +### GPID + +(requires SDK v2.1.6) + +The Global Placement ID (GPID) is a key that uniquely identifies a specific instance of an adunit. Some bidders require this value. An important scenario is "infinite scroll" -- if your app creates instances +of an adunit dynamically as the user scrolls through content, the the GPID must be different for each by appending some kind of sequence or ID. e.g. "/newsfeed#7" + +Using the following method, you can set the impression-level [GPID](https://docs.prebid.org/features/pbAdSlot.html#the-gpid) value to the bid request: + +``` swift +adUnit.setGPID("/36117602/hnp-sfgate.com/Homepage/AP300") +``` diff --git a/_includes/mobile/banner-params.md b/_includes/mobile/banner-params.md new file mode 100644 index 0000000000..64129178cb --- /dev/null +++ b/_includes/mobile/banner-params.md @@ -0,0 +1,23 @@ +Using the `BannerParameters` object you can customize the bid request for banner ads. + +{: .alert.alert-warning :} +Starting from PrebidMobile `2.1.0` the `BannerBaseAdUnit.Parameters` class is deprecated. Use `BannerParameters` instead. + +#### adSizes + +Defines the OpenRTB banner.formats array. + +#### interstitialMinWidthPerc and interstitialMinHeightPerc +{:.no_toc} + +For interstitials only, these define which sizes Prebid Server will choose to send to bidders. See [Prebid Server interstitial support](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#interstitial-support). If this option is used, you'll need to set the size to 1x1. + +#### api +{:.no_toc} + +The `api` property is dedicated to adding values for API Frameworks to bid response according to the [OpenRTB 2.6](https://iabtechlab.com/wp-content/uploads/2022/04/OpenRTB-2-6_FINAL.pdf) spec. The supported values for GMA SDK integration are: + +- `3` or `Signals.Api.MRAID_1` : MRAID-1 support signal +- `5` or `Signals.Api.MRAID_2` : MRAID-2 support signal +- `6` or `Signals.Api.MRAID_3` : MRAID-3 support signal +- `7` or `Signals.Api.OMID_1` : signals OMSDK support diff --git a/_includes/mobile/intro-admob.md b/_includes/mobile/intro-admob.md new file mode 100644 index 0000000000..f6784019df --- /dev/null +++ b/_includes/mobile/intro-admob.md @@ -0,0 +1,60 @@ +## Overview + +Here's how to integrate the Prebid SDK with [Google AdMob](https://admob.google.com/home/). + +### Prerequisites + +These are the required components: + +- **AdMob Account** - This account allows you to manage and serve ads within your mobile app. Within this account you'll need to configure your inventory for serving ads within your app. +- **GMA SDK** - This SDK integration is necessary to communicate with the AdMob service. +- **Prebid SDK** - You will need the latest version of the Prebid Mobile SDK for either [Android](/prebid-mobile/pbm-api/android/code-integration-android.html) or [iOS](/prebid-mobile/pbm-api/ios/code-integration-ios.html). +- **Prebid Server** - You will need a cluster of servers running [Prebid Server](/prebid-server/use-cases/pbs-sdk.html). You can set up your own Prebid Server or work with a [Prebid Server managed service](https://prebid.org/managed-services/). Prebid Server provides you with the following: + - Configuration storage - rather than hardcoding all the details of your current business arrangements in the app, Prebid Server stores which bidders you're currently working with, their inventory details, and other settings that can be changed without updating your app. + - Server-side auction - the server will make the connections to multiple auction bidding partners so the app doesn't have to. + - Privacy regulation tools - the server can help your legal team meet different regulatory needs in different jurisdictions by configuring various protocols and anonyimization activities. + +## How it Works + +Here's how the ad bidding-auction-rendering process works in this integration scenario. + +![Rendering with AdMob](/assets/images/prebid-mobile/modules/rendering/prebid-in-app-bidding-overview-admob.png) + +**Steps 1-2** Prebid SDK makes a bid request. Prebid Server runs an auction and returns the winning bid. + +**Step 3** GMA SDK makes an ad request. AdMob returns the mediation chain with respective ad sources. + +**Step 4** For each Prebid ad source, the GMA SDK sequentially instantiates a Prebid adapter function. + +**Step 5** The adapter function verifies the targeting keywords of the winning bid and the server properties of the given ad source. If they match the adapter will render the winning bid. Otherwise, it will immediately fail with a "no ad" error and the next ad source will instantiate the same adapter but for another set of server params. + +## Major Integration Steps + +Assuming your app is already integrated with the [GMA SDK](https://developers.google.com/admob/android/quick-start), the technical implementation of Prebid mobile into your app will involve these major steps: + +1. [Initialize the Prebid SDK](/prebid-mobile/pbm-api/{{include.platform}}/code-integration-{{include.platform}}.html) - create a connection to your Prebid Server. +2. [Set Global Parameters](/prebid-mobile/pbm-api/{{include.platform}}/pbm-targeting-{{include.platform}}.html) - let bidders know important data about the page, privacy consent, and other settings. +3. Work with your Prebid Server team to create the adunit configIds that will be used in the app. +4. Set up AdMob Mediation Groups and Custom Events. See [AdOps guidance](#ad-operations-guidance) +5. Link Prebid SDK AdUnit code to your app's AdUnits for the adunits that your business team wants to connect to Prebid with the configIds generated in Step 3. See the [adunit-specific instructions](#adunit-specific-instructions) below. + +## Ad Operations Guidance + +The Ad Operations team will need to create a [Mediation Group in AdMob](/adops/mobile-rendering-admob-line-item-setup.html). + +### Rendering and Tracking + +This information may be useful when comparing data across various reporting systems: + +{: .table .table-bordered .table-striped } +| Scenario | Tracked? | +| --- | --- | +| Fires Prebid win event | yes | +| Fires Prebid imp event | no | +| Fires OpenRTB burl | no (1) | +| Fires OpenRTB nurl | no (1) | +| Fires OpenMeasurement events | yes | + +Notes: + +1. OpenRTB burl and nurl will be utilized in a future release. diff --git a/_includes/mobile/intro-applovin.md b/_includes/mobile/intro-applovin.md new file mode 100644 index 0000000000..d539a615dc --- /dev/null +++ b/_includes/mobile/intro-applovin.md @@ -0,0 +1,60 @@ +## Overview + +Here's how to integrate the Prebid SDK with [AppLovin MAX](https://developers.applovin.com/en). + +### Prerequisites + +These are the required components: + +- **AppLovin Account** - This account allows you to manage and serve ads within your mobile app. Within this account you'll need to configure your inventory for serving ads within your app. +- **AppLovin MAX SDK** - This SDK integration is necessary to communicate with the AppLovin service. +- **Prebid SDK** - You will need the latest version of the Prebid Mobile SDK for either [Android](/prebid-mobile/pbm-api/android/code-integration-android.html) or [iOS](/prebid-mobile/pbm-api/ios/code-integration-ios.html). +- **Prebid Server** - You will need a cluster of servers running [Prebid Server](/prebid-server/use-cases/pbs-sdk.html). You can set up your own Prebid Server or work with a [Prebid Server managed service](https://prebid.org/managed-services/). Prebid Server provides you with the following: + - Configuration storage - rather than hardcoding all the details of your current business arrangements in the app, Prebid Server stores which bidders you're currently working with, their inventory details, and other settings that can be changed without updating your app. + - Server-side auction - the server will make the connections to multiple auction bidding partners so the app doesn't have to. + - Privacy regulation tools - the server can help your legal team meet different regulatory needs in different jurisdictions by configuring various protocols and anonyimization activities. + +## How it Works + +Here's how the ad bidding-auction-rendering process works in this integration scenario. + +![Rendering with MAX](/assets/images/prebid-mobile/modules/rendering/prebid-in-app-bidding-overview-max.png) + +**Steps 1-2** Prebid SDK makes a bid request. Prebid Server runs an auction and returns the winning bid. + +**Step 3** MAX SDK makes an ad request. MAX returns the waterfall with respective placements. + +**Step 4** For each Prebid placement, the MAX SDK sequentially instantiates one of Prebid's adapter functions. + +**Step 5** The adapter function verifies the targeting keywords of the winning bid and the custom properties of the given placement. If they match the adapter will render the winning bid. Otherwise, adpater will fail with "no ad" immediately and the next placement will instantiate the same adapter but for another custom properties. + +## Major Integration Steps + +Assuming your app is already integrated with the [AppLovin MAX SDK](https://dash.applovin.com/documentation/mediation/android/getting-started/integration), the technical implementation of Prebid mobile into your app will involve these major steps: + +1. [Initialize the Prebid SDK](/prebid-mobile/pbm-api/{{include.platform}}/code-integration-{{include.platform}}.html) - create a connection to your Prebid Server. +2. [Set Global Parameters](/prebid-mobile/pbm-api/{{include.platform}}/pbm-targeting-{{include.platform}}.html) - let bidders know important data about the page, privacy consent, and other settings. +3. Work with your Prebid Server team to create the adunit configIds that will be used in the app. +4. Set up ovin custom network and placements. See [AdOps guidance](#ad-operations-guidance) +5. Link Prebid SDK AdUnit code to your app's AdUnits for the adunits that your business team wants to connect to Prebid with the configIds generated in Step 3. See the [adunit-specific instructions](#adunit-specific-instructions) below. + +## Ad Operations Guidance + +The Ad Operations team will need to create a [Custom Network in AppLovin](/adops/mobile-rendering-max-line-item-setup.html). + +### Rendering and Tracking + +This information may be useful when comparing data across various reporting systems: + +{: .table .table-bordered .table-striped } +| Scenario | Tracked? | +| --- | --- | +| Fires Prebid win event | yes | +| Fires Prebid imp event | no | +| Fires OpenRTB burl | no (1) | +| Fires OpenRTB nurl | no (1) | +| Fires OpenMeasurement events | yes | + +Notes: + +1. OpenRTB burl and nurl will be utilized in a future release. diff --git a/_includes/mobile/intro-bidding-only.md b/_includes/mobile/intro-bidding-only.md new file mode 100644 index 0000000000..a0850fcefb --- /dev/null +++ b/_includes/mobile/intro-bidding-only.md @@ -0,0 +1,117 @@ +## Overview + +This how-to guide covers the original approach for integrating the Prebid SDK into your app with the GMA SDK. It utilizes: + +- **Prebid SDK** and **Prebid server** to handle the bidding and auction process. +- **GAM** and the **Google Mobile Ads (GMA) SDK** manage the ad inventory and select the winning ad to display. +- **Prebid Universal Creative** renders display ads when a Prebid bid wins. +- **GMA SDK** renders banner and non-instream ads when a Prebid bid wins. +- **GMA IMA SDK** renders instream ads when a Prebid bid wins. + +If you do not have GMA SDK in the app, refer to the [Google Integration Documentation](https://developers.google.com/ad-manager/mobile-ads-sdk/{{include.platform}}/quick-start). + +### Alternative Approaches + +Another way to integrate GAM into your app is with the [Prebid-Rendered Integration](/prebid-mobile/modules/rendering/{{include.platform}}-sdk-integration-gam.html). + +Tradeoffs between these integration approaches: + +{: .table .table-bordered .table-striped } +| Aspect | Bidding-Only Integration | Prebid-Rendered Integration | +| --- |:---:|:---:| +| App code has direct access to bids | check | | +| Support for MRAID 3.0 | | check | +| Support for SKAdnetwork | | check | +| Loads data from Prebid Cache | check | | +| Supports instream video | check | | +| Triggers billing and Notice URLs | check | | +| Supports Third Party Rendering libraries | | check | + +**Notes:** + +- On one hand, using Prebid Cache reduces the amount of data that must be sent to the mobile device -- the body of the creative does not need to be transmitted for bids. On the other hand, though, when a bid wins in the ad server, the body of the creative must be retrieved from the cache. +- It is possible to mix-and-match implementations within an app. e.g. you could implement instream video with the Bidding-Only approach and other adunits with Prebid-Rendered. + +### Prerequisites + +The GAM Bidding-Only Integration method assumes that you have the following components: + +- **Google Ad Manager Account** - A GAM account allows you to manage and serve ads within your mobile app. Within this account you'll need to configure your inventory and create orders for serving ads within your app. This involves defining ad units (spaces within your app where ads will be displayed) and setting up orders and line items to deliver ads to those units. See [Prebid's AdOps Guide](/adops/before-you-start.html) for more information. +- **Google Mobile Ads (GMA) SDK** - This refers to the software development kit provided by Google. You need to ensure that you have the latest version of the GMA SDK supported by Prebid SDK. This SDK integration is necessary to communicate with the ad server and display ads in your app. +- **Prebid SDK** - You will need the latest version of the Prebid Mobile SDK for either [Android](/prebid-mobile/pbm-api/android/code-integration-android.html) or [iOS](/prebid-mobile/pbm-api/ios/code-integration-ios.html). +- **Prebid Universal Creative** - This needs to be hosted on a CDN and loaded from the creative in GAM as detailed in the [AdOps GAM creative reference](/adops/gam-creative-banner-sbs.html#prebid-universal-creative). +- **Prebid Server** - You will need a cluster of servers running [Prebid Server](/prebid-server/use-cases/pbs-sdk.html). You can set up your own Prebid Server or work with a [Prebid Server managed service](https://prebid.org/managed-services/). Prebid Server provides you with the following: + - Configuration storage - rather than hardcoding all the details of your current business arrangements in the app, Prebid Server stores which bidders you're currently working with, their inventory details, and other settings that can be changed without updating your app. + - Server-side auction - the server will make the connections to multiple auction bidding partners so the app doesn't have to. + - Creative caching - Prebid Cache stores the creatives until the app needs to render them, reducing the auction response bandwidth. + - Privacy regulation tools - the server can help your legal team meet different regulatory needs in different jurisdictions by configuring various protocols and anonyimization activities. + +## How it Works + +Here's how the ad bidding-auction-rendering process works in this integration scenario. + +![GAM Bidding Only Integration Details](/assets/images/prebid-mobile/mobile-details-gam-bidding-only.png) + +1. Prebid SDK calls Prebid Server which supplies one or more bids. +1. PBSDK adds targeting values to GMA SDK. +1. GMA SDK calls GAM, which makes the ad decision. +1. If a 3rd party HTML creative is chosen (banner or interstitial): + 1. GMA SDK writes the HTML to a webview, loading the Prebid Universal Creative (PUC). + 1. The PUC loads the winning creative from Prebid Cache. + 1. The PUC writes this creative into an iframe and hits all the tracking strings: Prebid win URL, billing url (burl), and notice url (nurl). + 1. If MRAID is available, it is used to consider the view state before hitting the burl. +1. If a video VastUrl creative is chosen: + 1. The GMA SDK uses the platform video player which loads the VAST from Prebid Cache. + 1. It then starts playing the VAST, hitting the embedded Impression tags when appropriate. +1. If an In-App Native format is chosen: + 1. GMA SDK delegates the rendering of native to the App and PBSDK when a special signal is specified. + 1. The app code gets the native assets from PBSDK. The app is coded to render the ad. + 1. PBSDK fires the eventtrackers when appropriate. + 1. The PBS win event is fired. +1. The GMA SDK handles Open Measurement SDK interactions. + +## Major Integration Steps + +Assuming your app already has AdUnits integrated with the GMA SDK, the technical implementation of Prebid mobile into your app will involve these major steps: + +1. [Initialize the Prebid SDK](/prebid-mobile/pbm-api/{{include.platform}}/code-integration-{{include.platform}}.html) - create a connection to your Prebid Server. +2. [Set Global Parameters](/prebid-mobile/pbm-api/{{include.platform}}/pbm-targeting-{{include.platform}}.html) - let bidders know important data about the page, privacy consent, and other settings. +3. Work with your Prebid Server team to create the adunit configIds that will be used in the app. +4. Set up GAM orders, line items, and creatives. See [AdOps guidance](#ad-operations-guidance) +5. Link Prebid AdUnit code to your GMA AdUnits - for any adunits that your business team wants to connect to Prebid with the configIds generated in Step 3. See the [adunit-specific instructions](#adunit-specific-instructions) below. + +## Ad Operations Guidance + +The Ad Operations team will need to create line items in GAM. The creatives used depend on which media formats your adunits utilize. + +{: .table .table-bordered .table-striped } +| AdUnit Format | Line Item Targeting | Creative Type | Prebid Cache? | Ad Ops Details | +| --- | --- | --- | --- | --- | +| HTML banner, interstitial banner | hb_pb
    hb_format=banner | 3rd party HTML that loads the [PUC](/overview/prebid-universal-creative.html) | yes | [link](/adops/gam-creative-banner-sbs.html) | +| Video (instream, non-instream, interstitial) | hb_pb
    hb_format=video
    inventoryType in (instream, mobile app) | VastUrl pointing to Prebid Cache | yes | [link](/adops/setting-up-prebid-video-in-dfp.html) | +| Rewarded Video | hb_pb
    hb_format=video
    inventoryType in (instream, mobile app)
    rewarded adunits | VastUrl pointing to Prebid Cache | yes | [link](/adops/setting-up-prebid-video-in-dfp.html) | +| In-app native | hb_pb
    hb_format=native | GAM native | no | [link](adops/gam-native.html#create-a-new-native-creative) | +| In-Webview native | hb_pb
    hb_format=native | 3rd party HTML that loads the native-trk script. | yes | [link](/adops/gam-native.html) | + +Notes: + +- You may need up to 4 sets of line items to support Prebid Mobile depending on adunit types. If you also run Prebid.js or AMP, please see [line item considerations](/adops/line-item-creation.html) for more information. +- Discuss the Prebid Cache column with the Prebid Server team. They can set up the "top-level stored request" for your account to cache or not cache requests as needed. + +### Rendering and Tracking + +This information may be useful when comparing data across various reporting systems: + +{: .table .table-bordered .table-striped } +| Scenario | PUC | VastUrl Creative | GAM Native Creative | +| --- | --- | --- | --- | +| Rendering Method | PUC in iframe | GMA SDK player | App code with data from PBSDK | +| Fires Prebid win event | always | never | always | +| Fires Prebid imp event | never | VAST impression tag | never | +| Fires OpenRTB burl | when in view | n/a | never (1) | +| Fires OpenRTB nurl | always | n/a | always | +| Fires OpenMeasurement events | GMA SDK | n/a | PB SDK | + +Notes: + +1. OpenRTB burl and nurl will be utilized in a future release. diff --git a/_includes/mobile/intro-custom.md b/_includes/mobile/intro-custom.md new file mode 100644 index 0000000000..9ed00c8eae --- /dev/null +++ b/_includes/mobile/intro-custom.md @@ -0,0 +1,102 @@ +## Overview + +You can use the Prebid SDK to monetize your app with a custom ad server or even without an ad server at all. + +This guide outlines how to integrate the Prebid SDK into your app if you don't fit into any of the other approaches documented on the site. Since there are +many unknown details about your specific situation, guidance will +remain general. + +General components: + +- **Prebid SDK** collects parameters and sends to Prebid Server. +- **Prebid server** handles the bidding and auction process. +- An ad server or mediation platform without specific Prebid Mobile integration instructions. + - If this ad server has an SDK, great, otherwise, your app code will be responsible for crafting requests to the ad server based on response data pulled from Prebid SDK. + - It's possible for your app code to just make the ad decision itself, utilizing no ad server at all. +- **Rendering method** - the first big decision is about how Prebid ads will be rendered: + - Either in a webview with the Prebid Universal Creative + - Or delegate the rendering to Prebid SDK + - The tradeoffs are discussed below + +### General Approaches + +Custom integrations will need to determine whether they want to utilize Prebid SDK's full rendering capacity, or just obtain bids to do their own rendering. + +#### Custom Bidding Only + +![Custom Bidding Only Integration Details](/assets/images/prebid-mobile/mobile-details-custom-bidding-only.png) + +1. Prebid SDK calls Prebid Server which supplies one or more bids. +1. The app inspects the targeting values. +1. Something makes an ad decision - either your ad server or your app. +1. If a 3rd party HTML creative is chosen (banner or interstitial): + 1. The HTML should be written to a webview, optionally using the Prebid Universal Creative (PUC). + 1. The PUC or your custom rendering code loads the winning creative from Prebid Cache. + 1. The PUC or your custom rendering code writes this creative into an iframe and hits all the tracking strings: Prebid win URL, billing url (burl), and notice url (nurl). + 1. If MRAID is available, the PUC uses it to consider the view state before hitting the burl. +1. If a video VastUrl creative is chosen: + 1. The platform video player loads the VAST from Prebid Cache. + 1. It then starts playing the VAST, hitting the embedded Impression tags when appropriate. +1. Your app code will need to handle Open Measurement SDK interactions. + +#### Custom Prebid Rendered + +![Custom Prebid-Rendered Integration Details](/assets/images/prebid-mobile/mobile-details-custom-prebid-rendered.png) + +1. Prebid SDK calls Prebid Server which supplies one or more bids. +1. The app inspects the targeting values. +1. Something makes an ad decision - either your ad server or your app. +1. If a 3rd party HTML creative is chosen (banner, native, interstitial, non-instream video): + 1. The app calls Prebid SDK rendering functions. +1. If a video VastUrl creative is chosen (rewarded video only): + 1. The app calls Prebid SDK rendering functions. + +#### Tradeoffs + +Here are the tradeoffs between two integration approaches: + +{: .table .table-bordered .table-striped } +| Aspect | Bidding-Only Integration | Prebid-Rendered Integration | +| --- |:---:|:---:| +| Direct access to bids | check | | +| Support for MRAID 3.0 | | check | +| Support for SKAdnetwork | | check | +| Loads data from Prebid Cache | check | | +| Supports instream video | check | | +| Triggers billing and Notice URLs | check | | +| Supports Third Party Rendering libraries | | check | + +**Notes:** + +- On one hand, using Prebid Cache reduces the amount of data that must be sent to the mobile device -- the body of the creative does not need to be transmitted for bids. On the other hand, though, when a bid wins in the ad server, the body of the creative must be retrieved from the cache. +- It is possible to mix-and-match implementations within an app. e.g. you could implement instream video with the Bidding-Only approach and other adunits with Prebid-Rendered. +- Over time, we expect the "Prebid-Rendered" approach to mature and become the obvious choice. + +### Prerequisites + +- **Prebid SDK** - You will need the latest version of the Prebid Mobile SDK for either [Android](/prebid-mobile/pbm-api/android/code-integration-android.html) or [iOS](/prebid-mobile/pbm-api/ios/code-integration-ios.html). +- **Prebid Universal Creative** - If you choose the "Bidding-Only" approach, the PUC needs to be hosted on a CDN. +- **Video player** - If you let Prebid SDK do the rendering, it will use the platform default: AVPlayer for iOS and ExoPlayer for Android. +- **Prebid Server** - You will need a cluster of servers running [Prebid Server](/prebid-server/use-cases/pbs-sdk.html). You can set up your own Prebid Server or work with a [Prebid Server managed service](https://prebid.org/managed-services/). Prebid Server provides you with the following: + - Configuration storage - rather than hardcoding all the details of your current business arrangements in the app, Prebid Server stores which bidders you're currently working with, their inventory details, and other settings that can be changed without updating your app. + - Server-side auction - the server will make the connections to multiple auction bidding partners so the app doesn't have to. + - Privacy regulation tools - the server can help your legal team meet different regulatory needs in different jurisdictions by configuring various protocols and anonyimization activities. + +## Major Integration Steps + +The technical implementation of Prebid mobile into your app will involve these major steps: + +1. [Initialize the Prebid SDK](/prebid-mobile/pbm-api/{{include.platform}}/code-integration-{{include.platform}}.html) - create a connection to your Prebid Server. +2. [Set Global Parameters](/prebid-mobile/pbm-api/{{include.platform}}/pbm-targeting-{{include.platform}}.html) - let bidders know important data about the page, privacy consent, and other settings. +3. Work with your Prebid Server team to create the adunit configIds that will be used in the app. +4. Set up ad server orders, line items, and creatives. See [AdOps guidance](#ad-operations-guidance) +5. Link Prebid AdUnit code to your AdUnits - for any adunits that your business team wants to connect to Prebid with the configIds generated in Step 3. See the adunit-specific instructions below. + +## Ad Operations Guidance + +If you're using an ad server, the Ad Operations team will need to create line items. If you're not using an ad server, the app code will need to generate an appropriate response to render the winning ad. + +The creatives used depend on which media formats your adunits can utilize. The details for what creatives are needed for each ad format will depend on the type of integration: + +- [AdOps Guidance for Bidding-Only](/prebid-mobile/pbm-api/{{include.platform}}/{{include.platform}}-sdk-integration-gam-original-api.html#ad-operations-guidance) +- [AdOps Guidance for Prebid-Rendered](/prebid-mobile/modules/rendering/{{include.platform}}-sdk-integration-gam.html#ad-operations-guidance) diff --git a/_includes/mobile/intro-prebid-rendered.md b/_includes/mobile/intro-prebid-rendered.md new file mode 100644 index 0000000000..1915afea1e --- /dev/null +++ b/_includes/mobile/intro-prebid-rendered.md @@ -0,0 +1,128 @@ +## Overview + +This how-to guide covers the 'Prebid-Rendered' approach for integrating the Prebid SDK into your app with the GMA SDK. It utilizes: + +- **Prebid SDK** and **Prebid server** to handle the bidding and auction process. +- **GAM** and the **Google Mobile Ads (GMA) SDK** manage the ad inventory and select the winning ad to display. +- **Prebid SDK** renders display ads when a Prebid bid wins. +- **GMA SDK** renders ads when a Prebid bid wins. + +If you do not have GMA SDK in the app yet, refer to the [Google Integration Documentation](https://developers.google.com/ad-manager/mobile-ads-sdk/{{include.platform}}/quick-start). + +### Alternative Approaches + +Another way to integrate GAM into your app is with the [GAM Bidding-Only integration](/prebid-mobile/pbm-api/{{include.platform}}/{{include.platform}}-sdk-integration-gam-original-api.html). + +Tradeoffs between these integration approaches: + +{: .table .table-bordered .table-striped } +| Aspect | Bidding-Only Integration | Prebid-Rendered Integration | +| --- |:---:|:---:| +| App code has direct access to bids | check | | +| Support for MRAID 3.0 | | check | +| Support for SKAdnetwork | | check | +| Loads data from Prebid Cache | check | | +| Supports instream video | check | | +| Triggers billing and Notice URLs | check | | +| Supports Third Party Rendering libraries | | check | + +**Notes:** + +- On one hand, using Prebid Cache reduces the amount of data that must be sent to the mobile device -- the body of the creative does not need to be transmitted for bids. On the other hand, though, when a bid wins in the ad server, the body of the creative must be retrieved from the cache. +- It is possible to mix-and-match implementations within an app. e.g. you could implement instream video with the Bidding-Only approach and other adunits with Prebid-Rendered. + +### Prerequisites + +The GAM Prebid-Rendered Integration method assumes that you have the following components: + +- **Google Ad Manager Account** - A GAM account allows you to manage and serve ads within your mobile app. Within this account you'll need to configure your inventory and create orders for serving ads within your app. This involves defining ad units (spaces within your app where ads will be displayed) and setting up orders and line items to deliver ads to those units. See [Prebid's AdOps Guide](/adops/before-you-start.html) for more information. +- **Google Mobile Ads (GMA) SDK** - This refers to the software development kit provided by Google. You need to ensure that you have the latest version of the GMA SDK supported by Prebid SDK. This SDK integration is necessary to communicate with the ad server and display ads in your app. +- **Prebid SDK** - You will need the latest version of the Prebid Mobile SDK for either [Android](/prebid-mobile/pbm-api/android/code-integration-android.html) or [iOS](/prebid-mobile/pbm-api/ios/code-integration-ios.html). +- **Prebid Server** - You will need a cluster of servers running [Prebid Server](/prebid-server/use-cases/pbs-sdk.html). You can set up your own Prebid Server or work with a [Prebid Server managed service](https://prebid.org/managed-services/). Prebid Server provides you with the following: + - Configuration storage - rather than hardcoding all the details of your current business arrangements in the app, Prebid Server stores which bidders you're currently working with, their inventory details, and other settings that can be changed without updating your app. + - Server-side auction - the server will make the connections to multiple auction bidding partners so the app doesn't have to. + - Privacy regulation tools - the server can help your legal team meet different regulatory needs in different jurisdictions by configuring various protocols and anonyimization activities. + +## How it Works + +Here's how the ad bidding-auction-rendering process works in this integration scenario. + +![GAM Prebid-Rendered Integration Details](/assets/images/prebid-mobile/mobile-details-gam-prebid-rendered.png) + +1. Prebid SDK calls Prebid Server which supplies one or more bids. +1. PBSDK adds targeting values to GMA SDK. +1. GMA SDK calls GAM, which makes the ad decision. +1. If a 3rd party HTML creative is chosen (banner, native, interstitial, non-instream video): + 1. GMA SDK writes HTML to a webview, loading google_mobile_app_ads.js. + 1. This script triggers a "PrebidAppEvent". + 1. Which in turn triggers PBSDK to handle the rendering of the creative: + 1. PBSDK fires the Prebid Server win event. + 1. If a 3rd party rendering SDK is in use, PBSDK calls it for rendering. + 1. Otherwise, it writes the creative into an iframe into an internal WebView, replaceing the GAMSDK's WebView. + 1. Injects mraid.js into the webview to listen for events from MRAID: change size, etc. + 1. Sends data to the creative (e.g. 'viewable') which may trigger impression tracking within the creative. + 1. It does not currently hit the billing or notive urls (burl or nurl). +1. If a video VastUrl creative is chosen (rewarded video only): + 1. The GMA SDK uses the platform video player which loads the special VAST file from the Prebid CDN. + 1. Prebid SDK watches VAST events for "PrebidAppEvent". When it sees this, it takes over the rendering: + 1. PBSDK fires the PBS win event. + 1. If the response indicates a 3rd party rendering SDK, PBSDK will call it. + 1. Otherwise: + 1. PDBSK renders with the platform-standard VAST player. + 1. It uses the VAST from the bid response, not from Prebid Cache. + 1. The player fires any Impression tags in the VAST. + 1. PBSDK handles MRAID events. + 1. The app is called to handle the reward. +1. If an In-App Native format is chosen: + 1. The GMA SDK delegates the rendering of native to the App and PBSDK when a special signal is specified. + 1. The app code gets the native assets from PBSDK. The app is coded to render the ad. + 1. PBSDK fires the eventtrackers when appropriate. + 1. The PBS win event is fired. +1. Open Measurement events are handled directly by the Prebid SDK. + 1. If a 3rd party rendering SDK is used to render, then it will handle Open Measurement. + +## Major Integration Steps + +Assuming your app already has AdUnits integrated with the GMA SDK, the technical implementation of Prebid mobile into your app will involve these major steps: + +1. [Initialize the Prebid SDK](/prebid-mobile/pbm-api/{{include.platform}}/code-integration-{{include.platform}}.html) - create a connection to your Prebid Server. +2. [Set Global Parameters](/prebid-mobile/pbm-api/{{include.platform}}/pbm-targeting-{{include.platform}}.html) - let bidders know important data about the page, privacy consent, and other settings. +3. Work with your Prebid Server team to create the adunit configIds that will be used in the app. +4. Set up GAM orders, line items, and creatives. See [AdOps guidance](#ad-operations-guidance) +5. Link Prebid AdUnit code to your GMA AdUnits - for any adunits that your business team wants to connect to Prebid with the configIds generated in Step 3. See the [adunit-specific instructions](#adunit-specific-instructions) below. + +## Ad Operations Guidance + +The AdOps team will need to create line items in GAM. The creatives used depend on which media formats your adunits utilize: + +{: .table .table-bordered .table-striped } +| AdUnit Format | Line Item Targeting | Creative Type | Prebid Cache? | Ad Ops Details | +| --- | --- | --- | --- | --- | +| HTML banner, interstitial banner or video, non-instream video | hb_pb
    hb_format=banner | 3rd party HTML that loads google_mobile_app_ads.js | no | [link](/adops/mobile-rendering-gam-line-item-setup.html#third-party-html) | +| Instream Video | hb_pb
    hb_format=video
    inventoryType in (instream, mobile app) | VastUrl pointing to Prebid Cache | yes | [link](/adops/setting-up-prebid-video-in-dfp.html) | +| Rewarded Video | hb_pb
    hb_format=video
    inventoryType in (instream, mobile app)
    rewarded adunits | VastUrl pointing to prebid-mobile-rewarded-vast.xml | no | [link](/adops/mobile-rendering-gam-line-item-setup.html#rewarded-video) | +| In-app native | hb_pb
    hb_format=native | GAM native | no | [link](adops/gam-native.html#create-a-new-native-creative) | + +Notes: + +- Instream video requires the [Bidding-Only](/prebid-mobile/pbm-api/{{include.platform}}/{{include.platform}}-sdk-integration-gam-original-api.html) application coding integration approach. However, the line item setup is the same. +- You may need up to 4 sets of line items to support Prebid Mobile depending on adunit types. If you also run Prebid.js or AMP, please see [line item considerations](/adops/line-item-creation.html) for more information. +- Discuss the Prebid Cache column with the Prebid Server team. They can set up the "top-level stored request" for your account to cache or not cache requests as needed. + +### Rendering and Tracking + +This information may be useful when comparing data across various reporting systems: + +{: .table .table-bordered .table-striped } +| Scenario | 3pHTML Creative | VastUrl Creative | GAM Native Creative | +| --- | --- | --- | --- | +| Rendering Method | js in iframe fires an event | GMA SDK player | App code with data from PBSDK | +| Fires Prebid win event | always | never | always | +| Fires Prebid imp event | never | VAST impression tag | never | +| Fires OpenRTB burl | never | n/a | never | +| Fires OpenRTB nurl | never | n/a | never | +| Fires OpenMeasurement events | PBSDK | n/a | PBSDK | + +Notes: + +- OpenRTB burl and nurl will be utilized in a future release. diff --git a/_includes/mobile/native-params.md b/_includes/mobile/native-params.md new file mode 100644 index 0000000000..cacf9c3d72 --- /dev/null +++ b/_includes/mobile/native-params.md @@ -0,0 +1,61 @@ +Using the `NativeParameters` object (with the PrebidRequest object) or the `NativeRequest` object, you can customize the bid request for native ads. + +#### assets +{:.no_toc} + +The array of requested asset objects. Prebid SDK supports all kinds of assets according to the [IAB spec](https://iabtechlab.com/wp-content/uploads/2016/07/OpenRTB-Native-Ads-Specification-Final-1.2.pdf) except `video`. + +#### eventtrackers +{:.no_toc} + +The array of requested native trackers. Prebid SDK supports inly `image` trackers according to the [IAB spec](https://iabtechlab.com/wp-content/uploads/2016/07/OpenRTB-Native-Ads-Specification-Final-1.2.pdf). + +#### version +{:.no_toc} + +Version of the Native Markup version in use. The default value is `1.2` + +#### context +{:.no_toc} + +The context in which the ad appears. + +#### contextSubType +{:.no_toc} + +A more detailed context in which the ad appears. + +#### placementType +{:.no_toc} + +The design/format/layout of the ad unit being offered. + +#### placementCount +{:.no_toc} + +The number of identical placements in this Layout. + +#### sequence +{:.no_toc} + +0 for the first ad, 1 for the second ad, and so on. + +#### asseturlsupport +{:.no_toc} + +Whether the supply source/impression supports returning an assetsurl instead of an asset object. 0 or the absence of the field indicates no such support. + +#### durlsupport +{:.no_toc} + +Whether the supply source / impression supports returning a dco url instead of an asset object. 0 or the absence of the field indicates no such support. + +#### privacy +{:.no_toc} + +Set to 1 when the native ad supports buyer-specific privacy notice. Set to 0 (or field absent) when the native ad doesn’t support custom privacy links or if support is unknown. + +#### ext +{:.no_toc} + +This object is a placeholder that may contain custom JSON agreed to by the parties to support flexibility beyond the standard defined in this specification diff --git a/_includes/mobile/video-params.md b/_includes/mobile/video-params.md new file mode 100644 index 0000000000..adde7e36e0 --- /dev/null +++ b/_includes/mobile/video-params.md @@ -0,0 +1,80 @@ +Using the `VideoParameters` object you can customize the bid request for video ads. + +#### placement +{:.no_toc} + +Not needed for Instream video integration, which uses placement=1 and plcmt=1. + +The [OpenRTB 2.6](https://iabtechlab.com/wp-content/uploads/2022/04/OpenRTB-2-6_FINAL.pdf) Placement Type for the auction can be expressed as an integer array or you can use an enum for easier readability. + +- `2` or `InBanner` : In-Banner placement exists within a web banner that leverages the banner space to deliver a video experience as opposed to another static or rich media format. The format relies on the existence of display ad inventory on the page for its delivery. +- `3` or `InArticle` : In-Article placement loads and plays dynamically between paragraphs of editorial content; existing as a standalone branded message. +- `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. + +Notes: +- VideoInterstitialAdUnit and rewarded video ads will default to placement= 5 if no placement value is supplied. + +#### api +{:.no_toc} + +The `api` property is dedicated to adding values for API Frameworks to bid response according to the [OpenRTB 2.6](https://iabtechlab.com/wp-content/uploads/2022/04/OpenRTB-2-6_FINAL.pdf) spec. The supported values for GMA SDK integration are: + +- `1` or `Signals.Api.VPAID_1` : VPAID 1.0 +- `2` or `Signals.Api.VPAID_2` : VPAID 2.0 +- `3` or `Signals.Api.MRAID_1` : MRAID-1 support signal +- `5` or `Signals.Api.MRAID_2` : MRAID-2 support signal +- `6` or `Signals.Api.MRAID_3` : MRAID-3 support signal +- `7` or `Signals.Api.OMID_1` : signals OMSDK support + +#### maxBitrate +{:.no_toc} + +Integer representing the OpenRTB 2.6 maximum bit rate in Kbps. + +#### minBitrate +{:.no_toc} + +Integer representing the OpenRTB 2.6 minimum bit rate in Kbps. + +#### maxDuration +{:.no_toc} + +Integer representing the OpenRTB 2.6 maximum video ad duration in seconds. + +#### minDuration +{:.no_toc} + +Integer representing the OpenRTB 2.6 minimum video ad duration in seconds. + +#### mimes +{:.no_toc} + +Array of strings representing the supported OpenRTB 2.6 content MIME types (e.g., “video/x-ms-wmv”, “video/mp4”). +Required property. + +#### playbackMethod +{:.no_toc} + +Array of OpenRTB 2.6 playback methods. If none are specified, any method may be used. Only one method is typically used in practice. It is strongly advised to use only the first element of the array. + +- `1` or `Signals.PlaybackMethod.AutoPlaySoundOn` : Initiates on Page Load with Sound On +- `2` or `Signals.PlaybackMethod.AutoPlaySoundOff` : Initiates on Page Load with Sound Off by Default +- `3` or `Signals.PlaybackMethod.ClickToPlay` : Initiates on Click with Sound On +- `4` or `Signals.PlaybackMethod.MouseOver` : Initiates on Mouse-Over with Sound On +- `5` or `Signals.PlaybackMethod.EnterSoundOn` : Initiates on Entering Viewport with Sound On +- `6` or `Signals.PlaybackMethod.EnterSoundOff`: Initiates on Entering Viewport with Sound Off by Default + +#### protocols +{:.no_toc} + + Array or enum of OpenRTB 2.6 supported Protocols. Values can be one of: + +- `1` or `Signals.Protocols.VAST_1_0` : VAST 1.0 +- `2` or `Signals.Protocols.VAST_2_0` : VAST 2.0 +- `3` or `Signals.Protocols.VAST_3_0` : VAST 3.0 +- `4` or `Signals.Protocols.VAST_1_0_Wrapper` : VAST 1.0 Wrapper +- `5` or `Signals.Protocols.VAST_2_0_Wrapper` : VAST 2.0 Wrapper +- `6` or `Signals.Protocols.VAST_3_0_Wrapper` : VAST 3.0 Wrapper +- `7` or `Signals.Protocols.VAST_4_0` : VAST 4.0 +- `8` or `Signals.Protocols.VAST_4_0_Wrapper` : VAST 4.0 Wrapper diff --git a/adops/ad-server-integration.md b/adops/ad-server-integration.md index 00d8fe0782..28afb7b10a 100644 --- a/adops/ad-server-integration.md +++ b/adops/ad-server-integration.md @@ -22,17 +22,17 @@ If you want to include information about a particular ad server not documented h ## Google Ad Manager -Google Ad Manager (GAM) is currently the most-used ad server. Google is beta testing header bidding support in yield groups, a technology to help publishers manage external integrations. Because header bidding often involved the creation of hundreds or even thousands of line items, yield groups could be a useful option. Here are some things to consider when deciding whether to use GAM yield groups with Prebid: +Google Ad Manager (GAM) is currently the most-used ad server. Google has header bidding support in a feature called [Header Bidding Trafficking](https://support.google.com/admanager/answer/12273163?hl=en), a technology to help publishers manage external integrations. Because header bidding often involved the creation of hundreds or even thousands of line items, this feature could be a useful option. Here are some things to consider when deciding whether to use it with Prebid: -- As of this writing, the feature was still in beta testing. - You must have a GAM premium GAM account to use yield groups. - The following use cases currently don’t work with yield groups: Native, video, AMP, Post-Bid. Google is open to feedback from the community about these scenarios. - The Prebid Universal Creative is not utilized. Google has ported some portions of the PUC to an internal creative. - Not all Prebid bid adapters are supported. - Aliases are not currently supported, but Google may eventually support aliases that are commonly used. There may also be future updates to support custom aliases. - Google Publisher Toolkit (GPT) determines bid values using Prebid.js events. -- The yield group should win when the adjusted bid price is higher than the header bidding price bucket, which should typically occur if the publisher is rounding bids down, as is the Prebid default. +- The trafficking group should win when the adjusted bid price is higher than the header bidding price bucket, which should typically occur if the publisher is rounding bids down, as is the Prebid default. - While we haven’t seen any detailed performance testing, we hope that the improved auction dynamics from no longer using price bucketing will have beneficial effects on auction outcomes. +- Most Prebid Mobile scenarios are not supported. For step-by-step instructions on using GAM, see the [Google Ad Manager Step by Step](/adops/step-by-step.html). @@ -57,7 +57,7 @@ For step-by-step instructions on using some of the other ad servers, see the fol [Send All Bids vs Top Price](/adops/send-all-vs-top-price.html) -## Further Reader +## Further Reading - [Planning Guide](/adops/adops-planning-guide.html) - [Key Values for Ad Ops](/adops/key-values.html) diff --git a/adops/adops-general-sbs.md b/adops/adops-general-sbs.md index 7a1b506366..ae8a64eff6 100644 --- a/adops/adops-general-sbs.md +++ b/adops/adops-general-sbs.md @@ -8,7 +8,6 @@ sidebarType: 3 --- # General Ad Server Prebid Setup - {: .no_toc } * TOC @@ -63,7 +62,7 @@ The exact order of the following steps will differ depending on your ad server. 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. + * Banner/Non-InstreamVideo/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. @@ -82,16 +81,16 @@ Target the price bucket key: `hb_pb_BIDDERCODE` (where BIDDERCODE is the actual The following additional keys must be added for the corresponding formats: -**Banner/Outstream/Native:** +**Banner/Non-InstreamVideo/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. +You can use the same line item for banner, non-instream (formerly called "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. {: .alert.alert-warning :} If you combine native with another format in a single line item, you’ll need to add creative-level targeting to designate which creatives target which format. If your ad server doesn't support creative-level targeting, you may need to break out a separate set of line items. -**In-Player and Outstream Video:** +**In-Player and In-Renderer 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 in-renderer (formatly "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 in-renderer video ads, they will most likely be separate line items, so you will need to target non-instream line items to a “display” inventory type, or perhaps separate them by adunits. **Long-Form (OTT) Video:** @@ -123,13 +122,13 @@ 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: Banner/In-Renderer/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): +If you’re working with banner or in-renderer 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 @@ -173,4 +172,3 @@ The final steps in configuring Prebid on your ad server are to do the following: * [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/adops-planning-guide.md b/adops/adops-planning-guide.md index 3213832502..8c510a4975 100644 --- a/adops/adops-planning-guide.md +++ b/adops/adops-planning-guide.md @@ -63,6 +63,8 @@ Some additional resources that might be helpful as you work through your setup i [Deals in Prebid](/adops/deals.html): You can negotiate deals with header bidding demand partners and have them compete with ad server inventory. You’ll need to create additional line items to support these deals. This document explains how to set up Prebid to make that happen. +[Prebid Mobile](/adops/mobile-adops.html): Read this if you have an app integration with Prebid Mobile. + ## Terminology Throughout this planning guide, we use the following terms to describe elements within the ad server. These terms may vary among different ad servers. diff --git a/adops/creative-considerations.md b/adops/creative-considerations.md index 396f19feaa..451477095e 100644 --- a/adops/creative-considerations.md +++ b/adops/creative-considerations.md @@ -7,56 +7,166 @@ sbUUID: 3.2 --- # Creative Considerations - {: .no_toc } - TOC {: toc } -Some of the major decisions you need to make as you’re setting up your campaigns have to do with creatives. This document will provide information to help you make those decisions. +## Creatives Overview -{: .alert.alert-info :} -Throughout this discussion we’re assuming you’ve chosen to use the Prebid Universal Creative (PUC). See [Prebid Universal Creative](#prebid-universal-creative) below for advantages and disadvantages of this approach. For more information on the PUC as well as alternatives, see the [Prebid Universal Creative Overview](/overview/prebid-universal-creative.html). +This document will provide information to help you set up the ad server so ads of various media formats will be rendered properly. A couple of questions to consider: -## Creatives Overview +- What Prebid scenarios do you need now and in the forseeable future? Is Prebid.js all you need? Or do you have an [AMP](/formats/formats.html#amp) version of your site? Do you have a mobile app? +- Are you able to maintain the ad server creatives once they're established? + +Here's a set of basic creative recommendations to use as a starting point: -When you set up a line item for a campaign in your ad server, you have to add images or ad tags that will be displayed for that campaign. Header bidding line items have a particular kind of ad tag. +1. **Are you using Prebid.js only?** + 1. Is one extra HTTP fetch a considerable drag on your revenue performance? If yes, then you'll want to consider using the [dynamic creative](/adops/creative-considerations#prebidjs-dynamic-creatives) approach. + 1. Is updating the creatives in the future going to be possible? If yes, then again, the dynamic creative approach would be fine. + 1. Otherwise, consider using the [Prebid Universal Creative (PUC)](/adops/creative-considerations#prebid-universal-creative-puc) +1. **Are you using both Prebid.js and AMP?** + 1. For now, we recommend two sets of line items: one for instream video, and one that uses the PUC for everything else. + 1. In the future, there will be an option to run three sets of line items to utilize the dynamic creative for Prebid.js. +1. **Using Prebid Mobile?** + 1. Choose your integration method and see the "AdOps Guidance" section for that integration method. + 1. GAM Bidding-Only for [iOS](/prebid-mobile/pbm-api/ios/ios-sdk-integration-gam-original-api.html#ad-operations-guidance)/[Android](/prebid-mobile/pbm-api/android/android-sdk-integration-gam-original-api.html#ad-operations-guidance) + 1. GAM Prebid-Rendered for [iOS](TBD)/[Android](TBD) + 1. AdMob for [iOS](TBD)/[Android](TBD) + 1. MAX for [iOS](TBD)/[Android](TBD) -The Prebid ad tag is entered into creatives on the ad server in the form of a script that will enable Prebid to find the bid that goes with a winning line item. Depending on your ad server, you’ll have to declare your creative as a Third Party creative (Google Ad Manager), or set it to use HTML, or some other means of entering an ad tag (the Prebid script) rather than an image. +## Types of Creatives -## Prebid Universal Creative +Depending on the advertising scenarios you support and how they were implemented, these +are the types of creatives that may be attached to your ad server line items. -The first decision you’ll need to make when it comes to creatives (with the exception of VAST video) is whether you want to use the Prebid Universal Creative (PUC). The PUC is a collection of rendering routines that can pull a particular ad ID from the Prebid cache and do the right thing to display it. You can find full details about the PUC in the [Prebid Universal Creative Overview](/overview/prebid-universal-creative.html). For now we’ll focus on the advantages and disadvantages to using the PUC. +### Prebid Universal Creative (PUC) -The big advantage to using the PUC is that it’s the simplest approach to configuring Prebid in your ad server. It provides a robust mechanism that can be used across several formats, platforms, devices, and ad servers. +{: .table .table-bordered } +| :memo: Use Cases | +|:---------------------------| +| - AMP
    - Prebid Mobile Bidding-Only
    - Prebid.js when you use AMP or PBSDK and want to keep line item setup simple. | -The primary disadvantage to using the PUC is that it takes an extra fetch to load the PUC file vs doing everything inline to the creative. Also, loading a “universal” creative means that more bytes are loaded than are actually necessary for the display of a single creative. This all leads to a slight performance penalty. +The original idea behind the Prebid Universal Creative (which we fondly call 'the PUC') was that it would be one set of javascript that would render banners, non-instream, and native creatives. -You’ll need to determine whether the ease of implementation is worth the small performance penalty. +However, having a lot of functionality (even if not quite "universal") comes with some drawbacks: -## Prebid.js dynamic creatives +- The PUC requires an extra HTTP fetch, slowing down ad rendering by some amount. +- The size of the PUC grew as use cases were added. +- The Prebid SDK doesn't have to render javascript into a webview -If you have line items that target only browsers running Prebid.js, you can use [dynamic creatives](/adops/js-dynamic-creative.html) to avoid the PUC performance penalty but keep the same ease of setup and maintenance. The disadvantage of this approach is that it does not support platforms that do not run Prebid.js, such as AMP or mobile apps. +So now there are a number of different options for rendering Prebid ads that win the auction. The PUC is still available as a collection of rendering routines. You can find full details in the [Prebid Universal Creative Overview](/overview/prebid-universal-creative.html). -## Where to Host the PUC +{: .alert.alert-success :} +**Terminology tip:** the PUC is the script that's loaded from the CDN. The block of HTML and javascript +in your ad server is sometimes called the "PUC agent" - it's what tells your browser/webview to load +the actual PUC. + +#### Where to Host the PUC If you choose to use the Prebid Universal Creative, you'll need to decide where to load it from: -1. Prebid hosts an always-up-to-date copy of the PUC at `https://cdn.jsdelivr.net/npm/prebid-universal-creative@latest/dist/*`. The upside of this location is that it's automatically updated so it contains new features automatically. +1. Prebid hosts an always-up-to-date copy of the PUC code at `https://cdn.jsdelivr.net/npm/prebid-universal-creative@latest/dist/*`. The upside of this location is that it's automatically updated so it contains new features automatically. The potential downside is that Prebid controls when it's upgrades. 1. You can host the PUC at your own location. The upside of this option is that you can control when upgrades happen. 1. You can copy the body of the PUC into your ad server creative directly. This eliminates a browser fetch, but could make upgrades more difficult. +### Prebid.js 'dynamic creatives' + +{: .table .table-bordered } +| :memo: Use Cases | +|:---------------------------| +| - Prebid.js with no need to worry about AMP or Prebid Mobile
    - You're using a tool that can modify the creative if needed | + +If you have line items that target only browsers running Prebid.js, you can use [dynamic creatives](/adops/js-dynamic-creative.html) to avoid the PUC performance penalty but keep the same ease of setup and maintenance. + +### VastUrl + +{: .table .table-bordered } +| :memo: Use Cases | +|:---------------------------| +| - Instream video
    - Prebid Mobile non-instream video
    - Prebid Mobile rewarded video (GAM Bidding-only integration) | + +VAST video does not use the PUC. Instead, video bids provide VAST that Prebid caches to obtain a cache ID that can be retrieved with a URL. The cache ID is passed as a key value to the ad server. (See [Video Overview](/prebid-video/video-overview.html) for details.) + +When you’re running campaigns with video creatives, the primary decision you need to make is where to cache your video bids. You’ll enter this location in the VastUrl you add to the line item. The cache location is typically independent of the bidders. The most common cache location is , but this may vary with your setup. See [Setting Up Video In GAM](/adops/setting-up-prebid-video-in-dfp.html) for detailed instructions on configuring a video creative in GAM. + +### Prebid SDK Rendering + +{: .table .table-bordered } +| :memo: Use Cases | +|:---------------------------| +| Prebid Mobile rendering scenarios:
    - Display Banner
    -Video Banner
    - Display Interstitial
    - Video Interstitial | + +When the mobile app is coded to use the Prebid-Rendered scenario ([iOS](/prebid-mobile/modules/rendering/ios-sdk-integration-gam.html),[Android](/prebid-mobile/modules/rendering/android-sdk-integration-gam.html)), there's no PUC. +Instead, a special ad server creative is used. See the [GAM Prebid Mobile Rendering Ad Ops](/adops/mobile-rendering-gam-line-item-setup.html) page for details. + +### Rewarded Video + +{: .table .table-bordered } +| :memo: Use Cases | +|:---------------------------| +| - Prebid Mobile rewarded video (Prebid rendered scenario) | + +When the mobile app is coded to use the Prebid-Rendered scenario ([iOS](/prebid-mobile/modules/rendering/ios-sdk-integration-gam.html),[Android](/prebid-mobile/modules/rendering/android-sdk-integration-gam.html)), there's a special +VAST URL required. See the [GAM Prebid Mobile Rendering Ad Ops](/adops/mobile-rendering-gam-line-item-setup.html) page for details. + +### Native (PUC) + +{: .table .table-bordered } +| :memo: Use Cases | +|:---------------------------| +| - Prbeid.js Native | + +Native ads require close collaboration between web designers, engineering, and ad ops. The primary decision to be made that affects ad ops is where to store the rendering template. The options are: + +- The ad server +- The page's Prebid.js adunit +- An external script + +If you already have templates stored in your ad server for some native ads, it might make sense to also store the templates for Prebid there and keep everything together and consistent. This also gives ad ops control over when templates change. + +The second two options require engineering to make any changes when template updates are required. Because native ad formatting is tied to the look of the site, these options could fit in with normal site maintenance. + +Each option requires a different PUC ad tag to be used in the associated creatives, so be sure to get the correct script (and CSS file) from the engineers. + +{: .alert.alert-info :} +Engineering details outlining each template storage option can be found in the [Prebid.js Native Implementation Guide](/prebid/native-implementation.html). + +### Native (native-trk.js) + +{: .table .table-bordered } +| :memo: Use Cases | +|:---------------------------| +| - Prebid Mobile webview native | + +Like Prebid.js, Mobile native ads require close collaboration between web designers, engineering, and ad ops. However, mobile only supports hosting the template in the ad server. + +Prebid Mobile uses a special script called 'native-trk.js' to render native creatives implemented on a webview. See the [GAM Native Creatives page](/adops/gam-native.html) for details. + +### Native (In-App) + +{: .table .table-bordered } +| :memo: Use Cases | +|:---------------------------| +| - Prebid Mobile app-rendered native | + +The final native option is when the app itself does the rendering. See [Prebid In-App Native for GAM](/adops/gam-native.html#create-mobile-in-app-creative) for more information. + +### Mediation platforms + +Mobile apps that are integrated with mediation platforms [AdMob](/adops/mobile-rendering-admob-line-item-setup.html) or [MAX](/adops/mobile-rendering-max-line-item-setup.html) should follow those special instructions. + ## Creative Naming You can name your creatives whatever makes sense to your organization. We recommend names in the following format: Prebid - Type - Size - N. For example, a banner creative using the PUC would be `Prebid - banner - 1x1 - 1`. -## Creative Modes +## Display Ad Sizes -No matter what type of media you’re working with, you need to decide how you’re going to represent the size options in the ad server. There are three creative size modes: +For display ads, you need to decide how you’re going to represent the size options in the ad server. There are three creative size modes: - Creatives are all sized 1x1 - Creatives are sized their actual size -- Line items are targeted per size +- Line items are targeted to the size ### All Creatives 1x1 @@ -84,38 +194,6 @@ We recommend against using this mode, but are aware some publishers use it for r This scenario would require you to create 10,000 line items (10 x 200 x 5). If you were to use either 1x1 mode or creative-level sizing you would need only 2,000 line items. -## Banner and Outstream Creatives - -As we mentioned, each creative requires an ad tag script that will call the [Prebid Universal Creative](/overview/prebid-universal-creative.html) to display the correct image. - -One decision you'll want to make is which version of the PUC you want to use. Prebid hosts a copy, which you're free to use. But some publishers might want to use their own copy of the PUC so as to have greater control over the upgrade windows. - -{: .alert.alert-info :} -Engineers can find the PUC code in the [Prebid Github repository](https://github.com/prebid/prebid-universal-creative). - -## Native - -Native ads require close collaboration between web designers, engineering, and ad ops. The primary decision to be made that affects ad ops is where to store the rendering template. Your options are: - -- The ad server -- The page's Prebid.js adunit -- An external script - -If you already have templates stored in your ad server for some native ads, it might make sense to also store the templates for Prebid there and keep everything together and consistent. This also gives ad ops control over when templates change. - -The second two options require engineering to make any changes when template updates are required. Because native ad formatting is tied to the look of the site, these options could fit in with normal site maintenance. - -Each option requires a different PUC ad tag to be used in the associated creatives, so be sure to get the correct script (and CSS file) from the engineers. - -{: .alert.alert-info :} -Engineering details outlining each template storage option can be found in the [Prebid.js Native Implementation Guide](/prebid/native-implementation.html). - -## VAST Video - -VAST video (instream and long-form video) does not use the PUC. Instead, video bids provide VAST that Prebid caches to obtain a cache ID that can be retrieved with a URL. The cache ID is passed as a key value to the ad server. (See [Video Overview](/prebid-video/video-overview.html) for details.) - -When you’re running campaigns with video creatives, the primary decision you need to make is where to cache your video bids. You’ll enter this location in the creative you add to the line item. The cache location is typically independent of the bidders. The most common cache location is . See [Setting Up Video In GAM](/adops/setting-up-prebid-video-in-dfp.html) for detailed instructions on configuring a video creative in GAM. - ## SafeFrames Another decision you need to make with regards to banner and native creatives is whether to run them in SafeFrames. A SafeFrame is defined by the IAB as “a managed API-enabled iframe that opens a line of communication between the publisher page and the iframe-contained ad creative.” SafeFrames provide an added layer of security by separating the ad from your web page. @@ -131,7 +209,7 @@ If you don't trust all your bidders to provide creatives that can safely run ins Be sure to check with bidders directly if you have questions about their SafeFrame support. -## Related Reading +## Further Reading - [Planning Guide](/adops/adops-planning-guide.html) - [Key Values for Ad Ops](/adops/key-values.html) diff --git a/adops/gam-creative-banner-sbs.md b/adops/gam-creative-banner-sbs.md index 3fc6d0b04e..6d5db71fb6 100644 --- a/adops/gam-creative-banner-sbs.md +++ b/adops/gam-creative-banner-sbs.md @@ -1,20 +1,35 @@ --- layout: page_v2 -title: GAM Step by Step - Banner/Outstream/AMP Creatives -head_title: GAM Step by Step - Banner/Outstream/AMP Creatives -description: Set up banner and outstream creatives for Prebid in Google Ad Manager. +title: GAM Step by Step - Banner/In-Renderer/AMP/Native Creatives +head_title: GAM Step by Step - Banner/In-Renderer/AMP/Native Creatives +description: Set up Banner and In-Renderer creatives for Prebid in Google Ad Manager. pid: 2 sidebarType: 3 --- +# GAM Step by Step - Banner/In-Renderer/AMP Creatives +{: .no_toc} -# GAM Step by Step - Banner/Outstream/AMP Creatives +- TOC +{:toc} -This page walks you through the steps required to create banner and outstream creatives to attach to your Prebid line items in Google Ad Manager (GAM). +This page walks you through the steps required to create banner and In-Renderer (formerly known as "outstream") creatives to attach to your Prebid line items in Google Ad Manager (GAM). This same process can cover native creatives if you've chosen the in-adunit or external native template options. If you're using GAM's native +design tool, you'll need to follow the [GAM native](/adops/gam-native.html) page. {: .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). +{: .alert.alert-info :} +Note that for Prebid Mobile, the In-Renderer video scenario is covered by video line items. See the [video creative reference](adops/setting-up-prebid-video-in-dfp.html) for details. + +## Overview + +This document describes how to implement the 3rd Party HTML creatives in GAM for banner/etc. See the [creative considerations](/adops/creative-considerations.html) reference for an overview. + +## Prebid Universal Creative + +This procedure works for both Prebid.js and Prebid Mobile, with a few differences noted below. + 1. In GAM, select **Delivery** > **Creatives**. 2. Under the **Display creatives** tab, click **New Creative**. 3. Select your advertiser, then click **Third party**. @@ -25,7 +40,7 @@ For complete instructions on setting up Prebid line items in Google Ad Manager, These instructions assume you're using the Prebid Universal Creative (PUC) after v1.15 that supports the separate `banner.js` file. See the [Prebid Universal Creative](/overview/prebid-universal-creative.html) documentation for alternate approaches. {: .alert.alert-danger :} -**AMP**: If you choose to bypass the PUC for AMP, Prebid Server analytics will not work. +**AMP**: If you choose to bypass the PUC for AMP or Prebid Mobile, Prebid Server analytics will not work. {:start="6"} 6. Select **Standard** as the **Code type**. @@ -41,8 +56,13 @@ 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%%`. +Also, replace "PUCFILE" with: + +- Prebid.js: "%%PATTERN:hb_format%%.js" +- Prebid Mobile: "creative.js" + ```html - + + - -``` - -{: .alert.alert-warning :} -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. - ## Create a New Native Creative Now that you've defined your native template you can create your native creatives. @@ -215,7 +193,7 @@ Now that you've defined your native template you can create your native creative {:start="7"} 7. Click **Save and preview**. -### Create Mobile In-App Creative +## Create Mobile In-App Template Use these instructions if you integrate In-App native ads on [iOS](/prebid-mobile/pbm-api/ios/ios-sdk-integration-gam-original-api.html#in-app-native) or [Android](/prebid-mobile/pbm-api/android/android-sdk-integration-gam-original-api.html#in-app-native). The difference is in choosing the GAM option for supporting Android & iOS app code. @@ -255,9 +233,9 @@ Follow the instructions in [Google Ad Manager with Prebid Step by Step](/adops/s ## Further Reading -* [Google Ad Manager with Prebid Step by Step](/adops/step-by-step.html) -* [Prebid Native Implementation Guide](/prebid/native-implementation.html) -* [Send All Bids vs Top Price](/adops/send-all-vs-top-price.html) -* [Prebid Universal Creatives](/overview/prebid-universal-creative.html) -* [Creative Considerations](/adops/creative-considerations.html) -* [Ad Ops Planning Guide](/adops/adops-planning-guide.html) +- [Google Ad Manager with Prebid Step by Step](/adops/step-by-step.html) +- [Prebid Native Implementation Guide](/prebid/native-implementation.html) +- [Send All Bids vs Top Price](/adops/send-all-vs-top-price.html) +- [Prebid Universal Creative](/overview/prebid-universal-creative.html) +- [Creative Considerations](/adops/creative-considerations.html) +- [Ad Ops Planning Guide](/adops/adops-planning-guide.html) diff --git a/adops/key-values.md b/adops/key-values.md index 6c2f77d784..641ba1c3c7 100644 --- a/adops/key-values.md +++ b/adops/key-values.md @@ -36,13 +36,13 @@ You can work with your engineers to modify the default list. See [Restricting Da | hb_pb | targeting | All | The bid price bucket (adjusted for price granularity). | 2.10 | | hb_adid | rendering | All | The ad ID. Used by the Prebid Universal Creative (PUC) ad server creative to render the winning Prebid ad. | 123456 | | hb_bidder | targeting and reporting | Could be used for creative-level targeting in video scenarios; reporting for all scenarios | The bidder code. Used for logging and reporting to learn which bidder has higher fill rate/CPM. | BidderA | -| hb_size | rendering | Banner, native, outstream. Not used for video. | The size used for resizing the iframe for the winning creative. | 300x250 | +| hb_size | rendering | Banner, native, in-renderer. Not used for instream video. | The size used for resizing the iframe for the winning creative. | 300x250 | | hb_format | targeting and reporting | Needed only if there's a different set of line items for different media types | Used when creating a separate set of line items for banner vs video | video | | hb_deal | targeting | All | Target private marketplace deals | 7777777 | | hb_uuid | rendering | Video only | Carries the cache retrieval ID for VAST video creatives | 1111-2222-3333-4444 | -| hb_cache_id | rendering | Banner, native, outstream; mobile app only | Carries the cache retrieval ID for mobile bids | 2222-3333-4444-5555 | -| hb_cache_host | rendering | Banner, native, outstream; mobile app only | The host where the cached creative lives | `"https://mycachehost.example.com"` | -| hb_cache_path | rendering | Banner, native, outstream; mobile app only | The web path where the cached creative lives | /cache | +| hb_cache_id | rendering | Banner, native, in-renderer; mobile app only | Carries the cache retrieval ID for mobile bids | 2222-3333-4444-5555 | +| hb_cache_host | rendering | Banner, native, in-renderer; mobile app only | The host where the cached creative lives | `"https://mycachehost.example.com"` | +| hb_cache_path | rendering | Banner, native, in-renderer; mobile app only | The web path where the cached creative lives | /cache | | hb_source | reporting | Server-to-server testing | Used to report the A/B test results for client- vs server-side performance. | s2s | | hb_adomain | reporting and special | All | Used to report on VAST errors, set floors on certain buyers, monitor volume from a buyer, or track down bad creatives | example.com | diff --git a/adops/line-item-creation.md b/adops/line-item-creation.md index 51abec0d1e..821a780689 100644 --- a/adops/line-item-creation.md +++ b/adops/line-item-creation.md @@ -1,61 +1,73 @@ --- layout: page_v2 -title: Line Item Creation -head_title: Line Item Creation +title: Line Item Considerations +head_title: Line Item Considerations sidebarType: 3 sbUUID: 3.2 --- -# Line Item Creation - +# Line Item Considerations {: .no_toc } - TOC {: toc } -The settings you apply when creating line items to capture bids coming in from the header bidding process are typically different from those you apply when creating line items for house ads. This document will walk you through some of the differences, and outline requirements and recommendations for creating line items to work with Prebid. +The settings you apply when creating line items to capture bids coming in from the header bidding process are different from those you apply when creating line items for house ads. This document will walk you through some of the differences, and outline requirements and recommendations for creating line items to work with Prebid. {: .alert.alert-success :} Manually configuring ad server elements for Prebid can be a fair amount of work. If you’re using Google Ad Manager (GAM), consider using our official command line tool, [Prebid Line Item Manager](/tools/line-item-manager.html#prebid-line-item-manager.html), to create the setup. Using this tool may save you time and help you avoid mistakes. -## Advertisers and Orders +## Overview -Line items (and creatives) must, at some level, be associated with advertisers. When you create line items to capture Prebid bids, you won’t know who the actual advertisers are. Instead you need to create generic advertisers in your ad server that are used for Prebid. For example, you can create an advertiser named “Prebid Advertiser.” Or if you’re using Send All Bids, you can create one advertiser per bidder, such as “Prebid BidderA,” “Prebid BidderB,” etc. You then associate your line items and creatives with those advertisers. +The ad server configuration that supports Prebid is important. Header bidding is a way to gather bids from many sources and funnel them into your ad server, so the ad server needs to have a way to detect and prioritize these bids against other sources. -Depending on your ad server, line items are typically grouped within orders under each advertiser. +The traditional Prebid.js setup is to have two sets of line items in your ad server: one set that covers the price granularity range for display, non-instream video, and native, and another set that covers the price granularity range for instream video. This is because instream video generally has a higher price profile. -## Line Item Details +However, there may be reasons to set up more than 2 sets of line items. You can start by considering a few questions: -You have many options for the way in which you set up your line items. The following are Prebid requirements, and also some recommendations, to ensure bids are captured correctly and to make keeping track of your header bidding line items easier. +- What Prebid scenarios do you need now and in the forseeable future? Is Prebid.js all you need? Or do you have an [AMP](/formats/formats.html#amp) version of your site? Do you have a mobile app? +- How many line items can you afford to create? Very high [price granularities](/adops/price-granularity.html) can consume a large number of line items, and some ad servers have strict limits on the number of active and/or historic line items. + +Here's a set of basic recommendations to use as a starting point: + +1. **Do you run Prebid.js only?** Create 2 sets of line items: one set for instream-video and another set for everything else. +1. **Do you run Prebid.js and AMP?** + 1. For now, you'll need to have two sets of line items: one for instream video, and one that uses the PUC for everything else. + 1. In the future, there will be an option to run three sets of line items to utilize the [dynamic creative](/adops/creative-considerations.html#prebidjs-dynamic-creatives) for Prebid.js. +1. **Do you run Prebid.js and Prebid Mobile?** + 1. If you're using multiformat banner and "in-renderer" video (formerly "outstream"), you will need to have a separate set of adunits and line items for mobile. This is because Prebid Mobile does not support javascript renderers like Prebid.js does, instead relying on the ad server SDK, which requires them to be treated the same as instream video. So in this scenario you'll have 4 sets of line items: (1) Prebid.js instream, (2) Prebid.js banner+native+noninstream, (3) mobile video, and (4) mobile banner. If you run mobile native or rewarded video, each will be another set of line items. + 1. If you have chosen the Prebid-Rendered approach for your mobile apps in order to get SKAdNetork and advanced adunit support, you'll want to have separate sets of line items for mobile and Prebid.js as described for the multiformat item above. + 1. If you're running Rewarded Video, you'll want to define which adunits run that format and have a separate set of video line items that target those units. This is because rewarded video has a special creative type. +1. **Or just Prebid Mobile?** + 1. As a base, you'll want one set of line items that covers all video (instream and non-instream), and another set for banner. + 1. If you run native, you'll want another set of line items for them. + 1. And then if you run rewarded video, another set of line items for those ad units. -### At a Glance +Yes, setting up line items for Prebid Mobile is complicated. We recommend reading the "Ad Operations Guidance" section of the +specific mobile integration method you're using: -These tables show the Prebid line item recommendations and requirements. The following sections provide more details on each. +- GAM Bidding-Only for [iOS](/prebid-mobile/pbm-api/ios/ios-sdk-integration-gam-original-api.html#ad-operations-guidance)/[Android](/prebid-mobile/pbm-api/android/android-sdk-integration-gam-original-api.html#ad-operations-guidance) +- GAM Prebid-Rendered for [iOS](/prebid-mobile/modules/rendering/ios-sdk-integration-gam#ad-operations-guidance)/[Android](/prebid-mobile/modules/rendering/android-sdk-integration-gam#ad-operations-guidance) +- AdMob for [iOS](/prebid-mobile/modules/rendering/ios-sdk-integration-admob#ad-operations-guidance)/[Android](/prebid-mobile/modules/rendering/android-sdk-integration-admob#ad-operations-guidance) +- MAX for [iOS](/prebid-mobile/modules/rendering/ios-sdk-integration-max#ad-operations-guidance)/[Android](/prebid-mobile/modules/rendering/android-sdk-integration-max#ad-operations-guidance) -**Required** +## Advertisers and Orders + +Line items (and creatives) must, at some level, be associated with advertisers. When you create line items to capture Prebid bids, you won’t know who the actual advertisers are. Instead you need to create one or more generic advertisers in your ad server that are used for Prebid. For example, you can create an advertiser named “Prebid Advertiser.” Or if you’re using Send All Bids, you can create one advertiser per bidder, such as “Prebid BidderA,” “Prebid BidderB,” etc. You then associate your line items and creatives with those advertisers. -{: .table .table-bordered .table-striped } -| Detail | Requirement | -| ------ | ----------- | -| Line Item Type | Price Priority (depending on your ad server) | -| Key Value Pricing | Include the number of decimal places that are defined in the price granularity precision. Normally this is two decimal places, e.g. hb_pb=0.50 or hb_pb=1.00 | +{: .alert.alert-info :} +The tradeoff for advertisers is this: having just one advertiser for all Prebid config makes it easier to share creates across line items. +But having separate advertisers for each bidder may be more useful within ad server reports. -**Recommended** +Depending on your ad server, line items are typically grouped within orders under each advertiser. -{: .table .table-bordered .table-striped } -| Detail | Recommendation | -| ------ | -------------- | -| Line Item Groups | Determine the number of containers you'll need to store the line items based on price granularity, number of bidders, and ad server restrictions. Name your group in the format Prebid, format, bidder name (for [Send All Bids](/adops/send-all-vs-top-price.html)), and unique number; for example, `Prebid - banner - BidderA - 1`. | -| Line Item Name | Name each line item for the header bidding price bucket. Use the naming pattern Prebid, mediatype, bidder (for Send All Bids), and price bucket; for example, `Prebid - banner - BidderA - 1.50`. | -| Creative Name | In the creative name, include Prebid, the media type and the size (if applicable), and a unique identifying number (if more than one creative of a given size is attached to the line item). If using Send All Bids, also include the bidder name; for example, `Prebid - banner - BidderA - 1x1 - 1`. | -| Start and End Dates | Start immediately, no end date | -| Priority | Above house ads but below directly sold ads | -| Impression Goal | None | -| Media Types | Group media types by price granularity. This typically means you can group banner, outstream video, and native together but video will be a separate set of line items. | +## Line Item Details + +You have many options for the way in which you set up your line items. The following are Prebid requirements, and also some recommendations, to ensure bids are captured correctly and to make keeping track of your header bidding line items easier. ### Line Item Type -If your ad server supports it, you should set your line item type to Price Priority, which will let it compete with bids from other sources. +If your ad server supports it, you should set your line item type to "Price Priority", which will let it compete with bids from other sources based on bid price. ### Key Value Pricing @@ -70,19 +82,19 @@ See [Key Values](/adops/key-values.html) for general information about key value ### Line Item Groups -If you are [sending all bids](/adops/send-all-vs-top-price.html) to the ad server, you’ll most likely want to group your line items by bidder. (In Google Ad Manager this means creating at least one set of orders per bidder, with that bidder’s line items attached to the order.) This allows each group to have a set of line items that use the same targeting keywords, all of which include the bidder’s name. For example, if you are working with BidderA, all line items within a group would use the key hb_pb_BidderA in the line item’s key-value targeting, and hb_adid_BidderA in the attached creative. +If you are [sending all bids](/adops/send-all-vs-top-price.html) to the ad server, you’ll most likely want to group your line items by bidder. This means creating a set of orders per bidder, with that bidder’s line items attached to the order. This allows each group to have a set of line items that use the same targeting keywords, all of which include the bidder’s name. For example, if you are working with BidderA, all line items within a group would use the key hb_pb_BidderA in the line item’s key-value targeting, and hb_adid_BidderA in the attached creative. Depending on your ad server and the number of line items you’re creating, you might need more than one group per bidder. For example, suppose you need to create 2000 line items for one bidder. If GAM is your ad server, you’re allowed only 450 line items per order, so you will need five orders per bidder to store the 2000 line items, for a total of 25 orders. -We recommend naming the group to include “Prebid”, media type, the bidder name, and also a number or other identifier if you need more than one group per bidder. For example, `Prebid - banner - BidderA - 1`. For [Send Top Price Bid](/adops/send-all-vs-top-price.html) you can omit the bidder name: `Prebid - banner - 1`. +We recommend naming the group to include “Prebid”, media type, the bidder name, and also a number or other identifier if you need more than one group per bidder. For example, `Prebid.js - banner - BidderA - 1`. For [Send Top Price Bid](/adops/send-all-vs-top-price.html) you can omit the bidder name: `Prebid SDK - banner - 1`. ### Line Item Name -Because you’ll be creating one line item per price within each [price bucket](/adops/price-granularity.html), it’s helpful to name your line items based on the price. It can also be helpful to include the mediatype, since different types of media could be priced the same. Some examples include `Prebid - banner - 1.00`, `Prebid - video - 1.50`, etc. If you’re [sending all bids](/adops/send-all-vs-top-price.html), include the bidder code: `Prebid - banner - BidderA - 1.00`, `Prebid - banner - BidderA - 1.50`. +Because you’ll be creating one line item per price within each [price bucket](/adops/price-granularity.html), it’s helpful to name your line items based on the price. It can also be helpful to include the mediatype, since different types of media could be priced the same. Some examples include `Prebid.js - banner - 1.00`, `Prebid.js - video - 1.50`, etc. If you’re [sending all bids](/adops/send-all-vs-top-price.html), include the bidder code: `Prebid SDK - banner - BidderA - 1.00`, `Prebid SDK - banner - BidderA - 1.50`. ### Creative Name -We recommend naming creatives to include the media type, size (where applicable), and a number if there is more than one. For example, `Prebid - banner - BidderA - 1x1 - 1`; `Prebid - video - BidderA - 1`. +We recommend naming creatives to include the media type, size (where applicable), and a number if there is more than one. For example, `Prebid.js - banner - BidderA - 1x1 - 1`; `Prebid.js - video - BidderA - 1`. ### Start and End Dates @@ -106,7 +118,7 @@ Prebid supports many media types, and you can set up a single line item with mul Grouping media types within line items is typically dictated by the pricing structure: -- Banner, outstream video, and native generally run together because they have similar pricing expectations and therefore can share [price granularities](/adops/price-granularity.html). +- Banner, non-instream video, and native generally run together because they have similar pricing expectations and therefore can share [price granularities](/adops/price-granularity.html). - Instream video is normally created as a separate set of line items because they are usually priced higher than other formats, often requiring custom price granularity. You must set a key value for each format used by an ad unit using the hb_format (or hb_format_BIDDER) key and setting its value to the appropriate format. For example, if the ad unit is set up as a banner ad, you would target hb_format=banner (along with the price, such as hb_pb=1.00). If your ad unit supports multiple types, set the key value to include all types: `hb_format` in `banner`,`native`. @@ -118,50 +130,50 @@ Here's an example that encapsulates a number of the key decisions outlined in th - Send Top Bid - Banner granularity: high - Video granularity: custom -- Order naming pattern: Prebid - banner - N, Prebid - video - N -- Line Item naming pattern: Prebid - banner - PRICE, Prebid - video - PRICE -- Creative naming pattern: Prebid - banner - 1x1 - N, Prebid - video - N +- Order naming pattern: Prebid.js - banner - N, Prebid - video - N +- Line Item naming pattern: Prebid.js - banner - PRICE, Prebid - video - PRICE +- Creative naming pattern: Prebid.js - banner - 1x1 - N, Prebid - video - N - Choosing to make three copies of each creative The granularity we’ve chosen means we’ll be creating 2000 line items for banner and 1000 line items for video. Those line items will be named as shown here: -- Order: Prebid - banner - 1 - - LI: Prebid - banner - 0.00 (If the bid is less than 1 penny, it rounds down to 0, but is still worth something) - - Creative: Prebid - banner - 1x1 - 1 - - Creative: Prebid - banner - 1x1 - 2 - - Creative: Prebid - banner - 1x1 - 3 - - LI: Prebid - banner - 0.01 +- Order: Prebid.js - banner - 1 + - LI: Prebid.js - banner - 0.00 (If the bid is less than 1 penny, it rounds down to 0, but is still worth something) + - Creative: Prebid.js - banner - 1x1 - 1 + - Creative: Prebid.js - banner - 1x1 - 2 + - Creative: Prebid.js - banner - 1x1 - 3 + - LI: Prebid.js - banner - 0.01 - ... creatives ... - - LI: Prebid - banner - 0.02 - - LI: Prebid - banner - 0.03 + - LI: Prebid.js - banner - 0.02 + - LI: Prebid.js - banner - 0.03 - ... - - LI: Prebid - banner - 4.49 -- Order: Prebid - banner - 2 - - LI: Prebid - banner - 4.50 - - LI: Prebid - banner - 4.51 - - LI: Prebid - banner - 4.52 - - LI: Prebid - banner - 4.53 + - LI: Prebid.js - banner - 4.49 +- Order: Prebid.js - banner - 2 + - LI: Prebid.js - banner - 4.50 + - LI: Prebid.js - banner - 4.51 + - LI: Prebid.js - banner - 4.52 + - LI: Prebid.js - banner - 4.53 - ... - - LI: Prebid - banner - 09.49 + - LI: Prebid.js - banner - 09.49 - ... other banner orders up to 20.00 ... -- Order: Prebid - video - 1 - - LI: Prebid - video - 0.00 - - Creative: Prebid - video - 1 - - Creative: Prebid - video - 2 - - Creative: Prebid - video - 3 - - LI: Prebid - video - 0.05 - - LI: Prebid - video - 0.10 +- Order: Prebid.js - video - 1 + - LI: Prebid.js - video - 0.00 + - Creative: Prebid.js - video - 1 + - Creative: Prebid.js - video - 2 + - Creative: Prebid.js - video - 3 + - LI: Prebid.js - video - 0.05 + - LI: Prebid.js - video - 0.10 - ... - ... If we had chosen Send All Bids (the Prebid default), every element shown above would be recreated for each bidder, and each name would include the bidder name. For example: -- Order: Prebid - banner - BidderA - 1 - - LI: Prebid - banner - BidderA - 0.00 - - Creative: Prebid - banner - BidderA - 1x1 - 1 - - Creative: Prebid - banner - BidderA - 1x1 - 2 - - Creative: Prebid - banner - BidderA - 1x1 - 3 +- Order: Prebid.js - banner - BidderA - 1 + - LI: Prebid.js - banner - BidderA - 0.00 + - Creative: Prebid.js - banner - BidderA - 1x1 - 1 + - Creative: Prebid.js - banner - BidderA - 1x1 - 2 + - Creative: Prebid.js - banner - BidderA - 1x1 - 3 - ... ## Next Step diff --git a/adops/mobile-adops.md b/adops/mobile-adops.md new file mode 100644 index 0000000000..a6737d2826 --- /dev/null +++ b/adops/mobile-adops.md @@ -0,0 +1,35 @@ +--- +layout: page_v2 +title: Prebid Mobile Ad Operations +head_title: Prebid Mobile Ad Operations +description: Special considerations for Prebid Mobile Ad Operations +sidebarType: 3 +--- + +# Prebid Mobile Ad Operations + +This page covers some important things to know if you're setting up an ad server to support a mobile app integration with [Prebid SDK](/prebid-mobile/prebid-mobile.html). + +As background, it should be noted that Prebid Mobile evolved separately from Prebid.js for a long time. The committees are now attempting to keep their decisions more uniform, but it may take some time to bring them back into better alignment. + +## Important differences + +These differences explain the special mobile procedures noted in other documents. + +1. In-Renderer video (formerly known as "outstream") in mobile must be implemented in GAM with AdUnits that support video adsizes and the `VastUrl` creative. This contrasts with Prebid.js which utilizes 3rd party HTML creatives for in-renderer video. +1. How ads are rendered is different in various scenarios. See the 'AdOps guidance' section in your ad server use case for details. This can be particular important when you are investigating discrepancies between reports from various sources. +1. You will need to consider whether you want Prebid Server to cache creatives. This answer will inform the contents of the Prebid Server configuration. + +## Publishers using both Prebid.js and Prebid mobile + +If your a company using both Prebid.js and Prebid mobile that employs In-Renderer video, your line item setup will be more complicated. + +Probably the easiest way to manage this scenario will be to create separate line items for placements running Prebid.js vs placements running Prebid mobile. +The Prebid.js line items will set up In-Renderer video as 3rd party HTML while the mobile line items will set them up as video. + +## Further Reading + +- [Ad Ops Planning Guide](/adops/adops-planning-guide.html) +- [Ad Ops GAM setup for Prebid-Rendered apps](/adops/mobile-rendering-gam-line-item-setup.html) +- [Ad Ops AdMob setup for Prebid-Rendered apps](/adops/mobile-rendering-admob-line-item-setup.html) +- [Ad Ops MAX setup for Prebid-Rendered apps](/adops/mobile-rendering-max-line-item-setup.html) diff --git a/adops/mobile-rendering-admob-line-item-setup.md b/adops/mobile-rendering-admob-line-item-setup.md index 39db9166ad..d92d3ca858 100644 --- a/adops/mobile-rendering-admob-line-item-setup.md +++ b/adops/mobile-rendering-admob-line-item-setup.md @@ -9,6 +9,8 @@ sidebarType: 3 # AdMob Setup +This document outlines how to set up [AdMob](https://admob.google.com/home/) for Prebid Mobile. See the appropriate integration method [iOS](/prebid-mobile/modules/rendering/ios-sdk-integration-admob.html#rendering-and-tracking)/[Android](/prebid-mobile/modules/rendering/android-sdk-integration-admob.html#rendering-and-tracking)) document for information about rendering and tracking. + ## Mediation Group Setup ### Step 1: Create Mediation Group @@ -84,3 +86,8 @@ Press `DONE` and repeat the adding of the custom events for all needed prices. Pipeline Screenshot Once you add all needed custom events - press `DONE`. The Mediation Group is ready to serve the prebid demand to your app. + +## Further Reading + +- [Prebid Mobile Overview](/prebid-mobile/prebid-mobile) +- Prebid Mobile Admob Integration Method for [iOS](/prebid-mobile/modules/rendering/ios-sdk-integration-admob.html), [Android](/prebid-mobile/modules/rendering/android-sdk-integration-admob.html) diff --git a/adops/mobile-rendering-gam-line-item-setup.md b/adops/mobile-rendering-gam-line-item-setup.md index f9d35b6da5..01d92d97db 100644 --- a/adops/mobile-rendering-gam-line-item-setup.md +++ b/adops/mobile-rendering-gam-line-item-setup.md @@ -1,54 +1,46 @@ --- layout: page_v2 -title: Prebid Mobile Rendering GAM Line Item Setup -description: Prebid Mobile Rendering Modules GAM line item setup +title: Prebid-Rendered Mobile GAM Setup +description: Prebid-Rendered Mobile GAM Setup sidebarType: 3 --- -# Google Ad Manager Setup +# AdOps Guide to setting up GAM for Prebid-Rendered Mobile +{: .no_toc} -## Step 1: Create New Order +- TOC +{:toc} - Pipeline Screenshot +## Overview -## Step 2: Create Line Item +This guide is for mobile app developers that have chosen to use the "Prebid-Rendered" integration approach for [iOS](/prebid-mobile/modules/rendering/ios-sdk-integration-gam.html) or [Android](/prebid-mobile/modules/rendering/android-sdk-integration-gam.html). -To integrate the Prebid demand you have to create a Line Items with a specific price and targeting keywords. +The orders and line items are the same as for other types of integration, but the creative setup +has a number of differences. -> Even though a Line Item can be named in any way, we strongly recommend to use the price or targeting keyword in the name. It will help to navigate through hundreds of them. +## Getting Started -### Select Type +See the [GAM with Prebid guide](/adops/step-by-step.html) for details on the Advertiser, +Orders, and Line Items. When you get to the creatives, come back here. -Create a Line Item depending on the type of expected creative kind: +## Prepare the Prebid Creatives -* **Display** - for the Banner, HTML Interstitial -* **Video and Audio** - for the Video Interstitial, Rewarded Video, and Outstream Video ads. +{: .table .table-bordered .table-striped } +| Scenario | Type of Creative | +| --- | --- | +| Display Banner
    Video Banner
    Display Interstitial
    Video Interstitial | [3rd party HTML](#third-party-html) | +| Rewarded Video | [Special VastUrl](#rewarded-video) | -Pipeline Screenshot +### Third Party HTML -Set sizes respectively to expected creatives. +For most ad formats, instead of using the Prebid Universal Creative, the Prebid SDK just needs to get a signal +from the Google Mobile Ad SDK that there's an ad ready to render. The Prebid SDK will +figure the rest of it out: rending the creative, handling the Open Measurement activities, +and for iOS, the SKAdnetwork calls. -### Select Price - -The Line Item price should be chosen according to the price granularity policy. - -Pipeline Screenshot - -### Set Targeting Keywords - -The **Custom targeting** property should contain a special keyword with the price of winning bid. The same as a Rate of the Line Item. - -Pipeline Screenshot - -## Step 3: Prepare Prebid Creative - -### Display Banner, Video Banner, Display Interstitial, Video Interstitial - -The Prebid SDK integrates with GAM basing on [App Events](https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner#app_events) feature, almost for all ad formats. That means that creative should contain a special tag that will be processed by Prebid's GAM Event Handlers. - -If GAM Event Handler receives the `PrebidAppEvent` event it will render the winning bid. Otherwise the control will be passed to the GAM Ad View and it will render the received creative. +Here's the body of the creative: ``` html ``` +TBD - what's `bidid`? + +It will look something like this in GAM interface: + Pipeline Screenshot +{: .alert.alert-info :} +Developer background: The Prebid SDK integrates with the Google Moble Ads (GMA) SDK using the [App Events](https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner#app_events) feature for most ad formats. The creative above contains a special tag that will be processed by Prebid SDK's GAM Event Handlers. When the handler receives the `PrebidAppEvent` event it will render the winning bid. Otherwise control will be passed to the GAM Ad View and the GMA SDK will render the received creative. + ### Rewarded Video -Prebid rendering for Rewarded video ads is based on the [OnAdMetadataChangedListener](https://developers.google.com/android/reference/com/google/android/gms/ads/rewarded/OnAdMetadataChangedListener). So you need to set up a special VAST tag in the creative. +Prebid rendering for Rewarded video ads is based on the [OnAdMetadataChangedListener](https://developers.google.com/android/reference/com/google/android/gms/ads/rewarded/OnAdMetadataChangedListener). So you need to set up a special VAST tag in the creative: ``` js https://cdn.jsdelivr.net/npm/prebid-universal-creative/dist/prebid-mobile-rewarded-vast.xml ``` +It will look something like this in the GAM interface: + Pipeline Screenshot If GAM Event Handler receives the tag's info it will render the winning bid. Otherwise the control will be passed to the GAM Ad View and it will render the received creative. @@ -202,3 +203,7 @@ p { } ``` --> + +## Further Reading + +- [GAM with Prebid guide](/adops/step-by-step.html) diff --git a/adops/mobile-rendering-max-line-item-setup.md b/adops/mobile-rendering-max-line-item-setup.md index 4c7786b848..63183d82ae 100644 --- a/adops/mobile-rendering-max-line-item-setup.md +++ b/adops/mobile-rendering-max-line-item-setup.md @@ -9,6 +9,8 @@ sidebarType: 3 # AppLovin MAX Setup +This document outlines how to set up [Applovin MAX](https://developers.applovin.com/en) for Prebid Mobile. See the appropriate integration method ([iOS](/prebid-mobile/modules/rendering/ios-sdk-integration-max.html#rendering-and-tracking)/[Android](/prebid-mobile/modules/rendering/android-sdk-integration-max.html#rendering-and-tracking)) document for information about rendering and tracking. + ## Custom Network Setup In your MAX account go to `Mediation` -> `Manage` -> `Networks` and click `Click here to add a Custom Network`. Then create an **SDK** custom network with the following adapter names: @@ -35,7 +37,7 @@ Create or choose an existing Ad Unit. Go the the `Custom Networks & Deals` secti Pipeline Screenshot -Make sure that the `Custom Parameters` field contain expecting targetting keywords of the winning bid: +Make sure that the `Custom Parameters` field contains expecting targetting keywords of the winning bid: ```json {"hb_pb":"0.10"} @@ -43,3 +45,8 @@ Make sure that the `Custom Parameters` field contain expecting targetting keywor {: .alert.alert-warning :} The adapter will render the winning bid only if the bid's targeting keywords contain `all` keywords from the `Custom Parameters` field. + +## Further Reading + +- [Prebid Mobile Overview](/prebid-mobile/prebid-mobile) +- Prebid Mobile Applovin Integration Method for [iOS](/prebid-mobile/modules/rendering/ios-sdk-integration-max.html), [Android](/prebid-mobile/modules/rendering/android-sdk-integration-max.html) diff --git a/adops/setting-up-prebid-video-in-dfp.md b/adops/setting-up-prebid-video-in-dfp.md index 13b3327fcf..17de3921bb 100644 --- a/adops/setting-up-prebid-video-in-dfp.md +++ b/adops/setting-up-prebid-video-in-dfp.md @@ -8,14 +8,21 @@ sidebarType: 3 --- # GAM Step by Step - Video Creatives - {: .no_toc } - TOC {:toc} +## Overview + This page walks you through the steps required to create in-player and long-form video creatives to attach to your Prebid line items in Google Ad Manager (GAM). +It applies to these scenarios: + +- Instream video (also called "in-player") +- For Prebid Mobile only, it also applies to In-Renderer video (formerly known as "outstream") +- Long form video + {: .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). @@ -101,6 +108,6 @@ If you're utilizing any bidders that cache their own VAST, you have two options: - [Google Ad Manager with Prebid Step by Step](/adops/step-by-step.html) - [Show Video Ads with Google Ad Manager](/dev-docs/show-video-with-a-dfp-video-tag.html) - [Send All Bids vs Top Price](/adops/send-all-vs-top-price.html) -- [Prebid Universal Creatives](/overview/prebid-universal-creative.html) +- [Prebid Universal Creative](/overview/prebid-universal-creative.html) - [Creative Considerations](/adops/creative-considerations.html) - [Ad Ops Planning Guide](/adops/adops-planning-guide.html) diff --git a/adops/setting-up-prebid-video-in-freewheel.md b/adops/setting-up-prebid-video-in-freewheel.md index ad1a7ac7f4..af72d98d43 100644 --- a/adops/setting-up-prebid-video-in-freewheel.md +++ b/adops/setting-up-prebid-video-in-freewheel.md @@ -11,6 +11,11 @@ sidebarType: 3 {: .alert.alert-warning :} This guide is not written, maintained, or endorsed by Freewheel. Freewheel recommends speaking to your account team before implementing any header-bidding setup to ensure full implications for direct-sold ad delivery, forecasting, and reporting is understood. +{: .alert.alert-warning :} +The approach described here could create too many line items in the ad server +if the price buckets are too granular. We recommend that you consider how many +line items can be supported and plan out the price granularity/category/duration combinations. + This page describes how to set up Campaigns for long form video using FreeWheel's ad server. As with Google Ad Manager for digital ads, ad ops will need to configure their FreeWheel server account so that the server can provide the correct creatives for the video player. If you do not have an account visit [FreeWheel](https://www.freewheel.com/) to create one. diff --git a/adops/step-by-step.md b/adops/step-by-step.md index 0e85b68a8c..8722b3de53 100644 --- a/adops/step-by-step.md +++ b/adops/step-by-step.md @@ -3,12 +3,10 @@ layout: page_v2 title: Google Ad Manager with Prebid Step by Step head_title: Google Ad Manager with Prebid Step by Step description: Step-by-step instructions for setting up line items in GAM for Prebid. -#note the sidebar type needs to reflect the section this file is displayed in. See _data/sidenav.yml for the side nav categories. sidebarType: 3 --- # Google Ad Manager with Prebid Step by Step - {: .no_toc } - TOC @@ -30,15 +28,20 @@ Before you begin, we recommend you read through our [Planning Guide](/adops/adop GAM works as a hierarchical structure, where line items are children of orders, and orders are children of advertisers. You must 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 All Bids: Two choices: + - 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. This approach lets you track bidders as advertisers in your ad server reports. + - Create one general Prebid advertiser. This approach simplifies campaign setup by allowing all line items to share one set of creatives. ![Google Ad Manager hierarchy](/assets/images/ad-ops/gam-sbs/gam-hierarchy.png) +Note that GAM has a limit of 450 line items per order. It's quite likely that +you'll need more than one order to contain all of the line items. + ### Create Native Template If you’re working with native inventory, you must have your native template created and stored before you begin creating your line item. See [GAM Step by Step - Native Creatives](/adops/gam-native.html). -### Create Keys +### Create Inventory Keys and Values When you create your line item, you’ll be targeting key-value pairs that are being sent with the ad request to the ad server. Any keys you target need to be defined in GAM before you can use them in your line items. @@ -47,34 +50,60 @@ To define new keys, in GAM go to **Inventory** > **Key-Values** and enter your P You can also define accepted values for the keys, but you don’t need to. If you create Dynamic keys, values can be added when you set up your line item. {: .alert.alert-danger :} -Keys in GAM have a maximum length of 20 characters; any keys passed to GAM longer than that will be truncated. This means that if Prebid passes in the key `hb_format_BidderWithALongName`, GAM will truncate it to `hb_format_BidderWith`. When you create your keys, you must use the truncated name. +Key names in GAM have a maximum length of 20 characters; any keys passed to GAM longer than that will be truncated. This means that if Prebid passes in the key `hb_format_BidderWithALongName`, GAM will truncate it to `hb_format_BidderWith`. When you create your keys, you must use the truncated name. See [Key Values](/adops/key-values.html) for information on the keys you'll need. ## Create a Line Item -Open the order you want to associate the line item with and click **New line item**. +Depending on your scenario, you will likely need several groups of line items. +See the [line item essentials](/adops/line-item-creation.html) guide for details. +How many line items are in each group depends on the [price granularity](/price-granularity.html). + +For instance, if you're running both Prebid.js and Prebid Mobile, +you should consider having 2 sets of banner line items and 2 sets of video line items. If your banner line items are medium granularity (201 line items), and your +video line items are custom granularity (300 line items), then you'll go +through this line item creation process 1002 times. You'll need at least 3 orders +to contain them, but it would be more convenient to have 4 orders in this scenario: one for each group. + +This is why automated tools are important when setting up your ad server for +header bidding. If you don't have an automated tool, consider Prebid's +[line item manager](/tools/line-item-manager.html) or utilize low price +granularities. + +The rest of this document assumes you're going to create line items manually. +For each line item, open the order you want to associate the line item with and click **New line item**. ### General Settings From the **Settings** tab, do the following: 1. Select your **Ad type**: - - Banner/Outstream/Native/AMP: Click **Select display ad**. - - Video/Audio: Click **Select video or audio ad**. + - Prebid.js: Banner/In-Renderer Video/Native/AMP: Click **Select display ad**. + - Prebid.js: Instream Video/Audio: Click **Select video or audio ad**. + - Prebid Mobile: Banner/Native: Click **Select display ad**. + - Prebid Mobile: All forms of Video/Audio: Click **Select video or audio ad**. +{: .alert.alert-info :} +Note: "In-renderer video" is the term Prebid uses to cover everything that's not "instream video". i.e. Accompanying Content, Interstitial, Standalone. + +{:start="2"} 2. Enter the **Name** of your line item. Suggested format: Prebid – format - bidder – price bucket. For example, `Prebid – banner - BidderA - 1.50`. +{:start="3"} 3. Set the **Line Item Type** to **Price priority (12)**. (This will most likely be higher for deals. See [Deals in Prebid](/adops/deals.html) for more information.) +{:start="4"} 4. Enter your **Expected Creatives**: - - Banner/Outstream/AMP/Video: Select the sizes of all ad slots included in the Prebid process. + - Display and Video: Select the sizes of all ad slots included in the Prebid process. - Native: Select a native template. (See [GAM Step by Step - Native Creatives](/adops/gam-native.html) for instructions on creating native templates.) ![New line item settings](/assets/images/ad-ops/gam-sbs/line-item-settings.png) {:start="5"} 5. For Long-Form (OTT) Video: If you're using competitive exclusions, under **Additional settings** enter the value for competitive exclusions in the **Label** field. This value will be included in your targeting within the value for the `hb_pb_cat_dur` key. See [Targeting](#targeting) below for more information. + +{:start="6"} 6. Under **Delivery settings**: - Set **Start time** to **Immediately**. - Set **End time** to **Unlimited**. @@ -88,6 +117,10 @@ From the **Settings** tab, do the following: ### Targeting +#### Targeting the price bucket (hb_pb) + +The header bidding "price bucket" is the key piece of ad server targeting. + Under **Add targeting**, expand **Custom targeting**. {: .alert.alert-info :} @@ -99,22 +132,37 @@ Leave **is any of** and enter (or select) your price bucket. ![Custom targeting on price bucket](/assets/images/ad-ops/gam-sbs/custom-targeting-pb.png) -The following additional keys must be added for the corresponding formats: +#### Targeting the format (hb_format) -**Banner/Outstream/Native**: +If you're running just Prebid.js, there's no need for adding hb_format to the target. GAM knows which requests are coming from the video IMA SDK and +will choose the right line item. -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 must include the hb_format key with values specifying all expected formats. Select **hb_format_BIDDERCODE > is any of > video, banner, native**. +However, for Prebid Mobile, things are different. If you run Prebid Mobile +with or without Prebid.js, it's recommended that you put hb_format targeting on all line items. -![Custom targeting on format](/assets/images/ad-ops/gam-sbs/custom-targeting-format.png) +1. Prebid.js display: hb_format is any of banner, video, native +1. Prebid.js video: hb_format is any of video +1. Prebid Mobile display: hb_format is any of banner, native +1. Prebid Mobile video: hb_format is any of video {: .alert.alert-warning :} -If you combine native with another format in a single line item, you’ll need to add creative-level targeting to designate which creatives target which format. See [Creative-level Targeting](#creative-level-targeting) below. +If running "Send All Bids" mode, use hb_format_BIDDER instead of hb_format. + +![Custom targeting on format](/assets/images/ad-ops/gam-sbs/custom-targeting-format.png) -**In-Player and Outstream Video**: +## Targeting inventoryType -Both in-player (instream) and outstream video ads supply 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 instream and outstream video ads, they will most likely be separate line items, so you will need to target outstream line items to either "Inventory Type=display" or "Inventory in (list of GAM AdUnits)". +GAM recognizes these "inventoryTypes": Display, Instream Video, and Mobile App. -**Long-Form (OTT) Video**: +The only time you'll need to update a line item's inventoryType is +for Prebid Mobile video line items. In that scenario you'll need to +add the "Mobile App" inventoryType. + +## Long-Form (OTT) Video + +{: .alert.alert-warning :} +Targeting Long form video can create a lot of line items. It's recommended +that you keep your price granularity low. For long-form video the custom key **hb_pb_cat_dur_BIDDERCODE** is required. The value of this key breaks down like this: @@ -147,15 +195,18 @@ Repeat the preceding steps for each creative in the line item. You’ve now added all fields necessary for targeting Prebid line items. You can add any other line item options you would normally use, such as additional targeting for geography. When you’ve filled in all the above fields, click **Save** to save your line item. -## Create Creatives +## Add the Creatives The process you use to create your creatives differs based on the media type. Follow the instructions for the appropriate media type: -- [Banner/Outstream/AMP](/adops/gam-creative-banner-sbs.html) +- [Banner/In-Renderer/AMP](/adops/gam-creative-banner-sbs.html) - [Native](/adops/gam-native.html) - [Video](/adops/setting-up-prebid-video-in-dfp.html) -## Duplicate Creative +If you're implementing Prebid Mobile with the Prebid-Rendered integration +type, see the [AdOps Guide to setting up GAM for Prebid-Rendered Mobile](/adops/mobile-rendering-gam-line-item-setup.html). + +## Duplicate the Creative After you've created your creatives, you’ll need to associate a creative with each size in your line item. Even if you’ve specified only one or two sizes, you might actually want more creatives than you have sizes. Because the creative body itself is identical no matter which size you’re associating it with, you can duplicate the creative so you have as many as you need. @@ -214,6 +265,6 @@ If you’re using a Send All Bids configuration, you need to repeat all the abov ## Further Reading - [Prebid Ad Ops Planning Guide](/adops/adops-planning-guide.html) -- [GAM Step by Step Creatives: Banner/Outstream/AMP](/adops/gam-creative-banner-sbs.html) +- [GAM Step by Step Creatives: Banner/In-Renderer/AMP](/adops/gam-creative-banner-sbs.html) - [GAM Step by Step Creatives: Native](/adops/gam-native.html) - [GAM Step by Step Creatives: Video](/adops/setting-up-prebid-video-in-dfp.html) diff --git a/assets/images/prebid-mobile/mobile-details-custom-bidding-only.png b/assets/images/prebid-mobile/mobile-details-custom-bidding-only.png new file mode 100644 index 0000000000000000000000000000000000000000..40e5ab27a239483fae2cc7ee1cb6e98ac02ccb20 GIT binary patch literal 42424 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

    ukkkv0Tk#(X>`AhLk`hkkKUVFYRq-w@R?@bU=H zy(objAKvfk)ww*rfq+{(cEUGzrTu4*^mupm^p2J?D;w}*d}S8}s}Ffu zjkVUQX&RG8l7^m4)s@d`*vS>DZr8Sd8T+vRWiTRH*j`dpWtC6U$j+3hCN25g=?(o{ zUW0y(bEq59W3H!1RFSneB-;g7`(OTgI9*W-qPT4%V$?cR2`(_ul`6bgbc?|#%gdL~r~NV= z!HqB0++>1OZ?F`QrTrZ#J)8A(OX-ls4VZ41|sD}U{OA)?pg@iB-rB{NB3}p z3kv^CaJHs2Z~)e7qwq;u_TDY#D3j|t8BIeEWwWtqyZ7$)!#~L+RR7ASfcb3W;O$gn zdCZ?*oJ%yhXYP^jp_<1}tW)8J2t9DDCnxdjAvVq0c_F(F;vZL22u+M4?90c0FMDVs zmKAo5@o{XLILw#1K8-NF?Xma0W1?<_TWZ2&l=WGl?=d&YZBcT3th44qhYjvv({j$dyk0urHYRri7Fl#l06J9aVQ z4+^|$<6ritaj-!eH2f_u?&?qgaX}XW^wDxOtSN*9mj&{I$c&tfs7WG^5>n!{Z*~5S zvnO2|Z&*^1z(*a=CjJQnyJtNfi1LUXNzhhT$7uPYnz%%N?g_gOJ+4U*SJ1QD#i6NJ zyHJ)Lr)O^tCcX#vpbn~-8Ph8dPpZ>=nVj!gP4W_cK zxW??f8lv}(h_S>ZAW$`|YE2z)%H+4-Kmf!y?wMe>v3-r$^}FJl)=(9S@PtDW7&VZX2h%FuxnRu&gNb z>Zz5}bp21aqh8Rn%9{Dd8WmBZzmMCF-^~~ZiK;A2`GeB8ebY^;R)n-Z{w?XM(aHS@ z9jNYm8|Pxkk$O<^=3FzGkKUjz9t+1L*NM-S|I+EO`Zn3p*hA_-0KED)sZkin3}5yA ztMy!Eg65CM80ZazZ=;@P42x8JVt79VRZL@t(tKPl;<}$fpf%7ea(9|4U z$ef1IlC%tTE4{^T{ElI2)vIIbdr9}Yo=1$g(Vs*3?Qh2w@c6j#UGVYWq;1y2V;|p= zJOEfIWwUu_)C0oE1$)*iM+HPR0`!f8{&IH_iuRh8{H^a%z6x!PgUq-vZpwpbq4Scr zzNZADE3M&1efO_ALi}*P&GOvu`IV=uz#$G5Z%V6j(?2ynLNVRTsEjY2YSdT!DmjM% z|1r8OprTbe|Mn7DgE{Ru$@wM{OwLf?;%>VIJERGqCJ9HJm7QM_FqhrztfOnV_wq+2 zm-8P=uS;N=IJl=vbj1MZk}JXXIt>u}PZF%QW{E>C*#RBg)gv4Y^UZaD?u^FqILl$L{Bj;~I(G17BMWZX0A>3V(4)aaS8z=e? zZbB`I7&%N&p$>eifu{Fps(c@lXWv! zXD4u!<8&+-*WTSdqKP76Jb?B!1at862fO{2cz8F@U539@aK>ARzkZLt1t zy%LO!m_)xNNoX(dTlW$VsJN-5npw>m_lOw#!i-a%eQ;2evdo-oq?GzD>)DJy;_tWd ztb6{2e4LgPXcLPCGSWY!jZvQaD>#trJ-%-;3-d4AhrX}&Oy7FN1157dMzkZO$?QW6 zIk=HiNRMg$x#~^GIe}B(2?jf8O+4<^uS?b)OlzBi=%*&QE;s@@hJ zq_2705{mHBaFJ;WV-7Tvhmcpb+T#pNQ33u7_nuzKPid1UXoAZAlkT{Dr6U3m0Et!O z4;Yz!0hP;e{<4sP^)NM$0^X+4&?ASjBTDfHR=ii z8{+CZm}DO2yAxY`HLoGU7l=mVD#P@y^gfmcleQbnvwnWHaT-N9?2hrd_bd*(;{s6H zdvCucUtt0CdO(67BT?}y8DP%55-_H%79PywR{*XlFyp${j|C*4Kq3X#ru8a`$7XVx zB(5lw0iII2^v7d+C`4w;XXurNM1qkr2kFS{n>b#OxZa3&Oz^bsc(Tr9u^u)?+S88`5=1P(vYl-qH+k{J(hC;k=LT8pEtjTazP`v%+c z^y)yo=LXP=@rRS=0Ao28I94o%PMdJ#f*5gY3k&(q32+&&0&2?o8oR2-AjqINZ>367lMke5dLzz-o_ z&yidJ3`Br9bAb0@Eb-!3n_AW-2uyIP6xD`q&NtfJKx zw=4j}2DGHyVR~{}FHFK9dMmy6gbSdepL1<`f|-|Voef74511bez_Q*{LUu;PDS5u} zo!?v0hB;Qy-Spizw@ti=^)@@J^c!5rn9Amk`RGpO) z>r@}EL7?NWOx_RYR{fqI>0GHvGfqu9-o%hwA5uthjAW^>Y91r4VA7Q6AZSq{z6Hbr zw&G`u+bdwj<@j=68~&P2T|}F-`w5s@Ts}PYExEjP*M!994qBXcwoKk0x_eMu3!d@{ zh|_X8*mmA-ren6q#&t9UDw6XX>?5JNe(yQy)n*jvbbZp7Q<5}pX( z0el}1z`&A$>M8tcq8r+PsIK44Yt=Ty^I!NuQ>{8nwFJ~l3IP=}(o&m#f|F4dKAkR$ zxMfEc>qvS#H%e6KAts)gwP&ko3>INkT7r+V*E6htXf#!J6+OK@0-~pya(Pk{z%`ZK zS02Ng+NjxihmB{i=$aw}rD)H}ZgVX=D|H%%!Q2`&TRZRR1Ue=EKY%CQrDqoBr|JuW zWYnL+2MNCac0`dSUu50~EmKY#wJ1PRP7VFC>WELb1&l25EVD~09q&2)Io8)3*_ckw z*xM7dGYr@@xACG*HPPr6uJN=8>MQ|INzV`Aib-qrdo=$jz$0z|-z*?-ugRsZx^9uV zvT*`g@UxlrzWbw+@EC8{gmE{MfqukI;;8zMtNgkv{*GY&H+WpaqYZ zSzUOdVjJVyWs<+8__pLtWPNGxs-BcfsZQ-cAw5sQ z#>bGNiIS192wrp+TbZ0;oyKN)`E|u&a!;Mw4|= zeQ8W=UaIs7UOlvW7x;r>!Sw_!nhJS?&ejJ{sJ2YkS|T zL+QKHxcCas>!YaM_RU%z{|+CEUA!54#pd6}8T50;>8op6q%wWxa}t)>E&9K_n1@#< zTnAg8hb=_M$)!GS|D9J^lCH!j*Z~nIu^16#wV>#3dc5i!M@F|z66cjScoGXQTnuv+Yn_4j9q^~rOE+%c4Iiq^@*VXv| z$^ad>xL)N=@bsTy*|E$IX&jx3(T{u{SVeX5q!BNxt$n`6M0@t*rl=c?gz@FRdn}i7 zI$@A0fs=voSZLe?>)FWs3H6-$m{2>TZ4rHMO(_Bu^+QtcqeEUip_PBxfE}nL7l;qO zYFB%C0`<*8mwQh~M~>BXW0qQC_oxwKXJ$adjy&c$p{Wj~9fceXZ8%az>M3geTY4|pv*hL9?wd!JK(l-TQ5THwQWMIn+Uo+YR>H6YM?)Nr-rDn^c(w8#aXm*I^B>%aG~B;(F+AfsOx z|1BsO2SoyA$KtK}Hcx1x3|FqwO1HIm(8?3SS6Y;I&8wbEg}mo4xZ*9;D4#b+o^hv*u_=)P>> zier{0o>HJhJsEo5|E%_~STyrbhat-+_)N6xN$9hP(_S(@op;taY)&etTyMOVswlJcgZf`jA;RWVLqDE^ zBFJ6d9AIN)bWeVmFO3!Y7A;7ZZxvUNIc5E7DZFRcHC;$gvJks*!bh`gB4*6UoKHu+0D97s1jlShgH6`!R$8dSZDUe$Y$bklat&KGbzH#6_K zMgoSv*`SMgczFAB^NL}P2B^cuqg31^ND~N)+922$M!fO&LC1TAc){dEHXrPH`sXg~ z{kNZGHEHf1q~~fX&EHKiuQn8M$#q#VvMzS(c%BRXat7w}Qx7<94mNi(40S5*gtgi2 z|5NOhU&RG7e{EW-N~C#;4{yCLHN2##7zZaA1d^LJhP$dnyi0hVPzFyml6vy!QpB5VAMdDC%>sHF_&QMwo_47!Yi~qKglk|#z%s*dNzo!Cj zHQ-wU{Hcb2{uTgSY~<-<*=#uMVK`}GclY3$6F<4u7Xr7aujqU%=U#o6gvEo;jof`Q z_yh5T_w7)0JDrhQ=tO*&x0+6bOa6nM2;}H)W^+hi20r0=XRrt5ye0-y=pt+Txq+tJ zlx^eK7xqB2T~fK29G=CK*4gWP%R1H^Bljr;G)X7ZjAk#k@9t{T9hJiOeu2pfRS z-}$ju+?2G2YJ)2^^R|Am&7?`gN-xW#Z3RZ+=3x^=H153@kL4t?R+TfE-ZPi%2# z?xR2a6269fk3sbzdn7t%1m9c|&P}mZ&7)V)GjJHnrIpi>$w7tr?T2@2U!;fa#)&P> zwqMFRmR{%m{1^m3a+x*gT1{N6&b4LArjOQ|Qp$YjcVY1-@^9<}@V!0_b#?*D;ak=L z6mCQ*HxOzhf142sZ5tsU|%e02I}|BgCV=5es*O+j_9??Ft3<9>`UP0T0sJ z`y7q6@0Qx0`GlR7X(8)*V(hsdW5L~)Mk2oL&^QC8^Io`stv!tOPWIh( zXPV62{7C_(NEgE#dN8u$e{kSuqOx$8h7GPjk3fj9w85ff5}A{!mNv?06D~4MjEdJv z0J?h9WKfy}t=g1~f?IO<>vwLA{+Un-e#s?OKBI_~W~`tII#+P!@FD8D;I!cDKZBKm zZyNUcucpcvr$ z^q2l0I#B^D>HGEAkVsPiCd$qW_{(updTaYwVDMa+IBjs?LCbv8lkXRr)b+w1F&-iR zMB6N{z@ZFwhbAeVG%M1piXXDOkS!rAbyb^=vI`RQK2TgC)L9sJ=IOdVyNF-tO|zHKWa%v6jSO>x}y+kNBru zNM9#6&fqD1&>co8CAfAs(nJWwnv#TxKB5?Y<4rqkSQ}t}laOJc$WmWL3++x7jNT@B zK~`JXM`gqLf^skY7P}@D{Aes(gW!Ol`^#a6hyXOn@4gVE z6E$N>Af@@19~3LG7nCRSaQ-{x-sPiLhhw^r$Nt+JRR%Odh2O4ayemGT;j32OtFw{$ zbge^GR86)Tu7i2BXQjUXkcbhZaR?KG%~HnMAttAA z`=Kq0=LShi3L`A_^#Ch*KLct7@Wkp!e;a9*HofSWOITfujZFZgla@Bh4J||&EmF?L zr*OipqNiL0bJjCljJaIot1tW&+=PdVxqCf`!5z`jC6y`?`Dd@BTqC z21Qlv+Gp*x=A28;$@P1^z*lu_81y2wUQcYl+)37S6}FP5sakNp1)jjDrv9iiKeM66 zcrjw(3C^t%ruzsPAkWrJA>r~%)zHf8c~){v_FCS{#HpnHSXvME@DXG&xFJ2GU>fqi z4%pt08Ca_y4asFohfX=Th zSbc>D;6;<;-hbtU&+-7_RN`IwV>^nQZg7;HuWVboE^9IH;j{yFcB0zz zIAqb`9|CDm4B)zoNiPYReSv(~pO?y*l|^mq1zIccHAkHat#DD4jXD`cFiHBX7$b1 zwqh1F558^AGg4wt>rI_|E(=?3Cbdzgf>Hd03O!w^P0JsfzE0PJzGF8{BKM68fWr#~ zcezKrMBpBtjcP>jEQA*$%H2dfjTi(5ei* z0~$JCel7g>1n8iw$-ZB{Ee$+ICHcbM$4NC86={oyjdF#F0m^c?#n*XrqJ$7TqkkGKrsr{*U}#? zCCnw=MiCuyJp@`{`E!+t?JP$=cFOd2v`@ipCW*#M9M*%zV<;pvX!Im9)|S;x#trAz zPWfHcpWiM~RN&10+TiR~JE-L3AmIU{uVCf6 zWIG$AiGcfjSIx;$_6=q2h;Wt36^O*q?+r@pI})m|1XG=@zcZ^cBwS6(1n@E3tDV?@ z5dR?QC~ATf;ZI<;DYTx(eC+p&KgfAE;%D!!DdjI2G<=otRZ!MPGI)WoGtD|he}F^h!*F$vs_!e?5beHcYSGbwcJgR#^?4YtPh+g7IM+73Q!@5t}3voNE}N57SsS`eHZB+pt1u?1DRlWq}$>6 zgpfGKFF6^#MsLJU8a%{}o%A-$*5El?$%mDtRSOP!+}(bpPMLT!$53ZBXr~0ijYMBf z!WLi2IfZzrv@tq*5REY+m$7_`0Lp(fY)Ot!Xf};dJYO$L4^!J?S#K(h6Ts4o z%yC8fDTXt&SX*Oy$nuH+#_(E9lra$`6nJUVi1 z*l-zV($C>F0$4L^Sqx6vh~)N?b7ok}4~ZczxP}ZI7Oz(E&EOZ~aCNSn#9JRLzE1cq z)`y`sY6rqBtjkx|gEf|D$Z)`24}HhI-UZ2=+#>JbEidi+WI!ax#;pve9fWKh_?=k9 zAhKStOog0QPK_eaj}RpI2b(@z2>!CVNe0>#0H;9w z2bVwU`ek%t2LEH_jemWLmNAw&InASimx~GQwu>_RJB!wT(;0cOC~Ji8mmOQgaKTI9 z(Sb-~W~QLpvj{>;Wvtp!b0ODE+1Vx6)eZdqLpz z_p3d6TRillg7gU)9pn#^kOZ)?a<5NbVye z{e9;`f2KgR9P&z#qD(==$ZWAKM#sRwrUo7YB(#z#r8zMdkMPpva5e$@{c%>$FMBel zX0P3I+6WlP;lNs-pY2IpdhdC(G|*T6x{#?$vOKNu-plol!A7I{ypsPR%O%Q`MH})+ ztus-lh^-COw*euF=Q+hh?4sXVpq=K{C+>sB9FGIY-=1CdF_m3%@~4+amo(lcq2T%2 z@a3eo^IQK0mCv@%@;#8u(Ro&>564@~fcJ6Dhs^=8v+^mZZJ0ZGGmY%(2WgBNqMp!K z3*gmE9r;uC{H<%qQv)*VD<#wiegFm^PeI{WJlJOF)XH*bjj*$$eJ6Doa;1GMaMA+S zTw?fy`d9AC173);GTw7A`uq~9=hO^WKKWZt3rO%wE%;(@k?M8|Qh)E~r1L+Zz7a?c zw8HR;`i+%5`r=_2ArP8tv$h0$XsJS}KY58bNq1qJ&rx==r0Ucm$~iRidsid1-l4bQ zs8adFVE_Li`?}cohs_h~J>dN=r)wkO4dzX#zsGC-`PSdNgNgIQg2ylIl>L+~=n+yW zt&?AT@G(WMh#cU7Vk%xYXF%s)wQv5({YT1h{im4LPQqKM5OzDu>huPxW}6(>iE*z} zR2hk?NHH4Y7YRy^;O{JX^DX1j!$OEnr7d~VaI|}E@nr>mSasnD3Qyqk?1rb9S}7Zx z^JRm&=W7VyKy8YHN&>CK$6+*}3<}RjHmW|>WLbo}Z!FTi&*~&rM{3PyvayRQa+M_( z%LZleBSCk%3A)$=N$gLRG>t!0Sh2-cx_X*=qRI^w#ZZt_@Y?Ktecqb9ycSMEZurQ& zcJ_5S(QOZ%ESD{%bs6dGx=ybKbR6%d<`izdi3N-F(eNZx$H;grsxYeBsZ&ef^+{{u zIW~%uUoZlF)_lEIwcK1D6tBA6c;<8F{R%AgL-N`+P7P4W*?P0jVe52~ohRl~Pk6LX zTQ%J)i$!8X#={U-l-$VexmN~T%YS#PIZ)oAhGdFg>49$q-ZS$9nm|RFXlbQ^o z@pmKSQ`<^(Orq1rgAuoFwJ44Ofpk0n+SjS7i-?@%+Nl0NtoJ$vHbqdQbKw`!k-D)~ zN{8Vg9U`r_bKweCL?a&Bw6sNDBc@&yG*EuV+Mnt+!q|n0OH=kO<@jK3j$s%u4Z_g82e0x+2Fw2NiXx4wj(yrIGVpw1OoV3V!v*r3j!l@A z9Pd=;>*O+Gt?%~K%In5O=3d{kUylaN&k|2Z9M6$FTtIvePe|<~VWH6>;~`D^@uzu1 zf^Si}P<{3t{E;3*%4!A;j(}6{CitPU-pRjK7ie1nq)Us5SZ$|Lb(T#J*(&`l4NoyiG%JFD6Y~lWL*5miU_<5jafK`g+0v+bQ;EF7io?80ZR7c3 z)(+wHOP7l02iuGW<sbQN~HW9DO{(D}(pF1yEW4J^%IXZCyE&Z{?dlOXfIG)?E61I?JeP7RFTZYK>@F z+cLuJ#e8o_wBU^`HlG#?&~$#+({2|%C+|aNCCOMw66?lz@O9W#Xh)Uo9m~59VIQ}C zG#!{RyuuK-X`f(&qxPeI$M{3twyD(gol){)$ZU60n(tEmPE00FpYF)?@l{i@h}>>IQG z+`fs;?>w-){?cC=Pyf5Thsb^BTk~255glR1ri@x&tY6cgxVu=|ffAxnSVdPB`b)ek zX{6r0o!dnjj=Kl`>Q3W_%K}rG>TKlxTRRfN$2c;)*~q#J?f!mKnC>2qSdRtwIbF|n zKW^0%5h>f@25z_&g>!sGY*Lz_@^7+Yzo;BToP2I_Q5qVl28xVDgk#S%ss7-c_@n+2 z+eIaDB5@`|e58G3YXRAMit7&M!THi2Kf!Ou5_AF;!>Tw46Hl_d0^!Vdf(U<9;}i^r zGnJ9uo0w1>gLB0>h|?OlQ%=5FVMU>mB)Ujx6VIv(ts9hkxsW>Wxm^{*&&Xn6DK?N$ z1ucI=#`waHDk^mHHBT`rU4MzK0lV9y%2!487-XvZOQW|T0~@aQ2hABcRE)+6HtWv( zP1BB1Iru3G{Ii<06#j{NSl)=i$_SWuXsv{OpF63YwP6hY#meZIRUHUi`0TEan04;z z)kTCf7FevXyEzTjIb?S_`dZO3nLo)Zz_rJKXQf4fx_jfdJg=t5!~a%tf~M6f?0I~ z;DkSWG-ECA^f|_FR!*TJy?-|3yU_$j<*F(rzeGs_BUCX!21{t<6@hqN;`Z6EpZp>l zHs5x#-AZ}3+w1efa{| zY&+}{_;1fyU>OrM`PJnoE4g%eO7s`CKEv-giNiI>qGyLKL*5X4T3R{^anD~9or1?} zlA=w;8OAglcHCreP@&?Sd8fh-_E*6UmhzIm^V&Y5+QFM!4e2?_A*1j`c!$9pobF5Y zE&1+XgjuAOWIHORW@%^_q$4U^6DUsQsfRrgd#{1IKB_GRldGbcP(8#fpe=K6=K9ti zvNW9GwrSy$WE>%{y(lHPmSf3)^1(j6fS%cZRW=4aEl>?Y*;a5lEeg z22Z8?OYMjkErUC6^Aajls&NcI@B{-7dRk|%tbJ;}J6SF~7ic&qkD}FH{Vmao)-X0j zFpS-(?MAtO2a_6rhPw?s%KYH9xC9*)Oo8T>IQg0iETQU3lMvFw%hX zoPV>fGZpA@Do1tY(j!2Hqr51k{!4NFuxGHGmw>nSPOu?C=y%6Iu;sNI9J;|h z+`gqYDScZ$P%JMoQ}TH!S|ulIVJZAwVbb8VmNu~E)6+={eu;@iRGeIdBO}*9(GcPo8UN3Js(bzwPO6{j$=v3_%75_HKWR%N1&xU73v|D<6900}Ebe4b`04&El)0j*0NO`j zgqx~k8Ue9yJ<>||+W&@1VBo5@-h&}VQpplw;J#eXF{|(Lz$7+G$ot{#`s&l8yU75l zdvq=7-v)c0EPz)!G*P;RmAyV=aNLaH$Nz**`fd`P-0yll^yz+Atj|o}`6sPZSX(08 zivQC?sP~`d;;OSzA%dFyfXTSMubCB9Pmgy5fD z@5PRd*nr_(R^xfjnc08Uax22;5-kqNy;z+<9|kC}P59?HS7Kuyxk`l{*SZQ^TDuX6 zaZ?Sw_F$DMwma_rv_dpgL^O3wLh(=z%4(IXgB?0aWYpIrn~3R`Op9z<{rZ(UHD0#+xFTU-_T=y15NlP zA*bn^K-~`(3yt#@nG%(T?U6^3PivT~&O@wHySYT$x|Z4X&_U)(T+1>f3^IKkoAUZd zU(4J+e7!P`yTe)nG9PHSM6RfB0PIt} z4x-ZC<&mB(98s^QOIO)7U8b!%OV6WKcv4P7WykGz55?Pu2?ch%xW*;tp&0FGuJem! z_f^)01TVs|##O)8@k*mkQ{7RdmA6&wb{p$qkB4=W%2E$Ri+`3|3C8%z!od#z#5EQM zpj4J6I%pA?#4Za%@~8c3rSBiZ_#Dqyd1NfY8(s1uGfMgW^p1~uE1N67n+Sl0xMRg0uOYY^ifZW=pRFSm)WXdybA3NnE4i#-1w^5e+1U1p*si4vrdjDmeh09h+@+AATr(jzoUNnEpBNF)w{!^Qjw960=8Gu?FfPt8~Fej-a2!8X9D=yQtQ zn`qr%%o?!+i{$SkQny&k0QH07W~G6|!UI(li+WkqLk4I^ho!s;3PF`j*$mZC7BDyY zB}Ks62Kbb|hAJ$Xv@i@3evT7ct$3Y;1hlOfhdmRO^rQ8w=L-}B{q zjgb5>vUff@;>E@TWZt&baSrVlT52j5?ek%}4rEMP25!>@bY%*=>mf+6WT`VcW-+D) zCO5-5-hXsmPbJ&Y|JL8?J{OhZOLyBn4|nJS4!iy#=O~#1*9LDFxKQVQT_)9`>OSa{ z1rF3-0~ej4N;0pC!95Nh1JAGPn2<|kiCT=3d#nW(6h_w$wK!y%TI4R)jI%A^vWHpQ zkT6xbWd`ME5upocAS<3G*2Y^fms^gaxm=AWD0 zA-cPAbQxd1;3uzxS=3CVbIh5$u{t(mg(Bar>zhSS193&a3$)9MfPv|wgEQA3%_~@7 zN82C9LxdX5H+eaizWmrj{;2A6)-{ophf}-5vTMSKrC{`%c%kY%1S86{jxt(hT(n~G z`JM}9uiNpUt<7F>0dWoppH&0bJUEG?xxE3y$4e7gTS6FUNoE;l8&JSc&+o&3XO+K! zjh?FfV$`mLo`l(eoSaG+IQCKKWCs~Hn6&6@1K}|bx;V?as7J<^WCM361LW-bj@<}- z4mjWH{BD1$XN{|*I)(Usx>Wnr5{yNUfog}mxDj9UdiX;vV)ix};eY@T5F*j}mHD|( zzTGwg^?Gx9#FCl#G{I&i-C(434;BA{0hdvHBI zj(+m~YUHl#Hesai;K zb%67g*pueOfS|@U!RC`}venKSdV4m$@|h#T@!OaOqwQMSdtSfJw}|)&#E8Y#^l=Ax z?L1>^nPy8C$57~6za*}`VAC$ed03iF^{362UO1GELjP-zp)Xv<+1ldA+q?Uxs?Qb)HjyJL$WuKUmT0CwxdXXt_l`Z zIHDtMM`FrlM15JhsmbbTHV4`Lz*rzpwUPXi#_ju#jXEK@ zf^gT2_;eBP1{E&p+pzbs86WFR5GiG1ygmt?x(VkIQIN$RH zIM+$XXx_he_5$%t$aDIU41at4CYxL7&q*bs^W{p;k+ltQjI-1pIkdOfrfi`@%D4V z=iPK{Ll^X@uZXFFTeR}`SEWqwFHFtThtt$c->E1KW?~!STw?oIJow>W;?i08DT3G! zQ5jcSgX>(fs@#MpC#EeZIE^Mg#8q9Y@X)qh3N+#$gu`e+4#KY?Rx^HLC}w1X`%{>U4Oto_VUj!(EBcy^`9Aa^i$I#p^fl{H%3NaRS#K? zZ-Q_Up6V61bvFchU}`s#SXvTsZ3G{g%~Vyfgv=t5BKq(9V)UEZmcx@tF9_YTMD zLP~`j-9AD#KQw2Ki@zr7)M?Vy(dXbq+(&?8sT@%EoIb%phtK;`qvaZf&nm1_6JPW) zqADDFRNZ%dZmHSDH{B&!E`$~xbPHLSWXb)J=*=*FgPp2dX0_Mlv6#FILz@0(79aSSjr6RcG!<0K7gazu+dYjWCLVl2+u zn2n7kmlTlsMVBmMqbPO{?b!?9*7?N^cdeK$I2~r|u+rAtm~I0SZe0Gjc*931sbiV> z(K^Xkuxz^>0M9M<%O0_8tQex#c^L9NpZCs#!{Au!cW1A@@;p$<#-%!)V_+w*0+??C z&$?N7_R%*XS@?YjbCVyAhKM_Np5WYY7= zv#(Yulg}^82F0FP@)Oz#776HDk|U!@F_Uj3hL96tiKUc?1P5P~jD(mvf@-p@26l>> z2e4Lqq5{vLB4r-tE_QENo+QJnaJ0VbFR8r({uPfxBe{?lA`D;GVQ6tFzSDHuI4%dI zWq(}w>C)E(Dv{)o8(p->w3~p5g*4mlQ8UM^!S*(@@cs-|u8L0@gF_2y9hIZc-XafT zDx|^DJj-$!Jt@sl%mV+CVJsrsH@3&T^#q{bHO~+RwnxP8bjCD{TnF;M$8w4vaTq%% znuxaItO52cG>HX6WRTj4R>0#{{`t&s`z6r|!vX&v0?1qu@loZ1JiI!Vz{-N1+A3|uylGj1` z%7>VuW|=rLLr`xd38cdXeeloY-SIJ7(;6&!hEs-l>dCH3I!E{J<|%eagX65R{$#Pr zl^SI=-2g)0Z6tGrBPx4aRbxP50Ga1j!U@$L4~a>r^tUlwGBU?qae$t@a_E-v+=clh zn~01en!2YLCAndP6(SZx5UCGb|)0Ukhl02qA*s3jQn1*;QsC50W3kcU}MVBOzYl5OA&Eci+#C4@l zP*W{fikd>-M^bSLO1&E%zP!`bt-$uKY4kHhJl z`ArTgSd8r#sbMh5zDuee-*Agg0+GmM)A|tL5lASf1o3wi*J%}S0U3K^GKW#P?k!DI zJbXUusM?oNY^^ii8J!-+TMLHNm5P@A?|VFK)cF|sohHO6p*P5Pcy^Mjj*>t5Qa#AB z@&ht~C>_A5x=O@BD=fery?WITk%z28u7V;sT>tO5~gy{$=XZa=2fZsB_2C z>wC`fvP3rOBGEzHxavV{@}E*PiG6|wNc6w7PwPH}i?I=q8KspCsI?h#UDSMI-$ngR zJxX*Tn{a7{KCr2G`zDvDvh4IkGGWP|N_R|T%tZ7Y6DPEz%m0TZpdam~f^$jxWympa zyk)Y;Lp*`_fZ^ML>zhkTuE#eDX?AO$o~6&diuakxzH{(9nYKF9m~+WVzo|AB3H7Da zJw6?HVKhNw@N{EF<<473uwB7d%BY40ouEIc+~tZ_rNlAr_CoRec)G%W_wYlgkM{!w zfM{rFX*j>k{GO;zvWbFe&2b*9V_a|Eo%+C{iU=T*@rZBP_VdRwM^OD`Eo^QvRKuT@ ze>jeW&GM>MK;}o5_O>#`IKrrBFm;9e+132Sx5r;`> z8M)0L%FyBNX+tp&!+#WLgZNQclC#n~OQ&YP$i^(G=?M93{Yd!Jv>7|J=K(^OoRWo% z)ea&BdNW}c@B;czs9y@M#7`uX2V2-R%mv@(?Npa%iw18smd!!9!r-SsL6tn~JDZ!P z<@Qu>5(iELLR>K*ua@A?DTA!+P;A_A1anj`Zg2~7YDVv>2gowVEKUs@n+vzHHze%4 z09fVu5&QfuherWS(9sPpIpoE($9b7-%(>SMu{9CDx1&`=34?+BG;+fm18&2X>=-nI zx$ppxt;)CCEO20}aSHdH49ir8xQ%G%Scx(0Pj6bb%zIx@+0}gX&>t0h@*(ft1vCi- z%QFtl{z&XmuBd$UnU|}!wId{p3%FD^*h<{1r$CIn3(vW+AK2$djD|7G8z+)o5L}n5 zSt7VyB9MG~oS>)tY}8V|$7S*+x!%^WH9qK5MO_^-oLPMz$zrig66oLj)cq z!Dyj$-eg=(S0;iYXtJhjnaPvz2GHk-jouDD3IzSh`ymF12=)_S`#3YP5<>Av}OhTkLqXd zJ6{ODwbGS%dX256&Bv|tosAnM{9H4&m{$xN%U!ddh)`nc(4-lm;A}s+)Flz?+3I#0B5cvm@*mf;= zNEM$J*F9E=Z@!m#Gh_WgS305UT&Ga2BTn?zDoi3nNtJCNmh=E4AG&ET(UnEfR6Z`6 zrvm@5PDzOzDJpJV0w{HVoEV-`5_~V`2bhO4%%53j@J*iMDj=1wV5@A&fkDnQx|TPx z$#w3xd&R8{c8gv^BEGNfo7NG@(~(30ea_5%N=?SI&l3o57lQ(ui!Ng#r1^*Z%dQ%^ zblsRqL%`s;_ck_t-WK2hvLHH&0|?r= zFTg;h+4Qv23ks@KMeaY1fZh2KWKh5&uD^wmJ*oje_#04euL9pA?@O%VGfpMocFJn~ zk=2@$9kgm`E8F?SJtmAJcM`p|pD?=Wu^B@x6&<~mik%Ip?4sAvxZ?o-#9&NHNM3RE z#IAWEqb^U)c#(js=C6pwMcthF=9Dq+y~!nv7w&}UK7c4`4(w@4ooQxqR*jS?FykZ^ zis23p0b-nR|I^n103&g@j1$G%8`wYNmWq4ASSEgZa5cZm1o_Tz{+P(!Gv*l!IE|;_m1@eRy+gNvWyf%-?c& z=85ssa{0;Ej8)SB(bn(#kp59tTKbLLXCe6`#oYSmefBhaF~qGkAszFo`DAk-%?gP> znxaYB*t*}#2arRr4`<5tg!H+-wA}bENd*~W(dDM0G7`KmO7S3F6YF+^1KMBF(SmGb z_||EGDd{V;2n12wqu|021<=5kwOfr7k%2*C$gCKk{B&fmSrk|$C}ZIL0pi5i%-aaz zB?l;09BQh!A!0IY_GrHw{N8eFqyI0QgG+HF(ybxR(Vt25tx%O0e*~cs@HudnqTH7! zK+52jK(+eEBwYpb$>VQINb4M?vuIMQDt`r=NlrSBzH$8UO*pTO++Ua<842Se^K-;? zvvic$yh-GJ5>Cpz$YP-UPQLZpyFjRs`%hXTp9Y)nBMc^?2(3k;txWXuLs-eL63uB6 z0wZwfz4~}HVAyR~n!si4mkY{T_U?c-=}k)_)yC4zi|}LtZ?x;avd$au1fP2pN?tLC*^QBdv0>D-_78cs@CX2C|o; z46wB5Ma4(UEXpI?nqf|Tts1XKp#TTth z1~oBHh7m_P)D~g@YV4xVrVSJDg`p8`7&t&%EtmZ7Pr`E3u<`moZn$8Rp_qoTTL0^8 zj8maYib56wT5DjbAFgato*k+>&`%lInz%bwEnRxr+#&U$4!gx&0u%WroF-LmRW zxq#oHTy#*&15T7TzxyA3F}_;@qltKlXtQhR`pQ#_MzQkBpf8Y1yFS}S-)LC07kYxV zIolcWC5sg9I1z5Ef*k_>c!1~R&oP9=9%cy8rfd-Q=z6{89pf*E2ax?0XSuPl+neRqAA%5Ub#DlqYP)iZLMpO1`wM z@si%bUa&ko_;TuPeW%Mrx>`4dzWuJ3JH-%6UgfgO?Ca29ZMwpGe!v*vLM{2>0)hMk zMXWDJ8W!LZkMW10M8Y12brSH`lc zEpTp8{ik5AqF?&$$;5-hwiK+dTyPz@la&^DNAEzfZ)D14)LiOQ@_9m}stlTvrXOHu)eZcdcv1Q1$vm z)}#Rw_pCkHq8@|gfKo+{onf8f&IYA6L;yl6VPp~w4Gf_5G3tH~vm5FsLTi^ZUYIyz zc~Hrz%8IDYCUVmfMzelZ@vdz;DaqCk#hVI;TWkj>XAyPJLUUF`%N(_+I)0Vvka|tJ zCNQ8N+8Y_glh}mUB%rFgi*vurIR@@SRX}CwIXIsQB9Ijq1S0M&|GIt>rOkJ5;xk|ax%+^H|v zLbK0=@E@xIeo-_&zmuM5r4b{{Zq*~8{|8r2XX~* zG{K_OP#sPi9-b2I*!*#f%J+D-sI!pxKLGT3c?gi#s<5bEgf0q*o4&Z>G~lOVSA|f+ zh1MgmtX(^h)8v)F;kqWD8HCbFu&-O0SW;?OFb8uDS(50e-04jD|M<~pV3xN=NU?MS zV8;XGqR~@NmZ-2c-~iI5_LwnBqz+NvdtpNAnB$`{qR39U8VhCOF7uZ_J)`R0UY;BV zAs4l}ldZz}27?)YWAgKwZl3Ay5_i-@jQX+>A?-aiMVsnPeLxEFI<4ZMNw+kkzhRe( zPY1LHnigO>dTA6$z)6fua;MWI_xhVm112JXSe~qj7dSZ)QDT6(+FzR_F+`@=wFlnK zv0#OB#ac<>6qh86#!wBvnkuU<4^I}2!$^f8;kJnOUJFE;@XP=uJC>Vn)GdS=p~t(G z2ge&FV6Sxg`}3Q?`hWP}R%!CQ%CpD`->7ljE+(?~CD@s$M##A+tRa^0xX0Fz7bf2W zo-Xwunh;zV1QP$#VtAGbK%6);r}gdZ(Kla9*=$1wfI6h2$X{W5`>J9rHq zA?wFyvw>K*buj+f-Errt%-1$R?2<=I&J))8aSY_Yuy0U=j%Rl)$`5TNXog|n5W%?a zEIaQ^$C2(#d~I2)(~fY5xc_4{ABF)w%lnnX2Emfq9SbH@5c$=M8QZ0|I`vy%6K|9F z0DTq~`uJHzunKZbBQ`2X{NP%3PZ?qg`3&KLMG^eNAnvFuE`Y(M3ewBrs4`g;G&3F( zxpJkJi9Oe{FEGI-v`D6UjR-=yZawZekgUde6h_u^rUGNjO4}&iIi8Yaa+-ZQSg0>u zbnJQQ`_9HJOv7jHMuEM33Tg1y?b4nPHp8i87`hukKkK#IKE&Cm!8-n(kW;CW*vJ@0K-MT*yCIEaS8JWPvlD?9oIfwZ^pIehqEKdR;LURg*qtczV=0)+>(phxHUbqHF+erJh(7YcD2!o;&qf6OME=p$ zf(?5ya>AYqi^+di5Cu~kvKysa`s^-hxEzn$uLPGQgIIvdl9gRze$4mv(^_YX&tjfl zgZIV$c6e{ZbesF}%A=Ih{h)XzpWVH}=casykQOnF&Of$~t2*`Ut%qFhgN()3&OT+0 zD_)O9sw{_X&}R_cLZ|fEL!njbNpbQ$=x;cS4ix49m@b)YJyQ(8&TJ78U%uJ`kM?gXBkU|Wc?PP2xq`vC>^5&9}G$n7;N2Tu-X3m*?@6`p+Rem)I&61 zCr+(?fxatyr~~pqJy|H^|Ct5A&A!Q5r=_gp8RFK)zhFf@+r%05V5Kyg>wjtUiM{jw zbWeU~By;x#yKRHjFRE-6*iwFWD@1}M>&dUpnp(PjdNtpY9*47qW_fM;TSrm1u2%i8 zJOTZ`X6zb}lSp^h;W{8F%ps+d@zQ@VDM1KrwDHSx6v zyinm$zJKSL2GKsie18|5@|QV3gO9(_#PMs$?j_al@B3A3ok?n}2mY3i2jf(Qif$h> z55Cmkb3GnE-6Qa_7b$r@m7e+g>bg0R;k*9#IR1T`K$7Q+jxHOm>C`r1W_nl2o^<7PfJFLke z=(kHDwEcCH_kP4s>Vl`Xhr+dD9?Oh#NPyV+ChEFNV8=fq;=ke47;P#(Ft2I4>XncI z8fJY>J5(Q$c*~CJ9QPw;IB?%*9q#%#^(AQ!)j7G>szHs|4RS^GPOT`Lp(3HdAu$O1 z#*0d?Gtg`Du@6v+LB0t4)|5PWkGMfRZ#O8{>0lH*Py=sAapTuvJ2c<0bnkbpDe=)N z{!a*g{_fw$0G~R&%XT)bHAoS(eHaa=)3i!pfy^)#hpJPlhb)Gw0U%tN(E8A6gybD- zShxJ>N_rmrugEwdBk(LM%pe<3Co%~}kh+M*^_w}pCh;z=$4bW>O!y-5Q2(rP2_3^G z?Kz{@VE1$mqifA3S%9Pd?+YlQgo~Pi`UpLUA*O1c^1}={={pjGY9g_9N@PN#r#@CR zFl;4-kcOs0l3=$R2~=y;I@C^2#`-1Nivvs_zQ^Biga(npOFbM^6|z3uP}j$qXS#6T zoh6(?VJsC-T%5Fl$oYSL-q(=X_^!FVYtPNZns`j@-c4)VHI-26P>QBlcqsz+B!iG0 z$O)|cbp$NF?UGjfBg6|<%O%-y;f}L@x?iDfq%yho9aHYhNZuKTkTW%?5NMqw`6I4x z+3M6#GdVJ{J>&nCp_A%;t%{B6_Jg6qAEhY_zFXecaqibg?R9#}YllrpP(hR?v96}^ zleY<0eszGGZ_fDZ*V3TtI3#hou*`~YXk}|UW5Fcl@D+^WSObyDH@xusPvT&u*H&hU z9Eqeqd13EfhSI_>6tQ23uXWLcp;;}zub}ndB}D3TeCe1wnl|^qXf(X@)i5)637TH{ z&erd=%NASK_ub|nQsTQ(`GFKi^lX|utIdT#3GWWfw6yxO*DRZ~MFV}8)mdZs9k^BB z3mL>1&vD`vX-V9Z6he&<{CMnfJ#=1!WEMczWreRt@EpC@17XE)$e2T1PFVSA^=W`? z2Pa~K>gVHcfHKaEm66&JKi;dNV{>ql{PNptKzl^ zz0E;8zYmHghRjtrKjGTtDDX}x3L;tUa- zu+P~t|9@?1pBC!#E~H}iyko$hE+?@ z%1UB=wM(*@xBN~vO`aim=-3N+U=Fu})TeE_&GtX}*>Vti$QcACNbcy_cO5}(%L(B) zs@l7lOw2(}tovu)y4u!0^l7};I*+6BVx)^0aw{g36y%XEUv0lcXTbidO-P09WF)9c zq9k+*LoG{}M#BwyQ4@W#59|E7tJyrC2~|NgSB{h$bK2>S*P1N!_c#}mj^qvXAXrO# zK6u(O6Xlgd+2#^jB9mNePJhJjEBLaPESxv7RUH9`Og`+;%_#}6+_i!gUHVooOu>?9 z&XYx1D3vLN^;Pjg*5}G8on7Zwy%bo+x$8w_7KtGE-yZN6oZ0%RRt(;0{7#2p+I7YrC8>y=(z*$V zX};1Bl`Bz~+4o%E=IOu#ZXL`Y6+HC3Xzx-JGW5ZuX2Bl><>R-8hPg>TwmE|SX;n2{ z>WRlFSE$1$e}1GWni24i7~Is09WC*SzSBmY)=(xNzA)%{xC z7)do2NGnJN3-Mn4 zCjUgC&$h(oLs>=*ZM}-B3dP)Fp(Rr}%HtWstH6>*Y0`u0krq7F4##0U9 z$MnO$MsjK5FuayUeo{SM3*b`fWW(toxWtL?3uS~HKvYdyINrTh^+CFwg6&H`F<{nb zRUM#(g*bpax98t0nM3Xts)G%ZALZAs;MY6)n+R~$c4#Tt9_r7E#uZ9_=Y~nX{j^%N zka&GRrImTnku5>*R%5XiJ;%b5&tp_|1pl}}L`yM*;zQI70}XA~yw*Uj$;8eD<)ZpD z-=d0Zscpywy7*&XC!U%Q($#Tmt$peQNB9!l6=PG^6@zF$fQ*WYY^2}OC5$(j z7GL?rpNUL~igwJJ*q(%v9keLXnX^H{_AT2`VpGRLqlidS!K4Y=QPuid^z5Rss`=R- zKWgG&YCny)V*~98=FO|b_-K4K`h>)*x+6Nr+y~7$HDu=s>?BBRgNYx5LQ81C|KjSbB}x@No+DK~DZ-$gk#8m@BaR`N1NFzAPC%b) zKrB0A!dmkBVp{nEx~br$B-H(#`5Soa#%gLR_b+k*kV_t{%lt2d!C55-aj*=y(0A6? z5O$mtmp6P8g98JL5?6|_j>O_euj&Ftg_Zm^2sdbPzMr5*xER*GOeQ5x;A5U4I_a<}gbQ3DR5 zD?gWfhB}E*gk$n3AeOhwK=Z;*9S)9RGvGVHb2?b;@_SkGyFGEmY@IQ?dRHAskL!KE z9J)h1xUFxM-3$isj|cOrJ5s(Uxu-9mSBZY2jNq{kAe+Mdxx{Jt{AC|WpZUVCTA{J( z_>t_4?@Ei$+fHhuTY3FiYDsu})w$BT9bHA~4{F`Z_VXd!xPrJh#H!>y@}5$jV+CZs zPljK6YiJ7+6bgQkzFI@uz|N&5z9xzr3cZc7z2hwWOq62M)3Z)WNGY(f4|27Y!S;sc zmf8~ip*eogd~yt21nz@+gmq>R{y8)sJ`Se{n$MWP_$F9{j)tq76Gd7?g(mh;fLuU@ zbSHc3CB4#C*x;O!A;abU-46e30t*x77ZBf~XAosjyrIFK!t6u&F&sF2QBJEIId+$$ z`kzl_r(dHAa>KZxM{Xo>lCXY1o3?icSW2Uh4cF#pQO%{@30_`M(nGEW?Ifu_+dEL0 zmci6L>m_NS|uIq({#D+aE!Bo@r&9ea+XpV-|<0)N#_= z^4K%%5!u;8Wg7jlcV3%*%SOG@y%s@>mt{vJ+e9n46rWDFA_EHQGw%?Qk@AHe)YEb^ z7;)f zA?EpEeZ}Wia(*sc>w=Ni78uoKcbooKwI)eqN9@`sbSLl=s%9pmWro!hzs{EO9^eW$zk$F)-< zMZ^+a9SS{!^Sl_M*^j1!Ayyu8>7Tun^Ms2tE6#)iy+`zQZUj_H|DUkZ=Ns+@`VOSXFeLH@J!>kJnPy`#|ff-EdOc5TBYIw=j8mcI6 zPN&r4d5UTtBtbVmZ>AKhw1q!$ES&we;ysVfsg{(d%( zXM#<0>nO|)PJZJY#4Y5Kv76UQo)@zF6ku z?5%XSymQi|dBcNrvDJRS%RKA-wwhpM=MTR3GpZMQNi5hCIJOY!2B>rFu*#%{6lD}H zj$Nd7*T~fV^hqv{w9uoT1phurOFe?3rSfun@80>FVO^>0J4Bh8Zi(T1$|mcsSSUZG zvS#MsAK}!8|x%lezl_0^1`HK7)*S>{p1$!pTQ%SCl(76&M4BAyyB*m%J z33=VUQaP2D(w~1KB?9?E{m+2CErOMoT(-a@iWc_<*{6Q;XS|JjrCC-08`dA2-OT?! zuRn%2x!^hob`36rFC8|D2QJZ>sgxTO{V7h3e#DSZS!tW3ob?KIy0bseYJNMVj&?`q zx1D)6A3*?HOtQYJsNM)W;}_|(R7l^A82#s#(gZ?vW`yJSk!n#7@yU>*{M%Rrnq9)<`W?>|GkquyS=&pQ4IRIB!KD zN~0v{aiZyg7R5mbJNI_|5TpQd+Qv;kdHDur82L8U_HksRL}NyT&$X+t_gtdFuNLY0 zrPkkloM`R=eVm!~WrHg$6Hz+l5+vJp@qle1$E;GxT>e9usC$80dtbNkUlw|ccUOMv zVPa;|6YL@Ua-CuzO_JcF&Bza)RCumTKej=tg;J^%0K{T>@QfL`XX?NM73Le3`PUAA zUULJGR#U^kPp?0+CWomhq5S}LXBp;Sm5+@VY?>0+s^EWKPIwL=+B|3_-rrXvz#BI) zyxy$)L%%HZxB89w!uwZyVvsyK_?ZQA%Y{i_WBcb%ky7#~dy-;*{`KcI3N+jtTuS`E z|Ndds>I*L(N>Bf%qxhW3pM5+=Y~~f}SH=14E?0$khb40c9k2A<`nOK}6SIhUu$~o=i{0*Ad0+`@P!@A6C}W z{GSq}#0y46GePe)xJD8Rw9>Im@=z^MpA?6ZqLVl-v74zO91%1q7vXe8&*2D= zV@2Lgq;UPZ^eiVq5>;{s@?ZN|?%yJjxrN%(3DT};A-#(ZDss#O*JhsHyeuh zEUUeP2h~bPjF!6qBBf{hk9r2x#ssqDIEm*OZx4%7MJ!Q z4M<)0B^S^^{*F){a&SqQlaMkuM#rsQZ>V1>7(V)vnc1h-$W#Ly=%xqGC3GxlSN4N7c6n({DK)qS3wIK@I4tW=IIu{mZhp74!5?gGq|#T3^QAQ!tNuLWVdk& z=rhcUS0PWlSd!XsQ{3o*c89Ssp3kc;gg2n8`=YbqpmJmyyAd0TXvB3aIJUC6C=9&r zWK;csU5*_K*$Ws;8os7SpD>B|V{>!fIeprSiq8U$HCVzp?ZA~8!+tuVaFBki!IiO>1v z-#ufBtjwzrW5}8NlfgB+jktv5DXfL%PzfPq??`@4RPmZouc7i9Q&*4dsq+;t>+W!l~k|XId=K^Sa7WBl&Mtf ze$=iM&r_j9>fSKalUh3Q#8YT>h+JxoL~rn&BEDoBA6vG;6=np)j5UaNUy5)E%3RUI z2%QDxw(L0BOItU0rrodQYL+)yb_^EZA03W}{4>oW_$n$Ij@1zEL*6gI1LyU^l=;WJ z=#MTjdr8t=-0qQkOF!d=-3?HZ@i`Wx{dI#~gR8Dhg|fCDnFSIgY&gByZ+b;((L|&R zqqg_Kp2ykJloGaQw4;YLXKOFAg*aV02YH7q;1Hun3M)NayzQc(&{31!tkKtQ;%^;< zg<3KxCS}L)fNTxRI=85`y_IiMVUA=0{micIerZC1`@0riX0bEZmyF0szrperGnH*T z@+l`_L34aLna)ljqU1rq(PV=2S>|<(UbM!WkV`_Mspo?$5+QjaTzbR8WK46ImKt$; z1>2nH*|Q%*vtZpr*?46P&X$r;ID%rjZu=CE(h|~liiOI>v4MMnTUW&6Kh-uuW06F} zjl0Acz%_ZQMsp`_V2`^;W!EaL2OYn?0l8|1cC^aiavsW($f@8Isd;VV22{?yUlk}h zN3}Ese#P_?&@3|l$PaGVa+ILL0$yrTY zvRT@WVqaNPPG7=sNr%2(hJNztofai$b?5n|t4-$loKoIT_0_R4iSCM$k3F?Y%TK?w z-HqAk$%i9~;8D1tcWqC;XwSWv+U6cm+e)sLW-TYjsb@tjt9+&g4dEag-au3??F~cG zUJ8Y~Xx?jv0@i*t*W;{cy2VEmp|S{xD1mvlk3y0Fez~aN^XuT&VC&$0z;T{ob{hV0tq`P z+(Iiajy+&oTa^`|@pzb$cf|=KhPj5uVsK3GV=Sp6BoI6(0l(+q=qO&Yr+o!v(9#R2 zA1u(auH302@RA{FzbKxz#rDL`tX^ASo2?cihCYm6vYqYEJZl=%{E!TYV`+qaQDn~` zDI;`Adml%xF#5VlH_fYuPAdi$ZQ9X#t5MctGRwVh zVmcCJZ6dRk-16?*8R#dVX_;TCeRU>gfhJxR1e~JTa z+u`Vkt_SeEJC7d&Z?=}8864eXv$CY)C{yfUfPWhxUCw}iaHsVhO9056gC+`<2*Bm(EXi zb|e6mON8-F;=-;LG`r86ipv`MqAB^iqVEZE8NC1)ZW+K8970KToW6P=xqzR#gART4 z2T_kQkj1@h1iV)>RsCEWTrHO_nJ-#2K0aPQ=vOxM<=x}?w~2@o1WH(PIENl>R1kxu zDM&+b_?9N@u)ow>=67-I04{Q0X&nhH-(1b#)C2$gEPqIR!%C{Hw`H~0!OHeR2);Yg zgo3oR&JGIBZ}wjvj;c8Tp#NkYjO5Q~8u2OGdGM9^8iCe!qz`yub~Q6#yPx{iuype# z2%cCl_F5(ldzex^=-9X=;L(bLRmYs92REyp1CYko&WrMvYnNEb>$-Nhxc$_F04~37 zrR$xRn+DlC!X2e`zak_u@xK*Bi|#b>+xuMu*mAbX>%g$leQO5%`E?r41r!eu5aHeF z-*R<)u*&BiD(!(pA?9}`D?fg;pIR0R%<~1A7RHJvp?nhCEjRwPzdsc>$kY0b**C1` zI{>_dLnGLEL;#-s{`qd0qqlQ<`fQ9uqne!>H9X~J~ z{$j0l0&a>^J}21I0AMQT{{DLFZy}j51Rk3H)o$cQM2d#8)dhfpKB6Tp&{QzoM-f~} z^Ms6#J#D!M7jc3y?#eli6>4nfe{k53*!d>9vsnuQ8zP22a+J}CZdQa`fPVki{n-LF zT0ytp+9zAJ^9@Ll82}@;&76Gi13ZwO}liVq-o!jqwP{!G#Ay2&=o9P6{Zl+GK zEBU5Z@V2)Cu^nkfp@cl8XB6-b5 zz=415q_%7{sCDp9yE;EQz!41f@(je9ns=KpGU`v_oCWC+t0Hc{mprq)_Ip{VaYPR= z|GhQj?D1}`tn2Kw-SvtAmp9;jgkgKFVUrT^=|oOuTt5ODpFf^-mfUu{L_ZfR^i54(+=bYgx4b4C zu*&^vV#bytrC4DKNe2q}SpH&w&PkU%2ALb&-b-)geN&smyn6v>BYAmh=@vsFx|q;8 zm%J?7{Oc`^*vJKl8epAw%e>ld+!*ad zLAP=nTJ0*W$Bx`cV4|H$FxI(O%mZ%8ra$bS?eBr&;Uw%4V} z9x6=b^1-euT&;UnZUie4#J7kyVbHX=%!qjs65)E~-;=+j8qs@Ac;2C${gX+rz0%XX z*Q%+mW8p3m5-acihG;z}W6WRhzFS!d>Vkmu9z2DqlR}yyv zF2qZY@8I%OVwv3EOm0x^r9;-b2u1JHO)Eij9X+D;ge|BTh)PQOwi(Kom|k|^GMDaFpVu;{nYri zXWIh&4@zl~)%PSF`u1e<44r3yr*b9vQSKd*gHI4;#vF_GkA~nkBA#YAt4sDhP!i>i zc>Z1fYz2k>^etE(zsKxj(RgOvU9uAKUGvbhM8=VL-*sQk1M*(Z_MOE5PTe<$mHMAw$eoI7>0VORt3LwqEjCQa z_$E4BG;eiC6*H4lvQ$eeetrJgH9Z{pZvA+#x~u$y|41@j0;_T%_i6CrJ=J->(Cf|v zgdF$d$Fu>L&M&?zD7m7uSYk^cy!9W%CyK^Dl{9+7UXnWs)(-#N0Q^e{i52kt-j($B zU0Xyw@$Ly1Vu6^)%h0$-dKZ^#mhG_AmvOhuAO9+zT`8zo72`eltZsIom*WwantPqJ z*0e=Jg{+4>l+^q7r-OeO-$%0rME7V&xWS7Q%RY{GTdi5rAx*dhD6muVwpWU}nbh;<+_R5#2{Wl+*R zxd3Szn~V>iTZ;j|*X2maQ~M-l{O}w~*bgnen-3!T(V;!55cUv)oOH`8f^ThtsXw0T z(KrEIalaUL8j^TPcQ+4p`n2amqVO_E`#JnBn*7YBsE@>>L|aDRP{D=1MB|%gELa#E zt3NevR`pXASG8J}$#HiyfaMv^TBlW3Tyy>h{3#?xk`*jp3_c>~FhaBv`BF%#F>hI+ zomY2z!y<=ukI3Za0V)GU{RSnS0SJY9)H;@?U=3e(x(=&?b=Z4#JUzs|n)c@C>ZetvoBh-m=PyC=bIpD}CRU^QDx)~wFJTXBsvqRU!it!2 zzy9zA)_}b*jfHh$!uy25nAYo3f(|o66NMU#6JWWgO&q0-@-qz|CyMru26*M%G;Ld| z>M-pi`c=PN6`jmBkpb^TP*13|z=Q*?edqBxt`Hb1G+YD>5jj2Api+xz!0vd*dWpv4 zvZPSJe8;atb(~#Zcy$K&o6dhNcE@^%-FoSzAnDI(yLQ6A(Kk~d8Rhq@Biw(`d7P0& z=sW*;Z4jL@k~th53G=_>K5Z{JM7dlf`6XSyVCx=IF^khi+Nj4;KKtK8J9>{&GOE{x zoitiuChIYx$l}$x2bR0zK6Y7oeWnrS2xy-OiUl8|;fs%u&^vNskhi?yre2_EYXG=( zuI!J+W2a$hta{)O=@vg4(=z7mX1>n_T>u$B`9t0Sl5WZ=sqUKv{_Cyw@8)?D07|}e zHndg0cJ|0l2U`M3br-g{%Gb)dzJvvcop-%8^V zn326Bv~Y`dQ+^{YjID2G4h)8>ZQMlw4a8@@SeM)67zCiXKMR>D(72X0&7qfl?U_+g z78X{>$6ou7w8#_%?lBfScu8ZIl;87Pp~`KqF5@cPiC@r|rQ4D?F-Q=7li<>;*6=M* z`LMz{A)V5R8vRS@%fOSizKEQNU?sitI)iplf-i86K;P=UAw}<&?|QVy9DJW_3wY5c z2GfK`U%Qlf!{e|aIW&;8-Qp}hj-V}D$#MQaqGKx zvjX}2fCH~P<~o_lo5gHvo$-dK1B2E%!3#YvJ%H>DR4Fq?=och&s2vxdM*90n%K6$@ z(Yt^(Gujx9zW#%~7X!Om`ofzP?Nm1s1flQh3l%`-)B_WNI_#&~b20ziAS7VDQ|o)8 zFBu)=-E(W3rtUo*(giccncI|IRsqMk=D`so(=3^k2Eg(`97koReJ+PGoBzOR1Y@0I z7Sx=xdl@yET&9t+uE?}LnjHZ>hQ3Saeu!2q*e4VrCb66{0^(mXtAS-wST1`&Z1Y6c zgo1_a=n3malV|<#9j`B;8#qZ;GvdL!Ss~9eShM~1*U|dCfwxAPB=UrQKt3FGc@x%b z=^{n@w&M2Fg|dGZYAHVpFsGgi6${)qr=!QiyC+c6Cw{w(ysaVn=w3g!65sX6Lqg;0 zMGO^^M~0^A3e(lLtHm8xj2{?UKn#=T1o6xhkymRAiJlyzo9qdGiH#vYQeP&Xs$nVf z9#ux*a*6PRvEzQH$$OTfWUGJs*Nxw5x<@{K%i)N!z8~CL65`kDK`rTeEhlxlDr2@S z`v7_w_3B-Kod{gQa0_ z$!45$v{Zctzg0{?FF}iI!Zg?#p5>i;@)AngTo!=TxfRVHznX(OFOfLXH0X_ZKD zu=nv#s|!oY#l>v@%g~+R%lb0CHG5&;VxjWQaRFLuPx7@g$Wp8`poBhj+*2t89_14hN*5Dg9 z++wxy4@-Qe6I%YOs+d!$;lSqDe{`m_G)JgNAC*h@*qgHIQ76@CWY}AdPUijgn3+eH z^=6XIiFqRNYPDfAT))D6pZWj#<0S93ydVFtZfq}(zTb%{z@<$<IxLsk;3w6F(a z8==z*HwveleNJTG%KJ;3mFk-_ml~Qc{ih?#-H~MFLC3(5Oz5C__?)y&{JBBSL5-FZ z&~y{#S*2O}9C3Ag+W4}Rj`Y~JU;1B>fMlNCIs!{$H03)CJ|kCS2{c_Jw?xsyVcE~G-MMcDs(|%&?W2FG z-FW{C6(@MU?qi5eNPin5j5dQSX6OQm%Zs>gt|jv_390J6h?RMC#WblZHW_CuamZd$ zF#-v453bN=e9MVVMuMNw9uF%~jpuCg6%sTt7{`h&XU`~iU)Tbs$Zrjo=FL-IyaD0g zN&!Vj)(4Q!rhZ60RueBP%Em20^Xy@-6!t_Podk(b%`#^Hrwb6HxJ$o^{e$Kad+2Fl zGVGN+$YS7Yc|@^-;7KaM%U(a zPyguQGDUG-g{tr+gIH_D9dEY@t&_ybusAVsMq>sW*u+gO}!=JTm&MJ2;$u zV&l#vGkp+gZ%9&zkAk6R#o9!9CZjrG-yx7_Ht!19t#KYhTOcz8sn=I0^Cu3RAZabe z<6RIjgOdcZ+%RML1>NR{ZipphWoeO1`+XBy#Jiyjc}i>Sycmvaf3PbJQ>PJt&^&rH z2%^LWw?NcjGj+*1_{u-35&t~wVT^q>FbZ7lzO#Gh9Di&&Qk6WQUHUx5`d$IAdLUjF z$MdgpItKO+%MH65g?&$*XvK*`D5g1?MJ_EBJ*HyI!;;#zZtoI~)&7%M`Fr z)pEL5zM0cO>)b)u92I=tQGC+v{IKo0O5r(;xOZK%-v#)7nQ?5w)b~TM@ZIa8vZOxt zH%GXB-i^v_(kuoDu58!h;I|PF4)&U|Y42!|z`O`3;zmL&d zf^6~q%5Pt5@bH9@0C@f(k5f?Y_&eH}{}xxn7WeF8i#5_&^XZr&UPMkqXD zZOyMmSI-P1vs?a>S@Bqdt4Pp+e%@;}T{z(>WHm+^XZs#f^J@f`tehZw)=3@8n>~{= z%mD4KGg+X4hoI)XN!X58=5jWRlHl(T%W?FcxF<8-9g0O^sAlZDCzlz`5EDwROAPNf zuQvuhTJeGeIo{^wBm-aleMIzi$8?w^&8uI*`%f~Rvk^g7hil)Bv+*s}N4z}S;$s?n z;kewJrR!8fI)e7U1Yo-aqd*_btik`Y!vHgft2}EBW$oTwWLvp7I7=b;2{XTepmV8I zn_N(5@Yg=J;snjRi>ruxG`0S&{)Xz98Z<*7t3nWr?oEzmehv+H?9gGl$K3i=US(G@ zbKSEvmp<0H{pk2u?o%KjzoTJa>@2+x?X>(6VhiD-gC4f!(DYS3$LSNe0s#vf)LhJZ z*_Fmx$KYcgl6mxLktu^iqldhr^-{uLoyu{FMf8t#2X{V95?bXx?!L% zBhyRqTIX|E|3-Cx+!UOJGhO$}_wc(sbA)Mi=LD55u5Z$wuEc7ZE7E_J<+->M)h{pS zg4{UN68vrfDWg=|jLt}(R=ZzlWe3K*<7JogXj=>EpwBJN3Hd18Cl!kUbbE(q3xR;cb~<5P-J4a^)}&Fdc02`yCg!``;{?%`Z1Fn zuV0#P{rl6!^#MJZzGlfVj&tb%f^Q!=A8pgTH8k}V@pX!F?wPvRD?(Lul~nn5D5?3g zrPvb2n)JsG;S|wBS@!5h&+2nKvIq8@~i3@4K39ewtG zIQ)&V(J!p<;`lDAprRR|{A$h}CkAM-`=ZQi8fW%xHiDQqu%I#AhWbmtstc{40ei~X ziZj-b_o%(91DEgBJcA5*$8Z0+-T!s+1pPu9R)3|~-Yfclgb481gT_$M6PQ~&5~=ym zYn57M zNriD7wr^rZEcNRdxj;Bm#Lf#9tBiNmah886APTgj1QehC;tW+g>f8N5b|Eq;!r;<# zlMOP@`QXsNn)<+6^VOW!s@${Dsq&0$%M*rD*7P!Y!uwbLzE6oUy7!i=sZ1LTU;F~m zs8L^HYE0@M$;Ob3pCb9h2hqFVFivAV7p*B*oCtXM8X#mgc!?a(F(m8cnCiyuxAb7bR z4PR`SFfNRF^$lu~TZ^CG(d*my&Utp$BmU@#!U4_d3*E zAI&n^EP_hSm?8538-E_`0&79ww@8jP(Wi8t4Wwv+k7e=;efmEukWFh~{l~FDG0`7j zglxJ3bMAX5<0rh#Qiw37UtLx0`uhsJP_gYw41 zo7eCB)d`4Y5j{(}IFK3Ad1jp#_ry_6Z10f=sMADCen~r-X;?fdfWDQ$T^6k?hw;_? z2lau#7k#*EXYLPkFa%FuNO7BpkUYO^eGBBb8BXAtbqHrp+P%=r`zimk8N{X-0TnP! zCcP2JA6*Y^#|IoMeM7)hJZI1@IBAM@0;IOngR|C=3|75*jn*NMRsL$)n|=&2&Igu@ zSP+K#BfHhyTDRw9fX(hNHwJD3LNw5qeIp_I6FCC#TjP$GHD1D>m6N&Vj?hAV!6k4% z<-DHSny&Q-qwy}(&1&@6G0wqrv#usFA$Q%GK>wIt4prnrcd*g`dSINk#>W+bDUqsYbhTOd#F0wvTa} zB`&U@o2*I$my^GtKK&lz}tmy7Q-FkvG6^RjQ5|@ zl>+Ts!tRnWdO+dE5bj3|LyazMd|V?8;Ft>xV_I2s&km~i%=73}vhBaA25ckKP!6!w zwlQ|!HZ5`zU&9|GUg0 z_j3%U$avIr3*R zB?jkl%L(mL&E*A^HXoK5$(4^#lHUo!__Zz~Urx&j$<{qRm06g-{mz27RhIO?1~fF| zgM8;RU4BkHFX;!1ffdNG1>QnRt8oNxrZ`>_(&SWM;Pfsq_Rt=VhthdT zV&;RW8mpH~z^e#ApXn69zx&_**faibpiROY9P%Khx2Z?jucv6;uc{ z_$n&5O&R?mi81*Uc9V8wWQ3v%MQiOm5;!#h!0A5*ZX2FB3i%70s6o|Ud^9K=`gI7x zf^84WdOv-{#P`Hz;1<4`maSprQ=r3J0LGg64Eja0B(a z%nX78{2?#L)WE&u(spYi;S9DKtXTZFs>m{>RlG<#POw7s6;saSMHX=%H_dzZnNHAl~=WM5dh6SC8bP)wM zoxbEkTPCm!`!skfX}94JdtP(Pk3X&W2AxRImUKz1X8h32;1J5zC3)QZ*aaSn0cuyjYg^CZ&E1N{Y#1;M>Y=?F#%=Bw&_)MR(Zy1 zhq*s2+PHQgW%E|&r`qC*Hy;JokFS{iYDSVR))yJA-iT_}k3S}l;E#fM2Z+ycqyhCp zK2H7&QV!9@x!-FVDEyGs5af5^csQ)3464zrbSn&^70DTbR-&BP*$=Aod6AuafVt8O za$7wiqam>|SZmLe@d&!5W`tgHNR5sTqIEK#?FI!1k@*@kJ!JL8L|&w;#eWy+=KOte zL-A32YEPAjSA&z63R}^_45`~CF}(veZoy1>N1IteFlUgwj&h=OZ(U{ZzM_O7`Gi*d zSyl7R$%uIxZccVgq}7<_`JL(m?Z*bb6JZ7W>TtnmYR9q%6JjTf@8C!iK&ZGp@~aUx zYb{||9KT~{}onwnz47tP@ z_ykErl*jg&X*@34V(!SRcGn@Okos7H#r`F}tf(S<_{kdm7jm|EYc?JwXt@b=$p`x| z)IG#58$H1GfLzqxpRI}U0f`9Co=CFNa;V!1WjhMoUuJ~UK8n`iRujKGDK>W(@3EnB z4f(dq?CT%8{FtZ4W1S)h{KDBSbl+w|ni>y68gmwA!*I=kNM}3^CeMd3h2&hnt0)M} zN*E=p)5+pq46WlUG2&)lC-%QqJ5?2ugX{+r)g{r{W5gWP9+krJ;SiL1g$1lsff~YZ zWL?-Lg;Mofp>&sZqqG+C2>Bop6lqxjavY<+h78Q&MK#D3%oYZc2QzkCvn^QlAA^c# zd7LAprnU?``R<%N6)jT>{_5l|Id{_;7n0ytYee*rZKxWKBhF5KMFW@!O|wcawD`PD zZhWkf+a$Y#cVTBmxSARd7L|l>UQ`@9WIrIQxG$scQgmk~S)?wlrUlp8l8l+E|EYS( zne=Km@d;7FF7S4)KYO;W4{w&q2lwtn>Q;uU55sIv*D&luh+0{3FTR*QajV6POTuhv|?s%kf}7KHXAk=Jc9 zo%Dyhe74tPTJ^d!7E5z8_UxuG1!@6S9?ZT5Nm4z*$Qn^F>4+bNr(|Ybk_x1Ujy5L$ zNc1Y&_ATVp*?J9MktwG*-9v+_>|j%es)P!{K8DuK6s7Na2#`&X!j3dCj7N{Jw9j?z zX-P%$kNc-g6Mgh3m@U5T6!kUgfS?Rs`AS2XLWM$GS~Eqnrzp&a?kLJ2Qk^~91gCB@ z%T9pkcLVa!@V1>B;OAe5h;udJrMRMJeAAGh2N44X%lb!!C8&Hm9Yhc=}8#SW_*PR>hw~82`+= z?f%u-2hINclRj0dkFq-usE2cQY&$y5{W%h2LiM}sL^PPEZ|7C?lo!kv?wJ{(FdvcA zL(b6Ps^Y*O=*+>LCBpV~fQcI3sn zJCMi3Snh|2E4QMGD@cu#cb$!)M(#5xeGDvR{6YjILwHNkh@J*JQ9@TUoD+^;371Wf zkVsTJ-UjYf>@C>Use6L^G4YyK%UDqCm*qdaRI#l1Qq)x*uCSgM5NYBA2MvtCCO;l6rig~IEg7;TP zO{xFv{pq}r^>3zdyS=GZw(R4hOTBpp)3?n+Zkr_bk|Yx3Wh4${D>yxOQN0+^NnRv4 zm6RkBk}UdRkgU?pLn{*lM{4t>Xw}b?Nmg*7-^Okt<5)eQz$Md2K!e__ea;mW7EO%t zJF5knFOB__?|apI?|`~Mw{zT}`gIPTWW5e)Lug3xP$TMm`A2jb9rf{4NRvWsMqt)( zyRI_I@&!TA#(gfQ0pCriDYl97f(Z1b{>$u8|2H{r_Q)a+*^+{$gp~O!)^Z}hT>vKP zUb4h<;Xf66!r(2XV8x$!QKQ-TnqdXjk)gspCQ4CcRjeh@7lIIOND7}OWid9it*2B5 zA0^bMiAN6-%n&y6`gzRrY2!C1(v8OIQS!KYnv21F3O8_yJDT2cJQ|*|lWIbWS(5yr z{Gr>xOK%|KYd3Fw!w|%2jvxHX^L60-{&V=EOaOf^DmS!GEX$5jjB!^z|RH~kn>^;&g0lg95^oQwky)(C8nSWu5DcG`-dMa7pw(86{SB{WR^g;phkHbMe~ zUgKbJLKkGDPri#-A>lmnS6m;88%k(EK?kM5BvTqzKa*3_3}Bbt`pgD{yZa@pp@M2ifsgD3*S>2sxCW>XU}2Po(x93lOc~ zvSUZ$7T_4cUZ9RUav;=jZdlZJ_TgNpHzJqNth#cxCXOak_C+%cdQpD@)C_bjw{J%H_^ za@P!m@@vm^!9(<8^mPU)3%53k-Zsq0>S?@Z>oD0KbNEUO-fT8uDzFbpWS3 zGj8ZcD(kXW#z6_-`p{esIOqYJm?;obWaaXxvCJA$pbiY`YJFj()VeyyajA zT)Qb-<}zA{T~0@+3^)DtH;j!KtyO&)^#T2HCl-XE89RNCyAn8-nM}w^g&wk{8Nh;o z#idNujJe-vdt=)Vk;6Tj3Px14x@&$U?ZuIwD`XLlGqos8YD)ENaBVWH`|Hwk?*mSy zF$fK-LGtF3pZiERZv>=pcl!Z4^r6-Xe-{XG~)d(8WuEriu*_(i}Hd~_q`IGmv=>CZsA{voPKpoZJp%ytc zqLJ`~{JW3nkwm*ZO$8SyrHEPfecK3?Y@r^Gg}VQKSiVl<^iiu#lqsQ!iInu}q!7w_ zgX!Xs^tzlP=4aR}#uA~~d$q*NtgEcsM{3kEdlCwsz{M_=9gFKWL{`zT1I_yGPIMPr zD>MKd-7=uLwY~i{NX8=DvqpuZq1l@$$~$*!#t!TD9q_#6KLeoe3^L35aTEmtnY4CC zj6fv4UF71sJZ(KPLEaCrm=Z0P{Yl2s*DD_!XTbOK8yRor4f=dK;M57tD=+XHv!Fj_ z2$UE@5b|sY)XbSQVOJ!H^&3#^EL?$?PM; zs2^eXGx0c_>E~w)R;71uTQrrjeRN_(kUaxvJ>^RQ*G}dl^_1pP6 zzw@>Hz%y;f%BQ@1sCIh8uX)w)8zLKUi^dtwg4QEUU+kyH`(tS(CB{Gl;t4pmAvUW1 zS+$Ks1|Yi8r*1$~SSI@J!=_8n(z-|Evsqd3yfXrz*eo!B^Isf*pNjJ2s|e0M_yTfd z`+WhigaA_49eLV8b`ws$FRY*Uy6%Nh^1nEpxjyZd#4MSOqBLCF0Xe+88{ky9@p8qg zLm<_{fJQ6y#d`EUki1^GeH0-^m63u#f}-fvIn6nX=;_tH2u|4?*{ZknW=Z(zBjl+1 zg@Qvx`ffJSi5g4SBRofAOqS9et>iO0-77L~_;)DL>v$9$CF89)MsL2c59kdC%NU-S zKf&jxeu;w}hONpY2iDsC&#dGAUETA+LK1pw542!%3JF3(p6PEFJHm-&0aDWrxO37Z zE~C2=r-2V&=V2IC&{2Ul;C9Xk$i;Trtn3z{%mham&4+1E0Az{^oMnMBlFEfV!|&Yz zxVZ$SG{G^RYp|=VkUKc{9O}#pO$zp1m;Kx=FrCt87#w49JKxep!vJ6=Ua>2*oS+5w+4;KaX9Vs|2^PpHpleqj ziTVM%c#KMYtsw}(4>GwI2LdRk$@w@Q(;ZdYPPjjL&&cPszl1#a5}iy8oX&Q~Bw$eF z2?IJTkbnR+<*`)K?i0pO$82b*igQe4lZ5ditqDF`2QltY?P~`Q{0GzyeJ!PH4JgGk zgI`)$gH1e{;Qk-q)8>{qnw@`P)j27Bf{VjMg?n<6uUE28eqe7hngiQI8BZ7u4`8CAR24K8|)7p(@?vK(FB9 zAAi+`3c?f}Yqe#cRk}M?v|-K}xADi6Z0gOJqj5j|5O|WY~#C^+n7#L&l6ji^^}Wy-W~%l?_Z z3veoDUEcdUtAiiNF>gOxp32z1t^{tP*Wj-13%5J>1(b3@m~fAgE#V+KLC zrB|k!E@B2E^&O5>SW+r!lB^5`op7b;2BNaFOcftjP%J*@0|$R<6LL&x*o+%im;HSC zF?!~FkOKGk0(fugI`2&+OmZKc{0uA4$TJw+h;-%ntyfDw0L}}urT~i!_cPDe3rfMv z{-B59TAT2HD*NiVCinPXLDT^v1Cg%LAOZs^>FyGNp;Duj7NnaANRJQ{K@kZ-Nhy(- zqa+oiJ4Il0*ZuBz?!D*t-@WHQjQ=@&00nK?XvfAFMVMEl)CXYR!D z)Vy0d`@&{+bxF&?+QDL+qa9g!0MkW2w=A1%>NO5zbi6V=|26LieQ$E$q0nJC?^=Ja zT^|26l4R9x%S%CTAcD%#`5)*h>5A(O?9^uy!6*4re5o<}|D^0)Cwh8vy> zH;NUF(0N%CX$g-HV<5rN9ysMswY{GO43(&slc;qO7Y4*n_Z5eca@*fPlk;6BLJ=e% zrhR#D$r-drH>g%L4>U}>@R@SL+O`kzfWODDvTBmrb>4xz5VM8XFWE4W3UBjh{`SU= z*Uo_NyjQ2>6J*a0=^@I-+5jJm@TG&wX({c23$cvSeUdyS!Q zA7t^A;CmWUH4W2|WLArGX>R7%1zWZWNfmD^W|)StT^Kjmv>U|l*qR}rr#f#U%n&=kE{8GHvY z?7SaK*p3`L_t&Z`l}tu8(b;EG)OjwW&(xRjRSExmF%o1v+EHoeAgnzK{NT!3DT+$8 zuSj?IT0>$5;n|C#BqNvA8eI*fD93iv5w{buv!?mqO(9>g?MUPgDKv_dCJ#p=UDl0` zK1||XG)Au{IiF~E5x!1Wk(mmt$mG^a&`$ObZoIeb#@$FR+}8+;`Vq?i9=PIY?Nk!X* zPIEmO`-UIOVI_x<&|T$eqaqe@b?U);B42!y9qkP<+QqjyziYUoezPZTgb`+N-?LO` z-uFKa6DNImeP;enzrXfl8lOC^zh5VCqO+1x3=5IA<-&+VpDTy#Y%3GMG}Yz$7xN;h zu!_tdCm3lm*p#%RKgNwaX%3_q=OL;RM8CH0m>7On*hqS<)ArKE<<78Y-txMRxG*Y; z#l`O{Z<0<;5!66yK5y|v4-6HvJ5KxXWpJH8yue_y< zp3|Z3-a>06bNLQXE~*fLSVGw^2(#q*HnF>YRB1?~c6nI&b82dKnTt9_#Q4jVPgQwy zKlODjmjDro+BD?L*W~5Hyu^8S9b)6SA~mY4A<@%!yf(gRyo8(2w68Du2lo@?LFXUq zu-u;LrV6z=AE|t?%wveKRq7AaF7r#c&AB0(dj>U}SL;`~M1@Hhch+PH+}SS2S$YRrJsqcvon{0XabT3(8)KxXH0rud=csNvW6lq}*wiMVH?#=Jsr_3ka6g zi%^omkWwWo2x>uzC@2QGrYr{4K9~b2F4*u@Qb4^zb?LHM>M}{&9wo9GAW`be0v|UBa97twV zOYc{Uy=OMw*w;y-(J`?{5YO;@32OFi;N6=4poFk$Gui5yv%0|$XCmpxF)6Biha`hr z13m@ZuB&zP<-%)_9bBo>Wtdx3Z@4R?-7&Bkn<(Xi1Qa9emW+m5X<9xh5u@Vc8K{z# zDF+>?h8ur?WynslCUd8h@qu0UOJ75dBiLohdFB-<$E9eC$=WCO>)G>i%Fkgrq$9%7 z;aOS8EF!rv*WS_2AmK8f39ODiGaebQ?hNFg;vg#*LaEr5V(;q=YLiOQ(u+QtkB%!K zRqZ0zl5_8gj?vA#D-5!AwtKU5MC|5miY>KA0E1t=l!qX&}UOapeAZ3X5c%-OacdHr5Sdj{exZ zwg5rhN{zus{n^r{&^fL`in(I5FI977a6ozgA}CL50g^_(|6;Rn>#3v0w}JC_2-#+8 z&n}Cel`Bs3J*FiU6@cZxVz#+Y={rGUJsE(ZdXfAzFUd&>CoVLBsZ8ayeb-ff9cNHg zw+zo~XY5x$ncMUTM$fV2Cbap*;nhV1lnf$<=&$ImWS-^aTLcODX#4MpV?gis#g-l& zBTBQMmP1sXl1_Hrn?@^QPT*$R3AfRuPI2cq&MF)ZWs=Ag;_T}GY2Ne>_zlvT|<0I;^e1+`G zYth-)uJKDCu$DU2Hj28Xun|C#E&Fn&AN`nrpWlI>F6sIjP%oqKA$-K%VA>8i>&g)B zLhXN}b)?}hTb(21pum4XkkFs7Qmf?;g=x@&N=SgC$hV`|!s~<+BUFmx6I7;;jw-T0 z9&Q#+V9MiS;m*jTEM5T~iOmMvx)|P1yd~)_)^~5=2S`_OnYjI=MCCA;?pCcJlrlPr9yl=pcEZGN&r!0XKt0qxSKN;$Ci5DMdsUM>pg;0{P5`gW@k^m$%@F7@o@ z;PeBRTF#yIsj1Vq?lV3h!Rjls&5h8$ISZysjgCZwvF~M$?l*!A^B|V;*cS zOFikA$(dJ4695su=i{hyKw0J9+06?JNR~{sWe^&e^#Gvy$3gQ3gg>JR<0YpaqVDUhX#!!q>gOX^pVa zPE6m!OdpsUYzcwvTJIYg`_<0^6#p!<6bUKQP?9!-B>VhGDy(LltrQ7SmVP+YEZ~E+ zvEGqgEGdn^Rp34l#Mgx^Zlfp?NeehqI`j(R5robFZDnomzPbO}ji`7Ju$9R*Ap>js z#%eNmdxNIgh)bj~q~rRK(5UyXHWCmEBZv-3AH_dcz{YFHNfwp9ee+_via6D{L(@wk z6x1uAD_<`gXS^A3@dxVf@JYoGI(6fVO$!b7dAiozM<49%u+OkJ>;0pBrswu{S1-?g zCJh=opqoP)=tqqwx!AV;e9deWv2`FlClZ$+%mM$7=G2n@2^kuA>q2#eMKiIZ-B@l) zVyV1S!wBEzeZ|WQKW<335ylIO?$ch3*ah3Br=&7Th|*o7C^*I3310!GWyO+7W(ZWvSnSe=k{T!6014OA^I6L-b1Cr6}``lPJ zTbSfDI?S>#8<r*MLw#B`D(U`|rZFK!vVJY7mhn{+tqz#gTrv;tG@~rk}Np_d+bFwI>vd?fvs*CcG zfv!8MM>Si}!n330NtHn(WLu*9sa#E21o_u^RiX?>-&-4ouo*Es(z(R<*kUdXimQ2;0F zT~>J?*_;4I5LorTz^slhH=BDRK%o6yf-F7mOG4rnwdEu-JlVk^Z~+uIN@5EOsF4N! ztD>(>M8#d7E?<}q-qb?mg|~ZJ&4^R!)0tHk}+n;xJO+x#5=3eG2H_KCx@~*soP*MRH1kM7OXq=T_A% zdc_@z&R4YKzyoWj+z0KH{|3LyTvF7=fgQ9@lpKbEQjM{BR&P&3kyhCLi0ii1QqSvC zbw<}wTc?{QpRRK7vPr|>9mJmxS{Ym;GDPf;(jiRhh_-IAv93<<<)1Czc+o$Z`O`0M zHdA~D_8@mau8H6zS4UWmkQ^mrl1|F-G+y6ctwyV|sG+?LG!?f*1#ni;+>>{#NWmI_ zk=&kktpDHj#Go?hA4TCmm_RqlM@xY8x4sm)lf)Ql1Bdnj+P83G?v>EkYRCT84wm_s zDSL)_+8yE^vyYNX?ZB2L^lExdwfsEnO``j(U2;@DsKZ&Qlt0O4Q1_IoSb%d#LIOT} zD|eI=b`4(J7E3p$;m=xC^C{D7(6mr^GvaD8xy+8f#KClU;EcSgt~wvFKkIorzD*)V zfo5?bI;g$8V>}*&5z5U{ehUjn%wacW*DCu1w6TmOrWJW@%#kTibjNB^9zN+7)%^rp z#v2t3&w`Z5-9vD`j%7(e!teny{?bp1&#{_nh*JD^(Q0pXM7OCefrUlgfv6S8)@t+X z^2b5dV#Mp2xX(F^{)~Qp>@Zm`nSklw&R$gu{AbXPkpBUmLz=j_Ed1lt3P~ioOc;qw zio2Vy%fvkm7Ss3HlgQJifiKPv4Sr)A2uHMouFUQ|y*B2tD79h?Sl6mKj8!?a?n=+o zYi;LhB-aZVKTUzJ0`;-W0;*IECV6c>b6`7B|A@ny!@U{5ur(Eh?I6ZUk8BMu--KhC z(Puyl<5Qz3YzWwy6}lffwusA^#hgHj9W|>>Q-qs!sA@aL7c@A}%)k2i&N2!6B2Bp& z*-Rz9rvkmXN8$e5xwT;NORyq#+Go)fq|vTiyoSJ+TTEL*xqO$9+xwF{-0^N%20ItZg55byWp5Dh`2_;S-!E-0SY zyt9O>ZkR;^6J9J;c{UBEhlT{v60SK?kM^-ycZ#IKMxvV}0sVKmS88_y?VDxF4zQAVqgEuB#m z>=;1wWj=TxB3$1qu|8ZC|M!3?r3dHUFT`(caK3n`TDB*`IB{@FsfQX8z^3MS!Y_`K z{-(3L4S>YnDuiF20jj5+S&%CJq?%;(W^AmrZRG7a92}_2OAH%>0{1s%!G=2k-uKmi zKLDGih$!qx(Kv>#0zFZkKN*e}kxO?>CO$sB24@Z;2*I++`0XI(OfCc`?l&VgCscp- zZZjVfWP6Vz5b~^v)_;UP;gzK_vZbE;t0Vm-u64^?ELY}VU%IwEPea5%j_Azb23aXF z)2@v+9hBTN(9=4vl_SyZq<YD_~nyZFbFfp73nlORbp>l7EkhgOAZmh zvEn71-?Lu}|Byj#vg4DxUs%JM5gWibM(|?Io2!fxLI9Lt#>IyP@40+gTXb$AZyg7r zTinA=La2~_F=cuSFKQ@aP<-4?$-5e;2*JhiHin^eJnj|jYzapT)U-~I zhP7luL~8n@Lh{*jpZqiQy0Gi-xVF^F2*x!ap?&*>PVVC2TSw8g9vq9hGjZvuqHw|t zev1a_Lr}!GM7u=BoYL`W!-u#hR>mXPpB?$Q{2}p9Pb7sbC41ato{IdYM^y&A%z<;V zy4E@O&)xVt%b0`MOfFTYe%B?beCE>t(5M~a7)JEct?SaqqIws=2%s^Mr#BjflwIDu zU8bTy+14$ckzJd>QOVRYu2~m-oK!S@{2YY_`t*Wy-gwKHI2~(@s3y-81B+ z)?D1&AY6(9f5lUzCq+*F`YVd8TF~|A+gtvv-*3uU-~8qQRUZ8I8#GM* zZYF4nTiyjvKhfGDpAC3%FN&4&`VajVu_@fIJ<*Xv?7Fqi0y|tqCMCGChUnfn{m8x` zEFt$FVpCS@559u>vE;(WXA6SC#587}25`+6&J>DQD7oORdjeyV19g8phGJ3zQ_K)5 zF^d$Ov@i%h=sgSjj6-6DJ<(0^l;US1`w$kR$~t3HFi#il{`)a7+&YU*pTrVzV_8Qy zH6&T)oc%)?k6CdN8b1Hd`H4(mu*hOsS9phCe322{?d$~!P$H7ZQ?8HFo5dZUqERo0 z#{ofq{}>;Jb~O>Y5Pt0r&&SkX`8Kt&@cL-SKrr3-lK5z51|2OI`ivu{G>();{ffrqsGHaTrQRr;YWqTFTVgrWA@@YIumLPMFkMPLFY!+Z!-bxU+2 z)(;rVjFon1Zr!K4CcPn_z@W>57_c_hLZZV}03L(^tv(h1$=f-3VW!fTU=-mdV>3I& z3tG!MI-o~*eJldBAshFKw|5%61peN@g%~glEW}j%0nG9ZEyVIQm%_EeU%-25+YKno zo~7P2d4@0PsT-GtCxH$_Pxhh$=eIc^Z5##Zx4II)MUsyp}iY;_@u?EBnu^|LcECUL?qwA1* zTSw0rH~vuoM*F;6kJ3`}RO{Gp62J?o?==DhHuFJMS(;LlyRYMTO_@n(uC?R8u_E&f&~zxiI(U+##+6k4%H^=5>H|bK4OUd$w}yPpNrxh1u-0 zhyP+8`VIJbKydPp4ye~xVfsUCFD+qqa~ur9BkGcNUFnq7J+0d9Yg-GQfpcs@ONqY$ zeINo@uiaV&%3_>eT<|WK7V1=wYre^&iIt+JM2&xgX7i(gi<$VwFD?%)pdY(P?N+=3 zoB?+qfy3_ogZWMI1e_!u9%9)6)2}R8SxGfSC$}gW+$}Me*@xM`JR%Z`KV*6kW`r@(=x*8|f?@PQGrUTKUL`Q4Zy%A|$=|cCHT~ z`HJF9v*PiowL&XGF6{7U5`#PHZq{Q5g@TCErU~giV8^3)YbK>7EdJHivQ|2AXSnKU zt25Coa0(dL;0Ygtyb{~=7vvc@2VhO0Y~m4*6JZOwJMS0ILC$rRXDCId6=1u#@%v_M z=;qvFIlxl=Zj@SHU0!Rg^5mBx^qu;seRiJPsP{gYX~Dp7JzrX1Adp3JJ4pCY?cI*s zjS{<_ko)z^1@|ufb2$wm0I0B)lKw34zah@9q_mxLwWo~*UtQ((ObSJqOF6Y1@q2;Pg4J(~P;*v(D2?lGR`mhoWULgo8 z(Tb4I1C0i+p}O(f(}wEhp@LDU!=7zO$eC;^K>?l9-F5D8%QOW;@M+D*-@WW=p#vH& zeOu_X>u*;hyQ-H3e=p7ED!9~Gg~DgxeHVm5HpF*^_#|9)O#fct;C1k?yF~iGz?o3+ z6Tb(0Z_&slh`&f488B(TZ_^e1=lEctCGt@FvHvdss2LlQ^Dc!}*a%9PN=^`i+xV>F zJzTfdUHs6F!#jl%^AHS0H^7R8#;GQ-2>d4?XA&KD&Mf8vIn1{zr!Y zJ|XhDY^;=7$t61B)PyU_(*if)@1QciuSG@fg~Vk6>mri^aP}7fzEJ^~j~oD?lrG_p zeCEd!Bmx+6PnyVmlXb+1r$ClE{S9)dRiWTBz~d<1Easb zOAmjc`l(QT&y){4RiZ;5o;Oj8ZTjYgYe&)$5ONensc|;S0NlL~OqY1vwR9@z(Dxh| z<$VKIY8XJP2;+1n2CR?!4&ycMLgmc-p;`_@pUj5+R(|+Yp6<|dMZVq;F%f$yJ0^!|X>Kr<%u&;LD%Y9pGU46FS8pKsNPJX&4_-4K$azE3Ppnw!D7(g3L}3P&%e z4FZc%?ppA8peuUr+=NrUrmfwp+g|F`i>2bu&-BprnD81ptN;wDp=>&0-KT(+X#;MV zCJ+jz(9Z0Z1Ipho`cqY{1Cd_o^fYkOB zX(KM02T%-np;3{s2R;Y=N%5)by|1;Pc@%>G%<^0ryj2U#XzSyE5n)rdnb$9)4$z>| ze9?(b@z1W}QOCQ{V52;d9AiuHfP;;BV3VMM_W_*;Dp)qh-9AMjZ5eL zf~za)Jq1zqI$-htVptJ25`2Do{gd-sG_9lVZVQ4}PYQ2rB)9Z}82iv2ou~7POLZ$b zo=NJc{%fk0%cTTVL_M)iI3zPd(tfMVO8XzU^EVPiObs!dEI$67tZ15LUn5 zaD0~|02@V7n1eTw{nXYlxa{q+vCA{Ho z*-Owh(28<{X2Nz0*w-D3$lkAZdA)<5=wUO<>(3=ic@*d4kvy9J6g1lid4cyI1=%43 z#n6HQh-cYIw|HQ!w0-o-6&$S!u?w9OIyP)Ynd+ft7vUO?vnG7n<40rg`N8n|+#*I* zkNrh6OUf)VtPN&SC|8BCng#l<57FDufDk{R`mJ$Vpw1>_(*Z&4dB)uv7dyC14HI}@Fzy@ zXo!Jwf3`t8e~oUHWWH0~{2_h*)cv{f;s%_zPD;w}?M(Bi7Nus{?gh?=e#`I8uLeI| zwEuKVchFH#6F*U5P^96trMaN>DvT#giVr*YSAfUVO@&3A1KsmsYxB6@K5i{&j!M%4 zi+$P^#-eA~hFQG0EH;#VkB<7b!AAd!e>=Ppc2+H)5$j^+2zeD)X}DK?^>XeO^95{$ z>r_MYNp*OwM{ZqY1m1jE7ug*wS-On&cOr=xW=r%g9z*nZ4@v3^+)r)-1SSOw4AIVrt2Ms-rsW(^8P2-U=~05WC~3v^ z^_sc(3x`}e(avFAL#i4AZVI))w>8X})$AR;fxO!ao_`vCXp;|-v{sE_5ky-U~VlHdvL~oDi0<6jD{#4OEQbHcCpr;nb@f!11*B+e;TPQrdC0-w^<(NMz%pCa-9*|b5GF}s}j z&I|)>T1tlor={d!THnO~)2)I(yGKNLBw5O)Z<4LZdJHXqdZ(<0E3or{^pyC!%sfTp z;KjUKiw7RXs;2Vc#1ts?p>!O@eE=t!Zv18X+GIEv4O< qN={V&cUka1{`CL-2OFZ$bMm$vSp!8i)yEgWe;O*f%AXW1!~Pe08^>P& literal 0 HcmV?d00001 diff --git a/assets/images/prebid-mobile/modules/rendering/In-App-Bidding-Integration.png b/assets/images/prebid-mobile/modules/rendering/In-App-Bidding-Integration.png index 2d26274537804eda3eab4b9e04b996e91e4e8967..0ab039fba0b636417fc359a674fb473361b0a252 100644 GIT binary patch literal 121956 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

    o1}4`?t(@-=5LQWqYfKj&g$ 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 z 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 *}~3O#gR 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 literal 124636 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

    1xat2guc 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

    O}$;V@da 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 b@a0I5tC=Rc3c7m${JAZwax3SC;luwAKiiHb diff --git a/assets/images/prebid-mobile/modules/rendering/order-gam-li-create.png b/assets/images/prebid-mobile/modules/rendering/order-gam-li-create.png deleted file mode 100644 index b55a8e45819f983a32718942f9c88e44b3fe3052..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81051 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%0D+!QF>8v@58sEN=L0*vo4PYMT?K?5U2Xj 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 diff --git a/assets/images/prebid-mobile/modules/rendering/order-gam-li-targeting.png b/assets/images/prebid-mobile/modules/rendering/order-gam-li-targeting.png deleted file mode 100644 index 2d4ee2d41db1b03d536ddcaac890162804e8c9be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64286 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%0A>^cnVDQc}_F*I;Fw|5{Bqn53Gl4B54 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 UiqpJ~gH^U2HL^4;`wbiZUvf2Wb^rhX literal 99293 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�V!9ZMH7V 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 HKZZ;t8mbC3T1o5^kfMTb~j7 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

  • TJQpE+6{qi>0B$kOjOTI+B=F8t2vfEIMV&^+Z?`{&6gAq?MVMdBa4SOCV%o* z!A99+nq$UGLwBY>2T$&!!i2^_0Yb>=1v@^$4hPV_iELh0mXl@%XcQ)De7O4LxL3>=Se58q6n>4Tpz0bmfvs?m2`#r4l$j>Qo-SCRIiP5bA=^UH*K zx6)@{Wm(G*7z!2QuE*Moq0C4#v*G;qH=!c{1{mGZ{zZpL_9HJVsI^{Gh@`)#6o0*c z?qx!Lw<*Kv_?ai{dP2XXB-D<2(^O8TeNfUj&8}(+c_k`Ca`Niw14!IX~Lw7>C-xp#3)LaK*)#J9u zW#(Cx`mPp&AY1vNy}doZE@DWP_jyE+`IX{@UjmM7#>y=n9Wl+m)Zk$Aq|f7VBo`xj z(#UIj&Uu>+s_i_mcvDJBd@4rSKSM78zO4g=WMZtL7GwRF&Bh{#v9Fgq z33WxP2@}0{hq3CE@uhpsL$-M+(mYtF7AyS z^^*NfDIUet@zo(Sr27_QwdY8x7z|qmM zb(Fy^dd<>MClVU#sDigU7K3 zuNeZuP{z+c7{3Ol*Fi^u`{-Fz>ovUEtKLCvI~W;b?Yj1DV6i46AStOH(C4x5yM$U{ zKTZrfP4XuJhU?(aT3E@;%^m+cn>kuqH78iYvP=TA{ z+_yiMVCz;#ftWW!jw$H#os zLYd)MgD_OgOO zhB|rjK~!*14Y((lUr4bk&K;BRob8+=x(HEkQDm$8HC_Dd}} zby(3d_{JGg`wml|v8fREyY)*`!G6idg*37jv#3C+=Uy_lb?{>L(S#XYgVQJH zUJc^Kbf&=|KB|!T`0+DQ%R6UYE4;d`)*L1grWk9rcj}3~;eHmBaKD92K@s1j)<~A zBdun8wLY4aA8h?PxXYSIiq!kX)>4zF6c{Q^_wLX2M)=OOopidIx%#ex z3vzLsc@hbuL1b<45?cLpul9P5PelyHj?Lf=XT9w&kIp6Lg^zpTYZ=cyr2Tkc3|vmn zl$kH5{;7YQpNt%ZmsSqhSwacQN)FSN?Vs;wTsYc(^28JOscBP-AfG;=SL|K)7AwJ| z1K;RKmYwfXduGI{d}N$~F`fr+xG&Rri?$up165Tq&th=QuK5;P`Ue(#!n;3pV>j$7 ze8F!)mtYR8Dq;&))}J`>@)mKFD^a%8q{+j-Y|ZDPx;2D$!Gw>g7lGm$)Uv7`Y=E{$W_qwem`ObOXX{p4K+saa^k;VGMC3r

    $4EGqnOMK`F(0vH~=V)P(B zU=+Ctr#Cazcj(|W?R{N;*4h}Q#K=$km3Iq2>;`wvO@>U$$M-rUseylTt9BaowrxZ4 zr+z}JX@}`@ehG4AnkIT7j3(98n*mO}fR*TZKvS)notXGeLeh%?T%HaL}k7R;rtN9eA zwMO@hPw-<@_VVjfF;h)8y`q1(=;@;a<~Tq~4jn#Vf+NRB9Kea_+PLJehYR3+d3(p4J;**luNct@KZsWM@MS{_8FaD|3V76;8=iw=fs# z36&-7NaRcza^1xPmYV+0$=3Z&4?V?;eLkz{`*2RnIG-Nb?ay_F{mStjbfb(HA8mn9 z@iO+FKg4|&RV);FX68%xG!f?4UIvdol;{i_wV3rzXepV0{SKD5OOqV&yi>Bp9dJr=OkXAxT-an}h~h82 z)1orLrYa+2hoI|9c3!UW0vL^n^`&z>1#$D%DvB@(IN~`?#cGWBHYIsC2`oP35(C4x z?UtKfC8gJ~^(bnLk@qx$ZvFfE{|RRx^N>CSBMuDnwK!Y-6jN=UQBrP3Sf)Ine3H$b zpMrSwmEuQ|(#{FBe13iE5WL_>#9bgalAYDIoPLYLmI5(Ti^n+Nam9B zKe-j)G60I42_RD(UwS3U(05n2w zI)IMs@{DDdDd6&a#k1Ok@`E+mu=cxp-KF2huLrO{hRp;y{#tVL=D!Rm`w4_u0Y0cY zF8v%txlZYx6%cOZsF|r6+W3I)HtCCv1vC@>icFFScV_kZNT-`?bUeaiQ`?&6MYR4| zHP}TXc!$Ze{d`Mru!IFe%jvfFkwF2$)E7PcZF-xAuCC?SuU&o$xwq{aC(hyTY((P< z6=C74Hvfy`71&=l7)c3u?GA0O-2Kc|f)mfk7M8r^Dc$d_pq}vsP=$=j_taK;QKY*vCvR-N?=Wfq+Ccb_vdKWd;TY&y`LKs3pOt3Iv!Yh?S%Wr01L5h=-hLc`*bz z(ZJv)1hF(1Y?}mcWP>EYMZ;+*EUNCNe@+YbO`Xg!X$lfV9xw6)pE-DFHNQlsq^NVO zh5czlaqTyJD!oSE`r^w7Jl84h7_FGSJNW=#lIM`Ib73E6ZIfR*INCs1(rd9{g1{lQ z0-b8%Uq5BR)93oC;kD-n*F1U4t_VUimX_$fT5pRh`HYkp#B+X>`ixEsL(&8b2(QUU zasZhKLc!PbWC(NR&+a*trlzXO0q-CiY?feKk_{+ZfGVBqVSV8B%U^>yDKy zd770k}K{4_l{IGY!-iv`BB+Uf_(s5;``jH~~&Dcvh3 zYI^>9oMaFk9r{-DHOnP9!k%onKtcp;-h8T9Xlt$kv*(KjR~TRz`Wj3 zid*~rI0v)^kx^SXmhkwPS#ZQ%aQgv(dD>(KOXac(8m>!#3_pc7Adqd9x-K{(D9UJo zQJV}K*Y$X8c9wdc%woDh{-Tpku94-51g;Vnu|IZ8+9i8y&7Y;mNa@#{dh@<0{mm!5 zuKKtHcA{~UzkY)1gTSA3x2(>jZh=d@49heT`^M6^8J3HK&*<{3=}nCePiBo?!PiCa z`&2Ie7WUeTwwa|h%ob-U?g@t-d3 z(!5jGyh5d%ja$~Nh*SrYaH(@K*`_jKk(Z&48_cl-?)}8N3SxYX;_F|V{kXXXb-?t# zd2y?9WfvjOM5f>S=)|Z*exDlMG0f$o^X3AIz|sM7MsiHI?U~nzV4mSUEC7LCIxe@5 zAi0Dpd~OYnHX0myn8e%Fw)HM>%_{D8sQ+qCUFs`W|1B9m*^*~ydA%k`NF{Qn@Sees z&vaNuzkw<|gawcVsSq|~$a0DGRmprwGw-VpL;d&p7C3ebN{>}qj5dmDm zi@_^8B>Wp-~e#2f~^T{guKr5dz4|{U0%B6^(RI4Snmp!fM>N?5WAS-{!WIFyoiXv180GKsI_OU3CDsj( zB9r6^>(w5Ol)xe=K?JEtnMWcaYnxmb5)ae->E3XZDtKb(@B-aWvE#0_*o zFq_$}5ejd~+#_C$3{rS8Few5V9pmU?)HIEW1(S~o{I@O55;yeRodB5k&j_TVA%9y5 zneioN9MplS{rne1?V{AoC&7;P$I~119Y3pg7VJGRPnC)5EqrO90gR0JRD-;@-PSYg zgkm@)n{ecQb?5|TXw-6Dy!}h1*4l-Zf(SQMm ze#3*@G#wrEW^yo$v#!3O9h{qM5RieRL4r3%yI@hKH|x*#w30$i6rz~=na8UNHsO)k z2Xae?>qhy(CMXowqVe^$gR{fGP)pynlru%=Elj!brb!`sx_N@E^B!U?4Ox0S#ssl) zfYz@p<{;NZ1cm|EvJ)b_)L#V_Z{cj|CL(XE-f(lvYx=MYq9ymt6L(?!oS#Ko?Wv9G zSSq@3eRaP7i7%Y>@6P`Ld;U`7qX2WA9YT9s`((tv=!2gqJcq?E&eGD%gH;QD@k10& zfi?2ak8^lG$+h%ZfQ2W$gvhE4%7xCbjY4E#qs%4^s*YN$=j^herg7DhlM*vcte(DE z{xtoY(ZW~itmn}lGvSf2j7i&u8Q-LTGc6NUB@m3u&{z%4lDt}HYe>284zt2BdPJNW zXRm8ls@+@=g!he(m&+z-I()kZ?Q*yhC9@s{LCy(xpNWXkr*RJwEQbmVUc7qBlo$*uo+mft-&F@Z=4i_oy(OY`26ry{oP`clqJKd1u_LkE3seDGUi19_NxCmPLMjHzX!i zn0N-i!Z@Zze>ll!xqJ_@woZ_-9XsP*ve;t0yxs)iNjCe~h1V=9rO|#T7#2^6cM9AyOYlgUUk3U_g#U&me%g7q z(G(nX`G_oMQmuRp^QUbaLa)?SBEe1NSQcN{wWow2p8Mu3n|u5%eOKQfB+_af*V}c7 zID*b zC|faYvW_SAx}m7v+JYv=ZxBUlB5HM+9H1FQ(zcf%(+JE_raVEK*5T+iT^|ZdOaA)abIrq6W*f%!Hp2X7?u*vjg z2GTYMx~zI_H&kXzI{B-HuvG7^JAfPTw;`Xt2sR&^5e$%<8z92dTw> zwQ0i9izwuz=fv)Jx<-og?2>Ie(@18l50BQ9kVR0xU3nB-1$S@!M<*Ui-bhcA7VH=!pou2& zUF0AAlJjOay%GdrldvUe-W^3%f$>h|7LRx@*6#zyAiDihp?j|Qoc47C^MU#mducp- z4&A&8F=73FJHUPdBM0t_UGjBpGmBJUGf*y4BKaLzlesI&>C-zJ@Wu&yf5Sp^E&BLB zKO6RliG^2V>q$(!Pgj3%U4HTaJN|L*?I3_9&R`S5UW3R|{x)M|!HqyR9GIM*fgPKJq zJz0tT*0mrLdI`cQ--~Lu3m?TDU*8y_);XLSBSG z4zDT@nol5!K%*(jju6ClpP^K@ALomemhc|wkt+@e+)e)cc+O!6c0&{z6$8ku@kbsQ z*Q4YSC&0fl9+Soy{m*v|B-its?*6(l3)zy+v@cFP!-9%53~uwix|E z``_%o7G9qltK@_^yz{UQduQEiFi-BwVdfc=)Glm$OxB^1C|=oBx-}Z1ImMdUMH7Lq zjjQR?m1^WHx%#|4#RzIz9D8=rz%JuEr}HVd$2*g=fOHg0Nq|9x9EbsiUUk1c{LS(S z@lSbTOZ*RuNq8rp{UWoLbh!Z%oh~kYO;(c`>;9Fj*1esr@#A$no z@SGl;WSwPQ^S*%1SaO&4TpN7IqmVkc;Rca;$1q=rNxo>4bWVH(oYBMgAiV|Lu3Hd2 z-Z{lpJMN4^Mo(@#LC^^R`P*mUl%@*>M_P$Hzrbluf1oTNTHq1>bs4sJR$p|9u@ihw z|84C9MQf%H*hosHa_%KJ`!|1kBaQ=_$|VWB4q6_ap-yW36|6>vu7lUK2Mp~_2(_?p zxtZ!`*q^wEVTI+^>Q{;{J8@^z87A<%&*cGPTyXoaKVExPL9Mxui|qBAO9dd=4ZOOS z+I<+(MZ?4azp{Q|>AtBQ*u{x~+q5L`168zsgg&{m7Qde_^7->`cA}Gn7*WYiC&pM9c4D93sT?W9LL+ zW(wE*=@yZdqwQ`8+mM;Vo*@$DA-()x3i`+j@cQ_O^~)O@o`}AF?<~tEamL{+Fc&3$ zLZ}Cb^E|96@yENmx}2fN2;V-HHHgW5%+0+8X$qbbsUH&dOodm0dY4>+WCBFxA!`F- z$#@j!oq^PMWHh6^d*H$z*>*ugckZPL2zIA%X8jox48E8La?EuFfh@Tww&e1|pt9;<*!kJ3(N=1V(P$96Juo78=zGmsUK4z(dK z6>b=|kk>ostDdGj`8lMoc4DO=fZRhcc@PeHSU?%E?wN+%2h{-OOQBe9sU~0^L5D@1 z(*FqD?B@oFnc(c9nEpsZyxfHFTNnZ$M6kP_Q97CnX+|U0zT4+tI~oJ$3*@A4uaO1` zCsZYCa1?a(HGx{Jn#ue4f?6WRsiJ^YHcf4?eR?TdXSlun+BcSv$d$#i*e zQqBb7GFJVsoJw{D&}I+==PtH?PT5xBV_0~Ni&TE_DC>nyn-z(&J=hXu`+SwiC5UuJ z*i70>%0x~MbA6G6fWzXeyHazG0|ep`KQi%I5@E_I{&B#YA9&xv`UYzK_{R7^ZMApQ zLh<`KtEjPZt=e8=GMkiOgCikB%eW?dgHsTfqQZaX)_AFq{-K;O+-A+Ym%?BI$GoG( z$e++ZYQam@Ip2d8NP*soPhNsE#f$a%qBmH8_M8p$2ayMRmzS4SQ!hpq78SWvbGU`B zu>bB{m?&aYU`G_D5YS zUQUkR;X{d-*jaBdxR2795M?lgz|RoO0$&t?;?bm)d&sv>nbr&k9x_-b6WFc>hIYF& z`)5hPWfO4h>w$rJ0r8a0Z)YiZVhF^HJv4BB@Q_2ge^IFoBTP~`9j9_~+JcH9@?dSP z29T~~?Cfi+Dt$?^+enMy2M(;UDOKwz{KHJ!C7E-#?6drF=Cr{a!#Q#KnRupR@1~XR zU(4k|iIP1{i8Z4KEEl5>2JKF#ZIE0uF29a|Is}U{k_UJBPwJl$RmZMIJ8jR}iD35| z)qgRF9l7>WbD03Z-;onCWF&-B15^|R;Q-n`T{$cz;-}ilu-|IVlK40laL)VVKY!R_KT@p_sBn@81o)f+Or#fGp zAQq4%iE`J!5@`*TS?yvoH@s89gxRyR)s^=0O7)NHzx@#A-<0JJ)5M|ARCViT9fA2F zI9WplpSLuxmZePZ4iXql|Mk`NIq~x$KDH$?JOMeSOpW7ij#A&#-%G2k>efg0Sc4t& z3~)-cuhuwa^F98-I{@oH#G8>NgQ_x%ZeArr7j=I zUtjmWtSAX7HN}2c=@oa*&Hk8oeH4>5LL*Mdq+4*4coy-^&h9yK;P4ZY?}5aS{r)`4 zMoLPj2j3wtjD!_EcQn&Ukf%781hJ5g$IRR}m!i(i&70jH?!>GjP7G<{#=EL^Nu}!T z_QNZDzJ)JrW54ydYM-Thqt)%hgXN1wT|QXn5QlTJcWW7fgBjyb-=vKstMLq}{zC8$ zmd-;}HWHk&d)%fKih1DenpoNEat(Y${e8=nZDG=Rz90J5J65mMx@9Nc6oiZ~j*Vi6yp0nDp!m3Z(VnMFi z1Tc05&Cy9*YvAayU)(e?(7K^U;{j-YNmi-sH*^`U^Bzv_g>`%`WB@~nQQuDq!fbSIU? zQBxH$_xD>HXJr~A-TYbOR-38387`Nh*^60@DJC1Xo50CFRef|1bJm)fGQRaTYKh+c zmIB{%VrRsCew|v;15lG*e8$-SM4Y;DG!&z1nr| zeN4yTmDNz|>gHb8W^@ELWQ^4`OlkC5skHVjx!;cQIFdEpq#lS&oo#78KAYygDjj1c z?n{f!Bq`i;U&l4}J*OlzWF4=N#B_s12_@5YYdX7cjac@qs}M<>sG?;#ByH`ne1z=Y zzbphZCs-*uasWTJ{w|b1dG1Yv4J}h?7F99K%g-X);moOaL{kV*=%jkHtunWRNExI8 zkM#8$YxlAwCMA8Eo1H%8%YnEA(UN1Mr-7Z6y?{F*3 zyhySmyN0UWa&gw`zAnDn2X^mz+7q|Y?hOZ!d{XwfHT#@YY*8?-ROOz%|cswFqiqm z$6bK806%xAyn%V5)qVcSwC=mn8f{woIRH}pxi&NM$)|FF(#X zkTX9Q)(eBNgy91DF(8lv*XEIlon<~*sZ+ON;MT~Y6J_l$7Z(@r z>FW!YNi)-b)H@Aol#Nz@PY#^l(B1qChO6Wo-A|dFEBKT-ou&_{VUyS8JLQH^0k|sappFW7eM@U2k1A0o;kCr2&5piJn6tE>zaA ze0KEMk-v=cM32m`0Q?X-zl{6bOdKykI&x%}*!?cQbz{@<);j>2_)K3s=1?JP{|0#P z+uO}9VI2pZzatkZ{>yqrz0B;*tuL;ppWXD)3(obIjHsIO_%%6|th^T_I=49ajow?O zq)r{R`rlJ_MP1XfeusfSIFd8}IH2go*E!9m9j(=3ZZh|D^VP+g#U#Y5;7bo)ow-qt z!fy|9>E$wa`SiigL@>~bN=mU3LkQI{(c}TwxSlS4SbE^J?=oMK;i-H*CMm@V3^k`* z=8PhqWgdIMx`BaBBO7NkVxpU>KD2#5nRvw4O7Q-fPJOsZB;>v?A8bluBO1r)@n$7z zaa32>J`&*|4sgh~D_`t__aVl68iUf#x7VgM+hm2xXjMwZT@gYgBG_*<*O9)85HQUnxBPSW#rDt?~&06}A z5pF%&jaTQB4Ta0V2t+kF<@_WB^7O9^2Zh02h`ch>zM;2}$JQ?+D>JjPYdGi(0Q|Je z{s2wgRs}g1CH%GoxtZc&$C%2q(Agw4SZP)bmft}6bSM3+V41SBa`f9ql>NG`dPoD1 zbuJJ$QI?QF#T91vU3^a(fq_@5ICce8cle_+4LAnis(=;1y1oTPjrz0a>cn+$BkmLO#zRO|^=%}$+;q$Jhsw(;y zYoMxcTqWa<(86KDOkLRY8kHLDohvSBYYTZJi5BlI@1JOPYE3DVL8WL+YeCZ-cDK{9 z$`ji`cU)Bu`+{TfpJveWZpdrRH#t=9ULWU8i7GyICeh< zCVW^Uvcw4jx`<5#Y{|qzADKi)?WfP{I0|&9Vl0GJ|Bw*m`fwz3Il?N%F_J)X!eR6f zlk^3uRtN0ML#C_i9Kkh@4G|dQ^KKwaKZDd3-k>-*;f;xjq+*#^_v~!rYb*>y!vvCP zzE1;b=LCj9646PhnRoe~^3KBEhP%tZSFqsi-9>K;z`26!`a|ST|LR)|>^sJGcQcYv zfixy4ZJ-wkP`>x`^T4>zpAQpOAMP`3XHy$aE+16lT~07~o&yN*fSD-#)5zTCH`$M` z@wsfaV24V#QC9FIw%-;B3B5B>c+08xgqRkfOCJMcV=gC!1S70A>>9!Yp4qJWsPl+e zh<)#V$v|#y9-ckNE{hTHHFyEVH7ao*Kkq*iu#>n)zDty>{s=@fV6Rjq0!kOSQh_Xe zl1u9w?F3|Si*skx+cHIV(iI%jAe?wB7BXrohMtyofi^;Y)t?z?uS_?#KAWkzd14|`RmF5+ZGwOI-+bU3R{?A&Fb>7nWA)t*>Ier3 zirO|yORW>WQqN0?%S@fm=?L6eudXiwhVqTA{vDMMV~bR2r*oVgIt9}<#7oS#Zmk*X zJR^e@1<3uUv*5E3nqB<8j*4X169YY9<(LABa17{iYi!%VI6}ez)(5aPmZS`rV?_u) zg;2o5VP<_yskBc&2JYuGR#y8hEfWBmO#>|#(pm*AD&{(O8DL_NRQjy9^L+X!e1F}@ zKsl_Tp;2t@_d_vXsnYBd?|{(uuAz}x=2`)+2d|G1dJ@l0!QqU#PQgg*O=O%u zsZ={8>)&Ct_LjNMg1lY7?_)>jrvx(|MwZk6Lwqd%a>AGY{0lgO>+86FXMk7`>_v=W zTuNk-$BokFb-!!Q{LO9hhpU#hPLpyN4X)+=MCxq(yC}f$T8`ltZ~;AO*>-htEOse-Ih{uJ_`zaWgzV@Br*jxo<~Y7R!E_ zdI7d8w6$oB;jxW0Fpy%85XPia!`KB2vn9al_&*+S?0kukXR=!iFN2QC>3vSG7YLL% zGhtl7fljMww9Pq72&9B@&IAH>eTLD~6QrkJ1t(c&b~iQ;13FFKJ^un?7iclirm!IF)4P@(&MjAVtny~d zy_61m3_?B*5V76X^o*z#w#6W)Pw zaNwl+aZpJC!mTv0qcEp}Un&ZD_i%0R4I}{w9tJ@eA&`2mj8v~cK~wz%WpQ)~L}O72 z9kP=yib7G-QH$xWgjVbis~2!pWV-$kebrR4rGWQPJzavp3FMmTtuN(Pli4sQ`LM2{BER8+V7p@$LH+WwG|g=S))rX?r${%!FUV3X>Y7HQ+zOw?K?@k zq9N!?;)K(TM)?aQ`$6Y2x`k;qz>=dJrv-jV@mu_Gv0 zBvwCGBDMvTEPDZF3jcG`S8E&tU*9>W#yz~k@oWA{83vC31isl?Wq1;k$Y6RCr0*p* zIS5IFXv8Fk>UCR!l|o2n0N@~WH-UtB16)X7x?aK7;(#=>vPCo#e+m&Co1d9C|A~R9 znxE3In;)4s3_OUOLPS8h!68M1Kglza4@)Et%2xo&gK-vuUumj0+3@Vy=Yrh?JM=&V zYIry1IX7;wT)OfJ^z53d@*CNv$~qc06pp}pr6>5FH%xRt3TjwJI~SrAEa@N@VwP92 z0sRj+a#Y$_Jc3F6ba~t3^!R+}dW7|f+XP7xM9R_+q=1XAH~ebPfpC)-Ch(iU)EJaQD?50f84U+1*=R3 zTw?BIY*y{1aC`y(24lJd5dk6OoH)=e^eLS3@T)*}KR_IX`?OC}QQ{xGkF8+*e5q|e{(K1K;tLBkLrzj^cA1+$ z{@U1Rp4uQt1LCjdo%0Av2HWB$;gwiC$N;rM1(mNLK8kzT!M9?);;vY0ymJ>BJ0$KY zy8gDKTZ!0SPIQ@X&+KWQoG)(dre-Kp3_RY{K5U7a_b0y}e*I=I_mPZlRJf3N&QhZT zZDjd+#nrzrUquHIU;7&YG^VALQ{%&B+pJsOITQXfdPqJN-dO3@sfg<8FHzAC5vJHOmH=U>czmvdJ5Zs{Iiov1k||42 z&bB29s_L`&c;5~_03ss(PqfWu>OZ_xK)$UWeoLqgkG(q>G8q#jnxhqQTr5@LL)ZBQ zI(85?j)kJ8PS=#551bkFp7ji0c?C>J+pZ$*`YRc*MHH?YGG6|jw0{;id zQC}$idaDsLKhp`SjTguakb1jB#~!N&E&(VEQ~kE?iG&g3uU)_4gFC)LZH6ij)J{Cx zoG%-_bo17&2B%KN;*q1+ZG>kGYZ+5l+SsyXqF3$qCB4F#%97xt)SHIPRIW*vOr})+ zlP?==fb@J$Vo0LvwJ1R*FiOYSd{03T+cZcu!#;;* z&3a-Nr-crEOWVL2%6BBS9eHgNj+!otCiVquWd2@6(XlEI133$%9I0ssVG}5b<%|F^ zjfAzXWtFk!emeE05lpY!Xkyh&{JY-e7;4pcGB5U%SgC$<_1d-1fJ7Tqk%!s+*G+dC zv-)2Ed=L9C%4|MIL_ELl)%h$hPkcwAUvKDQn7a6$lKbg@(cQ=|$@Q-x8~o4fo{UEP z7oc89AUj6Oc16S1;aNgrz_$TmHj(;surNq}7OA-Fy(vPKq z1$i41{`B(3Nx_8_Y6s}y$3{n=CFkhR&N6@aH83*i>$Q}|%^QrePA-*aD~pTw>0Nw% z{=7qQWRO5miP@;=pJCD=+4UZx?>k3I>S_f-6ZbGPf4H_%Kyv%`?T&rXeBl)q9UVVQ z&-{&wpS4}J2nOH^vxDZ3)33g_&Nx)Nx!Drcy$r@(EKMXjewbOiT**eYvD?{ff7-{f z2!12_0rc{Gy2~fjUQF@aWnmG|$WRRzMTs)DTf4a|93H&!vF-8zM>;nzZ*Y-x+WlIO z#^;`%o?%4;y}gE}ra7pnB@>(CaU8_7t&pj77mAl~s!J(0f_wU=7 zo0;XSMAHIwgz?>G0RatTq`b^Rdk3y>gF~ZA?vUxRfO@d+~9&IOVE3eiYs2|NpqQ=+VnbHR~SopTW^|` zlz+R;LOk&Pecp~AKTgx>>Lw6{ixCX{7!kzY90NrY&W2~nS%&iD=RBYvAJQ*tNftKPJ^Nn1CVg`^4GqTVt3|0LE&uxp8YZ3OD#i>nz5ewpHE}G2!Oq z1pYRn?ittBtD2!90p;c8PulWJ3=#zLpzD**mJl%)aM;D=@`drFtv_BiHSw-l8*k|E z3x@hN6%miWm8=Ibg@}Gs$hNnvXg#i6K|&p@#e*6E3HnaH$`&t;WE=|fk7tX9^!16Y z@vRu<V?)a%Z!gct}*w*pIX%>X@=fgZINm$o#$dUIyUw+C#Myb1>*|5gC0}c*xA^gY_kc- zPD$YxpWd4v7>Nzj*B4OKCHrT#gau%?<@&5sRgVb@itS6;F;nv30o|o|0_&Qa(~gH2 zOSsez5bv#U+WYrA#>U65D$A*;wRXKK+zp&NtbD@TY|Qu^g+?MBVO1_J$h@^QH{YV9 zREE##UYSd)8X4%nSJ^53Z@q~lgwQ&tUqrVA3_Sl_Qaz}MaV1-sC40gptEa!0=flc> z+PId{#*U#&KQ3MyH!3cxkj+T42PtuI=sK4>Zdn+1a?ytg8?}zn?Ck8u*3KVhWj4_> z?v5S4SGT#HsQ>dM{wUqK>h%=$uS+)sRF-^{%!msvE-hzcr7v2%7?1ap03HGtgO%Dl zOy|bz@9L4Y1`WCDT~c~M>D?EonAD`CDu@0JoYV}l+tH%P(zFu60^1xt>Q-eHplB+PQR+ zD)&B8xlcYqDZ~n33k(VpaPV^SSWz>&)*!(7StVy!kF=%-^~Ohj8wAE~OROOurLuXk z=Bjh8)!sRciW6w-fsbZOX9c#r;~FPsd##D;vd!;Vc-n-Y2s21cUnhF%=C`IQj4`-X0 zF)uD+C!}x2e+{%~EBkCFy#2${Fuz5sW*n-_qzLvOR}Eribbf!4m!2VWo}N$NWUI!% z8>Hv;59vIO@g6j{7GwRG!Xz9EG7O*bvhuXz^1e;vwy?q9p*-{l;1w21i>d4kYE=3A z*V@H8!UksBC9j6aE;G%m$n#^>Il(;3%-SCs6?N9}DY?yq1p(Sc5priE#6tXh#`}8* zq%)53ci?2z$R5zQvy*C`bX8?%^NF^;csQime1Y#EG>u+;o5K7yjcfn(F@S=Bq$@Ni zu=dy2hkkj$Mh*Yr(>$wuh$&;io1@2*Q_b1^=n5ZD%7n*+5q;!efYtS0 z6;4E-@!o-f6p)|pk}Uc;1D}YLv__~y4=Ybvj19CN7neM*8%_BZhZh9tro~({N^(xu3}tLZ zt-mn9DJbN#hwWWqO>N^T$8`15t1IMCHY8S?+YnnF>I0jrtz6{2NDZpz(~|y+*JhOS z9exzAj3x0Q_+GEmnZhWF_xnkQ>thBf>{Me^z`5$GM*SB3NjD`kv(h)({oD((IWc5* z>8qCg&<$KGW<+;PC--}>K=N_qYJJYva|~D%CI-PA%=0?9nh5?f?sd$}%sss;&N|xu zedM;pGO7<|Gg0KF+6d0pO*yDgf zY6DwRa8T6xVIxb+`naXtE|)J0SZMn!mdZWYHZr*>MD|vJnN&Ao#Bv#Cq%XNkuz)!7 z?~hdKUuu=M%n+&b5DU28y|7jzdxKr(h4H>0r+xZSFFPX@Me^@sIMnn8GVM z=emfpyxn>4@#Olh8qNNsvd7UWi*hC>YgheJf`D^#b332O5h;E*Jp5@*&4E~LhQ8{D zMML!r4hU;9|DDi0(3+v6!&JnC2)Q!bZRwdABGZhbzmda zkXc#=EF8HkK~YibU$(d^Lp2xKJz`21M3Zk?RQPcQD_{QnI4D7Q{FNTeg#8*f^75D% zbI3;zgR<-6eo{eE@AyGn75&cf-(j23!%^5mZVeXH1Icxe(tdcVWT~+Gt-xn10ecxnm zX~|=v7;qj9J%91OUq({6>^A*{3v2htEE5gKCLs&FhwTo=!eTFdFBEw!u`|0io&;&n zUW-b(3`epgb2&-FzZC7cQ*5K>N|l9KAtaQ_aW0x&N0{h@dQpdMgBR$fmc(_}j+jTu z=~@Jd3XQQr-%9NDgM}dQ8eEJO5enYXtHOpqIy(73X}h4OcLyWMWg^E|^L}Ipy~xZw z8YRG+CK@4Y5Wku|n~6i$X~Ouz#S6QeE#x9)p$XR}eYOwZfernswKW-Ix1X7n2FGAc zQn>UcZYO2~U3d4KuTkq+2W+Ln%__?3{J5n3BuL%}g^HpBxhx1Kf4UHVdDm@M<5WI_ z=3I}X2}=6b^xX9hF~kt*__;+y$Y6~a|xD(VY^lb=K{R}2KV&XNrEaWjzRCxnF<;bl4mvB_W`Wgklq?5`FJH+}|=WT>MHy;%8m^N&UghlER86rZV(&Ts?{G}#b_ z=>?~l_0`P{B>_P}&mm@I9xqmf(OUPb@A}s#s%x=H-!<`8pn_x9Fk|i0@}5VkM--Qq z1{a*XThvbbt&pG>6Qb}Tsp&p%Y}sPAQ$1VKz7=VVaJO zO+3wU@7uT=`|SLy)O$gZv3RSC7Ucwd0*ZRk2i*PQ2VbsUtyAw9BE(P&Y1imXTGH^* z2I&iI7`?yW=m9upxlB~4ZNFVr$0k-3_uH4Xj~Dk3oyM?c>tEjc+cg`Jw4f3}n14FA zc8BOs?>DnFuU2BZehQ!Xcqd38TJ$a~3NGoTaGIKrijt;N0wEBzG%5yilD)k0R;t-f zjk>PUi8<#u39}`yeWTyaNLb%fXGR2r&kGwjCPxPq@7>JhJgc39DKu?SmMs@Ogm zN4U;$m1s;kMt8ceVgJ=mVVXjNvCk^Tt4g4WX`O-|(9@#`J?pOg0M>1U!YSY3 z;nO$SDOz`S{Mo9ermat+V@}BR&Wuz_Pk}TSS3BvS1F&`H$3~0$$NhRH4_ik=3WN0O zw(1&+IyboMYoFFeLB%juV^#BSd_Fl+=BLU|?p0q3=@6ujB#x=+W^Oxw*PlKzj@Qnd zIN^!ffPUoe2rgdUgO-M&E-sp{)9BQltmL+^BN!UmqlAP#Dk@n$>pOiy9ozBVvBS)A>(;GhT?UNAG){6T z|Imw46iTj4XlbdIFSsKtBC^LhU7@t3d{vQKn0VdGE1A~pKjlq$T2}8d;-$nZQu z)m4F@hNO=lp(ih(=&V8%9K01msW=!J))AfQ)W%Enn-QvR8G=uXIu2M^gh1USmCCdX zaQyf5_SZSTUNyzWSU0`}NF)o4YcKNOx>e~YRxZgt(c&PVvyVDtW%U$#D5(R6i=prP zYDnx1qf^@9jaiRj(m7kwcD6TUOw>pg|S z^n|u+$3c?%z-A#8E>m%)E?nAVi@3Nf3HoCQxRHfHO+q_*f0P7896BiGUqlitJXTB6 zN=quLs|EHrqO{9adHH%$VGUOh3^b3Gs8oba^E@w)t7l+yWc_7;4Pj$Kvm)*vw@RTg16 zkeh`S;HdcL3XmeS3jcN){FBW{e*XXYQ;fkPLvi3=5`FlWm;4%;Up)P)@|AR!mj^l_ zkyx#Fqw=J<~yMU|2gmy{HjlshOXqbMn!v%&%H)m@_)YJtgV@q Yh4X)W!-if*#;T<4*4y=BC*AA60lLX9UjP6A diff --git a/assets/images/prebid-mobile/prebid-in-app-bidding-overview-prebid-original.png b/assets/images/prebid-mobile/prebid-in-app-bidding-overview-prebid-original.png index f758bf36cd4d6a462310a7efbd75d3a3866692fd..8480652e588e5ba16a9b0adab6388589748e32bb 100644 GIT binary patch literal 129733 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

    {g^w8%NKv`K4PAqNZ#b)6e}N)2 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 K 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⪚L*?JRe?zX!}V~~lZ zWqW7kCfmRBH3#!$Gm>1#7|*#%eBy+O;#&%(k2d;L1= zH-6Xx%zfrJ^VNYJ4*03hO#Vm&I~%!3OZLeBwV0g+?+|CR2Vw~%hyoc&LbG7GqEmVK zrk1>dTw4V9I|GABW&A`s1O0*DX)?;W4B>Y&fnkGjx(-vG>2NzrN-99Ah$bvdy_$^5V%!K8DhnVPMo7l~tmWbrOCfPWv9_JIjjRxVIi*8u-??e;~`J|^ku zH|3R-oz*FAF$9`u>xtRkgMCo${Lo>QC_pD-e+D+8-D{SbQQ!Z^u1#NOjEc*0C5+ZWjLm;&PD_|Zl&v)aGzikTga1TS)+SbM} zKgCl%M|e|CvAh1Y;7t$;TlUtk^$o?8^jbGd4W3~ANKf^>BrNMnMwX~e;8Uz0doWva9m1d0`&4TdmWw3)P5=WDE zA5@=bW#@ZNf{!P7x?hteA*oZ>&``basFiI|9zQb#hqAN&_4oQ4SGTx;O)jZszNfEX zqO-mI@tq*0e0BS8%+Sn~82@0@u!3X)PG?tdXY#7U@O9B4%a+?9ld|q*_W2$FYN0(3 z7ss9s8RuG?b#Zr!O3$UwDbce>O~Yt^ZF$6Ae;Ib^{M5_K5i7lh=1M2qv)eD3UL_Rz zR%0(0ljyr8#wE4My#!FS>-x%-t)1|}Bg>_l1LI#`RW6q!-F-%u$os%UEiJ=R3)>F& zjZn#Nb$eCri@$8fmz;((F$=MM^J|~VN^W+z_GR7_XGVLgYKPQ2fkdGr*`!--c+p-& z?n>mX#pQ2f{&iy&Jp?0EJ@%UJ8rhHS3mYx=VzNSr%TAyO=iD0-!b7lW)wHyY3Qa4f zW4``@B^V?2t*N+wV1%l}UK2`>bKdrt46JrfsHnb~N^XYEuA5pYC*ytuj9z1F^CDM0=xPoP;ZZ_)+ja$JNc z`}56>nadqhGm6bZQ7r`zs9g-Gs}6SBYu-}`#o>nY2i!CrRaL2jJzyp-d=ekISpfpr>@Jmoz?u(8Ei32iF|E$3Izv^tA4 z8^bSwMq}Pah~MdO)$4HGP*qLOnARRXRy8)nf5EGq%uQyRcJ zJ|1rIP*zoqGJI26;W}lX1cPj4WFVrA$iXdcuHbH^6bP3J6Jf;oVikEPPb@+g^$J-S zh366Ixp&0$)58=>VqpC3TDyojqsL2Wz?HVRT}QV?i;RqQ7BZ)*gDcRPnMtld-9RL# zz%;5t_P~fRAN7d>wcMqN__$IQw23OXjwkFejqd9_S1@eTnIDbP9zCGg3t3)0L-AzKg@vSpwF3`f1&V;VJHF(pW7Gz z;|@~$0#_pO89n|-o>E8u{~P_cIoiYE{GQytOmD{kKVY`I{=n{$uAPC9{$m69ALa_z zl`HJr-0a-^D%?Cmyn;g90&HAdLR?%uSJ*%QmoHdYJu)$L`rm&c#p;badbHei#cMfI HI^O>auC1U$ diff --git a/dev-docs/bidders/ix-server.md b/dev-docs/bidders/ix-server.md index 94ce0053f5..e5a7d21a4c 100644 --- a/dev-docs/bidders/ix-server.md +++ b/dev-docs/bidders/ix-server.md @@ -24,8 +24,6 @@ sidebarType: 1 privacy_sandbox: paapi --- - - ## Table of contents * [Table of contents](#table-of-contents) @@ -86,6 +84,7 @@ If you are hosting your own Prebid Server instance, depending on whether you are ``` * Edit the below existing entry and include your publisher ID in the `s` parameter: +{% raw %} ```javascript userSync: @@ -131,6 +130,8 @@ If you are hosting your own Prebid Server instance, depending on whether you are url: "https://ssum.casalemedia.com/usermatch?s=&gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&cb={{.RedirectURL}}" ``` +{% endraw %} + ## Publisher instructions to call Index through Prebid Server diff --git a/faq/prebid-mobile-faq.md b/faq/prebid-mobile-faq.md index 95e6a33d77..011d3e288e 100644 --- a/faq/prebid-mobile-faq.md +++ b/faq/prebid-mobile-faq.md @@ -72,7 +72,7 @@ More details available at: - [IAB OM SDK](https://iabtechlab.com/standards/open-measurement-sdk/) - [Prebid iOS OM SDK](/prebid-mobile/pbm-api/ios/pbm-targeting-ios.html#open-measurement-sdk-omsdk-api) -- [Prebid Android OM SDK](/prebid-mobile/pbm-api/android/pbm-targeting-params-android.html#open-measurement-sdk-omsdk-api) +- [Prebid Android OM SDK](/prebid-mobile/pbm-api/android/pbm-targeting-android.html#open-measurement-sdk-omsdk-api) ### Does it have external dependencies? @@ -132,7 +132,7 @@ Yes. ### 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 - + 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: diff --git a/overview/prebid-universal-creative.md b/overview/prebid-universal-creative.md index 32bffb0c79..d73c1b4e34 100644 --- a/overview/prebid-universal-creative.md +++ b/overview/prebid-universal-creative.md @@ -24,16 +24,16 @@ when a Prebid ad has won the auction. There are a number of use cases: {: .table .table-bordered .table-striped } | Use Case | PUC file | Alternate Approach | | --- | --- | --- | -| web banner: iframe | banner.js (or creative.js) | [Dynamic creatives](#alt-dyn), [Banner and Outstream Video iframes](#alt-iframes) | -| web banner: safeframe | banner.js (or creative.js) | [Dynamic creatives](#alt-dyn), [Banner Safeframes](#alt-safeframes) | -| web outstream video: iframe | video.js (or creative.js) | [Dynamic creatives](#alt-dyn), [Banner and Outstream Video iframes](#alt-iframes) | -| web outstream video: safeframe | n/a | Outstream renderers each choose where to render differently, but none writes to the safeframe. | -| AMP banner: always safeframe | amp.js (or creative.js) | n/a | +| Web Banner: iframe | banner.js (or creative.js) | [Dynamic creatives](#alt-dyn), [Banner and In-Renderer Video iframes](#alt-iframes) | +| Web Banner: safeframe | banner.js (or creative.js) | [Dynamic creatives](#alt-dyn), [Banner Safeframes](#alt-safeframes) | +| Web In-Renderer Video: iframe | video.js (or creative.js) | [Dynamic creatives](#alt-dyn), [Banner and In-Renderer Video iframes](#alt-iframes) | +| Web In-Renderer Video: safeframe | n/a | Renderers each choose where to render differently, but none writes to the safeframe. | +| AMP Banner: always safeframe | amp.js (or creative.js) | n/a | | native: iframe | native.js (or native-render.js) | [Dynamic creatives](#alt-dyn) | | native: safeframe | native.js (or native-render.js) | [Dynamic creatives](#alt-dyn) | Note that as of PUC v1.15, the recommended way of loading the creative -in the ad server involves using the `hb_format` ad server key-value. Before 1.15, the ad server needed to load creative.js which covered banner and outstream video, or native-render.js for native. 1.15 simplifies this +in the ad server involves using the `hb_format` ad server key-value. Before 1.15, the ad server needed to load creative.js which covered banner and in-renderer video, or native-render.js for native. 1.15 simplifies this by allowing the ad server creative to load banner.js, video.js, or native.js, which can be done programmatically using ad server macros. e.g. ```html @@ -45,7 +45,7 @@ service provider may have a different location. ## Features of the PUC -### What the PUC does for Web iframe Banners/Outstream +### What the PUC does for Web iframe Banners/In-Renderer 1. Simply calls the Prebid.js renderAd function @@ -87,9 +87,9 @@ by using [Prebid.js dynamic creatives](/adops/js-dynamic-creative.html). -### Alternate methods for Banner and Outstream Video iframes +### Alternate methods for Banner and In-Renderer Video iframes -If you only ever need to display non-safeframed banner and outstream-video creatives, there are several ways to replace the `jsdelivr` call in your ad server creative: +If you only ever need to display non-safeframed banner and in-renderer-video creatives, there are several ways to replace the `jsdelivr` call in your ad server creative: 1. Copy the contents of `https://cdn.jsdelivr.net/npm/prebid-universal-creative@latest/dist/creative.js` into each creative. 1. Directly call the Prebid.js `renderAd` function: diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-admob.md b/prebid-mobile/modules/rendering/android-sdk-integration-admob.md index 6730e44c5e..32cc4169c5 100644 --- a/prebid-mobile/modules/rendering/android-sdk-integration-admob.md +++ b/prebid-mobile/modules/rendering/android-sdk-integration-admob.md @@ -1,38 +1,21 @@ --- layout: page_v2 -title: Prebid Mobile Rendering GAM Line Item Setup -description: Prebid Mobile Rendering Modules GAM line item setup +title: Integrating Prebid SDK Android with AdMob +description: Integrating Prebid SDK Android with AdMob sidebarType: 2 --- -# AdMob Integration - +# Prebid SDK Android with AdMob Integration Method {:.no_toc} -The integration of Prebid Mobile with Google AdMob assumes that the publisher has an AdMob account and has already integrated the Google Mobile Ads SDK (GMA SDK) into the app. - -See the [Google's integration documentation](https://developers.google.com/admob/android/quick-start) for the AdMob integration details. - -Prebid is integrated into the AdMob monetization via adapters. - -* TOC +- TOC {:toc} -## AdMob Integration Overview - -![Rendering with GAM as the Primary Ad Server](/assets/images/prebid-mobile/modules/rendering/prebid-in-app-bidding-overview-admob.png) - -**Steps 1-2** Prebid SDK makes a bid request. Prebid server runs an auction and returns the winning bid. - -**Step 3** GMA SDK makes an ad request. AdMob returns the mediation chain with respective ad sources. - -**Step 4** For each prebid's ad source, the GMA SDK sequentially instantiates an adapter. - -**Step 5** The adapter verifies the targeting keywords of the winning bid and the server properties of the given ad source. If they match the adapter will render the winning bid. Otherwise, it will immediately fail with a "no ad" error and the next ad source will instantiate the same adapter but for another set of server params. +{% include mobile/intro-admob.md platform="android" %} -## Integrate Prebid Adapters +## Setup To integrate Prebid Adapters for AdMob just add the following lines into your build.gradle files: @@ -54,7 +37,9 @@ App module build.gradle: implementation('org.prebid:prebid-mobile-sdk-admob-adapters:x.x.x') ``` -## Banner API +## Adunit Specific Instructions + +### Banners Integration example: @@ -92,37 +77,32 @@ adUnit?.fetchDemand { result -> } ``` -### Step 1: Create AdView and AdRequest - +#### Step 1: Create AdView and AdRequest {:.no_toc} This step is the same as for the original [AdMob integration](https://developers.google.com/admob/android/banner). You don't have to make any modifications here. -### Step 2: Create AdMobMediationBannerUtils - +#### Step 2: Create AdMobMediationBannerUtils {:.no_toc} The `AdMobBannerMediationUtils` is a helper class, which performs certain utilty work for the `MediationBannerAdUnit`, like passing the targeting keywords to the adapters and checking the visibility of the ad view. -### Step 3: Create MediationBannerAdUnit - +#### Step 3: Create MediationBannerAdUnit {:.no_toc} The `MediationBannerAdUnit` is part of the prebid mediation API. This class is responsible for making the bid request and providing the winning bid and targeting keywords to the mediating SDKs. -### Step 4: Make a bid request - +#### Step 4: Make a bid request {:.no_toc} The `fetchDemand` method makes a bid request to the prebid server and provides a result in a completion handler. -### Step 5: Make an Ad Request - +#### Step 5: Make an Ad Request {:.no_toc} Now you should just make a regular AdMob's ad request. Everything else will be handled by GMA SDK and prebid adapters. -## Interstitial API +### Interstitials Integration example: @@ -165,20 +145,17 @@ adUnit?.fetchDemand { result -> } ``` -### Step 1: Create AdRequest - +#### Step 1: Create AdRequest {:.no_toc} This step is the same as for original [AdMob integration](https://developers.google.com/admob/android/interstitial). You don't have to make any modifications here. -### Step 2: Create AdMobInterstitialMediationUtils - +#### Step 2: Create AdMobInterstitialMediationUtils {:.no_toc} The `AdMobInterstitialMediationUtils` is a helper class, which performs certain utilty work for the `MediationInterstitialAdUnit`, like passing the targeting keywords to adapters. -### Step 3: Create MediationInterstitialAdUnit - +#### Step 3: Create MediationInterstitialAdUnit {:.no_toc} The `MediationInterstitialAdUnit` is part of the prebid mediation API. This class is responsible for making a bid request and providing the winning bid and targeting keywords to mediating SDKs. @@ -194,25 +171,22 @@ adUnit = MediationInterstitialAdUnit( ) ``` -### Step 4: Make a bid request - +#### Step 4: Make a bid request {:.no_toc} The `fetchDemand` method makes a bid request to the prebid server and provides a result in a completion handler. -### Step 5: Make an ad request - +#### Step 5: Make an ad request {:.no_toc} Now you should just make a regular AdMob's ad request. Evetything else will be handled by GMA SDK and prebid adapters. -### Step 6: Display an ad - +#### Step 6: Display an ad {:.no_toc} Once you receive the ad it will be ready for display. You can show interstitial right in the listener or later according to the app logic. -## Rewarded API +### Rewarded Video Integration example: @@ -256,43 +230,37 @@ adUnit?.fetchDemand { result -> } ``` -### Step 1: Create AdRequest - +#### Step 1: Create AdRequest {:.no_toc} This step is the same as for the original [AdMob integration](https://developers.google.com/admob/android/rewarded). You don't have to make any modifications here. -### Step 2: Create AdMobRewardedMediationUtils - +#### Step 2: Create AdMobRewardedMediationUtils {:.no_toc} The `AdMobRewardedMediationUtils` is a helper class, which performs certain utilty work for the `MediationInterstitialAdUnit`, like passing the targeting keywords to adapters. -### Step 3: Create MediationRewardedVideoAdUnit - +#### Step 3: Create MediationRewardedVideoAdUnit {:.no_toc} The `MediationRewardedVideoAdUnit` is part of the prebid mediation API. This class is responsible for making bid request and managing the winning bid. -### Step 4: Make a bid request - +#### Step 4: Make a bid request {:.no_toc} The `fetchDemand` method makes a bid request to the prebid server and provides a result in a completion handler. -### Step 5: Make an ad request - +#### Step 5: Make an ad request {:.no_toc} Now you should just make a regular AdMob's ad request. Evetything else will be handled by GMA SDK and prebid adapters. -### Step 6: Display an ad - +#### Step 6: Display an ad {:.no_toc} Once you receive the ad it will be ready for display. You can show interstitial right in the listener or later according to the app logic. -## Native API +### Native Integration example: @@ -337,20 +305,17 @@ nativeAdUnit.fetchDemand(extras) { resultCode -> } ``` -### Step 1: Create AdRequest - +#### Step 1: Create AdRequest {:.no_toc} Prepare the `AdLoader` and `AdRequest` objects before you make the bid request. They are needed for prebid mediation utils. Follow the [AdMob integration instructions](https://developers.google.com/admob/android/native/start) for this step. -### Step 2: Create NativeAdUnit - +#### Step 2: Create NativeAdUnit {:.no_toc} The `NativeAdUnit` is responsible for making bid requests. Once the bid responce is received you can load an ad from AdMob. -### Step 3: Configure NativeAdUnit - +#### Step 3: Configure NativeAdUnit {:.no_toc} The bid request for native ad should have a description of expected assets. The full spec for the Native template can be found in the [Native Ad Specification from IAB](https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf). @@ -414,14 +379,18 @@ private fun configureNativeAdUnit(nativeAdUnit: NativeAdUnit) { } ``` -### Step 4: Make a bid request - +#### Step 4: Make a bid request {:.no_toc} The `fetchDemand` method makes a bid request to the prebid server and provides a result in a completion handler. -### Step 5: make an ad request - +#### Step 5: make an ad request {:.no_toc} Now load an native ad from AdMob according to the [AdMob instructions](https://developers.google.com/admob/android/native/start). Everything else will be handled by GMA SDK and prebid adapters. + +## Further Reading + +- [Prebid Mobile Overview](/prebid-mobile/prebid-mobile.html) +- [Prebid SDK Android Integration](/prebid-mobile/pbm-api/android/code-integration-android.html) +- [Prebid SDK Android Global Parameters](/prebid-mobile/pbm-api/android/pbm-targeting-android.html) diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-gam.md b/prebid-mobile/modules/rendering/android-sdk-integration-gam.md index 2093dbbc11..65d8d95b61 100644 --- a/prebid-mobile/modules/rendering/android-sdk-integration-gam.md +++ b/prebid-mobile/modules/rendering/android-sdk-integration-gam.md @@ -7,41 +7,25 @@ sidebarType: 2 --- -# Google Ad Manager Integration +# Prebid SDK Android with the GAM Prebid-Rendered Integration Method {:.no_toc} -The integration of Prebid Rendering API with Google Ad Manager (GAM) assumes that the publisher has an account on GAM and has already integrated the Google Mobile Ads SDK (GMA SDK) into the app project. - - -If you do not have the GAM SDK in the app yet, refer to the [Google Integration Documentation](https://developers.google.com/ad-manager/mobile-ads-sdk/android/quick-start). - -* TOC +- TOC {:toc} -## GAM Integration Overview - -![Rendering with GAM as the Primary Ad Server](/assets/images/prebid-mobile/modules/rendering/Prebid-In-App-Bidding-Overview-GAM.png) - -**Steps 1-2** Prebid SDK makes a bid request. Prebid Server runs an auction and returns the winning bid. +{% include mobile/intro-prebid-rendered.md platform="android" %} -**Step 3** The Prebid Rendering Module, through the GAM Event Handler, sets up the targeting keywords into the GAM's ad unit. +## Event Handlers -**Step 4** The GMA SDK makes an ad request. GAM returns the winning line item. +First, a little bit of setup is needed. -**Step 5** Based on the ad response, Prebid GAM Event Handler defines which line item has won in GAM - Prebid's or another ad source. +### Integrate Event Handlers -**Step 6** The winner is displayed in the app with the respective rendering engine. - - -## Integrate Event Handlers - -Prebid SDK provides rendering integration into GAM setup via [app events ](https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner#app_events) mechanism. To integrate Prebid Event Handlers into your app, add the following line to your Podfile: - -GAM Event Handlers is a set of classes that wrap the GAM Ad Units and manage them respectively to the In-App Bidding flow. These classes are provided in the form of library that could be added to the app via Gradle: +The Prebid SDK supples a set of classes called the 'GAM Event Handlers' that wrap the GAM Ad Units and manage them in the In-App Bidding flow. These classes are provided in the form of library that could be added to the app via Gradle: Root build.gradle -``` +```text allprojects { repositories { ... @@ -53,14 +37,19 @@ allprojects { App module build.gradle: -``` +```text implementation('org.prebid:prebid-mobile-sdk-gam-event-handlers:x.x.x') ``` -## Banner API +## AdUnit-Specific instructions -To integrate the banner ad you need to implement three easy steps: +This section covers integration details for different ad formats. In each scenario, you'll be asked for a `configId` - this is a key worked out with your Prebid Server provider. It's used at runtime to pull in the bidders and parameters specific to this adunit. Depending on your Prebid Server partner, it may be a UUID or constructed out of parts like an account number and adunit name. + +### Banners +#### Display Banners + +To integrate the banner ad you need to implement three easy steps: ```kotlin // 1. Create a banner custom event handler for GAM ad server. @@ -83,16 +72,16 @@ Pay attention that the `loadAd()` should be called on the main thread. {% endcapture %} {% include /alerts/alert_warning.html content=warning_note %} -#### Step 1: Create Event Handler +##### Step 1: Create Event Handler {:.no_toc} -GAM's event handlers are special containers that wrap GAM Ad Views and help to manage collaboration between GAM and Prebid views. +Prebid SDK's GAM event handlers are special containers that wrap GAM Ad Views and help to manage collaboration between GAM and Prebid views. **Important:** you should create and use a unique event handler for each ad view. To create the event handler you should provide a GAM Ad Unit Id and the list of available sizes for this ad unit. -#### Step 2: Create Ad View +##### Step 2: Create Ad View {:.no_toc} **BannerView** - is the view that will display a particular ad. It should be added to the UI. To create it you should provide: @@ -104,40 +93,39 @@ Also, you should add the instance of `BannerView` to the UI. And assign the listeners for processing ad events. -#### Step 3: Load the Ad +##### Step 3: Load the Ad {:.no_toc} Call the `loadAd()` method to make a bid request. -### Outstream Video +#### Non-Instream Video {:.no_toc} -For **Outstream Video** you also need to specify video placement type of the expected ad: +For **Non-Instream Video** you also need to specify video placement type of the expected ad: ```kotlin bannerView.videoPlacementType = PlacementType.IN_BANNER // or any other available type ``` -### Migration from the original API -{:.no_toc} +#### Migrating banners from a Bidding-Only integration GAM setup: + 1. Leave the original order and ad units as is. They are not relevant for the rendering approach but they will serve ads for released applications. 2. Create new GAM ad unit. 3. Setup new [GAM Order](/adops/mobile-rendering-gam-line-item-setup.html) for rendering approach. Integration: -1. Replace the `AdManagerAdView` with `BannerView` in the UI. -3. Implement the interface `BannerViewListener`. -4. Remove both `AdManagerAdView` and `AdManagerAdRequest` and implement an`AdListener`. -5. Remove the original `BannerAdUnit`. -6. Follow the instructions to integrate [Banner API](#banner-api). +1. Replace the `AdManagerAdView` with `BannerView` in the UI. +2. Implement the interface `BannerViewListener`. +3. Remove both `AdManagerAdView` and `AdManagerAdRequest` and implement an`AdListener`. +4. Remove the original `BannerAdUnit`. +5. Follow the instructions to integrate [Banner API](#banners). -## Interstitial API - -To integrate interstitial ad follow these steps: +### Interstitials +To integrate an interstitial ad follow these steps: ```kotlin // 1. Create an interstitial custom event handler for GAM ad server. @@ -165,7 +153,7 @@ Pay attention that the `loadAd()` should be called on the main thread. The **default** ad format for an interstitial ad is **DISPLAY**. In order to make a `multiformat bid request`, set the respective values into the `adUnitFormats` parameter. -``` +```kotlin interstitialAdUnit = InterstitialAdUnit( requireContext(), configId, @@ -173,7 +161,6 @@ interstitialAdUnit = InterstitialAdUnit( eventHandler) ``` - #### Step 1: Create Event Handler {:.no_toc} @@ -201,7 +188,6 @@ Also, you can assign the listeners for processing ad events. Call the `loadAd()` method make a bid request. The ad unit will load an ad and will wait for explicit instructions to display the Interstitial Ad. - #### Step 4: Show the Ad when it is ready {:.no_toc} @@ -213,27 +199,26 @@ override fun onAdLoaded(interstitialAdUnit: InterstitialAdUnit) { } ``` -### Migration from the original API -{:.no_toc} +#### Migrating interstitials from a Bidding-Only integration GAM setup: + 1. Leave the original order and ad units as is. They are not relevant for the rendering approach but they will serve ads for released applications. 2. Create a new GAM ad unit. 3. Setup a new [GAM Order](rendering-gam-line-item-setup.html) for rendering approach. Integration: -1. Replace the `AdManagerInterstitialAd` with `InterstitialRenderingAdUnit`. -3. Implement the interface for `InterstitialEventListener`. -4. Remove both `AdManagerInterstitialAd` and `AdManagerAdRequest`. -5. Remove the original `InterstitialAdUnit`. -6. Follow the instructions to integrate [Interstitial API](#interstitial-api). +1. Replace the `AdManagerInterstitialAd` with `InterstitialRenderingAdUnit`. +2. Implement the interface for `InterstitialEventListener`. +3. Remove both `AdManagerInterstitialAd` and `AdManagerAdRequest`. +4. Remove the original `InterstitialAdUnit`. +5. Follow the instructions to integrate [Interstitial API](#interstitials). -## Rewarded API +### Rewarded Video To display a Rewarded Ad follow these steps: - ```kotlin // 1. Create a rewarded custom event handler for GAM ad server. val eventHandler = GamRewardedEventHandler(requireActivity(), gamAdUnitId) @@ -260,7 +245,6 @@ Pay attention that the `loadAd()` should be called on the main thread. Displaying the **Rewarded Ad** is the same as displaying an Interstitial Ad. The type of ad can be customized to: - Be notified when user earns a reward - implement `RewardedAdUnitListener` interface: ```kotlin @@ -308,16 +292,28 @@ override fun onAdLoaded(rewardedAdUnit: RewardedAdUnit) { } ``` -### Migration from the original API +### Migrating rewarded video from a Bidding-Only integration {:.no_toc} GAM setup: + 1. Leave the original order and ad units as is. They are not relevant for the rendering approach but they will serve ads for released applications. 2. Create a new GAM ad unit. 3. Setup a new [GAM Order](rendering-gam-line-item-setup.html) for rendering approach. Integration: -1. Replace the `RewardedAd` with `RewardedAdUnit`. + +1. Replace the `RewardedAd` with `RewardedAdUnit`. 2. Implement the interface for `RewardedAdUnitListener`. 3. Remove the original `RewardedVideoAdUnit`. -4. Follow the instructions to integrate [Rewarded API](#rewarded-api). +4. Follow the instructions to integrate [Rewarded API](#rewarded-video). + +## Additional Ad Unit Configuration + +{% include mobile/adunit-config-android.md %} + +## Further Reading + +- [Prebid Mobile Overview](/prebid-mobile/prebid-mobile.html) +- [Prebid SDK Android Integration](/prebid-mobile/pbm-api/android/code-integration-android.html) +- [Prebid SDK Android Global Parameters](/prebid-mobile/pbm-api/android/pbm-targeting-android.html) diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-max.md b/prebid-mobile/modules/rendering/android-sdk-integration-max.md index 1da49c21df..2a5803b2c1 100644 --- a/prebid-mobile/modules/rendering/android-sdk-integration-max.md +++ b/prebid-mobile/modules/rendering/android-sdk-integration-max.md @@ -1,40 +1,25 @@ --- layout: page_v2 -title: AppLovin MAX Integration -description: Integration of Prebid Rendering module whith AppLovin MAX +title: Integrating Prebid SDK Android with AppLovin MAX +description: Integrating Prebid SDK Android with AppLovin MAX sidebarType: 2 --- -# AppLovin MAX Integration +# Prebid SDK Android with AppLovin MAX Integration Method {:.no_toc} -The integration of Prebid Mobile with AppLovin MAX assumes that publisher has MAX account and has already integrated the AppLovin MAX SDK into the app. - -See the [AppLovin MAX Documentation](https://dash.applovin.com/documentation/mediation/android/getting-started/integration) for the MAX integration details. - -* TOC +- TOC {:toc} -## MAX Integration Overview - -![Rendering with MAX](/assets/images/prebid-mobile/modules/rendering/prebid-in-app-bidding-overview-max.png) - -**Steps 1-2** Prebid SDK makes a bid request. Prebid server runs an auction and returns the winning bid. - -**Step 3** MAX SDK makes an ad request. MAX returns the waterfall with respective placements. - -**Step 4** For each prebid's placement, the MAX SDK sequentially instantiates an adapter. - -**Step 5** The adapter verifies the targeting keywords of the winning bid and the custom properties of the given placement. If they match the adapter will render the winning bid. Otherwise, adpater will fail with "no ad" immediately and the next placement will instantiate the same adapter but for another custom properties. - +{% include mobile/intro-applovin.md platform="android" %} -## Integrate Prebid Adapters +## Setup Prebid SDK is integrated into AppLovin MAX setup via custom adapters. To integrate Prebid Adapters into your app, add the following lines into your build.gradle files: Root build.gradle -``` +```json allprojects { repositories { ... @@ -46,11 +31,13 @@ allprojects { App module build.gradle: -``` +```kotlin implementation('org.prebid:prebid-mobile-sdk-max-adapters:x.x.x') ``` -## Banner API +## Adunit Specific Instructions + +### Banners Integration example: @@ -84,7 +71,6 @@ adUnit?.fetchDemand { This step is totally the same as for original [MAX integration](https://dash.applovin.com/documentation/mediation/android/getting-started/banners#loading-and-showing-banners-programmatically). You don't have to make any modifications here. - #### Step 2: Create MaxMediationBannerUtils {:.no_toc} @@ -105,7 +91,7 @@ The `fetchDemand` method makes a bid request to prebid server and provides a res Now you should make a regular MAX's ad request. Everything else will be handled by prebid adapters. -## Interstitial API +### Interstitials Integration example: @@ -136,7 +122,7 @@ adUnit?.fetchDemand { The **default** ad format for interstitial is **DISPLAY**. In order to make a `multiformat bid request`, set the respective values into the `adUnitFormats` parameter. -``` +```kotlin adUnit = MediationInterstitialAdUnit( activity, configId, @@ -150,7 +136,6 @@ adUnit = MediationInterstitialAdUnit( This step is totally the same as for original [MAX integration](https://dash.applovin.com/documentation/mediation/android/getting-started/interstitials). You don't have to make any modifications here. - #### Step 2: Create MaxMediationInterstitialUtils {:.no_toc} @@ -176,11 +161,11 @@ Now you should make a regular MAX's ad request. Everything else will be handled Once you receive the ad it will be ready for display. Folow the [MAX instructions](https://dash.applovin.com/documentation/mediation/android/getting-started/interstitials#showing-an-interstitial-ad) about how to do it. -## Rewarded API +### Rewarded Video Integration example: -```swift +```kotlin // 1. Get an instance of MaxRewardedAd maxRewardedAd = MaxRewardedAd.getInstance(adUnitId, activity) maxRewardedAd?.setListener(createListener()) @@ -236,12 +221,11 @@ Now you should make a regular MAX's ad request. Everything else will be handled {:.no_toc} Once the rewarded ad is received you can display it. Folow the [MAX instructions](https://dash.applovin.com/documentation/mediation/android/getting-started/rewarded-ads#showing-a-rewarded-ad) for the details. - -## Native Ads +### Native Ads Integration example: -``` +```kotlin // 1. Create MaxNativeAdLoader nativeAdLoader = MaxNativeAdLoader(adUnitId, requireActivity()) nativeAdLoader.setNativeAdListener(createNativeAdListener(viewContainer)) @@ -284,7 +268,7 @@ The bid request for native ads should have the description of expected assets. T The example of creating the assets array: -``` +```kotlin val title = NativeTitleAsset() title.setLength(90) title.isRequired = true @@ -324,7 +308,7 @@ The bid request for mative ads may have a descrition of expected event trackers. The example of creating the event trackers array: -``` +```kotlin val methods: ArrayList = ArrayList() methods.add(NativeEventTracker.EVENT_TRACKING_METHOD.IMAGE) methods.add(NativeEventTracker.EVENT_TRACKING_METHOD.JS) @@ -345,3 +329,9 @@ The `fetchDemand` method makes a bid request to prebid server and provides a res {:.no_toc} Now just load a native ad from MAX according to the [MAX instructions](https://dash.applovin.com/documentation/mediation/android/getting-started/native-manual#load-the-native-ad). + +## Further Reading + +- [Prebid Mobile Overview](/prebid-mobile/prebid-mobile.html) +- [Prebid SDK Android Integration](/prebid-mobile/pbm-api/android/code-integration-android.html) +- [Prebid SDK Android Global Parameters](/prebid-mobile/pbm-api/android/pbm-targeting-android.html) diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-pb.md b/prebid-mobile/modules/rendering/android-sdk-integration-pb.md index 231aa81caa..6c4a24cadc 100644 --- a/prebid-mobile/modules/rendering/android-sdk-integration-pb.md +++ b/prebid-mobile/modules/rendering/android-sdk-integration-pb.md @@ -1,42 +1,49 @@ --- layout: page_v2 -title: Custom or No mediation -description: Integration of Prebid SDK withou primaty Ad Server +title: Prebid SDK Android with a Custom Bidding Integration +description: Integration of Android Prebid SDK in a special scenario sidebarType: 2 --- -# Custom Bidding Integration +# Prebid SDK Android with a Custom Bidding Integration Method {:.no_toc} -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 {:toc} -## Transport API +{% include mobile/intro-custom.md platform='android' %} + +## Rendering Approaches + +The code implementation details depend on which rendering approach you've chosen: + +- [Bidding Only](#bidding-only) +- [Prebid Rendered](#prebid-rendered) -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. +### Bidding Only -In this mode, the publisher will be responsible for the following actions: +While the default ad server for Prebid's Mobile SDK is GAM, it 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. -* Call fetchDemand with extended targetingDict callback -* Retrieve targeting keys from the 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 +In this mode, the developer is responsible for the following actions: + +- Call `fetchDemand()` with extended targetingDict callback +- Retrieve targeting keys from the 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 available 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` +- 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 on the page for integration using [Original API](/prebid-mobile/pbm-api/android/android-sdk-integration-gam-original-api.html). The difference is that you should use the `fetchDemand` function with the following signature: +The basic steps for these ad units you can find on the page for [GAM Bidding Only integration](/prebid-mobile/pbm-api/android/android-sdk-integration-gam-original-api.html). The difference is that you should use the `fetchDemand` function with the following signature: ```kotlin public void fetchDemand(OnFetchDemandResult listener) { ... } @@ -60,13 +67,13 @@ adUnit?.fetchDemand { bidInfo -> The `BidInfo` provides the following properties: -* `resultCode` - the object of type `ResultCode` describing the status of the bid request. -* `targetingKeywords` - the targeting keywords of the winning bid -* `exp` - the number of seconds that may elapse between the auction and the actual impression. In this case, it indicates the approximate TTL of the bid in the Prebid Cache. Note that the actual expiration time of the bid will be less than this number due to the network and operational overhead. The Prebid SDK doesn't make any adjustments to this value. -* `nativeAdCacheId` - the local cache ID of the winning bid. Applied only to the `native` ad format. -* `events` - the map of some publically available event URLs attached to the bid. These can be used to enable Prebid Server-based analytics when the Prebid Universal Creative (PUC) is not involved in the rendering process. If the PUC is used for rendering, it will take care of hitting these events. These are the available event URLs: - * **EVENT_WIN** - this bid was chosen by the ad server as the one to display. This is the main metric for banner and native. This returns the OpenRTB `seatbid.bid.ext.prebid.events.win` field. (requires SDK v2.1.6) - * **EVENT_IMP** - the ad creative for this bid was actually displayed. This is often the main metric for video ads. This returns the OpenRTB `seatbid.bid.ext.prebid.events.imp` field. (requires SDK v2.1.6) +- `resultCode` - the object of type `ResultCode` describing the status of the bid response. +- `targetingKeywords` - the targeting keywords of the winning bid +- `exp` - the number of seconds that may elapse between the auction and the actual impression. In this case, it indicates the approximate TTL of the bid in the Prebid Cache. Note that the actual expiration time of the bid will be less than this number due to the network and operational overhead. The Prebid SDK doesn't make any adjustments to this value. +- `nativeAdCacheId` - the local cache ID of the winning bid. Applied only to the `native` ad format. +- `events` - the map of some publically available event URLs attached to the bid. These can be used to enable Prebid Server-based analytics when the Prebid Universal Creative (PUC) is not involved in the rendering process. If the PUC is used for rendering, it will take care of hitting these events. These are the available event URLs: + - **EVENT_WIN** - this bid was chosen by the ad server as the one to display. This is the main metric for banner and native. This returns the OpenRTB `seatbid.bid.ext.prebid.events.win` field. (requires SDK v2.1.6) + - **EVENT_IMP** - the ad creative for this bid was actually displayed. This is often the main metric for video ads. This returns the OpenRTB `seatbid.bid.ext.prebid.events.imp` field. (requires SDK v2.1.6) Code sample to extract the events: @@ -75,13 +82,13 @@ val win = bidInfo.events.get(BidInfo.EVENT_WIN) val imp = bidInfo.get(BidInfo.EVENT_IMP) ``` -## Rendering API +### Prebid Rendered -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. +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) -### Banner API +#### HTML Banner Integration example: @@ -102,32 +109,31 @@ Pay attention that the `loadAd()` should be called on the main thread. {% endcapture %} {% include /alerts/alert_warning.html content=warning_note %} -#### Step 1: Create Ad View +##### Step 1: Create Ad View {:.no_toc} Initialize the `BannerAdView` with properties: -* `configId` - an ID of a [Stored Impression](/prebid-server/features/pbs-storedreqs.html) on the Prebid server -* `size` - the size of the ad unit which will be used in the bid request. +- `configId` - an ID of a [Stored Impression](/prebid-server/features/pbs-storedreqs.html) on the Prebid server +- `size` - the size of the ad unit which will be used in the bid request. -#### Step 2: Load the Ad +##### Step 2: Load the Ad {:.no_toc} Call `loadAd()` and SDK will: -* make bid request to Prebid -* render the winning bid on display +- make bid request to Prebid +- render the winning bid on display -#### Outstream Video -{:.no_toc} +#### Banner Video (non-instream) -For **Banner Video** you will also need to specify the `bannerView.videoPlacementType`: +**Banner Video** is the same as HTML banner, but you will also need to specify the `bannerView.videoPlacementType`: ``` kotlin bannerView.videoPlacementType = PlacementType.IN_BANNER // or any other available type ``` -### Interstitial API +#### Interstitials Integration example: @@ -158,24 +164,24 @@ interstitialAdUnit = InterstitialAdUnit( EnumSet.of(AdUnitFormat.BANNER, AdUnitFormat.VIDEO)) ``` -#### Step 1: Create an Ad Unit +##### Step 1: Create an Ad Unit {:.no_toc} Initialize the `InterstitialAdUnit` with properties: -* `configId` - an ID of a [Stored Impression](/prebid-server/features/pbs-storedreqs.html) on the Prebid server -* `minSizePercentage` - specifies the minimum width and height percent an ad may occupy of a device’s real estate. +- `configId` - an ID of a [Stored Impression](/prebid-server/features/pbs-storedreqs.html) on the Prebid server +- `minSizePercentage` - specifies the minimum width and height percent an ad may occupy of a device’s real estate. You can also assign the listener to process ad events. > **NOTE:** the `minSizePercentage` - plays an important role in the bidding process for display ads. If the provided space is not enough demand partners won't respond with bids. -#### Step 2: Load the Ad +##### Step 2: Load the Ad {:.no_toc} Call the `loadAd()` to make a bid request. -#### Step 3: Show the Ad when it is ready +##### Step 3: Show the Ad when it is ready {:.no_toc} Wait until the ad is loaded and present it to the user in any suitable time. @@ -186,7 +192,7 @@ override fun onAdLoaded(interstitialAdUnit: InterstitialAdUnit) { } ``` -### Rewarded API +#### Rewarded Video Integration example: @@ -209,19 +215,19 @@ Pay attention that the `loadAd()` should be called on the main thread. {% endcapture %} {% include /alerts/alert_warning.html content=warning_note %} -#### Step 1: Create a Rewarded Ad Unit +##### Step 1: Create a Rewarded Ad Unit {:.no_toc} Create the `RewardedAdUnit` object with parameters: -* `adUnitId` - an ID of Stored Impression on the Prebid server. +- `adUnitId` - an ID of Stored Impression on the Prebid server. -#### Step 2: Load the Ad +##### Step 2: Load the Ad {:.no_toc} Call the `loadAd()` to make a bid request. -#### Step 3: Show the Ad when it is ready +##### Step 3: Show the Ad when it is ready {:.no_toc} Wait until the ad is loaded and present it to the user in any suitable time. @@ -231,3 +237,9 @@ override fun onAdLoaded(rewardedAdUnit: RewardedAdUnit) { //Ad is ready for display } ``` + +## Further Reading + +- [Prebid Mobile Overview](/prebid-mobile/prebid-mobile) +- [Prebid SDK Android Integration](/prebid-mobile/pbm-api/android/code-integration-android) +- [Prebid SDK Android Global Parameters](/prebid-mobile/pbm-api/android/pbm-targeting-android) diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md b/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md index b61fe4517b..acc6d0bb43 100644 --- a/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md +++ b/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md @@ -1,33 +1,19 @@ --- layout: page_v2 -title: Google Ad Manager Integration -description: Integration of Prebid Rendering module whith Google Ad Manager +title: Integrating Prebid SDK iOS with AdMob +description: Integrating Prebid SDK iOS with AdMob sidebarType: 2 --- -# AdMob Integration +# Prebid SDK iOS with AdMob Integration Method {:.no_toc} -The integration of Prebid Mobile with Google AdMob assumes that the publisher has an AdMob account and has already integrated the Google Mobile Ads SDK (GMA SDK) into the app. - -See the [Google Integration Documentation](https://developers.google.com/admob/ios/quick-start) for the AdMob integration details. - -* TOC +- TOC {:toc} -## AdMob Integration Overview - -![Rendering with GAM as the Primary Ad Server](/assets/images/prebid-mobile/modules/rendering/prebid-in-app-bidding-overview-admob.png) - -**Steps 1-2** Prebid SDK makes a bid request. Prebid server runs an auction and returns the winning bid. - -**Step 3** GMA SDK makes an ad request. AdMob returns the mediation chain with respective ad sources. +{% include mobile/intro-admob.md platform="ios" %} -**Step 4** For each prebid's ad source, the GMA SDK sequentially instantiates an adapter. - -**Step 5** The adapter verifies the targeting keywords of the winning bid and the server properties of the given ad source. If they match the adapter will render the winning bid. Otherwise, it will immediately fail with an error of "no ad" and the next ad source will instantiate the same adapter but for another set of server params. - -## Adapters Integration +## Setup Prebid SDK is integrated into AdMob setup thru custom adapters. To integrate Prebid Adapters into your app, add the following line to your Podfile: @@ -35,7 +21,7 @@ Prebid SDK is integrated into AdMob setup thru custom adapters. To integrate Pre pod 'PrebidMobileAdMobAdapters' ``` -## Adapters Initialization +### Initialization {: .alert.alert-warning :} **Warning:** The `GADMobileAds.sharedInstance().start()` should be called in the adapters bundle, otherwise, GMA SDK won't load the ads with error: `adView:didFailToReceiveAdWithError: SDK tried to perform a networking task before being initialized.` @@ -46,7 +32,9 @@ To avoid the error add the following line to your app right after initialization AdMobUtils.initializeGAD() ``` -## Banner API +## Adunit Specific Instructions + +### Banners Integration example: @@ -77,32 +65,32 @@ prebidAdMobMediaitonAdUnit.fetchDemand { [weak self] result in } ``` -### Step 1: Create GADRequest and GADBannerView +#### Step 1: Create GADRequest and GADBannerView {:.no_toc} This step is the same as for the original [AdMob integration](https://developers.google.com/admob/ios/banner). You don't have to make any modifications here. -### Step 2: Create AdMobMediationBannerUtils +#### Step 2: Create AdMobMediationBannerUtils {:.no_toc} The `AdMobMediationBannerUtils` is a helper class, which performs certain utilty work for the `MediationBannerAdUnit`, such as passing the targeting keywords to the adapters and checking the visibility of the ad view. -### Step 3: Create MediationBannerAdUnit +#### Step 3: Create MediationBannerAdUnit {:.no_toc} The `MediationBannerAdUnit` is part of Prebid mediation API. This class is responsible for making a bid request and providing the winning bid and targeting keywords to mediating SDKs. -### Step 4: Make bid request +#### Step 4: Make bid request {:.no_toc} The `fetchDemand` method makes a bid request to a Prebid server and returns a result in a completion handler. -### Step 5: Make an Ad Request +#### Step 5: Make an Ad Request {:.no_toc} Make a regular AdMob's ad request. Everything else will be handled by Prebid adapters. -## Interstitial API +### Interstitials Integration example: @@ -150,37 +138,37 @@ adUnit?.adFormats = [.banner] ``` -### Step 1: Create GADRequest +#### Step 1: Create GADRequest {:.no_toc} This step is the same as for the original [AdMob integration](https://developers.google.com/admob/ios/interstitial#swift). You don't have to make any modifications here. -### Step 2: Create AdMobMediationInterstitialUtils +#### Step 2: Create AdMobMediationInterstitialUtils {:.no_toc} The `AdMobMediationInterstitialUtils` is a helper class, which performs certain utilty work for the `MediationInterstitialAdUnit`, such as passing the targeting keywords to adapters and checking the visibility of the ad view. -### Step 3: Create MediationInterstitialAdUnit +#### Step 3: Create MediationInterstitialAdUnit {:.no_toc} The `MediationInterstitialAdUnit` is part of the Prebid mediation API. This class is responsible for making a bid request and providing a winning bid to the mediating SDKs. -### Step 4: Make bid request +#### Step 4: Make bid request {:.no_toc} The `fetchDemand` method makes a bid request to a Prebid server and provides a result in a completion handler. -### Step 5: Make an Ad Request +#### Step 5: Make an Ad Request {:.no_toc} Make a regular AdMob's ad request. Everything else will be handled by GMA SDK and prebid adapters. -### Steps 6: Display an ad +#### Steps 6: Display an ad {:.no_toc} Once you receive the ad it will be ready for display. Follow the [AdMob instructions](https://developers.google.com/admob/ios/interstitial#swift) for displaying an ad. -## Rewarded API +### Rewarded Video Integration example: @@ -222,40 +210,40 @@ The process of displaying the rewarded ad is the same as for displaying an Inter To be notified when a user earns a reward follow the [AdMob intructions](https://developers.google.com/admob/ios/rewarded#show_the_ad). -### Step 1: Create GADRequest +#### Step 1: Create GADRequest {:.no_toc} This step is the same as for the original [AdMob integration](https://developers.google.com/admob/ios/rewarded). You don't have to make any modifications here. -### Step 2: Create MediationRewardedAdUnit +#### Step 2: Create MediationRewardedAdUnit {:.no_toc} The `AdMobMediationRewardedUtils` is a helper class, which performs certain utilty work for the `MediationRewardedAdUnit`, like passing the targeting keywords to the adapters. -### Step 3: Create MediationInterstitialAdUnit +#### Step 3: Create MediationInterstitialAdUnit {:.no_toc} The `MediationRewardedAdUnit` is part of the Prebid mediation API. This class is responsible for making a bid request and providing a winning bid and targeting keywords to the adapters. -### Step 4: Make bid request +#### Step 4: Make bid request {:.no_toc} The `fetchDemand` method makes a bid request to the a Prebid server and provides a result in a completion handler. -### Step 5: Make an Ad Request +#### Step 5: Make an Ad Request {:.no_toc} Make a regular AdMob's ad request. Everything else will be handled by GMA SDK and prebid adapters. -### Steps 6: Display an ad +#### Steps 6: Display an ad {:.no_toc} Once the rewarded ad is received you can display it. Follow the [AdMob instructions](https://developers.google.com/admob/ios/rewarded#swift) for displaying an ad. -## Native Ads +### Native Ads {: .alert.alert-warning :} -**Warning:** If you use Native Ads you **must** integrate AdMob Adapters via the source files instead of cocoapods integration or standalone framework. The integration using framework leads to [runtime errors](https://github.com/prebid/prebid-mobile-ios/issues/516) related to the type casting. +**Warning:** If you use Native Ads you **must** integrate AdMob Adapters via the source files instead of cocoapods integration or standalone framework. In order to integrate AdMob adapters just add the adapters' source files to your app project. @@ -298,22 +286,22 @@ self.adLoader?.load(self.gadRequest) } ``` -### Step 1: Create GAD Request +#### Step 1: Create GAD Request {:.no_toc} Prepare the `GADRequest` object before you make a bid request. It will be needed for the Prebid mediation utils. -### Step 2: Create AdMobMediationNativeUtils +#### Step 2: Create AdMobMediationNativeUtils {:.no_toc} The `AdMobMediationNativeUtils` is a helper class, which performs certain utilty work for `MediationNativeAdUnit`, like passing the targeting keywords to adapters and checking the visibility of the ad view. -### Step 3: Create and configure MediationNativeAdUnit +#### Step 3: Create and configure MediationNativeAdUnit {:.no_toc} The `MediationNativeAdUnit` is part of the Prebid mediation API. This class is responsible for making a bid request and providing a winning bid and targeting keywords to the adapters. For better targetting you should provide additional properties like `conteaxtType` and `placemantType`. -### Step 4: Set up assets for bid request +#### Step 4: Set up assets for bid request {:.no_toc} The bid request for native ads should have the description of any expected assets. The full spec for the native template can be found in the [Native Ad Specification from IAB](https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf). @@ -338,7 +326,7 @@ let sponsored = NativeAssetData(type: DataAsset.sponsored, required: true) return [icon, title, image, body, cta, sponsored] ``` -### Step 5: Set up event tracker for bid request +#### Step 5: Set up event tracker for bid request {:.no_toc} The bid request for mative ads may have a description of expected event trackers. The full spec for the Native template can be found in the [Native Ad Specification from IAB](https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf). @@ -352,12 +340,18 @@ let eventTrackers = [ ] ``` -### Step 6: Make a bid request +#### Step 6: Make a bid request {:.no_toc} The `fetchDemand` method makes a bid request to Prebid server and provides a result in a completion handler. -### Step 7: Load AdMob Native ad +#### Step 7: Load AdMob Native ad {:.no_toc} Now just load a native ad from AdMob according to the [AdMob instructions](https://developers.google.com/admob/ios/native/start). + +## Further Reading + +- [Prebid Mobile Overview](/prebid-mobile/prebid-mobile) +- [Prebid SDK iOS Integration](/prebid-mobile/pbm-api/ios/code-integration-ios) +- [Prebid SDK iOS Global Parameters](/prebid-mobile/pbm-api/ios/pbm-targeting-ios) diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md b/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md index 59bb7df5b8..a4d09983f5 100644 --- a/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md +++ b/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md @@ -5,39 +5,27 @@ description: Integration of Prebid Rendering module whith Google Ad Manager sidebarType: 2 --- -# GAM with Prebid Rendering +# Prebid SDK iOS with the GAM Prebid-Rendered Integration Method {:.no_toc} -The integration of Prebid Rendering API with Google Ad Manager (GAM) assumes that the publisher has an account on GAM and has already integrated the Google Mobile Ads SDK (GMA SDK) into the app project. - -If you do not have GMA SDK in the app yet, refer to the [Google Integration Documentation](https://developers.google.com/ad-manager/mobile-ads-sdk/ios/quick-start). - - TOC {:toc} -## GAM Integration Overview - -![Rendering with GAM as the Primary Ad Server](/assets/images/prebid-mobile/modules/rendering/Prebid-In-App-Bidding-Overview-GAM.png) - -**Steps 1-2** Prebid SDK makes a bid request. Prebid server runs an auction and returns the winning bid. +{% include mobile/intro-prebid-rendered.md platform="ios" %} -**Step 3** Prebid SDK using Prebid GAM Event Handler sets up the targeting keywords into the GAM's ad unit. +## Event Handlers -**Step 4** GMA SDK makes an ad request. GAM returns the winner of the waterfall. +First, a little bit of setup is needed. -**Step 5** Based on the ad response Prebid GAM Event Handler decides who has won on GAM - the Prebid bid or another ad source on GAM. +### Integrate Event Handlers -**Step 6** The winner is displayed in the App with the respective rendering engine. The winning bid will be renderd by Prebid SDK. Other winners will be rendered by GMA SDK. The GAM Event Handler manages this process. - -## Integrate Event Handlers - -Prebid SDK provides rendering integration into GAM setup thru [app events](https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner#app_events) mechanism. To integrate Prebid Event Handlers into your app, add the following line to your Podfile: +Prebid SDK provides rendering integration into the GMA SDK setup with the [app events](https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner#app_events) mechanism. To integrate Prebid Event Handlers into your app, add the following line to your Podfile: ```pod pod 'PrebidMobileGAMEventHandlers' ``` -## Event Handlers Initialization +### Event Handlers Initialization {: .alert.alert-warning :} **Warning:** GMA SDK is a closed library that sometimes works in unexpected ways. The `GADMobileAds.sharedInstance().start()` should be called in all bundles where it is used. Otherwise, GMA SDK won't load the ads with an error of: `adView:didFailToReceiveAdWithError: SDK tried to perform a networking task before being initialized.` @@ -48,7 +36,13 @@ To avoid this error add the following line to your app right after initializatio GAMUtils.shared.initializeGAM() ``` -## Banner API +## AdUnit-Specific instructions + +This section covers integration details for different ad formats. In each scenario, you'll be asked for a `configId` - this is a key worked out with your Prebid Server provider. It's used at runtime to pull in the bidders and parameters specific to this adunit. Depending on your Prebid Server partner, it may be a UUID or constructed out of parts like an account number and adunit name. + +### Banners + +#### Display Banners Integration example: @@ -69,8 +63,7 @@ addBannerToUI(banner: banner) banner.loadAd() ``` -### Step 1: Create Event Handler - +##### Step 1: Create Event Handler {:.no_toc} To create the `GAMBannerEventHandler` you should provide: @@ -78,8 +71,7 @@ To create the `GAMBannerEventHandler` you should provide: - a **GAM Ad Unit Id** - the list of available **sizes** for this ad unit. -### Step 2: Create Ad View - +##### Step 2: Create Ad View {:.no_toc} `BannerView` - is a view that will display the particular ad. It should be added to the UI. To create a BannerView you should provide: @@ -89,8 +81,7 @@ To create the `GAMBannerEventHandler` you should provide: You should also add the instance of `BannerView` to the UI. -### Step 3: Load the Ad - +##### Step 3: Load the Ad {:.no_toc} Call the method `loadAd()` which will: @@ -98,11 +89,9 @@ Call the method `loadAd()` which will: - make a bid request to Prebid Server. - render the winning bid on display. -## Banner Video - -{:.no_toc} +#### Banner Video (non-instream) -For **Banner Video** you also need to specify the ad format: +For non-instream **Banner Video** you also need to specify the ad format: ```swift banner.adFormat = .video @@ -110,9 +99,7 @@ banner.adFormat = .video The rest of the code will be the same as for integration of Display Banner. -### Migration from the original API - -{:.no_toc} +#### Migrating banners from a Bidding-Only integration GAM setup: @@ -126,9 +113,9 @@ Integration: 2. Implement the protocol `BannerViewDelegate` in the ViewController. 3. Remove usage of `GAMBannerView`, `GAMRequest`, and implementation of the `GADBannerViewDelegate`. 4. Remove original `BannerAdUnit`. -5. Follow the instructions to integrate [Banner API](#banner-api). +5. Follow the instructions to integrate [Banner API](#banners). -## Interstitial API +### Interstitials Integration example: @@ -169,14 +156,12 @@ adUnit?.adFormats = [.banner] ``` -### Step 1: Create Event Handler - +#### Step 1: Create Event Handler {:.no_toc} To create an event handler you should provide a **GAM Ad Unit**. -### Step 2: Create Interstitial Ad Unit - +#### Step 2: Create Interstitial Ad Unit {:.no_toc} Initialize the `InterstitialRenderingAdUnit` with properties: @@ -187,14 +172,12 @@ Initialize the `InterstitialRenderingAdUnit` with properties: > **NOTE:** the `minSizePercentage` - plays an important role in the bidding process for display ads. If provided space is not enough demand partners won't respond with bids. -### Step 3: Load the Ad - +#### Step 3: Load the Ad {:.no_toc} Call the method `loadAd()` which will make a bid request to Prebid Server. -### Step 4: Show the Ad when it is ready - +#### Step 4: Show the Ad when it is ready {:.no_toc} Wait for the Prebid Server to return an ad and show it to the user in any suitable time. @@ -207,9 +190,7 @@ func interstitialDidReceiveAd(_ interstitial: InterstitialAdUnit) { } ``` -### Migration from the original API - -{:.no_toc} +#### Migrating interstitials from a Bidding-Only integration GAM setup: @@ -223,9 +204,9 @@ Integration: 2. Implement the protocol `InterstitialAdUnitDelegate` in the View Controller. 3. Remove usage of `GAMInterstitialAd`, `GAMRequest`. 4. Remove original `InterstitialAdUnit`. -5. Follow the instructions to integrate [Interstitial API](#interstitial-api). +5. Follow the instructions to integrate [Interstitial API](#interstitials). -## Rewarded API +### Rewarded Video Integration example: @@ -267,14 +248,12 @@ if let reward = rewardedAd.reward as? GADAdReward { } ``` -### Step 1: Create Event Handler - +#### Step 1: Create Event Handler {:.no_toc} To create an event handler you should provide a **GAM Ad Unit ID**. -### Step 2: Create Rewarded Ad Unit - +#### Step 2: Create Rewarded Ad Unit {:.no_toc} Create the `RewardedAdUnit` object with parameters: @@ -282,14 +261,12 @@ Create the `RewardedAdUnit` object with parameters: - `configID` - an ID of Stored Impression on the Prebid server - `eventHandler` - the instance of rewarded event handler -### Step 3: Load the Ad - +#### Step 3: Load the Ad {:.no_toc} Call the `loadAd()` method which will make a bid request to Prebid server. -### Step 4: Show the Ad when it is ready - +#### Step 4: Show the Ad when it is ready {:.no_toc} Wait for the ad to load and display it to the user in any suitable time. @@ -302,9 +279,7 @@ func rewardedAdDidReceiveAd(_ rewardedAd: RewardedAdUnit) { } ``` -### Migration from the original API - -{:.no_toc} +#### Migrating Rewarded Video from a Bidding-Only integration GAM setup: @@ -318,4 +293,14 @@ Integration: 2. Implement the protocol `RewardedAdUnitDelegate` in the View Controller. 3. Remove usage of `GAMRequest`. 4. Remove original `RewardedVideoAdUnit`. -5. Follow the instructions to integrate [Rewarded API](#rewarded-api). +5. Follow the instructions to integrate [Rewarded API](#rewarded-video). + +## Additional Ad Unit Configuration + +{% include mobile/adunit-config-ios.md %} + +## Further Reading + +- [Prebid Mobile Overview](/prebid-mobile/prebid-mobile.html) +- [Prebid SDK iOS Integration](/prebid-mobile/pbm-api/ios/code-integration-ios.html) +- [Prebid SDK iOS Global Parameters](/prebid-mobile/pbm-api/ios/pbm-targeting-ios.html) diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-max.md b/prebid-mobile/modules/rendering/ios-sdk-integration-max.md index db1974d534..9145836090 100644 --- a/prebid-mobile/modules/rendering/ios-sdk-integration-max.md +++ b/prebid-mobile/modules/rendering/ios-sdk-integration-max.md @@ -1,41 +1,29 @@ --- layout: page_v2 -title: AppLovin MAX Integration -description: Integration of Prebid Rendering module whith AppLovin MAX +title: Integrating Prebid SDK iOS with AppLovin MAX +description: Integrating Prebid SDK iOS with AppLovin MAX sidebarType: 2 --- -# AppLovin MAX Integration +# Prebid SDK iOS with AppLovin MAX Integration Method {:.no_toc} -The integration of Prebid Mobile with AppLovin MAX assumes that publisher has a MAX account and has integrated the AppLovin MAX SDK into the app. - -See the [AppLovin MAX Documentation](https://dash.applovin.com/documentation/mediation/ios/getting-started/integration) for the MAX integration details. - -* TOC +- TOC {:toc} -## MAX Integration Overview - -![Rendering with AppLovin MAX as the Primary Ad Server](/assets/images/prebid-mobile/modules/rendering/prebid-in-app-bidding-overview-max.png) - -**Steps 1-2** Prebid SDK makes a bid request. Prebid Server runs an auction and returns the winning bid. - -**Step 3** MAX SDK makes an ad request. MAX returns the waterfall with respective placements. +{% include mobile/intro-applovin.md platform="ios" %} -**Step 4** For each Prebid placement, the MAX SDK sequentially instantiates an adapter. - -**Step 5** The adapter verifies the targeting keywords of the winning bid and the custom properties of the given placement. If they match the adapter will render the winning bid. Otherwise, the adpater will immediately fail with a "no ad" error and the next placement will instantiate the same adapter but for another custom properties. - -## Integrate Prebid Adapters +## Setup Prebid SDK is integrated into AppLovin MAX setup thru custom adapters. To integrate Prebid adapters into your app add the following line to your Podfile: -``` +```swift pod 'PrebidMobileMAXAdapters' ``` -## Banner API +## Adunit Specific Instructions + +### Banners Integration example: @@ -65,11 +53,10 @@ adUnit?.fetchDemand { [weak self] result in This step is the same as for the original [MAX integration](https://dash.applovin.com/documentation/mediation/ios/getting-started/banners#loading-a-banner). You don't have to make any modifications here. - #### Step 2: Create MAXMediationBannerUtils {:.no_toc} -The `MAXMediationBannerUtils ` is a helper class, which performs certain utilty work for the `MediationBannerAdUnit`, like passing the targeting keywords to the adapters and checking the visibility of the ad view. +The `MAXMediationBannerUtils` is a helper class, which performs certain utilty work for the `MediationBannerAdUnit`, like passing the targeting keywords to the adapters and checking the visibility of the ad view. #### Step 3: Create MediationBannerAdUnit {:.no_toc} @@ -86,7 +73,7 @@ The `fetchDemand` method makes a bid request to Prebid Server and provides a res Make a regular MAX's ad request. Everything else will be handled by prebid adapters. -## Interstitial API +### Interstitials Integration example: @@ -136,11 +123,10 @@ adUnit?.adFormats = [.banner] This step is the same as for the original [MAX integration](https://dash.applovin.com/documentation/mediation/ios/getting-started/interstitials). You don't have to make any modifications here. - #### Step 2: Create MAXMediationInterstitialUtils {:.no_toc} -The `MAXMediationInterstitialUtils` is a helper class, which performs certain utilty work for the `MediationInterstitialAdUnit `, like passing the targeting keywords to the adapters and checking the visibility of the ad view. +The `MAXMediationInterstitialUtils` is a helper class, which performs certain utilty work for the `MediationInterstitialAdUnit`, like passing the targeting keywords to the adapters and checking the visibility of the ad view. #### Step 3: Create MediationInterstitialAdUnit {:.no_toc} @@ -162,7 +148,7 @@ Now you should make a regular MAX's ad request. Everything else will be handled Once you receive the ad it will be ready for display. Follow the [MAX instructions](https://dash.applovin.com/documentation/mediation/ios/getting-started/interstitials#showing-an-interstitial-ad) for displaying an ad. -## Rewarded API +### Rewarded Video Integration example: @@ -195,7 +181,6 @@ To be notified when a user earns a reward follow the [MAX intructions](https://d This step is the same as for the original [MAX integration](https://dash.applovin.com/documentation/mediation/ios/getting-started/rewarded-ads). You don't have to make any modifications here. - #### Step 2: Create MAXMediationRewardedUtils {:.no_toc} @@ -221,7 +206,7 @@ Make a regular MAX's ad request. Everything else will be handled by GMA SDK and Once the rewarded ad is received you can display it. Follow the [MAX instructions](https://dash.applovin.com/documentation/mediation/ios/getting-started/rewarded-ads#showing-a-rewarded-ad) for the details. -## Native Ads +### Native Ads Integration example: @@ -277,7 +262,7 @@ The bid request for native ads should have the description of expected assets. T The example of creating the assets array: -``` +```swift let image = NativeAssetImage(minimumWidth: 200, minimumHeight: 50, required: true) image.type = ImageAsset.Main @@ -302,7 +287,7 @@ The bid request for mative ads may have a descrition of expected event trackers. The example of creating the event trackers array: -``` +```swift let eventTrackers = [ NativeEventTracker(event: EventType.Impression, methods: [EventTracking.Image,EventTracking.js]) @@ -318,3 +303,9 @@ The `fetchDemand` method makes a bid request to Prebid Server and provides a res {:.no_toc} Load a native ad from MAX according to the [MAX instructions](https://dash.applovin.com/documentation/mediation/ios/getting-started/native-manual#load-the-native-ad). + +## Further Reading + +- [Prebid Mobile Overview](/prebid-mobile/prebid-mobile) +- [Prebid SDK iOS Integration](/prebid-mobile/pbm-api/ios/code-integration-ios) +- [Prebid SDK iOS Global Parameters](/prebid-mobile/pbm-api/ios/pbm-targeting-ios) diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md b/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md index 16ce40ef90..5291655c9d 100644 --- a/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md +++ b/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md @@ -1,43 +1,50 @@ --- layout: page_v2 -title: Custom or No mediation -description: Integration of Prebid SDK without Primary Ad Server SDK +title: Prebid SDK iOS with a Custom Bidding Integration +description: Integration of iOS Prebid SDK in a special scenario sidebarType: 2 --- -# Custom Bidding Integration +# Prebid SDK iOS with a Custom Bidding Integration Method {:.no_toc} -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 {:toc} -## Transport API +{% include mobile/intro-custom.md platform='ios' %} + +## Rendering Approaches + +The code implementation details depend on which rendering approach you've chosen: + +- [Bidding Only](#bidding-only) +- [Prebid Rendered](#prebid-rendered) -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 additional bid information like Prebid Server bidder key/values (targeting keys), which can then be passed to the ad server of choice. +### Bidding Only -In this mode, the publisher will be responsible for the following actions: +While the default ad server for Prebid's Mobile SDK is GAM, it 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. -* Call the `fetchDemand` method with specific callback -* Retrieve targeting keys from the `BidInfo` callback parameter -* 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 +In this mode, the developer is responsible for the following actions: + +- Call the `fetchDemand()` method with specific callback +- Retrieve targeting keys from the `BidInfo` callback parameter +- 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 available 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` -* Multiformat ad unit via `PrebidAdUnit` +- 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` +- Multiformat ad unit via `PrebidAdUnit` -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: +The basic steps for these ad units you can find at the page for [GAM Bidding Only integration](/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 public func fetchDemand(adObject: AnyObject, request: PrebidRequest, @@ -58,13 +65,13 @@ adUnit.fetchDemand(adObject: gamRequest, request: prebidRequest) { [weak self] b The `BidInfo` provides the following properties: -* `resultCode` - the object of type `ResultCode` describing the status of the bid request. -* `targetingKeywords` - the targeting keywords of the winning bid -* `exp` - the number of seconds that may elapse between the auction and the actual impression. In this case, it indicates the approximate TTL of the bid in the Prebid Cache. Note that the actual expiration time of the bid will be less than this number due to the network and operational overhead. The Prebid SDK doesn't make any adjustments to this value. -* `nativeAdCacheId` - the local cache ID of the winning bid. Applied only to the `native` ad format. -* `events` - the map of some publically available event URLs attached to the bid. These can be used to enable Prebid Server-based analytics when the Prebid Universal Creative (PUC) is not involved in the rendering process. If the PUC is used for rendering, it will take care of hitting these events. These are the available event URLs: - * **EVENT_WIN** - this bid was chosen by the ad server as the one to display. This is the main metric for banner and native. This returns the OpenRTB `seatbid.bid.ext.prebid.events.win` field. (requires SDK v2.1.6) - * **EVENT_IMP** - the ad creative for this bid was actually displayed. This is often the main metric for video ads. This returns the OpenRTB `seatbid.bid.ext.prebid.events.imp` field. (requires SDK v2.1.6) +- `resultCode` - the object of type `ResultCode` describing the status of the bid request. +- `targetingKeywords` - the targeting keywords of the winning bid +- `exp` - the number of seconds that may elapse between the auction and the actual impression. In this case, it indicates the approximate TTL of the bid in the Prebid Cache. Note that the actual expiration time of the bid will be less than this number due to the network and operational overhead. The Prebid SDK doesn't make any adjustments to this value. +- `nativeAdCacheId` - the local cache ID of the winning bid. Applied only to the `native` ad format. +- `events` - the map of some publically available event URLs attached to the bid. These can be used to enable Prebid Server-based analytics when the Prebid Universal Creative (PUC) is not involved in the rendering process. If the PUC is used for rendering, it will take care of hitting these events. These are the available event URLs: + - **EVENT_WIN** - this bid was chosen by the ad server as the one to display. This is the main metric for banner and native. This returns the OpenRTB `seatbid.bid.ext.prebid.events.win` field. (requires SDK v2.1.6) + - **EVENT_IMP** - the ad creative for this bid was actually displayed. This is often the main metric for video ads. This returns the OpenRTB `seatbid.bid.ext.prebid.events.imp` field. (requires SDK v2.1.6) Code sample to extract the events: @@ -73,13 +80,13 @@ let win = bidInfo.events[BidInfo.EVENT_WIN] let imp = bidInfo.events[BidInfo.EVENT_IMP] ``` -## Rendering API +### Prebid Rendered -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. +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 +#### HTML Banner Integration example: @@ -95,33 +102,32 @@ banner.delegate = self banner.loadAd() ``` -#### Step 1: Create Ad View +##### Step 1: Create Ad View {:.no_toc} Initialize the `BannerAdView` with properties: -* `frame` - the frame rectangle for the view -* `configID` - an ID of the Stored Impression on the Prebid Server -* `size` - the size of the ad unit which will be used in the bid request. +- `frame` - the frame rectangle for the view +- `configID` - an ID of the Stored Impression on the Prebid Server +- `size` - the size of the ad unit which will be used in the bid request. -#### Step 2: Load the Ad +##### Step 2: Load the Ad {:.no_toc} Call the method `loadAd()` which will: -* make a bid request to the Prebid Server. -* render the winning bid on display. +- make a bid request to the Prebid Server. +- render the winning bid on display. -#### Outstream Video -{:.no_toc} +#### Banner Video (non-instream) -For **Banner Video** you also need to specify the ad format: +**Banner Video** is the same as HTML banner, but you also need to specify the ad format: ``` swift banner.adFormat = .video ``` -### Interstitial API +#### Interstitials Integration example: @@ -158,22 +164,22 @@ adUnit?.adFormats = [.banner] ``` -#### Step 1: Create an Ad Unit +##### Step 1: Create an Ad Unit {:.no_toc} 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. +- `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 banner ads. If provided space is not enough demand partners won't respond with the bids. -#### Step 2: Load the Ad +##### Step 2: Load the Ad {:.no_toc} Call the method `loadAd()` which will make a bid request to Prebid server. -#### Step 3: Show the Ad when it is ready +##### Step 3: Show the Ad when it is ready {:.no_toc} Wait until the ad will be loaded and present it to the user in any suitable time. @@ -186,7 +192,7 @@ func interstitialDidReceiveAd(_ interstitial: InterstitialRenderingAdUnit) { } ``` -### Rewarded API +#### Rewarded Video Integration example: @@ -206,19 +212,19 @@ if rewardedAd.isReady { } ``` -#### Step 1: Create Rewarded Ad Unit +##### Step 1: Create Rewarded Ad Unit {:.no_toc} Create the `RewardedAdUnit` object with parameter: -* `configID` - an ID of Stored Impression on the Prebid Server +- `configID` - an ID of Stored Impression on the Prebid Server -#### Step 2: Load the Ad +##### Step 2: Load the Ad {:.no_toc} Call the `loadAd()` method which will make a bid request to Prebid server. -#### Step 3: Show the Ad when it is ready +##### Step 3: Show the Ad when it is ready {:.no_toc} Wait until the ad will be loaded and present it to the user in any suitable time. @@ -230,3 +236,9 @@ func rewardedAdDidReceiveAd(_ rewardedAd: RewardedAdUnit) { // Now the ad is ready for display } ``` + +## Further Reading + +- [Prebid Mobile Overview](/prebid-mobile/prebid-mobile) +- [Prebid SDK iOS Integration](/prebid-mobile/pbm-api/ios/code-integration-ios) +- [Prebid SDK iOS Global Parameters](/prebid-mobile/pbm-api/ios/pbm-targeting-ios) 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 4484b2f197..9642040148 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 @@ -1,1485 +1,48 @@ --- layout: page_v2 -title: Prebid Mobile - GAM with Original API -description: Overview of Prebid Mobile API for Android -top_nav_section: prebid-mobile -nav_section: prebid-mobile +title: Prebid Mobile - GAM Bidding-Only Integration - Android +description: Integration of Prebid SDK Android With Google Ad Manager using the 'Bidding-Only' integration sidebarType: 2 --- -# Prebid Mobile with GAM (Original API) +# Prebid SDK Android with the GAM Bidding-Only Integration Method {:.no_toc} -Prebid Mobile is an open-source library that provides an end-to-end header bidding solution for mobile app publishers. - - TOC {:toc} -## Overview - -This is the original Prebid mobile integration approach when SDK plays the transport role, and the winning bid is rendered by the Primary Ad Server SDK using PUC. You can find details of how it works and other integration approaches on the [overview page](/prebid-mobile/prebid-mobile.html#with-ad-server-original-api). - -![In-App Bidding with Prebid](/assets/images/prebid-mobile/prebid-in-app-bidding-overview-prebid-original-gam.png) - -## 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: - -```kotlin -private fun createAd() { - - // 1. Create BannerAdUnit - adUnit = BannerAdUnit(CONFIG_ID, WIDTH, HEIGHT) - adUnit?.setAutoRefreshInterval(refreshTimeSeconds) - - // 2. Configure banner 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) - 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) - } -} -``` - -GAM ad view listener: - -```kotlin -private fun createGAMListener(adView: AdManagerAdView): AdListener { - return object : AdListener() { - override fun onAdLoaded() { - super.onAdLoaded() - - // 6. Resize ad view if needed - AdViewUtils.findPrebidCreativeSize(adView, object : AdViewUtils.PbFindSizeListener { - override fun success(width: Int, height: Int) { - adView.setAdSizes(AdSize(width, height)) - } - - override fun failure(error: PbFindSizeError) {} - }) - } - } -} -``` - -#### 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. - -#### Step 2: Configure banner parameters -{:.no_toc} - -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: - -- `3` or `Signals.Api.MRAID_1` : MRAID-1 support signal -- `5` or `Signals.Api.MRAID_2` : MRAID-2 support signal -- `6` or `Signals.Api.MRAID_3` : MRAID-3 support signal -- `7` or `Signals.Api.OMID_1` : signals OMSDK support - -#### Step 3: Create an AdManagerAdView -{:.no_toc} - -Follow the [GMA SDK documentation](https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner) to integrate a banner ad unit. - -#### Step 4: Make a bid request -{:.no_toc} - -The `fetchDemand` method makes a bid request to the Prebid Server. You should provide an `AdManagerAdRequest` object to this method so Prebid SDK sets the targeting keywords of the winning bid for future ad requests. - -#### Step 5: Load an Ad -{:.no_toc} - -You should now request the ad from GAM. If the `AdManagerAdRequest` 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 `AdManagerAdRequest` object that you passed to the `fetchDemand` method. Otherwise, the ad request won't contain the targeting keywords, and Prebid's ad won't ever be displayed. - -#### Step 6: 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's Prebid's ad and resize the ad slot respectively to the creative's properties. - -### Video Banner (Outstream Video) - -Integration example: - -```kotlin -private fun createAd() { - // 1. Create VideoAdUnit - adUnit = BannerAdUnit(CONFIG_ID, WIDTH, HEIGHT, EnumSet.of(AdUnitFormat.VIDEO)) - - // 2. Configure video ad unit - adUnit?.videoParameters = configureVideoParameters() - - // 3. Create AdManagerAdView - val gamView = AdManagerAdView(this) - gamView.adUnitId = AD_UNIT_ID - gamView.setAdSizes(AdSize(WIDTH, HEIGHT)) - gamView.adListener = createListener(gamView) - - adWrapperView.addView(gamView) - - // 4. Make an ad request - val request = AdManagerAdRequest.Builder().build() - adUnit?.fetchDemand(request) { - gamView.loadAd(request) - } -} -``` - -{: .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(): VideoParameters { - return VideoParameters(listOf("video/x-flv", "video/mp4")).apply { - api = listOf( - Signals.Api.VPAID_1, - Signals.Api.VPAID_2 - ) - - maxBitrate = 1500 - minBitrate = 300 - maxDuration = 30 - minDuration = 5 - playbackMethod = listOf(Signals.PlaybackMethod.AutoPlaySoundOn) - protocols = listOf( - Signals.Protocols.VAST_2_0 - ) - } -} -``` - -Setup ad listener: - -```kotlin -private fun createListener(gamView: AdManagerAdView): AdListener { - return object : AdListener() { - override fun onAdLoaded() { - AdViewUtils.findPrebidCreativeSize(gamView, object : PbFindSizeListener { - override fun success(width: Int, height: Int) { - gamView.setAdSizes(AdSize(width, height)) - } - - override fun failure(error: PbFindSizeError) {} - }) - } - } -} -``` - -#### Step 1: Create a BannerAdUnit with the video ad type -{:.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. -- `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 `BannerAdUnit`. - -{: .alert.alert-warning :} -Starting from PrebidMobile `2.1.0` the `VideoBaseAdUnit.Parameters` class is deprecated. Use `VideoParameters` instead. - -#### placement -{:.no_toc} - -[OpenRTB 2.5](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf) Placement Type for the auction can be expressed as an integer array or can use an enum for easier readability. Option 1 (in-stream) is intentionally left out due to lack of in-stream support in Prebid SDK. - -In the context of a VideoInterstitialAdUnit, rewarded video ads are typically labeled as interstitial. As such, Prebid SDK will default to value 5 if no placement value is supplied. - -- `2` or `InBanner` : In-Banner placement exists within a web banner that leverages the banner space to deliver a video experience as opposed to another static or rich media format. The format relies on the existence of display ad inventory on the page for its delivery. -- `3` or `InArticle` : In-Article placement loads and plays dynamically between paragraphs of editorial content; existing as a standalone branded message. -- `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} - -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: - -- `1` or `Signals.Api.VPAID_1` : VPAID 1.0 -- `2` or `Signals.Api.VPAID_2` : VPAID 2.0 -- `3` or `Signals.Api.MRAID_1` : MRAID-1 support signal -- `5` or `Signals.Api.MRAID_2` : MRAID-2 support signal -- `6` or `Signals.Api.MRAID_3` : MRAID-3 support signal -- `7` or `Signals.Api.OMID_1` : signals OMSDK support - -#### maxBitrate -{:.no_toc} - -Integer representing the OpenRTB 2.5 maximum bit rate in Kbps. - -#### minBitrate -{:.no_toc} - -Integer representing the OpenRTB 2.5 minimum bit rate in Kbps. - -#### maxDuration -{:.no_toc} - -Integer representing the OpenRTB 2.5 maximum video ad duration in seconds. - -#### minDuration -{:.no_toc} - -Integer representing the OpenRTB 2.5 minimum video ad duration in seconds. - -#### mimes -{:.no_toc} - -Array of strings representing the supported OpenRTB 2.5 content MIME types (e.g., “video/x-ms-wmv”, “video/mp4”). - -#### playbackMethod -{:.no_toc} - -Array of OpenRTB 2.5 playback methods. If none are specified, any method may be used. Only one method is typically used in practice. It is strongly advised to use only the first element of the array. - -- `1` or `Signals.PlaybackMethod.AutoPlaySoundOn` : Initiates on Page Load with Sound On -- `2` or `Signals.PlaybackMethod.AutoPlaySoundOff` : Initiates on Page Load with Sound Off by Default -- `3` or `Signals.PlaybackMethod.ClickToPlay` : Initiates on Click with Sound On -- `4` or `Signals.PlaybackMethod.MouseOver` : Initiates on Mouse-Over with Sound On -- `5` or `Signals.PlaybackMethod.EnterSoundOn` : Initiates on Entering Viewport with Sound On -- `6` or `Signals.PlaybackMethod.EnterSoundOff`: Initiates on Entering Viewport with Sound Off by Default - -#### protocols -{:.no_toc} - -Array or enum of OpenRTB 2.5 supported Protocols. Values can be one of: - -- `1` or `Signals.Protocols.VAST_1_0` : VAST 1.0 -- `2` or `Signals.Protocols.VAST_2_0` : VAST 2.0 -- `3` or `Signals.Protocols.VAST_3_0` : VAST 3.0 -- `4` or `Signals.Protocols.VAST_1_0_Wrapper` : VAST 1.0 Wrapper -- `5` or `Signals.Protocols.VAST_2_0_Wrapper` : VAST 2.0 Wrapper -- `6` or `Signals.Protocols.VAST_3_0_Wrapper` : VAST 3.0 Wrapper -- `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 an AdManagerAdView -{:.no_toc} - -Just follow the [GMA SDK documentation](https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner) to integrate a banner ad unit. - -#### Step 4: Make a bid request -{:.no_toc} - -The `fetchDemand` method makes a bid request to the Prebid Server. You should provide an `AdManagerAdRequest` object to this method so Prebid SDK sets the targeting keywords of the winning bid for future ad requests. - -#### Step 5: Load an Ad -{:.no_toc} - -You should now request the ad from GAM. If the `AdManagerAdRequest` 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 `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. - -### 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: - -```kotlin -private fun createAd() { - // 1. Create InterstitialAdUnit - adUnit = InterstitialAdUnit(CONFIG_ID, 80, 60) - - // 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, - createListner()) - } -} -``` - -You also need to implement `AdManagerInterstitialAdLoadCallback` in order to track the ad rediness: - -```kotlin -private fun createListner(): AdManagerInterstitialAdLoadCallback { - return object : AdManagerInterstitialAdLoadCallback() { - - override fun onAdLoaded(adManagerInterstitialAd: AdManagerInterstitialAd) { - super.onAdLoaded(adManagerInterstitialAd) - - // 4. Present the interstitial ad - adManagerInterstitialAd.show(this@GamOriginalApiDisplayInterstitialActivity) - } - - override fun onAdFailedToLoad(loadAdError: LoadAdError) { - super.onAdFailedToLoad(loadAdError) - Log.e("GAM", "Ad failed to load: $loadAdError") - } - } -} -``` - -#### Step 1: Create an InterstitialAdUnit -{:.no_toc} - -Initialize the Interstitial Ad Unit with 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 screen. Support in SDK version 1.2+ -- `minHeightPrec`: Optional parameter to specify the minimum height percent an ad may occupy of a device's screen. 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 screen, 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: Make a bid request -{:.no_toc} - -The `fetchDemand` method makes a bid request to the prebid server. You should provide an `AdManagerAdRequest` object to this method so Prebid SDK sets the targeting keywords of the winning bid for future ad requests. - -#### Step 3: Load a GAM interstitial ad -{:.no_toc} - -You should now request the ad from GAM. If the `AdManagerAdRequest` 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 `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. - -#### Step 4: Present the interstitial ad -{:.no_toc} - -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 +{% include mobile/intro-bidding-only.md platform='android' %} -Integration Example: - -```kotlin -private fun createAd() { - - // 1. Create InterstitialAdUnit - adUnit = InterstitialAdUnit(CONFIG_ID, EnumSet.of(AdUnitFormat.VIDEO)) - - // 2. Configure video ad unit - adUnit?.videoParameters = configureVideoParameters() - - // 3. Make a bid request to Prebid Server - val request = AdManagerAdRequest.Builder().build() - adUnit?.fetchDemand(request) { - - // 4. Load a GAM ad - AdManagerInterstitialAd.load( - this@GamOriginalApiVideoInterstitialActivity, - AD_UNIT_ID, - request, - createAdListener() - ) - } -} -``` - -{: .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(): VideoParameters { - return VideoParameters(listOf("video/x-flv", "video/mp4")).apply { - placement = Signals.Placement.Interstitial - - api = listOf( - Signals.Api.VPAID_1, - Signals.Api.VPAID_2 - ) - - maxBitrate = 1500 - minBitrate = 300 - maxDuration = 30 - minDuration = 5 - playbackMethod = listOf(Signals.PlaybackMethod.AutoPlaySoundOn) - protocols = listOf( - Signals.Protocols.VAST_2_0 - ) - } -} -``` - -GAM Ad Listener: - -```kotlin -private fun createAdListener(): AdManagerInterstitialAdLoadCallback { - return object : AdManagerInterstitialAdLoadCallback() { - override fun onAdLoaded(interstitialAd: AdManagerInterstitialAd) { - super.onAdLoaded(interstitialAd) - - // 5. Display an interstitial ad - interstitialAd.show(this@GamOriginalApiVideoInterstitialActivity) - } - - override fun onAdFailedToLoad(loadAdError: LoadAdError) { - super.onAdFailedToLoad(loadAdError) - Log.e("GAM", "Ad failed to load: $loadAdError") - } - } -} -``` - -#### 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` - AdUnitFormat.VIDEO for a video ad - -#### Step 2: Configure video parameters -{:.no_toc} - -Provide configuration properties for the video ad using the [VideoParameters](#step-2-configure-video-parameters) object. - -#### Step 3: Make a bid request -{:.no_toc} - -The `fetchDemand` method makes a bid request to the Prebid Server. You should provide an `AdManagerAdRequest` 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 -{:.no_toc} - -Now you should request the ad from GAM. If the `AdManagerAdRequest` 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 `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. - -#### Step 5: Present the interstitial ad -{:.no_toc} +## AdUnit-Specific instructions -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. +This section describes the integration details for different ad formats. In each scenario, you'll be asked for a `configId` - this is a key established in conjunction with your Prebid Server provider. It's used at runtime to pull in the bidders and parameters specific to this adunit. Depending on your Prebid Server partner, it may be a UUID or constructed out of parts like an account number and adunit name. -### Multiformat Interstitial (HTML + Video) +### [Format: HTML Banner](/prebid-mobile/recipes/subrecipes/android/gam-bidding-only-html-banner.html) -Integration example: +### [Format: Interstitial Banner](/prebid-mobile/recipes/subrecipes/android/gam-bidding-only-interstitial-banner.html) -```kotlin -// 1. Create InterstitialAdUnit -adUnit = InterstitialAdUnit(configId, EnumSet.of(AdUnitFormat.BANNER, AdUnitFormat.VIDEO)) -adUnit?.setMinSizePercentage(80, 60) -adUnit?.videoParameters = VideoParameters(listOf("video/mp4")) +### [Format: Instream Video](/prebid-mobile/recipes/subrecipes/android/gam-bidding-only-video-instream.html) -// 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: - -```kotlin -private fun createAd() { - // 1. Create RewardedVideoAdUnit - adUnit = RewardedVideoAdUnit(CONFIG_ID) - - // 2. Configure Video parameters - adUnit?.videoParameters = configureVideoParameters() - - // 3. Make a bid request to Prebid Server - val request = AdManagerAdRequest.Builder().build() - adUnit?.fetchDemand(request) { - - // 4. Load a GAM Rewarded Ad - RewardedAd.load( - this, - AD_UNIT_ID, - request, - createListener() - ) - } -} -``` - -Configure video ad unit: - -```kotlin -private fun configureVideoParameters(): VideoParameters { - return VideoParameters(listOf("video/mp4")).apply { - protocols = listOf(Signals.Protocols.VAST_2_0) - playbackMethod = listOf(Signals.PlaybackMethod.AutoPlaySoundOff) - } -} -``` - -Implement Rewarded ad listener: - -```kotlin -private fun createListener(): RewardedAdLoadCallback { - return object : RewardedAdLoadCallback() { - override fun onAdLoaded(rewardedAd: RewardedAd) { - - // 5. Display rewarded ad - rewardedAd.show( - this@GamOriginalApiVideoRewardedActivity - ) { } - } - - override fun onAdFailedToLoad(loadAdError: LoadAdError) { - Log.e("GAM", "Ad failed to load: $loadAdError") - } - } -} -``` - -### Step 1: Create an Ad Unit -{:.no_toc} - -Initialize the Rewarded Video Ad Unit with the following properties: - -- `configId` - an ID of Stored Impression on the Prebid Server - -### Step 2: Configure video parameters -{:.no_toc} - -Provide configuration properties for the video ad using the [VideoParameters](#step-2-configure-video-parameters) object. - -### Step 3: Make a bid request -{:.no_toc} - -The `fetchDemand` method makes a bid request to the Prebid Server. You should provide an `AdManagerAdRequest` object to this method so Prebid SDK sets the targeting keywords of the winning bid for future ad requests. - -### Step 4: Load a GAM Rewarded Ad -{:.no_toc} - -Now you should request the ad from GAM. If the `AdManagerAdRequest` 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 `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. - -### Step 5: Present the Rewarded Ad -{:.no_toc} - -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. - -## Instream Video API - -Integration example: - -```kotlin -private fun createAd() { - // 1. Create VideoAdUnit - adUnit = InStreamVideoAdUnit(CONFIG_ID, WIDTH, HEIGHT) - - // 2. Configure video parameters - adUnit?.videoParameters = configureVideoParameters() - - // 3. Init player view - playerView = PlayerView(this) - val params = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 600) - adWrapperView.addView(playerView, params) - - // 4. Make a bid request to Prebid Server - adUnit?.fetchDemand { _: ResultCode?, keysMap: Map? -> - - // 5. Prepare the creative URI - val sizes = HashSet() - sizes.add(AdSize(WIDTH, HEIGHT)) - val prebidURL = Util.generateInstreamUriForGam( - AD_UNIT_ID, - sizes, - keysMap - ) - - adsUri = Uri.parse(prebidURL) - - // 6. Init player - initializePlayer() - } -} -``` - -{: .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(): VideoParameters { - return VideoParameters(listOf("video/x-flv", "video/mp4")).apply { - placement = Signals.Placement.InStream - - api = listOf( - Signals.Api.VPAID_1, - Signals.Api.VPAID_2 - ) - - maxBitrate = 1500 - minBitrate = 300 - maxDuration = 30 - minDuration = 5 - playbackMethod = listOf(Signals.PlaybackMethod.AutoPlaySoundOn) - protocols = listOf( - Signals.Protocols.VAST_2_0 - ) - } -} -``` - -Init and run IMA player: - -```kotlin -private fun initializePlayer() { - - adsLoader = ImaAdsLoader.Builder(this).build() - - val playerBuilder = SimpleExoPlayer.Builder(this) - player = playerBuilder.build() - playerView!!.player = player - adsLoader!!.setPlayer(player) - - val uri = Uri.parse("https://storage.googleapis.com/gvabox/media/samples/stock.mp4") - - val mediaItem = MediaItem.fromUri(uri) - val dataSourceFactory: DataSource.Factory = DefaultDataSourceFactory(this, getString(R.string.app_name)) - val mediaSourceFactory = ProgressiveMediaSource.Factory(dataSourceFactory) - val mediaSource: MediaSource = mediaSourceFactory.createMediaSource(mediaItem) - val dataSpec = DataSpec(adsUri!!) - val adsMediaSource = AdsMediaSource( - mediaSource, dataSpec, "ad", mediaSourceFactory, - adsLoader!!, playerView!! - ) - player?.setMediaSource(adsMediaSource) - player?.playWhenReady = true - player?.prepare() -} -``` - -### Step 1: Create an Ad Unit -{:.no_toc} +### [Format: Non-Instream Video](/prebid-mobile/recipes/subrecipes/android/gam-bidding-only-video-outstream.html) -Initialize the VideoAdUnit with the following properties: +### [Format: Interstitial Video](/prebid-mobile/recipes/subrecipes/android/gam-bidding-only-interstitial-video.html) -- `configId` - an ID of Stored Impression on the Prebid Server -- `width` - Width of the video ad unit. -- `height` - Height of the video ad unit - -### Step 2: Configure the video parameters -{:.no_toc} - -Provide configuration properties for the video ad using the [VideoParameters](#step-2-configure-video-parameters) object. - -### Step 3: Prepare the Player -{:.no_toc} - -Create the instance of `PlayerView` and display it in the app UI. - -### Step 4: Make a bid request -{:.no_toc} - -The `fetchDemand` method makes a bid request to the Prebid Server. Use the methods which return the targeting map in the result closure. - -### Step 5: Generate GAM Instream URI -{:.no_toc} - -Using Prebid util method, generate Google IMA URI for downloading the cached creative from the winning bid. - -### Step 6: Cretae and init IMA player -{:.no_toc} - -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 API - -### Native Banner - -Integration example: - -```kotlin -private fun createAd() { - // 1. Create Ad unit - nativeAdUnit = NativeAdUnit(CONFIG_ID) - nativeAdUnit?.setContextType(NativeAdUnit.CONTEXT_TYPE.SOCIAL_CENTRIC) - nativeAdUnit?.setPlacementType(NativeAdUnit.PLACEMENTTYPE.CONTENT_FEED) - nativeAdUnit?.setContextSubType(NativeAdUnit.CONTEXTSUBTYPE.GENERAL_SOCIAL) - - // 2. Configure Native Assets and Trackers - addNativeAssets(nativeAdUnit) - - // 3. Create GAM Ad View - val gamView = AdManagerAdView(this) - gamView.adUnitId = AD_UNIT_ID - gamView.setAdSizes(AdSize.FLUID) - adWrapperView.addView(gamView) - - // 4. Make a bid request to Prebid Server - val request = AdManagerAdRequest.Builder().build() - nativeAdUnit?.fetchDemand(request) { - - // 5. Load a GAM Ad - gamView.loadAd(request) - } -} -``` - -Add native assets: - -```kotlin -private fun addNativeAssets(adUnit: NativeAdUnit?) { - // ADD ASSETS - - val title = NativeTitleAsset() - title.setLength(90) - title.isRequired = true - adUnit?.addAsset(title) - - val icon = NativeImageAsset(20, 20, 20, 20) - icon.imageType = NativeImageAsset.IMAGE_TYPE.ICON - icon.isRequired = true - adUnit?.addAsset(icon) - - val image = NativeImageAsset(200, 200, 200, 200) - image.imageType = NativeImageAsset.IMAGE_TYPE.MAIN - image.isRequired = true - adUnit?.addAsset(image) - - val data = NativeDataAsset() - data.len = 90 - data.dataType = NativeDataAsset.DATA_TYPE.SPONSORED - data.isRequired = true - adUnit?.addAsset(data) - - val body = NativeDataAsset() - body.isRequired = true - body.dataType = NativeDataAsset.DATA_TYPE.DESC - adUnit?.addAsset(body) - - val cta = NativeDataAsset() - cta.isRequired = true - cta.dataType = NativeDataAsset.DATA_TYPE.CTATEXT - adUnit?.addAsset(cta) - - // ADD EVENT TRACKERS - - val methods = ArrayList() - methods.add(NativeEventTracker.EVENT_TRACKING_METHOD.IMAGE) - - try { - val tracker = NativeEventTracker(NativeEventTracker.EVENT_TYPE.IMPRESSION, methods) - adUnit?.addEventTracker(tracker) - } catch (e: Exception) { - e.printStackTrace() - } -} -``` - -#### Step 1: Create a NativeAdUnit -{:.no_toc} - -Initialize the `NativeAdUnit` with properties: - -- `configId` - an ID of the Stored Impression on the Prebid Server - -#### Step 2: Add Native Assets and Event Trackers -{:.no_toc} - -In order to make a bid request for the native ads you should provide a description of native assets that should be present in the native bid response. Prebid SDK supports the following set of assets to request. - -- `NativeImageAsset` -- `NativeDataAsset` -- `NativeTitleAsset` - -#### Step 3: Create an AdManagerAdView -{:.no_toc} - -Follow the [GMA SDK documentation](https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner) to integrate a banner ad unit. - -#### Step 3: Make a bid request -{:.no_toc} - -The `fetchDemand` method makes a bid request to the Prebid Server. You should provide an `AdManagerAdRequest` object to this method so Prebid SDK sets the targeting keywords of the winning bid for future ad requests. - -#### Step 4: Load an Ad -{:.no_toc} - -Now you should request the ad from GAM. If the `AdManagerAdRequest` 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 `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 - -Visit the [AdOps guide](/adops/gam-native.html#create-mobile-in-app-creative) for instructions on setting up the In-App creatives on GAM. - -At a high level, the in-app workflow is happening the following way: - -1. The publisher prepares the ad layout and provides the native ad configuration to the SDK's ad unit. -2. Prebid SDK fetches native demand. However, instead of caching the native assets on the server, the assets are cached locally in the SDK. -3. Ad request are made to Google Ad Manager. -4. Upon receiving results from Google Ad Manager, the SDK determines if any of the received items are from Prebid Server. -5. If there are Prebid ads, the cached assets are then rendered. - -{% capture importantNote %} -The cached assets might expire. If this occurs the publisher will receive a notification and they will have to fetch the assets again. -{% endcapture %} - -#### Integration Example -{:.no_toc} - -```kotlin -private fun createAd() { - // 1. Create NativeAdUnit - adUnit = NativeAdUnit(CONFIG_ID); - adUnit?.setContextType(NativeAdUnit.CONTEXT_TYPE.SOCIAL_CENTRIC) - adUnit?.setPlacementType(NativeAdUnit.PLACEMENTTYPE.CONTENT_FEED) - adUnit?.setContextSubType(NativeAdUnit.CONTEXTSUBTYPE.GENERAL_SOCIAL) - - // 2. Add native assets and trackers - addNativeAssets(adUnit) - - // 3. Make a bid request to Prebid Server - val adRequest = AdManagerAdRequest.Builder().build() - adUnit?.fetchDemand(adRequest) { - - // 4. Load a GAM Native Ad - adLoader = createAdLoader(adWrapperView) - adLoader?.loadAd(adRequest) - } -} -``` - -Add native assets: - -```kotlin -private fun addNativeAssets(adUnit: NativeAdUnit?) { - // ADD NATIVE ASSETS - - val title = NativeTitleAsset() - title.setLength(90) - title.isRequired = true - adUnit?.addAsset(title) - - val icon = NativeImageAsset(20, 20, 20, 20) - icon.imageType = NativeImageAsset.IMAGE_TYPE.ICON - icon.isRequired = true - adUnit?.addAsset(icon) - - val image = NativeImageAsset(200, 200, 200, 200) - image.imageType = NativeImageAsset.IMAGE_TYPE.MAIN - image.isRequired = true - adUnit?.addAsset(image) - - val data = NativeDataAsset() - data.len = 90 - data.dataType = NativeDataAsset.DATA_TYPE.SPONSORED - data.isRequired = true - adUnit?.addAsset(data) - - val body = NativeDataAsset() - body.isRequired = true - body.dataType = NativeDataAsset.DATA_TYPE.DESC - adUnit?.addAsset(body) - - val cta = NativeDataAsset() - cta.isRequired = true - cta.dataType = NativeDataAsset.DATA_TYPE.CTATEXT - adUnit?.addAsset(cta) - - // ADD NATIVE EVENT TRACKERS - val methods = ArrayList() - methods.add(EVENT_TRACKING_METHOD.IMAGE) - methods.add(EVENT_TRACKING_METHOD.JS) - try { - val tracker = NativeEventTracker(NativeEventTracker.EVENT_TYPE.IMPRESSION, methods) - adUnit?.addEventTracker(tracker) - } catch (e: Exception) { - e.printStackTrace() - } -} -``` - -Prepare Native Ad Loader - -```kotlin -private fun createAdLoader(wrapper: ViewGroup): AdLoader? { - val onGamAdLoaded = OnAdManagerAdViewLoadedListener { adManagerAdView: AdManagerAdView -> - Log.d(TAG, "Gam loaded") - adView = adManagerAdView - wrapper.addView(adManagerAdView) - } - - val onUnifiedAdLoaded = OnNativeAdLoadedListener { unifiedNativeAd: NativeAd? -> - Log.d(TAG, "Unified native loaded") - this.unifiedNativeAd = unifiedNativeAd - } - - val onCustomAdLoaded = OnCustomFormatAdLoadedListener { nativeCustomTemplateAd: NativeCustomFormatAd? -> - Log.d(TAG, "Custom ad loaded") - - // 5. Find Prebid Native Ad - AdViewUtils.findNative(nativeCustomTemplateAd!!, object : PrebidNativeAdListener { - override fun onPrebidNativeLoaded(ad: PrebidNativeAd) { - - // 6. Render native ad - inflatePrebidNativeAd(ad, wrapper) - } - - override fun onPrebidNativeNotFound() { - Log.e(TAG, "onPrebidNativeNotFound") - } - - override fun onPrebidNativeNotValid() { - Log.e(TAG, "onPrebidNativeNotValid") - } - }) - } - - return AdLoader.Builder(wrapper.context, AD_UNIT_ID) - .forAdManagerAdView(onGamAdLoaded, AdSize.BANNER) - .forNativeAd(onUnifiedAdLoaded) - .forCustomFormatAd( - CUSTOM_FORMAT_ID, onCustomAdLoaded - ) { customAd: NativeCustomFormatAd?, s: String? -> } - .withAdListener(object : AdListener() { - override fun onAdFailedToLoad(loadAdError: LoadAdError) { - super.onAdFailedToLoad(loadAdError) - Log.e(TAG, "DFP onAdFailedToLoad") - } - }) - .build() -} -``` - -Render a native ad: - -```kotlin -private fun inflatePrebidNativeAd(ad: PrebidNativeAd, wrapper: ViewGroup) { - val nativeContainer = View.inflate(wrapper.context, R.layout.layout_native, null) - - val icon = nativeContainer.findViewById(R.id.imgIcon) - ImageUtils.download(ad.iconUrl, icon) - - val title = nativeContainer.findViewById(R.id.tvTitle) - title.text = ad.title - - val image = nativeContainer.findViewById(R.id.imgImage) - ImageUtils.download(ad.imageUrl, image) - - val description = nativeContainer.findViewById(R.id.tvDesc) - description.text = ad.description - - val cta = nativeContainer.findViewById

  • 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

  • - -## Features - -We recommend you review the [feature comparison list](/prebid-server/features/pbs-feature-idx.html) to familiarize yourself with the differences between this and PBS-Java in deciding which version is right for you. - ## Code Repositories - [Prebid Server - Go](https://github.com/prebid/prebid-server) @@ -45,5 +40,6 @@ important architectural considerations, then follow the instructions for [Instal - [Building an Analytics Adapter](/prebid-server/developers/pbs-build-an-analytics-adapter.html#adding-an-analytics-adapter-in-pbs-go) ## See Also + - [Prebid Server - Java](/prebid-server/versions/pbs-versions-java.html) - [Endpoint reference](/prebid-server/endpoints/pbs-endpoint-overview.html) diff --git a/prebid-server/versions/pbs-versions-java.md b/prebid-server/versions/pbs-versions-java.md index 9b4f044875..696ba4d395 100644 --- a/prebid-server/versions/pbs-versions-java.md +++ b/prebid-server/versions/pbs-versions-java.md @@ -10,7 +10,11 @@ title: Prebid Server | Versions | Java
    -The Java version of Prebid Server is for those who prefer the Java language. +The Java version of Prebid Server is for those who: +
    @@ -20,10 +24,6 @@ The Java version of Prebid Server is for those who prefer the Java language.
    -## Features - -We recommend you review the [feature comparison list](/prebid-server/features/pbs-feature-idx.html) to familiarize yourself with the differences between this and PBS-Go in deciding which version is right for you. - ## Code Repositories - [Prebid Server - Java](https://github.com/prebid/prebid-server-java) From 2b65d0b411f3a9eaf615a64c978c706319feb712 Mon Sep 17 00:00:00 2001 From: Muki Seiler Date: Thu, 7 Nov 2024 18:08:55 +0100 Subject: [PATCH 282/816] Use relative links in humansecurityRtdProvider (#5681) --- dev-docs/modules/humansecurityRtdProvider.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/modules/humansecurityRtdProvider.md b/dev-docs/modules/humansecurityRtdProvider.md index 9533da6463..b13f4f09a7 100644 --- a/dev-docs/modules/humansecurityRtdProvider.md +++ b/dev-docs/modules/humansecurityRtdProvider.md @@ -54,7 +54,7 @@ gulp build --modules="rtdModule,humansecurityRtdProvider,..." ## Configuration This module is configured as part of the `realTimeData.dataProviders` object. -Please refer to [Prebid Documentation](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html#setConfig-realTimeData) +Please refer to [Prebid Documentation](/dev-docs/publisher-api-reference/setConfig.html#setConfig-realTimeData) on RTD module configuration for details on required and optional parameters of `realTimeData`. By default, using this submodule *does not require any prior communication with HUMAN, nor any special configuration*, @@ -105,7 +105,7 @@ of type `ERROR`. With `verbose` parameter set to `true`, it may additionally: * Call `logWarning`, resulting in `auctionDebug` events of type `WARNING`, * Call `logInfo` with latency information. * To observe these messages in console, Prebid.js must be run in - [debug mode](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html#debugging) - + [debug mode](/dev-docs/publisher-api-reference/setConfig.html#debugging) - either by adding `?pbjs_debug=true` to your page's URL, or by configuring with `pbjs.setConfig({ debug: true });` Example output of the latency information: From 0ba97f914ce74ca7309b9e5ddf0f31578945b513 Mon Sep 17 00:00:00 2001 From: Scott Sundahl <37344964+ssundahlTTD@users.noreply.github.com> Date: Thu, 7 Nov 2024 10:22:31 -0700 Subject: [PATCH 283/816] client side documentation for uid2 and euid (#5682) * client side documentation for uid2 and euid * too many blank lines * too few blank lines * too few blank lines * Update unified2.md --------- Co-authored-by: bretg --- dev-docs/modules/userId.md | 2 +- dev-docs/modules/userid-submodules/euid.md | 4 ++++ dev-docs/modules/userid-submodules/unified2.md | 7 ++++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md index 200b39ad95..ba4c2c7168 100644 --- a/dev-docs/modules/userId.md +++ b/dev-docs/modules/userId.md @@ -159,7 +159,7 @@ It is possible for a user id submodule to populate several identifiers including This can be configured inside the `userSync` object in the following manner: -Let's say that the UID2 token populated by the trade desk user id submodule has the value 'uid2_value' and the UID2 token populated by Liveintent user id module has the value 'liveIntentUid2_value' (The actual identifiers populated in this case should be one and the same however the values are written differently in order to help the reader understand the source from which the identifiers get picked up from) +Let's say that the UID2 token populated by the UID2 user ID submodule has the value 'uid2_value' and the UID2 token populated by Liveintent user id module has the value 'liveIntentUid2_value' (The actual identifiers populated in this case should be one and the same however the values are written differently in order to help the reader understand the source from which the identifiers get picked up from) ```javascript "userSync": { diff --git a/dev-docs/modules/userid-submodules/euid.md b/dev-docs/modules/userid-submodules/euid.md index 7551b53fa0..0af066aa9e 100644 --- a/dev-docs/modules/userid-submodules/euid.md +++ b/dev-docs/modules/userid-submodules/euid.md @@ -146,6 +146,10 @@ pbjs.setConfig({ }); ``` +## European Unified ID Client Side Integration for Prebid.js + +Prebid.js supports fully client side integration for EUID. See the [official EUID documentation](https://euid.eu/docs/guides/integration-prebid) for the most up-to-date integration instructions. + ## European Unified ID Configuration The following parameters apply only to the European Unified ID module integration. diff --git a/dev-docs/modules/userid-submodules/unified2.md b/dev-docs/modules/userid-submodules/unified2.md index c61b98bec0..5a6f105f0d 100644 --- a/dev-docs/modules/userid-submodules/unified2.md +++ b/dev-docs/modules/userid-submodules/unified2.md @@ -18,8 +18,9 @@ gulp build --modules=uid2IdSystem 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 [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. +- Include the module to your Prebid.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. 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. +- Use UID2 Client Side Integration with Prebid.js Each publisher’s privacy policy should take UnifiedID 2.0 into account. @@ -61,6 +62,10 @@ For a server-side integration, you can create a smaller Prebid.js build by disab gulp build --modules=uid2IdSystem --disable UID2_CSTG ``` +## Unified ID 2.0 Client Side Integration for Prebid.js + +Prebid.js supports fully client side integration for UID2. See the [official UID2 documentation](https://unifiedid.com/docs/guides/integration-prebid-client-side) for the most up-to-date integration instructions. + ## Unified ID 2.0 Configuration The following parameters apply only to the Unified ID 2.0 module integration. From ded35de2b7c886dea342598ebc1ca4b5f0b3efbf Mon Sep 17 00:00:00 2001 From: mkomorski Date: Mon, 11 Nov 2024 22:47:58 +0100 Subject: [PATCH 284/816] dup removal (#5698) Co-authored-by: Marcin Komorski --- prebid-video/video-overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prebid-video/video-overview.md b/prebid-video/video-overview.md index 69eb164f9a..aed5c0c799 100644 --- a/prebid-video/video-overview.md +++ b/prebid-video/video-overview.md @@ -14,7 +14,7 @@ sidebarType: 4 - TOC {:toc} -Prebid.js provides tools that allow header bidding video demand to compete with your ad server video demand. Prebid.js provides tools that allow header bidding video demand to compete with your ad server video demand. Prebid video demand can be incorporated through the in-player and [in-renderer](/overview/glossary#renderer) integration. +Prebid.js provides tools that allow header bidding video demand to compete with your ad server video demand. Prebid video demand can be incorporated through the in-player and [in-renderer](/overview/glossary#renderer) integration. **Note!** Learn more about mapping out IAB use cases with the Prebid implementation specs on the [Prebid Video Ads](/formats/video) page. From 007040f3a72c8ec8beb42807899b61e247474a10 Mon Sep 17 00:00:00 2001 From: IrinLen <166819146+IrinLen@users.noreply.github.com> Date: Tue, 12 Nov 2024 09:55:08 +0200 Subject: [PATCH 285/816] Video module page - minor update (#5678) * change video module - section 1 * adding links - section 1 * in-renderer link added * in-player integration (formerly: instream) changes * in-renderer integration (formerly: outstream) updates * 1st part updates * map-out of Prebid integrations w/ IAB plcmt types * map-out in a form of a table * instream section update * outstream section updates * 2 links to overview page updated * 2 links to overview page updated * added space for better table headline formatting * removed part of headline * space added (formatting issue fix) * code text formatting fix * list fix * minor unordered list fix * removed empty line * extra spaces between sentences removed * Update formats/video.md Co-authored-by: Muki Seiler * Update formats/video.md Co-authored-by: Muki Seiler * Update formats/video.md Co-authored-by: Muki Seiler * Update prebid-video/video-getting-started.md Co-authored-by: Muki Seiler * Update prebid-video/video-getting-started.md Co-authored-by: Muki Seiler * Update prebid-video/video-overview.md Co-authored-by: Muki Seiler * Relative link without html * Relative link without html * Relative link without html * Relative link without html * Relative link without html * Relative link without html * Relative link without html * Relative link without html * 1st paragraph - 2nd sentence removed --------- Co-authored-by: Muki Seiler --- prebid-video/video-module.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prebid-video/video-module.md b/prebid-video/video-module.md index 5e620ba081..6eaa818b4e 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. The Video Module will allow Prebid.js to automatically: From e48deef89f68caafe8a8f16e10b19f09187896db Mon Sep 17 00:00:00 2001 From: Jeff Mahoney Date: Tue, 12 Nov 2024 09:07:22 -0500 Subject: [PATCH 286/816] Equativ bid adapter documentation (#5696) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * SADR-6590: initial documentation for Equativ JS bid adapter * SADR-6590: doc refinements * Update equativ.md SADR-6590: adjustments to doc from review feedback. * SADR-6590: fix linting issues * SADR-6590: another linting issue * update app.publisher.id * SADR-6590: providing link to Equativ OpenRTB API documentation * SADR-6590: providing additional required fields for documentation * SADR-6590: adding peer answers to questions * SADR-6590: remove FPD section for now --------- Co-authored-by: Krzysztof Sokół --- dev-docs/bidders/equativ.md | 178 ++++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 dev-docs/bidders/equativ.md diff --git a/dev-docs/bidders/equativ.md b/dev-docs/bidders/equativ.md new file mode 100644 index 0000000000..ffa7dfb630 --- /dev/null +++ b/dev-docs/bidders/equativ.md @@ -0,0 +1,178 @@ +--- +layout: bidder +title: Equativ +description: Prebid Equativ Bidder Adapter +biddercode: equativ +tcfeu_supported: true +dsa_supported: true +gvl_id: 45 +usp_supported: true +coppa_supported: true +gpp_sids: tcfeu, usp +schain_supported: true +dchain_support: false +userIds: all +media_types: banner +safeframes_ok: true +deals_supported: false +floors_supported: true +fpd_supported: false +pbjs: true +pbs: true +prebid_member: false +multiformat_supported: will-bid-on-one +ortb_blocking_supported: true +privacy_sandbox: no +sidebarType: 1 +--- + +### Registration + +The Equativ bidder adapter requires setup and approval from the Equativ service team. Please reach out to your account manager for more information to start using it. + +### Bid params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|------|-------|-------------|---------|------| +| `networkId` | required | The network identifier you have been provided with. _See **Bid Parameter Usage** notes below for more information_. | `1234` | `integer` | +| `siteId` | required | The placement site ID. _See **Bid Parameter Usage** notes below for more information_. |`1234` | `integer` | +| `pageId` | required | The placement page ID. _See **Bid Parameter Usage** notes below for more information_. | `1234` | `integer` | +| `formatId` | required | The placement format ID. _See **Bid Parameter Usage** notes below for more information_. | `1234` | `integer` | + +#### Bid Parameter Usage + +Different combinations of parameters are required depending upon which ones you choose to use. + +There are three options for passing bidder parameters: + +- **Option 1**. Specify `networkId` by itself (_without_ `siteId`, `pageId` and `formatId`), or +- **Option 2**. Specify `siteId` _and_ `pageId` _and_ `formatId` (all together) _without_ `networkId`, or +- **Option 3**. Specify _none_ of the above parameters, and instead use either `ortb2.site.publisher.id`, `ortb2.app.publisher.id` or `ortb2.dooh.publisher.id` + +See **Sample Banner Setup** for examples of these parameter options. + +### Supported Media Types + +{: .table .table-bordered .table-striped } +| Type | Support | +|---|---| +| `banner` | Supported | +| `video` | Not currently supported | +| `native` | Not currently supported | + +### User Syncing + +To enable cookie syncing, make sure their configuration setup is properly invoked. + +This involves adding an entry for `setConfig()` that allows user syncing for iframes with `'equativ'` included as a bidder: + +```js +pbjs.setConfig({ + userSync: { + filterSettings: { + iframe: { + bidders: ['equativ'], + }, + }, + }, +}); +``` + +And also making sure that storage is enabled for `equativ`: + +```js +pbjs.bidderSettings = { + equativ: { + storageAllowed: true, + }, +}; +``` + +### Configuration Example + +#### Sample Banner Setup + +As mentioned in the **Bid Parameter Usage** section, when including `'equativ'` as one of your available bidders your adunit setup, there are three general approaches to how you can specify parameters. Below are examples that illustrate them. + +#### Option 1 -- Using networkId as the only bid param + +```html + +``` + +#### Option 2 - Using siteId, pageId and formatId as bid params + +```html + +``` + +#### Option 3 - Using ortb2 for parameter info + +You can also, as an alternative to using bidder params, specify a value for `publisher.id` that may be nested under an `app`, `site` or `dooh` object. The Equativ adapter will, in turn, look for these property paths under the `ortb2` property of the request: + +- `ortb2.app.publisher.id` +- `ortb2.site.publisher.id` +- `ortb2.dooh.publisher.id` + +### Additional Resources + +Information about how Equativ supports the oRTB specification, along with additional examples, can be found [on our OpenRTB API support site](https://help.smartadserver.com/s/article/OpenRTB-API-for-suppliers-Bid-request-specification-Part-1). From 8e8bd7e9de1ac8ac8b4aab1cc293b5d76602fc2a Mon Sep 17 00:00:00 2001 From: DimaIntentIQ <139111483+DimaIntentIQ@users.noreply.github.com> Date: Tue, 12 Nov 2024 16:11:16 +0200 Subject: [PATCH 287/816] IntentIq ID & Analytics Modules: update documentation (#5669) * update documentation * White space fixes * Apply suggestions from code review Co-authored-by: bretg * Add example and link to Universal ID configuration --------- Co-authored-by: bretg --- dev-docs/analytics/intentiq.md | 75 +++++++++++++++++++ .../modules/userid-submodules/intentiq.md | 25 ++++--- 2 files changed, 88 insertions(+), 12 deletions(-) diff --git a/dev-docs/analytics/intentiq.md b/dev-docs/analytics/intentiq.md index a7aca70be8..d56f2f7069 100644 --- a/dev-docs/analytics/intentiq.md +++ b/dev-docs/analytics/intentiq.md @@ -26,3 +26,78 @@ pbjs.enableAnalytics({ provider: 'iiqAnalytics' }); ``` + +### Manual Report Trigger with reportExternalWin + +The reportExternalWin function allows for manual reporting, meaning that reports will not be sent automatically but only when triggered manually. + +To enable this manual reporting functionality, you must set the manualWinReportEnabled parameter in Intent IQ Unified ID module configuration is true. Once enabled, reports can be manually triggered using the reportExternalWin function. + +```js +pbjs.setConfig({ + userSync: { + userIds: [{ + name: "intentIqId", + params: { + partner: 123456, // valid partner id + browserBlackList: "chrome", + manualWinReportEnabled: true + } + }] + } +}); +``` + +You can find more information and configuration examples in the [Intent IQ Universal ID module](https://docs.prebid.org/dev-docs/modules/userid-submodules/intentiq.html#configuration) + +### Calling the reportExternalWin Function + +To call the reportExternalWin function, you need to pass the partner_id parameter as shown in the example below: + +```js +window.intentIqAnalyticsAdapter_[partner_id].reportExternalWin(reportData) +``` + +Example use with Partner ID = 123455 + +```js +window.intentIqAnalyticsAdapter_123455.reportExternalWin(reportData) +``` + +### Function Parameters + +The reportExternalWin function takes an object containing auction win data. Below is an example of the object: + +```js +var reportData = { +biddingPlatformId: 1, // Platform ID. The value 1 corresponds to PreBid. +partnerAuctionId: '[YOUR_AUCTION_ID_IF_EXISTS]', // Auction ID, if available. +bidderCode: 'xxxxxxxx', // Bidder code. +prebidAuctionId: '3d4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8e', // PreBid auction ID. +cpm: 1.5, // Cost per thousand impressions (CPM). +currency: 'USD', // Currency for the CPM value. +originalCpm: 1.5, // Original CPM value. +originalCurrency: 'USD', // Original currency. +status: 'rendered', // Auction status, e.g., 'rendered'. +placementId: 'div-1' // ID of the ad placement. +} +``` + +| Field | Data Type | Description | Example | Mandatory | +|--------------------|-----------|--------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------|-----------| +| biddingPlatformId | Integer | Specify the platform in which this ad impression was rendered – 1 – Prebid, 2 – Amazon, 3 – Google, 4 – Open RTB (including your local Prebid server) | 1 | Yes | +| partnerAuctionId | String | Use this when you are running multiple auction solutions across your assets and have a unified identifier for auctions | 3d44542d-xx-4662-xxxx-4xxxx3d8e | No | +| bidderCode | String | Specifies the name of the bidder that won the auction as reported by Prebid and all other bidding platforms | newAppnexus | Yes | +| prebidAuctionId | String | Specifies the identifier of the Prebid auction. Leave empty or undefined if Prebid is not the bidding platform | | | +| cpm | Decimal | Cost per mille of the impression as received from the demand-side auction (without modifications or reductions) | 5.62 | Yes | +| currency | String | Currency of the auction | USD | Yes | +| originalCpm | Decimal | Leave empty or undefined if Prebid is not the bidding platform | 5.5 | No | +| originalCurrency | String | Currency of the original auction | USD | No | +| status | String | Status of the impression. Leave empty or undefined if Prebid is not the bidding platform | rendered | No | +| placementId | String | Unique identifier of the ad unit on the webpage that showed this ad | div-1 | No | + +To report the auction win, call the function as follows: + +```js +window.intentIqAnalyticsAdapter_[partner_id].reportExternalWin(reportData) +``` diff --git a/dev-docs/modules/userid-submodules/intentiq.md b/dev-docs/modules/userid-submodules/intentiq.md index 58928999a9..808af664a6 100644 --- a/dev-docs/modules/userid-submodules/intentiq.md +++ b/dev-docs/modules/userid-submodules/intentiq.md @@ -30,17 +30,17 @@ We recommend including the Intent IQ Analytics adapter module for improved visib Please find below list of parameters that could be used in configuring Intent IQ Universal ID module {: .table .table-bordered .table-striped } - -| 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.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.callback | Required | Function | This is a callback which is trigered with data and AB group | `(data, group) => console.log({ data, group })` | -| params.timeoutInMillis | Optional | Number | This is the timeout in milliseconds, which defines the maximum duration before the callback is triggered. The default value is 500. | `450` | -| params.browserBlackList | Optional |  String | This is the name of a browser that can be added to a blacklist. | `"chrome"` | +| 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.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.callback | Required | Function | This is a callback which is trigered with data and AB group | `(data, group) => console.log({ data, group })` | +| params.timeoutInMillis | Optional | Number | This is the timeout in milliseconds, which defines the maximum duration before the callback is triggered. The default value is 500. | `450` | +| params.browserBlackList | Optional |  String | This is the name of a browser that can be added to a blacklist. | `"chrome"` | +| params.manualWinReportEnabled | Optional | Boolean | This variable determines whether the bidWon event is triggered automatically. If set to false, the event will occur automatically, and manual reporting with reportExternalWin will be disabled. If set to true, the event will not occur automatically, allowing manual reporting through reportExternalWin. The default value is false. | `true`| ### Configuration example @@ -53,7 +53,8 @@ pbjs.setConfig({ partner: 123456, // valid partner id timeoutInMillis: 500, browserBlackList: "chrome", - callback: (data, group) => window.pbjs.requestBids() + callback: (data, group) => window.pbjs.requestBids(), + manualWinReportEnabled: true }, storage: { type: "html5", From 4e735711bedb246ec01f4ddce6d10de83783d3a1 Mon Sep 17 00:00:00 2001 From: Saar Amrani Date: Tue, 12 Nov 2024 17:41:37 +0200 Subject: [PATCH 288/816] Add Exco bidder documentation (#5652) * Add Exco bidder documentation * Add GVLID and remove redundant * Refactor Exco bidder documentation formatting. * Refactor Exco bidder documentation formatting. --- dev-docs/bidders/exco.md | 71 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 dev-docs/bidders/exco.md diff --git a/dev-docs/bidders/exco.md b/dev-docs/bidders/exco.md new file mode 100644 index 0000000000..7727633f50 --- /dev/null +++ b/dev-docs/bidders/exco.md @@ -0,0 +1,71 @@ +--- +layout: bidder +title: Exco +description: Prebid Exco Bidder Adaptor +biddercode: exco +filename: excoBidAdapter +userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId +tcfeu_supported: true +gvl_id: 444 +usp_supported: true +coppa_supported: false +schain_supported: true +gpp_supported: true +floors_supported: true +media_types: banner, video +prebid_member: false +safeframes_ok: false +deals_supported: false +pbs_app_supported: false +fpd_supported: false +ortb_blocking_supported: false +multiformat_supported: will-bid-on-one +pbjs: true +sidebarType: 1 +--- + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|------------|----------|-------------------------------------------------------------------------------------------|------------------------------|----------| +| `cId` | required | The connection ID from Exco. | `'562524b21b1c1f08117fc7f9'` | `string` | +| `pId` | required | The publisher ID from Exco. | `'59ac17c192832d0011283fe3'` | `string` | +| `bidFloor` | optional | The minimum bid value desired. Exco 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: 'exco', + 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: 'exco', + filter: 'include' + } + } + } +}); +``` From 127d2ba1568ed7405a869de71fb5421d98fe4e6f Mon Sep 17 00:00:00 2001 From: Gena Date: Tue, 12 Nov 2024 19:56:59 +0100 Subject: [PATCH 289/816] Remove confusing quotes (#5697) --- dev-docs/bidmatic.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidmatic.md b/dev-docs/bidmatic.md index 34b8042518..d16387e291 100644 --- a/dev-docs/bidmatic.md +++ b/dev-docs/bidmatic.md @@ -1,6 +1,6 @@ --- layout: bidder -title: Bidmatic Bid Adapter +title: Bidmatic description: Prebid example Bidder Adapter biddercode: bidmatic tcfeu_supported: true @@ -11,7 +11,7 @@ coppa_supported: true gpp_sids: tcfeu, usp schain_supported: true dchain_supported: false -userId: all +userId: all (with commercial activation) media_types: banner, video safeframes_ok: true deals_supported: false From 00393c02fea91bfb6e83c825684c5f8cd86ae4c0 Mon Sep 17 00:00:00 2001 From: Gabriel Chicoye Date: Wed, 13 Nov 2024 14:19:29 +0100 Subject: [PATCH 290/816] Add Easybid Bidder docs (#5691) * easybid added * Update dev-docs/bidders/easybid.md Co-authored-by: bretg * Update tcfeu_supported --------- Co-authored-by: Gabriel Chicoye Co-authored-by: bretg --- dev-docs/bidders/easybid.md | 120 ++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 dev-docs/bidders/easybid.md diff --git a/dev-docs/bidders/easybid.md b/dev-docs/bidders/easybid.md new file mode 100644 index 0000000000..7f1ca702bd --- /dev/null +++ b/dev-docs/bidders/easybid.md @@ -0,0 +1,120 @@ +--- +layout: bidder +title: Easybid +description: Prebid Easybid Bidder Adapter +pbjs: true +biddercode: easybid +gvl_id: 1068 +tcfeu_supported: true +usp_supported: true +gpp_supported: true +schain_supported: true +dchain_supported: false +floors_supported: true +userIds: all +tcfeu_supported: true +media_types: banner, video, native +safeframes_ok: true +deals_supported: true +sidebarType: 1 +fpd_supported: true + +--- + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|----------------------------|-------------------------------------- |-----------| +| `tagId` | required | tag ID | `"testeasy"` | `string` | + +### First Party Data + +Publishers should use the `ortb2` method of setting [First Party Data](/features/firstPartyData.html). +The following fields are supported: + +* ortb2.site.ext.data.* +* ortb2.site.content.data[] +* ortb2.user.ext.data.* +* ortb2.user.data[] + +### Test Parameters + +```javascript +var adUnits = [ + // Banner adUnit + { + code: 'banner-div', + mediaTypes: { + banner: { + sizes: [[300, 250], [300,600]] + } + }, + bids: [{ + bidder: 'easybid', + params: { + tagId: 'testeasy' + } + }] + }, + // Video adUnit + { + code: 'video1', + mediaTypes: { + video: { + playerSize: [640, 480], + context: 'instream' + } + }, + bids: [{ + bidder: 'easybid', + params: { + tagId: 'testeasy' + } + }] + }, + // Native adUnit + { + code: 'native1', + mediaTypes: + native: { + title: { + required: true + }, + image: { + required: true + }, + sponsoredBy: { + required: true + } + } + }, + bids: [{ + bidder: 'easybid', + params: { + tagId: 'testeasy' + } + }] + }, + // Multiformat Ad + { + code: 'multi1', + mediaTypes: { + video: { + playerSize: [640, 480], + context: 'instream' + }, + banner: { + sizes: [[300, 250], [300,600]] + } + }, + bids: [{ + bidder: 'easybid', + params: { + tagId: 'testeasy', + videoTagId: 'testeasy' + } + }] + }; +]; +``` From 5cb716f3ef40fed8ddd28e92031a02167a588c99 Mon Sep 17 00:00:00 2001 From: Muki Seiler Date: Thu, 14 Nov 2024 14:08:33 +0100 Subject: [PATCH 291/816] Normalize headings in bidder docs (#5706) --- dev-docs/bidders/admatic.md | 3 ++- dev-docs/bidders/admaticde.md | 3 ++- dev-docs/bidders/aidem.md | 14 ++++++++---- dev-docs/bidders/ampliffy.md | 12 +++++----- dev-docs/bidders/browsi.md | 3 ++- dev-docs/bidders/consumable-server.md | 16 +++++++++----- dev-docs/bidders/consumable.md | 19 +++++++++------- dev-docs/bidders/contxtful.md | 4 ++-- dev-docs/bidders/exco.md | 3 ++- dev-docs/bidders/glimpse.md | 16 ++++++++------ dev-docs/bidders/illumin.md | 3 ++- dev-docs/bidders/iqm.md | 9 ++++---- dev-docs/bidders/ix-server.md | 20 +++++++++-------- dev-docs/bidders/ix.md | 32 +++++++++++++-------------- dev-docs/bidders/jwplayer.md | 13 ++++++----- dev-docs/bidders/kueezrtb.md | 3 ++- dev-docs/bidders/medianet.md | 4 +++- dev-docs/bidders/minutemedia.md | 3 ++- dev-docs/bidders/monetixads.md | 3 ++- dev-docs/bidders/netaddiction.md | 3 ++- dev-docs/bidders/ogury.md | 3 ++- dev-docs/bidders/openweb.md | 3 ++- dev-docs/bidders/openwebxchange.md | 3 ++- dev-docs/bidders/openx.md | 7 ++++-- dev-docs/bidders/pixad.md | 3 ++- dev-docs/bidders/publir.md | 3 ++- dev-docs/bidders/quantumdex.md | 2 +- dev-docs/bidders/relevantdigital.md | 4 +++- dev-docs/bidders/rise.md | 3 ++- dev-docs/bidders/risexchange.md | 3 ++- dev-docs/bidders/roundel.md | 4 ++-- dev-docs/bidders/seedtag.md | 5 +++-- dev-docs/bidders/shinez.md | 3 ++- dev-docs/bidders/shinezRtb.md | 3 ++- dev-docs/bidders/silverpush.md | 8 +++++-- dev-docs/bidders/stn.md | 3 ++- dev-docs/bidders/synacormedia.md | 2 +- dev-docs/bidders/tagoras.md | 3 ++- dev-docs/bidders/valueimpression.md | 2 +- 39 files changed, 152 insertions(+), 101 deletions(-) diff --git a/dev-docs/bidders/admatic.md b/dev-docs/bidders/admatic.md index 5f34a21702..2732a990c2 100644 --- a/dev-docs/bidders/admatic.md +++ b/dev-docs/bidders/admatic.md @@ -27,6 +27,7 @@ AdMatic header bidding adapter connects with AdMatic demand sources to fetch bid ### Bid params {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | |--------------|----------|------------------------------------|------------|----------| | `networkId` | required | The network ID from AdMatic | `12345` | `number` | @@ -76,7 +77,7 @@ var adUnits = [{ }]; ``` -## UserSync example +### UserSync example ```javascript pbjs.setConfig({ diff --git a/dev-docs/bidders/admaticde.md b/dev-docs/bidders/admaticde.md index e3458ad22f..e188d5493f 100644 --- a/dev-docs/bidders/admaticde.md +++ b/dev-docs/bidders/admaticde.md @@ -28,6 +28,7 @@ AdMatic GMBH header bidding adapter connects with AdMatic GMBH demand sources to ### Bid params {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | |-------------|----------|-------------------------------------|----------|----------| | `networkId` | required | The network ID from AdMatic GMBH | `12345` | `number` | @@ -77,7 +78,7 @@ var adUnits = [{ }]; ``` -## UserSync example +### UserSync example ```javascript pbjs.setConfig({ diff --git a/dev-docs/bidders/aidem.md b/dev-docs/bidders/aidem.md index 6aeb6266eb..c189dfcbf8 100644 --- a/dev-docs/bidders/aidem.md +++ b/dev-docs/bidders/aidem.md @@ -22,7 +22,7 @@ ortb_blocking_supported: false sidebarType: 1 --- -## Description +### Description This module connects publishers to AIDEM demand. @@ -31,6 +31,7 @@ This module is GDPR and CCPA compliant, and no 3rd party userIds are allowed. ### Global Bid Params {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | |---------------|----------|---------------------|------------|----------| | `siteId` | required | Unique site ID | `'ABCDEF'` | `String` | @@ -41,6 +42,7 @@ This module is GDPR and CCPA compliant, and no 3rd party userIds are allowed. #### Banner Bid Params {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | |------------|----------|--------------------------|---------------------------|---------| | `sizes` | required | List of the sizes wanted | `[[300, 250], [300,600]]` | `Array` | @@ -48,6 +50,7 @@ This module is GDPR and CCPA compliant, and no 3rd party userIds are allowed. #### Video Bid Params {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | |---------------|----------|-----------------------------------------|-----------------|-----------| | `context` | required | One of instream, outstream, adpod | `'instream'` | `String` | @@ -60,6 +63,7 @@ This module is GDPR and CCPA compliant, and no 3rd party userIds are allowed. #### Additional Config {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | |---------------------|----------|---------------------------------------------------------|---------|-----------| | `coppa` | optional | Child Online Privacy Protection Act | `true` | `Boolean` | @@ -68,6 +72,7 @@ This module is GDPR and CCPA compliant, and no 3rd party userIds are allowed. #### Consent Management Object {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | |--------|----------|--------------------------------------------------------------------------------------------------|---------|----------| | `gdpr` | optional | GDPR Object see [Prebid.js doc](https://docs.prebid.org/dev-docs/modules/consentManagementTcf.html) | `{}` | `Object` | @@ -182,12 +187,13 @@ pbjs.que.push(function (){ ### Supported Media Types {: .table .table-bordered .table-striped } + | Type | Support | |--------|--------------------------------------------------------------------| | Banner | Support all [AIDEM Sizes](https://kb.aidem.com/ssp/lists/adsizes/) | | Video | Support all [AIDEM Sizes](https://kb.aidem.com/ssp/lists/adsizes/) | -## Setup / Dev Guide +### Setup / Dev Guide ```shell nvm use @@ -210,9 +216,9 @@ gulp test --file "test/spec/modules/aidemBidAdapter_spec.js" For video: gulp serve --modules=aidemBidAdapter,dfpAdServerVideo -## FAQs +### FAQs -### How do I view AIDEM bid request? +#### How do I view AIDEM bid request? Navigate to a page where AIDEM is setup to bid. In the network tab, search for requests to `zero.aidemsrv.com/bid/request`. diff --git a/dev-docs/bidders/ampliffy.md b/dev-docs/bidders/ampliffy.md index 653794a1fd..daf211a984 100644 --- a/dev-docs/bidders/ampliffy.md +++ b/dev-docs/bidders/ampliffy.md @@ -12,7 +12,7 @@ multiformat_supported: will-bid-on-one safeframes_ok: true --- -## Table of contents +### Table of contents * [Table of contents](#table-of-contents) * [Introduction](#introduction) @@ -23,13 +23,13 @@ safeframes_ok: true * [Video](#video) * [Examples](#examples) -## Introduction +### Introduction Publishers can use Prebid.js to call Ampliffy through our client-side adapter: Prebid.js calls ampliffy directly from the browser using our client-side adapter. For configuration instructions, see the below on this page. ### Example -## Supported media types +### Supported media types The following table lists the media types that Ampliffy supports. @@ -41,7 +41,7 @@ The following table lists the media types that Ampliffy supports. | video | | native | -## Modules to include in your build process +### 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 `ampliffyBidAdapter`. To show video ads with Google Ad Manager, you need to 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=ampliffyBidAdapter,dfpAdServerVideo,gptPreAuction` @@ -56,7 +56,7 @@ If you are using a JSON file to specify modules, add `ampliffyBidAdapter` and `d ] ``` -## Bid request parameters +### Bid request parameters ### Banner @@ -82,7 +82,7 @@ You must include these parameters at the bidder level. | `format` | Required | String | specify 'video' for this kind of inventory` | | `server` | Optional | String | An Ampliffy-specific identifier that is associated with this ad unit` | -## Examples +### Examples **Video (instream):**
    diff --git a/dev-docs/bidders/browsi.md b/dev-docs/bidders/browsi.md index 7f548f0b90..5ca38ae574 100644 --- a/dev-docs/bidders/browsi.md +++ b/dev-docs/bidders/browsi.md @@ -20,12 +20,13 @@ For more information about [Browsi](https://www.browsi.com), please contact [sup ### Bid Params {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | |------------------|----------|------------------|------------------------------|----------| | `pubId` | required | Publisher ID | `'117a476f-9791-4a82-80db-4c01c1683db0'` | `string` | | `tagId` | required | Tag ID | `'1'` | `string` | -# Sample Ad Unit: For Publishers +### Sample Ad Unit: For Publishers ```javascript let videoAdUnit = [ diff --git a/dev-docs/bidders/consumable-server.md b/dev-docs/bidders/consumable-server.md index 5f5119652f..c9663b2432 100644 --- a/dev-docs/bidders/consumable-server.md +++ b/dev-docs/bidders/consumable-server.md @@ -33,6 +33,7 @@ The Consumable bid adapter may cycle the ad initially shown with a new one at va ### Bid Params {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | |-------------|----------|--------------------------------|---------|-----------| | `siteId` | required | The site ID from Consumable. | `12345` | `integer` | @@ -41,7 +42,7 @@ The Consumable bid adapter may cycle the ad initially shown with a new one at va | `unitName` | required | The unit name from Consumable. | `cnsmbl-unit` | `string` | | `placementId` | required | the placementid from Consumable. | `0421008445828ceb46f496700a5fa65e` | `string` | -## Table of contents +### Table of contents * [Table of contents](#table-of-contents) * [Introduction](#introduction) @@ -55,7 +56,7 @@ The Consumable bid adapter may cycle the ad initially shown with a new one at va * [App](#app-or-ctv-banner-video-audio) * [Examples](#examples) -## Introduction +### Introduction Publishers can use Prebid Server in any of the following ways with Consumable. Consumable's adapter supports all of the following methods: @@ -63,18 +64,19 @@ Publishers can use Prebid Server in any of the following ways with Consumable. C * In mobile apps, you can use the Prebid Mobile SDK to call Prebid Server and then Prebid Server uses our server-side adapter to call Consumable. For set up instructions, see [Call Consumable from Prebid Mobile SDK](#call-consumable-from-prebid-mobile-sdk) section on this page. * 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 Consumable. For set up instructions, see [Call Consumable from CTV/long-form video environment](#call-consumable-from-ctvlong-form-video-environment) section on this page. -## Supported media types +### Supported media types The following table lists the media types that Consumable supports. For information about the the Time-To-Live (TTL) for each media type, see [How Consumable counts impressions](https://kb.Consumableexchange.com/publishers/billing/how_Consumable_counts_impressions.htm) in our Knowledge Base. {: .table .table-bordered .table-striped } + | Type | Prebid Server support | | ----------- | ----------- | | banner | Supported | | video | Supported, including ad pods for OTT | | audio | Supported | -## Setup instructions to call Consumable through Prebid Server +### Setup instructions to call Consumable through Prebid Server **Note:** If you are hosting your own Prebid Server instance, you must contact your Consumable Exchange Representative to get an endpoint and setup instructions. @@ -152,7 +154,7 @@ To add Consumable as a bidder: 2. Define the Consumable-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](/prebid-server/endpoints/openrtb2/pbs-endpoint-video.html) documentation. -## Bid request parameters +### Bid request parameters For a list of the OpenRTB fields that Consumable supports in bid requests, see [List of supported OpenRTB bid request fields for sellers](https://kb.Consumableexchange.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. ### Site (Banner, Video, Audio) @@ -160,6 +162,7 @@ For a list of the OpenRTB fields that Consumable supports in bid requests, see [ You must include these parameters at the bidder level. {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | |-------------|----------|--------------------------------|---------|-----------| | `siteId` | required | The site ID from Consumable. | `12345` | `integer` | @@ -172,11 +175,12 @@ 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 | |---|---|---|---| | `placementId` | Required | String | An Consumable-specific identifier that is associated with this ad unit. It will be associated with the single size, if the size is provided. This is similar to a placement ID or an ad unit ID that some other modules have. For example, `'0421008445828ceb46f496700a5fa65e'`| -## Examples +### Examples **Banner** diff --git a/dev-docs/bidders/consumable.md b/dev-docs/bidders/consumable.md index 52009f80cf..68e9326537 100644 --- a/dev-docs/bidders/consumable.md +++ b/dev-docs/bidders/consumable.md @@ -33,6 +33,7 @@ The Consumable bid adapter may cycle the ad initially shown with a new one at va ### Bid Params {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | |-------------|----------|--------------------------------|---------|-----------| | `siteId` | required | The site ID from Consumable. | `12345` | `integer` | @@ -40,7 +41,7 @@ The Consumable bid adapter may cycle the ad initially shown with a new one at va | `unitId` | required | The unit ID from Consumable. | `987654` | `integer` | | `unitName` | required | The unit name from Consumable. | `cnsmbl-unit` | `string` | -## Table of contents +### Table of contents * [Table of contents](#table-of-contents) * [Introduction](#introduction) @@ -56,7 +57,7 @@ The Consumable bid adapter may cycle the ad initially shown with a new one at va * [Video](#video) * [Examples](#examples) -## Introduction +### Introduction Publishers can use Prebid.js to call Consumable Exchange (Consumable) in any of the following ways: @@ -77,7 +78,7 @@ pbjs.bidderSettings = { }; ``` -## Supported media types +### Supported media types The following table lists the media types that Consumable supports. @@ -88,11 +89,11 @@ The following table lists the media types that Consumable supports. | banner | Supported | | video | Supported | -## Set up Prebid.js to call Consumable directly from the browser (client-side adapter) +### Set up Prebid.js to call Consumable directly from the browser (client-side adapter) To call Consumable from a web browser environment using a Prebid Server integration, see the Consumable-specific configuration steps in [Setup instructions to call Consumable through Prebid Server](/dev-docs/bidders/consumable-server.html#setup-instructions-to-call-consumable-through-prebid-server) in our Prebid Server documentation on the Prebid site. -## Set up Prebid.js to call Consumable through Prebid Server (server-side adapter) +### Set up Prebid.js to call Consumable through Prebid Server (server-side adapter) In this configuration, Prebid.js makes a call to Prebid Server and then Prebid Server uses our server-side adapter to call Consumable. Complete the following steps to configure Consumable as a demand source: @@ -127,7 +128,7 @@ In this configuration, Prebid.js makes a call to Prebid Server and then Prebid S }); ``` -## Set up First Party Data (FPD) +### Set up First Party Data (FPD) You can set up the Prebid.js FPD module using Global data, Consumable bidder-specific site data, or ad unit-specific data. Consumable supports deal targeting in all the three FPD types. @@ -183,13 +184,14 @@ ortb2Imp: { } ``` -## Bid request parameters +### Bid request parameters ### Banner You must include these parameters at the bidder level. {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | |-------------|----------|--------------------------------|---------|-----------| | `siteId` | required | The site ID from Consumable. | `12345` | `integer` | @@ -202,6 +204,7 @@ You must include these parameters at the bidder level. You must include these parameters at the bidder level. {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | |-------------|----------|--------------------------------|---------|-----------| | `siteId` | required | The site ID from Consumable. | `12345` | `integer` | @@ -209,7 +212,7 @@ You must include these parameters at the bidder level. | `unitId` | required | The unit ID from Consumable. | `987654` | `integer` | | `unitName` | required | The unit name from Consumable. | `cnsmbl-unit` | `string` | -## Examples +### Examples **Banner** diff --git a/dev-docs/bidders/contxtful.md b/dev-docs/bidders/contxtful.md index c97f8abed6..c6ab50a3aa 100644 --- a/dev-docs/bidders/contxtful.md +++ b/dev-docs/bidders/contxtful.md @@ -20,11 +20,11 @@ multiformar_supported: will-bid-on-any ortb_blocking_supported: true --- -# Note +### Note The Contxtful bidder adapter requires some setup. Contact us at [contact@contxtful.com](mailto:contact@contxtful.com) -## User Sync +### User Sync Contxtful recommends enabling [User Syncing](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html#setConfig-Configure-User-Syncing) to optimize match rate and monetization. ```javascript diff --git a/dev-docs/bidders/exco.md b/dev-docs/bidders/exco.md index 7727633f50..72d2d3898b 100644 --- a/dev-docs/bidders/exco.md +++ b/dev-docs/bidders/exco.md @@ -27,13 +27,14 @@ sidebarType: 1 ### Bid Params {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | |------------|----------|-------------------------------------------------------------------------------------------|------------------------------|----------| | `cId` | required | The connection ID from Exco. | `'562524b21b1c1f08117fc7f9'` | `string` | | `pId` | required | The publisher ID from Exco. | `'59ac17c192832d0011283fe3'` | `string` | | `bidFloor` | optional | The minimum bid value desired. Exco will not respond with bids lower than this value. | `0.90` | `float` | -## Example +### Example ```javascript var adUnits = [{ diff --git a/dev-docs/bidders/glimpse.md b/dev-docs/bidders/glimpse.md index 867ecbaafc..a4724f9a83 100644 --- a/dev-docs/bidders/glimpse.md +++ b/dev-docs/bidders/glimpse.md @@ -15,7 +15,7 @@ sidebarType: 1 {: .alert.alert-warning :} glimpse is probably a defunct bidder, as the glimpseportal.io domain is no longer active. -## Overview +### Overview ```text Module Name: Glimpse Protocol Bid Adapter @@ -23,19 +23,20 @@ Module Type: Bidder Adapter Maintainer: support@glimpseportal.io ``` -## Description +### Description Glimpse protects consumer privacy while allowing precise targeting. This module connects publishers to Glimpse Protocol's demand sources via Prebid.js. -## Supported Media Types +### Supported Media Types {: .table .table-bordered .table-striped } + | Type | Sizes | | -------- | ----------------------------------------- | | `Banner` | 300x250, 300x600, 320x50, 728x90, 970x250 | -## Setup +### Setup ### Prerequisites @@ -50,13 +51,14 @@ Before you start, you will need to build a `prebid.js` file with the Glimpse mod ``` -## Configuration +### Configuration ### Bid Requests Our adapter expects the following values in the `params` block of each bid request: {: .table .table-bordered .table-striped } + | Name | Scope | Type | Description | Example | | ----- | -------- | ------ | --------------------------------------------------------------------------------------------------- | ---------------------- | | `pid` | Required | string | A unique identifier representing an ad unit. It is provided by Glimpse when registering an ad unit. | 'glimpse-placement-id' | @@ -123,8 +125,8 @@ pbjs.que.push(() => { }) ``` -## FAQs +### FAQs -### Can you provide additional support? +#### Can you provide additional support? Of course! You can check the Glimpse Prebid Adapter documentation or reach out to us at . diff --git a/dev-docs/bidders/illumin.md b/dev-docs/bidders/illumin.md index 9d67a10c8a..d8d7bfe70b 100644 --- a/dev-docs/bidders/illumin.md +++ b/dev-docs/bidders/illumin.md @@ -26,13 +26,14 @@ sidebarType: 1 ### Bid Params {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | |------------|----------|-------------------------------------------------------------------------------------------|------------------------------|----------| | `cId` | required | The connection ID from Illumin. | `'562524b21b1c1f08117fc7f9'` | `string` | | `pId` | required | The publisher ID from Illumin. | `'59ac17c192832d0011283fe3'` | `string` | | `bidFloor` | optional | The minimum bid value desired. Illumin will not respond with bids lower than this value. | `0.90` | `float` | -## Example +### Example ```javascript var adUnits = [{ diff --git a/dev-docs/bidders/iqm.md b/dev-docs/bidders/iqm.md index d27390b972..465cd0cb22 100644 --- a/dev-docs/bidders/iqm.md +++ b/dev-docs/bidders/iqm.md @@ -8,9 +8,10 @@ pbjs_version_notes: removed in 9.0 sidebarType: 1 --- -## Parameters +### Bid Params {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | | :------------ | :------- | :------------------------ | :------------------- | | `publisherId` | required | The Publisher ID from iQM | "df5fd732-c5f3-11e7-abc4-cec278b6b50a" | @@ -18,11 +19,11 @@ sidebarType: 1 | `placementId` | required | The Placement ID from iQM | 23451 | | `bidfloor` | optional | Bid Floor | 0.50 | -## Description +### Description Module that connects to iQM demand sources -## Test Parameters +### Test Parameters ```javascript var adUnits = [{ @@ -50,7 +51,7 @@ var adUnits = [{ ``` -## adUnit Video +### adUnit Video ```javascript var videoAdUnit = { diff --git a/dev-docs/bidders/ix-server.md b/dev-docs/bidders/ix-server.md index e5a7d21a4c..2a082ddefc 100644 --- a/dev-docs/bidders/ix-server.md +++ b/dev-docs/bidders/ix-server.md @@ -24,7 +24,7 @@ sidebarType: 1 privacy_sandbox: paapi --- -## Table of contents +### Table of contents * [Table of contents](#table-of-contents) * [Introduction](#introduction) @@ -40,9 +40,7 @@ privacy_sandbox: paapi * [Video](#video) * [Examples](#examples) - - -## Introduction +### Introduction Publishers can use Prebid Server in any of the following ways with Index Exchange (Index). Index's adapter supports all of the following methods: @@ -55,11 +53,12 @@ Publishers can use Prebid Server in any of the following ways with Index Exchang -## 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. {: .table .table-bordered .table-striped } + | Type | Prebid Server support | | ----------- | ----------- | | banner | Supported | @@ -68,7 +67,7 @@ The following table lists the media types that Index supports. For information a -## Configure the Index adapter in your Prebid Server instance +### Configure the Index adapter in your Prebid Server instance **Before you begin:** Contact your Index Exchange Representative to get an endpoint and setup instructions. @@ -134,7 +133,7 @@ If you are hosting your own Prebid Server instance, depending on whether you are -## Publisher instructions to call Index through Prebid Server +### Publisher instructions to call Index through Prebid Server 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. @@ -241,7 +240,7 @@ 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. @@ -250,6 +249,7 @@ For a list of the OpenRTB fields that Index supports in bid requests, see [List 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, `'9999990'`, `'9999991'`, `'9999992'`| @@ -259,6 +259,7 @@ 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. It will be associated with the single size, if the size is provided. This is similar to a placement ID or an ad unit ID that some other modules have. For example, `'9999990'`, `'9999991'`, `'9999992'`
    **Note:** You can re-use the existing `siteId` within the same flex position or video size, if the video adapts to the containing `
    ` element.| @@ -266,6 +267,7 @@ You must include these parameters at the bidder level. If you are using Index's outstream ad unit 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 ad unit configurations. {: .table .table-bordered .table-striped } + | Key | Scope | Type | Description | |---|---|---|---| | `video.w` | Required | Integer | The width of the video player in pixels that will be passed to demand partners. You must define the size of the video player using the `video.w` and `video.h` parameters. We strongly recommend video sizes to be `256 x 256` or greater, `300 x 250`, or `320 x 180`. | @@ -278,7 +280,7 @@ If you are using Index's outstream ad unit and have placed the video object at t -## Examples +### Examples **Banner** diff --git a/dev-docs/bidders/ix.md b/dev-docs/bidders/ix.md index d1677392ab..ca0962ca47 100644 --- a/dev-docs/bidders/ix.md +++ b/dev-docs/bidders/ix.md @@ -26,7 +26,7 @@ sidebarType: 1 privacy_sandbox: paapi, topics --- -## Table of contents +### Table of contents * [Table of contents](#table-of-contents) * [Introduction](#introduction) @@ -52,7 +52,7 @@ privacy_sandbox: paapi, topics -## Introduction +### Introduction Publishers can use Prebid.js to call Index Exchange (Index) in any of the following ways: @@ -79,9 +79,7 @@ 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. @@ -95,13 +93,13 @@ The following table lists the media types that Index supports. For information a -## Set up Prebid.js to call Index directly from the browser (client-side adapter) +### Set up Prebid.js to call Index directly from the browser (client-side adapter) To call Index from a web browser environment using a Prebid Server integration, see the Index-specific configuration steps in [Setup instructions to call Index through Prebid Server](/dev-docs/bidders/ix-server.html#setup-instructions-to-call-index-through-prebid-server) in our Prebid Server documentation on the Prebid site. -## Set up Prebid.js to call Index through Prebid Server (server-side adapter) +### Set up Prebid.js to call Index through Prebid Server (server-side adapter) In this configuration, Prebid.js makes a call to Prebid Server and then Prebid Server uses our server-side adapter to call Index. Complete the following steps to configure Index as a demand source: @@ -134,7 +132,7 @@ In this configuration, Prebid.js makes a call to Prebid Server and then Prebid S -## Modules to include in your build process +### 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` @@ -153,7 +151,7 @@ If you are using a JSON file to specify modules, add `ixBidAdapter` and `dfpAdSe -## Set up First Party Data (FPD) +### 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. @@ -215,7 +213,7 @@ ortb2Imp: { } ``` -## Monetize instream video +### Monetize instream video Unlike Outstream Video, instream video does not use the Prebid Universal Creative. Instead, video bids provide VAST that Prebid caches to obtain a cache ID that can be retrieved with a URL. The cache ID is passed as a key value to the ad server. @@ -233,7 +231,7 @@ To monetize instream video, complete the following steps: 2. Set up your line items in Google Ad manger by following the instructions in Prebid's [Setting Up Video In GAM](/adops/setting-up-prebid-video-in-dfp.html) documentation. -## Index's outstream ad unit +### Index's outstream ad unit Publishers who are using Index as a bidding adapter in Prebid.js can show outstream video ads on their site using Index's outstream ad unit. This allows a video ad to be placed anywhere on a publisher’s site, such as in-article, in-feed, and more. To use Index's outstream ad unit, you must be on Prebid.js version 5.13 or higher. However, if you are using your own outstream video player, Index's adapter can accept video signals from version 2.41.0 or higher.
    **Note:** When you use the Index ad unit for outstream video, all impressions are considered viewable, which is similar to how Google's ActiveView counts impressions for outstream. This is because Index plays the outstream video as soon as it is in view and concurrently fires any impression pixels in the VAST. @@ -309,7 +307,7 @@ pbjs.addAdUnit({ -## Prebid Native configuration +### Prebid Native configuration Prebid Native is available from Prebid.js version 7.4.0 or higher. We support the three native template rendering options that are provided in [Setting up Prebid Native in Google Ad Manager](/adops/gam-native.html). The following code is an example of a Prebid native setup using Google Ad Manager, but the concept and implementation should be similar for other ad servers.
    @@ -372,7 +370,7 @@ pbjs.addAdUnits({ -## Protected Audience API support +### Protected Audience API support **Before you begin:** @@ -484,7 +482,7 @@ Depending on the Prebid.js version that you are using, the steps to configure Pr -## Signal inventory using external IDs +### Signal inventory using external IDs 1. In the `pbjs.setBidderConfig` object at the `ix` bidder level, you must configure an `exchangeId` that applies to all your placements as follows. Note that the `exchangeId` is provided by Index. @@ -525,7 +523,7 @@ Depending on the Prebid.js version that you are using, the steps to configure Pr -## 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. @@ -569,7 +567,7 @@ Index supports the same set of native assets that Prebid.js recognizes. For the -## Multi-format ad units +### 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). @@ -586,7 +584,7 @@ The following are the parameters that you can specify for each multi-format type -## Examples +### Examples **Banner** diff --git a/dev-docs/bidders/jwplayer.md b/dev-docs/bidders/jwplayer.md index 330f0ce05b..4e7f6e99ca 100644 --- a/dev-docs/bidders/jwplayer.md +++ b/dev-docs/bidders/jwplayer.md @@ -23,7 +23,7 @@ sidebarType: 1 -## Table of contents +### Table of contents * [Table of contents](#table-of-contents) * [Introduction](#introduction) @@ -36,7 +36,7 @@ sidebarType: 1 -## Introduction +### Introduction The JW Player Bid Adapter allows publishers to tap into JW Player's Video Advertising Demand. Publishers are not required to use JW Player as a video player. @@ -44,7 +44,7 @@ Instream and outstream video ads are supported. -## Modules to include in your build process +### Modules to include in your build process You will need to include the `jwplayerBidAdapter` in your build. 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). We recommend including the [jwplayerVideoProvider](/dev-docs/modules/jwplayerVideoProvider.html) to connect Prebid.js to your JW Player instance via the [Prebid Video Module](/dev-docs/modules/video.html). @@ -75,7 +75,7 @@ or -## Bid Params +### Bid Params We support all oRTB params and encourage populating as many as possible. @@ -86,6 +86,7 @@ We support all oRTB params and encourage populating as many as possible. You must include the following parameters at the bidder level, in `adUnit.bids[index].params`. {: .table .table-bordered .table-striped } + | Name | Scope | Type | Description | |---|---|---|------------------------------------------------------| | `siteId` | Required | String | Site-specific id that is provided by JW Player. | @@ -99,6 +100,7 @@ You must include the following parameters at the bidder level, in `adUnit.bids[i We recommend populating as many params as possible in `adUnit.mediaTypes.video`. When using the [jwplayerVideoProvider](/dev-docs/modules/jwplayerVideoProvider.html), these fields are populated automatically. {: .table .table-bordered .table-striped } + | Name | Scope | Type | Description | |--------------------|-------------|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `video.w` | Recommended | Integer | Populated automatically when using the `jwplayerVideoProvider`. The width of the video player in pixels that will be passed to demand partners. You must define the size of the video player using the `video.w` and `video.h` parameters. | @@ -113,6 +115,7 @@ In release 4.30 and later, publishers who are not using the [jwplayerVideoProvid The following fields are required: {: .table .table-bordered .table-striped } + | Name | Scope | Type | Description | |--------------------|-------------|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `site.content.url` | Required | string | Populated automatically when the `jwplayerVideoProvider` or `jwplayerRtdProvider` are included. This is the URL of the media being rendered in the video player, for buy-side contextualization or review. This needs to be accessible (w/o DRM, Geo-blocking etc.) and without parameters (Such as size, quality etc.) | @@ -135,7 +138,7 @@ pbjs.setConfig({ -## Examples +### Examples ### With the JW Player Video Provider diff --git a/dev-docs/bidders/kueezrtb.md b/dev-docs/bidders/kueezrtb.md index c8bc315898..1913c1d63a 100644 --- a/dev-docs/bidders/kueezrtb.md +++ b/dev-docs/bidders/kueezrtb.md @@ -27,13 +27,14 @@ sidebarType: 1 ### Bid Params {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | |------------|----------|-------------------------------------------------------------------------------------------|------------------------------|----------| | `cId` | required | The connection ID from KueezRTB. | `'562524b21b1c1f08117fc7f9'` | `string` | | `pId` | required | The publisher ID from KueezRTB. | `'59ac17c192832d0011283fe3'` | `string` | | `bidFloor` | optional | The minimum bid value desired. KueezRTB will not respond with bids lower than this value. | `0.90` | `float` | -## Example +### Example ```javascript var adUnits = [{ diff --git a/dev-docs/bidders/medianet.md b/dev-docs/bidders/medianet.md index cb8eb86f66..bac0729c69 100644 --- a/dev-docs/bidders/medianet.md +++ b/dev-docs/bidders/medianet.md @@ -21,6 +21,7 @@ sidebarType: 1 ### Bid Params {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | |------------|----------|----------------------------------------|---------------|----------| | `cid` | required | The customer id provided by Media.net. | `'8CUX0H51C'` | `string` | @@ -33,6 +34,7 @@ sidebarType: 1 #### Video Object {: .table .table-bordered .table-striped } + | Name | Type | Description | Example| |------------|----------|--------------|--------| |mimes|array of strings|(Recommended) Specifies the video content MIME types supported; for example, video/x-ms-wmv and video/x-flv.|["video/x-ms-wmv","video/x-flv"]| @@ -144,7 +146,7 @@ var adUnits = [{ }]; ``` -# Protected Audience API (FLEDGE) +### Protected Audience API (FLEDGE) To enable PAAPI auctions follow the instructions below: diff --git a/dev-docs/bidders/minutemedia.md b/dev-docs/bidders/minutemedia.md index 55c69cf49f..8dff7047e4 100644 --- a/dev-docs/bidders/minutemedia.md +++ b/dev-docs/bidders/minutemedia.md @@ -28,6 +28,7 @@ The MinuteMedia adapter requires setup and approval. Please reach out to . diff --git a/dev-docs/bidders/openweb.md b/dev-docs/bidders/openweb.md index 8f0554cfe7..b81650b9e5 100644 --- a/dev-docs/bidders/openweb.md +++ b/dev-docs/bidders/openweb.md @@ -30,6 +30,7 @@ The OpenWeb adapter requires setup and approval. Please reach out to
    **WARNING:**
    Misuse of this parameter can impact revenue | 2.00 | `testMode` | optional | Boolean | This activates the test mode | false -## Example +### Example ```javascript var adUnits = [{ diff --git a/dev-docs/bidders/openwebxchange.md b/dev-docs/bidders/openwebxchange.md index eb7da48e83..66c03c160f 100644 --- a/dev-docs/bidders/openwebxchange.md +++ b/dev-docs/bidders/openwebxchange.md @@ -26,6 +26,7 @@ The OpenWebXChange adapter requires setup and approval. #### Banner, Video {: .table .table-bordered .table-striped } + | Name | Scope | Type | Description | Example | ---- | ----- | ---- | ----------- | ------- | `org` | required | String | OpenWebXChange publisher Id | "1234567890abcdef12345678" @@ -36,7 +37,7 @@ The OpenWebXChange adapter requires setup and approval. | `is_wrapper` | private | Boolean | Please don't use unless your account manager asked you to | false | `currency` | optional | String | 3 letters currency | "EUR" -## Example +### Example ```javascript var adUnits = [{ diff --git a/dev-docs/bidders/openx.md b/dev-docs/bidders/openx.md index db7088974f..2bdc0951f9 100644 --- a/dev-docs/bidders/openx.md +++ b/dev-docs/bidders/openx.md @@ -38,6 +38,7 @@ IMPORTANT: only include either openxBidAdapter or openxOrtbBidAdapter in your bu #### Banner {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | | ---- | ----- | ----------- | ------- | ---- | | `delDomain` ~~or `platform`~~** | required | OpenX delivery domain provided by your OpenX representative. | "PUBLISHER-d.openx.net" | String | @@ -87,6 +88,7 @@ var adUnits = [ #### Video {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | | ---- | ----- | ----------- | ------- | ---- | | `unit` | required | OpenX ad unit ID provided by your OpenX representative. | "1611023122" | String | @@ -99,6 +101,7 @@ var adUnits = [ 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 | @@ -151,7 +154,7 @@ var videoAdUnits = [ }] ``` -## Example +### Example ```javascript var adUnits = [ @@ -254,7 +257,7 @@ pbjs.setConfig({ }); ``` -## Additional Details +### Additional Details * [Banner Ads](https://docs.openx.com/publishers/prebid-adapter-web/) (Customer login required.) * [Video Ads](https://docs.openx.com/publishers/prebid-adapter-video/) (Customer login required.) diff --git a/dev-docs/bidders/pixad.md b/dev-docs/bidders/pixad.md index 54296770e1..22368c79ac 100644 --- a/dev-docs/bidders/pixad.md +++ b/dev-docs/bidders/pixad.md @@ -28,6 +28,7 @@ Pixad header bidding adapter connects with Pixad demand sources to fetch bids fo ### Bid params {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | |-------------|----------|-------------------------------------|----------|----------| | `networkId` | required | The network ID from Pixad | `12345` | `number` | @@ -77,7 +78,7 @@ var adUnits = [{ }]; ``` -## UserSync example +### UserSync example ```javascript pbjs.setConfig({ diff --git a/dev-docs/bidders/publir.md b/dev-docs/bidders/publir.md index 3ef9f519f3..c3086774bf 100644 --- a/dev-docs/bidders/publir.md +++ b/dev-docs/bidders/publir.md @@ -26,11 +26,12 @@ The Publir adapter requires setup and approval. Please reach out to [info@publir #### Banner, Video {: .table .table-bordered .table-striped } + | Name | Scope | Type | Description | Example | ---- | ----- | ---- | ----------- | ------- | `pubId` | required | String | Publir publisher Id provided by your Publir representative | "1234567890abcdef12345678" -## Example +### Example ```javascript var adUnits = [{ diff --git a/dev-docs/bidders/quantumdex.md b/dev-docs/bidders/quantumdex.md index a4eee3de31..b6521742ec 100644 --- a/dev-docs/bidders/quantumdex.md +++ b/dev-docs/bidders/quantumdex.md @@ -16,6 +16,6 @@ pbs_app_supported: true sidebarType: 1 --- -## Description +### Description Quantumdex is an aliased bidder of Apacdex bid adapter. Please refer to [Apacdex documentation](https://docs.prebid.org/dev-docs/bidders/apacdex) for bid parameters and implementation guide. diff --git a/dev-docs/bidders/relevantdigital.md b/dev-docs/bidders/relevantdigital.md index 25b90a6e48..6d8457b0da 100644 --- a/dev-docs/bidders/relevantdigital.md +++ b/dev-docs/bidders/relevantdigital.md @@ -26,6 +26,7 @@ sidebarType: 1 ### Bid Params {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | |---------------|----------|---------------------------------------------------------|----------------------------|--------------| | `placementId` | required | The placement id. | `'6204e83a077_620f9e8e4fe'` | `String` | @@ -36,6 +37,7 @@ sidebarType: 1 ### 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` | @@ -71,7 +73,7 @@ var adUnits = [ ]; ``` -## Example setup using only bid params +### 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. diff --git a/dev-docs/bidders/rise.md b/dev-docs/bidders/rise.md index c873396d55..2b11a8c520 100644 --- a/dev-docs/bidders/rise.md +++ b/dev-docs/bidders/rise.md @@ -29,6 +29,7 @@ The Rise adapter requires setup and approval. Please reach out to [prebid-rise-e #### Banner, Video {: .table .table-bordered .table-striped } + | Name | Scope | Type | Description | Example | ---- | ----- | ---- | ----------- | ------- | `org` | required | String | Rise publisher Id provided by your Rise representative | "1234567890abcdef12345678" @@ -38,7 +39,7 @@ The Rise adapter requires setup and approval. Please reach out to [prebid-rise-e | `rtbDomain` | optional | String | Sets the seller end point | "www.test.com" | `is_wrapper` | private | Boolean | Please don't use unless your account manager asked you to | false -## Example +### Example ```javascript var adUnits = [{ diff --git a/dev-docs/bidders/risexchange.md b/dev-docs/bidders/risexchange.md index 1d1de616f5..89df92a83c 100644 --- a/dev-docs/bidders/risexchange.md +++ b/dev-docs/bidders/risexchange.md @@ -28,6 +28,7 @@ The RiseXChange adapter requires setup and approval. Please reach out to [prebid #### Banner, Video {: .table .table-bordered .table-striped } + | Name | Scope | Type | Description | Example | ---- | ----- | ---- | ----------- | ------- | `org` | required | String | RiseXChange publisher Id | "1234567890abcdef12345678" @@ -37,7 +38,7 @@ The RiseXChange adapter requires setup and approval. Please reach out to [prebid | `rtbDomain` | optional | String | Sets the seller end point | "www.test.com" | `is_wrapper` | private | Boolean | Please don't use unless your account manager asked you to | false -## Example +### Example ```javascript var adUnits = [{ diff --git a/dev-docs/bidders/roundel.md b/dev-docs/bidders/roundel.md index 02e846086d..464325d579 100644 --- a/dev-docs/bidders/roundel.md +++ b/dev-docs/bidders/roundel.md @@ -18,10 +18,10 @@ prebid_member: yes sidebarType: 1 --- -## Overview +### Overview Roundel is an aliased bidder for Index Exchange and must be configured alongside the [IdentityLink](/dev-docs/modules/userId.html#identitylink) user ID module. -## Bid Params +### Bid Params Bidder params for roundel follow the same structure as the Index Exchange bidder. Please reference configuration examples [here](/dev-docs/bidders/ix). diff --git a/dev-docs/bidders/seedtag.md b/dev-docs/bidders/seedtag.md index 768fae2ecd..05305438db 100644 --- a/dev-docs/bidders/seedtag.md +++ b/dev-docs/bidders/seedtag.md @@ -24,6 +24,7 @@ The publisher id 0000-0000-01 returns demo responses. ### Bid Params {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | |-------------------|---------------------|--------------------------------------------------------------------------------|-----------------------|----------| | `publisherId` | required | The publisher id. | 0000-0000-01 | `string` | @@ -84,7 +85,7 @@ const adUnits = [ ] ``` -## InBanner example +### InBanner example ```js const adUnits = [ @@ -109,7 +110,7 @@ const adUnits = [ ] ``` -## inStream example +### inStream example ```js var adUnits = [{ diff --git a/dev-docs/bidders/shinez.md b/dev-docs/bidders/shinez.md index 8340d8e589..642935d80e 100644 --- a/dev-docs/bidders/shinez.md +++ b/dev-docs/bidders/shinez.md @@ -24,6 +24,7 @@ The Shinez adapter requires setup and approval. Please reach out to . diff --git a/dev-docs/bidders/stn.md b/dev-docs/bidders/stn.md index 3373e93b07..aab1fd1622 100644 --- a/dev-docs/bidders/stn.md +++ b/dev-docs/bidders/stn.md @@ -27,6 +27,7 @@ The STN adapter requires setup and approval. Please reach out to Date: Thu, 14 Nov 2024 16:01:50 +0100 Subject: [PATCH 292/816] params.apiKey set as string instead of boolean (#5702) --- dev-docs/modules/airgridRtdProvider.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/modules/airgridRtdProvider.md b/dev-docs/modules/airgridRtdProvider.md index d44922c3cd..836439812d 100644 --- a/dev-docs/modules/airgridRtdProvider.md +++ b/dev-docs/modules/airgridRtdProvider.md @@ -62,7 +62,7 @@ pbjs.setConfig( | :------------ | :------------ | :------------ |:------------ | | name | `String` | RTD sub module name | Always 'airgrid' | | waitForIt | `Boolean` | Wether to delay auction for module response | Optional. Defaults to false | -| params.apiKey | `Boolean` | Publisher partner specific API key | Required | +| params.apiKey | `String` | Publisher partner specific API key | Required | | params.accountId | `String` | Publisher partner specific account ID | Required | | params.publisherId | `String` | Publisher partner specific publisher ID | Required | | params.bidders | `Array` | Bidders with which to share segment information | Optional | From 0298e8e743a5099ab13b0a52ccf59b021df8759a Mon Sep 17 00:00:00 2001 From: bgorsline Date: Thu, 14 Nov 2024 15:33:14 -0500 Subject: [PATCH 293/816] added request correction module --- prebid-server/features/pbs-feature-idx.md | 2 + prebid-server/pbs-modules/index.md | 1 + .../pbs-modules/request-correction.md | 106 ++++++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 prebid-server/pbs-modules/request-correction.md diff --git a/prebid-server/features/pbs-feature-idx.md b/prebid-server/features/pbs-feature-idx.md index 7e52ea4745..ee94695a33 100644 --- a/prebid-server/features/pbs-feature-idx.md +++ b/prebid-server/features/pbs-feature-idx.md @@ -108,9 +108,11 @@ title: Prebid Server | Features | Modules | [ortb2-blocking](/prebid-server/pbs-modules/ortb2-blocking.html) | Configure per-account OpenRTB blocking details. | check | check | | Anti-Fraud | Ads.Cert 2.0 Authenticated Connections | Includes authenticated connection signing header on outgoing bid requests to supported adapters. * | check | | | Request Enrichment | Enhanced tid and request IDs | Fills out id, imp.id, source.tid, and imp.ext.tid | check | check | +| Request Enrichment | [Request Correction Module](/prebid-server/pbs-modules/request-correction.html) | Address client-side bugs that are stuck out in the wild. | | check | | Privacy Sandbox | Passthrough | "auction enabled" flags are passed through to bidders and auctionconfig is forwarded from bidders. | check | check | | Privacy Sandbox | Topics headers | PBS reads the Chrome topics header and copies to user.data segments. | check | check | | Privacy Sandbox | Testing labels | PBS reads the Chrome labels header and copies to device.ext.cdep | check | check | | Auction Response | Bidders can supply [Fledge](https://github.com/google/ads-privacy/tree/master/proposals/fledge-multiple-seller-testing) auction config | If the request contains imp.ext.ae, bid adapters can return ext.prebid.fledge.auctionconfigs | check | check | +| Auction Response | [Response Correction Module](/prebid-server/pbs-modules/response-correction.html)| Deal with problems caused by certain unexpected bid responses. | | check | \* Experimental feature not yet recommended for production. diff --git a/prebid-server/pbs-modules/index.md b/prebid-server/pbs-modules/index.md index 285427bad2..d0b88cd008 100644 --- a/prebid-server/pbs-modules/index.md +++ b/prebid-server/pbs-modules/index.md @@ -33,6 +33,7 @@ The full list of modules: | [**US Custom Logic Privacy**](/prebid-server/features/pbs-uscustomlogic.html) | Similar to the `US Gen Privacy` module, but publishers define their own interpretation of the GPP string. | privacy | | check | | [**Richmedia Filter**](/prebid-server/pbs-modules/richmedia.html) | Can filter MRAID creatives from the bid stream. | validation | | check | | [**51Degrees Device Detection**](/prebid-server/pbs-modules/51degrees-device-detection.html) | Enriches an incoming OpenRTB request with [51Degrees Device Data](https://51degrees.com/documentation/_device_detection__overview.html) | general | check | check | +| [**Request Correction**](/prebid-server/pbs-modules/request-correction.html) | Apply optional corrections to bid requests. | general | | check | | [**Response Correction**](/prebid-server/pbs-modules/response-correction.html) | Apply optional corrections to bid responses. | general | | check | ## Installing a PBS General Module diff --git a/prebid-server/pbs-modules/request-correction.md b/prebid-server/pbs-modules/request-correction.md new file mode 100644 index 0000000000..5dd710cf65 --- /dev/null +++ b/prebid-server/pbs-modules/request-correction.md @@ -0,0 +1,106 @@ +--- +layout: page_v2 +page_type: pbs-module +title: Prebid Server Request Correction Module +display_name: Request Correction Module +sidebarType: 5 +--- + +# Request Correction Module +{:.no_toc} + +- TOC +{:toc } + +## Overview + +(PBS-Java 3.15+) + +Part of Prebid Server's job in curating a clean bid stream is in dealing with problems created by errant requests. +When there's a problem in how Prebid SDK or Prebid.js forms the OpenRTB, we'll work with those teams to correct the issue, but +sometimes those bugs will stay out in the wild for a long time before the fix propagates through the ecosystem. + +Here are the corrections this module can support. All of them are opt-in by account. + +{: .table .table-bordered .table-striped } +| Requestion Correction | Description | Version | +| --------- | ---- | ----- | +| pbsdkUaCleanup | There are versions of PBSDK that set device.ua to include "PrebidMobile/x.y.z", which can cause some bidders to view the request as invalid traffic. | PBS-Java 3.15 | +| pbsdkAndroidInstlRemove | There's a bug in older versions of the Android PBSDK that inject the `instl:1` flag into video auctions. | PBS-Java 3.15 | + +### Prebid SDK User Agent Cleanup + +This correction addresses a [bug in the PB SDK](https://github.com/prebid/prebid-mobile-ios/issues/932) where the user agent string was set in such a way that some bidders detect the requests as invalid traffic. + +If the "pbsdkUaCleanup" correction is enabled, this is what happens: + +1. if app.ext.prebid.source!=“prebid-mobile” exit +1. if app.ext.prebid.version >= 2.1.6 exit +1. scan device.ua for the pattern "PrebidMobile/[0-9][^\S]*" (PrebidMobile/, followed by a number, then any number of non-whitespace characters) +1. If found, remove this pattern from device.ua + +### Prebid SDK Interstitial Flag + +This correction addresses a [bug in the Android PB SDK](https://github.com/prebid/prebid-mobile-android/issues/757) where the `instl` flag is incorrectly added to the OpenRTB. + +If the ‘pbsdkAndroidInstlRemove’ correction is enabled, this is what happens: + +1. If imp[0].instl is not specified or is 0, exit +1. if app.ext.prebid.source is not “prebid-mobile”, exit +1. if app.bundle does not contain the string “android”, exit +1. if app.ext.prebid.version > 2.2.3, exit +1. If we're still here, remove the imp[0].instl flag + +## Configuration + +The parameters to the module are: + +{: .table .table-bordered .table-striped } +| Parameter | Type | Scope | Description | Notes | +| --------- | ---- | ----- | ----------- | ----- | +| enabled | boolean | optional | Enable the module for this account | Defaults to false | +| pbsdkUaCleanup | boolean | optional | See [Prebid SDK User Agent Cleanup](#Prebid-SDK-User-Agent-Cleanup) above. | Defaults to false | +| pbsdkAndroidInstlRemove | boolean | optional | See the [Prebid SDK Interstitial Flag](#Prebid-SDK-Interstitial-Flag) correction above. | Defaults to false | + +Here's an example of the account config used in PBS-Java: + +```json +{ + "hooks": { + "modules": { + "pb-request-correction": { + "enabled": true, + "pbsdkUaCleanup": true, + "pbsdkAndroidInstlRemove": true + } + } + } + }, + "execution-plan": { + "endpoints": { + "/openrtb2/auction": { + "stages": { + "processed-auction": { + "groups": [ + { + "timeout": 5, + "hook-sequence": [ + { + "module-code": "pb-request-correction", + "hook-impl-code": "pb-request-correction-processed-auction" + } + ] + } + ] + } + } + } + } + } +} +``` + +## Further Reading + +- [Prebid Server Module List](/prebid-server/pbs-modules/index.html) +- [Building a Prebid Server Module](/prebid-server/developers/add-a-module.html) From 0936ccddb8d59aa328aae168dee29cecc937b306 Mon Sep 17 00:00:00 2001 From: bgorsline Date: Thu, 14 Nov 2024 15:36:37 -0500 Subject: [PATCH 294/816] lint --- prebid-server/pbs-modules/request-correction.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/prebid-server/pbs-modules/request-correction.md b/prebid-server/pbs-modules/request-correction.md index 5dd710cf65..0335936948 100644 --- a/prebid-server/pbs-modules/request-correction.md +++ b/prebid-server/pbs-modules/request-correction.md @@ -36,7 +36,7 @@ If the "pbsdkUaCleanup" correction is enabled, this is what happens: 1. if app.ext.prebid.source!=“prebid-mobile” exit 1. if app.ext.prebid.version >= 2.1.6 exit -1. scan device.ua for the pattern "PrebidMobile/[0-9][^\S]*" (PrebidMobile/, followed by a number, then any number of non-whitespace characters) +1. scan device.ua for the pattern "PrebidMobile/", followed by a number, then any number of non-whitespace characters. 1. If found, remove this pattern from device.ua ### Prebid SDK Interstitial Flag @@ -59,8 +59,8 @@ The parameters to the module are: | Parameter | Type | Scope | Description | Notes | | --------- | ---- | ----- | ----------- | ----- | | enabled | boolean | optional | Enable the module for this account | Defaults to false | -| pbsdkUaCleanup | boolean | optional | See [Prebid SDK User Agent Cleanup](#Prebid-SDK-User-Agent-Cleanup) above. | Defaults to false | -| pbsdkAndroidInstlRemove | boolean | optional | See the [Prebid SDK Interstitial Flag](#Prebid-SDK-Interstitial-Flag) correction above. | Defaults to false | +| pbsdkUaCleanup | boolean | optional | See [Prebid SDK User Agent Cleanup](#prebid-sdk-user-agent-cleanup) above. | Defaults to false | +| pbsdkAndroidInstlRemove | boolean | optional | See the [Prebid SDK Interstitial Flag](#prebid-sdk-interstitial-flag) correction above. | Defaults to false | Here's an example of the account config used in PBS-Java: From e0b13f5157e76b0dbb65e4fd87b535c1044dba6e Mon Sep 17 00:00:00 2001 From: Viktor Dreiling <34981284+3link@users.noreply.github.com> Date: Fri, 15 Nov 2024 09:40:30 +0100 Subject: [PATCH 295/816] Remove Sharethrough and Sonobi form docs (#5707) --- dev-docs/modules/userid-submodules/liveintent.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dev-docs/modules/userid-submodules/liveintent.md b/dev-docs/modules/userid-submodules/liveintent.md index 7869fc6960..e2bf68ee0d 100644 --- a/dev-docs/modules/userid-submodules/liveintent.md +++ b/dev-docs/modules/userid-submodules/liveintent.md @@ -98,7 +98,7 @@ pbjs.setConfig({ ### Multiple user IDs -The attributes `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk`, `sharethrough`, `sonobi`, `vidazoo` and `fpid` are treated specially by LiveIntent's user ID sub-module. Each of these attributes will result in a separate ID returned by the sub-module. Note: `thetradedesk` will be exposed as `tdid` because of historical reasons. +The attributes `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk`, `vidazoo` and `fpid` are treated specially by LiveIntent's user ID sub-module. Each of these attributes will result in a separate ID returned by the sub-module. Note: `thetradedesk` will be exposed as `tdid` because of historical reasons. For example, in case `uid2` is configured to be requested in addition to the `nonID`, the `request.userId` object would look like the following: @@ -116,9 +116,9 @@ For example, in case `uid2` is configured to be requested in addition to the `no } ``` -NOTE: `uid2` is exposed as part of `lipb` as well as separately as `uid2`. `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk` (as `tdid`), `sharethrough`, `sonobi`, `vidazoo` and `fpid` behave the same way. +NOTE: `uid2` is exposed as part of `lipb` as well as separately as `uid2`. `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk` (as `tdid`), `vidazoo` and `fpid` behave the same way. -For the attributes `lipbid` (nonID), `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk` (`tdid`), `sharethrough`, `sonobi`, `vidazoo` and `fpid` there is also support for their conversion into OpenRTB EIDS format. Please refer to [User ID Module](../userId.md) documentation for more information on conversion, and [Example of eids array generated by UserId Module](https://github.com/prebid/Prebid.js/blob/master/modules/userId/eids.md) for output format examples. +For the attributes `lipbid` (nonID), `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk` (`tdid`), `vidazoo` and `fpid` there is also support for their conversion into OpenRTB EIDS format. Please refer to [User ID Module](../userId.md) documentation for more information on conversion, and [Example of eids array generated by UserId Module](https://github.com/prebid/Prebid.js/blob/master/modules/userId/eids.md) for output format examples. ### FPID @@ -200,7 +200,7 @@ NOTE: For optimal performance, the LiveIntent ID sub-module should be called at | params.ajaxTimeout |Optional| Number |This configuration parameter defines the maximum duration of a call to the `IdentityResolution` endpoint. By default, 5000 milliseconds.|`5000`| | 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 and additional attributes.|`['my-id']`| -| params.requestedAttributesOverrides | Optional | Object | Object containing booleans used to override the default resolution. Attributes set to `true` will be added to the resolved list, while attributes set to `false` will be removed. Valid attributes are `nonId`, `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk` (`tdid`), `sharethrough`, `sonobi`, `vidazoo` and `fpid`. | `{'uid2': true}` | +| params.requestedAttributesOverrides | Optional | Object | Object containing booleans used to override the default resolution. Attributes set to `true` will be added to the resolved list, while attributes set to `false` will be removed. Valid attributes are `nonId`, `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk` (`tdid`), `vidazoo` and `fpid`. | `{'uid2': true}` | | params.emailHash |Optional| String |The hashed email address of a user. We can accept the hashes, which use the following hashing algorithms: md5, sha1, sha2.|`1a79a4d60de6718e8e5b326e338ae533`| | params.url | Optional| String |Use this to change the default endpoint URL if you can call the LiveIntent Identity Exchange within your own domain.|`https://idx.my-domain.com`| | params.liCollectConfig |Optional| Object |Container of all collector params.|| From 7afe2f970581f06282c89be3f68d953c1f60cc76 Mon Sep 17 00:00:00 2001 From: bretg Date: Mon, 18 Nov 2024 16:30:47 -0500 Subject: [PATCH 296/816] Update gothamads.md (#5717) Bidders cannot claim tcfeu support without a GVLID --- dev-docs/bidders/gothamads.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/gothamads.md b/dev-docs/bidders/gothamads.md index a85e21c03c..1bce4b496f 100644 --- a/dev-docs/bidders/gothamads.md +++ b/dev-docs/bidders/gothamads.md @@ -3,7 +3,7 @@ layout: bidder title: gothamads description: Prebid gothamads Bidder Adaptor biddercode: gothamads -tcfeu_supported: true +tcfeu_supported: false usp_supported: true coppa_supported: true ccpa_supported: true From 9598da0bd49067455de851ef9cd88b4f59b33360 Mon Sep 17 00:00:00 2001 From: annavane <101708287+annavane@users.noreply.github.com> Date: Tue, 19 Nov 2024 14:38:42 +0100 Subject: [PATCH 297/816] Added The Newco userId module - TNCID documentation (#5703) * - The Newco TNCID documentation updated * - userId module - name value examples list - fix * Revert "- userId module - name value examples list - fix" This reverts commit d7163bdd337ea4f91b7d26cd999b9975290fee3a. * - Lint errors fixed * Update dev-docs/modules/userid-submodules/tncIdSystem.md TNCID metadata fields Co-authored-by: Muki Seiler * > This is not going be necessary thanks to #5673 , which generates this automatically. --------- Co-authored-by: Muki Seiler --- .../modules/userid-submodules/tncIdSystem.md | 34 +++++++++++++++---- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/dev-docs/modules/userid-submodules/tncIdSystem.md b/dev-docs/modules/userid-submodules/tncIdSystem.md index 6b82fd0250..d0c499e719 100644 --- a/dev-docs/modules/userid-submodules/tncIdSystem.md +++ b/dev-docs/modules/userid-submodules/tncIdSystem.md @@ -1,4 +1,15 @@ -# TNCID UserID Module +--- +layout: userid +title: TNCID by The Newco +description: TNCID UserID sub-module +useridmodule: tncIdSystem +bidRequestUserId: tncId +eidsource: thenewco.it +example: '"1111"' +--- + +TNCID is a shared persistent identifier that improves user recognition compared to both third-party and first-party cookies. This enhanced identification capability enables publishers and advertisers to consistently recognize their audiences, leading to improved monetization and more precise targeting. The Newco User ID sub-module adds powerful TNCID user identification technology to your Prebid.js bidstream. +For more details, visit our website and contact us to request your publisher-id and the on-page tag. ## Prebid Configuration @@ -8,7 +19,7 @@ First, make sure to add the TNCID submodule to your Prebid.js package with: gulp build --modules=tncIdSystem,userId ``` -## TNCIDIdSystem module Configuration +## TNCIdSystem module Configuration Disclosure: This module loads external script unreviewed by the prebid.js community @@ -20,7 +31,12 @@ pbjs.setConfig({ userIds: [{ name: 'tncId', params: { - url: 'https://js.tncid.app/remote.min.js' //Optional + url: 'TNC-fallback-script-url' // Fallback url, not required if onpage tag is present (ask TNC for it) + }, + storage: { + type: "cookie", + name: "tncid", + expires: 365 // in days } }], syncDelay: 5000 @@ -30,7 +46,11 @@ pbjs.setConfig({ ## Configuration Params -| Param Name | Required | Type | Description | -| --- | --- | --- | --- | -| name | Required | String | ID value for the TNCID module: `"tncId"` | -| params.url | Optional | String | Provide TNC fallback script URL, this script is loaded if there is no TNC script on page | +The following configuration parameters are available: + +{: .table .table-bordered .table-striped } +| Param under userSync.userIds[] | Scope | Type | Description | Example | +| --- | --- | --- | --- | --- | +| name | Required | String | The name of this sub-module | `"tncId"` | +| params ||| Details for the sub-module initialization || +| params.url | Required | String | TNC script fallback URL - This script is loaded if there is no TNC script on page | `"https://js.tncid.app/remote.min.js"` | From 8d1de54b984349b970e3ca1f1939bd9633db479e Mon Sep 17 00:00:00 2001 From: joseluis laso Date: Wed, 20 Nov 2024 15:18:05 +0100 Subject: [PATCH 298/816] Hadrn 1004 (#5693) * Fix `modulecode` for the ATS analytics adapter (#3756) * updating the documentation to follow the main repo * shorting the hadronId shown in the table --------- Co-authored-by: Demetrio Girardi --- dev-docs/modules/userid-submodules/hadron.md | 21 +++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/dev-docs/modules/userid-submodules/hadron.md b/dev-docs/modules/userid-submodules/hadron.md index 3f067c944a..beb968d453 100644 --- a/dev-docs/modules/userid-submodules/hadron.md +++ b/dev-docs/modules/userid-submodules/hadron.md @@ -27,7 +27,7 @@ pbjs.setConfig({ type: 'html5' }, params: { - partnerId: 1234 + partnerId: 1234 // change it to the Partner ID you got from Audigent } }] } @@ -38,17 +38,20 @@ The `request.userId.hadronId` will contain the Audigent HadronId: ```json { - "hadronId": "0201chpvai07jv2yg08xizqr0bwpa1w0evvmq014d2ykn0b5oe" + "hadronId": "0aRSTUAackg79ijgd8e8j6kah9ed9j6hdfgb6cl00volopxo00npzjmmb" } ``` The following configuration parameters are available: {: .table .table-bordered .table-striped } -| Param under usersync.userIds[] | Scope | Type | Description | Example | -| --- | --- | --- | --- | --- | -| name | Required | String | ID value for the HadronID module - `"hadronId"` | `"hadronId"` | -| params | Optional | Object | Used to store params for the HadronId system | -| params.url | Optional | String | Set an alternate GET url for HadronId with this parameter | -| params.urlArg | Optional | Object | Optional url parameter for params.url | -| params.partnerId | Required | Number | This is the Audigent Partner ID obtained from Audigent. | +| Param under usersync.userIds[] | Scope | Type | Description | Example | +|--------------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------| +| name | Required | String | ID value for the HadronID module - `"hadronId"` | `"hadronId"` | +| storage | Required | Object | The publisher must specify the local storage in which to store the results of the call to get the user ID. This can be either cookie or HTML5 storage. | | +| storage.type | Required | String | This is where the the user ID will be stored. The recommended method is `localStorage` by specifying `html5`. | `"html5"` | +| storage.name | Required | String | The name of the cookie or html5 local storage where the user ID will be stored. The recommended value is `hadronId`. | `"auHadronId"` | +| storage.expires | Optional | Integer | How long (in days) the user ID information will be stored. The recommended value is 14 days. | `14` | +| value | Optional | Object | Used only if the page has a separate mechanism for storing the Hadron 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 | `{"hadronId": "0a..mb"}` | +| params | Optional | Object | Used to store params for the id system | | +| params.partnerId | Required | Number | This is the Audigent Partner ID obtained from Audigent. | `1234` | From 9d4e02d67060fcb0e50f3c7528c5b23922648581 Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 20 Nov 2024 09:25:05 -0500 Subject: [PATCH 299/816] PBS flexible bidadjustments (#5718) * PBS flexible bidadjustments * lint * added validation notes * review updates * lint * review update --- .../openrtb2/pbs-endpoint-auction.md | 116 ++++++++++++++++++ 1 file changed, 116 insertions(+) diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md index 3f46815f8b..188f4b16a2 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -404,6 +404,15 @@ Bid adapters do not need to read this data from ext.prebid. PBS will merge the a ##### Bid Adjustments +There are two ways PBS can be instructed to adjust bids: + +1. The original `bidadjustmentfactors` approach is simpler and allows for percentage-based adjustments based on bidder and mediatype. +2. The more powerful `bidadjustments` feature allows for percentage, absolute, and static adjustments based on bidder, mediatype and deal IDs. + +If both `bidadjustments` and `bidadjustmentfactors` are specified, the bidadjustments (newer approach) takes precedence. + +###### Original Bid Adjustment Factors + Bidders are encouraged to make Net bids. However, there's no way for Prebid to enforce this. If you find that some bidders use Gross bids, publishers can adjust for it with `request.ext.prebid.bidadjustmentfactors`: @@ -450,6 +459,113 @@ It's also possible to define different bid adjustment factors by mediatype, whic Note that video-outstream is defined to be imp[].video requests where imp[].video.placement is greater than 1. +###### Flexible Bid Adjustments + +A more powerful approach to adjusting bid values can be specifed on the request or in account config. Here's the general format: + +```json5 +{ + "ext": { + "prebid": { + "bidadjustments": { + "mediatype": { + MEDIATYPE: { + BIDDER: { + DEAL: [ {"adjtype": ADJTYPE, "value": ADJVALUE, "currency": CURRENCY} ] + } + } + } + } + } + } +} +``` + +Where: + +- MEDIATYPE can be 'banner', 'video-instream', 'video-oustream', 'native', 'audio', or a wildcard (*) +- BIDDER can be a biddercode or a wildcard (*) +- DEAL can be a dealID or a wildcard (*) +- ADJTYPE can be 'multiplier', 'cpm' or 'static' +- ADJVALUE is a float value. See the table below for more details. +- CURRENCY is a 3 character currency code, e.g. "EUR". This is required for some ADJTYPEs. + +Note that the specific adjustments are after the deal level and are an array of adjustments. Most commonly there will be only one entry in the array, but allowing it to have multiple entries can meet some advanced adjustment use cases. The next couple of sections provide detail on the input values. + +**MediaType** + +{: .table .table-bordered .table-striped } +| MediaType | Definition | Notes | +| --- | --- | --- | +| banner | The response type is format=banner | | +| video-instream | The response type is format=video the request imp.video.placement=1 or imp.video.plcmt=1 | | +| video-outstream | The response type is format=video the request imp.video.placement>1 or imp.video.plcmt>1 | | +| native | The response type is format=native | | +| audio | The response type is format=audio | | +| * | The remaining mediatypes | The wildcard is always used as a default value. i.e. if adjustments are defined for an explicit mediatype, that will take precedence. | + +**Adjustment Types and Values** + +{: .table .table-bordered .table-striped } +| Adjustment Type | Definition | Values | Notes | +| --- | --- | --- | --- | +| multiplier | multiply the bid price by the value | float between 0 and MAXINT | currency doesn't matter in this scenario | +| cpm | subtract the value from the bid price after adjusting for currency | float between 0 and MAXINT | currency must be specified | +| static | ignore the actual bid value and override it with the specified value and currency | float between 0 and MAXINT | currency must be specified | + +**Notes** + +- In all cases, the 'value' is required. +- Any validation failure will skip the whole bid adjustment operation +- The system will attempt to merge request-level and account-level bid adjustments. If this fails it will try to use only the account bid adjustments. +- If there's a validation error, a debug message will be added and a sample will be logged to the PBS log file. + +**Example** + +Here's an example showing a couple of use cases: + +```json5 +{ + "ext": { + "prebid": { + "bidadjustments": { + "mediatype": { + "banner": { + // decrement banner bids from bidderA by 10% + "bidderA": { + "*" : [ {"adjtype": "multiplier", "value": 0.9} ] + }, + "*": { // wildcard bidder only matches if there isn't a more direct match + // bids on deal 111111 are always exactly $3.00 + "111111": [{ + "adjtype": "static", "value": 3.00, "currency": "USD" + }], + // otherwise, always decrement banner bids by $0.10 + "*": [{ + "adjtype": "cpm", "value": 0.1, "currency": "USD" + }] + } + }, + "video-instream": { + // for video bids, take 80% of the bid value and add $0.18. + "*": { // all bidders + "*": [{ // all deals + "adjtype": "multiplier", "value": 0.80 + }, { + "adjtype": "cpm", "value": 0.18, "currency": "USD" + }] + } + } + } + } + } + } +} +``` + +{: .alert.alert-info :} +Note that these bidadjustments can also be specified in the PBS account config in `auction.bidadjustments` + ##### Targeting Targeting refers to strings that are sent to the adserver to From a21c0384d25d588f67239db6b524c894ba108abd Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Thu, 21 Nov 2024 03:59:10 -0800 Subject: [PATCH 300/816] paapi: support for parallel PAAPI and contextual auctions (#5719) * paapi: support for parallel PAAPI and contextual auctions * Formatting --- dev-docs/modules/paapi.md | 100 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/dev-docs/modules/paapi.md b/dev-docs/modules/paapi.md index 71df078690..ce29749fdb 100644 --- a/dev-docs/modules/paapi.md +++ b/dev-docs/modules/paapi.md @@ -44,6 +44,7 @@ This module exposes the following settings: |bidders | Array[String] |Optional list of bidders |Defaults to all bidders | |defaultForSlots | Number |Default value for `imp.ext.ae` in requests for specified bidders |Should be 1 | |componentSeller | Object |Configuration for publishers acting as component sellers | See [note](#componentSeller) | +|parallel | Boolean | If true, start PAAPI auctions in parallel with Prebid auctions when possible | See [parallel auctions](#parallel) | As noted above, PAAPI support is disabled by default. To enable it, set the `enabled` value to `true` for this module and configure `defaultForSlots` to be `1` (meaning _Client-side auction_). using the `setConfig` method of Prebid.js: @@ -132,9 +133,11 @@ Modifying a bid adapter to support PAAPI is a straightforward process and consis 1. Detecting when a bid request is PAAPI eligible 2. Responding with AuctionConfig or InterestGroupBuyer in addition to (or instead of) bids +3. (Optional, but recommended) implementing a `buildPAAPIConfigs` method to support [parallel auctions](#parallel) ### Input parameters + When PAAPI is configured, the following fields are made available to adapters' [`buildRequests`](/dev-docs/bidder-adaptor.html#building-the-request): {: .table .table-bordered .table-striped } @@ -163,6 +166,7 @@ function interpretResponse(resp, req) { } ``` + `paapi` must be an array of objects containing: {: .table .table-bordered .table-striped } @@ -176,6 +180,102 @@ Each object must specify exactly one of `igb` or `config`. An example of this can be seen in the OpenX bid adapter [here](https://github.com/prebid/Prebid.js/blob/master/modules/openxBidAdapter.js) or RTB House bid adapter [here](https://github.com/prebid/Prebid.js/blob/master/modules/rtbhouseBidAdapter.js). + +## Parallel auctions + +PAAPI auctions can be started in parallel with Prebid auctions for a significant improvement in end-to-end latency, +as long as the adapters involved provide at least part of the auction config(s) in advance, before any request is sent to their backend. + +To support parallel execution, adapters can provide a `buildPAAPIConfigs` method, taking [the same arguments as buildRequests](#paapi-input) and returning an array of PAAPI configuration objects in the same format as `interpretResponse`'s [`paapi` parameter](#paapi-output). + +```javascript +registerBidder({ + // ... + buildPAAPIConfigs(validBidRequests, bidderRequest) { + // should return an array of {bidId, config, igb} + } +}) +``` + +When provided, `buildPAAPIConfigs` is invoked just before `buildRequests`, and the configuration it returns is eligible to be immediately used to start PAAPI auctions (whether it will depends on the `parallel` config flag and the top level seller's support for it). + +When _not_ provided, the adapter cannot participate in parallel auctions, and PAAPI configuration returned by `interpretResponse` are liable to be discarded when parallel auctions are enabled. For this reason we recommend implementing `buildPAAPIConfigs`. + +[Some signals](https://github.com/WICG/turtledove/blob/main/FLEDGE.md#211-providing-signals-asynchronously) can be provided asynchronously; Prebid supports this by merging them from the return value of `interpretResponse`, using `bidId` as key. +Notably, however, at least `seller`, `interestGroupBuyers`, and `decisionLogicUrl` must be provided synchronously (i.e., they must be hard-coded). + +For example: + +```javascript +// suppose that `buildPAAPIConfigs` returns the following: +([ + { + bidId: 'bid1', + config: { + seller: 'example.seller', + decisionLogicUrl: 'example.seller/logic.js', + interestGroupBuyers: ['example.buyer'], + auctionSignals: { + foo: 'bar' + }, + perBuyerTimeouts: { + 'example.buyer': 200 + } + } + }, +]) + +// and `interpretResponse` later returns: +({ + paapi: [ + { + bidId: 'bid1', // matches the bidId from `buildPAAPIConfigs` + config: { + // `perBuyerCurrencies` must be provided synchronously; + // this will be ignored + perBuyerCurrencies: { + 'example.buyer': 'USD' + }, + // `auctionSignals` and `sellerSignals` can be provided asynchronously + // and will be merged with those returned by `buildPAAPIConfigs` + auctionSignals: { + bar: 'baz' + }, + sellerSignals: { + foo: 'bar' + } + } + }, + { + bidId: 'bid2', // does not match. + // `config` will be used as-is, but only if no auction was already + // started in parallel for this slot; it will be discarded otherwise. + config: { + /* ... */ + } + } + ] +}) + +// the result as seen in the sandboxed auction for `bid1` will then be: + +({ + seller: 'example.seller', + decisionLogicUrl: 'example.seller/logic.js', + interestGroupBuyers: ['example.buyer'], + auctionSignals: { + foo: 'bar', + bar: 'baz' + }, + perBuyerTimeouts: { + 'example.buyer': 200 + }, + sellerSignals: { + foo: 'bar' + } +}) +``` + ## Related Reading - [paapiForGpt module](/dev-docs/modules/paapiForGpt.html) From fc23cd9b9d43bd1204f14472d05fc427168f8db0 Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Fri, 22 Nov 2024 07:58:21 -0800 Subject: [PATCH 301/816] JS: update documentation for markWinningBidAsUsed/renderer (#5709) --- dev-docs/publisher-api-reference/markWinningBidAsUsed.md | 4 +++- dev-docs/show-outstream-video-ads.md | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/dev-docs/publisher-api-reference/markWinningBidAsUsed.md b/dev-docs/publisher-api-reference/markWinningBidAsUsed.md index 45dfbdd629..bf6338a1af 100644 --- a/dev-docs/publisher-api-reference/markWinningBidAsUsed.md +++ b/dev-docs/publisher-api-reference/markWinningBidAsUsed.md @@ -6,7 +6,8 @@ sidebarType: 1 --- -This function can be used to mark the winning bid as used. This is useful when running multiple video advertisements on the page, since these are not automatically marked as “rendered”. +This function can be used to mark the winning bid as used, removing it from the bid cache. This is useful when running multiple video advertisements on the page, since these are not automatically marked as “rendered”. + If you know the adId, then be specific, otherwise Prebid will retrieve the winning bid for the adUnitCode and mark it accordingly. #### Argument Reference @@ -18,3 +19,4 @@ If you know the adId, then be specific, otherwise Prebid will retrieve the winni | --- | --- | --- | | adUnitCode | `string` | (Optional) The ad unit code | | adId | `string` | (Optional) The id representing the ad we want to mark | +| analytics | `boolean` | (Optional) if true, triggers the 'bidWon' event for the marked bid | diff --git a/dev-docs/show-outstream-video-ads.md b/dev-docs/show-outstream-video-ads.md index 0f6c066454..5446854e22 100644 --- a/dev-docs/show-outstream-video-ads.md +++ b/dev-docs/show-outstream-video-ads.md @@ -80,9 +80,9 @@ Renderers can be attached to adUnits in three ways; Prebid will pick the first t A renderer is an object containing these properties: -1. `url` -- Points to a file containing the renderer script. -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 +1. `render` -- A function that tells Prebid.js how to render a given bid. +2. `url` -- Optional, URL to a javascript file. If provided, Prebid.js will load it before invoking `render`. +3. `backupOnly` -- Optional, 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. From 8d0203350a1fa4afec08bc56df311a38637f892e Mon Sep 17 00:00:00 2001 From: Aleksa Trajkovic Date: Fri, 22 Nov 2024 17:05:34 +0100 Subject: [PATCH 302/816] Gamera Rtd Provider: Initial release (#5695) * - add gameraRtdProvider docs * - update contact info * Update dev-docs/modules/gameraRtdProvider.md Co-authored-by: bretg --------- Co-authored-by: bretg --- dev-docs/modules/gameraRtdProvider.md | 55 +++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 dev-docs/modules/gameraRtdProvider.md diff --git a/dev-docs/modules/gameraRtdProvider.md b/dev-docs/modules/gameraRtdProvider.md new file mode 100644 index 0000000000..f23cbf9b24 --- /dev/null +++ b/dev-docs/modules/gameraRtdProvider.md @@ -0,0 +1,55 @@ +--- +layout: page_v2 +title: Gamera Rtd Provider +display_name: Gamera Rtd Provider +description: Gamera Rtd Provider works in conjunction with the on-page Gamera script to enrich bid requests by adding First Party Data attributes. +page_type: module +module_type: rtd +module_code : gameraRtdProvider +enable_download : true +vendor_specific: true +sidebarType : 1 +--- + +# Gamera Real Time Data Provider + +## Overview + +RTD provider for Gamera.ai that enriches bid requests with real-time data, by populating the [First Party Data](/features/firstPartyData.html) attributes. +The module integrates with Gamera's AI-powered contextual targeting system to provide enhanced bidding capabilities. + +The Gamera RTD Provider works in conjunction with the Gamera script, which must be available on the page for the module to enrich bid requests. To learn more about the Gamera script, please visit the [Gamera website](https://gamera.ai/), or contact [Gamera](mailto:gareth@gamera.ai). + +## Build + +Include the Gamera RTD module in your Prebid.js build: + +```bash +gulp build --modules=rtdModule,gameraRtdProvider,... +``` + +## Configuration + +Configure the module in your Prebid.js configuration: + +```javascript +pbjs.setConfig({ + realTimeData: { + dataProviders: [{ + name: 'gamera', + params: { + // Optional configuration parameters + } + }] + } +}); +``` + +Syntax details: + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|--------------------------|----------|-----------------------------------------------|-------------|----------| +| `name` | required | Real time data module name: Always `'gamera'` | `'gamera'` | `string` | +| `params` | optional | Submodule configuration parameters (none at the moment) | `{}` | `Object` | +| `waitForIt` | optional | Should be `true` if there's an `auctionDelay` defined (defaults to `false`) | `false` | `Boolean` | From d051e9f76c0626b0a87f54047bf0d970422c69f5 Mon Sep 17 00:00:00 2001 From: vdo-ai-tech <126867429+vdo-ai-tech@users.noreply.github.com> Date: Fri, 22 Nov 2024 21:54:02 +0530 Subject: [PATCH 303/816] Doc features and its value updated in vdoai (#5690) * doc features updated * updated fields --------- Co-authored-by: Amandeep --- dev-docs/bidders/vdoai.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dev-docs/bidders/vdoai.md b/dev-docs/bidders/vdoai.md index d4d9649ae5..1afc85545a 100644 --- a/dev-docs/bidders/vdoai.md +++ b/dev-docs/bidders/vdoai.md @@ -5,6 +5,12 @@ description: Prebid vdo.ai Bidder Adaptor pbjs: true biddercode: vdoai media_types: banner, video +userIds: check with bidder +floors_supported: true +coppa_supported: true +schain_supported: true +tcfeu_supported: false +usp_supported: true sidebarType: 1 --- From 7e79420a55dc8cacea6186fc6a76025bc6a87cda Mon Sep 17 00:00:00 2001 From: Pranav Sheth <57259342+pranavsheth@users.noreply.github.com> Date: Fri, 22 Nov 2024 23:35:14 +0530 Subject: [PATCH 304/816] New Bidder:ehealthcaresolutions (#5686) * New Bidder:tapnative * made requested changes * made requested changes * new bidder:ehealthcaresolutions * moved ehealthcaresolutions md from modules to bidders --- dev-docs/bidders/ehealthcaresolutions.md | 92 ++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 dev-docs/bidders/ehealthcaresolutions.md diff --git a/dev-docs/bidders/ehealthcaresolutions.md b/dev-docs/bidders/ehealthcaresolutions.md new file mode 100644 index 0000000000..1b089365fd --- /dev/null +++ b/dev-docs/bidders/ehealthcaresolutions.md @@ -0,0 +1,92 @@ +--- +layout: bidder +title: eHealthcareSolutions +description: Prebid eHealthcareSolutions Bidder Adaptor +pbjs: true +biddercode: ehealthcaresolutions +media_types: banner, native +tcfeu_supported: false +usp_supported: true +coppa_supported: true +gpp_sids: usstate_all +schain_supported: false +safeframes_ok: false +ortb_blocking_supported: false +dsa_supported: false +deals_supported: true +floors_supported: true +sidebarType: 1 +--- +### Registration + +For assistance or setup instructions, please contact us at . + +### Banner Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|----------------|-----------|-----------------------|----------------|----------| +| `placement_id` | mandatory | Placement Id | `111520` | `number` | +| `height` | optional | Height of the creative| `250` | `number` | +| `width` | optional | Width of the creative | `300` | `number` | +| `bid_floor` | optional | Bid Floor Price | `0.5` | `decimal`| + +### AdUnit Format for Banner + +```javascript +var adUnits = [ + { + code: 'banner-ad', + mediaTypes: { + banner: { + sizes: [[300, 250]] + } + }, + bids: [{ + bidder: 'ehealthcaresolutions', + params: { + placement_id: 111520, + height: 250, + width: 300, + bid_floor: 0.5 + } + }] + } + ]; +``` + +### Native Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|----------------|-----------|-----------------------|----------------|----------| +| `placement_id` | mandatory | Placement Id | `111519` | `number` | +| `bid_floor` | optional | Bid Floor Price | `1` | `decimal`| + +### AdUnit Format for Native + +```javascript +var adUnits = [ + { + code: 'native-ad-container', + mediaTypes: { + native: { + title: { required: true, len: 100 }, + image: { required: true, sizes: [300, 250] }, + sponsored: { required: false }, + clickUrl: { required: true }, + desc: { required: true }, + icon: { required: false, sizes: [50, 50] }, + cta: { required: false } + } + }, + bids: [{ + bidder: 'ehealthcaresolutions', + params: { + placement_id: 111519, // Required parameter + bid_floor: 1 // Optional parameter + } + }] + } + ]; +``` From 84c630e97fc4c561dc2a7d161a3616ebd84744a8 Mon Sep 17 00:00:00 2001 From: thede-ri <161479447+thede-ri@users.noreply.github.com> Date: Fri, 22 Nov 2024 14:16:45 -0500 Subject: [PATCH 305/816] New User ID submodule: Rewarded Interest (#5660) * UserID submodule: rewardedInterestIdSystem * rewardedInterest: wording update * UserID submodule: rewardedInterestIdSystem - fixed styles --------- Co-authored-by: Konstantin Mikhalyov Co-authored-by: Eugene Dorfman --- dev-docs/modules/userId.md | 3 +- .../userid-submodules/rewardedInterest.md | 36 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 dev-docs/modules/userid-submodules/rewardedInterest.md diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md index ba4c2c7168..2cc57d1712 100644 --- a/dev-docs/modules/userId.md +++ b/dev-docs/modules/userId.md @@ -85,7 +85,7 @@ The table below has the options that are common across ID systems. See the secti {: .table .table-bordered .table-striped } | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | -| name | Required | String | May be any of the following values: {% for page in userid_pages -%}{% if count == 1 %}{{ name_string │ append: ", " -}}{% endif %}{% assign count = 1 %}`"{{ name_string │ append: name_string -}}{{ name_string │ append: page.useridmodule -}}"`{% endfor %} | `"unifiedId"` | +| name | Required | String | May be any of the following values: {% for page in userid_pages -%}`"{{ page.useridmodule -}}"`{% if forloop.last == false -%}, {% endif -%}{% endfor -%} | `"unifiedId"` | | params | Based on User ID sub-module | Object | | | | bidders | Optional | Array of Strings | An array of bidder codes to which this user ID may be sent. | `['bidderA', 'bidderB']` | | storage | Optional | Object | The publisher can specify some kind of local storage in which to store the results of the call to get the user ID. This can be a cookie, HTML5 storage or both.| | @@ -252,6 +252,7 @@ Bidders that want to support the User ID module in Prebid.js need to update thei | Publisher Link ID | n/a | publinkId | epsilon.com | | | PubProvided ID | n/a | pubProvidedId | publisher domain | "1111" | | Quantcast ID | n/a | quantcastId | quantcast.com | "1111" | +| Rewarded Interest ID | Rewarded Interest | rewardedInterestId | rewardedinterest.com | "1111" | | Tapad ID | Tapad | tapadId | tapad.com | "1111" | | Teads ID | Teads | teadsId | teads.com | "1111" | | SharedID (PBJS 5.x) | n/a | pubcid | pubcid.org | "1111" | diff --git a/dev-docs/modules/userid-submodules/rewardedInterest.md b/dev-docs/modules/userid-submodules/rewardedInterest.md new file mode 100644 index 0000000000..9a1617d47f --- /dev/null +++ b/dev-docs/modules/userid-submodules/rewardedInterest.md @@ -0,0 +1,36 @@ +--- +layout: userid +title: Rewarded Interest ID +description: Rewarded Interest User ID Submodule +useridmodule: rewardedInterestIdSystem +--- + +[Rewarded Interest](https://www.rewardedinterest.com/) is an identity provider that enables users to monetize and manage the exposure of their identity to various ad providers through the Rewarded Interest browser extension. + +This submodule passes the Rewarded Interest Identity Token, obtained from the browser extension, into the oRTB request. The Identity Token is included only if the browser has the Rewarded Interest extension installed, and the user has authorized it to share the token. + +The Rewarded Interest Identity Token itself does not reveal the user's identity, as it is encrypted and refreshed frequently. Rewarded Interest partners (such as DSPs, SSPs, and publishers) can use the Rewarded Interest Identity Resolution API to resolve the Identity Token into a CMAID (Consumer Mediated Advertising Identifier). The CMAID is a durable, cross-site, cross-device advertising identifier that remains consistent across visits and devices enrolled by a Rewarded Interest user, unless they choose to reset or pause it. + +Add this submodule to your Prebid.js wrapper with: + +{: .alert.alert-info :} +gulp build --modules=userId,rewardedInterestIdSystem + +## Rewarded Interest ID Configuration + +{: .table .table-bordered .table-striped } +| Param under usersync.userIds[] | Scope | Type | Description | Example | +|--------------------------------|----------|--------|--------------------------|------------------------| +| name | Required | String | The name of this module. | `"rewardedInterestId"` | + +## Rewarded Interest ID Example + +```javascript +pbjs.setConfig({ + userSync: { + userIds: [{ + name: "rewardedInterestId" + }] + } +}) +``` From 34b9761dc93945c810ff874fb7df6e42dc625f09 Mon Sep 17 00:00:00 2001 From: EvgeniiMunin <35193823+EvgeniiMunin@users.noreply.github.com> Date: Mon, 25 Nov 2024 12:21:07 -0800 Subject: [PATCH 306/816] Greenbids RTD Module (#5613) * Greenbids RTD Module * test commit * configs * doc configs + analytics tags * fmt * fmt * fix review --- .../pbs-modules/greenbids-real-time-data.md | 175 ++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 prebid-server/pbs-modules/greenbids-real-time-data.md diff --git a/prebid-server/pbs-modules/greenbids-real-time-data.md b/prebid-server/pbs-modules/greenbids-real-time-data.md new file mode 100644 index 0000000000..5c6a25c4fa --- /dev/null +++ b/prebid-server/pbs-modules/greenbids-real-time-data.md @@ -0,0 +1,175 @@ +--- +layout: page_v2 +page_type: pbs-module +title: Prebid Server Greenbids Real Time Data Module +display_name : Greenbids Real Time Data Module +sidebarType : 5 +--- + +# Greenbids Real Time Data Module + +## Overview + +Greenbids Real Time Data module filters bidders SSPs listed in the `imp[].ext.prebid.bidder` of the bid request. +To perform the filtering the module uses AI to predict the bidding probability of bid per SSP for each `imp` for the given bid request. +This bidding probability is used to choose to send the bid request or not, according to the performance constraints applied by the partner publisher. + +The RTD module uses 2 artefacts that are fetched from the Greenbids Google Cloud Storage bucket + +- ML predictor in `.onnx` format: used to predict the bidding probability +- Probability thresholds in `.json` format: used to convert the bidding probability to a binary choice + +## Configuration + +### Execution Plan + +This module supports running at: + +- processed-auction-request: this is where PBS bid request enrichments +are done before customizing it to a particular bidder in the auction. + +### Account-Level Config + +Here's an example of the account config used in PBS-Java: + +```yaml +hooks: + greenbids-real-time-data: + enabled: true + host-execution-plan: > + { + "endpoints": { + "/openrtb2/auction": { + "stages": { + "processed-auction-request": { + "groups": [ + { + "timeout": 100, + "hook-sequence": [ + { + "module-code": "greenbids-real-time-data", + "hook-impl-code": "greenbids-real-time-data-processed-auction-request-hook" + } + ] + } + ] + } + } + } + } + } +``` + +### List of module configuration options + +- `google-cloud-greenbids-project`: Google Cloud project associated with Greenbids +- `gcs-bucket-name`: Google Cloud Storage (GCS) bucket used to fetch the artefacts ([ONNX](https://onnx.ai/) model and thresholds `.json`) necessary for prediction +- `cache-expiration-minutes`: The duration (in minutes) after which cached model and thresholds should be considered expired and refreshed +- `geo-lite-country-path`: URL to the geo-ip database +- `onnx-model-cache-key-prefix`: prefix necessary for getting cached ONNX model +- `thresholds-cache-key-prefix`: prefix necessary for getting cached throttling thresholds + +```yaml +greenbids-real-time-data: + google-cloud-greenbids-project: "greenbids-357713" + gcs-bucket-name: "greenbids-europe-west1-prebid-server-staging" + cache-expiration-minutes: 15 + geo-lite-country-path: "https://git.io/GeoLite2-Country.mmdb" + onnx-model-cache-key-prefix: "onnxModelRunner_" + thresholds-cache-key-prefix: "throttlingThresholds_" +``` + +### Publisher bid request settings + +The activated partner publishers add their configs direclty into `bid-request.json` +where they indicate the activation of our module +in bid request extenstion `bid-request.ext.prebid.analytics.greenbids` +for [Analytics Reporter](https://docs.prebid.org/prebid-server/pbs-modules/greenbids-analytics-reporter.html) and +`bid-request.ext.prebid.analytics.greenbids-rtd` for Greenbids RTD Module. + +The list of the parameters necessary for RTD module activation is as follows: + +| Parameter | Scope | Description | Example | Type | +|-----------------|-------------------|-----------------------------------------------------------------------------------------------------|-----------------------|--------------| +| pbuid | required | The Greenbids Publisher ID | greenbids-publisher-1 | string | +| targetTpr | required | Expected retained opportunities ratio [0-1] | 0.9 | float | +| explorationRate | required | Ratio of traffic without filtering used for training ML model [0-1] (a value of 0.1 will filter 90% of the traffic) | 0.1 | float | + +Here's an example of how a PBS partner publisher setup using both Greenbids RTD Module and Greenbids AnalyticsReporter should look like: + +```json +"ext": { + "prebid": { + "analytics": { + // extension for Greenbids Analytics Reporter + "greenbids": { + "pbuid": "PBUID_FROM_GREENBIDS", + "greenbidsSampling": 0.01 + }, + // extension for Greenbids Real Time Data Module + "greenbids-rtd": { + "pbuid": "PBUID_FROM_GREENBIDS", + "targetTpr": 0.95, + "explorationRate": 0.001 + } + } + } + } +``` + +### Enable for Spring Boot + +In order to allow the module to be picked up by PBS-Java, a Spring Boot configuration property `hooks.greenbids-real-time-data.enabled` must be set to `true`. + +Here's an example of how your PBS configuration YAML should look like: + +```YAML +hooks: + greenbids-real-time-data: + enabled: true +``` + +## Analytics Tags + +The RTD module also communicates the filtering results with the `GreenbidsAnalyticsReporter` via [AnalyticsTags](https://docs.prebid.org/prebid-server/developers/module-atags.html). +Here we populate analytics result of analytics tags for each `imp` the with: + +- `fingerprint`: greenbidsId +- `isKeptInAuction`: map of booleans for each bidder whether we keep them in auction or not for the given imp +- `isExploration`: flag that is necessary to isolate the training data + +The analytics tag is then parsed by the AnalyticsReporter from `HookExecutionContext` +and its content added to the analytics payload sent to Greenbids server. The exploration part of traffic is split randomly with the ratio defined for each partner publisher +per bid requests and is not filtered by the RTD module. + +Here's an example analytics tag that might be produced for use in an analytics adapter: + +```json +[{ + "pub_banniere_haute": { + "greenbids": { + "fingerprint": "ad63524e-b13f-4359-a975-dba9b5dc08f4", + "keptInAuction": { + "improvedigital": false, + "appnexus": true, + "pubmatic": false, + "rubicon": true, + "teads": false + }, + "isExploration": false + }, + "tid": "2c445309-06b2-47b2-a724-4aeef15faeb8" + } +}] +``` + +## Maintainer contacts + +For any questions and suggestions please reach out to our team for more information [greenbids.ai](https://greenbids.ai). + +Or just open new [issue](https://github.com/prebid/prebid-server-java/issues/new) or [pull request](https://github.com/prebid/prebid-server-java/pulls) in this repository. + +## Further Reading + +- [Prebid Server Module List](/prebid-server/pbs-modules/index.html) +- [Building a Prebid Server Module](/prebid-server/developers/add-a-module.html) From ab5dc732c0cf35066db65791fe70cacc5e44370e Mon Sep 17 00:00:00 2001 From: yuva-inmobi-1 Date: Tue, 26 Nov 2024 13:35:42 +0530 Subject: [PATCH 307/816] New Bidder:InMobi (#5722) * prebidJs changes for inmobi.md file * change the usp support * space correction * lint issues --- dev-docs/bidders/inmobi.md | 94 +++++++++++++++++++++++++++++++++++++- 1 file changed, 93 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/inmobi.md b/dev-docs/bidders/inmobi.md index 456433b46b..b8fd3e9323 100644 --- a/dev-docs/bidders/inmobi.md +++ b/dev-docs/bidders/inmobi.md @@ -4,7 +4,7 @@ title: InMobi description: InMobi Bidder Adapter biddercode: inmobi tcfeu_supported: true -usp_supported: false +usp_supported: true gvl_id: 333 coppa_supported: true schain_supported: true @@ -12,6 +12,7 @@ media_types: banner, video, native pbs: true pbs_app_supported: true sidebarType: 1 +pbjs: true --- ### Note @@ -30,6 +31,97 @@ To opt out of InMobi ads on web inventory the user needs to visit the Opt-out pa ### Bid Params {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example | Type | |---------------|----------|-----------------------|-----------|-----------| | `plc` | required | Placement ID | `'1234'` | `string` | + +### First Party Data + +Inmobi supports both `ortb2` and `ortb2Imp` methods to set [First Party Data](https://docs.prebid.org/features/firstPartyData.html). + +The standard Open RTB properties supported from `ortb2` / `ortb2Imp` are described in the following table. + +{: .table .table-bordered .table-striped } + +| Name | Scope | Description | Example | Type | +|-------------------|----------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------|-----------| +| `ortb2Imp.instl` | optional | Details on interstitial/full-screen, 1 indicates that the ad is interstitial or full-screen, while 0 means it is not. | `1` | `integer` | +| `ortb2Imp.rwdd` | optional | Specifies if the user receives a reward for viewing the ad: 0 for no, and 1 for yes. | `1` | `integer` | +| `ortb2.user` | optional | Information about the advertising device's human user, provided through an OpenRTB User object. | N/A | `object` | +| `ortb2.site` | optional | Information about the publisher's website provided through an OpenRTB Site object. | N/A | `object` | +| `ortb2.device` | optional | Information about the user's device provided through an OpenRTB device object. | N/A | `object` | +| `ortb2.bcat` | optional | Blocked advertiser categories using the IAB content categories. | `[ "IAB25" ]` | `string array` | +| `ortb2.badv` | optional | Block list of advertisers by their domains | `[ "ford.com" ]` | `string array` | +| `ortb2.regs` | optional | Regulatory conditions in effect for all impressions in this bid request. | N/A | `object` | + +Besides these standard properties, `ext` field can be used to send any publisher specific data which may have been discussed with a Inmobi partner manager. + +### Example Ad-Units + +## Banner + +```javascript + var adUnits = [{ + code: 'div-gpt-ad-1460505748561-0', + mediaTypes: { + banner: { + sizes: [[300, 250]], + } + }, + bids: [{ + bidder: 'inmobi', + params: { + plc: '1719108420057' // Mandatory + } + }] + }]; +``` + +## Video + +```javaScript + var adUnits = [{ + code: 'div-gpt-ad-1460505748561-0', + mediaTypes: { + video: { + playerSize : [300,250], + mimes : ["video/x-ms-wmv", "video/mp4"], + minduration : 0, + maxduration: 30, + protocols : [1,2], + api: [1, 2, 4, 6], + protocols: [3, 4, 7, 8, 10], + placement: 1, + plcmt: 1 + } + }, + // Replace this object to test a new Adapter! + bids: [{ + bidder: 'inmobi', + params: { + plc: '1443164204446401' //Mandatory + } + }] + }]; +``` + +## Native + +```javascript + var adUnits = [{ + code: 'div-gpt-ad-1460505748561-0', + mediaTypes: { + native: { + type: 'image' + } + }, + bids: [{ + bidder: 'inmobi', + params: { + plc: '10000033152', + bidfloor: 0.9 + } + }] + }]; +``` From 9a4847213e9380bad2f88c7361a0e53e755d85d3 Mon Sep 17 00:00:00 2001 From: Denis Logachov Date: Thu, 28 Nov 2024 16:46:28 +0200 Subject: [PATCH 308/816] Create revbid.md (#5704) --- dev-docs/bidders/revbid.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 dev-docs/bidders/revbid.md diff --git a/dev-docs/bidders/revbid.md b/dev-docs/bidders/revbid.md new file mode 100644 index 0000000000..615709768b --- /dev/null +++ b/dev-docs/bidders/revbid.md @@ -0,0 +1,36 @@ +--- +layout: bidder +title: RevBid +description: RevBid Adaptor +biddercode: revbid +pbjs: true +pbs: false +media_types: banner, native, video +gvl_id: 14 (adkernel) +tcfeu_supported: true +gpp_sids: tcfeu, usp +usp_supported: true +coppa_supported: true +pbs_app_supported: false +schain_supported: true +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel +sidebarType: 1 +--- + +### Note + +The RevBid bidding adapter requires setup and approval before implementation. Please reach out to for more details. + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|----------|----------|-----------------------|---------------------------|----------| +| `host` | required | RTB host | `'cpm.revbid.net'` | `string` | +| `zoneId` | required | Zone Id | 30164 | `integer` | From 25e05e237676f4f532edbc2c44bdb443db0d118a Mon Sep 17 00:00:00 2001 From: "Md. Soman Mia Sarker" Date: Thu, 28 Nov 2024 20:46:49 +0600 Subject: [PATCH 309/816] Video Support (#5715) --- dev-docs/bidders/adgrid.md | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/adgrid.md b/dev-docs/bidders/adgrid.md index db31ea8a24..014b75d921 100644 --- a/dev-docs/bidders/adgrid.md +++ b/dev-docs/bidders/adgrid.md @@ -1,9 +1,9 @@ --- layout: bidder title: AdGrid -description: Prebid AdGrid Bidder Adaptor +description: Prebid AdGrid Bidder Adapter biddercode: adgrid -media_types: banner +media_types: banner, video pbjs: true tcfeu_supported: false dsa_supported: false @@ -67,6 +67,24 @@ var adUnits = [ domainId: 67890 } }] + }, + // Video adUnit + { + code: 'test-video-div', + mediaTypes: { + video: { + playerSize: [ + [640, 480] + ], + context: 'instream' + } + }, + bids: [{ + bidder: 'adgrid', + params: { + domainId: 12345 + } + }] } ]; ``` From 72f83d3c866d81fd63aa76102c377b8bdeca464e Mon Sep 17 00:00:00 2001 From: andreasgreen Date: Thu, 28 Nov 2024 15:48:39 +0100 Subject: [PATCH 310/816] Bidtheatre Bidder Adapter: initial release, docs (#5723) --- dev-docs/bidders/bidtheatre.md | 52 ++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 dev-docs/bidders/bidtheatre.md diff --git a/dev-docs/bidders/bidtheatre.md b/dev-docs/bidders/bidtheatre.md new file mode 100644 index 0000000000..65266bc0f6 --- /dev/null +++ b/dev-docs/bidders/bidtheatre.md @@ -0,0 +1,52 @@ +--- +layout: bidder +title: Bidtheatre +description: Bidtheatre Prebid Bidder Adapter +biddercode: bidtheatre +gvl_id: 30 +tcfeu_supported: true +media_types: banner, video +safeframes_ok: true +deals_supported: true +floors_supported: true +fpd_supported: true +ortb_blocking_supported: partial +multiformat_supported: will-bid-on-any +privacy_sandbox: topics +pbjs: true +sidebarType: 1 +pbs: false +pbs_app_supported: false +--- + +### Registration + +The Bidtheatre bidding adapter requires manual set up before use. Please contact us at [operations@bidtheatre.com](mailto:operations@bidtheatre.com) if you would like to access Bidtheatre's demand. + +### Bid Params + +{: .table .table-bordered .table-striped } + +| Name | Scope | Description | Example | Type | +|---------------|----------|-----------------------|-----------|-----------| +| `publisherId` | required | Manually set up publisher ID | `'73b20b3a-12a0-4869-b54e-8d42b55786ee'` | `string` | + +In addition to the required bid param above, Bidtheatre will also enforce the following requirements + +- All ad slots on a page must belong to the same publisher ID +- The publisher must provide either a client IP and/or explicit geo data in the request + +### First Party Data + +Publishers should use the `ortb2` method of setting First Party Data. All standard OpenRTB 2.5 properties are supported, including but not limited to + +- ortb2.site.* +- ortb2.user.* + +### ORTB Blocking + +`bcat`, `badv` and `battr` are all supported. + +### Media Types + +All standard OpenRTB 2.5 properties are supported for both banner and video. Bidtheatre Bidding adapter will always return VAST 2.0 or lower for video requests. From 416648719115c255e5f64c5bf44ba64afca39902 Mon Sep 17 00:00:00 2001 From: Copper6SSP Date: Thu, 28 Nov 2024 16:49:19 +0200 Subject: [PATCH 311/816] Copper6ssp Bid Adapter: add gvl_id (#5727) * release adapter Copper6SSP * fix checks * fix doc * add gvl_id --- dev-docs/bidders/copper6ssp.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/copper6ssp.md b/dev-docs/bidders/copper6ssp.md index a11dc64104..ee0131c1ac 100644 --- a/dev-docs/bidders/copper6ssp.md +++ b/dev-docs/bidders/copper6ssp.md @@ -4,7 +4,8 @@ title: Copper6SSP description: Prebid Copper6SSP Bidder Adapter biddercode: copper6ssp gpp_sids: usstate_all -tcfeu_supported: false +gvl_id: 1356 +tcfeu_supported: true usp_supported: true coppa_supported: true schain_supported: true From 02f75617167b2a69fd68d3e328a6b7de1413910d Mon Sep 17 00:00:00 2001 From: Muki Seiler Date: Thu, 28 Nov 2024 15:49:39 +0100 Subject: [PATCH 312/816] Remove unused disqus plugin (#5705) --- _includes/disqus_addon.html | 5 ----- _layouts/api_prebidjs.html | 4 ---- _layouts/bidder.html | 4 ---- _layouts/internal_api_prebidjs.html | 4 ---- _layouts/test.html | 3 --- 5 files changed, 20 deletions(-) delete mode 100644 _includes/disqus_addon.html diff --git a/_includes/disqus_addon.html b/_includes/disqus_addon.html deleted file mode 100644 index 0a6d69eaab..0000000000 --- a/_includes/disqus_addon.html +++ /dev/null @@ -1,5 +0,0 @@ - - - -
    - diff --git a/_layouts/api_prebidjs.html b/_layouts/api_prebidjs.html index 1fe9a1afe8..487551fe54 100644 --- a/_layouts/api_prebidjs.html +++ b/_layouts/api_prebidjs.html @@ -39,10 +39,6 @@

    {{ page.title }}

    Back to Publisher API Reference

    - - {% if page.show_disqus %} - {% include disqus_addon.html %} - {% endif %} diff --git a/_layouts/bidder.html b/_layouts/bidder.html index 54c7c37499..62a52c9e95 100644 --- a/_layouts/bidder.html +++ b/_layouts/bidder.html @@ -86,10 +86,6 @@

    "Send All Bids" Ad Server Keys

    Back to Bidders

    - - {% if page.show_disqus %} - {% include disqus_addon.html %} - {% endif %} diff --git a/_layouts/internal_api_prebidjs.html b/_layouts/internal_api_prebidjs.html index 4098fa3c1e..1047377310 100644 --- a/_layouts/internal_api_prebidjs.html +++ b/_layouts/internal_api_prebidjs.html @@ -39,10 +39,6 @@

    {{ page.title }}

    Back to Internal API Reference

    - - {% if page.show_disqus %} - {% include disqus_addon.html %} - {% endif %} diff --git a/_layouts/test.html b/_layouts/test.html index 945088e888..fe14d47a2b 100644 --- a/_layouts/test.html +++ b/_layouts/test.html @@ -49,9 +49,6 @@

    Send All Bids Ad Server Keys

    - {% if page.show_disqus %} - {% include disqus_addon.html %} - {% endif %} From eb48a25a2b593a8fbb076fef30ee6d651f9fdf85 Mon Sep 17 00:00:00 2001 From: Muki Seiler Date: Thu, 28 Nov 2024 15:53:40 +0100 Subject: [PATCH 313/816] Add userId link to module overview page (#5708) --- _data/sidebar.yml | 8 +++++++ dev-docs/modules/index.md | 26 ++++++++++++++++++++++ dev-docs/modules/userId.md | 3 +++ dev-docs/modules/userid-submodules/utiq.md | 1 + 4 files changed, 38 insertions(+) diff --git a/_data/sidebar.yml b/_data/sidebar.yml index 14813a6bc3..8da383a65c 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -490,6 +490,14 @@ sectionTitle: subgroup: 5 +- sbSecId: 1 + title: User ID Modules + link: /dev-docs/modules/index.html#user-id-modules + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 5 + - sbSecId: 1 title: External Interfaces link: diff --git a/dev-docs/modules/index.md b/dev-docs/modules/index.md index 7102b79b82..6141433aa6 100644 --- a/dev-docs/modules/index.md +++ b/dev-docs/modules/index.md @@ -89,6 +89,32 @@ These modules may require accounts with a service provider. +## User ID Modules + +UserID modules conform to a consistent set of publisher controls. The publisher can choose to run multiple user id modules, define an overall amount of time they're willing to wait for +results. See [the userSync setConfig](/dev-docs/publisher-api-reference/setConfig.html#setConfig-ConfigureUserSyncing-UserSyncProperties) reference and the [User ID Module](/dev-docs/modules/userId.md) for more details. + +{% assign userid_module_pages = site.pages | where: "layout", "userid" %} + + + + + + + + + + +{% for page in userid_module_pages %} + + + + + +{% endfor %} + +
    ModuleDescriptionEID Source
    {{page.title}}{{page.description}}{{page.eidsource}}
    + ## Further Reading - [Source code of all modules](https://github.com/prebid/Prebid.js/tree/master/modules) diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md index 2cc57d1712..09f311c199 100644 --- a/dev-docs/modules/userId.md +++ b/dev-docs/modules/userId.md @@ -71,6 +71,7 @@ Publishers using Google AdManager may want to sync one of the identifiers as the The PPID in GAM (which is unrelated to the PPID UserId Submodule) has strict rules; refer to [Google AdManager documentation](https://support.google.com/admanager/answer/2880055?hl=en) for them. Please note, Prebid uses a [GPT command](https://developers.google.com/publisher-tag/reference#googletag.PubAdsService) to sync identifiers for publisher convenience. It doesn't currently work for instream video requests, as Prebid typically interacts with the player, which in turn may interact with IMA. IMA does has a [similar method](https://developers.google.com/interactive-media-ads/docs/sdks/html5/client-side/reference/js/google.ima.ImaSdkSettings#setPpid) as GPT, but IMA does not gather this ID from GPT. {: .table .table-bordered .table-striped } + | Param under userSync | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | ppid | Optional | String | Must be a source from the [pbjs.getUserIdsAsEids()](#getUserIdsAsEids) array | `"pubcid.org"` | @@ -83,6 +84,7 @@ The table below has the options that are common across ID systems. See the secti {% assign count = 0 %} {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | May be any of the following values: {% for page in userid_pages -%}`"{{ page.useridmodule -}}"`{% if forloop.last == false -%}, {% endif -%}{% endfor -%} | `"unifiedId"` | @@ -364,6 +366,7 @@ Please find more details [Share encrypted signals with bidders (Beta)](https://s Alternatively, GAM can now pull IDs from Prebid for UserId submodules that [register with GAM](https://services.google.com/fb/forms/encryptedsignalsforpublishers-signalcollectorform/) For those registered submodules, publishers can [select Prebid UserID module (Beta) under "Signal collection deployment."](https://support.google.com/admanager/answer/10488752?hl=en). Publishers selecting this option should not also select those identifiers in the `encryptedSignalSources.sources.source` array. {: .table .table-bordered .table-striped } + | Param under userSync | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | encryptedSignalSources | Optional | Object | Publisher can specify the ESP config by adding encryptedSignal Object under userSync Object | | diff --git a/dev-docs/modules/userid-submodules/utiq.md b/dev-docs/modules/userid-submodules/utiq.md index 116f4eaa66..1b3f202ac2 100644 --- a/dev-docs/modules/userid-submodules/utiq.md +++ b/dev-docs/modules/userid-submodules/utiq.md @@ -12,6 +12,7 @@ Utiq is also the brand name of the service, which is provided by Utiq SA/NV. ## Utiq ID configuration {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | The name of the module | `"utiqId"` | From 8b6c2cd8c91d69015dc5b38c1aa03ea54b03d13f Mon Sep 17 00:00:00 2001 From: Denis Logachov Date: Thu, 28 Nov 2024 16:59:37 +0200 Subject: [PATCH 314/816] Adkernel: documenting OppaMedia alias (#5730) --- dev-docs/bidders/oppamedia.md | 36 +++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 dev-docs/bidders/oppamedia.md diff --git a/dev-docs/bidders/oppamedia.md b/dev-docs/bidders/oppamedia.md new file mode 100644 index 0000000000..6314959b81 --- /dev/null +++ b/dev-docs/bidders/oppamedia.md @@ -0,0 +1,36 @@ +--- +layout: bidder +title: OppaMedia +description: OppaMedia Bidder Adaptor +biddercode: oppamedia +pbjs: true +pbs: false +media_types: banner, native, video +gvl_id: 14 (adkernel) +tcfeu_supported: true +usp_supported: true +coppa_supported: true +gpp_supported: true +pbs_app_supported: true +schain_supported: true +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel +sidebarType: 1 +--- + +### Note + +The OppaMedia bidding adapter requires setup and approval before implementation. Please reach out to for more details. + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|----------|----------|-----------------------|---------------------------|----------| +| `host` | required | Host | `'cpm.oppa.media'` | `string` | +| `zoneId` | required | Zone Id | `30164` | `integer` | From 44c1b8e999080f74e6077df22eb0520be82e2ade Mon Sep 17 00:00:00 2001 From: Muki Seiler Date: Thu, 28 Nov 2024 17:17:20 +0100 Subject: [PATCH 315/816] Implement initial proposal for new userId module meta fields - #5060 (#5673) * Implement initial proposal for new userId module meta fields * Fix linting errors in sharedid md * Migrate all meta data to userId files * Fix linting issues in hadron.md * fix table in mediawallah * Fix dmd table * Fix novatiq id table * fix publisherlink table * Fix liveramp table * Fix trustpid table * Fix yahoo table * Fix yahoo table * Remove empty line * Remove empty line #2 --- _layouts/userid.html | 18 +++++ dev-docs/modules/idLibrary.md | 4 +- dev-docs/modules/userId.md | 64 ++++-------------- .../modules/userid-submodules/33across.md | 4 ++ dev-docs/modules/userid-submodules/admixer.md | 7 +- dev-docs/modules/userid-submodules/adquery.md | 3 + dev-docs/modules/userid-submodules/adriver.md | 4 ++ .../modules/userid-submodules/adtelligent.md | 6 +- dev-docs/modules/userid-submodules/amxrtb.md | 3 + .../modules/userid-submodules/audienceone.md | 7 +- .../modules/userid-submodules/britepool.md | 7 +- .../modules/userid-submodules/ceeIdSystem.md | 4 ++ dev-docs/modules/userid-submodules/cpexid.md | 7 +- dev-docs/modules/userid-submodules/criteo.md | 6 +- .../modules/userid-submodules/deepintent.md | 4 ++ dev-docs/modules/userid-submodules/dmd.md | 11 ++- dev-docs/modules/userid-submodules/euid.md | 7 +- dev-docs/modules/userid-submodules/fabrick.md | 7 +- dev-docs/modules/userid-submodules/floc.md | 3 + .../modules/userid-submodules/freepass.md | 4 ++ dev-docs/modules/userid-submodules/ftrack.md | 4 ++ dev-docs/modules/userid-submodules/gravito.md | 7 +- .../modules/userid-submodules/growthcode.md | 7 +- dev-docs/modules/userid-submodules/hadron.md | 8 ++- dev-docs/modules/userid-submodules/id5.md | 7 +- dev-docs/modules/userid-submodules/idplus.md | 6 +- dev-docs/modules/userid-submodules/idx.md | 4 +- dev-docs/modules/userid-submodules/imuid.md | 4 +- .../modules/userid-submodules/intentiq.md | 6 +- dev-docs/modules/userid-submodules/kinesso.md | 8 ++- .../modules/userid-submodules/liveintent.md | 4 ++ dev-docs/modules/userid-submodules/lotame.md | 7 +- .../modules/userid-submodules/mediawallah.md | 11 +-- dev-docs/modules/userid-submodules/merkle.md | 3 + dev-docs/modules/userid-submodules/netid.md | 3 + dev-docs/modules/userid-submodules/novatiq.md | 14 ++-- dev-docs/modules/userid-submodules/onekey.md | 4 +- dev-docs/modules/userid-submodules/pair.md | 4 +- .../modules/userid-submodules/parrable.md | 7 +- .../userid-submodules/publisherlink.md | 6 +- .../modules/userid-submodules/pubprovided.md | 67 ++++++++++--------- .../modules/userid-submodules/quantcast.md | 7 +- dev-docs/modules/userid-submodules/ramp.md | 11 ++- .../modules/userid-submodules/sharedid.md | 15 +++-- dev-docs/modules/userid-submodules/tapad.md | 7 +- dev-docs/modules/userid-submodules/teads.md | 4 ++ .../modules/userid-submodules/tncIdSystem.md | 3 +- .../modules/userid-submodules/trustpid.md | 6 +- dev-docs/modules/userid-submodules/unified.md | 7 +- .../modules/userid-submodules/unified2.md | 4 +- dev-docs/modules/userid-submodules/utiq.md | 3 + dev-docs/modules/userid-submodules/utiqMtp.md | 4 ++ dev-docs/modules/userid-submodules/yahoo.md | 19 +++--- dev-docs/modules/userid-submodules/yandex.md | 6 +- 54 files changed, 326 insertions(+), 141 deletions(-) diff --git a/_layouts/userid.html b/_layouts/userid.html index aff73773ec..deb991406f 100644 --- a/_layouts/userid.html +++ b/_layouts/userid.html @@ -30,6 +30,24 @@

    Back to User ID Module

    {{ page.title }}

    + + + + + + + + + + + + + + + + + +
    Module{{ page.useridmodule }}
    EID Source{{ page.eidsource }}
    bidRequest.userId{{ page.bidRequestUserId }}
    Example{{ page.example }}
    {{content}} diff --git a/dev-docs/modules/idLibrary.md b/dev-docs/modules/idLibrary.md index f30dfa34ef..730cfde505 100644 --- a/dev-docs/modules/idLibrary.md +++ b/dev-docs/modules/idLibrary.md @@ -26,8 +26,9 @@ The module attempts to extract a persistant identifier in the following ways: To get started, add the module to your Prebid.js wrapper. From the command line: -{: .alert.alert-info :} +```bash gulp build --modules=idImportLibrary +``` ## Application Flow @@ -45,6 +46,7 @@ In the idLibrary module, the persistant id is fetched from the page and synced w ## Configuration {: .table .table-bordered .table-striped } + | Param | Required | Description | | --- | --- | --- | | url | yes | The url endpoint is used to post the MD5 hasheds| diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md index 09f311c199..33d2e1b68d 100644 --- a/dev-docs/modules/userId.md +++ b/dev-docs/modules/userId.md @@ -204,9 +204,22 @@ The corresponding user id object and the eids array will look like this: {% assign userid_pages = site.pages | where: "layout", "userid" | sort_natural: "title" %} + + + + + + + {% for page in userid_pages %} -
  • {{page.title}}
  • + + + + + + {% endfor %} +
    ID System NamePrebid.js Attr: bidRequest.userIdEID SourceExample
    {{page.title}}{{page.bidRequestUserId}}{{page.eidsource}}{{page.example}}
    ## Bidder Adapter Implementation @@ -218,53 +231,6 @@ To add a custom data type for the response of `pbjs.getUserIdsAsEids()`, see oth Bidders that want to support the User ID module in Prebid.js need to update their bidder adapter to read the indicated bidRequest attributes and pass them to their endpoint. -{: .table .table-bordered .table-striped } -| ID System Name | ID System Host | Prebid.js Attr: bidRequest.userId. | EID Source | Example Value | -| --- | --- | --- | --- | --- | --- | -| 33Across ID | 33Across | 33acrossId | 33across.com | "1111" | -| Admixer ID | Admixer | admixerId | admixer.net | "1111" | -| adQuery QiD | adQuery | qid | adquery.io | "p9v2dpnuckkzhuc..." | -| Adriver ID | Adriver | adriverId | adriver.ru | "1111" | -| Adtelligent ID | Adtelligent | adtelligentId | adtelligent.com | `"1111"` | -| AMX ID | AMX | amxId | amxdt.net | "3ca11058-..." | -| BritePool ID | BritePool | britepoolid | britepool.com | "1111" | -| AudienceOne ID | DAC | dacId | dac.co.jp | {"id": "1111"} | -| DeepIntent ID | Deep Intent | deepintentId | deepintent.com | "1111" | -| DMD ID | DMD | dmdId | hcn.health | "1111" | -| ceeId | ceeId | ceeId | ceeid.eu | "111111" | -| Czech Ad ID | czechAdId | czechAdId | czechadid.cz | "1111" | -| CriteoID | Criteo | criteoId | criteo.com | "1111" | -| Fabrick ID | Neustar | fabrickId | neustar.biz | "1111" | -| FLoC ID | n/a | flocId | | | -| GrowthCode ID | GrowthCode | growthCodeId | growthcode.io | "1111" | -| Hadron ID | Audigent | hadronId | audigent.com | {"hadronId":"user-hadron-id", "auSeg":["segment1", "segment2"]} | -| ID+ | Zeotap | IDP | zeotap.com | "1111" | -| ID5 ID | ID5 | id5id | id5-sync.com | {uid: "1111", ext: { linkType: 2, abTestingControlGroup: false } } | -| IdentityLink | LiveRamp | idl_env | liveramp.com | "1111" | -| Intent IQ ID | Intent IQ | intentiqid | intentiq.com | "1111" | -| Kinesso ID | Kinesso | kpuid | kpuid.com | "1111" | -| LiveIntent ID | Live Intent | lipb.lipbid | liveintent.com | "1111" | -| Lotame Panorama ID | Lotame | lotamePanoramaId | crwdcntrl.net | "e4b9..." | -| MediaWallah OpenLink ID | MediaWallah | mwOpenLinkId | mediawallahscript.com | "1111" | -| merkleID | Merkle | merkleId | merkleinc.com | "1111" | -| naveggId | Navegg | naveggId | navegg.com | "1111" | -| netID | netID | netId | netid.de | "fH5A..." | -| Novatiq ID | Novatiq | novatiqId | novatiq.com | "1111" | -| Parrable ID | Parrable | parrableId | parrable.com | {"eid":"01.15946..."} | -| Publisher Link ID | n/a | publinkId | epsilon.com | | -| PubProvided ID | n/a | pubProvidedId | publisher domain | "1111" | -| Quantcast ID | n/a | quantcastId | quantcast.com | "1111" | -| Rewarded Interest ID | Rewarded Interest | rewardedInterestId | rewardedinterest.com | "1111" | -| Tapad ID | Tapad | tapadId | tapad.com | "1111" | -| Teads ID | Teads | teadsId | teads.com | "1111" | -| SharedID (PBJS 5.x) | n/a | pubcid | pubcid.org | "1111" | -| SharedID (PBJS 4.x)| Prebid | sharedid | sharedid.org | {"id":"01EAJWWN...", "third":"01EAJ..."} | -| Unified ID | Trade Desk | tdid | adserver.org | "1111" | -| ConnectID | Yahoo | connectId | yahoo.com | {"connectId": "72d04af6..."} | -| FreePass ID | FreePass | freepassId | | "1111" | -| UtiqMtp ID | Utiq | utiqMtpId | utiq-mtp.com | "1111" | -| Yandex ID | Yandex | yandexId | yandex.com | "11111111111111111" | - For example, the adapter code might do something like: ```javascript @@ -355,8 +321,6 @@ If you're an ID provider that wants to get on this page: * Add a new row to `/dev-docs/modules/userId.md#prebidjs-adapters` * Submit a documentation Pull Request - - ## ESP Configurations Google now supports Encrypted Signals for Publishers(ESP), a program that allows publishers can explicitly share encrypted signals on bid requests with third-party bidders. User ID modules now support code which will register the signal sources and encrypted signals are created and are sent to GAM request in a3p parameter. 'encryptedSignal' configuration under userSync Module will help to configure signal sources. diff --git a/dev-docs/modules/userid-submodules/33across.md b/dev-docs/modules/userid-submodules/33across.md index d63c246e10..0ec7bd2237 100644 --- a/dev-docs/modules/userid-submodules/33across.md +++ b/dev-docs/modules/userid-submodules/33across.md @@ -3,6 +3,9 @@ layout: userid title: 33Across ID description: 33Across ID User ID sub-module useridmodule: 33acrossIdSystem +bidRequestUserId: 33acrossId +eidsource: 33across.com +example: '"1111"' --- @@ -21,6 +24,7 @@ gulp build --modules=33acrossIdSystem,userId The following configuration parameters are available: {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | The name of this sub-module | `"33acrossId"` | diff --git a/dev-docs/modules/userid-submodules/admixer.md b/dev-docs/modules/userid-submodules/admixer.md index 1ceb62cafb..4a56a0f0d3 100644 --- a/dev-docs/modules/userid-submodules/admixer.md +++ b/dev-docs/modules/userid-submodules/admixer.md @@ -3,6 +3,9 @@ layout: userid title: AdmixerID description: AdmixerID User ID sub-module useridmodule: admixerIdSystem +bidRequestUserId: admixerId +eidsource: admixer.net +example: '"1111"' --- @@ -12,12 +15,14 @@ The Admixer privacy policy is at Add Admixer ID module to your Prebid.js package with: -{: .alert.alert-info :} +```bash gulp build --modules=admixerIdSystem +``` ## AdmixerID Configuration {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | `"admixerId"` | `"admixerId"` | diff --git a/dev-docs/modules/userid-submodules/adquery.md b/dev-docs/modules/userid-submodules/adquery.md index df509d54ea..7b24a99d9b 100644 --- a/dev-docs/modules/userid-submodules/adquery.md +++ b/dev-docs/modules/userid-submodules/adquery.md @@ -3,6 +3,9 @@ layout: userid title: adQuery QiD description: adQuery QiD User ID sub-module useridmodule: adqueryIdSystem +bidRequestUserId: qid +eidsource: adquery.io +example: '"p9v2dpnuckkzhuc"' --- diff --git a/dev-docs/modules/userid-submodules/adriver.md b/dev-docs/modules/userid-submodules/adriver.md index e1f6b48b7f..a4d57747aa 100644 --- a/dev-docs/modules/userid-submodules/adriver.md +++ b/dev-docs/modules/userid-submodules/adriver.md @@ -3,11 +3,15 @@ layout: userid title: Adriver ID description: Adriver ID User ID sub-module useridmodule: adriverId +bidRequestUserId: adriverId +eidsource: adriver.ru +example: '"1111"' --- ## Adriver ID Configuration {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | The name of this module: `"adriverId"` | `"adriverId"` | diff --git a/dev-docs/modules/userid-submodules/adtelligent.md b/dev-docs/modules/userid-submodules/adtelligent.md index ac210e75fd..f10adc76b6 100644 --- a/dev-docs/modules/userid-submodules/adtelligent.md +++ b/dev-docs/modules/userid-submodules/adtelligent.md @@ -3,6 +3,9 @@ layout: userid title: Adtelligent description: Adtelligent User ID sub-module useridmodule: adtelligentIdSystem +bidRequestUserId: adtelligentId +eidsource: adtelligent.com +example: '"1111"' --- @@ -10,8 +13,9 @@ The [Adtelligent](https://adtelligent.com) ID system is a unique per-session use Add it to your Prebid.js package with: -{: .alert.alert-info :} +```bash gulp build --modules=userId,adtelligentIdSystem +``` ## Adtelligent Configuration diff --git a/dev-docs/modules/userid-submodules/amxrtb.md b/dev-docs/modules/userid-submodules/amxrtb.md index 8ab6d0eef4..b03199e172 100644 --- a/dev-docs/modules/userid-submodules/amxrtb.md +++ b/dev-docs/modules/userid-submodules/amxrtb.md @@ -3,6 +3,9 @@ layout: userid title: AMX ID description: AMX ID User ID sub-module useridmodule: amxIdSystem +bidRequestUserId: amxId +eidsource: amxdt.net +example: '"3ca11058-..."' --- diff --git a/dev-docs/modules/userid-submodules/audienceone.md b/dev-docs/modules/userid-submodules/audienceone.md index 74d8d5bfee..158640c893 100644 --- a/dev-docs/modules/userid-submodules/audienceone.md +++ b/dev-docs/modules/userid-submodules/audienceone.md @@ -3,6 +3,9 @@ layout: userid title: AudienceOne ID by DAC description: AudienceOne ID by DAC User ID sub-module useridmodule: dacIdSystem +bidRequestUserId: dacId +eidsource: dac.co.jp +example: {"id": "1111"} --- @@ -11,12 +14,14 @@ Please visit [solutions.dac.co.jp/audienceone](https://solutions.dac.co.jp/audie Add the AudienceOne ID to your Prebid.js Package with: -{: .alert.alert-info :} +```bash gulp build --modules=dacIdSystem +``` ## AudienceOne ID Configuration {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | The name of this module | `"dacId"` | diff --git a/dev-docs/modules/userid-submodules/britepool.md b/dev-docs/modules/userid-submodules/britepool.md index 9e24d92391..d96c00a0d5 100644 --- a/dev-docs/modules/userid-submodules/britepool.md +++ b/dev-docs/modules/userid-submodules/britepool.md @@ -4,6 +4,9 @@ title: BritePool description: BritePool User ID sub-module useridmodule: britepoolIdSystem enable_download: false +bidRequestUserId: britepoolid +eidsource: britepool.com +example: '"1111"' --- {: .alert.alert-warning :} @@ -14,8 +17,9 @@ integration partners (such as PubMatic), are able to maximize revenues without c Add it to your Prebid.js package with: -{: .alert.alert-info :} +```bash gulp build --modules=britepoolIdSystem +``` ## BritePool Registration @@ -24,6 +28,7 @@ Please reach out to [prebid@britepool.com](mailto:prebid@britepool.com) and requ ## BritePool Configuration {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | `"britepoolId"` | `"britepoolId"` | diff --git a/dev-docs/modules/userid-submodules/ceeIdSystem.md b/dev-docs/modules/userid-submodules/ceeIdSystem.md index 59194e1150..3ab6277289 100644 --- a/dev-docs/modules/userid-submodules/ceeIdSystem.md +++ b/dev-docs/modules/userid-submodules/ceeIdSystem.md @@ -3,6 +3,9 @@ layout: userid title: CEEIdSystem description: CEEID User ID sub-module useridmodule: ceeIdSystem +bidRequestUserId: ceeId +eidsource: ceeid.eu +example: '"1111"' --- ## Prebid Configuration @@ -16,6 +19,7 @@ gulp build --modules=ceeIdSystem ## CEEID Configuration {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | The name of CEEID user ID module. | `"ceeId"` | diff --git a/dev-docs/modules/userid-submodules/cpexid.md b/dev-docs/modules/userid-submodules/cpexid.md index ee9a48fa42..f1c543c6c0 100644 --- a/dev-docs/modules/userid-submodules/cpexid.md +++ b/dev-docs/modules/userid-submodules/cpexid.md @@ -3,16 +3,21 @@ layout: userid title: Czech Ad ID (czechAdId) description: Czech Ad ID (czechAdId) User ID sub-module useridmodule: czechAdIdSystem +bidRequestUserId: czechAdId +eidsource: czechadid.cz +example: '"1111"' --- Czech Ad ID is a joint project of publishers of the [CPEx alliance](https://www.cpex.cz/) and [Seznam.cz](https://www.seznam.cz). It is a deterministic user ID that offers cross-domain and cross-device identification. For more information see [czechadid.cz](https://www.czechadid.cz)). -{: .alert.alert-info :} +```bash gulp build --modules=czechAdIdSystem +``` ## czechAdId Configuration {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | The name of this module | `"czechAdId"` | diff --git a/dev-docs/modules/userid-submodules/criteo.md b/dev-docs/modules/userid-submodules/criteo.md index 8e48b94ce2..27d43641bd 100644 --- a/dev-docs/modules/userid-submodules/criteo.md +++ b/dev-docs/modules/userid-submodules/criteo.md @@ -3,6 +3,9 @@ layout: userid title: Criteo ID for Exchanges description: Criteo ID for Exchanges User ID sub-module useridmodule: criteoIdSystem +bidRequestUserId: criteoId +eidsource: criteo.com +example: '"1111"' --- @@ -13,8 +16,9 @@ The Criteo privacy policy is at [www.criteo.com/privacy/](https://www.criteo.com Add it to your Prebid.js package with: -{: .alert.alert-info :} +```bash gulp build --modules=criteoIdSystem +``` ## Criteo ID Configuration diff --git a/dev-docs/modules/userid-submodules/deepintent.md b/dev-docs/modules/userid-submodules/deepintent.md index 4640088296..171b2c0b4d 100644 --- a/dev-docs/modules/userid-submodules/deepintent.md +++ b/dev-docs/modules/userid-submodules/deepintent.md @@ -3,6 +3,9 @@ layout: userid title: Deepintent description: Deepintent User ID sub-module useridmodule: deepintentDpesIdSystem +bidRequestUserId: deepintentId +eidsource: deepintent.com +example: '"1111"' --- @@ -17,6 +20,7 @@ DPES ID is free to use and requires a simple registration with DeepIntent. Pleas ## Deepintent DPES ID Configuration {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | The name of this module: `"deepintentId"` | `"deepintentId"` | diff --git a/dev-docs/modules/userid-submodules/dmd.md b/dev-docs/modules/userid-submodules/dmd.md index 7e932dc0c0..95b86aea3f 100644 --- a/dev-docs/modules/userid-submodules/dmd.md +++ b/dev-docs/modules/userid-submodules/dmd.md @@ -3,6 +3,9 @@ layout: userid title: DMD ID by DMD Marketing Corp description: DMD ID by DMD Marketing Corp User ID sub-module useridmodule: dmdIdSystem +bidRequestUserId: dmdId +eidsource: hcn.health +example: '"1111"' --- @@ -12,8 +15,9 @@ For assistance setting up your module, please contact us at ` | `` | `` | `` | `` | @@ -23,8 +27,9 @@ Kinesso will then attach these users to deals ids that they will target in the O Add it to your Prebid.js package with: -{: .alert.alert-info :} +```bash gulp build --modules=kinessoIdSystem +``` ## Kinesso ID Registration @@ -33,6 +38,7 @@ You can set up Kinesso ID sub adapter by contacting Kinesso at +{: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | The name of this module. | `'mwOpenLinkId'` | @@ -27,8 +32,6 @@ MediaWallah requires the creation of an accountId a partnerId in order to take a | params.accountId | Required | String | The MediaWallah assigned Account Id | `1000` | | params.partnerId | Required | String | The MediaWallah assign partner Id |`'1001'`| | params.uid | Optional | String | Your unique Id for the user or browser. Used for matching. | `'u-123xyz'` | -{: .table .table-bordered .table-striped } - ## MediaWallah OpenLinkID Examples diff --git a/dev-docs/modules/userid-submodules/merkle.md b/dev-docs/modules/userid-submodules/merkle.md index 71f583c6a9..9dd890e0f7 100644 --- a/dev-docs/modules/userid-submodules/merkle.md +++ b/dev-docs/modules/userid-submodules/merkle.md @@ -3,6 +3,9 @@ layout: userid title: Merkle ID description: Merkle IDUser ID sub-module useridmodule: merkleIdSystem +bidRequestUserId:merkleId +eidsource: merkleinc.com +example: '"1111"' --- diff --git a/dev-docs/modules/userid-submodules/netid.md b/dev-docs/modules/userid-submodules/netid.md index 67c2ff79a2..d02020a2bc 100644 --- a/dev-docs/modules/userid-submodules/netid.md +++ b/dev-docs/modules/userid-submodules/netid.md @@ -3,6 +3,9 @@ layout: userid title: netID description: netID User ID sub-module useridmodule: netIdSystem +bidRequestUserId: netId +eidsource: netid.de +example: '"fH5A..."' --- diff --git a/dev-docs/modules/userid-submodules/novatiq.md b/dev-docs/modules/userid-submodules/novatiq.md index cf86db5854..c409e68f16 100644 --- a/dev-docs/modules/userid-submodules/novatiq.md +++ b/dev-docs/modules/userid-submodules/novatiq.md @@ -3,6 +3,9 @@ layout: userid title: Novatiq Hyper ID description: Novatiq Hyper ID User ID sub-module useridmodule: novatiqIdSystem +bidRequestUserId: novatiqId +eidsource: novatiq.com +example: '"1111"' --- @@ -12,8 +15,9 @@ The [Novatiq](https://www.novatiq.com) proprietary dynamic Hyper ID is a unique, Enable by adding the Novatiq submodule to your Prebid.js package with: -{: .alert.alert-info :} +```bash gulp build --modules=novatiqIdSystem,userId +``` Module activation and configuration: @@ -39,7 +43,8 @@ pbjs.setConfig({ ## Parameters for the Novatiq Module -
    +{: .table .table-bordered .table-striped } + | Param | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | Module identification: `"novatiq"` | `"novatiq"` | @@ -53,8 +58,6 @@ pbjs.setConfig({ | params.urlParams.useStandardUuid | Optional | Boolean | Use a standard UUID format, or the Novatiq UUID format | `false` | | params.urlParams.useSspId | Optional | Boolean | Send the sspid (sourceid) along with the sync request
    Makes the params.sourceid optional if set | `false` | | params.urlParams.useSspHost | Optional | Boolean | Send the ssphost along with the sync request | `false` | -{: .table .table-bordered .table-striped } -
    ## Novatiq Hyper ID with Prebid SharedID Support @@ -62,8 +65,9 @@ You can make use of the Prebid.js SharedId module as follows. Enable by adding the Novatiq and SharedId submodule to your Prebid.js package with: -{: .alert.alert-info :} +```bash gulp build --modules=novatiqIdSystem,userId +``` Module activation and configuration: diff --git a/dev-docs/modules/userid-submodules/onekey.md b/dev-docs/modules/userid-submodules/onekey.md index 9b4d937868..f371228764 100644 --- a/dev-docs/modules/userid-submodules/onekey.md +++ b/dev-docs/modules/userid-submodules/onekey.md @@ -19,8 +19,9 @@ Background information: It can be added to you Prebid.js package with: -{: .alert.alert-info :} +```bash gulp build –modules=userId,oneKeyIdSystem +``` ⚠️ This module works with a RTD module. Both must be configured. See the [OneKey RTD Module](/dev-docs/modules/oneKeyRtdProvider.html). @@ -32,6 +33,7 @@ Go to [onekey.community](https://onekey.community/) for more details. ## OneKey Configuration {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | The name of this module | `"oneKeyData"` | diff --git a/dev-docs/modules/userid-submodules/pair.md b/dev-docs/modules/userid-submodules/pair.md index db98f896af..883c19d65b 100644 --- a/dev-docs/modules/userid-submodules/pair.md +++ b/dev-docs/modules/userid-submodules/pair.md @@ -11,12 +11,14 @@ reliance on third-party cookies. PAIR can help advertisers and publishers mainta Add it to your Prebid.js package with: -{: .alert.alert-info :} +```bash gulp build --modules=pairIdSystem +``` ## PAIR ID Configuration {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | The name of PAIR ID user ID module. | `"pairId"` | diff --git a/dev-docs/modules/userid-submodules/parrable.md b/dev-docs/modules/userid-submodules/parrable.md index d8aa3be3ea..99bdf612ec 100644 --- a/dev-docs/modules/userid-submodules/parrable.md +++ b/dev-docs/modules/userid-submodules/parrable.md @@ -4,6 +4,9 @@ title: Parrable ID description: Parrable ID User ID sub-module pbjs_version_notes: removed in 9.0 useridmodule: parrableIdSystem +bidRequestUserId: parrableId +eidsource: parrable.com +example: '{"eid":"01.15946..."}' --- @@ -11,8 +14,9 @@ The Parrable ID is a Full Device Identifier that can be used to identify a devic Add it to your Prebid.js package with: -{: .alert.alert-info :} +```bash gulp build --modules=parrableIdSystem +``` ## Parrable ID Registration @@ -25,6 +29,7 @@ The Parrable privacy policy as at [www.parrable.com/privacy-policy/](https://www In addition to the parameters documented above in the Basic Configuration section the following Parrable specific configuration is required: {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | params | Required | Object | Details for the Parrable ID. | | diff --git a/dev-docs/modules/userid-submodules/publisherlink.md b/dev-docs/modules/userid-submodules/publisherlink.md index 2f6f44e965..6cbace8f08 100644 --- a/dev-docs/modules/userid-submodules/publisherlink.md +++ b/dev-docs/modules/userid-submodules/publisherlink.md @@ -3,6 +3,9 @@ layout: userid title: Publisher Link description: Publisher Link User ID sub-module useridmodule: publinkIdSystem +bidRequestUserId: publinkId +eidsource: epsilon.com +example: --- @@ -24,13 +27,14 @@ The Publisher Link opt-out is included [here](https://www.epsilon.com/privacy/dm In addition to the parameters documented above in the Basic Configuration section the following Publisher Link specific configuration is available: {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | The name of this module. | `'publinkId'` | | params | Required | Object | Customized parameters. | | | params.e | Required | String | Hashed email address of the user. Supports MD5 and SHA256. | `'7D320454942620664D96EF78ED4E3A2A'` | | params.site_id | Required | String | Site ID provided by Epsilon. | `'123456'` | -| params.api_key | Required | String | API key provided by Epsilon. | `'00000000-0000-0000-0000-00000000000'` +| params.api_key | Required | String | API key provided by Epsilon. | `'00000000-0000-0000-0000-00000000000'` | ## Publisher Link Examples diff --git a/dev-docs/modules/userid-submodules/pubprovided.md b/dev-docs/modules/userid-submodules/pubprovided.md index ba15abfe25..e533bd8c15 100644 --- a/dev-docs/modules/userid-submodules/pubprovided.md +++ b/dev-docs/modules/userid-submodules/pubprovided.md @@ -3,6 +3,9 @@ layout: userid title: PubProvided ID description: PubProvided ID User ID sub-module useridmodule: pubProvidedIdSystem +bidRequestUserId: pubProvidedId +eidsource: publisher domain +example: '"1111"' --- @@ -57,37 +60,37 @@ The PubProvided ID module allows publishers to set and pass a first-party user i }); ``` -If multiple parties are writing to this object in an undetermined order, a setup that feels quite awkward, they should each do something of this nature: - -```javascript -pbjs.mergeConfig({ - userSync: { - userIds: (() => { - const uidCfgs = pbjs.getConfig('userSync.userIds') || []; - let ppid = uidCfgs.find(cfg => cfg.name === 'pubProvidedId'); - if (!ppid) { - ppid = {name: 'pubProvidedId', params: {eids: []}}; - uidCfgs.push(ppid); - } - ppid.params.eids.push({ - source: "example.com", - uids: [{ - id: "example", - atype: 1, - ext: { - stype: "ppuid" - } - - }] - }) - return uidCfgs; - })() - } -}) -pbjs.refreshUserIds({submoduleNames: ['pubProvidedId']}) -``` + If multiple parties are writing to this object in an undetermined order, a setup that feels quite awkward, they should each do something of this nature: + + ```javascript + pbjs.mergeConfig({ + userSync: { + userIds: (() => { + const uidCfgs = pbjs.getConfig('userSync.userIds') || []; + let ppid = uidCfgs.find(cfg => cfg.name === 'pubProvidedId'); + if (!ppid) { + ppid = {name: 'pubProvidedId', params: {eids: []}}; + uidCfgs.push(ppid); + } + ppid.params.eids.push({ + source: "example.com", + uids: [{ + id: "example", + atype: 1, + ext: { + stype: "ppuid" + } -In each case, bid adapters will receive the eid values after consent is validated. The above examples, if calling `setConfig` instead of `mergeConfig`, will overwrite existing known IDs. If there is any possibility other id submodules have already been initiated or multiple scripts on the page are setting these fields, be sure to prefer `mergeConfig`. + }] + }) + return uidCfgs; + })() + } + }) + pbjs.refreshUserIds({submoduleNames: ['pubProvidedId']}) + ``` + + In each case, bid adapters will receive the eid values after consent is validated. The above examples, if calling `setConfig` instead of `mergeConfig`, will overwrite existing known IDs. If there is any possibility other id submodules have already been initiated or multiple scripts on the page are setting these fields, be sure to prefer `mergeConfig`. 2. This design allows for the setting of any number of uuids in the eids object. Publishers may work with multiple ID providers and nest their own ID within the same eids object. The opportunity to link a 1st party uuid and a 3rd party generated UUID presents publishers with a unique ability to address their users in a way demand sources will understand. @@ -105,12 +108,14 @@ This module is distinct from the Google Ad Manager PPID; which we enable setting Add it to your Prebid.js package with: -{: .alert.alert-info :} +```bash gulp build --modules=pubProvidedIdSystem +``` ## PubProvided Configuration {: .table .table-bordered .table-striped } + | Params under usersync.userIds[]| Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | ID value for the ID module | `"PubProvided"` | diff --git a/dev-docs/modules/userid-submodules/quantcast.md b/dev-docs/modules/userid-submodules/quantcast.md index 14ded4e370..0b4b145dff 100644 --- a/dev-docs/modules/userid-submodules/quantcast.md +++ b/dev-docs/modules/userid-submodules/quantcast.md @@ -3,14 +3,18 @@ layout: userid title: Quantcast ID description: Quantcast ID User ID sub-module useridmodule: quantcastIdSystem +bidRequestUserId: quantcastId +eidsource: quantcast.com +example: '"1111"' --- The Prebid Quantcast ID module stores a Quantcast ID in a first party cookie. The ID is then made available in the bid request. The ID from the cookie added in the bidstream allows Quantcast to more accurately bid on publisher inventories without third party cookies, which can result in better monetization across publisher sites from Quantcast. And, it’s free to use! For easier integration, you can work with one of our SSP partners, like PubMatic, who can facilitate the legal process as well as the software integration for you. Add it to your Prebid.js package with: -{: .alert.alert-info :} +```bash gulp build --modules=userId,quantcastIdSystem +``` Quantcast’s privacy policies for the services rendered can be found at @@ -26,6 +30,7 @@ The Quantcast ID module will only perform any action and return an ID in situati ## Quantcast ID Configuration {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | `"quantcastId"` | `"quantcastId"` | diff --git a/dev-docs/modules/userid-submodules/ramp.md b/dev-docs/modules/userid-submodules/ramp.md index bde1b08d33..84f8f7e6d6 100644 --- a/dev-docs/modules/userid-submodules/ramp.md +++ b/dev-docs/modules/userid-submodules/ramp.md @@ -3,6 +3,9 @@ layout: userid title: LiveRamp RampID description: LiveRamp RampID User ID sub-module useridmodule: identityLinkIdSystem +bidRequestUserId: idl_env +eidsource: liveramp.com +example: '"1111"' --- @@ -10,8 +13,9 @@ RampID, formerly known as IdentityLink, provided by [LiveRamp](https://liveramp. Add it to your Prebid.js package with: -{: .alert.alert-info :} +```bash gulp build --modules=identityLinkIdSystem +``` ## RampID Registration @@ -22,17 +26,18 @@ The RampID privacy policy is at [liveramp.com/privacy/service-privacy-policy/](h ## RampID Configuration {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | The name of LiveRamp's user ID module. | `"identityLink"` | | params | Required | Object | Container of all module params. | | | params.pid | Required | String | This is the Placement ID, a unique identifier that is used to identify each publisher, obtained from registering with LiveRamp. | `"999"` | | params.notUse3P | Not required | Boolean | Property for choosing if a cookieable RampID envelope (RTIS) should be set and stored until the user authenticates which then will be replaced by an authenticated RampID envelope (ATS) (either `true` or `false`). | `false` | -| storage | Required | Object | This object defines where and for how long the results of the call to get a RampID envelope will be stored. | +| storage | Required | Object | This object defines where and for how long the results of the call to get a RampID envelope will be stored. | | | storage.type | Required | String | This parameter defines where the resolved RampID envelope will be stored (either `"cookie"` or `"html5"` localStorage). | `"cookie"` | | storage.name | Required | String | The name of the cookie or html5 localstorage where the resolved RampID envelope will be stored. LiveRamp requires `"idl_env"`. | `"idl_env"` | | storage.expires | Required | Integer | How long (in days) the RampID envelope information will be stored. To be GDPR and CCPA compliant, we strongly advise to set a 15-day TTL ("Time to Live" / expiration time). If you are not planning to obtain RampID envelopes for EU/EEA or U.S. users, we advise you to change the expiration time to 30 days. | `15` | -| storage.refreshInSeconds | Required | Integer | The amount of time (in seconds) the RampID envelope should be cached in storage before calling LiveRamp again to retrieve a potentially updated value for the RampID envelope. | `1800` +| storage.refreshInSeconds | Required | Integer | The amount of time (in seconds) the RampID envelope should be cached in storage before calling LiveRamp again to retrieve a potentially updated value for the RampID envelope. | `1800` | {: .alert.alert-info :} **NOTE:** The RampID envelope that is delivered to Prebid will be encrypted by LiveRamp with a rotating key to avoid unauthorized usage and to enforce privacy requirements. Therefore, we strongly recommend setting `storage.refreshInSeconds` to 30 minutes (1800 seconds) to ensure all demand partners receive an ID that has been encrypted with the latest key, has up-to-date privacy signals, and allows them to transact against it. diff --git a/dev-docs/modules/userid-submodules/sharedid.md b/dev-docs/modules/userid-submodules/sharedid.md index 4c2c224b6a..f68470e6ca 100644 --- a/dev-docs/modules/userid-submodules/sharedid.md +++ b/dev-docs/modules/userid-submodules/sharedid.md @@ -3,6 +3,9 @@ layout: userid title: SharedID description: SharedID User ID sub-module useridmodule: sharedIdSystem +bidRequestUserId: sharedid +eidsource: sharedid.org +example: '{"id":"01EAJWWN...", "third":"01EAJ..."}' --- @@ -13,25 +16,27 @@ SharedID into account. Prebid recommends implementing a method where users can Add it to your Prebid.js package with: -{: .alert.alert-info :} +```bash gulp build --modules=sharedIdSystem +``` ## SharedID ID Configuration In addition to the parameters documented above in the Basic Configuration section the following SharedID specific configuration is available: {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | The name of this module. | `'sharedId'` | | params | Optional | Object | Customized parameters | | | params.create | Optional | Boolean | For publisher server support only. If true, the publisher's server will create the (pubcid) cookie. Default is true. | `true` | -| params.pixelUrl | Optional | String | For publisher server support only. Where to call out to for a server cookie -- see [Prebid Identity](/identity/sharedid.html) for more information. | `/wp-json/pubcid/v1/extend/` +| params.pixelUrl | Optional | String | For publisher server support only. Where to call out to for a server cookie -- see [Prebid Identity](/identity/sharedid.html) for more information. | `/wp-json/pubcid/v1/extend/` | | params.extend | Optional | Boolean | If true, the expiration time of the stored IDs will be refreshed during each page load. Default is false. | `false` | -| storage | Required | Object | The publisher must specify some kind of local storage in which to store the results of the call to get the user ID. This can be either cookie or HTML5 storage. | +| storage | Required | Object | The publisher must specify some kind of local storage in which to store the results of the call to get the user ID. This can be either cookie or HTML5 storage.| | | storage.expires | Integer | Required | How long the user ID information will be stored. | `365` | -| storage.name | String | Required | The name of the cookie or html5 local storage where the user ID will be stored. | `_pubcid` -| storage.type | String | Required | This is where the results of the user ID will be stored. Must be either: Must be either: "cookie" or "html5". For server side implementations, which have the best identifier life and revenue impact, this must be a cookie. | `cookie` +| storage.name | String | Required | The name of the cookie or html5 local storage where the user ID will be stored. | `_pubcid` | +| storage.type | String | Required | This is where the results of the user ID will be stored. Must be either: Must be either: "cookie" or "html5". For server side implementations, which have the best identifier life and revenue impact, this must be a cookie. | `cookie` | ## SharedID Examples diff --git a/dev-docs/modules/userid-submodules/tapad.md b/dev-docs/modules/userid-submodules/tapad.md index 7fdd8cfaa0..937ade5078 100644 --- a/dev-docs/modules/userid-submodules/tapad.md +++ b/dev-docs/modules/userid-submodules/tapad.md @@ -3,6 +3,9 @@ layout: userid title: Tapad ID description: Tapad ID User ID sub-module useridmodule: tapadIdSystem +bidRequestUserId: tapadId +eidsource: tapad.com +example: '"1111"' --- @@ -15,12 +18,14 @@ Tapad’s Privacy landing page containing links to region-specific Privacy Notic Add it to your Prebid.js package with: -{: .alert.alert-info :} +```bash gulp build --modules=userId,tapadIdSystem +``` ## Tapad ID Configuration {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | `"tapadId"` | `"tapadId"` | diff --git a/dev-docs/modules/userid-submodules/teads.md b/dev-docs/modules/userid-submodules/teads.md index dd8f7fffcb..cf29808432 100644 --- a/dev-docs/modules/userid-submodules/teads.md +++ b/dev-docs/modules/userid-submodules/teads.md @@ -4,6 +4,9 @@ title: Teads ID description: Teads ID User ID sub-module useridmodule: teadsIdSystem pbjs_version_notes: please avoid using v7.20.0 and v7.21.0 +bidRequestUserId: teadsId +eidsource: teads.com +example: '"1111"' --- @@ -20,6 +23,7 @@ gulp build --modules=userId,teadsIdSystem Then configure the teadsId in your `userSync` configuration. {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | `"teadsId"` | `"teadsId"` | diff --git a/dev-docs/modules/userid-submodules/tncIdSystem.md b/dev-docs/modules/userid-submodules/tncIdSystem.md index d0c499e719..27d005b70e 100644 --- a/dev-docs/modules/userid-submodules/tncIdSystem.md +++ b/dev-docs/modules/userid-submodules/tncIdSystem.md @@ -21,7 +21,7 @@ gulp build --modules=tncIdSystem,userId ## TNCIdSystem module Configuration -Disclosure: This module loads external script unreviewed by the prebid.js community +{% include dev-docs/loads-external-javascript.md %} You can configure this submodule in your `userSync.userIds[]` configuration: @@ -49,6 +49,7 @@ pbjs.setConfig({ The following configuration parameters are available: {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | The name of this sub-module | `"tncId"` | diff --git a/dev-docs/modules/userid-submodules/trustpid.md b/dev-docs/modules/userid-submodules/trustpid.md index ab4ec4d7ac..ea4c4b8032 100644 --- a/dev-docs/modules/userid-submodules/trustpid.md +++ b/dev-docs/modules/userid-submodules/trustpid.md @@ -4,6 +4,9 @@ title: Trustpid description: Trustpid User ID sub-module pbjs_version_notes: not in 8.x useridmodule: trustpidSystem +bidRequestUserId: +eidsource: +example: --- {: .alert.alert-info :} @@ -16,9 +19,10 @@ Trustpid is also the brand name of the service, which is provided by Vodafone Sa ## Trustpid configuration {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | -| name | Required | String | The name of the module | `"trustpid"` +| name | Required | String | The name of the module | `"trustpid"` | | params | Required | Object | Object with configuration parameters for trustpid User Id submodule | - | | params.maxDelayTime | Required | Integer | Max amount of time (in seconds) before looking into storage for data | 2500 | | bidders | Required | Array of Strings | An array of bidder codes to which this user ID may be sent. Currently required and supporting AdformOpenRTB | `['adf']` | diff --git a/dev-docs/modules/userid-submodules/unified.md b/dev-docs/modules/userid-submodules/unified.md index 5c9fc0856b..4a94c76a02 100644 --- a/dev-docs/modules/userid-submodules/unified.md +++ b/dev-docs/modules/userid-submodules/unified.md @@ -3,6 +3,9 @@ layout: userid title: Unified ID description: Unified ID User ID sub-module useridmodule: unifiedIdSystem +bidRequestUserId: tdid +eidsource: adserver.org +example: '"1111"' --- @@ -10,8 +13,9 @@ The Unified ID solution is provided by adsrvr.org and the Trade Desk. Add it to your Prebid.js package with: -{: .alert.alert-info :} +```bash gulp build --modules=unifiedIdSystem +``` ## Unified ID Registration @@ -25,6 +29,7 @@ The Unified ID privacy is covered under the [TradeDesk Services Privacy Policy]( ## Unified ID Configuration {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | `"unifiedId"` | `"unifiedId"` | diff --git a/dev-docs/modules/userid-submodules/unified2.md b/dev-docs/modules/userid-submodules/unified2.md index 5a6f105f0d..74593d37df 100644 --- a/dev-docs/modules/userid-submodules/unified2.md +++ b/dev-docs/modules/userid-submodules/unified2.md @@ -11,8 +11,9 @@ UID2 relies on user consent before an ID can be added to the bid stream. Consent To add UID2 to your Prebid.js package, run the following: -{: .alert.alert-info :} +```bash gulp build --modules=uid2IdSystem +``` ## Unified ID 2.0 Registration @@ -71,6 +72,7 @@ Prebid.js supports fully client side integration for UID2. See the [official UI The following parameters apply only to the Unified ID 2.0 module integration. {: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | ID value for the Unified ID 2.0 module - `"uid2"` | `"uid2"` | diff --git a/dev-docs/modules/userid-submodules/utiq.md b/dev-docs/modules/userid-submodules/utiq.md index 1b3f202ac2..0e7b92791f 100644 --- a/dev-docs/modules/userid-submodules/utiq.md +++ b/dev-docs/modules/userid-submodules/utiq.md @@ -3,6 +3,9 @@ layout: userid title: Utiq ID description: Utiq User ID sub-module useridmodule: utiqIdSystem +bidRequestUserId: utiId +eidsource: utiq.com +example: '"1111"' --- Utiq generates unique tokens, enabling improved efficiency in programmatic advertising while safeguarding transparency and control for end customers via `consenthub.utiq.com`. A website visitor’s Utiq is generated based on network identifiers provided by network operators and requires explicit user consent. diff --git a/dev-docs/modules/userid-submodules/utiqMtp.md b/dev-docs/modules/userid-submodules/utiqMtp.md index 854042d27e..94cbc2323c 100644 --- a/dev-docs/modules/userid-submodules/utiqMtp.md +++ b/dev-docs/modules/userid-submodules/utiqMtp.md @@ -3,6 +3,9 @@ layout: userid title: UtiqMtp ID description: UtiqMtp User ID sub-module useridmodule: utiqMtpIdSystem +bidRequestUserId: utiqMtpId +eidsource: utiq-mtp.com +example: '"1111"' --- Utiq generates unique tokens, enabling improved efficiency in programmatic advertising while safeguarding transparency and control for end customers via `consenthub.utiq.com`. A website visitor’s Utiq ID is generated based on network identifiers provided by network operators and requires explicit user consent. @@ -21,6 +24,7 @@ If you are interested in using Utiq on your website, please contact Utiq on +{: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | The name of this module. | `"connectId"` | | params | Required | Object | Container of all module params. || -| params.pixelId | Required | Number | -The Yahoo-supplied publisher-specific pixel ID. | `"0000"` | +| params.pixelId | Required | Number | The Yahoo-supplied publisher-specific pixel ID. | `"0000"` | | params.he | Optional | String | The SHA-256 hashed user email address which has been lowercased prior to hashing. |`"ed8ddbf5a171981db8ef938596ca297d5e3f84bcc280041c5880dba3baf9c1d4"`| | params.puid | Optional | String | A domain-specific user identifier such as a first-party cookie. If not passed, a puid value will be auto-generated and stored in local and / or cookie storage. | `"ab9iibf5a231ii1db8ef911596ca297d5e3f84biii00041c5880dba3baf9c1da"` | -{: .table .table-bordered .table-striped } - ## Yahoo ConnectID Examples @@ -107,12 +109,11 @@ Finally, ConnectID follows all global privacy laws (such as the CCPA) and indust Please note that the storage related parameters are optional. We recommend that you omit them, since ConnectID module is pre-configured with the most optimal storage parameters already. -
    +{: .table .table-bordered .table-striped } + | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | storage | Optional | Object | Defines where and for how long the results of the call to get a user ID will be stored. | | | storage.type | Optional | String | Defines where the resolved user ID will be stored (either 'cookie' or 'html5' local storage). | `'cookie'` | | storage.name | Optional | String | The name of the cookie or html5 local storage where the resolved user ID will be stored. | `'connectId'` | | storage.expires | Optional | Integer | How long (in days) the user ID information will be stored. | `15` | -{: .table .table-bordered .table-striped } -
    diff --git a/dev-docs/modules/userid-submodules/yandex.md b/dev-docs/modules/userid-submodules/yandex.md index 1b0f8bbbbc..7ff4e9ce0a 100644 --- a/dev-docs/modules/userid-submodules/yandex.md +++ b/dev-docs/modules/userid-submodules/yandex.md @@ -3,6 +3,9 @@ layout: userid title: Yandex ID description: Yandex User ID sub-module useridmodule: yandexIdSystem +bidRequestUserId: yandexId +eidsource: yandex.com +example: '"1111"' --- Yandex ID module is designed to improve the personalization of ads for publishers' users. This documentation provides information about the Yandex User ID module, and instructions to install it. @@ -11,8 +14,9 @@ Yandex ID module is designed to improve the personalization of ads for publisher Add the module to your Prebid.js package: -{: .alert.alert-info :} +```bash gulp build --modules=yandexIdSystem +``` ## Step 2. Enable Yandex ID From aa6df7e3ac95732b9184f479fa725750c3d45ebc Mon Sep 17 00:00:00 2001 From: Luca Corbo Date: Thu, 28 Nov 2024 19:16:46 +0100 Subject: [PATCH 316/816] WURFL RTD Module: enrich the ortb2.device object with WURFL data (#5712) See: https://github.com/prebid/Prebid.js/pull/12442 --- dev-docs/modules/wurflRtdProvider.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dev-docs/modules/wurflRtdProvider.md b/dev-docs/modules/wurflRtdProvider.md index 9ecd4cae12..a146b3efdb 100644 --- a/dev-docs/modules/wurflRtdProvider.md +++ b/dev-docs/modules/wurflRtdProvider.md @@ -22,7 +22,7 @@ This module loads a dynamically generated JavaScript from prebid.wurflcloud.com ## Description -The WURFL RTD module enriches the Prebid.js bid request's OpenRTB 2.0 device data with [WURFL device data](https://www.scientiamobile.com/wurfl-js-business-edition-at-the-intersection-of-javascript-and-enterprise/). The module populates the `device.ext.wurfl` with WURFL device capabilities, ensuring that all bidder adapters have access to enriched device data. At a minimum, three WURFL capabilities are made available to all adapters: `is_mobile`, `complete_device_name` and `form_factor`. +The WURFL RTD module enriches the Prebid.js bid request's OpenRTB 2.0 device data with [WURFL device data](https://www.scientiamobile.com/wurfl-js-business-edition-at-the-intersection-of-javascript-and-enterprise/). The module populates the `device` and `device.ext.wurfl` with WURFL device capabilities, ensuring that all bidder adapters have access to enriched device data. At a minimum, three WURFL capabilities are made available to all adapters: `is_mobile`, `complete_device_name` and `form_factor`. SSPs and other demand partners subscribed to this service with ScientiaMobile will also receive an expanded set of device properties, including more detailed detection for iOS devices (e.g., specific iPhone and iPad model information). For a comprehensive list of available device capabilities, please refer to the [WURFL device capabilities](https://www.scientiamobile.com/capabilities/?products%5B%5D=wurfl-js) documentation. @@ -42,8 +42,8 @@ The following scenarios are possible: | | SSP Adapter | SSP Server Side End-Point | | :------------------------ | :------------ | :--------------------------------------------------------------- | | SSP adapter is already passing the ORTB2 device to the server (auction endpoint). | No changes required. | Update backend logic to utilize the device data. | -| SSP adapter is not currently passing the data to server. | Update adapter to read `device.ext.wurfl` data and pass it to the endpoint. | Update backend logic to utilize the device data. | -| SSP doesn't have a Bidder Adapter. | Implement PreBid.js adapter and read `device.ext.wurfl` data and pass it to the endpoint. | Update end-point to read and utilize the data. | +| SSP adapter is not currently passing the data to server. | Update adapter to read `device` and/or `device.ext.wurfl` data and pass it to the endpoint. | Update backend logic to utilize the device data. | +| SSP doesn't have a Bidder Adapter. | Implement PreBid.js adapter and read `device` and/or `device.ext.wurfl` data and pass it to the endpoint. | Update end-point to read and utilize the data. | ## Usage From e7f462ef55fc951a752b0fdf8986a9a46b3518e5 Mon Sep 17 00:00:00 2001 From: Muki Seiler Date: Thu, 28 Nov 2024 19:18:40 +0100 Subject: [PATCH 317/816] Fix userId module link (#5738) --- dev-docs/modules/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/modules/index.md b/dev-docs/modules/index.md index 6141433aa6..41788113b3 100644 --- a/dev-docs/modules/index.md +++ b/dev-docs/modules/index.md @@ -92,7 +92,7 @@ These modules may require accounts with a service provider. ## User ID Modules UserID modules conform to a consistent set of publisher controls. The publisher can choose to run multiple user id modules, define an overall amount of time they're willing to wait for -results. See [the userSync setConfig](/dev-docs/publisher-api-reference/setConfig.html#setConfig-ConfigureUserSyncing-UserSyncProperties) reference and the [User ID Module](/dev-docs/modules/userId.md) for more details. +results. See [the userSync setConfig](/dev-docs/publisher-api-reference/setConfig.html#setConfig-ConfigureUserSyncing-UserSyncProperties) reference and the [User ID Module](/dev-docs/modules/userId) for more details. {% assign userid_module_pages = site.pages | where: "layout", "userid" %} From d1e5e3d617bef29ed19f293fe6409ed3b1dcce9e Mon Sep 17 00:00:00 2001 From: Komal Kumari <169047654+pm-komal-kumari@users.noreply.github.com> Date: Thu, 28 Nov 2024 23:51:45 +0530 Subject: [PATCH 318/816] Update code logic in floors module documentation (#5711) * Bug : Update logic to calculate deviceType for additional schema in floors module * Update dev-docs/modules/floors.md * Update dev-docs/modules/floors.md * Update dev-docs/modules/floors.md --------- Co-authored-by: Komal Kumari Co-authored-by: Muki Seiler --- dev-docs/modules/floors.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dev-docs/modules/floors.md b/dev-docs/modules/floors.md index 20abc03706..995c9cd850 100644 --- a/dev-docs/modules/floors.md +++ b/dev-docs/modules/floors.md @@ -559,11 +559,11 @@ e.g. let deviceType = getDeviceTypeFromUserAgent(navigator.userAgent); - if(deviceType = 'mobile') + if(deviceType === 'mobile') return 'mobile' - else if (deviceType = 'tablet') + else if (deviceType === 'tablet') return 'tablet' - else if (deviceType = 'desktop') + else if (deviceType === 'desktop') return 'desktop' } From 76ece8da6ee25b52f30e3ae54f0e0761d95c25a5 Mon Sep 17 00:00:00 2001 From: Patrick McCann Date: Thu, 28 Nov 2024 13:23:17 -0500 Subject: [PATCH 319/816] teads.md: add disclosure (#5572) * Update teads.md * Create an include for fingerprinting disclosure --------- Co-authored-by: Muki Seiler --- _includes/dev-docs/fingerprinting.md | 2 ++ dev-docs/bidders/teads.md | 4 ++++ 2 files changed, 6 insertions(+) create mode 100644 _includes/dev-docs/fingerprinting.md diff --git a/_includes/dev-docs/fingerprinting.md b/_includes/dev-docs/fingerprinting.md new file mode 100644 index 0000000000..0c230d30ec --- /dev/null +++ b/_includes/dev-docs/fingerprinting.md @@ -0,0 +1,2 @@ +{: .alert.alert-warning :} +This adapter uses JavaScript APIs commonly used in fingerprinting and may get your Prebid build flagged as a fingerprinting script. \ No newline at end of file diff --git a/dev-docs/bidders/teads.md b/dev-docs/bidders/teads.md index 52b57d77d0..dac0e35448 100644 --- a/dev-docs/bidders/teads.md +++ b/dev-docs/bidders/teads.md @@ -25,6 +25,10 @@ fpd_supported: false sidebarType: 1 --- +### Disclosure + +{% include dev-docs/fingerprinting.md %} + ### Notes 1. The Teads Bidding adapter requires setup before beginning. Please contact us on From 518021ec76b2a9f799a4721c7fc5ac05da9d9c9b Mon Sep 17 00:00:00 2001 From: Denis Logachov Date: Thu, 28 Nov 2024 20:31:33 +0200 Subject: [PATCH 320/816] Create spinx.md (#5736) --- dev-docs/bidders/spinx.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 dev-docs/bidders/spinx.md diff --git a/dev-docs/bidders/spinx.md b/dev-docs/bidders/spinx.md new file mode 100644 index 0000000000..a4a1e80d9f --- /dev/null +++ b/dev-docs/bidders/spinx.md @@ -0,0 +1,36 @@ +--- +layout: bidder +title: SpinX +description: SpinX Adaptor +biddercode: spinx +pbjs: true +pbs: false +media_types: banner, native, video +gvl_id: 1308 +tcfeu_supported: true +gpp_sids: tcfeu, usp +usp_supported: true +coppa_supported: true +pbs_app_supported: false +schain_supported: true +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel +sidebarType: 1 +--- + +### Note + +The SpinX bidding adapter requires setup and approval before implementation. Please reach out to for more details. + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|----------|----------|-----------------------|---------------------------|----------| +| `host` | required | RTB host | `'cpm.arteabee.com'` | `string` | +| `zoneId` | required | Zone Id | 30164 | `integer` | From 47ecce95e9425e392bb2f74b5c99b6a4d5b907b3 Mon Sep 17 00:00:00 2001 From: PGAMSSP <142323401+PGAMSSP@users.noreply.github.com> Date: Thu, 28 Nov 2024 20:32:41 +0200 Subject: [PATCH 321/816] PgamSSP Bid Adapter: add endpointId parameter to doc (#5700) * new adapter PGAMSSP * upd * hide parametr * hide parametr * add support gpp * add endpointId parameter to doc * add gvl_id * add gpp_sids --- dev-docs/bidders/pgamssp.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidders/pgamssp.md b/dev-docs/bidders/pgamssp.md index e132d8edb1..3db48e851d 100644 --- a/dev-docs/bidders/pgamssp.md +++ b/dev-docs/bidders/pgamssp.md @@ -4,11 +4,12 @@ title: PGAMSSP description: Prebid PGAMSSP Bidder Adapter biddercode: pgamssp usp_supported: true -tcfeu_supported: false +gvl_id: 1353 +tcfeu_supported: true coppa_supported: true schain_supported: true floors_supported: true -gpp_supported: true +gpp_sids: tcfeu, usstate_all, usp media_types: banner, video, native pbjs: true pbs: true @@ -23,4 +24,9 @@ safeframes_ok: true {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |---------------|----------|-----------------------|-----------|-----------| -| `placementId` | required | Placement Id | `'0'` | `'string'` | +| `placementId` | optional | Placement Id | `'0'` | `'string'` | +| `endpointId` | optional | Endpoint Id | `'0'` | `'string'` | + +### Note + +For the prebid server and prebid.js you only need to use one parameter: either placementId or endpointId From ace2af3ad6aac984936cd803d6089ce17787a580 Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 4 Dec 2024 08:37:18 -0500 Subject: [PATCH 322/816] PBS docs: minor wordsmithing (#5747) * PBS docs: minor wordsmithing * lint --- prebid-server/developers/add-new-bidder-go.md | 142 +++++++++--------- .../developers/add-new-bidder-java.md | 8 +- 2 files changed, 75 insertions(+), 75 deletions(-) diff --git a/prebid-server/developers/add-new-bidder-go.md b/prebid-server/developers/add-new-bidder-go.md index 02f3eb8ae0..b18d63acdb 100644 --- a/prebid-server/developers/add-new-bidder-go.md +++ b/prebid-server/developers/add-new-bidder-go.md @@ -8,16 +8,16 @@ title: Prebid Server | Developers | Building a Bid Adapter (Go) # Prebid Server - New Bid Adapter (Go) {: .no_toc} -Thank you for your valuable contribution of a bid adapter to the open source Prebid Server project. Each new adapter expands the monetization possibilities for publishers and provides greater options to maximize their inventory's potential. We truly appreciate your support in making this ecosystem thrive! +- TOC +{:toc } + +Thank you for your contribution of a bid adapter to the open source Prebid Server project. Each new adapter expands the monetization possibilities for publishers and provides greater options to maximize their inventory's potential. We appreciate your support in making this ecosystem thrive! This document guides you through the process of developing a new bid adapter for your bidding server. We encourage you to look at [existing bid adapters](https://github.com/prebid/prebid-server/tree/master/adapters) for working examples and practical guidance. You can ask us questions by [submitting a GitHub issue](https://github.com/prebid/prebid-server/issues/new). {: .alert.alert-info :} There are two implementations of Prebid Server: [PBS-Go](https://github.com/prebid/prebid-server) and [PBS-Java](https://github.com/prebid/prebid-server-java). We recommend you build new adapters for PBS-Go and allow us to port it to PBS-Java within a couple of months. If you'd like to build both yourself, please also follow these [instructions for building an adapter in PBS-Java](/prebid-server/developers/add-new-bidder-java.html). -* TOC -{:toc } - ## Overview Bid adapters are responsible for translating a 'Prebid-flavored' OpenRTB Bid Request to your bidding server's protocol and mapping your server's response to a Prebid-flavored response. @@ -71,15 +71,15 @@ We are proud to run the Prebid Server project as a transparent and trustworthy h **Please take the time to read the rules in full.** Below is a summary of some of the rules which apply to your Prebid Server bid adapter: -* Adapters must include maintainer information with a group email address for Prebid.org to contact for ongoing support and maintenance. -* Your bidder's endpoint domain name cannot be fully variable. We will accept endpoint domains that include account IDs, but we do not like them, and Prebid Server host companies may disable adapters using this approach if there are technical issues with it. We will not accept hostnames that have a required dynamic element for the purpose of sending traffic to different geographic regions. -* If you have a client-side adapter, all parameters (including biddercodes and aliases) must be consistent between your client- and server-side adapters. This allows publishers to utilize the PBJS [s2sTesting module](/dev-docs/modules/s2sTesting.html). -* Adapters must not modify bids from demand partners, except to either change the bid from gross to net or from one currency to another. -* Adapters must use the functions provided by the core framework for all external communication. Initiation of any form of network connection outside of what is provided by the core framework is strictly prohibited. No exceptions will be made for this rule. -* Adapters must support the creation of multiple concurrent instances. This means adapters may not mutate global or package scoped variables. -* Bidding server endpoints should prefer secure HTTPS to protect user privacy and should allow keep alive connections (preferably with HTTP/2 support) to increase host performance. -* Adapters must annotate the bid response with the proper media type, ideally based on the response from the bidding server. -* Bid adapters must not create their own transaction IDs or overwrite the tids supplied by Prebid. +- Adapters must include maintainer information with a group email address for Prebid.org to contact for ongoing support and maintenance. +- Your bidder's endpoint domain name cannot be fully variable. We will accept endpoint domains that include account IDs, but we do not like them, and Prebid Server host companies may disable adapters using this approach if there are technical issues with it. We will not accept hostnames that have a required dynamic element for the purpose of sending traffic to different geographic regions. +- If you have a client-side adapter, all parameters (including biddercodes and aliases) must be consistent between your client- and server-side adapters. This allows publishers to utilize the PBJS [s2sTesting module](/dev-docs/modules/s2sTesting.html). +- Adapters must not modify bids from demand partners, except to either change the bid from gross to net or from one currency to another. +- Adapters must use the functions provided by the core framework for all external communication. Initiation of any form of network connection outside of what is provided by the core framework is strictly prohibited. No exceptions will be made for this rule. +- Adapters must support the creation of multiple concurrent instances. This means adapters may not mutate global or package scoped variables. +- Bidding server endpoints should prefer secure HTTPS to protect user privacy and should allow keep alive connections (preferably with HTTP/2 support) to increase host performance. +- Adapters must annotate the bid response with the proper media type, ideally based on the response from the bidding server. +- Bid adapters must not create their own transaction IDs or overwrite the tids supplied by Prebid. {: .alert.alert-warning :} Failure to follow the rules will lead to delays in approving your adapter. If you'd like to discuss an exception to a rule, please make your request by [submitting a GitHub issue](https://github.com/prebid/prebid-server/issues/new). @@ -150,20 +150,20 @@ userSync: Modify this template for your bid adapter: -* The endpoint can be static if you only have one data center or use a Global Load Balancer as described in 'Planning Your Adapter' above. -* Remove the `endpointCompression` value if your bidding server does not accept gzip compressed bid requests. Setting this value to `gzip` will save on network bandwidth at the expense of slightly increased cpu and memory usage for the host. -* The `geoscope` parameter is not currently read programmatically. Instead, it's intended to be used by PBS host companies to disable your adapter in geographic regions where you don't do business. However, we may make a module for this someday, so we ask that you follow this syntax for `geoscope`: - * YAML array - * Values can be either a 3-letter country code, "EEA", or "global". (EEA means European Economic Area) - * Values can be negated. e.g. "!EEA" -* Change the maintainer email address to a group distribution list on your ad server's domain. A distribution list is preferred over an individual mailbox to allow for robustness, as roles and team members naturally change. -* Change the `gvlVendorID` from the sample value of `42` to the id of your bidding server as registered with the [GDPR Global Vendor List (GVL)](https://iabeurope.eu/tcf-for-vendors/), or remove this line entirely if your bidding server is not registered with IAB Europe. -* Remove the `openrtb.version` parameter if your adapter cannot receive the OpenRTB 2.6 data model. In this case, Prebid Server will downgrade values back to their 2.5 ext locations. New OpenRTB 2.6 fields are still passed to adapters. -* If absolutely necessary, change the `modifyingVastXmlAllowed` value to `false` to opt-out of [video impression tracking](https://github.com/prebid/prebid-server/issues/1015). However, please note that Prebid Server host companies depend on this feature being enabled to track video analytics. This feature has been live for many years with no known problems. -* Remove the `capabilities` (app/site/dooh) and `mediaTypes` (banner/video/audio/native) combinations which your adapter does not support. (Note: 'dooh' is [Digital Out Of Home](/prebid-server/use-cases/pbs-dooh.html)) -* Add an `extra_info` field if you'd like to pass additional values that your adapter may need. See below for an example. -* Add the `disabled` flag and set it to true if you would like to unregister adapter from the core. It's enabled by default. -* Follow the [User Sync Configuration](#user-sync-configuration) documentation below to configure the endpoints for your bid adapter, or remove the `userSync` section if not supported. +- The endpoint can be static if you only have one data center or use a Global Load Balancer as described in 'Planning Your Adapter' above. +- Remove the `endpointCompression` value if your bidding server does not accept gzip compressed bid requests. Setting this value to `gzip` will save on network bandwidth at the expense of slightly increased cpu and memory usage for the host. +- The `geoscope` parameter is not currently read programmatically. Instead, it's intended to be used by PBS host companies to disable your adapter in geographic regions where you don't do business. However, we may make a module for this someday, so we ask that you follow this syntax for `geoscope`: + - YAML array + - Values can be either a 3-letter country code, "EEA", or "global". (EEA means European Economic Area) + - Values can be negated. e.g. "!EEA" +- Change the maintainer email address to a group distribution list on your ad server's domain. A distribution list is preferred over an individual mailbox to allow for robustness, as roles and team members naturally change. +- Change the `gvlVendorID` from the sample value of `42` to the id of your bidding server as registered with the [GDPR Global Vendor List (GVL)](https://iabeurope.eu/tcf-for-vendors/), or remove this line entirely if your bidding server is not registered with IAB Europe. +- Remove the `openrtb.version` parameter if your adapter cannot receive the OpenRTB 2.6 data model. In this case, Prebid Server will downgrade values back to their 2.5 ext locations. New OpenRTB 2.6 fields are still passed to adapters. +- If absolutely necessary, change the `modifyingVastXmlAllowed` value to `false` to opt-out of [video impression tracking](https://github.com/prebid/prebid-server/issues/1015). However, please note that Prebid Server host companies depend on this feature being enabled to track video analytics. This feature has been live for many years with no known problems. +- Remove the `capabilities` (app/site/dooh) and `mediaTypes` (banner/video/audio/native) combinations which your adapter does not support. (Note: 'dooh' is [Digital Out Of Home](/prebid-server/use-cases/pbs-dooh.html)) +- Add an `extra_info` field if you'd like to pass additional values that your adapter may need. See below for an example. +- Add the `disabled` flag and set it to true if you would like to unregister adapter from the core. It's enabled by default. +- Follow the [User Sync Configuration](#user-sync-configuration) documentation below to configure the endpoints for your bid adapter, or remove the `userSync` section if not supported. #### Additional Bidder Info Examples @@ -355,7 +355,7 @@ Publishers will provide extra information using an OpenRTB 2.x Bid Request Exten We request you do not duplicate information already present in the [OpenRTB 2.x Bid Request specification](https://github.com/InteractiveAdvertisingBureau/openrtb2.x) or already part of an established Prebid convention. For example, your bidder parameters should not include first party data, bid floors, schain, video parameters, referrer information, or privacy consent including COPPA, CCPA, and GDPR TCF. For video parameters in particular, you must prefer the OpenRTB 2.x Bid Request standard of `request.imp[].video`. {: .alert.alert-warning :} -You may not try so set the full endpoint domain from a publisher-specified bidder parameter. Prebid Server is not an open proxy. If absolutely necessary, you may specify a *portion* of the domain as a parameter to support geo regions or account specific servers. However, this is discouraged and may degrade the performance of your adapter since the server needs to maintain more outgoing connections. Host companies may choose to disable your adapter if it uses a dynamically configured domain. +You may not try to set the full endpoint domain from a publisher-specified bidder parameter. Prebid Server is not an open proxy. If absolutely necessary, you may specify a *portion* of the domain as a parameter to support geo regions or account specific servers. However, this is discouraged and may degrade the performance of your adapter since the server needs to maintain more outgoing connections. Host companies may choose to disable your adapter if it uses a dynamically configured domain. Create a file with the path `static/bidder-params/{bidder}.json` and use [JSON Schema](https://json-schema.org/understanding-json-schema/) to define your bidder parameters. Prebid Server requires this file for every adapter, even if yours doesn't require bidder parameters (see the 'no parameters' example at the end of this section). @@ -545,8 +545,8 @@ Each adapter has its own directory (a 'package' in Go parlance) for all code and Create a file with the path `adapters/{bidder}/{bidder}.go`. Your bid adapter code will need to implement and export: -* The `adapters.Builder` method to create a new instance of the adapter based on the host configuration. -* The `adapters.Bidder` interface consisting of the `MakeRequests` method to create outgoing requests to your bidding server and the `MakeBids` method to create bid responses. +- The `adapters.Builder` method to create a new instance of the adapter based on the host configuration. +- The `adapters.Bidder` interface consisting of the `MakeRequests` method to create outgoing requests to your bidding server and the `MakeBids` method to create bid responses. {: .alert.alert-info :} **ACCESS MODIFIERS:** Go has only two kinds of access modifiers, exported and private, which are scoped at the package level. The access modifier is encoded into the name of the type or method. Names starting with an upper case letter are exported whereas names starting with a lower case letter are private. Please only export the three required methods and keep everything else private. @@ -667,8 +667,8 @@ The first argument, `bidderName`, is the name of the bidder being built. This ma The second argument, `config`, is all the configuration values set for your adapter. However, not all of this information is intended for use by the `Builder` method. The only two fields relevant here are `config.Endpoint` and `config.ExtraAdapterInfo`: -* `config.Endpoint` is the base url of your bidding server and may be interpreted as either a literal address or as a templated macro to support dynamic paths. -* `config.ExtraAdapterInfo` is an optional setting may be used for any other values your adapter may need, such as an application token or publisher allow/deny list. You may interpret this string however you like, although JSON is a common choice. +- `config.Endpoint` is the base url of your bidding server and may be interpreted as either a literal address or as a templated macro to support dynamic paths. +- `config.ExtraAdapterInfo` is an optional setting may be used for any other values your adapter may need, such as an application token or publisher allow/deny list. You may interpret this string however you like, although JSON is a common choice. The third argument, `server`, is a set of host configs. It can be passed in two different ways. One way is to pass this info in the auction request itself at the path `ext.prebid.server` (i.e. `ext.prebid.server.datacenter`). The second way is to pass this info as a configuration data structure. @@ -770,9 +770,9 @@ if request.Imp[i].W == nil && request.Imp[i].H == nil && len(request.Imp[i].Form The second argument, `requestInfo`, is for extra information and helper methods provided by the core framework. This includes: -* `requestInfo.PbsEntryPoint` to access the entry point of the bid request, commonly used to determine if the request is for AMP or for a [Long Form Video Ad Pod](/dev-docs/modules/adpod.html). -* `requestInfo.GlobalPrivacyControlHeader` to read the value of the `Sec-GPC` Global Privacy Control (GPC) header of the bid request. -* `requestInfo.ConvertCurrency` a method to perform currency conversions. +- `requestInfo.PbsEntryPoint` to access the entry point of the bid request, commonly used to determine if the request is for AMP or for a [Long Form Video Ad Pod](/dev-docs/modules/adpod.html). +- `requestInfo.GlobalPrivacyControlHeader` to read the value of the `Sec-GPC` Global Privacy Control (GPC) header of the bid request. +- `requestInfo.ConvertCurrency` a method to perform currency conversions. The `MakeRequests` method is expected to return a slice (similar to a C# `List` or a Java `ArrayList`) of `adapters.RequestData` objects representing the HTTP calls to be sent to your bidding server and a slice of type `error` for any issues encountered creating them. If there are no HTTP calls or if there are no errors, please return `nil` for both return values. Please do not add `nil` items in the slices. @@ -1076,8 +1076,8 @@ aliasOf: "appnexus" Notes: -* The alias name must be unique for the first 6 chars as noted above for biddercodes. -* This process will be simplified someday. +- The alias name must be unique for the first 6 chars as noted above for biddercodes. +- This process will be simplified someday. {: .alert.alert-info :} Note on aliases and TCF Global Vendor List IDs: if an alias entry does not have its own GVLID but wishes to claim GDPR support, @@ -1128,8 +1128,8 @@ You should use an obviously fake endpoint for your tests. There's no reason to u Each test case should be written in its own JSON file with a succinct, yet descriptive, name of what's being tested. The files should be located in either: -* `adapters/{bidder}/{bidder}test/exemplary/` for straight forward "happy path" tests. We expect to see tests here for each supported media type. -* `adapters/{bidder}/{bidder}test/supplemental` for tests which produce errors or cover more complicated scenarios. +- `adapters/{bidder}/{bidder}test/exemplary/` for straight forward "happy path" tests. We expect to see tests here for each supported media type. +- `adapters/{bidder}/{bidder}test/supplemental` for tests which produce errors or cover more complicated scenarios. The format of a JSON test is as follows: @@ -1382,41 +1382,41 @@ The Example Bidding adapter requires setup before beginning. Please contact us a Notes on the metadata fields: -* Add `pbs: true`. If you also have a [Prebid.js bid adapter](/dev-docs/bidder-adaptor.html), add `pbjs: true`. Default is false for both. -* If you're on the IAB's Global Vendor List, place your ID in `gvl_id`. No default. -* If you support the IAB's TCF protocol and have a GVL ID, you may add `tcfeu_supported: true`. Default is false. -* If you support the US Privacy consentManagementUsp module, add `usp_supported: true`. Default is false. -* If you support one or more userId modules, add `userId: (list of supported vendors)`. Default is none. -* If you support video, native, or audio mediaTypes add `media_types: video, native, audio`. Note that display is added by default. If you don't support display, add "no-display" as the first entry, e.g. `media_types: no-display, native`. No defaults. -* If you support COPPA, add `coppa_supported: true`. Default is false. -* If you support sections within the IAB's GPP consent string, add `gpp_sids:' and then which sections you support: tcfeu, tcfca, usnat, usstate_all, usp -* If you support the [supply chain](/dev-docs/modules/schain.html) feature, add `schain_supported: true`. Default is false. -* If you support adding a demand chain on the bid response, add `dchain_supported: true`. Default is false. -* If your bidder doesn't work well with safeframed creatives, add `safeframes_ok: false`. This will alert publishers to not use safeframed creatives when creating the ad server entries for your bidder. No default. -* If your bidder supports mobile apps, set `pbs_app_supported: true`. No default value. -* If your bidder supports deals, set `deals_supported: true`. No default value. -* If your bidder supports floors, set `floors_supported: true`. No default value. -* If you support first party data, you must document what exactly is supported and then you may set `fpd_supported: true`. No default value. -* If you support any OpenRTB blocking parameters, you must document what exactly is supported and then you may set `ortb_blocking_supported` to ‘true’,’partial’, or ‘false’. No default value. In order to set ‘true’, you must support: bcat, badv, battr, and bapp. -* Let publishers know how you support multiformat requests -- those with more than one mediatype (e.g. both banner and video). Here are the options: will-bid-on-any, will-bid-on-one, will-not-bid -* If you're a member of Prebid.org, add `prebid_member: true`. Default is false. +- Add `pbs: true`. If you also have a [Prebid.js bid adapter](/dev-docs/bidder-adaptor.html), add `pbjs: true`. Default is false for both. +- If you're on the IAB's Global Vendor List, place your ID in `gvl_id`. No default. +- If you support the IAB's TCF protocol and have a GVL ID, you may add `tcfeu_supported: true`. Default is false. +- If you support the US Privacy consentManagementUsp module, add `usp_supported: true`. Default is false. +- If you support one or more userId modules, add `userId: (list of supported vendors)`. Default is none. +- If you support video, native, or audio mediaTypes add `media_types: video, native, audio`. Note that display is added by default. If you don't support display, add "no-display" as the first entry, e.g. `media_types: no-display, native`. No defaults. +- If you support COPPA, add `coppa_supported: true`. Default is false. +- If you support sections within the IAB's GPP consent string, add `gpp_sids:' and then which sections you support: tcfeu, tcfca, usnat, usstate_all, usp +- If you support the [supply chain](/dev-docs/modules/schain.html) feature, add `schain_supported: true`. Default is false. +- If you support adding a demand chain on the bid response, add `dchain_supported: true`. Default is false. +- If your bidder doesn't work well with safeframed creatives, add `safeframes_ok: false`. This will alert publishers to not use safeframed creatives when creating the ad server entries for your bidder. No default. +- If your bidder supports mobile apps, set `pbs_app_supported: true`. No default value. +- If your bidder supports deals, set `deals_supported: true`. No default value. +- If your bidder supports floors, set `floors_supported: true`. No default value. +- If you support first party data, you must document what exactly is supported and then you may set `fpd_supported: true`. No default value. +- If you support any OpenRTB blocking parameters, you must document what exactly is supported and then you may set `ortb_blocking_supported` to ‘true’,’partial’, or ‘false’. No default value. In order to set ‘true’, you must support: bcat, badv, battr, and bapp. +- Let publishers know how you support multiformat requests -- those with more than one mediatype (e.g. both banner and video). Here are the options: will-bid-on-any, will-bid-on-one, will-not-bid +- If you're a member of Prebid.org, add `prebid_member: true`. Default is false. ## File Checklist -* Bidder Info - * `static/bidder-info/{bidder}.yaml` -* Bidder Parameters - * `static/bidder-params/{bidder}.json` - * `openrtb_ext/imp_{bidder}.go` - * `adapters/{bidder}/params_test.go` -* Adapter Code - * `adapters/{bidder}/{bidder}.go` - * `adapters/{bidder}/{bidder}_test.go` - * `adapters/{bidder}/{bidder}test/exemplary/*.json` - * `adapters/{bidder}/{bidder}test/supplemental/*.json` -* Register With The Core - * `openrtb_ext/bidders.go` - * `exchange/adapter_builders.go` +- Bidder Info + - `static/bidder-info/{bidder}.yaml` +- Bidder Parameters + - `static/bidder-params/{bidder}.json` + - `openrtb_ext/imp_{bidder}.go` + - `adapters/{bidder}/params_test.go` +- Adapter Code + - `adapters/{bidder}/{bidder}.go` + - `adapters/{bidder}/{bidder}_test.go` + - `adapters/{bidder}/{bidder}test/exemplary/*.json` + - `adapters/{bidder}/{bidder}test/supplemental/*.json` +- Register With The Core + - `openrtb_ext/bidders.go` + - `exchange/adapter_builders.go` ## Contribute diff --git a/prebid-server/developers/add-new-bidder-java.md b/prebid-server/developers/add-new-bidder-java.md index 18b20e2b0b..f0aa1b5f3c 100644 --- a/prebid-server/developers/add-new-bidder-java.md +++ b/prebid-server/developers/add-new-bidder-java.md @@ -11,7 +11,7 @@ title: Prebid Server | Developers | Adding a New Bidder - TOC {:toc } -Thank you for your valuable contribution of a bid adapter to the open source Prebid Server project. Each new adapter expands the monetization possibilities for publishers and provides greater options to maximize their inventory's potential. We truly appreciate your support in making this ecosystem thrive! +Thank you for your contribution of a bid adapter to the open source Prebid Server project. Each new adapter expands the monetization possibilities for publishers and provides greater options to maximize their inventory's potential. We appreciate your support in making this ecosystem thrive! This document guides you through the process of developing a new bid adapter for your bidding server. We encourage you to look at [existing bid adapters](https://github.com/prebid/prebid-server-java/tree/master/src/main/java/org/prebid/server/bidder) for working examples and practical guidance. You can ask us questions by [submitting a GitHub issue](https://github.com/prebid/prebid-server-java/issues/new). @@ -267,7 +267,7 @@ Publishers will provide extra information using an OpenRTB 2.x Bid Request Exten We request that you do not duplicate information that is already present in the [OpenRTB 2.x request](https://github.com/InteractiveAdvertisingBureau/openrtb2.x/blob/main/2.6.md) or is already part of an established Prebid convention. For example, your bidder parameters should not include first party data, bid floors, schain, video parameters, referrer information, or privacy consent including COPPA, CCPA, and GDPR TCF. For video parameters in particular, you must prefer the OpenRTB 2.x Bid Request standard of `request.imp[].video`. {: .alert.alert-warning :} -**ENDPOINT NOTE:** You may not try so set the full endpoint domain from a publisher-specified bidder parameter. Prebid Server is not an open proxy. If absolutely necessary, you may specify a *portion* of the domain as a parameter to support geo regions or account specific servers. However, this is discouraged and may degrade the performance of your adapter since the server needs to maintain more outgoing connections. Host companies may choose to disable your adapter if it uses a dynamically configured domain. +You may not try to set the full endpoint domain from a publisher-specified bidder parameter. Prebid Server is not an open proxy. If absolutely necessary, you may specify a *portion* of the domain as a parameter to support geo regions or account specific servers. However, this is discouraged and may degrade the performance of your adapter since the server needs to maintain more outgoing connections. Host companies may choose to disable your adapter if it uses a dynamically configured domain. Create a file with the path `static/bidder-params/{bidder}.json` using [JSON Schema](https://json-schema.org/understanding-json-schema/) to define your bidder parameters. Prebid Server requires this file for every adapter, even if yours doesn't require bidder parameters (see the 'no parameters' example at the end of this section). @@ -428,11 +428,11 @@ Please follow [Java standard naming convention](https://www.oracle.com/java/tech Now it's time to write your bid adapter code. -Each adapter has its own directory (a 'package' in java parlance) for all code and tests associated with translating an OpenRTB 2.x Bid Request to your bidding server's protocol and mapping your server's response to an OpenRTB 2.x Bid Response. The use of separate packages provide each adapter with its own naming scope to avoid conflicts and gives the freedom to organize files as you best see fit (although we make suggestions in this guide). +Each adapter has its own directory (a 'package' in java parlance) for all code and tests associated with translating an OpenRTB 2.x Bid Request to your bidding server's protocol and mapping your server's response to an OpenRTB 2.x Bid Response. The use of separate packages provides each adapter with its own naming scope to avoid conflicts and gives the freedom to organize files as you best see fit (although we make suggestions in this guide). Create a file with the path `org.prebid.server.bidder.{bidder}/{bidder}Bidder.java`. Your bid adapter code will need to implement Bidder interface where `T` is a model which will represent HttpRequest body. -- The `Bidder` interface consisting of the `MakeHttpRequests` method to create outgoing requests to your bidding server and the `MakeBids` method to create bid responses. +- The `Bidder` interface consists of the `MakeHttpRequests` method to create outgoing requests to your bidding server and the `MakeBids` method to create bid responses. Here is a reference implementation for a bidding server which uses the OpenRTB 2.x protocol: From e9d55e525ac65f12ab9962f1d0af369e1cca21c2 Mon Sep 17 00:00:00 2001 From: khang-vu-ttd <109103626+khang-vu-ttd@users.noreply.github.com> Date: Thu, 5 Dec 2024 00:56:43 -0800 Subject: [PATCH 323/816] update placement to plcmt (#5750) --- dev-docs/bidders/ttd.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/ttd.md b/dev-docs/bidders/ttd.md index 7768c16df0..5c29b31048 100644 --- a/dev-docs/bidders/ttd.md +++ b/dev-docs/bidders/ttd.md @@ -92,7 +92,7 @@ var bannerAdUnit = { #### `mediaTypes.video` Parameters The TTD adapter for video requires certain parameters in the AdUnit's -[mediaTypes.video](https://docs.prebid.org/dev-docs/adunit-reference.html#adUnit.mediaTypes.video) definition. Specifically, `maxduration`, `api`, `mimes`, `placement`, and `protocols` are all required for video ad units. `playerSize`, `startdelay`, `playbackmethod`, and `pos` are recommended. `minduration`, `minbitrate`, `maxbitrate`, `skip`, `skipmin`, and `skipafter` are optional. +[mediaTypes.video](https://docs.prebid.org/dev-docs/adunit-reference.html#adUnit.mediaTypes.video) definition. Specifically, `maxduration`, `api`, `mimes`, `plcmt`, and `protocols` are all required for video ad units. `playerSize`, `startdelay`, `playbackmethod`, and `pos` are recommended. `minduration`, `minbitrate`, `maxbitrate`, `skip`, `skipmin`, and `skipafter` are optional. Note: TTD does not currently support `adpod` video contexts. @@ -108,7 +108,7 @@ var videoAdUnit = { playerSize: [640, 480], api: [1, 3], mimes: ['video/mp4'], - placement: 3, + plcmt: 3, protocols: [2, 3, 5, 6], startdelay: -1, playbackmethod: [1], From a2dc6757fc2657d0c29842026407ce9c46d275bc Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 5 Dec 2024 11:03:35 -0500 Subject: [PATCH 324/816] PBS modules: add greenbids RTD (#5754) --- prebid-server/pbs-modules/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/prebid-server/pbs-modules/index.md b/prebid-server/pbs-modules/index.md index d0b88cd008..7179e0ba9c 100644 --- a/prebid-server/pbs-modules/index.md +++ b/prebid-server/pbs-modules/index.md @@ -33,6 +33,7 @@ The full list of modules: | [**US Custom Logic Privacy**](/prebid-server/features/pbs-uscustomlogic.html) | Similar to the `US Gen Privacy` module, but publishers define their own interpretation of the GPP string. | privacy | | check | | [**Richmedia Filter**](/prebid-server/pbs-modules/richmedia.html) | Can filter MRAID creatives from the bid stream. | validation | | check | | [**51Degrees Device Detection**](/prebid-server/pbs-modules/51degrees-device-detection.html) | Enriches an incoming OpenRTB request with [51Degrees Device Data](https://51degrees.com/documentation/_device_detection__overview.html) | general | check | check | +| [**Greenbids Real Time Data**](/prebid-server/pbs-modules/greenbids-real-time-data.html) | Filters out bidders that are not expected to bid on this request, saving money and carbon. | general | | check | | [**Request Correction**](/prebid-server/pbs-modules/request-correction.html) | Apply optional corrections to bid requests. | general | | check | | [**Response Correction**](/prebid-server/pbs-modules/response-correction.html) | Apply optional corrections to bid responses. | general | | check | From c90a697ecbbccc478ec903f608a32551a435288a Mon Sep 17 00:00:00 2001 From: Evgenii Novikov Date: Fri, 6 Dec 2024 13:37:28 +0100 Subject: [PATCH 325/816] Yandex Metrica Analytics: updated links to the interface (#5756) --- dev-docs/analytics/yandex.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/analytics/yandex.md b/dev-docs/analytics/yandex.md index a1d380e372..5626374e5b 100644 --- a/dev-docs/analytics/yandex.md +++ b/dev-docs/analytics/yandex.md @@ -20,7 +20,7 @@ Disclosure: The adapter utilizes the Metrica Tag build based on [github.com/yand 2. **Insert Counter Initialization Code:** - Retrieve the counter initialization code from the Yandex Metrica settings page at `https://metrica.yandex.com/settings?id={counterId}`, where `{counterId}` is your counter ID, and embed it into your website's HTML. + Retrieve the counter initialization code from the Yandex Metrica settings page at [metrica.yandex.com/r/settings](https://metrica.yandex.com/r/settings), and embed it into your website's HTML. 3. **Initialize the Adapter in Prebid.js:** @@ -43,4 +43,4 @@ Disclosure: The adapter utilizes the Metrica Tag build based on [github.com/yand ## Accessing Analytics Data -You can view the collected analytics data in the Yandex Metrica dashboard. Navigate to [metrika.yandex.com/dashboard](https://metrika.yandex.com/dashboard) and look for the Prebid Analytics section to analyze your data. +You can view the collected analytics data in the Yandex Metrica dashboard. Navigate to [metrika.yandex.com/r/stat/prebid_events](https://metrika.yandex.com/r/stat/prebid_events) to analyze your data. From 31c95ea46e8a6b7fc800437a941c495f408378f9 Mon Sep 17 00:00:00 2001 From: pm-azhar-mulla <75726247+pm-azhar-mulla@users.noreply.github.com> Date: Fri, 6 Dec 2024 18:23:13 +0530 Subject: [PATCH 326/816] JS: Added documentation for suppressExpiredRender flag (#5746) * documentation for suppressExpiredRender flag * add wording --------- Co-authored-by: pm-azhar-mulla Co-authored-by: Chris Huie --- dev-docs/publisher-api-reference/setConfig.md | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/dev-docs/publisher-api-reference/setConfig.md b/dev-docs/publisher-api-reference/setConfig.md index fef8e66c1e..43957cffb6 100644 --- a/dev-docs/publisher-api-reference/setConfig.md +++ b/dev-docs/publisher-api-reference/setConfig.md @@ -1175,7 +1175,8 @@ The `auctionOptions` object controls aspects related to auctions. | Field | Scope | Type | Description | |----------+---------+--------+---------------------------------------------------------------------------------------| | `secondaryBidders` | Optional | Array of Strings | Specifies bidders that the Prebid auction will no longer wait for before determining the auction has completed. This may be helpful if you find there are a number of low performing and/or high timeout bidders in your page's rotation. | -| `suppressStaleRender` | Optional | Boolean | When true, prevents `banner` bids from being rendered more than once. It should only be enabled after auto-refreshing is implemented correctly. Default is false. +| `suppressStaleRender` | Optional | Boolean | When true, prevents `banner` bids from being rendered more than once. It should only be enabled after auto-refreshing is implemented correctly. Default is false. | +| `suppressExpiredRender` | Optional | Boolean | When true, prevent bids from being rendered if TTL is reached. Default is false. #### Examples {: .no_toc} @@ -1212,6 +1213,28 @@ PBJS performs following actions when stale rendering is detected. Stale winning bids will continue to be rendered unless `suppressStaleRender` is set to true. Events including `STALE_RENDER` and `BID_WON` are unaffected by this option. +Render only non-expired bids. + +```javascript +pbjs.setConfig({ + 'auctionOptions': { + 'suppressExpiredRender': true + } +}); +``` + +#### More on Expired Rendering +{: .no_toc} + +We are validating the `ttl` property before rendering an ad. If the ad has exceeded its ttl value and the `suppressExpiredRender` property is enabled, the system will suppress the rendering of the expired ad. + +PBJS performs the following actions when expired rendering is detected. + +* Log a warning in the browser console if pbjs_debug=true. +* Emit a `EXPIRED_RENDER` event before `BID_WON` event. + +Expired winning bids will continue to be rendered unless `suppressExpiredRender` is set to true. Events including `STALE_RENDER` and `BID_WON` are unaffected by this option. + ### maxNestedIframes From f9955f5f82ae8deaee1855fb033cd5937851c396 Mon Sep 17 00:00:00 2001 From: Jeff Mahoney Date: Fri, 6 Dec 2024 11:13:54 -0500 Subject: [PATCH 327/816] Equativ Bid Adapter: Updating information about bid params (#5760) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * SADR-6590: initial documentation for Equativ JS bid adapter * SADR-6590: doc refinements * Update equativ.md SADR-6590: adjustments to doc from review feedback. * SADR-6590: fix linting issues * SADR-6590: another linting issue * update app.publisher.id * SADR-6590: providing link to Equativ OpenRTB API documentation * SADR-6590: providing additional required fields for documentation * SADR-6590: adding peer answers to questions * SADR-6590: remove FPD section for now * Equativ: updating documentation on bid adapter parameter requirements --------- Co-authored-by: Krzysztof Sokół --- dev-docs/bidders/equativ.md | 64 ++++++++----------------------------- 1 file changed, 14 insertions(+), 50 deletions(-) diff --git a/dev-docs/bidders/equativ.md b/dev-docs/bidders/equativ.md index ffa7dfb630..4ddca56f68 100644 --- a/dev-docs/bidders/equativ.md +++ b/dev-docs/bidders/equativ.md @@ -35,20 +35,19 @@ The Equativ bidder adapter requires setup and approval from the Equativ service {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |------|-------|-------------|---------|------| -| `networkId` | required | The network identifier you have been provided with. _See **Bid Parameter Usage** notes below for more information_. | `1234` | `integer` | -| `siteId` | required | The placement site ID. _See **Bid Parameter Usage** notes below for more information_. |`1234` | `integer` | -| `pageId` | required | The placement page ID. _See **Bid Parameter Usage** notes below for more information_. | `1234` | `integer` | -| `formatId` | required | The placement format ID. _See **Bid Parameter Usage** notes below for more information_. | `1234` | `integer` | +| `networkId` | required | The network identifier you have been provided with. Normally required, but there are certain conditions under which this may be omitted. _See **Bid Parameter Usage** notes below for more information_. | `1234` | `integer` | +| `siteId` | optional | The placement site ID. _See **Bid Parameter Usage** notes below for more information_. |`1234` | `integer` | +| `pageId` | optional | The placement page ID. _See **Bid Parameter Usage** notes below for more information_. | `1234` | `integer` | +| `formatId` | optional | The placement format ID. _See **Bid Parameter Usage** notes below for more information_. | `1234` | `integer` | #### Bid Parameter Usage Different combinations of parameters are required depending upon which ones you choose to use. -There are three options for passing bidder parameters: +There are two options for passing parameters: -- **Option 1**. Specify `networkId` by itself (_without_ `siteId`, `pageId` and `formatId`), or -- **Option 2**. Specify `siteId` _and_ `pageId` _and_ `formatId` (all together) _without_ `networkId`, or -- **Option 3**. Specify _none_ of the above parameters, and instead use either `ortb2.site.publisher.id`, `ortb2.app.publisher.id` or `ortb2.dooh.publisher.id` +- **Option 1**. Specify `networkId` by itself (_and optionally providing_ `siteId`, `pageId` and `formatId`), or +- **Option 2**. Specify either `ortb2.site.publisher.id`, `ortb2.app.publisher.id` or `ortb2.dooh.publisher.id` See **Sample Banner Setup** for examples of these parameter options. @@ -93,9 +92,9 @@ pbjs.bidderSettings = { #### Sample Banner Setup -As mentioned in the **Bid Parameter Usage** section, when including `'equativ'` as one of your available bidders your adunit setup, there are three general approaches to how you can specify parameters. Below are examples that illustrate them. +As mentioned in the **Bid Parameter Usage** section, when including `'equativ'` as one of your available bidders your adunit setup, there are two approaches to how you can specify parameters. Below are examples that illustrate them. -#### Option 1 -- Using networkId as the only bid param +#### Option 1 -- Using networkId as a parameter ```html ``` -#### Option 2 - Using siteId, pageId and formatId as bid params - -```html - -``` - -#### Option 3 - Using ortb2 for parameter info +#### Option 2 - Using ortb2 for parameter info You can also, as an alternative to using bidder params, specify a value for `publisher.id` that may be nested under an `app`, `site` or `dooh` object. The Equativ adapter will, in turn, look for these property paths under the `ortb2` property of the request: From 1d1ed2271e412b8738943ef991a29c6588a2017b Mon Sep 17 00:00:00 2001 From: "Adserver.Online" <61009237+adserver-online@users.noreply.github.com> Date: Fri, 6 Dec 2024 18:26:07 +0200 Subject: [PATCH 328/816] add kuantix alias doc (#5740) Co-authored-by: dev --- dev-docs/bidders/kuantyx.md | 44 +++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 dev-docs/bidders/kuantyx.md diff --git a/dev-docs/bidders/kuantyx.md b/dev-docs/bidders/kuantyx.md new file mode 100644 index 0000000000..cf13210888 --- /dev/null +++ b/dev-docs/bidders/kuantyx.md @@ -0,0 +1,44 @@ +--- +layout: bidder +title: Kuantyx +description: Kuantyx Bid Adapter +biddercode: kuantyx +tcfeu_supported: false +usp_supported: true +media_types: video, native +safeframes_ok: true +pbjs: true +pbs: true +pbs_app_supported: true +floors_supported: true +schain_supported: true +fpd_supported: true +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +userIds: all +sidebarType: 1 +aliasCode: aso +--- +### Note + +The Kuantyx adapter requires approval and setup. Please reach out to or visit us at [kuantyx.com](https://kuantyx.com) for more details. + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|------------------|-----------------------------|-----------| +| `server` | required | Server endpoint | `https://srv.kuantyx.com` | `String` | +| `zone` | required | Zone ID | `73815` | `Integer` | + +#### Video Caching + +Note that the Kuantyx adapter expects a client-side Prebid Cache to be enabled for video bidding. + +```js +pbjs.setConfig({ + cache: { + url: 'https://prebid.adnxs.com/pbc/v1/cache' + } +}); +``` From 205736da5906c032d202121d5e7668cc65095c02 Mon Sep 17 00:00:00 2001 From: Chris Huie Date: Fri, 6 Dec 2024 09:33:44 -0700 Subject: [PATCH 329/816] update tcfeu support (#5761) --- dev-docs/bidders/smilewanted.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/smilewanted.md b/dev-docs/bidders/smilewanted.md index 4cedc9c33c..0bac421c76 100644 --- a/dev-docs/bidders/smilewanted.md +++ b/dev-docs/bidders/smilewanted.md @@ -3,7 +3,7 @@ layout: bidder title: Smile Wanted description: SmileWanted Bidder Adapter biddercode: smilewanted -tcfeu_supported: false +tcfeu_supported: true gvl_id: 639 usp_supported: true coppa_supported: true From 5b718200c0af3b7b725cdadef38ecc2b3bcd3fe6 Mon Sep 17 00:00:00 2001 From: Anton Babak <76536883+AntoxaAntoxic@users.noreply.github.com> Date: Fri, 6 Dec 2024 20:00:56 +0100 Subject: [PATCH 330/816] Exitpoint Stage Documentation (#5739) * Exitpoint Stage Documentation * wordsmithing * wordsmithing --------- Co-authored-by: bretg --- .../images/prebid-server/module-example.png | Bin 164802 -> 72541 bytes prebid-server/developers/add-a-module-java.md | 12 ++++++++++++ prebid-server/developers/add-a-module.md | 3 ++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/assets/images/prebid-server/module-example.png b/assets/images/prebid-server/module-example.png index ea864b1c1579fab9ce280cf682d40998e5149207..3c3d22e4689ecb9538fbbdb1e508036f4203eb42 100644 GIT binary patch literal 72541 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

    !Iv5X>v3Ue>r#JTn(fbj@fBqAzhh7zbdb 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 Ck8yYa literal 164802 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 y`&9|Od7vk;egfc$tQ~w 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%0D#2qPxVXw* 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

  • D|v|hkfOt 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 diff --git a/prebid-server/developers/add-a-module-java.md b/prebid-server/developers/add-a-module-java.md index 90aaa31aa7..72b43f3b14 100644 --- a/prebid-server/developers/add-a-module-java.md +++ b/prebid-server/developers/add-a-module-java.md @@ -123,6 +123,7 @@ These are the available hooks that can be implemented in a module: - org.prebid.server.hooks.v1.bidder.RawBidderResponseHook - org.prebid.server.hooks.v1.bidder.AllProcessedBidResponsesHook - org.prebid.server.hooks.v1.auction.AuctionResponseHook +- org.prebid.server.hooks.v1.exitpoint.ExitpointHook In a module it is not necessary to implement all mentioned interfaces but only one (or several) required by your functionality. @@ -131,6 +132,17 @@ Each hook interface internally extends org.prebid.server.hooks.v1.Hook basic int - `code()` - returns module code. - `call(...)` - returns result of hook invocation. +### Difference between AuctionResponseHook and ExitpointHook +In a nutshell, both hooks allow the modification of the OpenRTB Bid Response but in different ways. +The `AuctionResponseHook` provides a last chance to work with the Java objects that modify the auction response. +The `ExitpointHook` allows you to build a completely different response based on the received auction context. i.e. something that's not OpenRTB JSON - something like VAST. These hooks could modify the auction/amp/video response that PBS has built, or it could build another one and modify response headers accordingly. + +Important Notes: + +- The ExitpointHook is a powerful tool that allows rewriting the auction results, so make sure important data won't be lost for the client. +- Since the response body is not modified after calling the ExitpointHook, debug and traces won't be added by PBS-core. The exitpoint hook is responsible for adding its own tracing to the generated output. +- Analytics adapters doesn't have access to the response built by the ExitpointHook, but they receive the up-to-date auction context with the ExitpointHook execution status and analytics tags. + ### Examples 1. To **update** the request in the `RawAuctionRequestHook` you would return: diff --git a/prebid-server/developers/add-a-module.md b/prebid-server/developers/add-a-module.md index 74059d93a3..0edbbd3cb7 100644 --- a/prebid-server/developers/add-a-module.md +++ b/prebid-server/developers/add-a-module.md @@ -70,7 +70,8 @@ Here's a description of the Stages of a PBS request that modules can tap into fo | Bidder Request | The request has been customized for a particular bidder in the auction. Note that the module will be called in parallel for each bidder in the auction. | auction, amp, video | Bidder-specific bcat/badv, Bidder-specific deals | | Raw Bidder Response | Hook functions can get access to the unprocessed bidder response. Note that the module will be called in parallel for each bidder in the auction. | auction, amp, video | Response validations | | All Processed Bid Responses | All bids are back and PBS-core bid validations are done. | auction, amp, video | Creative validation, advanced bid validations. | -| Auction Response | Last step before the response goes back to the client | auction, amp, video | Inject ad server targeting, alternate auction winner logic | +| Auction Response | Last chance to modify the bid auction response | auction, amp, video | Inject ad server targeting, alternate auction winner logic | +| Exitpoint | (PBS-Java 3.16+) Last step before the response goes back to the client. Specify the response headers and body | auction, amp, video | Create a VAST response instead of OpenRTB. | ### 3. Figure Out Which Stages You're Going to Hook Into From 2aee20bdf803157c6681b7a8c7f5872cbae4b8c6 Mon Sep 17 00:00:00 2001 From: mkomorski Date: Fri, 6 Dec 2024 21:09:25 +0100 Subject: [PATCH 331/816] Adding auctionDelay param to currency module (#5749) Co-authored-by: Marcin Komorski --- dev-docs/modules/currency.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dev-docs/modules/currency.md b/dev-docs/modules/currency.md index be27ef75a7..51358c93d2 100644 --- a/dev-docs/modules/currency.md +++ b/dev-docs/modules/currency.md @@ -30,6 +30,7 @@ currency conversion file while the bids are taking place. Alternately, the conve be provided in the page. 1. At runtime, bids are converted to the ad server currency as needed. 1. Default rates can be provided in case the file cannot be loaded. +1. When `requestBids` is called, the Currency Module will delay the auction up to the supplied amount of time in `currency.auctionDelay` or as soon as the dynamic endpoint returns data, whichever is first. ## Currency Architecture @@ -195,6 +196,8 @@ pbjs.setConfig({ "conversionRateFile": "URL_TO_RATE_FILE", // optionally provide a default rate in case the file can't be read "defaultRates": { "USD": { "GPB": 0.75 }} + // optionally sets the auction defer time if the file has not been loaded yet + "auctionDelay": 1000 } }); ``` From a5bc143d321b9a9869249b93e0f8aaa2bebac430 Mon Sep 17 00:00:00 2001 From: Anton Babak <76536883+AntoxaAntoxic@users.noreply.github.com> Date: Mon, 9 Dec 2024 14:17:21 +0100 Subject: [PATCH 332/816] Module Execution Config (#5741) * Module Execution Config * Module Execution Config * Module Execution Config * Remove mentioning the host-level config * Getting back the host-level config * update wording * expanded the example * lint * adding module A/B test @AntoxaAntoxic - can you please take a look at the new section 3.2 and make sure I got the A/B test parameter defaults correct? Thanks. * lint --------- Co-authored-by: Chris Huie Co-authored-by: bretg --- prebid-server/pbs-modules/index.md | 144 ++++++++++++++++++++++++++--- 1 file changed, 131 insertions(+), 13 deletions(-) diff --git a/prebid-server/pbs-modules/index.md b/prebid-server/pbs-modules/index.md index 7179e0ba9c..c07d1de507 100644 --- a/prebid-server/pbs-modules/index.md +++ b/prebid-server/pbs-modules/index.md @@ -12,7 +12,7 @@ The core of Prebid Server contains the foundational code needed for header biddi If you're looking for bidder adapter parameters, see [Bidders' Params](/dev-docs/pbs-bidders.html). -* TOC +- TOC {:toc} ## The Modules @@ -54,10 +54,10 @@ mvn clean package --file extra/pom.xml The execution plan details: -* which modules are used in your server -* what order they're invoked in -* how long modules have to run before timeout -* whether any modules depend on each other +- which modules are used in your server +- what order they're invoked in +- how long modules have to run before timeout +- whether any modules depend on each other If you want the module to run on every request regardless of account, this is a host-level config you should place in `application.yaml`. If the module should @@ -65,9 +65,9 @@ be active only for certain accounts, you'll need to place the plan in the accoun To define a plan, you'll need to know the following module details, which should be available in the module documentation: -* urls: which PBS 'entry points' are relevant. e.g. /openrtb2/auction, /openrtb2/amp -* stages: one or more of the 7 workflow stages where the module should be called: entrypoint, raw-auction-request, processed-auction-request, bidder-request, raw-bidder-response, processed-bidder-response, and/or auction-response. -* hooks: for each stage where a module runs, its documentation will provide the hook function name. +- urls: which PBS 'entry points' are relevant. e.g. /openrtb2/auction, /openrtb2/amp +- stages: one or more of the 7 workflow stages where the module should be called: entrypoint, raw-auction-request, processed-auction-request, bidder-request, raw-bidder-response, processed-bidder-response, and/or auction-response. +- hooks: for each stage where a module runs, its documentation will provide the hook function name. Here's an example application.yaml entry: @@ -132,13 +132,131 @@ hooks: } ``` +{: .alert.alert-info : +Execution plans can be placed in account configuration, but depending on how modules are enabled in your environment, it can be inconvenient to provide instructions to place the highly technical execution plan into the account config. Some organizations have +chosen to keep all execution plans in host-level config, then enabling the `require-config-to-invoke` option as described in the next section. + ### 3. Supply the module with configuration Modules may require configuration at startup or during the request: -* If the module requires config at initialization, its documentation will +- If the module requires config at initialization, its documentation will describe where the config file lives and what format it should take. -* If the module requires runtime config, it should be passed via the account-conig mechanism. +- If the module requires runtime config, it should be passed via the account-config mechanism. + +### 3.1 Module Execution Configuration + +PBS-Java 3.16 introduced new configurations that give the host company flexible control over which modules run for which accounts +while still allowing all execution plans to be defined at the host-level. + +- `hooks.admin.module-execution` is a key-value map, where a key is a module name and a value is a boolean. It defines whether a module's hooks should be executed. +This property can be configured on the host level at initialization as well as via account-config mechanism (a runtime config). +- `settings.modules.require-config-to-invoke` is a host-level boolean property. When set to `true`, it requires a runtime config to exist for a module in order to actually run the execution plan. + +Here's how these work together: + +1. If `hooks.admin.module-execution` is defined at the host-level (application.yaml), it overrides all account config. No account can turn off a module flagged as true, and likewise they can’t turn on a module flagged as false. +1. Essentially, setting false at the host level has the same effect as removing the module’s execution plan. +1. If `hooks.admin.module-execution` is not defined at the host level, then normal precedence rules are in effect: any value in account config overrides what’s in default account config. +1. If nothing is found for the module in the merged `hooks.admin.module-execution` and `require-config-to-invoke` is true, then account-level config is required. + +Example: + +```yaml +# host-level config +settings: + modules: + require-config-to-invoke: true +hooks: + admin: + host-execution-plan: > + {"endpoints":{... define execution plans for module1, module3, and module4 here ...}} + module-execution: + module1: true // don't allow accounts to turn off this module. Also don't worry about requiring config. Always run this one. + module2: false // don't allow accounts to utilize this module at all, even if they define a plan in account config. +``` + +```json +// account-level config +// the end result is that module1, module3, and module5 are run. +// module2 is not run even though a plan is defined in this account config because the host company has forbidden it above +// module4 is not run because there's no config and require-config-to-invoke is true +{ + "hooks": { + "admin": { + "module-execution": { + "module1": false // does nothing, since module1 is always on at the host level + } + }, + "modules": { + "module3": { ... module 3 config ... }, + "module5": { ... module 5 config ... }, + }, + "execution-plan": { + ... define an execution plan for module2 and module5 here ... + } + } +} +``` + +### 3.2 A/B Testing Modules + +Host companies and accounts might want to try enabling a module on a small percentage of traffic before turning it on all the way. + +PBS-Java 3.16 introduced a new A/B testing framework that applies to any module. + +```json5 +{ + "hooks": { + "execution-plan": { + "abtests": [{ + "accounts": [ 123, 456 ], // these are ignored if in account-level config + "module-code": "module1", + "enabled": true, // defaults to false + "percent-active": 5, // defaults to 100 + "log-analytics-tag": true // defaults to true + },{ + ... abtest config for other modules ... + }], + "endpoints": { + "/openrtb2/auction": { + ... + } + } + ] + ] +] +``` + +These are the parameters accepted within the `abtests` object: + +{: .table .table-bordered .table-striped } +| Parameter | Scope | Description | Type | Default | +|-----------+-------+-------------+------+---------| +| module-code | required | Which module is being tested. | string | none | +| percent-active | required | What percent of the time the module will run. | integer | none | +| accounts | optional | Defines which accounts this abtest block applies to. This is useful when the execution plan is defined at the host level and is ignored when the plan is at the account level. | array of int | none | +| enabled | optional | Allows the abtest to be disabled without removing it. | boolean | true | +| log-analytics-tag | optional | Directs PBS-core to log an analytics tag for reporting. | boolean | false | + +To get reporting on the test results, analytics adapters will need to read the [analytics tag](/prebid-server/developers/module-atags.html) created by the A/B test, which looks like this: + +```json5 +{ + activities: [{ + name: "core-module-abtests", + status: "success", + results: [{ // one results object for each module in the abtests object + "status": STATUS, // "run" or "skipped" + "values": { + "module": "module1" + } + }] + }, + ... the status of other abtest decisions ... + }] +} +``` ## Installing a PBS Privacy Module @@ -147,6 +265,6 @@ relevant 'Activity' using the `privacyreg` directive as described in the [Activi ## Further Reading -* [Developing a Prebid Server General Module](/prebid-server/developers/add-a-module.html) -* [Developing a Prebid Server Privacy Module](/prebid-server/developers/add-a-privacy-module.html) -* [Prebid Server Features](/prebid-server/features/pbs-feature-idx.html) +- [Developing a Prebid Server General Module](/prebid-server/developers/add-a-module.html) +- [Developing a Prebid Server Privacy Module](/prebid-server/developers/add-a-privacy-module.html) +- [Prebid Server Features](/prebid-server/features/pbs-feature-idx.html) From 2bd11ce1e422cdb378b838cf8a747c7780183026 Mon Sep 17 00:00:00 2001 From: Denis Logachov Date: Mon, 9 Dec 2024 19:20:43 +0200 Subject: [PATCH 333/816] Update spinx.md (#5744) --- dev-docs/bidders/spinx.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/spinx.md b/dev-docs/bidders/spinx.md index a4a1e80d9f..60ca37b1b3 100644 --- a/dev-docs/bidders/spinx.md +++ b/dev-docs/bidders/spinx.md @@ -32,5 +32,5 @@ The SpinX bidding adapter requires setup and approval before implementation. Ple {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |----------|----------|-----------------------|---------------------------|----------| -| `host` | required | RTB host | `'cpm.arteabee.com'` | `string` | +| `host` | required | RTB host | `'cpm.rtads.bid'` | `string` | | `zoneId` | required | Zone Id | 30164 | `integer` | From a0b8d6b808a9044de4c28920e861f00e73f84427 Mon Sep 17 00:00:00 2001 From: Eugene Dorfman Date: Wed, 11 Dec 2024 14:38:33 +0100 Subject: [PATCH 334/816] 51d module: update link (#5770) --- dev-docs/modules/51DegreesRtdProvider.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dev-docs/modules/51DegreesRtdProvider.md b/dev-docs/modules/51DegreesRtdProvider.md index 30a672d05c..7a554689dd 100644 --- a/dev-docs/modules/51DegreesRtdProvider.md +++ b/dev-docs/modules/51DegreesRtdProvider.md @@ -32,7 +32,7 @@ The Cloud API is **free** to integrate and use. To increase limits please check The module supports on premise and cloud device detection services with free options for both. -A free resource key for use with 51Degrees cloud service can be obtained from [51Degrees cloud configuration](https://configure.51degrees.com/HNZ75HT1). This is the simplest approach to trial the module. +A free resource key for use with 51Degrees cloud service can be obtained from [51Degrees cloud configuration](https://configure.51degrees.com/HNZ75HT1?utm_source=Prebid&utm_medium=Documentation). This is the simplest approach to trial the module. An interface compatible self hosted service can be used with .NET, Java, Node, PHP, and Python. See [51Degrees examples](https://51degrees.com/documentation/_examples__device_detection__getting_started__web__on_premise.html). @@ -54,7 +54,7 @@ gulp build --modules="rtdModule,51DegreesRtdProvider,appnexusBidAdapter,..." #### Resource Key -In order to use the module please first obtain a Resource Key using the [Configurator tool](https://configure.51degrees.com/HNZ75HT1) - choose the following properties: +In order to use the module please first obtain a Resource Key using the [Configurator tool](https://configure.51degrees.com/HNZ75HT1?utm_source=Prebid&utm_medium=Documentation) - choose the following properties: * DeviceId * DeviceType @@ -124,7 +124,7 @@ pbjs.setConfig({ waitForIt: true, // should be true, otherwise the auctionDelay will be ignored params: { resourceKey: '', - // Get your resource key from https://configure.51degrees.com/HNZ75HT1 + // Get your resource key from https://configure.51degrees.com/HNZ75HT1?utm_source=Prebid&utm_medium=Documentation // alternatively, you can use the on-premise version of the 51Degrees service and connect to your chosen end point // onPremiseJSUrl: 'https://localhost/51Degrees.core.js' }, From c30e0cac354acd7344bc78b5baad39970e79cdc1 Mon Sep 17 00:00:00 2001 From: Fatih Kaya Date: Wed, 11 Dec 2024 22:35:31 +0300 Subject: [PATCH 335/816] AdMatic: documenting adt alias (#5714) * added simple params * update * Update admatic.md * update * update * Pixad Bid Adapter: added simple params * AdMatic Adapter: Feature update Pixad alias is included in the update. * Update admatic.md * Update pixad.md * gvl_id add * Update pixad.md * admatic && pixad pbs support true * Create monetixads.md * new alias * new alias * Update adt.md * Revert "Update adt.md" This reverts commit c274c967792bb77e7c897501b70732df5acc6290. * Revert "new alias" This reverts commit cb15f2c27b28d937986d53ebaf3efeabfd5df9d3. * Create adt.md * Update adt.md * Update adt.md * Update adt.md * Update adt.md * Update adt.md --- dev-docs/bidders/adt.md | 91 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 dev-docs/bidders/adt.md diff --git a/dev-docs/bidders/adt.md b/dev-docs/bidders/adt.md new file mode 100644 index 0000000000..55d71cbfba --- /dev/null +++ b/dev-docs/bidders/adt.md @@ -0,0 +1,91 @@ +--- +layout: bidder +title: AdTarget Teknoloji +description: Prebid AdTarget Teknoloji Bidder Adapter. +pbjs: true +pbs: true +biddercode: adt +media_types: banner,video,native +gvl_id: 779 +tcfeu_supported: true +usp_supported: true +coppa_supported: true +gpp_sids: tcfeu, tcfca, usnat, usstate_all, usp +schain_supported: true +dchain_supported: false +userIds: criteo, id5Id, sharedId, unifiedId +safeframes_ok: true +floors_supported: true +aliasCode: admatic +multiformat_supported: will-bid-on-any +sidebarType: 1 +--- + +### Description + +AdTarget Teknoloji header bidding adapter connects with AdTarget Teknoloji demand sources to fetch bids for network ID. Please reach out to your account manager or for more information. + +### Bid params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------------|----------|-------------------------------------|----------|----------| +| `networkId` | required | The network ID from AdTarget Teknoloji | `12345` | `number` | +| `host` | required | RTB Host | `adt.rtb.adtarget.biz` | `string` | + +### Test Parameters + +300x250 banner test + +```javascript +var adUnits = [{ + code: 'your-slot_1-div', + mediaTypes: { + banner: { sizes: [[300, 250]] }, + }, + bids: [{ + bidder: 'adt', + params: { + networkId: 12345, + host: 'adt.rtb.adtarget.biz' + } + }] +},{ + code: 'your-slot_2-div', + mediaTypes: { + native: { ... }, + }, + bids: [{ + bidder: 'adt', + params: { + networkId: 12345, + host: 'adt.rtb.adtarget.biz' + } + }] +},{ + code: 'your-slot_3-div', + mediaTypes: { + video: { ... }, + }, + bids: [{ + bidder: 'adt', + params: { + networkId: 12345, + host: 'adt.rtb.adtarget.biz' + } + }] +}]; +``` + +### UserSync example + +```javascript +pbjs.setConfig({ + userSync: { + iframeEnabled: true, + syncEnabled: true, + syncDelay: 1, + aliasSyncEnabled: true + } +}); +``` From 59260bde6883ff0bad1b9f934d822afc2e871d05 Mon Sep 17 00:00:00 2001 From: rimaburder-index <55195208+rimaburder-index@users.noreply.github.com> Date: Thu, 12 Dec 2024 05:26:20 -0500 Subject: [PATCH 336/816] Update ix-server.md (#5765) * Update ix-server.md added a section for Protected Audience API instructions * Update ix-server.md fixed lint issues --- dev-docs/bidders/ix-server.md | 42 ++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidders/ix-server.md b/dev-docs/bidders/ix-server.md index 2a082ddefc..9be8578f28 100644 --- a/dev-docs/bidders/ix-server.md +++ b/dev-docs/bidders/ix-server.md @@ -35,6 +35,7 @@ privacy_sandbox: paapi * [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) +* [Receive Protected Audience API demand from Index](#paapi) * [Bid request parameters](#bid-request-parameters) * [Banner](#banner) * [Video](#video) @@ -83,7 +84,6 @@ If you are hosting your own Prebid Server instance, depending on whether you are ``` * Edit the below existing entry and include your publisher ID in the `s` parameter: -{% raw %} ```javascript userSync: @@ -129,8 +129,6 @@ If you are hosting your own Prebid Server instance, depending on whether you are url: "https://ssum.casalemedia.com/usermatch?s=&gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&cb={{.RedirectURL}}" ``` -{% endraw %} - ### Publisher instructions to call Index through Prebid Server @@ -238,6 +236,44 @@ To request bids from Index: }], ``` + + +### Receive Protected Audience API demand from Index + +Publishers who want to use the Protected Audience API with Prebid Server, must first set up their inventory to be eligible for Protected Audience API in Prebid.js. Prebid Server will automatically pass through the on-device auction signals received from Prebid.js to Index. To receive Protected Audience API auction demand from Index, contact your Index Representative. + +**Before you begin:** Depending on whether you are using the Prebid Server Go or Java code base and the Prebid.js version, you must make sure that you are using the appropriate Prebid Server version: + +* **For Prebid Server Go:** If you are using a Prebid.js version that is between 7.44.0 and 8.51.0, you must be using Prebid Server version 2.1.0 or later. For a Prebid.js version that is 8.52.0 or later, you must be using Prebid Server version 3.3.0 or later. +* **For Prebid Server Java:** If you are using a Prebid.js version that is 7.44.0 or later, you must be using Prebid Server Java version 3.16.0 or later. + +1. Configure Prebid.js to send the `ae` field with a value of `1`. For more information on how to set up the Protected Audience API in Prebid.js, see the [Protected Audience API support](/dev-docs/bidders/ix.html#protected-audience-api-support) section in our Prebid.js documentation on the Prebid site. +2. Prebid Server will now automatically pass through the `ae=1` field received from Prebid.js to Index. No other specific Prebid Server configuration is required. + +**Example:** The following is an example that illustrates how to set up Prebid Server in your Prebid.js configuration: + +```javascript + pbjs.setConfig({ + s2sConfig: [{ + accountId: '1', + bidders: ['ix'], + adapter: 'prebidServer', + enabled: true, + endpoint: 'https://prebid-server.example.com/openrtb2/auction', + syncEndpoint: 'https://prebid-server.example.com/cookie_sync', + timeout: 500, + extPrebid: { + cache: { + vastxml: { returnCreative: false } + }, + targeting: { + pricegranularity: {"ranges": [{"max":40.00,"increment":1.00}]} + } + } + }] +}) +``` + ### Bid request parameters From ceaf9d2ee3ff9e7f8ffd99899cde62dbc9810b75 Mon Sep 17 00:00:00 2001 From: Tomas Roos Date: Thu, 12 Dec 2024 13:42:59 +0100 Subject: [PATCH 337/816] Typo in gppControl (#5772) --- dev-docs/modules/gppControl_usnat.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/modules/gppControl_usnat.md b/dev-docs/modules/gppControl_usnat.md index 51bbaf8694..95bfbb68f4 100644 --- a/dev-docs/modules/gppControl_usnat.md +++ b/dev-docs/modules/gppControl_usnat.md @@ -37,7 +37,7 @@ This module activates if the `gpp` object in the consent management configuratio 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 and the GPP Control - USNat module, an additional option must be added to the **gulp build** command: ```bash -gulp build --modules=consentManagementGpp,gppContol_usnat,bidAdapter1,bidAdapter2 +gulp build --modules=consentManagementGpp,gppControl_usnat,bidAdapter1,bidAdapter2 ``` You can also use the [Prebid.js Download](/download.html) page. From dd0d11368be0fb65766b0406a1c175f7024476cd Mon Sep 17 00:00:00 2001 From: Muki Seiler Date: Thu, 12 Dec 2024 14:09:35 +0100 Subject: [PATCH 338/816] Fix tab-example (#5773) --- _includes/code/mobile-sdk.html | 12 ++++++++++-- docs-examples/tab-example.md | 12 ++++++------ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/_includes/code/mobile-sdk.html b/_includes/code/mobile-sdk.html index 4aa50d54a6..ebc7ed40e6 100644 --- a/_includes/code/mobile-sdk.html +++ b/_includes/code/mobile-sdk.html @@ -9,9 +9,17 @@
    - {{ include.kotlin | markdownify }} +
    +
    +        {{ include.kotlin | xml_escape }}
    +      
    +
    - {{ include.swift | markdownify }} +
    +
    +        {{ include.swift | xml_escape }}
    +      
    +
    diff --git a/docs-examples/tab-example.md b/docs-examples/tab-example.md index 6b92f6bc4f..67bbc88e1a 100644 --- a/docs-examples/tab-example.md +++ b/docs-examples/tab-example.md @@ -10,7 +10,8 @@ The prebid documentation uses bootstrap for styling. Bootstrap offers a [tab com ## Example -{% capture iosCode %}struct Player { +{% capture iosCode %} +struct Player { var name: String var highScore: Int = 0 var history: [Int] = [] @@ -20,18 +21,17 @@ The prebid documentation uses bootstrap for styling. Bootstrap offers a [tab com } } -var player = Player("Tomas") -{% endcapture %} +var player = Player("Tomas"){% endcapture %} -{% capture androidCode %}fun main() { +{% capture androidCode %} +fun main() { val name = "stranger" // Declare your first variable println("Hi, $name!") // ...and use it! print("Current count:") for (i in 0..10) { // Loop over a range from 0 to 10 print(" $i") } -} -{% endcapture %} +}{% endcapture %} {% include code/mobile-sdk.html id="hello-world" kotlin=androidCode swift=iosCode %} From 1d33593269c3edacad0a0b18a5424636338ba0ae Mon Sep 17 00:00:00 2001 From: Denis Logachov Date: Thu, 12 Dec 2024 15:18:42 +0200 Subject: [PATCH 339/816] Adkernel: documenting Pixelpluses alias (#5737) --- dev-docs/bidders/pixelpluses.md | 36 +++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 dev-docs/bidders/pixelpluses.md diff --git a/dev-docs/bidders/pixelpluses.md b/dev-docs/bidders/pixelpluses.md new file mode 100644 index 0000000000..339a632c8f --- /dev/null +++ b/dev-docs/bidders/pixelpluses.md @@ -0,0 +1,36 @@ +--- +layout: bidder +title: Pixelpluses +description: Pixelpluses Bidder Adaptor +biddercode: pixelpluses +pbjs: true +pbs: false +media_types: banner, native, video +gvl_id: 1209 +tcfeu_supported: true +usp_supported: true +coppa_supported: true +gpp_supported: true +pbs_app_supported: true +schain_supported: true +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel +sidebarType: 1 +--- + +### Note + +The Pixelpluses bidding adapter requires setup and approval before implementation. Please reach out to for more details. + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|----------|----------|-----------------------|---------------------------|----------| +| `host` | required | Host | `'cpm.pixelpluses.com'` | `string` | +| `zoneId` | required | Zone Id | `30164` | `integer` | From 938d9151d573dbed7d3000b8d32dd7d88cd30861 Mon Sep 17 00:00:00 2001 From: Dedi <32620962+Dedis23@users.noreply.github.com> Date: Thu, 12 Dec 2024 15:19:48 +0200 Subject: [PATCH 340/816] Rise: Update bidder docs (#5735) * add native in rise docs * removed is_wrapper param --- dev-docs/bidders/rise.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dev-docs/bidders/rise.md b/dev-docs/bidders/rise.md index 2b11a8c520..cee91e6414 100644 --- a/dev-docs/bidders/rise.md +++ b/dev-docs/bidders/rise.md @@ -5,7 +5,7 @@ description: Prebid Rise Bidder Adapter multiformat_supported: will-bid-on-any pbjs: true biddercode: rise -media_types: banner, video +media_types: banner, video, native schain_supported: true coppa_supported: true pbs: true @@ -37,7 +37,6 @@ The Rise adapter requires setup and approval. Please reach out to [prebid-rise-e | `placementId` | optional | String | A unique placement identifier | "12345678" | `testMode` | optional | Boolean | This activates the test mode | false | `rtbDomain` | optional | String | Sets the seller end point | "www.test.com" -| `is_wrapper` | private | Boolean | Please don't use unless your account manager asked you to | false ### Example From 35d4fd0d8467f6794691751d12611df258fa9cac Mon Sep 17 00:00:00 2001 From: SebRobert Date: Thu, 12 Dec 2024 14:20:34 +0100 Subject: [PATCH 341/816] BeOp Adapter doc: Access storage explained (#5734) --- dev-docs/bidders/beop.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/dev-docs/bidders/beop.md b/dev-docs/bidders/beop.md index ef0799f8ac..4e82107d3d 100644 --- a/dev-docs/bidders/beop.md +++ b/dev-docs/bidders/beop.md @@ -24,4 +24,27 @@ The BeOp bidder adaptor needs an account id that you can find as a publisher, a | Name | Scope | Description | Example | Type | |---------------|----------|-------------|---------|----------| | `accountId` or `networkId` | required | Your BeOp account ID | `'5a8af500c9e77c00017e4cad'` | `string` | +| `networkPartnerId` | optional | Your own partner ID if you are a network | `'MY-WEBSITE-123'` | `string` | | `currency` | optional | Your currency | `'EUR'` (default) or `'USD'` | `string` | + +## Why BeOp Requires Storage Access in Prebid.js + +At BeOp, we prioritize transparency and respect for user privacy. Here’s why we request storage access: + +### 1. Usage of First-Party Cookies + +We use the first-party cookie beopid exclusively. This allows us to manage session and user preferences without relying on third-party cookies, ensuring compliance with privacy standards like GDPR. + +### 2. Capping Features for Publishers + +Storage access helps us enforce capping mechanisms directly on the publisher’s domain, ensuring a better user experience by limiting the frequency of ad displays. + +### 3. Enhanced User Interaction + +We provide engaging voting experiences on BeOp formats. By using storage, we enable features such as resuming a voting session where the user last left off, making the interaction seamless and user-friendly. + +### 4. Revenue Optimization in Compliance with GDPR + +Storage access helps us improve bidding performance by aligning with GDPR consents. This ensures that external bidders can leverage compliant data to drive better revenue outcomes for publishers. + +By granting storage access, publishers empower us to provide these features while respecting user privacy and enhancing the overall experience. From 9c2625fccc78c2fe9bece91858fd6e99231e5dbf Mon Sep 17 00:00:00 2001 From: Samuel Fabel Date: Thu, 12 Dec 2024 10:34:03 -0300 Subject: [PATCH 342/816] Put placementId parameter at docs (#5724) --- dev-docs/bidders/blue.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/blue.md b/dev-docs/bidders/blue.md index f7200c9154..5f5bab5674 100644 --- a/dev-docs/bidders/blue.md +++ b/dev-docs/bidders/blue.md @@ -27,3 +27,4 @@ The bidder requires setup before usage. Please get in touch with our publisher t | Name | Scope | Description | Example | Type | |---------------|----------|---------------------|---------------|----------| | `publisherId` | required | Unique publisher ID | `'ABCDEF'` | `string` | +| `placementId` | optional | Unique placement ID | `'ABCDEF'` | `string` | From 60be8ab70e40e89f4fe7e841695a36c951a0cebb Mon Sep 17 00:00:00 2001 From: dmytro-po Date: Thu, 12 Dec 2024 15:36:01 +0200 Subject: [PATCH 343/816] Intent IQ Analytics Adapter: Support domainName parameter (#5701) * update documentation * White space fixes * Apply suggestions from code review Co-authored-by: bretg * Add example and link to Universal ID configuration * Support domainName parameter --------- Co-authored-by: DimaIntentIQ Co-authored-by: DimaIntentIQ <139111483+DimaIntentIQ@users.noreply.github.com> Co-authored-by: bretg --- dev-docs/modules/userid-submodules/intentiq.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dev-docs/modules/userid-submodules/intentiq.md b/dev-docs/modules/userid-submodules/intentiq.md index 373f8171c5..9c1880b98a 100644 --- a/dev-docs/modules/userid-submodules/intentiq.md +++ b/dev-docs/modules/userid-submodules/intentiq.md @@ -45,6 +45,7 @@ Please find below list of parameters that could be used in configuring Intent IQ | params.timeoutInMillis | Optional | Number | This is the timeout in milliseconds, which defines the maximum duration before the callback is triggered. The default value is 500. | `450` | | params.browserBlackList | Optional |  String | This is the name of a browser that can be added to a blacklist. | `"chrome"` | | params.manualWinReportEnabled | Optional | Boolean | This variable determines whether the bidWon event is triggered automatically. If set to false, the event will occur automatically, and manual reporting with reportExternalWin will be disabled. If set to true, the event will not occur automatically, allowing manual reporting through reportExternalWin. The default value is false. | `true`| +| params.domainName | Optional | String | Specifies the domain of the page in which the IntentIQ object is currently running and serving the impression. This domain will be used later in the revenue reporting breakdown by domain. For example, cnn.com. It identifies the primary source of requests to the IntentIQ servers, even within nested web pages. | `"currentDomain.com"` | ### Configuration example @@ -58,7 +59,8 @@ pbjs.setConfig({ timeoutInMillis: 500, browserBlackList: "chrome", callback: (data, group) => window.pbjs.requestBids(), - manualWinReportEnabled: true + manualWinReportEnabled: true, + domainName: "currentDomain.com" }, storage: { type: "html5", From 16362b27947681b719d3f4fdb0d09b1e9ab1b313 Mon Sep 17 00:00:00 2001 From: Mikhail Malkov Date: Thu, 12 Dec 2024 16:45:26 +0300 Subject: [PATCH 344/816] PB-2782 - changed description (#5694) --- dev-docs/bidders/nextMillennium.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/nextMillennium.md b/dev-docs/bidders/nextMillennium.md index a41280704b..e851765e30 100644 --- a/dev-docs/bidders/nextMillennium.md +++ b/dev-docs/bidders/nextMillennium.md @@ -5,8 +5,8 @@ description: NextMillennium bid adapter gvl_id: dev-docs/bidders/nextMillennium.md tcfeu_supported: true usp_supported: true -coppa_supported: false -schain_supported: false +coppa_supported: true +schain_supported: true dchain_supported: false safeframes_ok: false deals_supported: false From c87ff527ee798afc3cc39bf3c62562d996e378ff Mon Sep 17 00:00:00 2001 From: dev-adverxo Date: Thu, 12 Dec 2024 14:53:15 +0100 Subject: [PATCH 345/816] New bid adapter: Adverxo (#5676) * Init adverxo adapter * Add missing docs parameter and host as optional parameter * Add docs for aliases * Fix markdown table format * Add new alias * Add new line at end of files * Set pbs and pbs_app support to false Temporarily until the pbs pull request is resolved. --------- Co-authored-by: Adverxo --- dev-docs/bidders/adport.md | 115 +++++++++++++++++++++++++++++++++++ dev-docs/bidders/adverxo.md | 115 +++++++++++++++++++++++++++++++++++ dev-docs/bidders/bidsmind.md | 115 +++++++++++++++++++++++++++++++++++ dev-docs/bidders/mobupps.md | 115 +++++++++++++++++++++++++++++++++++ 4 files changed, 460 insertions(+) create mode 100644 dev-docs/bidders/adport.md create mode 100644 dev-docs/bidders/adverxo.md create mode 100644 dev-docs/bidders/bidsmind.md create mode 100644 dev-docs/bidders/mobupps.md diff --git a/dev-docs/bidders/adport.md b/dev-docs/bidders/adport.md new file mode 100644 index 0000000000..af49d131ab --- /dev/null +++ b/dev-docs/bidders/adport.md @@ -0,0 +1,115 @@ +--- +layout: bidder +title: AdPort +description: Prebid AdPort Bidder Adapter +aliasCode: adverxo +pbjs: true +pbs: false +pbs_app_supported: false +biddercode: adport +userIds: +media_types: banner, native, video +schain_supported: true +dchain_supported: false +ortb_blocking_supported: true +floors_supported: true +multiformat_supported: will-bid-on-any +tcfeu_supported: false +dsa_supported: false +gvl_id: none +usp_supported: false +coppa_supported: false +gpp_sids: none +userId: no +safeframes_ok: false +deals_supported: true +fpd_supported: true +prebid_member: false +privacy_sandbox: no +sidebarType: 1 +--- + +### Note + +The AdPort Bidding adapter requires setup and approval before beginning. Please reach out to for +more details. + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|----------|----------|-----------------------|---------------------------|----------| +| `adUnitId` | required | Unique identifier for the ad unit in AdPort platform. | `1` | `integer` | +| `auth` | required | Authentication token provided by AdPort platform for the AdUnit. |`'61336e75e414c77c367eq5c47c2599ce80a8032b'` | `string` | + +### Setting First Party Data (FPD) + +Publishers should use the `ortb2` method of setting First Party Data. The following fields are supported: + +- ortb2.site.\* +- ortb2.app.\* +- ortb2.user.\* + +Example first party data: + +```javascript +pbjs.setConfig({ + ortb2: { + site: { + keywords: "kw1,kw2", + content: { + title: "title1", + series: "series1" + } + }, + user: { + keywords: "a,b", + gender: "M", + yob: 1984 + } + } +}); +``` + +### ORTB Blocking + +AdPort supports the next blocking parameters: + +- Blocked advertisers list (`badv`) is an array of domains as strings. +- Blocked apps list (`bapp`) is an array of apps names as strings, for mobile apps in Google Play Store, these should be + bundle or package names (e.g. com.foo.mygame). For apps in Apple App Store, these should be a numeric ID. +- Blocked categories list (`bcat`) is an array of IAB categories as strings. +- Blocked attributes list (`battr`) is an array of integers. Refer to section 5.3 of the IAB specification for a list of + attributes. + +#### Globally defined ORTB Blocking + +```javascript +pbjs.setConfig({ + ortb2: { + badv: ["domain1.com", "domain2.com"], + bapp: ["com.foo.mygame", "284708449"], + bcat: ["IAB23-1", "IAB23-5", "IAB25-3", "IAB25-2"] + } +}); +``` + +#### ORTB Blocking specific only to the AdPort bidder + +```javascript +pbjs.setBidderConfig({ + bidders: ['adport'], // Or alias + config: { + ortb2: { + badv: ["domain1.com", "domain2.com"], + bapp: ["com.foo.mygame"], + bcat: ["IAB23-1", "IAB23-5", "IAB25-3", "IAB25-2"] + } + } +}); +``` + +#### Media Type defined ORTB Blocking + +Additionally `battr` ORTB blocking param may be set on media types to specify blocked creative +attributes. Refer to section 5.3 of the IAB specification for a list of attributes. diff --git a/dev-docs/bidders/adverxo.md b/dev-docs/bidders/adverxo.md new file mode 100644 index 0000000000..173531c6df --- /dev/null +++ b/dev-docs/bidders/adverxo.md @@ -0,0 +1,115 @@ +--- +layout: bidder +title: Adverxo +description: Prebid Adverxo Bidder Adapter +pbjs: true +pbs: true +pbs_app_supported: true +biddercode: adverxo +userIds: +media_types: banner, native, video +schain_supported: true +dchain_supported: false +ortb_blocking_supported: true +floors_supported: true +multiformat_supported: will-bid-on-any +tcfeu_supported: false +dsa_supported: false +gvl_id: none +usp_supported: false +coppa_supported: false +gpp_sids: none +userId: no +safeframes_ok: false +deals_supported: true +fpd_supported: true +prebid_member: false +privacy_sandbox: no +sidebarType: 1 +--- + +### Note + +The Adverxo Bidding adapter requires setup and approval before beginning. Please reach out to for +more details. + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|----------|----------|-----------------------|---------------------------|----------| +| `host` | optional | Ad network host | `'js.pbsadverxo.com'` | `string` | +| `adUnitId` | required | Unique identifier for the ad unit in Adverxo platform. | `1` | `integer` | +| `auth` | required | Authentication token provided by Adverxo platform for the AdUnit. | `'61336e75e414c77c367eq5c47c2599ce80a8032b'` | `string` | + +### Setting First Party Data (FPD) + +Publishers should use the `ortb2` method of setting First Party Data. The following fields are supported: + +- ortb2.site.\* +- ortb2.app.\* +- ortb2.user.\* + +Example first party data: + +```javascript +pbjs.setConfig({ + ortb2: { + site: { + keywords: "kw1,kw2", + content: { + title: "title1", + series: "series1" + } + }, + user: { + keywords: "a,b", + gender: "M", + yob: 1984 + } + } +}); +``` + +### ORTB Blocking + +Adverxo supports the next blocking parameters: + +- Blocked advertisers list (`badv`) is an array of domains as strings. +- Blocked apps list (`bapp`) is an array of apps names as strings, for mobile apps in Google Play Store, these should be + bundle or package names (e.g. com.foo.mygame). For apps in Apple App Store, these should be a numeric ID. +- Blocked categories list (`bcat`) is an array of IAB categories as strings. +- Blocked attributes list (`battr`) is an array of integers. Refer to section 5.3 of the IAB specification for a list of + attributes. + +#### Globally defined ORTB Blocking + +```javascript +pbjs.setConfig({ + ortb2: { + badv: ["domain1.com", "domain2.com"], + bapp: ["com.foo.mygame", "284708449"], + bcat: ["IAB23-1", "IAB23-5", "IAB25-3", "IAB25-2"] + } +}); +``` + +#### ORTB Blocking specific only to the Adverxo bidder + +```javascript +pbjs.setBidderConfig({ + bidders: ['adverxo'], // Or alias + config: { + ortb2: { + badv: ["domain1.com", "domain2.com"], + bapp: ["com.foo.mygame"], + bcat: ["IAB23-1", "IAB23-5", "IAB25-3", "IAB25-2"] + } + } +}); +``` + +#### Media Type defined ORTB Blocking + +Additionally `battr` ORTB blocking param may be set on media types to specify blocked creative +attributes. Refer to section 5.3 of the IAB specification for a list of attributes. diff --git a/dev-docs/bidders/bidsmind.md b/dev-docs/bidders/bidsmind.md new file mode 100644 index 0000000000..c230fa19e7 --- /dev/null +++ b/dev-docs/bidders/bidsmind.md @@ -0,0 +1,115 @@ +--- +layout: bidder +title: Bidsmind +description: Prebid Bidsmind Bidder Adapter +aliasCode: adverxo +pbjs: true +pbs: false +pbs_app_supported: false +biddercode: bidsmind +userIds: +media_types: banner, native, video +schain_supported: true +dchain_supported: false +ortb_blocking_supported: true +floors_supported: true +multiformat_supported: will-bid-on-any +tcfeu_supported: false +dsa_supported: false +gvl_id: none +usp_supported: false +coppa_supported: false +gpp_sids: none +userId: no +safeframes_ok: false +deals_supported: true +fpd_supported: true +prebid_member: false +privacy_sandbox: no +sidebarType: 1 +--- + +### Note + +The Bidsmind Bidding adapter requires setup and approval before beginning. Please reach out to for +more details. + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|----------|----------|-----------------------|---------------------------|----------| +| `adUnitId` | required | Unique identifier for the ad unit in Bidsmind platform. | `1` | `integer` | +| `auth` | required | Authentication token provided by Bidsmind platform for the AdUnit. | `'61336e75e414c77c367eq5c47c2599ce80a8032b'` | `string` | + +### Setting First Party Data (FPD) + +Publishers should use the `ortb2` method of setting First Party Data. The following fields are supported: + +- ortb2.site.\* +- ortb2.app.\* +- ortb2.user.\* + +Example first party data: + +```javascript +pbjs.setConfig({ + ortb2: { + site: { + keywords: "kw1,kw2", + content: { + title: "title1", + series: "series1" + } + }, + user: { + keywords: "a,b", + gender: "M", + yob: 1984 + } + } +}); +``` + +### ORTB Blocking + +Bidsmind supports the next blocking parameters: + +- Blocked advertisers list (`badv`) is an array of domains as strings. +- Blocked apps list (`bapp`) is an array of apps names as strings, for mobile apps in Google Play Store, these should be + bundle or package names (e.g. com.foo.mygame). For apps in Apple App Store, these should be a numeric ID. +- Blocked categories list (`bcat`) is an array of IAB categories as strings. +- Blocked attributes list (`battr`) is an array of integers. Refer to section 5.3 of the IAB specification for a list of + attributes. + +#### Globally defined ORTB Blocking + +```javascript +pbjs.setConfig({ + ortb2: { + badv: ["domain1.com", "domain2.com"], + bapp: ["com.foo.mygame", "284708449"], + bcat: ["IAB23-1", "IAB23-5", "IAB25-3", "IAB25-2"] + } +}); +``` + +#### ORTB Blocking specific only to the Bidsmind bidder + +```javascript +pbjs.setBidderConfig({ + bidders: ['bidsmind'], // Or alias + config: { + ortb2: { + badv: ["domain1.com", "domain2.com"], + bapp: ["com.foo.mygame"], + bcat: ["IAB23-1", "IAB23-5", "IAB25-3", "IAB25-2"] + } + } +}); +``` + +#### Media Type defined ORTB Blocking + +Additionally `battr` ORTB blocking param may be set on media types to specify blocked creative +attributes. Refer to section 5.3 of the IAB specification for a list of attributes. diff --git a/dev-docs/bidders/mobupps.md b/dev-docs/bidders/mobupps.md new file mode 100644 index 0000000000..c7f114a744 --- /dev/null +++ b/dev-docs/bidders/mobupps.md @@ -0,0 +1,115 @@ +--- +layout: bidder +title: Mobupps +description: Prebid Mobupps Bidder Adapter +aliasCode: adverxo +pbjs: true +pbs: false +pbs_app_supported: false +biddercode: mobupps +userIds: +media_types: banner, native, video +schain_supported: true +dchain_supported: false +ortb_blocking_supported: true +floors_supported: true +multiformat_supported: will-bid-on-any +tcfeu_supported: false +dsa_supported: false +gvl_id: none +usp_supported: false +coppa_supported: false +gpp_sids: none +userId: no +safeframes_ok: false +deals_supported: true +fpd_supported: true +prebid_member: false +privacy_sandbox: no +sidebarType: 1 +--- + +### Note + +The Mobupps Bidding adapter requires setup and approval before beginning. Please reach out to for +more details. + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|----------|----------|-----------------------|---------------------------|----------| +| `adUnitId` | required | Unique identifier for the ad unit in Mobupps platform. | `1` | `integer` | +| `auth` | required | Authentication token provided by Mobupps platform for the AdUnit. | `'61336e75e414c77c367eq5c47c2599ce80a8032b'` | `string` | + +### Setting First Party Data (FPD) + +Publishers should use the `ortb2` method of setting First Party Data. The following fields are supported: + +- ortb2.site.\* +- ortb2.app.\* +- ortb2.user.\* + +Example first party data: + +```javascript +pbjs.setConfig({ + ortb2: { + site: { + keywords: "kw1,kw2", + content: { + title: "title1", + series: "series1" + } + }, + user: { + keywords: "a,b", + gender: "M", + yob: 1984 + } + } +}); +``` + +### ORTB Blocking + +Mobupps supports the next blocking parameters: + +- Blocked advertisers list (`badv`) is an array of domains as strings. +- Blocked apps list (`bapp`) is an array of apps names as strings, for mobile apps in Google Play Store, these should be + bundle or package names (e.g. com.foo.mygame). For apps in Apple App Store, these should be a numeric ID. +- Blocked categories list (`bcat`) is an array of IAB categories as strings. +- Blocked attributes list (`battr`) is an array of integers. Refer to section 5.3 of the IAB specification for a list of + attributes. + +#### Globally defined ORTB Blocking + +```javascript +pbjs.setConfig({ + ortb2: { + badv: ["domain1.com", "domain2.com"], + bapp: ["com.foo.mygame", "284708449"], + bcat: ["IAB23-1", "IAB23-5", "IAB25-3", "IAB25-2"] + } +}); +``` + +#### ORTB Blocking specific only to the Mobupps bidder + +```javascript +pbjs.setBidderConfig({ + bidders: ['mobupps'], // Or alias + config: { + ortb2: { + badv: ["domain1.com", "domain2.com"], + bapp: ["com.foo.mygame"], + bcat: ["IAB23-1", "IAB23-5", "IAB25-3", "IAB25-2"] + } + } +}); +``` + +#### Media Type defined ORTB Blocking + +Additionally `battr` ORTB blocking param may be set on media types to specify blocked creative +attributes. Refer to section 5.3 of the IAB specification for a list of attributes. From 3c27a30dc815d9eb251fe8c6558a5642f18cf99b Mon Sep 17 00:00:00 2001 From: johnwier <49074029+johnwier@users.noreply.github.com> Date: Thu, 12 Dec 2024 05:53:55 -0800 Subject: [PATCH 346/816] Epsilon: enable audio (#5663) * add audio support * code review changes --------- Co-authored-by: johwier --- dev-docs/bidders/epsilon.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidders/epsilon.md b/dev-docs/bidders/epsilon.md index 1c6b3f4645..1970221e85 100644 --- a/dev-docs/bidders/epsilon.md +++ b/dev-docs/bidders/epsilon.md @@ -5,13 +5,14 @@ description: Epsilon Prebid Bidder Adaptor (formerly Conversant) pbjs: true pbs: true biddercode: conversant -media_types: video +media_types: banner, video, audio tcfeu_supported: true userIds: criteo, id5Id, identityLink, liveIntentId, parrableId, pubCommonId, unifiedId, publinkId prebid_member: true schain_supported: true gvl_id: 24 sidebarType: 1 +multiformat_supported: will-not-bid --- @@ -84,7 +85,7 @@ The following values are defined in the [ORTB 2.5 spec](https://www.iab.com/wp-c Publishers should use the `ortb2` method of setting for setting First Party Data. Example first party data configuration that is available to all adUnits -``` +```javascript pbjs.setConfig({ debug: true, cache: { @@ -105,7 +106,7 @@ pbjs.setConfig({ Example AdUnit specific data using the `ortb2Imp` object -``` +```javascript var videoAdUnit = { code: 'video1', mediaTypes: { From 878bf6a6c4c88f98d3fcf5cd4f43e01dfca948c0 Mon Sep 17 00:00:00 2001 From: Denis Logachov Date: Thu, 12 Dec 2024 15:58:25 +0200 Subject: [PATCH 347/816] Adkernel: documenting RxNetwork alias (#5635) * Create rxnetwork.md * Update rxnetwork.md * Update rxnetwork.md --- dev-docs/bidders/rxnetwork.md | 36 +++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 dev-docs/bidders/rxnetwork.md diff --git a/dev-docs/bidders/rxnetwork.md b/dev-docs/bidders/rxnetwork.md new file mode 100644 index 0000000000..d9d05fcd76 --- /dev/null +++ b/dev-docs/bidders/rxnetwork.md @@ -0,0 +1,36 @@ +--- +layout: bidder +title: RxNetwork +description: Prebid RxNetwork Bidder Adaptor +pbjs: true +pbs: false +biddercode: rxnetwork +aliasCode: adkernel +media_types: banner, native, video +tcfeu_supported: true +usp_supported: true +coppa_supported: true +gpp_supported: true +pbs_app_supported: false +gvl_id: 14 (adkernel) +schain_supported: true +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +sidebarType: 1 +--- + +### Note + +The RxNetwork Bidding adaptor requires setup and approval before beginning. Please reach out to for more details + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|----------|----------|-----------------------|---------------------------|----------| +| `host` | required | Ad network's RTB host | `'cpm.rxnetwork.net'` | `string` | +| `zoneId` | required | RTB zone id | `30164` | `integer` | From 05261c5309bc45a3975ded276afdbbf41b14461e Mon Sep 17 00:00:00 2001 From: Patrick Szeleczki Date: Thu, 12 Dec 2024 15:59:53 +0200 Subject: [PATCH 348/816] Update Connatix adapter (#5595) * md * set prebid server field pbds to true --------- Co-authored-by: alexandru.calauz Co-authored-by: Alex Damsa --- dev-docs/bidders/connatix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/connatix.md b/dev-docs/bidders/connatix.md index 5d313e180b..f72c364cb0 100644 --- a/dev-docs/bidders/connatix.md +++ b/dev-docs/bidders/connatix.md @@ -17,7 +17,7 @@ deals_supported: true floors_supported: true fpd_supported: false pbjs: true -pbs: false +pbs: true prebid_member: false multiformat_supported: will-bid-on-one ortb_blocking_supported: true From 827c8ae9f9924674a7aa4382f22863b2abf0a080 Mon Sep 17 00:00:00 2001 From: Bill Coloe Date: Thu, 12 Dec 2024 08:01:48 -0600 Subject: [PATCH 349/816] Nativo bid adapter documentation updates (#5552) * Added nativo markup documentation to dev-docs/bidders * Added IAB Global Vendor List ID number. * Adjusted placementId Type to be integer * Changed pbjs value to true * Added optional url parameter * Updated placementId parameter to be optional * Added userIds to nativo.md * Reflecting Prebid Server Adapter metadata * Update nativo bidder docs * Add multiformat_supported field to nativo readme --------- Co-authored-by: Josh Co-authored-by: jsfledd Co-authored-by: Joshua Fledderjohn --- dev-docs/bidders/nativo.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dev-docs/bidders/nativo.md b/dev-docs/bidders/nativo.md index c330ead57a..f3bf31ecfa 100644 --- a/dev-docs/bidders/nativo.md +++ b/dev-docs/bidders/nativo.md @@ -4,12 +4,16 @@ title: Nativo description: Prebid Nativo Bidder Adapter pbjs: true pbs: true +media_types: banner, native, video +multiformat_supported: will-bid-on-one +floors_supported: true gvl_id: 263 tcfeu_supported: true usp_supported: true userIds: all biddercode: nativo sidebarType: 1 +privacy_sandbox: topics --- ### Note From b850f6b57c26d99a59be479efd097624b2a73a54 Mon Sep 17 00:00:00 2001 From: Muki Seiler Date: Thu, 12 Dec 2024 15:03:58 +0100 Subject: [PATCH 350/816] Update pull_request_template.md (#5774) --- .github/pull_request_template.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 62842de840..a395386038 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -4,6 +4,8 @@ Please give a short description and check the matching checkboxes to help us rev Please make the PR writeable. This allows us to fix typos, grammar and linting errors ourselves, which makes merging and reviewing a lot faster for everybody. + +⚠️ The documentation is merged after the related code changes are merged and release ⚠️ --> ## 🏷 Type of documentation From d3e71908e270e7e633a43005879014edbc772303 Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 13 Dec 2024 15:58:53 -0500 Subject: [PATCH 351/816] PBS auction endpoint typo (#5777) --- 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 188f4b16a2..b885c64890 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -1079,7 +1079,7 @@ client can declare a given adunit as eligible for rewards by declaring `imp.ext. The request can contain the global `createtids` flag to control the `transmitTid` [Activity Control](/prebid-server/features/pbs-activitycontrols.html). ```text -ext.request.createtids: false +ext.prebid.createtids: false ``` If the value is `false`, the `transmitTid` activity is overridden to "denied", which means bid adapters will not get unique transaction IDs. If not specified, then the value of the transmitTid activity for the account is used. The overall default value it `true`, which translates to "allow" the generation of TIDs. From 1a3f650fa5fb4ac882b06abd8c2cfe79f9b206ec Mon Sep 17 00:00:00 2001 From: bretg Date: Mon, 16 Dec 2024 09:31:25 -0500 Subject: [PATCH 352/816] Update pbs-endpoint-auction.md (#5779) changed imp.ext to imp[].ext --- .../openrtb2/pbs-endpoint-auction.md | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md index b885c64890..c6d3d950f3 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -117,7 +117,7 @@ This is a corresponding sample response to a sample bid request: Prebid Server's support for Fledge is a passthrough: -1. If the request contains `imp.ext.ae: 1` +1. If the request contains `imp[].ext.ae: 1` 2. Bid adapters may respond with 'auction config' that's placed in `ext.prebid.fledge.auctionconfigs[]`. The auction config must then be used by the client. See the Prebid.js [PAAPI for GPT](/dev-docs/modules/paapiForGpt.html) module for more information. @@ -140,7 +140,7 @@ Prebid Server accepts all OpenRTB 2.x fields and passes them in the request to a | regs.gdpr | 2.6 | Bidders supporting 2.5 only: downgraded to regs.ext.gdpr | | regs.us_privacy | 2.6 | Bidders supporting 2.5 only: downgraded to regs.ext.us_privacy | | user.consent | 2.6 | Bidders supporting 2.5 only: downgraded to user.ext.consent | -| imp.rwdd | 2.6 | Bidders supporting 2.5 only: downgraded to imp.ext.prebid.is_rewarded_inventory | +| imp.rwdd | 2.6 | Bidders supporting 2.5 only: downgraded to imp[].ext.prebid.is_rewarded_inventory | | user.eids | 2.6 | Bidders supporting 2.5 only: downgraded to user.ext.eids | | source.schain | 2.6 | Bidders supporting 2.5 only: downgraded to source.ext.schain | | wlangb, {content, device}.langb, cattax, {site, app, publisher, content, producer}.cattax, ssai, {app, site}.content.{network, channel}, {app, content, site, user}.kwarray, device.sua | 2.6 | Bidders supporting 2.5 only: these fields are removed | @@ -771,7 +771,7 @@ For example, if the Request defines an alias like this: } ``` -then any `imp.ext.appnexus` params will actually go to the **rubicon** adapter. +then any `imp[].ext.appnexus` params will actually go to the **rubicon** adapter. It will become impossible to fetch bids from AppNexus within that Request. ##### Bidder Alias GVL IDs @@ -1072,7 +1072,7 @@ ext.prebid.data.eidpermissions is an array of objects that can contain these att To be deprecated for `request.imp[].rwdd` introduced in OpenRTB 2.6. Rewarded video is a way to incentivize users to watch ads by giving them 'points' for viewing an ad. A Prebid Server -client can declare a given adunit as eligible for rewards by declaring `imp.ext.prebid.is_rewarded_inventory:1`. +client can declare a given adunit as eligible for rewards by declaring `imp[].ext.prebid.is_rewarded_inventory:1`. ##### Create Transaction ID @@ -1119,7 +1119,7 @@ Provides a way to override multiple bidder responses for this impression, retrie When a storedauctionresponse ID is specified: -- the rest of the imp.ext.prebid block is irrelevant and ignored +- the rest of the imp[].ext.prebid block is irrelevant and ignored - nothing is sent to any bidder adapter for that imp - the response retrieved is assumed to be the entire contents of the seatbid object corresponding to that impression. @@ -1227,7 +1227,7 @@ Provides a way to override multiple bidder responses for this impression, with t When storedauctionresponse JSON is specified: -- the rest of the imp.ext.prebid block is irrelevant and ignored +- the rest of the imp[].ext.prebid block is irrelevant and ignored - nothing is sent to any bidder adapter for that imp - the JSON in the request is assumed to be the entire contents of the seatbid object corresponding to that impression. @@ -1302,7 +1302,7 @@ Provides a way to override the entire bid response, with the contents supplied o When storedauctionresponse JSON is specified at the global level: -- all imp.ext.prebid.storedauctionresponse blocks are irrelevant and ignored +- all imp[].ext.prebid.storedauctionresponse blocks are irrelevant and ignored - nothing is sent to any bidder adapter - the JSON in the request is assumed to be the entire contents of the seatbid response @@ -1362,9 +1362,9 @@ Note: the `##PBSIMPID##` macro is only supported in PBS-Java. Please use `"repla In contrast to the stored**auction**responses above, using a stored**bid**response lets real auctions take place while the actual bidder response is overridden in such a way that it still exercises adapter code. -PBS removes imp.ext.prebid.bidder parameters for those +PBS removes imp[].ext.prebid.bidder parameters for those bidders specified in storedbidresponse but if there's a bidder present -in imp.ext.prebid.bidder that's doesn't have a storedbidresponse specified, +in imp[].ext.prebid.bidder that's doesn't have a storedbidresponse specified, the adapter will be called as usual. For example, this request: @@ -1458,7 +1458,7 @@ Prebid defines several types of First Party Data (FPD): 1. Cross-impression contextual information. e.g. the content category of the page. This data goes in the `site.ext.data` object or the `app.ext.data` object. 1. User-level information. e.g. whether the user is a registered user. This data goes in `user.ext.data`. -1. Impression-level information. e.g. the Global Placement ID. This data goes in the `imp.ext.data` object. +1. Impression-level information. e.g. the Global Placement ID. This data goes in the `imp[].ext.data` object. 1. Seller-Defined Audience (SDA) contextual data. This goes in `site.data[]` or `app.data[]` in accordance with the [IAB segment taxonomy conventions](https://github.com/InteractiveAdvertisingBureau/openrtb/blob/main/extensions/community_extensions/segtax.md). 1. SDA user data goes in `user.data[]` with the same [conventions](https://github.com/InteractiveAdvertisingBureau/openrtb/blob/main/extensions/community_extensions/segtax.md) as the contextual data. @@ -1566,10 +1566,10 @@ When Prebid Server sees `imp[].ext.prebid.imp.BIDDER`, the behavior is to: 1. When passing this imp to that bidder, merge the contents of BIDDER into the imp 1. Remove the imp[].ext.prebid.imp object 1. Leave any imp[].ext.prebid.storedrequest object -1. The imp.ext.prebid.imp.BIDDER object name is case insensitive and supports aliases -1. If imp.ext.prebid.imp.BIDDER does not resolve to an actual bidder or alias in a case-insensitive way, it is ignored with a warning when in debug mode. -1. No validation is done on imp.ext.prebid.imp.BIDDER.ext except that imp.ext.prebid.imp.BIDDER.ext.prebid.BIDDER is removed. -1. The contents of imp.ext.prebid.imp.BIDDER takes precedence in the merge if the field already exists in the request. +1. The imp[].ext.prebid.imp.BIDDER object name is case insensitive and supports aliases +1. If imp[].ext.prebid.imp.BIDDER does not resolve to an actual bidder or alias in a case-insensitive way, it is ignored with a warning when in debug mode. +1. No validation is done on imp[].ext.prebid.imp.BIDDER.ext except that imp[].ext.prebid.imp.BIDDER.ext.prebid.BIDDER is removed. +1. The contents of imp[].ext.prebid.imp.BIDDER takes precedence in the merge if the field already exists in the request. 1. The resulting imp object must be valid OpenRTB per the system schema. Here's an example showing a scenario showing a storedrequest-based scenario: @@ -2133,7 +2133,9 @@ The Prebid SDK version comes from: | imp[].ext.prebid.storedrequest.id | Look up the defined stored request and merge the DB contents with this imp, see [stored requests](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#stored-requests). | object | no (yes with [issue 2292](https://github.com/prebid/prebid-server/issues/2292) | | imp[].ext.prebid.is_rewarded_inventory | (deprecated) Passed through to bid adapters, see [rewarded video](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#rewarded-video). (use imp.rwdd in ORTB 2.6) | integer | yes | | imp[].ext.prebid.passthrough | Copied to the response in seatbid.bid.ext.prebid.passthrough. Allows an application to pass a value through to the response, see [request passthrough](#request-passthrough). | object | no | -| imp.ext.prebid.adunitcode | Prebid.js adunit code | string | yes | +| imp[].ext.prebid.adunitcode | Prebid.js adunit code | string | yes | +| imp[].ext.igs.ae | If 1, signals bid adapters that Protected Audience config is accepted on the response. Note: 'ae' stands for 'auction environment'. | integer | yes | +| imp[].ext.ae | If 1, signals bid adapters that Fledge auction config is accepted on the response. Note: this parameter has been replaced with imp[].ext.igs.ae | integer | yes | | device.ext.prebid.interstitial | PBS-core will adjust the sizes on a request for interstitials,see [interstitial support](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#interstitial-support). | object | yes | | user.ext.prebid.buyeruids | An alternate to [/cookie_sync](/prebid-server/endpoints/pbs-endpoint-cookieSync.html), the request can supply bidder ID values, see [buyer uid](#buyer-uid). | object | no | | ext.prebid.adservertargeting | advanced targeting value rules, see [custom targeting](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#custom-targeting). | object | no | @@ -2164,7 +2166,6 @@ The Prebid SDK version comes from: | 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 | | ext.prebid.analytics.options.enableclientdetails | Requests that [aTags](/prebid-server/developers/module-atags.html) be sent to the client-side for analytics. | boolean | 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 | | ext.prebid.biddercontrols.BIDDERCODE.prefmtype | Override the mediatype sent to the named bidder if they don't support multiformat. | string | no | From c2a5b31229a3d696340c2d8275f3598d70928afa Mon Sep 17 00:00:00 2001 From: Anton Babak <76536883+AntoxaAntoxic@users.noreply.github.com> Date: Mon, 16 Dec 2024 18:36:33 +0100 Subject: [PATCH 353/816] Module Configuration Documentation (#5771) * Module Configuration Documentation * Fix style * Greenbids Analytics Tags * wordsmithing * wordsmithing * lint --------- Co-authored-by: bretg --- prebid-server/developers/add-a-module-java.md | 12 +++++ .../pbs-modules/greenbids-real-time-data.md | 47 +++++++++++++------ prebid-server/pbs-modules/index.md | 8 ++-- 3 files changed, 49 insertions(+), 18 deletions(-) diff --git a/prebid-server/developers/add-a-module-java.md b/prebid-server/developers/add-a-module-java.md index 72b43f3b14..cdb00f8815 100644 --- a/prebid-server/developers/add-a-module-java.md +++ b/prebid-server/developers/add-a-module-java.md @@ -93,6 +93,18 @@ The structure of your module source code inside the modules directory must have +- README.md <- documentation ``` +## Module Configuration +There are several places to configure a module: + +- **Host/Bean config** is stored in one of the YAML files (generally application.yaml), primarily used for enabling the module at the server level with `hooks..enabled`. It should only contain static config which applies to initial startup independent from any account. Most modules have no host-level config at all, apart from enabled flag. +- **Default account config** is stored in a YAML file, but only used when account config is available (i.e. it's not seen at the entrypoint stage). It is used to define defaults for all accounts. +- **Account/Runtime config** is stored in the database, YAML file, or whatever other account backend used. It is used to define individual account configuration. + +Important Notes: + +- Host config will be provided to module once on application start. +- Account config will be provided to module on each request. + ## Module Code The quick start is to take a look in two places: diff --git a/prebid-server/pbs-modules/greenbids-real-time-data.md b/prebid-server/pbs-modules/greenbids-real-time-data.md index 5c6a25c4fa..ae8811da4a 100644 --- a/prebid-server/pbs-modules/greenbids-real-time-data.md +++ b/prebid-server/pbs-modules/greenbids-real-time-data.md @@ -145,22 +145,39 @@ per bid requests and is not filtered by the RTD module. Here's an example analytics tag that might be produced for use in an analytics adapter: ```json -[{ - "pub_banniere_haute": { - "greenbids": { - "fingerprint": "ad63524e-b13f-4359-a975-dba9b5dc08f4", - "keptInAuction": { - "improvedigital": false, - "appnexus": true, - "pubmatic": false, - "rubicon": true, - "teads": false - }, - "isExploration": false - }, - "tid": "2c445309-06b2-47b2-a724-4aeef15faeb8" +{ + "activities": [ + { + "name": "greenbids-filter", + "status": "success", + "results": [ + { + "status": "success", + "values": { + "pub_banniere_haute": { + "greenbids": { + "fingerprint": "ad63524e-b13f-4359-a975-dba9b5dc08f4", + "keptInAuction": { + "improvedigital": false, + "appnexus": true, + "pubmatic": false, + "rubicon": true, + "teads": false + }, + "isExploration": false + }, + "tid": "2c445309-06b2-47b2-a724-4aeef15faeb8" + } + }, + "appliedTo": { + "bidders": "bidderA", + "impIds": "impId1" + } + } + ] } -}] + ] +} ``` ## Maintainer contacts diff --git a/prebid-server/pbs-modules/index.md b/prebid-server/pbs-modules/index.md index c07d1de507..bae04a3aa3 100644 --- a/prebid-server/pbs-modules/index.md +++ b/prebid-server/pbs-modules/index.md @@ -132,9 +132,11 @@ hooks: } ``` -{: .alert.alert-info : -Execution plans can be placed in account configuration, but depending on how modules are enabled in your environment, it can be inconvenient to provide instructions to place the highly technical execution plan into the account config. Some organizations have -chosen to keep all execution plans in host-level config, then enabling the `require-config-to-invoke` option as described in the next section. +{: .alert.alert-info :} +Execution plans may be placed in account configuration, but depending on how modules are enabled in your environment, it can be inconvenient to provide instructions to place the highly technical execution plan into the account config. Some organizations have chosen to keep all execution plans in host-level config, then enabling the `require-config-to-invoke` option as described in the next section. + +{: .alert.alert-warning :} +Note that if there is more than one execution plan (e.g. one the host level and one the account level) all of them will be triggered and the module invoked processed several times. ### 3. Supply the module with configuration From 74145885201ed0afeb54b40bc3f6c79b2a62824d Mon Sep 17 00:00:00 2001 From: anand-nexverse Date: Wed, 18 Dec 2024 19:46:23 +0530 Subject: [PATCH 354/816] Added docs for Nexverse bidder adapter (#5640) * Added docs for Nexverse bidder adapter * Updated Nexverse adapter documentation * Updated Nexverse adapter documentation with latest feedback * Updated Nexverse adapter documentation with full metadata and configuration * Updated Nexverse adapter metadata: removed aliasCode, set tcfeu_supported to false, and changed pbs to false * Updated header levels in Nexverse adapter docs as per review * changed bid params keys into camelCase --------- Co-authored-by: yogeshverse --- dev-docs/bidders/nexverse.md | 80 ++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 dev-docs/bidders/nexverse.md diff --git a/dev-docs/bidders/nexverse.md b/dev-docs/bidders/nexverse.md new file mode 100644 index 0000000000..b652987e37 --- /dev/null +++ b/dev-docs/bidders/nexverse.md @@ -0,0 +1,80 @@ +--- +layout: bidder +title: Nexverse +description: Prebid Nexverse Bidder Adapter +biddercode: nexverse +tcfeu_supported: false +dsa_supported: true +gvl_id: none +usp_supported: true +coppa_supported: true +schain_supported: true +dchain_supported: false +userId: all +media_types: banner, video, native +safeframes_ok: true +deals_supported: true +floors_supported: true +fpd_supported: true +pbjs: true +pbs: false +prebid_member: false +multiformat_supported: will-bid-on-one +ortb_blocking_supported: false +privacy_sandbox: no +sidebarType: 1 +--- + + +### Nexverse Adapter + +The Nexverse adapter requires some initial setup. For assistance or setup instructions, please contact us at [support@nexverse.ai](mailto:support@nexverse.ai). + +### Supported Media Types + +The Nexverse adapter supports the following media types: + +- Banner +- Video +- Native + +### Configuration + +To configure the Nexverse adapter, you will need the following parameters: + +| Name | Scope | Description | Example | Type | +|--------|----------|--------------------------|------------|--------| +| uid | required | Publisher's unique ID | "12345" | string | +| pubId | required | Publisher ID | "54321" | string | +| pubEpid | optional | Publisher's unique EPID | "epid123" | string | + +### Test Parameters + +You can test the Nexverse adapter with the following test parameters: + +```javascript +var adUnits = [ + { + code: 'div-ad-1', + mediaTypes: { + banner: { + sizes: [[300, 250], [320, 50]], + }, + }, + bids: [ + { + bidder: 'nexverse', + params: { + uid: '12345', + pubId: '54321', + pubEpid: 'epid123', + }, + }, + ], + }, +]; +``` + +### GDPR, CCPA, COPPA Support + +Nexverse complies with GDPR, CCPA, and COPPA regulations. If you have further questions regarding compliance, feel free to reach out to us. From b1306ae99c2c3aca3e5fbd66c95285d3c06d02d7 Mon Sep 17 00:00:00 2001 From: "pratik.ta" <143182729+Pratik3307@users.noreply.github.com> Date: Thu, 19 Dec 2024 19:01:37 +0530 Subject: [PATCH 355/816] feat: auctionsCounter at adUnit level (#5768) --- dev-docs/bidder-adaptor.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dev-docs/bidder-adaptor.md b/dev-docs/bidder-adaptor.md index 21312cabda..ce7eccb1ed 100644 --- a/dev-docs/bidder-adaptor.md +++ b/dev-docs/bidder-adaptor.md @@ -284,6 +284,7 @@ Here is a sample array entry for `validBidRequests[]`: bidderRequestId: "15246a574e859f", bidRequestsCount: 1, bidderRequestsCount: 1, + auctionsCount: 1, bidderWinsCount: 0, userId: {...}, userIdAsEid: {...}, @@ -304,6 +305,7 @@ Other notes: * **Transaction ID** (see [note](#tid-warning)) is unique for each ad unit within a call to `requestBids()`, but same across bidders. This is the ID that enables DSPs to recognize the same impression coming in from different supply sources. * **Bid Request Count** is the number of times `requestBids()` has been called for this ad unit. * **Bidder Request Count** is the number of times `requestBids()` has been called for this ad unit and bidder. +* **Auctions Count** is the number of times `requestBids()` has been called for this ad unit excluding the duplicates generated by twin adUnits. * **userId** is where bidders can look for IDs offered by the various [User ID modules](/dev-docs/modules/userId.html#prebidjs-adapters). * **userIdAsEid** is the EID-formatted version of `userId`. * **ortb2** a copy of `bidderRequest.ortb2` (see below), provided here for convenience. From d9b3d7865f8ad9fcf7ca0aa785034c616c3c4c65 Mon Sep 17 00:00:00 2001 From: Klaus Silveira Date: Thu, 19 Dec 2024 08:36:09 -0500 Subject: [PATCH 356/816] Added filename for freedomadnetwork.md (#5783) --- dev-docs/bidders/freedomadnetwork.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/freedomadnetwork.md b/dev-docs/bidders/freedomadnetwork.md index 8ff942e4fb..7184bb0476 100644 --- a/dev-docs/bidders/freedomadnetwork.md +++ b/dev-docs/bidders/freedomadnetwork.md @@ -3,6 +3,7 @@ layout: bidder title: Freedom Ad Network description: Freedom Ad Network Bidder Adapter biddercode: freedomadnetwork +filename: fanAdapter gvl_id: none coppa_supported: true media_types: banner, native From c1ca2507796cae6422a78245d9fde4783462feaf Mon Sep 17 00:00:00 2001 From: rimaburder-index <55195208+rimaburder-index@users.noreply.github.com> Date: Thu, 19 Dec 2024 08:36:42 -0500 Subject: [PATCH 357/816] Update ix-server.md (#5782) updated version number required for protected audience API --- dev-docs/bidders/ix-server.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/ix-server.md b/dev-docs/bidders/ix-server.md index 9be8578f28..0bc0291e4e 100644 --- a/dev-docs/bidders/ix-server.md +++ b/dev-docs/bidders/ix-server.md @@ -244,8 +244,8 @@ Publishers who want to use the Protected Audience API with Prebid Server, must f **Before you begin:** Depending on whether you are using the Prebid Server Go or Java code base and the Prebid.js version, you must make sure that you are using the appropriate Prebid Server version: -* **For Prebid Server Go:** If you are using a Prebid.js version that is between 7.44.0 and 8.51.0, you must be using Prebid Server version 2.1.0 or later. For a Prebid.js version that is 8.52.0 or later, you must be using Prebid Server version 3.3.0 or later. -* **For Prebid Server Java:** If you are using a Prebid.js version that is 7.44.0 or later, you must be using Prebid Server Java version 3.16.0 or later. +* **For Prebid Server Go:** If you are using a Prebid.js version that is between 8.18.0 and 8.51.0, you must be using Prebid Server version 2.1.0 or later. For a Prebid.js version that is 8.52.0 or later, you must be using Prebid Server version 3.3.0 or later. +* **For Prebid Server Java:** If you are using a Prebid.js version that is 8.18.0 or later, you must be using Prebid Server Java version 3.16.0 or later. 1. Configure Prebid.js to send the `ae` field with a value of `1`. For more information on how to set up the Protected Audience API in Prebid.js, see the [Protected Audience API support](/dev-docs/bidders/ix.html#protected-audience-api-support) section in our Prebid.js documentation on the Prebid site. 2. Prebid Server will now automatically pass through the `ae=1` field received from Prebid.js to Index. No other specific Prebid Server configuration is required. From c503da936cc1b62a2a37583211087492ea86e067 Mon Sep 17 00:00:00 2001 From: Shubham <127132399+shubhamc-ins@users.noreply.github.com> Date: Thu, 19 Dec 2024 22:04:26 +0530 Subject: [PATCH 358/816] add pbs support (#5571) --- dev-docs/bidders/insticator.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/insticator.md b/dev-docs/bidders/insticator.md index 0ec593375a..1f6e972956 100644 --- a/dev-docs/bidders/insticator.md +++ b/dev-docs/bidders/insticator.md @@ -14,6 +14,7 @@ floors_supported: true media_types: banner, video multiformat_supported: will-bid-on-any pbjs: true +pbs: true gvl_id: 910 sidebarType: 1 userIds: all From 2a989196914d7af1b79c631fce31d298c2d4aa9c Mon Sep 17 00:00:00 2001 From: Vadym Shatov <135347097+Gunnar97@users.noreply.github.com> Date: Fri, 20 Dec 2024 10:33:37 +0200 Subject: [PATCH 359/816] addStellormedia allias (#5763) * addStellormedia allias * fix style * fix review issue --------- Co-authored-by: VadymShatov --- dev-docs/bidders/stellormedia.md | 89 ++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 dev-docs/bidders/stellormedia.md diff --git a/dev-docs/bidders/stellormedia.md b/dev-docs/bidders/stellormedia.md new file mode 100644 index 0000000000..2e50478b57 --- /dev/null +++ b/dev-docs/bidders/stellormedia.md @@ -0,0 +1,89 @@ +--- +layout: bidder +title: StellorMedia +description: Stellor Media Bidder Adapter +biddercode: stellormedia +aliasCode: adtelligent +media_types: video,banner +tcfeu_supported: false +gpp_sids: usp +userId: all (with commercial activation) +schain_supported: true +coppa_supported: true +usp_supported: true +safeframes_ok: true +prebid_member: false +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 Stellor Media. | `12412` | `integer` | + +### Description + +Stellor Media header bidding adapter connects with Indicue Media demand sources in order to fetch bids. +This adapter provides a solution for accessing Video demand and display demand. + +### Test Parameters + +```javascript + var adUnits = [ + + // Video instream adUnit + { + code: 'test-div', + mediaTypes: { + video: { + context: 'instream', + playerSize: [640, 480] + } + }, + bids: [{ + bidder: 'stellormedia', + params: { + aid: 472386 + } + }] + }, + + // Video outstream adUnit + { + code: 'test-div', + mediaTypes: { + video: { + context: 'outstream', + playerSize: [640, 480] + } + }, + bids: [{ + bidder: 'stellormedia', + params: { + aid: 472386 + } + }] + }, + + // Banner adUnit + { + code: 'test-div', + mediaTypes:{ + banner:{ + sizes: [[300, 250]] + } + } + bids: [{ + bidder: 'stellormedia', + params: { + aid: 529814 + } + }] + } + ]; +``` From 89678583de6f19b6cee4a7b445d838a4257d6c4e Mon Sep 17 00:00:00 2001 From: rediads <123890182+rediads@users.noreply.github.com> Date: Fri, 20 Dec 2024 18:43:45 +0530 Subject: [PATCH 360/816] Rediads bid adapter (#5743) * Create rediads.md * Update rediads.md * Update rediads.md - added more information on the bidder * Update rediads.md * Update rediads.md * Update rediads.md * Update rediads.md * Update rediads.md * Update rediads.md * Update rediads.md * Update rediads.md * Update dev-docs/bidders/rediads.md Co-authored-by: Muki Seiler --------- Co-authored-by: Muki Seiler --- dev-docs/bidders/rediads.md | 84 +++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 dev-docs/bidders/rediads.md diff --git a/dev-docs/bidders/rediads.md b/dev-docs/bidders/rediads.md new file mode 100644 index 0000000000..bc1d61e2d7 --- /dev/null +++ b/dev-docs/bidders/rediads.md @@ -0,0 +1,84 @@ +--- +layout: bidder +title: Rediads +description: Prebid Rediads Bidder Adapter +biddercode: rediads +prebid_member: false +media_types: banner, video, native +pbjs: true +pbs: false +tcfeu_supported: false +usp_supported: true +coppa_supported: false +schain_supported: true +dchain_supported: false +safeframes_ok: false +deals_supported: false +floors_supported: true +fpd_supported: true +ortb_blocking_supported: partial +privacy_sandbox: no +multiformat_supported: will-bid-on-one +sidebarType: 1 +--- + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|--------------|----------|-----------------------------------------------------------------------------|----------------------|----------------| +| account_id | required | Account ID generated on the Rediads Platform. | '12345' | string | +| site | optional | Site domain name. | 'rediads.com' | string | +| slot | optional | Unique identifier for the ad slot generated on the platform. | '54321' | string | + +--- + +### Enabling Test Bids + +To enable test bids for the Rediads Bidder Adapter, append rediads-test-bids to the hash of the page URL. + +For example: + +- *Localhost:* [http://localhost:8000/xyz#rediads-test-bid](http://localhost:8000/xyz#rediads-test-bids) +- *Production URL:* [https://domain.com/page#rediads-test-bid](https://domain.com/page#rediads-test-bids) + +This will activate test bids for debugging and validation purposes. + +--- + +### AdUnit Examples + +#### AdUnit Format for Banner + +```javascript +var adUnits = [ + { + code: 'test-div', + mediaTypes: { + banner: { + sizes: [[300, 250], [300, 600]] + } + }, + bids: [ + { + bidder: 'rediads', + params: { + account_id: '12345', + site: 'rediads.com', + slot: '54321' + } + } + ] + } +]; +``` + +### First Party Data Support +The following fields are supported for First Party Data (FPD): + +- `ortb2.site.*` +- `ortb2.publisher.*` +- `ortb2.content.*` +- `ortb2.devices.locations parameters` + +For additional implementation or support, contact us at . From 0f74f8b7291471470aad1c14bb45699e1780ff69 Mon Sep 17 00:00:00 2001 From: Olena Stepaniuk <92721590+OlenaPostindustria@users.noreply.github.com> Date: Fri, 20 Dec 2024 18:33:36 +0200 Subject: [PATCH 361/816] Mobile: Add section about ad position configuration (#5751) * Add section about ad position * Add rendering-adunit-config-android.md --- _includes/mobile/adunit-config-android.md | 10 ++++++++++ _includes/mobile/adunit-config-ios.md | 10 ++++++++++ _includes/mobile/rendering-adunit-config-android.md | 9 +++++++++ _includes/mobile/rendering-adunit-config-ios.md | 9 +++++++++ .../modules/rendering/android-sdk-integration-admob.md | 4 ++++ .../modules/rendering/android-sdk-integration-gam.md | 2 +- .../modules/rendering/android-sdk-integration-max.md | 4 ++++ .../modules/rendering/android-sdk-integration-pb.md | 4 ++++ .../modules/rendering/ios-sdk-integration-admob.md | 4 ++++ .../modules/rendering/ios-sdk-integration-gam.md | 2 +- .../modules/rendering/ios-sdk-integration-max.md | 4 ++++ .../modules/rendering/ios-sdk-integration-pb.md | 4 ++++ 12 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 _includes/mobile/rendering-adunit-config-android.md create mode 100644 _includes/mobile/rendering-adunit-config-ios.md diff --git a/_includes/mobile/adunit-config-android.md b/_includes/mobile/adunit-config-android.md index 0cce97bcb2..e3e4bde8dd 100644 --- a/_includes/mobile/adunit-config-android.md +++ b/_includes/mobile/adunit-config-android.md @@ -33,3 +33,13 @@ Using the following method, you can set the impression-level [GPID](https://docs ``` kotlin adUnit?.gpid = "/36117602/hnp-sfgate.com/Homepage/AP300" ``` + +### Ad Position + +The `adPosition` property allows developers to specify the position of the ad within the publisher's content. This property maps to the `pos` field in the OpenRTB specification under the `imp[].banner` or `imp[].video` objects, depending on the ad format. The possible values for this field could be found in the [respective specification](https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/main/AdCOM%20v1.0%20FINAL.md#list--placement-positions-). + +You can set `adPosition` by using the following method: + +```kotlin +adUnit.setAdPosition(AdPosition.FOOTER); +``` \ No newline at end of file diff --git a/_includes/mobile/adunit-config-ios.md b/_includes/mobile/adunit-config-ios.md index 42ba1f2aec..4812e1d7d6 100644 --- a/_includes/mobile/adunit-config-ios.md +++ b/_includes/mobile/adunit-config-ios.md @@ -29,3 +29,13 @@ Using the following method, you can set the impression-level [GPID](https://docs ``` swift adUnit.setGPID("/36117602/hnp-sfgate.com/Homepage/AP300") ``` + +### Ad Position + +The `adPosition` property allows developers to specify the position of the ad within the publisher's content. This property maps to the `pos` field in the OpenRTB specification under the `imp[].banner` or `imp[].video` objects, depending on the ad format. The possible values for this field could be found in the [respective specification](https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/main/AdCOM%20v1.0%20FINAL.md#list--placement-positions-). + +You can set `adPosition` by using the following property: + +```swift +adUnit.adPosition = .footer +``` \ No newline at end of file diff --git a/_includes/mobile/rendering-adunit-config-android.md b/_includes/mobile/rendering-adunit-config-android.md new file mode 100644 index 0000000000..5fc4d6ec26 --- /dev/null +++ b/_includes/mobile/rendering-adunit-config-android.md @@ -0,0 +1,9 @@ +### Ad Position + +The `adPosition` property allows developers to specify the position of the ad within the publisher's content. This property maps to the `pos` field in the OpenRTB specification under the `imp[].banner` or `imp[].video` objects, depending on the ad format. The possible values for this field could be found in the [respective specification](https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/main/AdCOM%20v1.0%20FINAL.md#list--placement-positions-). + +You can set `adPosition` by using the following method: + +```kotlin +adUnit.setAdPosition(AdPosition.FOOTER); +``` \ No newline at end of file diff --git a/_includes/mobile/rendering-adunit-config-ios.md b/_includes/mobile/rendering-adunit-config-ios.md new file mode 100644 index 0000000000..5737e459e7 --- /dev/null +++ b/_includes/mobile/rendering-adunit-config-ios.md @@ -0,0 +1,9 @@ +### Ad Position + +The `adPosition` property allows developers to specify the position of the ad within the publisher's content. This property maps to the `pos` field in the OpenRTB specification under the `imp[].banner` or `imp[].video` objects, depending on the ad format. The possible values for this field could be found in the [respective specification](https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/main/AdCOM%20v1.0%20FINAL.md#list--placement-positions-). + +You can set `adPosition` by using the following property: + +```swift +adUnit.adPosition = .footer +``` \ No newline at end of file diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-admob.md b/prebid-mobile/modules/rendering/android-sdk-integration-admob.md index 32cc4169c5..cca7f118a0 100644 --- a/prebid-mobile/modules/rendering/android-sdk-integration-admob.md +++ b/prebid-mobile/modules/rendering/android-sdk-integration-admob.md @@ -389,6 +389,10 @@ The `fetchDemand` method makes a bid request to the prebid server and provides a Now load an native ad from AdMob according to the [AdMob instructions](https://developers.google.com/admob/android/native/start). Everything else will be handled by GMA SDK and prebid adapters. +## Additional Ad Unit Configuration + +{% include mobile/rendering-adunit-config-android.md %} + ## Further Reading - [Prebid Mobile Overview](/prebid-mobile/prebid-mobile.html) diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-gam.md b/prebid-mobile/modules/rendering/android-sdk-integration-gam.md index 45da869bf1..502a9d6629 100644 --- a/prebid-mobile/modules/rendering/android-sdk-integration-gam.md +++ b/prebid-mobile/modules/rendering/android-sdk-integration-gam.md @@ -310,7 +310,7 @@ Integration: ## Additional Ad Unit Configuration -{% include mobile/adunit-config-android.md %} +{% include mobile/rendering-adunit-config-android.md %} ## Further Reading diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-max.md b/prebid-mobile/modules/rendering/android-sdk-integration-max.md index 2a5803b2c1..715d7830a2 100644 --- a/prebid-mobile/modules/rendering/android-sdk-integration-max.md +++ b/prebid-mobile/modules/rendering/android-sdk-integration-max.md @@ -330,6 +330,10 @@ The `fetchDemand` method makes a bid request to prebid server and provides a res Now just load a native ad from MAX according to the [MAX instructions](https://dash.applovin.com/documentation/mediation/android/getting-started/native-manual#load-the-native-ad). +## Additional Ad Unit Configuration + +{% include mobile/rendering-adunit-config-android.md %} + ## Further Reading - [Prebid Mobile Overview](/prebid-mobile/prebid-mobile.html) diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-pb.md b/prebid-mobile/modules/rendering/android-sdk-integration-pb.md index 6c4a24cadc..6d6334cc88 100644 --- a/prebid-mobile/modules/rendering/android-sdk-integration-pb.md +++ b/prebid-mobile/modules/rendering/android-sdk-integration-pb.md @@ -238,6 +238,10 @@ override fun onAdLoaded(rewardedAdUnit: RewardedAdUnit) { } ``` +## Additional Ad Unit Configuration + +{% include mobile/rendering-adunit-config-android.md %} + ## Further Reading - [Prebid Mobile Overview](/prebid-mobile/prebid-mobile) diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md b/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md index acc6d0bb43..60beae54c1 100644 --- a/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md +++ b/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md @@ -350,6 +350,10 @@ The `fetchDemand` method makes a bid request to Prebid server and provides a res Now just load a native ad from AdMob according to the [AdMob instructions](https://developers.google.com/admob/ios/native/start). +## Additional Ad Unit Configuration + +{% include mobile/rendering-adunit-config-ios.md %} + ## Further Reading - [Prebid Mobile Overview](/prebid-mobile/prebid-mobile) diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md b/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md index 949abdf86b..6610406e66 100644 --- a/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md +++ b/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md @@ -297,7 +297,7 @@ Integration: ## Additional Ad Unit Configuration -{% include mobile/adunit-config-ios.md %} +{% include mobile/rendering-adunit-config-ios.md %} ## Further Reading diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-max.md b/prebid-mobile/modules/rendering/ios-sdk-integration-max.md index 9145836090..746d660e17 100644 --- a/prebid-mobile/modules/rendering/ios-sdk-integration-max.md +++ b/prebid-mobile/modules/rendering/ios-sdk-integration-max.md @@ -304,6 +304,10 @@ The `fetchDemand` method makes a bid request to Prebid Server and provides a res Load a native ad from MAX according to the [MAX instructions](https://dash.applovin.com/documentation/mediation/ios/getting-started/native-manual#load-the-native-ad). +## Additional Ad Unit Configuration + +{% include mobile/rendering-adunit-config-ios.md %} + ## Further Reading - [Prebid Mobile Overview](/prebid-mobile/prebid-mobile) diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md b/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md index 5291655c9d..d41ceb0386 100644 --- a/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md +++ b/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md @@ -237,6 +237,10 @@ func rewardedAdDidReceiveAd(_ rewardedAd: RewardedAdUnit) { } ``` +## Additional Ad Unit Configuration + +{% include mobile/rendering-adunit-config-ios.md %} + ## Further Reading - [Prebid Mobile Overview](/prebid-mobile/prebid-mobile) From 18deeeeaaf8e292356241ad7d090c224f44a2e9e Mon Sep 17 00:00:00 2001 From: Yuriy Velichko Date: Fri, 20 Dec 2024 18:33:46 +0200 Subject: [PATCH 362/816] Mobile: update docs for setORTB functions (#5759) * docs: update for setOpenRTB funtions * doc: format code snippet * doc: fix lint errors * Apply suggestions from code review Co-authored-by: bretg * doc: restore docs for the deprecated methods --------- Co-authored-by: bretg --- _includes/mobile/adunit-config-android.md | 25 +++++++++ _includes/mobile/adunit-config-ios.md | 20 ++++++- .../pbm-api/android/pbm-targeting-android.md | 52 +++++++++++++------ .../pbm-api/ios/pbm-targeting-ios.md | 52 +++++++++++++------ 4 files changed, 115 insertions(+), 34 deletions(-) diff --git a/_includes/mobile/adunit-config-android.md b/_includes/mobile/adunit-config-android.md index e3e4bde8dd..9c4662684c 100644 --- a/_includes/mobile/adunit-config-android.md +++ b/_includes/mobile/adunit-config-android.md @@ -1,5 +1,30 @@ Each ad unit in the Original API is a subclass of the `AdUnit` class, which provides the following properties and methods for additional configuration. +### Arbitrary OpenRTB + +(requires SDK v2.4.0) + +Prebid SDK allows the customization of the OpenRTB request on the impression level using the `setImpORTBConfig()` function: + +``` kotlin +adUnit.setImpOrtbConfig( + "{" + + " \"bidfloor\": 0.01," + + " \"banner\": {" + + " \"battr\": [1,2,3,4]" + + " }" + + "}" +); +``` + +The parameter passed to `setImpOrtbConfig()` will be merged into the respective `imp` object for this Ad Unit. For instance, the above example will add the `$.imp[0].bidfloor` and `$.imp[0].banner.battr` parameters to the bid request. + +To empty out a previously provided impression config, just set it to the empty string: + +``` swift +adUnit.setImpOrtbConfig("") +``` + ### Auto Refresh #### setAutoRefreshPeriodMillis diff --git a/_includes/mobile/adunit-config-ios.md b/_includes/mobile/adunit-config-ios.md index 4812e1d7d6..895a3e58c4 100644 --- a/_includes/mobile/adunit-config-ios.md +++ b/_includes/mobile/adunit-config-ios.md @@ -1,11 +1,29 @@ Each ad unit in the original integration method is a subclass of the `AdUnit` class, which provides the following properties and methods for the additional configuration. +### Arbitrary OpenRTB + +(requires SDK v2.4.0) + +Prebid SDK allows the customization of the OpenRTB request on the ad unit level using the `setImpORTBConfig()` function: + +``` swift +adUnit.setImpORTBConfig("{\"bidfloor\":0.01,\"banner\":{\"battr\":[1,2,3,4]}}") +``` + +The parameter passed to `setImpORTBConfig()` will be merged into the respective `imp` object for this Ad Unit. For instance, the above example will add the `$.imp[0].bidfloor` and `$.imp[0].banner.battr` parameters to the bid request. + +To empty out a previously provided impression config, just set it to the empty string: + +``` swift +adUnit.setImpORTBConfig("") +``` + ### Autorefresh #### setAutoRefreshMillis {:.no_toc} -If set on a given banner adunit, the `fetchDemand` function will be called every `periodMillis` until `stopAutoRefresh` is called. Each call to `fetchDemand` will invoke the `onComplete` function. This refresh only pertains to Prebid Mobile and not to any ad server refresh processes. It is suggested that the adServes refresh be turned off. +If set on a given banner ad unit, the `fetchDemand` function will be called every `periodMillis` until `stopAutoRefresh` is called. Each call to `fetchDemand` will invoke the `onComplete` function. This refresh only pertains to Prebid Mobile and not to any ad server refresh processes. It is suggested that the adServes refresh be turned off. #### stopAutoRefresh {:.no_toc} diff --git a/prebid-mobile/pbm-api/android/pbm-targeting-android.md b/prebid-mobile/pbm-api/android/pbm-targeting-android.md index 17266ed78d..8dac95eead 100755 --- a/prebid-mobile/pbm-api/android/pbm-targeting-android.md +++ b/prebid-mobile/pbm-api/android/pbm-targeting-android.md @@ -745,32 +745,50 @@ Parameters: ## Arbitrary OpenRTB -(requires SDK v2.2.1) +(requires SDK v2.4.0) + +Prebid SDK allows the customization of the OpenRTB request on the global level using `setGlobalOrtbConfig()` function: + +``` kotlin +TargetingParams.setGlobalOrtbConfig( + "{" + + " \"displaymanager\": \"Google\"," + + " \"displaymanagerver\": \"" + MobileAds.getVersion() + "\"," + + " \"ext\": {" + + " \"myext\": {" + + " \"test\": 1" + + " }" + + " }" + + "}" +); +``` + +The parameter passed to `TargetingParams.setGlobalOrtbConfig()` will be merged into all SDK's bid requests on the global level. For instance, the above example will add the `$.ext.myext.test` parameter and change the `displaymanager` and `displaymanagerver` parameters in each request. + +To invalidate the global config, just set the empty string: -While there are many specific methods for adding data to the request detailed in -this document, OpenRTB is big and it moves quickly. To cover scenarios not already covered by an existing method, -Prebid SDK Provides a way for app publishers to customize most ORTB fields in the partial bid request that Prebid Mobile sends to the Prebid Server. The customization comes in the form of the ortbConfig parameter that takes a JSON String as input. The JSON string must follow the [OpenRTB structure](https://github.com/InteractiveAdvertisingBureau/openrtb2.x/blob/main/2.6.md) -- it will be merged with the current JSON of the bid request. If you choose to input extra data using the ortbConfig parameter, please extensively test your requests sent to Prebid Server. +``` kotlin +TargetingParams.setGlobalOrtbConfig("") +``` -There are certain protected fields such as regs, device, geo, ext.gdpr, ext.us_privacy, and ext.consent which cannot be changed. +The `TargetingParams.setGlobalOrtbConfig()` also allows to **add** impression objects to the request. All objects in the `$.imp[]` array will be added to the request. Note that Ad Unit's `imp` object won't be changed using Global Config. To change the `imp` config, use the `setImpORTBConfig()` method of a particular Ad Unit. See the Ad Unit documentation for the details. -Here's how to specify cross-impression data: +Pay attention that there are certain protected fields such as `regs`, `device`, `geo`, `ext.gdpr`, `ext.us_privacy`, and `ext.consent` which cannot be changed using the `setGlobalOrtbConfig()` method. -```kotlin -//global invocation -adUnitConfiguration?.ortbConfig = "{\"ext\":{\"prebid\":{\"debug\":1,\"trace\":\"verbose\"}}}" -``` +- App and User first party data should use the [functions defined for those purposes](/prebid-mobile/pbm-api/ios/pbm-targeting-ios.html#first-party-data) +- See the [Prebid Server auction endpoint](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#prebid-server-ortb2-extension-summary) reference for more information about how it will process incoming fields. -To merge impression-level data, use the `adUnit` object: +### Deprecated +{:.no_toc} -```kotlin +The Prebid Mobile SDK v2.2.1 contains the deprecated method to set the impression level RTB config: + +``` swift //ad unit / impression-level -adUnit?.ortbConfig = "{\"ext\":{\"gpid\":\"abc123\"}}" +adUnit.setOrtbConfig("{\"ext\":{\"gpid\":\"abc123"}}\") ``` -Notes: - -- App and User first party data should use the [functions defined for those purposes](/prebid-mobile/pbm-api/android/pbm-targeting-android.html#first-party-data) -- See the [Prebid Server auction endpoint](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#prebid-server-ortb2-extension-summary) reference for more information about how it will process incoming fields. +This method has implementation issues and was deprecated in v2.4.0. If you use this method, we strongly recommend migrating to the new `setImpORTBConfig()` method since this one will be removed entirely in SDK version 3.0. ## Further Reading diff --git a/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md b/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md index 6fcc3d1bf9..e2ca9006e7 100644 --- a/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md +++ b/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md @@ -509,32 +509,52 @@ All of the targeting class methods have been mentioned above in the context of F ## Arbitrary OpenRTB -(requires SDK v2.2.1) +(requires SDK v2.4.0) + +Prebid SDK allows the customization of the OpenRTB request on the global level using `setGlobalORTBConfig()` function: + +``` swift +let globalORTB = """ +{ + "ext": { + "myext": { + "test": 1 + } + }, + "displaymanager": "Google", + "displaymanagerver": "\(GADGetStringFromVersionNumber(GADMobileAds.sharedInstance().versionNumber))" +} +""" + +Targeting.shared.setGlobalORTBConfig(globalORTB) +``` + +The parameter passed to `Targeting.shared.setGlobalORTBConfig()` will be merged into all SDK's bid requests on the global level. For instance, the above example will add the `$.ext.myext.test` parameter and change the `displaymanager` and `displaymanagerver` parameters in each request. -While there are many specific methods for adding data to the request detailed in -this document, OpenRTB is big and it moves quickly. To cover scenarios not already covered by an existing method, -Prebid SDK Provides a way for app publishers to customize most ORTB fields in the partial bid request that Prebid Mobile sends to the Prebid Server. The customization comes in the form of the ortbConfig parameter that takes a JSON String as input. The JSON string must follow the [OpenRTB structure](https://github.com/InteractiveAdvertisingBureau/openrtb2.x/blob/main/2.6.md) -- it will be merged with the current JSON of the bid request. If you choose to input extra data using the ortbConfig parameter, please extensively test your requests sent to Prebid Server. +To invalidate the global config, just set the empty string: -There are certain protected fields such as regs, device, geo, ext.gdpr, ext.us_privacy, and ext.consent which cannot be changed. +``` swift +Targeting.shared.setGlobalORTBConfig("") +``` -Here's how to specify cross-impression data: +The `Targeting.shared.setGlobalORTBConfig()` also allows to **add** impression objects to the request. All objects in the `$.imp[]` array will be added to the request. Note that Ad Unit's `imp` object won't be changed using Global Config. To change the `imp` config, use the `setImpORTBConfig()` method of a particular Ad Unit. See the Ad Unit documentation for the details. -```swift -//global invocation -adUnitConfig.setOrtbConfig("{\"ext\":{\"prebid\":{\"debug\":1,\"trace\":\"verbose\"}}}") -``` +Pay attention that there are certain protected fields such as `regs`, `device`, `geo`, `ext.gdpr`, `ext.us_privacy`, and `ext.consent` which cannot be changed using the `setGlobalORTBConfig()` method. -To merge impression-level data, use the `adUnit` object: +- App and User first party data should use the [functions defined for those purposes](/prebid-mobile/pbm-api/ios/pbm-targeting-ios.html#first-party-data) +- See the [Prebid Server auction endpoint](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#prebid-server-ortb2-extension-summary) reference for more information about how it will process incoming fields. -```swift +### Deprecated +{:.no_toc} + +The Prebid Mobile SDK v2.2.1 contains the deprecated method to set the impression level RTB config: + +``` swift //ad unit / impression-level adUnit.setOrtbConfig("{\"ext\":{\"gpid\":\"abc123"}}\") ``` -Notes: - -- App and User first party data should use the [functions defined for those purposes](/prebid-mobile/pbm-api/ios/pbm-targeting-ios.html#first-party-data) -- See the [Prebid Server auction endpoint](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#prebid-server-ortb2-extension-summary) reference for more information about how it will process incoming fields. +This method has implementation issues and was deprecated in v2.4.0. If you use this method, we strongly recommend migrating to the new `setImpORTBConfig()` method since this one will be removed entirely in SDK version 3.0. ## Further Reading From a90dbec8db241c9a5ac65d6555ca9335128aad46 Mon Sep 17 00:00:00 2001 From: Yuriy Velichko Date: Fri, 20 Dec 2024 20:41:24 +0200 Subject: [PATCH 363/816] doc: fix the release version of the setOrtb feature (#5786) --- _includes/mobile/adunit-config-android.md | 2 +- _includes/mobile/adunit-config-ios.md | 2 +- prebid-mobile/pbm-api/android/pbm-targeting-android.md | 2 +- prebid-mobile/pbm-api/ios/pbm-targeting-ios.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/_includes/mobile/adunit-config-android.md b/_includes/mobile/adunit-config-android.md index 9c4662684c..aa522f9582 100644 --- a/_includes/mobile/adunit-config-android.md +++ b/_includes/mobile/adunit-config-android.md @@ -2,7 +2,7 @@ Each ad unit in the Original API is a subclass of the `AdUnit` class, which prov ### Arbitrary OpenRTB -(requires SDK v2.4.0) +(requires SDK v2.3.1) Prebid SDK allows the customization of the OpenRTB request on the impression level using the `setImpORTBConfig()` function: diff --git a/_includes/mobile/adunit-config-ios.md b/_includes/mobile/adunit-config-ios.md index 895a3e58c4..7fa4ad9490 100644 --- a/_includes/mobile/adunit-config-ios.md +++ b/_includes/mobile/adunit-config-ios.md @@ -2,7 +2,7 @@ Each ad unit in the original integration method is a subclass of the `AdUnit` cl ### Arbitrary OpenRTB -(requires SDK v2.4.0) +(requires SDK v2.3.1) Prebid SDK allows the customization of the OpenRTB request on the ad unit level using the `setImpORTBConfig()` function: diff --git a/prebid-mobile/pbm-api/android/pbm-targeting-android.md b/prebid-mobile/pbm-api/android/pbm-targeting-android.md index 8dac95eead..81c269da6a 100755 --- a/prebid-mobile/pbm-api/android/pbm-targeting-android.md +++ b/prebid-mobile/pbm-api/android/pbm-targeting-android.md @@ -745,7 +745,7 @@ Parameters: ## Arbitrary OpenRTB -(requires SDK v2.4.0) +(requires SDK v2.3.1) Prebid SDK allows the customization of the OpenRTB request on the global level using `setGlobalOrtbConfig()` function: diff --git a/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md b/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md index e2ca9006e7..a3a02d8ef8 100644 --- a/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md +++ b/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md @@ -509,7 +509,7 @@ All of the targeting class methods have been mentioned above in the context of F ## Arbitrary OpenRTB -(requires SDK v2.4.0) +(requires SDK v2.3.1) Prebid SDK allows the customization of the OpenRTB request on the global level using `setGlobalORTBConfig()` function: From 5c4e936508cbe30f7aa61133f5b1cc436c6b8c92 Mon Sep 17 00:00:00 2001 From: Fatih Kaya Date: Sat, 21 Dec 2024 19:32:11 +0300 Subject: [PATCH 364/816] AdMatic: documenting yobee alias (#5780) * added simple params * update * Update admatic.md * update * update * Pixad Bid Adapter: added simple params * AdMatic Adapter: Feature update Pixad alias is included in the update. * Update admatic.md * Update pixad.md * gvl_id add * Update pixad.md * admatic && pixad pbs support true * Create monetixads.md * new alias * new alias * Update adt.md * Revert "Update adt.md" This reverts commit c274c967792bb77e7c897501b70732df5acc6290. * Revert "new alias" This reverts commit cb15f2c27b28d937986d53ebaf3efeabfd5df9d3. * Create adt.md * Update adt.md * Update adt.md * Update adt.md * Update adt.md * Update adt.md * yobee * Update yobee.md --- dev-docs/bidders/admatic.md | 2 +- dev-docs/bidders/admaticde.md | 2 +- dev-docs/bidders/adt.md | 2 +- dev-docs/bidders/monetixads.md | 2 +- dev-docs/bidders/netaddiction.md | 2 +- dev-docs/bidders/pixad.md | 2 +- dev-docs/bidders/yobee.md | 92 ++++++++++++++++++++++++++++++++ 7 files changed, 98 insertions(+), 6 deletions(-) create mode 100644 dev-docs/bidders/yobee.md diff --git a/dev-docs/bidders/admatic.md b/dev-docs/bidders/admatic.md index 2732a990c2..841c14b16e 100644 --- a/dev-docs/bidders/admatic.md +++ b/dev-docs/bidders/admatic.md @@ -13,7 +13,7 @@ coppa_supported: true gpp_sids: tcfeu, tcfca, usnat, usstate_all, usp schain_supported: true dchain_supported: false -userIds: criteo, id5Id, sharedId, unifiedId +userIds: all safeframes_ok: true floors_supported: true multiformat_supported: will-bid-on-any diff --git a/dev-docs/bidders/admaticde.md b/dev-docs/bidders/admaticde.md index e188d5493f..ea409f24c9 100644 --- a/dev-docs/bidders/admaticde.md +++ b/dev-docs/bidders/admaticde.md @@ -13,7 +13,7 @@ coppa_supported: true gpp_sids: tcfeu, tcfca, usnat, usstate_all, usp schain_supported: true dchain_supported: false -userIds: criteo, id5Id, sharedId, unifiedId +userIds: all safeframes_ok: true floors_supported: true aliasCode: admatic diff --git a/dev-docs/bidders/adt.md b/dev-docs/bidders/adt.md index 55d71cbfba..17810926f4 100644 --- a/dev-docs/bidders/adt.md +++ b/dev-docs/bidders/adt.md @@ -13,7 +13,7 @@ coppa_supported: true gpp_sids: tcfeu, tcfca, usnat, usstate_all, usp schain_supported: true dchain_supported: false -userIds: criteo, id5Id, sharedId, unifiedId +userIds: all safeframes_ok: true floors_supported: true aliasCode: admatic diff --git a/dev-docs/bidders/monetixads.md b/dev-docs/bidders/monetixads.md index 6f2a3fc96d..93512e7449 100644 --- a/dev-docs/bidders/monetixads.md +++ b/dev-docs/bidders/monetixads.md @@ -13,7 +13,7 @@ coppa_supported: true gpp_sids: tcfeu, tcfca, usnat, usstate_all, usp schain_supported: true dchain_supported: false -userIds: criteo, id5Id, sharedId, unifiedId +userIds: all safeframes_ok: true floors_supported: true aliasCode: admatic diff --git a/dev-docs/bidders/netaddiction.md b/dev-docs/bidders/netaddiction.md index 54406a1a18..3a1a8e702b 100644 --- a/dev-docs/bidders/netaddiction.md +++ b/dev-docs/bidders/netaddiction.md @@ -13,7 +13,7 @@ coppa_supported: true gpp_sids: tcfeu, tcfca, usnat, usstate_all, usp schain_supported: true dchain_supported: false -userIds: criteo, id5Id, sharedId, unifiedId +userIds: all safeframes_ok: true floors_supported: true aliasCode: admatic diff --git a/dev-docs/bidders/pixad.md b/dev-docs/bidders/pixad.md index 22368c79ac..3ece67bd27 100644 --- a/dev-docs/bidders/pixad.md +++ b/dev-docs/bidders/pixad.md @@ -13,7 +13,7 @@ coppa_supported: true gpp_sids: tcfeu, tcfca, usnat, usstate_all, usp schain_supported: true dchain_supported: false -userIds: criteo, id5Id, sharedId, unifiedId +userIds: all safeframes_ok: true floors_supported: true aliasCode: admatic diff --git a/dev-docs/bidders/yobee.md b/dev-docs/bidders/yobee.md new file mode 100644 index 0000000000..210787347e --- /dev/null +++ b/dev-docs/bidders/yobee.md @@ -0,0 +1,92 @@ +--- +layout: bidder +title: Yobee +description: Prebid Yobee Bidder Adapter. +pbjs: true +pbs: true +biddercode: yobee +media_types: banner,video,native +gvl_id: 1281 (admatic) +tcfeu_supported: true +usp_supported: true +coppa_supported: true +gpp_sids: tcfeu, tcfca, usnat, usstate_all, usp +schain_supported: true +dchain_supported: false +userIds: all +safeframes_ok: true +floors_supported: true +aliasCode: admatic +multiformat_supported: will-bid-on-any +sidebarType: 1 +--- + +### Description + +Yobee header bidding adapter connects with Yobee demand sources to fetch bids for network ID. Please reach out to your account manager or for more information. + +### Bid params + +{: .table .table-bordered .table-striped } + +| Name | Scope | Description | Example | Type | +|-------------|----------|-------------------------------------|----------|----------| +| `networkId` | required | The network ID from Yobee | `12345` | `number` | +| `host` | required | RTB Host | `*.rtb.yobee.it` | `string` | + +### Test Parameters + +300x250 banner test + +```javascript +var adUnits = [{ + code: 'your-slot_1-div', + mediaTypes: { + banner: { sizes: [[300, 250]] }, + }, + bids: [{ + bidder: 'yobee', + params: { + networkId: 12345, + host: '*.rtb.yobee.it' + } + }] +},{ + code: 'your-slot_2-div', + mediaTypes: { + native: { ... }, + }, + bids: [{ + bidder: 'yobee', + params: { + networkId: 12345, + host: '*.rtb.yobee.it' + } + }] +},{ + code: 'your-slot_3-div', + mediaTypes: { + video: { ... }, + }, + bids: [{ + bidder: 'yobee', + params: { + networkId: 12345, + host: '*.rtb.yobee.it' + } + }] +}]; +``` + +### UserSync example + +```javascript +pbjs.setConfig({ + userSync: { + iframeEnabled: true, + syncEnabled: true, + syncDelay: 1, + aliasSyncEnabled: true + } +}); +``` From dbad0149f1f5aebc6943e3c7e04fd1f697c1ed19 Mon Sep 17 00:00:00 2001 From: Erik Hummel Date: Tue, 31 Dec 2024 10:26:24 -0500 Subject: [PATCH 365/816] Lotame URL & wording updates (#5769) * Updates to verbiage and a few outdated URLs. * Update dev-docs/modules/userid-submodules/lotame.md fair. Co-authored-by: Muki Seiler --------- Co-authored-by: Erik Hummel Co-authored-by: Muki Seiler --- dev-docs/modules/userid-submodules/lotame.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/dev-docs/modules/userid-submodules/lotame.md b/dev-docs/modules/userid-submodules/lotame.md index ffde443739..88e27e5039 100644 --- a/dev-docs/modules/userid-submodules/lotame.md +++ b/dev-docs/modules/userid-submodules/lotame.md @@ -9,11 +9,11 @@ example: '"e4b9..."' --- -[Lotame Panorama](https://www.lotame.com/panorama/) is a suite of data-enrichment solutions for digital advertising that empowers marketers, agencies, publishers and media companies to transform consumer personas into addressable audiences. At the heart of Lotame Panorama is the Panorama ID, a people-based identifier powered by deterministic and probabilistic data, available across the cookie-challenged web and all browsers. +[Lotame Panorama ID™](https://www.lotame.com/panorama-id/) is a pseudonymous ID that represents devices for the purposes of audience enrichment and campaign activation. It is powered by the Lotame Panorama Graph, which is built on hashed emails and browser and device data and combined with machine learning and predictive models to estimate the likelihood that a group of devices may be used by the same user or are in the same household. -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 [www.lotame.com/panorama/id/](https://www.lotame.com/panorama/id/). +Lotame’s Panorama ID™ module sends the IP address, user agent, and timestamp from the request to Lotame in order to successfully generate a Panorama IDTM. For more information on how the Panorama IDTM works, please visit [https://www.lotame.com/panorama-identity/](https://www.lotame.com/panorama-identity/). -Lotame's privacy policy related to the Panorama ID and the collection of data and how data is used is available at [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. +Through registering above, your organization will execute Lotame’s Panorama ID Enrollment Terms for Prebid.org. Lotame’s [Services Privacy Notice](https://www.lotame.com/privacy/privacy-notices/services/) describes the processing of personal data by Lotame. If you have any questions about Panorama ID, please reach out by emailing [prebid@lotame.com](mailto:prebid@lotame.com). @@ -25,11 +25,11 @@ gulp build --modules=lotamePanoramaIdSystem ## Lotame Panorama ID Registration & Implementation -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. +To get started, you will need to [register](https://www.cognitoforms.com/LotameSolutionsInc/PanoramaIDOfferingEnrollment) with Lotame in order to receive your unique client ID for the userID module. Please contact [prebid@lotame.com](mailto:prebid@lotame.com) for any questions that you may have. Once you sign up, you will receive an email with your client ID and instructions for implementation. -## Lotame Panorama ID Example +## Lotame Panorama ID™ Example {: .table .table-bordered .table-striped } From dfec92c40e6606ed01b43afee7644df442a666e8 Mon Sep 17 00:00:00 2001 From: Sharon Green Date: Wed, 1 Jan 2025 17:43:47 +0200 Subject: [PATCH 366/816] create bridgeupp.md (#5755) * create bridgeupp.md * create bridgeupp.md * Minor formatting changes --------- Co-authored-by: Muki Seiler --- dev-docs/bidders/bridgeupp.md | 70 +++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 dev-docs/bidders/bridgeupp.md diff --git a/dev-docs/bidders/bridgeupp.md b/dev-docs/bidders/bridgeupp.md new file mode 100644 index 0000000000..4bbbec8a92 --- /dev/null +++ b/dev-docs/bidders/bridgeupp.md @@ -0,0 +1,70 @@ +--- +layout: bidder +title: Bridgeupp +description: Bridgeupp Bidder Adapter +biddercode: sonarads +tcfeu_supported: true +usp_supported: true +gvl_id: 1300 +coppa_supported: true +schain_supported: true +media_types: banner +pbjs: true +pbs_app_supported: true +sidebarType: 1 +multiformat_supported: will-bid-on-any +safeframes_ok: false +deals_supported: false +floors_supported: true +fpd_supported: false +pbs: false +--- + +### Note + +The Bridgeupp Prebid adapter requires a setup to create a Site IDs. Please contact your Bridgeupp partner manager for setup assistance. +For queries, write to us at + +### Bid Params + +{: .table .table-bordered .table-striped } + +| Name | Scope | Description | Example | Type | +|---------------|----------|----------------------|----------|----------| +| `siteId` | required | Placement ID | `'1234'` | `string` | +| `bidfloor` | optional | Minimum price in USD | `'1.50'` | `float` | + +### First Party Data + +Bridgeupp supports both `ortb2` and `ortb2Imp` methods to set [First Party Data](https://docs.prebid.org/features/firstPartyData.html). +Propertis like : + +| Name | Scope | Description | Example | Type | +|-------------------|----------|-------------------------------------------------------------------------------------------------|-------------------|----------------| +| `ortb2.site` | optional | Information about the publisher's website provided through an OpenRTB Site object. | N/A | `object` | +| `ortb2.user` | optional | Information about the advertising device's human user, provided through an OpenRTB User object. | N/A | `object` | +| `ortb2.device` | optional | Information about the user's device provided through an OpenRTB device object. | N/A | `object` | +| `ortb2.bcat` | optional | Blocked advertiser categories using the IAB content categories. | `[ "IAB25" ]` | `string array` | +| `ortb2.badv` | optional | Block list of advertisers by their domains | `[ "ford.com" ]` | `string array` | + +### Example Ad-Units + +#### Banner + +```javascript + var adUnits = [{ + code: 'test-div', + mediaTypes: { + banner: { + sizes: [[300, 250], [336, 336]] + } + }, + bids: [{ + bidder: 'sonarads', + params: { + siteId: 'site-id-example-132', // siteId provided by Bridgeupp + bidfloor: 0.01 + } + }] + }]; +``` From d105d676bbdc63cbc8f5e708f1efb83a3788f84f Mon Sep 17 00:00:00 2001 From: SmartHubSolutions <87376145+SmartHubSolutions@users.noreply.github.com> Date: Thu, 2 Jan 2025 17:38:59 +0200 Subject: [PATCH 367/816] Attekmi: new alias Artechnology (#5787) * Attekmi: new alias Artechnology * Update artechnology.md removing PBS support flag. This can be added when https://github.com/prebid/prebid-server/pull/4123 is merged. --------- Co-authored-by: Victor Co-authored-by: bretg --- dev-docs/bidders/artechnology.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 dev-docs/bidders/artechnology.md diff --git a/dev-docs/bidders/artechnology.md b/dev-docs/bidders/artechnology.md new file mode 100644 index 0000000000..7cfe1258b9 --- /dev/null +++ b/dev-docs/bidders/artechnology.md @@ -0,0 +1,31 @@ +--- +layout: bidder +title: Artechnology +description: Artechnology Bidder Adapter +biddercode: artechnology +aliasCode : smarthub +usp_supported: true +coppa_supported: true +schain_supported: true +dchain_supported: true +media_types: banner, video, native +safeframes_ok: true +deals_supported: true +floors_supported: true +fpd_supported: false +pbjs: true +pbs: false +pbs_app_supported: true +multiformat_supported: true +--- + +### Prebid.js Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|---------------------------------|-------------------------------------|-----------| +| `seat` | required | Seat value | `'9Q20EdGxzgWdfPYShScl'` | `string` | +| `token` | required | Token | `'eKmw6alpP3zWQhRCe3flOpz0wpuwRFjW'` | `string` | +| `iabCat` | optional | Array of IAB content categories that describe the content producer | `['IAB1-1', 'IAB3-1', 'IAB4-3']` | `Array(String)` | +| `minBidfloor` | optional | Minimal CPM value | `0.03` | `float` | +| `pos` | optional | The position of the placement on the page, see Open RTB spec v2.5. | `4` | `number` | From 9aaf096a3746136c37c3f366bbd8a621b2cf8fcd Mon Sep 17 00:00:00 2001 From: Erik Hummel Date: Mon, 6 Jan 2025 10:18:14 -0500 Subject: [PATCH 368/816] Fix trademark typos (#5791) --- dev-docs/modules/userid-submodules/lotame.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/modules/userid-submodules/lotame.md b/dev-docs/modules/userid-submodules/lotame.md index 88e27e5039..0b03b81f7d 100644 --- a/dev-docs/modules/userid-submodules/lotame.md +++ b/dev-docs/modules/userid-submodules/lotame.md @@ -11,7 +11,7 @@ example: '"e4b9..."' [Lotame Panorama ID™](https://www.lotame.com/panorama-id/) is a pseudonymous ID that represents devices for the purposes of audience enrichment and campaign activation. It is powered by the Lotame Panorama Graph, which is built on hashed emails and browser and device data and combined with machine learning and predictive models to estimate the likelihood that a group of devices may be used by the same user or are in the same household. -Lotame’s Panorama ID™ module sends the IP address, user agent, and timestamp from the request to Lotame in order to successfully generate a Panorama IDTM. For more information on how the Panorama IDTM works, please visit [https://www.lotame.com/panorama-identity/](https://www.lotame.com/panorama-identity/). +Lotame’s Panorama ID module sends the IP address, user agent, and timestamp from the request to Lotame in order to successfully generate a Panorama ID. For more information on how the Panorama ID works, please visit [https://www.lotame.com/panorama-identity/](https://www.lotame.com/panorama-identity/). Through registering above, your organization will execute Lotame’s Panorama ID Enrollment Terms for Prebid.org. Lotame’s [Services Privacy Notice](https://www.lotame.com/privacy/privacy-notices/services/) describes the processing of personal data by Lotame. @@ -29,7 +29,7 @@ To get started, you will need to [register](https://www.cognitoforms.com/LotameS Once you sign up, you will receive an email with your client ID and instructions for implementation. -## Lotame Panorama ID™ Example +## Lotame Panorama ID Example {: .table .table-bordered .table-striped } From c607fddfdcbd36a652f675148d8ae8a66b53a806 Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 8 Jan 2025 13:39:30 -0500 Subject: [PATCH 369/816] Sustainability portal (#5789) * initial commit for sustainability * lint * split portal by type * re-titled * feedback * Update sustainability-portal.md * Update statement-on-sustainability.md * Update statement-on-sustainability.md * Update statement-on-sustainability.md --------- Co-authored-by: Stephen Johnston --- _data/sidebar.yml | 40 ++++-- overview/statement-on-sustainability.md | 36 ++++++ support/sustainability-analytics.md | 41 +++++++ support/sustainability-bidders.md | 47 +++++++ support/sustainability-portal.md | 40 ++++++ support/sustainability-publishers.md | 155 ++++++++++++++++++++++++ 6 files changed, 352 insertions(+), 7 deletions(-) create mode 100644 overview/statement-on-sustainability.md create mode 100644 support/sustainability-analytics.md create mode 100644 support/sustainability-bidders.md create mode 100644 support/sustainability-portal.md create mode 100644 support/sustainability-publishers.md diff --git a/_data/sidebar.yml b/_data/sidebar.yml index 8da383a65c..1fc6724a89 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -43,6 +43,14 @@ sectionTitle: subgroup: 0 +- sbSecId: 0 + title: Statement on Sustainability + link: /overview/statement-on-sustainability.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 0 + - sbSecId: 0 title: Developers link: /developers.html @@ -1808,6 +1816,22 @@ sectionTitle: subgroup: 0 +- sbSecId: 7 + title: FAQs + link: /faq/faq.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 0 + +- sbSecId: 7 + title: Blog + link: https://prebid.org/blog/ + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 0 + - sbSecId: 7 title: Privacy Resources link: @@ -1839,20 +1863,22 @@ subgroup: 1 - sbSecId: 7 - title: FAQs - link: /faq/faq.html - isHeader: 0 + title: Sustainability Resources + link: + isHeader: 1 + headerId: sustainability isSectionHeader: 0 sectionTitle: - subgroup: 0 + subgroup: 2 - sbSecId: 7 - title: Blog - link: https://prebid.org/blog/ + title: Sustainability Portal + link: /support/sustainability-portal.html isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 0 + subgroup: 2 + #-------------- Tools --------------| diff --git a/overview/statement-on-sustainability.md b/overview/statement-on-sustainability.md new file mode 100644 index 0000000000..6a621159f2 --- /dev/null +++ b/overview/statement-on-sustainability.md @@ -0,0 +1,36 @@ +--- +layout: page_v2 +title: Prebid Statement on Sustainability +description: Prebid Statement on Sustainability +sidebarType: 0 +--- + +# Prebid Statement on Sustainability + +Digital advertising plays a vital role in the modern economy, connecting businesses with audiences worldwide. However, this connection comes with an environmental cost - from the energy consumed by ad servers to the computational resources required for real-time bidding. As our industry continues to grow, so does our responsibility to address its environmental impact. + +Sustainability in advertising technology isn't just about reducing carbon emissions - it's about creating more efficient systems that benefit both the environment and business operations. This involves examining everything from how we handle bid requests to how we optimize our server infrastructure. While the challenges are complex, they also present opportunities for innovation and collaboration across the digital advertising ecosystem. + +## No Standard Currently + +In the absence of standardized sustainability metrics and protocols, conducting transactions through OpenRTB and similar programmatic systems presents significant challenges. The decentralized nature of programmatic advertising, where multiple parties interact through complex bid streams, makes it particularly difficult to track, measure, and optimize for environmental impact. Currently, there exists no industry standard definition of sustainability. + +This lack of standards means each participant in the supply chain - from publishers to SSPs, DSPs, and advertisers - defines and measures sustainability differently. This fragmentation creates obstacles when attempting to make informed decisions about sustainable advertising practices. For instance, one platform might focus on reducing server calls, while another prioritizes energy-efficient data centers, making it challenging to compare and evaluate partners effectively. + +## The Industry Will Evolve + +The current OpenRTB specification, while robust for traditional trading parameters, lacks standardized fields or mechanisms for communicating sustainability-related information between parties. This absence of common sustainability signals means that even environmentally conscious organizations struggle to automate and scale their green advertising initiatives within existing programmatic frameworks. + +As the digital advertising industry evolves toward more transparent and eco-friendly practices, we expect buying platforms to adopt various methodologies that will continue to evolve. In this context, Prebid.org is positioned to play an essential role in supporting the ecosystem's transition to more sustainable practices. Initially, our focus is on providing comprehensive documentation and guidance to help organizations navigate and implement emerging sustainability approaches. + +## Prebid Will Evolve Too + +This educational and supportive role will naturally evolve as industry standards take shape. When concrete sustainability standards emerge, Prebid.org will expand its involvement to include developing and maintaining specific technical implementations, adapting its open-source solutions to support standardized sustainability measures across the programmatic landscape. + +To begin this journey, we're proud to introduce the Prebid.org [Sustainability Portal](/support/sustainability-portal.html). This resource serves as a crucial first step - a central hub where members of the advertising ecosystem can access information about configuration best practices, monitoring approaches, and optimization techniques. The portal is designed to help organizations start taking meaningful action today while preparing for the standardized sustainability frameworks of tomorrow. + +The Sustainability Portal represents our commitment to supporting the ecosystem's environmental initiatives, providing practical guidance that organizations can implement now, while remaining flexible enough to adapt as industry standards develop and mature. + +## Related Reading + +- [Prebid Sustainability Portal](/support/sustainability-portal.html) diff --git a/support/sustainability-analytics.md b/support/sustainability-analytics.md new file mode 100644 index 0000000000..a2d53a1b98 --- /dev/null +++ b/support/sustainability-analytics.md @@ -0,0 +1,41 @@ +--- +layout: page_v2 +title: Analytics Sustainability Best Practices +description: Analytics Sustainability Best Practices +sidebarType: 7 +--- + +# Analytics Sustainability Best Practices +{:.no_toc} + +- TOC +{:toc} + +## Overview + +This page collects recommendations for analytics providers interested in exploring ways to save carbon emissions while preserving revenue. See the [Susta +inability Portal](/support/sustainability-portal.html) for more background. + +## Tip 1: Connection reuse + +Much like bidders, analytics adapters should reuse connections as much as possible. Enabling HTTP2/3 and bundling of events can be impactful. + +More importantly, analytics events should be buffered and sent as a group where possible. For example, don't send separate payloads for the auction event, the bid response event, the bid won event, etc. Combine them into one payload. + +## Tip 2: Reduce sent payloads + +Send only the data that you need and can process. Avoid sending long data fields that are potentially duplicate or not needed. + +Specific examples: + +- Don't send the TCF or GPP strings if you're not parsing them. Consider sending just the privacy flags needed. +- Don't send User Agent strings in the payload when they can be obtained from the HTTP header. + +## Tip: 3 Reduce response payloads + +Do not send unnecessarily verbose responses. An empty 204 response is all that is usually necessary. If you have a need for more verbose responses then consider compression. + +## Further Reading + +- [Prebid Statement on Sustainability](/overview/statement-on-sustainability.html) +- [Prebid Sustainability Portal](/support/sustainability-portal.html) diff --git a/support/sustainability-bidders.md b/support/sustainability-bidders.md new file mode 100644 index 0000000000..e4c155bb4b --- /dev/null +++ b/support/sustainability-bidders.md @@ -0,0 +1,47 @@ +--- +layout: page_v2 +title: Bidder Sustainability Best Practices +description: Bidder Sustainability Best Practices +sidebarType: 7 +--- + +# Bidder Sustainability Best Practices +{:.no_toc} + +- TOC +{:toc} + +## Overview + +This page collects recommendations for Prebid bidders (SSPs, DSPs, etc.) interested in exploring ways to save carbon emissions while preserving revenue. See the [Sustainability Portal](/support/sustainability-portal.html) for more background. + +## Tip 1: Use HTTP2/3 + +Update your endpoints to support HTTP 2 and HTTP 3. This helps because optimizing connection reuse is beneficial. The later protocols limit client side and transport resource usage and are expected to generally improve performance. + +## Tip 2: Reduce payloads + +Determine if extraneous JSON or other payload is being delivered to your endpoint. + +## Tip 3: Enable compression + +Once the required payload is determined, make sure compression is enabled on your endpoint to make the response smaller over the wire. + +## Tip 4: Reduce your adapter size + +Remove or consolidate duplicate code and consider using [the ORTB library](https://github.com/prebid/Prebid.js/blob/master/libraries/ortbConverter/README.md) if your bidder endpoint is oRTB compatible. The [Rix Bidder](https://github.com/prebid/Prebid.js/blob/master/modules/rixengineBidAdapter.js) is an example of using library and shared functions to reduce code size. + +## Tip 5: Combine requests + +Whenever possible send as many bid requests in the same network request as possible. Prebid.js supports this by default with multiple impression and multiple mediatype support. + +For example, if your endpoint currently requires separate requests for each adunit or for each mediatype, you should plan to upgrade to be able to handle richer scenarios. + +## Tip 6: Reduce response payloads + +Do not send unnecessarily verbose responses. For a 'no bid', many analytics adapters would like to receive a "no bid reason", but other than that, the response should be small. If you have a need for more verbose responses then consider compression. + +## Further Reading + +- [Prebid Statement on Sustainability](/overview/statement-on-sustainability.html) +- [Prebid Sustainability Portal](/support/sustainability-portal.html) diff --git a/support/sustainability-portal.md b/support/sustainability-portal.md new file mode 100644 index 0000000000..d4cd6821a3 --- /dev/null +++ b/support/sustainability-portal.md @@ -0,0 +1,40 @@ +--- +layout: page_v2 +title: Sustainability Portal +description: Sustainability Portal +sidebarType: 7 +--- + +# Sustainability Portal +{:.no_toc} + +- TOC +{:toc} + +## Overview + +The digital advertising industry's environmental impact continues to grow alongside its expanding role in the global economy. To address this challenge, Prebid.org established a Supply Chain & Sustainability Taskforce. + +As the industry works toward defining sustainability standards, this taskforce serves as a central resource for documentation and best practices, helping organizations align their operations with broader sustainability goals. This initiative reflects Prebid's commitment to promoting environmental responsibility while maintaining the transparency and efficiency of the digital advertising supply chain. + +This portal organizes existing Prebid documentation through the lens of sustainability, providing practical guidance for both Publishers and Tech Partners. The content is structured into two main sections, each further categorized by Prebid software components (such as Prebid.js and Prebid Server) and conceptual areas (including Analytics and Bidders). This organization allows stakeholders to easily access relevant information for their specific needs while working toward more sustainable advertising practices. + +Many of the best practices boil down to a simple philosophy: + +{: .alert.alert-success :} +Good housekeeping is good for sustainability. + +A fair amount of value can be obtained from: + +- Retaining only the bidders, modules, and identity providers that are providing value, removing those that do not. +- Upgrading Prebid more often to receive efficiency-related updates. + +## Best Practices + +- [Publisher Sustainability Best Practices](/support/sustainability-publishers.html) +- [Bid Adapter Sustainability Best Practices](/support/sustainability-bidders.html) +- [Analytics Adapter Sustainability Best Practices](/support/sustainability-analytics.html) + +## Further Reading + +- [Prebid Statement on Sustainability](/overview/statement-on-sustainability.html) diff --git a/support/sustainability-publishers.md b/support/sustainability-publishers.md new file mode 100644 index 0000000000..3fd459da61 --- /dev/null +++ b/support/sustainability-publishers.md @@ -0,0 +1,155 @@ +--- +layout: page_v2 +title: Publisher Sustainability Best Practices +description: Publisher Sustainability Best Practices +sidebarType: 7 +--- + +# Publisher Sustainability Best Practices +{:.no_toc} + +- TOC +{:toc} + +## Overview + +This page collects recommendations for Publishers interested in exploring ways to save carbon emissions while preserving revenue. See the [Sustainability Portal](/support/sustainability-portal.html) for more background. + +Regardless of the Prebid implementation, publishers seeking to improve sustainability and supply chain stance should focus on the following major areas: + +1. Work with Demand Partners that align with your sustainability goals +2. Monitor behavior to ensure those goals are met and to also discover areas of optimization particularly related to Geo and Device participation +3. Configure Prebid products with the minimum bidders and setting which meet your sustainability goals + +## General Advice + +### Tip 1: Choose bidders that meet your requirements + +When choosing bidders consider your internal requirements for HTTP2 support, adapter size, bid response time, response size, cookie loads and more. + +The docs at [https://docs.prebid.org/dev-docs/bidders.html](/dev-docs/bidders.html) contain information related to bidder feature support. + +Questions to ask bidders before enabling them: + +1. What is your average server response rate and latency? +1. Do you filter out consistently slow/non-responsive demand sources to reduce unnecessary server load and energy consumption? +1. Do you have any capability to measure and report the carbon footprint of individual demand source activities (e.g. computational resources used per bid request)? +1. What optimization strategies do you employ with your demand sources to reduce overall infrastructure demands, such as implementing intelligent throttling, bid caching, or selective bidder calls based on performance? + +## Prebid.js + +This is advice specific to Prebid.js. + +### Tip 2: Reduce build size + +Only build prebid with the bidders, modules and features that you intend to use. + +The on-site builder is available at [https://docs.prebid.org/download.html](/download.html) and instructions for building manually are in the Github repo [https://github.com/prebid/Prebid.js/blob/master/README.md\#Build](https://github.com/prebid/Prebid.js/blob/master/README.md#Build). Building manually the JavaScript object name to be defined, but is otherwise the same. + +### Tip 3: Monitor bid performance with client-side analytics + +Major areas to consider here are bid rates and participation which indicates whether the bid is meaningful. Fruitful areas to investigate first are geographic and currency support for the bidder. Consider delivering different script configurations based on Geo and Currency or using Header Bidding management providers which provide this service. + +Configure an analytics provider that can track the related areas of interest from the building and monitoring section. + +- [Analytics Adapters](/overview/analytics.html) +- [Building your own analytics adapter](/dev-docs/integrate-with-the-prebid-analytics-api.html) + +### Tip 4: Dynamically determine which bidders to use based on analytics + +Prebid.js AdUnits can be configured to call different sets of bidders and modules in different geographic areas and for different devices. Ideally, this also implies different builds for each of these combinations. If this capability is not available in-house, consider a [managed service](https://prebid.org/managed-services/) that provides automatic performance-based reconfiguration of your Prebid.js configuration. + +For example, instead of running a global Prebid.js build, consider creating separate builds for North America, Europe, APAC, or other regions important to your business. Each of those builds would be tailored to have the relevant bidders and modules. + +### Tip 5: Use Professor Prebid + +[Professor Prebid](/tools/professor-prebid.html) is a Chrome browser extension that provides setup validation, performance analysis, debugging and education about the live page behavior. Professor Prebid provides a wealth of information including: + +1. Adunits +2. Bids +3. Timeline +4. Config +5. User ID +6. User Sync +7. Version Information +8. More... + +It's a great diagnostic tool, but is limited to the current page you are viewing, so you'll still need an analytics adapter to provide comprehensive reports. + +- [Professor Prebid User Guide](/tools/professor-prebid.html) +- [Chrome Plugin](https://chromewebstore.google.com/detail/professor-prebid/kdnllijdimhbledmfdbljampcdphcbdc?pli=1) + +### Tip 6: Use Other Debug Tools + +Use the [Prebid.js debugging module](/dev-docs/modules/debugging.html) to see other available data including bidder debug and the ability to inject configuration, intercept bids and mock responses. + +### Tip 7: Check client-side syncing configuration + +Most bidders want to perform cookie syncing, which can impact page performance, and doesn't always even help monetization on all browsers. Evaluate your [cookie sync config](/dev-docs/publisher-api-reference/setConfig.html\#setConfig-Configure-User-Syncing) for each bidder to ensure it meets your requirements. + +For example, you may consider: + +- Whether it makes sense to turn off syncing in certain browsers. +- Limit certain bidders to pixel syncs which are lower impact than iframe syncs. + +You can consider using [Professor Prebid's Usersync Info](/tools/professor-prebid.html#user-sync-network-inspector) tool to investigate server-side syncs. + +## Prebid Server + +Ask your Prebid Server provider to provide guidance on how the sustainability profile of their global datacenters and traffic routing technology. + +Ideally, your provider can handle user traffic in datacenters that are local to the user. e.g. North American user requests are processed in a North American datacenter. + +Also, confirm that they regularly update Prebid Server to get the latest features. + +### Tip 8: Monitor bid performance with server-side analytics + +Watching bidder performance by geo, device, and channel can help you decide how to set up the adunits. Channel is "Prebid.js", "SDK", "AMP", etc -- any traffic source supported by Prebid Server. Ask your Prebid Server provider which analytics systems they can support. + +### Tip 9: Determine whether it makes sense to run Prebid.js bidders server-side + +If you're using Prebid.js, we recommend use of the [Server-to-Server Testing Module](/dev-docs/modules/s2sTesting.html) to determine which bidders can be run on the server side. + +If your Prebid Server provider has energy-efficient datacenters, then it may make sense to explore running as many bidders as possible server-side. This can help you focus traffic to network connections powered by more sustainable energy sources than what end-users may be consuming. + +### Tip 10: Disable bidders by datacenter + +Ask your Prebid Server provider whether they're utilizing bidder self-declared "Geographic Scope". +Several bidders have declared the regions in which they do business, so utilizing this information +can help everyone save money and carbon emissions. + +GeoScope examples + +- [Global](https://github.com/prebid/prebid-server/blob/master/static/bidder-info/adf.yaml) +- [US & CAN](https://github.com/prebid/prebid-server/blob/master/static/bidder-info/imds.yaml) + +### Tip 11: Optimize server-side syncing + +Ask your Prebid Server provider to confirm how they've set up cookie-syncing and whether they support setting: + +- account-specific sync priority +- account-specific sync limits +- cooperative syncing + +See the relevant documentation for [PBS-Java](https://github.com/prebid/prebid-server-java/blob/master/docs/application-settings.md) and [PBS-Go](https://github.com/prebid/prebid-server/blob/master/config/usersync.go). + +You can consider using [Professor Prebid's Usersync Info](/tools/professor-prebid.html#user-sync-network-inspector) tool to investigate server-side syncs. + +## Identity Modules + +### Tip 12: Minimize the number of Extended IDs + +Some Extended IDs (aka EIDs) are still experimental. The Prebid community tests some EIDs, but conclusions are often difficult to draw. Until we have more conclusive evidence on which EIDs are the most helpful for monetization, we encourage publishers to continue their own tests, which often means testing a dozen or more EIDs. You should monitor and reconfigure as value is proven (or not) with your properties. + +See the [Prebid Identity Overview](/identity/prebid-identity.html) + +## Prebid Mobile + +Prebid Mobile uses Prebid Server, so the recommendations above are relevant. + +There are no recommendations specific to Prebid SDK at this time. + +## Further Reading + +- [Prebid Statement on Sustainability](/overview/statement-on-sustainability.html) +- [Prebid Sustainability Portal](/support/sustainability-portal.html) From d90b1a1901873fa52125f718d993d0993d03e162 Mon Sep 17 00:00:00 2001 From: Denis Logachov Date: Thu, 9 Jan 2025 15:19:53 +0200 Subject: [PATCH 370/816] Adkernel: documenting UrekaMedia alias (#5790) * Adkernel: documenting UrekaMedia alias * Update urekamedia.md --- dev-docs/bidders/urekamedia.md | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 dev-docs/bidders/urekamedia.md diff --git a/dev-docs/bidders/urekamedia.md b/dev-docs/bidders/urekamedia.md new file mode 100644 index 0000000000..33a96a1f48 --- /dev/null +++ b/dev-docs/bidders/urekamedia.md @@ -0,0 +1,36 @@ +--- +layout: bidder +title: UrekaMedia +description: UrekaMedia Bidder Adaptor +biddercode: urekamedia +pbjs: true +pbs: false +media_types: banner, native, video +gvl_id: 14 (adkernel) +tcfeu_supported: true +usp_supported: true +coppa_supported: true +gpp_supported: true +pbs_app_supported: true +schain_supported: true +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel +sidebarType: 1 +--- + +### Note + +The UrekaMedia bidding adapter requires setup and approval before implementation. Please reach out to for more details. + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|----------|----------|-----------------------|---------------------------|----------| +| `host` | required | Host | `'cpm.upremium.asia'` | `string` | +| `zoneId` | required | Zone Id | `30164` | `integer` | From ae0d1f76b066b422d55469ed785eb4ef457091cb Mon Sep 17 00:00:00 2001 From: Roger <104763658+rogerDyl@users.noreply.github.com> Date: Thu, 9 Jan 2025 15:19:19 +0100 Subject: [PATCH 371/816] Akcelo bid adapter documentation (#5778) * Add Akcelo bid adapter documentation * Fix first party data table * Add 'test' parameter in example * Add 'test' parameter default value * Apply PR comments --- dev-docs/bidders/akcelo.md | 119 +++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 dev-docs/bidders/akcelo.md diff --git a/dev-docs/bidders/akcelo.md b/dev-docs/bidders/akcelo.md new file mode 100644 index 0000000000..7072e54fee --- /dev/null +++ b/dev-docs/bidders/akcelo.md @@ -0,0 +1,119 @@ +--- +layout: bidder +title: Akcelo +description: Prebid Akcelo Bidder Adapter +biddercode: akcelo +pbjs: true +pbs: false +gvl_id: none +tcfeu_supported: false +usp_supported: false +userIds: all +media_types: banner, native, video +coppa_supported: false +schain_supported: true +dchain_supported: false +safeframes_ok: true +deals_supported: false +floors_supported: true +fpd_supported: true +ortb_blocking_supported: false +multiformat_supported: will-bid-on-any +privacy_sandbox: no +sidebarType: 1 +--- + +### Registration + +The Akcelo bidder adapter requires setup and approval from the Akcelo service team. +Please reach out to your account manager or for more information. + +### Bid params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|------------|----------|--------------------------------------------------------------------------|---------|-----------| +| `siteId` | required | The identifier of the site. Will be provided by your account manager. | `763` | `integer` | +| `adUnitId` | required | The identifier of the ad unit. Will be provided by your account manager. | `7965` | `integer` | +| `test` | optional | Whether to display test creatives or not. Default is 0. | `1` | `integer` | + +### Configuration Example + +```html + + +``` + +### User Sync + +Akcelo strongly recommends enabling user syncing through iFrames. This functionality +improves DSP user match rates and increases the bid rate and bid price. + +```js +// https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html#setConfig-Configure-User-Syncing +pbjs.setConfig({ + userSync: { + filterSettings: { + iframe: { + bidders: ['akcelo'], + filter: 'include', + }, + }, + }, +}); +``` + +### First Party Data + +Akcelo supports both `ortb2` and `ortb2Imp` methods to set [First Party Data](/features/firstPartyData.html). + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------------------|----------|-------------------------------------------------------------------------------------------------|-------------------|----------------| +| `ortb2.site` | optional | Information about the publisher's website provided through an OpenRTB Site object. | N/A | `object` | +| `ortb2.user` | optional | Information about the advertising device's human user, provided through an OpenRTB User object. | N/A | `object` | +| `ortb2.device` | optional | Information about the user's device provided through an OpenRTB device object. | N/A | `object` | From 3b430d995f5554c25932d0433d99f9bbe3c9913b Mon Sep 17 00:00:00 2001 From: "Romain N." <148577486+rneuplanche@users.noreply.github.com> Date: Thu, 9 Jan 2025 16:57:04 +0100 Subject: [PATCH 372/816] Equativ: multiformat_supported, will-bid-on-any (#5762) * multiformat_supported: will-bid-on-any * Add support in doc * All properties * Feedback from the team --- dev-docs/bidders/smartadserver.md | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/dev-docs/bidders/smartadserver.md b/dev-docs/bidders/smartadserver.md index 72491f676c..3d6072aab4 100644 --- a/dev-docs/bidders/smartadserver.md +++ b/dev-docs/bidders/smartadserver.md @@ -3,17 +3,30 @@ layout: bidder title: Smart AdServer description: Prebid Smart AdServer Bidder Adapter biddercode: smartadserver -media_types: display, video, native +media_types: display, video, native, audio tcfeu_supported: true gvl_id: 45 tcfeu_supported: true +multiformat_supported: will-bid-on-any +coppa_supported: true gpp_supported: true +gpp_sids: tcfca, tcfeu, usnat, usstate_all, usp schain_supported: true +dchain_supported: false usp_supported: true +fpd_supported: true +dsa_supported: true +deals_supported: true +safeframes_ok: true userIds: all pbjs: true pbs: true +pbs_app_supported: true +prebid_member: false floors_supported: true +ortb_blocking_supported: true +aliasCode: equativ +privacy_sandbox: no sidebarType: 1 --- @@ -58,6 +71,7 @@ The Smart AdServer bidder adapter requires setup and approval from the Equativ ( |---|---| | `banner` | Supported | | `video` | Supported | +| `audio` | Supported | | `native` | Not currently supported | ### Supported Media Types (Prebid Server) @@ -67,8 +81,12 @@ The Smart AdServer bidder adapter requires setup and approval from the Equativ ( |------|-------| | `banner` | Supported | | `video` | Supported | +| `audio` | Supported | | `native` | Supported | +### Coppa support +Coppa is supported by our prebid server adapter but not by our prebid.js adapter. + ### Examples Without site/page/format: @@ -109,10 +127,10 @@ With site/page/format: }, "ext": { "smartadserver": { - "networkId": 73 - "siteId": 1, - "pageId": 2, - "formatId": 3 + "networkId": 73, + "siteId": 1, + "pageId": 2, + "formatId": 3 } } }] From fc5848a1b3f20287d6b7615455fd4ce99ad656e4 Mon Sep 17 00:00:00 2001 From: nachinius Date: Thu, 9 Jan 2025 19:03:57 +0100 Subject: [PATCH 373/816] Add `sharethrough` to the docs (#5797) --- dev-docs/modules/userid-submodules/liveintent.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dev-docs/modules/userid-submodules/liveintent.md b/dev-docs/modules/userid-submodules/liveintent.md index cd769a2167..52d3fbfa84 100644 --- a/dev-docs/modules/userid-submodules/liveintent.md +++ b/dev-docs/modules/userid-submodules/liveintent.md @@ -101,7 +101,7 @@ pbjs.setConfig({ ### Multiple user IDs -The attributes `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk`, `vidazoo` and `fpid` are treated specially by LiveIntent's user ID sub-module. Each of these attributes will result in a separate ID returned by the sub-module. Note: `thetradedesk` will be exposed as `tdid` because of historical reasons. +The attributes `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sharethrough`, `sovrn`, `index`, `thetradedesk`, `vidazoo` and `fpid` are treated specially by LiveIntent's user ID sub-module. Each of these attributes will result in a separate ID returned by the sub-module. Note: `thetradedesk` will be exposed as `tdid` because of historical reasons. For example, in case `uid2` is configured to be requested in addition to the `nonID`, the `request.userId` object would look like the following: @@ -119,9 +119,9 @@ For example, in case `uid2` is configured to be requested in addition to the `no } ``` -NOTE: `uid2` is exposed as part of `lipb` as well as separately as `uid2`. `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk` (as `tdid`), `vidazoo` and `fpid` behave the same way. +NOTE: `uid2` is exposed as part of `lipb` as well as separately as `uid2`. `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk` (as `tdid`), `sharethrough`, `vidazoo` and `fpid` behave the same way. -For the attributes `lipbid` (nonID), `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk` (`tdid`), `vidazoo` and `fpid` there is also support for their conversion into OpenRTB EIDS format. Please refer to [User ID Module](../userId.md) documentation for more information on conversion, and [Example of eids array generated by UserId Module](https://github.com/prebid/Prebid.js/blob/master/modules/userId/eids.md) for output format examples. +For the attributes `lipbid` (nonID), `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk` (`tdid`), `sharethrough`, `vidazoo` and `fpid` there is also support for their conversion into OpenRTB EIDS format. Please refer to [User ID Module](../userId.md) documentation for more information on conversion, and [Example of eids array generated by UserId Module](https://github.com/prebid/Prebid.js/blob/master/modules/userId/eids.md) for output format examples. ### FPID @@ -204,7 +204,7 @@ NOTE: For optimal performance, the LiveIntent ID sub-module should be called at | params.ajaxTimeout |Optional| Number |This configuration parameter defines the maximum duration of a call to the `IdentityResolution` endpoint. By default, 5000 milliseconds.|`5000`| | 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 and additional attributes.|`['my-id']`| -| params.requestedAttributesOverrides | Optional | Object | Object containing booleans used to override the default resolution. Attributes set to `true` will be added to the resolved list, while attributes set to `false` will be removed. Valid attributes are `nonId`, `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk` (`tdid`), `vidazoo` and `fpid`. | `{'uid2': true}` | +| params.requestedAttributesOverrides | Optional | Object | Object containing booleans used to override the default resolution. Attributes set to `true` will be added to the resolved list, while attributes set to `false` will be removed. Valid attributes are `nonId`, `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk` (`tdid`), `sharethrough`, `vidazoo` and `fpid`. | `{'uid2': true}` | | params.emailHash |Optional| String |The hashed email address of a user. We can accept the hashes, which use the following hashing algorithms: md5, sha1, sha2.|`1a79a4d60de6718e8e5b326e338ae533`| | params.url | Optional| String |Use this to change the default endpoint URL if you can call the LiveIntent Identity Exchange within your own domain.|`https://idx.my-domain.com`| | params.liCollectConfig |Optional| Object |Container of all collector params.|| From 5feed16cd563199143c9de7b236b9c1dcc271a68 Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 9 Jan 2025 14:36:24 -0500 Subject: [PATCH 374/816] Update prebid-server-overview.md (#5798) * Update prebid-server-overview.md attempting to address a basic question we had received a while back by adding some more high level words * Update prebid-server-overview.md --- prebid-server/overview/prebid-server-overview.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/prebid-server/overview/prebid-server-overview.md b/prebid-server/overview/prebid-server-overview.md index 1cb34d1842..c73e0b9912 100644 --- a/prebid-server/overview/prebid-server-overview.md +++ b/prebid-server/overview/prebid-server-overview.md @@ -18,7 +18,7 @@ Prebid Server is a header bidding server with a growing list of features. At a h 1. Resolves dynamic 'stored requests', enriching data server-side 1. Enforces privacy regulations 2. Next, it calls server-side bid adapters - 1. There are 180+ server-side bid adapters available + 1. There are 230+ server-side bid adapters available 3. After everyone's responded (or the timeout period has expired), it formulates an appropriate response 1. Currency conversion 1. Quantizes bids as needed for header bidding targeting @@ -40,15 +40,22 @@ Further Reading: - [Transcript of this video overview](/prebid-server/overview/prebid-server-overview-video.html) +## Who can Run a Prebid Server? + +There are 2 common scenarios for using Prebid Server: + +1. Tech-savvy publishers: website providers who are excellent with technical infrastructure. +2. Managed service providers: for everyone else. + ## Where to Run Prebid Server -Unlike Prebid.js, Prebid Server is a server. It needs somewhere to run, and that somewhere ought to be scalable, distributed, and fast. +Unlike Prebid.js, Prebid Server is a server. It needs somewhere to run, and that somewhere ought to be scalable, distributed, and fast. It also needs a process for updating configurations for stored requests and modules. There are no configuration tools provided by the open source community. ### Hosted The simplest route to working with Prebid Server is to sign up for a hosted solution. Several [Prebid.org members](https://prebid.org/product-suite/managed-services/) host up-to-date server software with a global footprint, and provide tools to manage stored requests. -### DIY +### Do-It-Youself But of course this is open source, so you're welcome to do this on your own. If you'd like to explore implementing your own Prebid Server solution, check out the [Prebid Server host company overview](/prebid-server/hosting/pbs-hosting.html). Be warned that installing PBS is not nearly as easy as Prebid.js. From 29130b42da2a09f526684f2fcbe6b76c6a4a152d Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 9 Jan 2025 15:13:31 -0500 Subject: [PATCH 375/816] fixing TOC (#5799) * fixing TOC * lint --- dev-docs/modules/1plusXRtdProvider.md | 1 - dev-docs/modules/51DegreesRtdProvider.md | 1 - dev-docs/modules/aaxBlockmeterRtdProvider.md | 1 - dev-docs/modules/adpod.md | 1 - dev-docs/modules/airgridRtdProvider.md | 3 +-- dev-docs/modules/anPspParamsConverter.md | 1 - dev-docs/modules/arcspanRtdProvider.md | 1 - dev-docs/modules/bidViewable.md | 1 - dev-docs/modules/bidViewableIO.md | 1 - dev-docs/modules/blueconicRtdProvider.md | 1 - dev-docs/modules/brandmetricsRtdProvider.md | 1 - dev-docs/modules/browsiRtdProvider.md | 1 - dev-docs/modules/captifyRtdProvider.md | 3 +-- dev-docs/modules/categoryTranslation.md | 1 - dev-docs/modules/currency.md | 6 +++--- dev-docs/modules/dgkeywordRtdProvider.md | 1 - dev-docs/modules/dsaControl.md | 2 +- dev-docs/modules/freewheel.md | 2 -- dev-docs/modules/geoedgeRtdProvider.md | 1 - dev-docs/modules/gpt-pre-auction.md | 1 - dev-docs/modules/greenbidsRtdProvider.md | 1 - dev-docs/modules/growthCodeRtdProvider.md | 1 - dev-docs/modules/hadronRtdProvider.md | 1 - dev-docs/modules/humansecurityRtdProvider.md | 1 - dev-docs/modules/idLibrary.md | 2 -- dev-docs/modules/imRtdProvider.md | 1 - dev-docs/modules/instreamTracking.md | 1 - dev-docs/modules/intersectionRtdProvider.md | 1 - dev-docs/modules/jwplayerRtdProvider.md | 1 - dev-docs/modules/konduit.md | 2 -- dev-docs/modules/mass.md | 1 - dev-docs/modules/medianetRtdProvider.md | 1 - dev-docs/modules/mgidRtdProvider.md | 1 - dev-docs/modules/multibid.md | 1 - dev-docs/modules/oneKeyRtdProvider.md | 1 - dev-docs/modules/permutiveRtdProvider.md | 1 - dev-docs/modules/pubCommonId.md | 2 -- dev-docs/modules/pubxaiRtdProvider.md | 1 - dev-docs/modules/qortexRtdProvider.md | 1 - dev-docs/modules/reconciliationRtdProvider.md | 1 - dev-docs/modules/schain.md | 1 - dev-docs/modules/sizeMapping.md | 1 - dev-docs/modules/sizeMappingV2.md | 1 - dev-docs/modules/weboramaRtdProvider.md | 1 - 44 files changed, 6 insertions(+), 52 deletions(-) diff --git a/dev-docs/modules/1plusXRtdProvider.md b/dev-docs/modules/1plusXRtdProvider.md index 70c2f215c5..de13dc775c 100644 --- a/dev-docs/modules/1plusXRtdProvider.md +++ b/dev-docs/modules/1plusXRtdProvider.md @@ -12,7 +12,6 @@ sidebarType : 1 --- # 1plusX RTD Module - {:.no_toc} * TOC diff --git a/dev-docs/modules/51DegreesRtdProvider.md b/dev-docs/modules/51DegreesRtdProvider.md index 7a554689dd..1fbf70bdf9 100644 --- a/dev-docs/modules/51DegreesRtdProvider.md +++ b/dev-docs/modules/51DegreesRtdProvider.md @@ -18,7 +18,6 @@ This module loads a dynamically generated JavaScript from Cloud API hosted at cl The Cloud API is **free** to integrate and use. To increase limits please check [51Degrees pricing](https://51degrees.com/pricing). # 51Degrees RTD Submodule - {:.no_toc} * TOC diff --git a/dev-docs/modules/aaxBlockmeterRtdProvider.md b/dev-docs/modules/aaxBlockmeterRtdProvider.md index 0b3b3bdd29..3ddb248566 100644 --- a/dev-docs/modules/aaxBlockmeterRtdProvider.md +++ b/dev-docs/modules/aaxBlockmeterRtdProvider.md @@ -12,7 +12,6 @@ sidebarType : 1 --- # AAX Blockmeter Realtime Data Module - {:.no_toc} * TOC diff --git a/dev-docs/modules/adpod.md b/dev-docs/modules/adpod.md index c57c14149c..9e173e4f4e 100644 --- a/dev-docs/modules/adpod.md +++ b/dev-docs/modules/adpod.md @@ -10,7 +10,6 @@ sidebarType : 1 --- # Adpod Module - {:.no_toc} * TOC diff --git a/dev-docs/modules/airgridRtdProvider.md b/dev-docs/modules/airgridRtdProvider.md index 836439812d..3e06e61d00 100644 --- a/dev-docs/modules/airgridRtdProvider.md +++ b/dev-docs/modules/airgridRtdProvider.md @@ -12,6 +12,7 @@ sidebarType : 1 --- # AirGrid RTD Provider +{:.no_toc} AirGrid is a privacy-first, cookie-less audience platform. Designed to help publishers increase inventory yield, whilst providing audience signal to buyers in the bid request, without exposing raw user level data to any party. @@ -19,8 +20,6 @@ whilst providing audience signal to buyers in the bid request, without exposing This real-time data module provides quality first-party data, contextual data, site-level data and more that is injected into bid request objects destined for different bidders in order to optimize targeting. -{:.no_toc} - * TOC {:toc} diff --git a/dev-docs/modules/anPspParamsConverter.md b/dev-docs/modules/anPspParamsConverter.md index 876f29be4e..a575408ac3 100644 --- a/dev-docs/modules/anPspParamsConverter.md +++ b/dev-docs/modules/anPspParamsConverter.md @@ -10,7 +10,6 @@ sidebarType : 1 --- # anPspParamsConverter Module - {:.no_toc} This module is a temporary measure for publishers running Prebid.js 9.0+ and using the AppNexus PSP endpoint through their Prebid.js setup. Please ensure to include this module in your builds of Prebid.js 9.0+, otherwise requests to PSP may not complete successfully. diff --git a/dev-docs/modules/arcspanRtdProvider.md b/dev-docs/modules/arcspanRtdProvider.md index ce1aecb4f9..5f90e986b3 100644 --- a/dev-docs/modules/arcspanRtdProvider.md +++ b/dev-docs/modules/arcspanRtdProvider.md @@ -12,7 +12,6 @@ sidebarType : 1 --- # ArcSpan RTD Module - {:.no_toc} * TOC diff --git a/dev-docs/modules/bidViewable.md b/dev-docs/modules/bidViewable.md index 5e4f390e6c..78fcb4285c 100644 --- a/dev-docs/modules/bidViewable.md +++ b/dev-docs/modules/bidViewable.md @@ -11,7 +11,6 @@ sidebarType : 1 --- # Bid Viewability - GAM - {:.no_toc} - TOC diff --git a/dev-docs/modules/bidViewableIO.md b/dev-docs/modules/bidViewableIO.md index 73998041bf..0d7ecc1ea7 100644 --- a/dev-docs/modules/bidViewableIO.md +++ b/dev-docs/modules/bidViewableIO.md @@ -10,7 +10,6 @@ sidebarType : 1 --- # Bid Viewability - Ad Server Independent - {:.no_toc} - TOC diff --git a/dev-docs/modules/blueconicRtdProvider.md b/dev-docs/modules/blueconicRtdProvider.md index 83772d4842..a419c0da36 100644 --- a/dev-docs/modules/blueconicRtdProvider.md +++ b/dev-docs/modules/blueconicRtdProvider.md @@ -13,7 +13,6 @@ sidebarType : 1 --- # BlueConic Real-time Data Submodule - {:.no_toc} * TOC diff --git a/dev-docs/modules/brandmetricsRtdProvider.md b/dev-docs/modules/brandmetricsRtdProvider.md index ec904b3d20..adfcbc32ad 100644 --- a/dev-docs/modules/brandmetricsRtdProvider.md +++ b/dev-docs/modules/brandmetricsRtdProvider.md @@ -12,7 +12,6 @@ sidebarType : 1 --- # brandmetrics Real Time Data Provider Module - {:.no_toc} * TOC diff --git a/dev-docs/modules/browsiRtdProvider.md b/dev-docs/modules/browsiRtdProvider.md index e0b7866a43..58548ed797 100644 --- a/dev-docs/modules/browsiRtdProvider.md +++ b/dev-docs/modules/browsiRtdProvider.md @@ -12,7 +12,6 @@ sidebarType : 1 --- # Browsi Viewability Module - {:.no_toc} * TOC diff --git a/dev-docs/modules/captifyRtdProvider.md b/dev-docs/modules/captifyRtdProvider.md index e7c0e634e1..c831417c16 100644 --- a/dev-docs/modules/captifyRtdProvider.md +++ b/dev-docs/modules/captifyRtdProvider.md @@ -12,7 +12,6 @@ sidebarType : 1 --- # Captify RTD Module - {:.no_toc} * TOC @@ -73,4 +72,4 @@ pbjs.setConfig({ | `params` | Object | | | | | `params.pubId` | Integer | Partner ID, required to get results and provided by Captify | yes | Use `123456` for tests, speak to your Captify account manager to receive your pubId | | `params.bidders` | Array | List of bidders for which you would like data to be set | yes | Currently only 'appnexus' supported | -| `params.url` | String | Captify live-classification service url | no | Defaults to `https://live-classification.cpx.to/prebid-segments` +| `params.url` | String | Captify live-classification service url | no | Defaults to `https://live-classification.cpx.to/prebid-segments` | diff --git a/dev-docs/modules/categoryTranslation.md b/dev-docs/modules/categoryTranslation.md index cce5640b06..aaa01b8d8b 100644 --- a/dev-docs/modules/categoryTranslation.md +++ b/dev-docs/modules/categoryTranslation.md @@ -10,7 +10,6 @@ sidebarType : 1 --- # IAB Category Translation - {:.no_toc} This module converts the IAB sub category to Ad server industry group identifiers. The identifiers ensure competitive separation of industries and products. diff --git a/dev-docs/modules/currency.md b/dev-docs/modules/currency.md index 51358c93d2..6aa8580a9e 100644 --- a/dev-docs/modules/currency.md +++ b/dev-docs/modules/currency.md @@ -10,12 +10,12 @@ sidebarType : 1 --- - - # Currency Module - {:.no_toc} +* TOC +{:toc} + This module supports the conversion of multiple bidder currencies into a single currency used by the publisher's ad server. In previous versions of Prebid, this was accomplished by using [BidderSettings.bidCpmAdjustment]({{site.baseurl}}/dev-docs/publisher-api-reference/bidderSettings.html), but that's a static value not changed except when diff --git a/dev-docs/modules/dgkeywordRtdProvider.md b/dev-docs/modules/dgkeywordRtdProvider.md index 60f06a4972..b6c0959edc 100644 --- a/dev-docs/modules/dgkeywordRtdProvider.md +++ b/dev-docs/modules/dgkeywordRtdProvider.md @@ -12,7 +12,6 @@ sidebarType : 1 --- # Digital Garage Keyword Module - {:.no_toc} * TOC diff --git a/dev-docs/modules/dsaControl.md b/dev-docs/modules/dsaControl.md index b5d01d10bc..7df4d686d9 100644 --- a/dev-docs/modules/dsaControl.md +++ b/dev-docs/modules/dsaControl.md @@ -13,7 +13,7 @@ sidebarType : 1 {:.no_toc} * TOC - {:toc} +{:toc} ## Overview diff --git a/dev-docs/modules/freewheel.md b/dev-docs/modules/freewheel.md index de8b6a0571..c6a4308360 100644 --- a/dev-docs/modules/freewheel.md +++ b/dev-docs/modules/freewheel.md @@ -12,8 +12,6 @@ sidebarType : 1 # Freewheel Module -{:.no_toc} - This module returns the targeting key value pairs for the FreeWheel ad server. ## How to use the module diff --git a/dev-docs/modules/geoedgeRtdProvider.md b/dev-docs/modules/geoedgeRtdProvider.md index 6bae377267..9593e8772c 100644 --- a/dev-docs/modules/geoedgeRtdProvider.md +++ b/dev-docs/modules/geoedgeRtdProvider.md @@ -12,7 +12,6 @@ sidebarType : 1 --- # Geoedge Realtime Module - {:.no_toc} * TOC diff --git a/dev-docs/modules/gpt-pre-auction.md b/dev-docs/modules/gpt-pre-auction.md index a35a8af71c..cab3e3489b 100644 --- a/dev-docs/modules/gpt-pre-auction.md +++ b/dev-docs/modules/gpt-pre-auction.md @@ -12,7 +12,6 @@ sidebarType : 1 --- # GPT Pre-Auction Module - {:.no_toc} * TOC diff --git a/dev-docs/modules/greenbidsRtdProvider.md b/dev-docs/modules/greenbidsRtdProvider.md index c45bbbec54..eb9ab80a9e 100644 --- a/dev-docs/modules/greenbidsRtdProvider.md +++ b/dev-docs/modules/greenbidsRtdProvider.md @@ -12,7 +12,6 @@ sidebarType : 1 --- # Greenbids Realtime Module - {:.no_toc} * TOC diff --git a/dev-docs/modules/growthCodeRtdProvider.md b/dev-docs/modules/growthCodeRtdProvider.md index 161f654780..b31397709c 100644 --- a/dev-docs/modules/growthCodeRtdProvider.md +++ b/dev-docs/modules/growthCodeRtdProvider.md @@ -12,7 +12,6 @@ sidebarType : 1 --- # GrowthCode Real-time Data Submodule - {:.no_toc} * TOC diff --git a/dev-docs/modules/hadronRtdProvider.md b/dev-docs/modules/hadronRtdProvider.md index 7e54c02e89..6f3149fbea 100644 --- a/dev-docs/modules/hadronRtdProvider.md +++ b/dev-docs/modules/hadronRtdProvider.md @@ -12,7 +12,6 @@ sidebarType : 1 --- # Audigent Hadron Real-time Data Submodule - {:.no_toc} * TOC diff --git a/dev-docs/modules/humansecurityRtdProvider.md b/dev-docs/modules/humansecurityRtdProvider.md index b13f4f09a7..93b1b35ea9 100644 --- a/dev-docs/modules/humansecurityRtdProvider.md +++ b/dev-docs/modules/humansecurityRtdProvider.md @@ -12,7 +12,6 @@ sidebarType : 1 --- # HUMAN Security Real-time Data Submodule - {:.no_toc} * TOC diff --git a/dev-docs/modules/idLibrary.md b/dev-docs/modules/idLibrary.md index 730cfde505..f8654e6c44 100644 --- a/dev-docs/modules/idLibrary.md +++ b/dev-docs/modules/idLibrary.md @@ -14,8 +14,6 @@ Maintainer: eng-dmp@magnite.com # ID Import Library -{:.no_toc} - The ID Import Library module gathers and generates a map of identities present on the page. The primary usecase for this adapter is for Publishers who have included multiple UserId subadapters in their prebid.js implementation, and want to store the resulting user ids serverside for modeling or graphing purposes. The ID Library module, anchors the response of `refreshUserIds()` to a persistant identifier (md5 encrypted) and returns an map of uids. This map of uids comes in the form of a POST message in JSON format and must be output to a publisher configured endpoint. The module attempts to extract a persistant identifier in the following ways: diff --git a/dev-docs/modules/imRtdProvider.md b/dev-docs/modules/imRtdProvider.md index 0173f7974e..8a3a32e976 100644 --- a/dev-docs/modules/imRtdProvider.md +++ b/dev-docs/modules/imRtdProvider.md @@ -11,7 +11,6 @@ sidebarType : 1 --- # Intimate Merger Real time Data Provider - {:.no_toc} * TOC diff --git a/dev-docs/modules/instreamTracking.md b/dev-docs/modules/instreamTracking.md index c0bbe124ed..7e9528a77f 100644 --- a/dev-docs/modules/instreamTracking.md +++ b/dev-docs/modules/instreamTracking.md @@ -10,7 +10,6 @@ sidebarType : 1 --- # Instream Video Ads Tracking - {:.no_toc} * TOC diff --git a/dev-docs/modules/intersectionRtdProvider.md b/dev-docs/modules/intersectionRtdProvider.md index a7d5d69ea0..cba5bed852 100644 --- a/dev-docs/modules/intersectionRtdProvider.md +++ b/dev-docs/modules/intersectionRtdProvider.md @@ -11,7 +11,6 @@ sidebarType : 1 --- # Intersection Module - {:.no_toc} * TOC diff --git a/dev-docs/modules/jwplayerRtdProvider.md b/dev-docs/modules/jwplayerRtdProvider.md index 7b973cdbef..743641a027 100644 --- a/dev-docs/modules/jwplayerRtdProvider.md +++ b/dev-docs/modules/jwplayerRtdProvider.md @@ -12,7 +12,6 @@ sidebarType : 1 --- # JW Player RTD Provider - {:.no_toc} * TOC diff --git a/dev-docs/modules/konduit.md b/dev-docs/modules/konduit.md index 720ce52d48..3d532a66ae 100644 --- a/dev-docs/modules/konduit.md +++ b/dev-docs/modules/konduit.md @@ -12,8 +12,6 @@ sidebarType : 1 # Konduit Accelerate Module -{:.no_toc} - The Konduit Accelerate module applies the [Konduit](https://konduitvideo.com/) video acceleration optimization to a publisher’s existing Prebid setup. This optimization provides publishers with tools to monetize previously lost revenue and drive higher fill rates on their video inventory. To install the module, follow these instructions: diff --git a/dev-docs/modules/mass.md b/dev-docs/modules/mass.md index 6515d3e2d8..0ff3088684 100644 --- a/dev-docs/modules/mass.md +++ b/dev-docs/modules/mass.md @@ -10,7 +10,6 @@ sidebarType : 1 --- # MASS Module - {:.no_toc} * TOC diff --git a/dev-docs/modules/medianetRtdProvider.md b/dev-docs/modules/medianetRtdProvider.md index 2576d8af7a..ea235343ee 100644 --- a/dev-docs/modules/medianetRtdProvider.md +++ b/dev-docs/modules/medianetRtdProvider.md @@ -12,7 +12,6 @@ sidebarType : 1 --- # Media.net Realtime Module - {:.no_toc} * TOC diff --git a/dev-docs/modules/mgidRtdProvider.md b/dev-docs/modules/mgidRtdProvider.md index 547de867f8..59516d6dcf 100644 --- a/dev-docs/modules/mgidRtdProvider.md +++ b/dev-docs/modules/mgidRtdProvider.md @@ -12,7 +12,6 @@ sidebarType : 1 --- # Mgid Realtime Module - {:.no_toc} * TOC diff --git a/dev-docs/modules/multibid.md b/dev-docs/modules/multibid.md index 8a463451ef..ea22fe26f6 100644 --- a/dev-docs/modules/multibid.md +++ b/dev-docs/modules/multibid.md @@ -10,7 +10,6 @@ sidebarType : 1 --- # MultiBid Module - {:.no_toc} * TOC diff --git a/dev-docs/modules/oneKeyRtdProvider.md b/dev-docs/modules/oneKeyRtdProvider.md index 6ab216354a..650c5dfb7d 100644 --- a/dev-docs/modules/oneKeyRtdProvider.md +++ b/dev-docs/modules/oneKeyRtdProvider.md @@ -12,7 +12,6 @@ sidebarType : 1 --- # OneKey Data Provider - {:.no_toc} * TOC diff --git a/dev-docs/modules/permutiveRtdProvider.md b/dev-docs/modules/permutiveRtdProvider.md index 984ff6ccbf..cdce9f2893 100644 --- a/dev-docs/modules/permutiveRtdProvider.md +++ b/dev-docs/modules/permutiveRtdProvider.md @@ -12,7 +12,6 @@ sidebarType : 1 --- # Permutive RTD Provider - {:.no_toc} * TOC diff --git a/dev-docs/modules/pubCommonId.md b/dev-docs/modules/pubCommonId.md index 80f706b182..461580f3ef 100644 --- a/dev-docs/modules/pubCommonId.md +++ b/dev-docs/modules/pubCommonId.md @@ -13,8 +13,6 @@ sidebarType : 1 # Publisher Common ID Module -{:.no_toc} - This module stores a unique user id in the first party domain and makes it accessible to all adapters. Similar to IDFA and AAID, this is a simple UUID that can be utilized to improve user matching, especially for iOS and MacOS browsers, and is compatible with ITP (Intelligent Tracking Prevention). It's lightweight and self contained. Adapters that support Publisher Common ID will be able to pick up the user ID and return it for additional server-side cross device tracking. ## Page integration diff --git a/dev-docs/modules/pubxaiRtdProvider.md b/dev-docs/modules/pubxaiRtdProvider.md index f94758a106..070e086d86 100644 --- a/dev-docs/modules/pubxaiRtdProvider.md +++ b/dev-docs/modules/pubxaiRtdProvider.md @@ -12,7 +12,6 @@ sidebarType: 1 --- # Pubx.ai RTD Module - {:.no_toc} * TOC diff --git a/dev-docs/modules/qortexRtdProvider.md b/dev-docs/modules/qortexRtdProvider.md index 5d2edf5e58..d259880c05 100644 --- a/dev-docs/modules/qortexRtdProvider.md +++ b/dev-docs/modules/qortexRtdProvider.md @@ -12,7 +12,6 @@ sidebarType : 1 --- # Qortex Real-time Data Submodule - {:.no_toc} * TOC diff --git a/dev-docs/modules/reconciliationRtdProvider.md b/dev-docs/modules/reconciliationRtdProvider.md index c85eb2436c..84192f4120 100644 --- a/dev-docs/modules/reconciliationRtdProvider.md +++ b/dev-docs/modules/reconciliationRtdProvider.md @@ -12,7 +12,6 @@ sidebarType: 1 --- # Reconciliation SDK Module - {:.no_toc} * TOC diff --git a/dev-docs/modules/schain.md b/dev-docs/modules/schain.md index 562d1f5b8c..128b4410ff 100644 --- a/dev-docs/modules/schain.md +++ b/dev-docs/modules/schain.md @@ -10,7 +10,6 @@ sidebarType : 1 --- # Supply Chain Object Module - {:.no_toc} * TOC diff --git a/dev-docs/modules/sizeMapping.md b/dev-docs/modules/sizeMapping.md index 8aa2172c13..88f1fd1f11 100644 --- a/dev-docs/modules/sizeMapping.md +++ b/dev-docs/modules/sizeMapping.md @@ -10,7 +10,6 @@ sidebarType: 1 --- # Size Mapping Module - {: .no_toc } * TOC diff --git a/dev-docs/modules/sizeMappingV2.md b/dev-docs/modules/sizeMappingV2.md index 22b1bf8bde..25c655a5de 100644 --- a/dev-docs/modules/sizeMappingV2.md +++ b/dev-docs/modules/sizeMappingV2.md @@ -10,7 +10,6 @@ sidebarType: 1 --- # Advanced Size Mapping Module - {: .no_toc } * TOC diff --git a/dev-docs/modules/weboramaRtdProvider.md b/dev-docs/modules/weboramaRtdProvider.md index 29d450291a..d3046f2890 100644 --- a/dev-docs/modules/weboramaRtdProvider.md +++ b/dev-docs/modules/weboramaRtdProvider.md @@ -12,7 +12,6 @@ sidebarType : 1 --- # Weborama RTD Segmentation Module - {:.no_toc} * TOC From 5704144e1ad730d639b7872d37b2c42f930105cf Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 9 Jan 2025 16:23:03 -0500 Subject: [PATCH 376/816] goldfish typo (#5801) --- dev-docs/modules/goldfishAdsRtdProvider.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/modules/goldfishAdsRtdProvider.md b/dev-docs/modules/goldfishAdsRtdProvider.md index e789842f51..5a5bed4a67 100755 --- a/dev-docs/modules/goldfishAdsRtdProvider.md +++ b/dev-docs/modules/goldfishAdsRtdProvider.md @@ -13,7 +13,7 @@ sidebarType: 1 # Goldfish Ads Real Time Data Provider -This RTD module provides access to the Goldfish Ads Geograph, which leverages geographic and temporal data on a privcay-first platform. This module works without using cookies, PII, emails, or device IDs across all website traffic, including unauthenticated users, and adds audience data into bid requests to increase scale and yields. +This RTD module provides access to the Goldfish Ads Geograph, which leverages geographic and temporal data on a privacy-first platform. This module works without using cookies, PII, emails, or device IDs across all website traffic, including unauthenticated users, and adds audience data into bid requests to increase scale and yields. Contact for information. From baf8a177ad345c768e56757ebb9e27860f2a3fe8 Mon Sep 17 00:00:00 2001 From: Chris Huie Date: Fri, 10 Jan 2025 09:09:27 -0700 Subject: [PATCH 377/816] Remove Equative aliasCode (#5803) --- dev-docs/bidders/smartadserver.md | 1 - 1 file changed, 1 deletion(-) diff --git a/dev-docs/bidders/smartadserver.md b/dev-docs/bidders/smartadserver.md index 3d6072aab4..dc5c8a8967 100644 --- a/dev-docs/bidders/smartadserver.md +++ b/dev-docs/bidders/smartadserver.md @@ -25,7 +25,6 @@ pbs_app_supported: true prebid_member: false floors_supported: true ortb_blocking_supported: true -aliasCode: equativ privacy_sandbox: no sidebarType: 1 --- From 3f499d0f489a3a6daeee7d77aec75144c43ae804 Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 10 Jan 2025 16:31:00 -0500 Subject: [PATCH 378/816] disabling konduit (#5804) --- dev-docs/modules/konduit.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/dev-docs/modules/konduit.md b/dev-docs/modules/konduit.md index 3d532a66ae..811753be93 100644 --- a/dev-docs/modules/konduit.md +++ b/dev-docs/modules/konduit.md @@ -5,14 +5,17 @@ title: Module - Konduit Accelerate description: Applies Konduit video ad acceleration optimization to wining video bid. module_code : konduitWrapper display_name : Konduit Accelerate -enable_download : true +enable_download : false vendor_specific: true sidebarType : 1 --- # Konduit Accelerate Module -The Konduit Accelerate module applies the [Konduit](https://konduitvideo.com/) video acceleration optimization to a publisher’s existing Prebid setup. This optimization provides publishers with tools to monetize previously lost revenue and drive higher fill rates on their video inventory. +{: .alert.alert-warning :} +Prebid believes this module may no longer be maintained. + +The Konduit Accelerate module applies the Konduit video acceleration optimization to a publisher’s existing Prebid setup. This optimization provides publishers with tools to monetize previously lost revenue and drive higher fill rates on their video inventory. To install the module, follow these instructions: From d33dd65b591aa7cbba7d3145220d7720403cf76b Mon Sep 17 00:00:00 2001 From: bretg Date: Mon, 13 Jan 2025 16:33:12 -0500 Subject: [PATCH 379/816] Deprecate captifyRtdProvider.md (#5813) --- dev-docs/modules/captifyRtdProvider.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dev-docs/modules/captifyRtdProvider.md b/dev-docs/modules/captifyRtdProvider.md index c831417c16..e8de341105 100644 --- a/dev-docs/modules/captifyRtdProvider.md +++ b/dev-docs/modules/captifyRtdProvider.md @@ -6,7 +6,7 @@ description: Captify Real Time Data Module page_type: module module_type: rtd module_code : captifyRtdProvider -enable_download : true +enable_download : false vendor_specific: true sidebarType : 1 --- @@ -14,6 +14,9 @@ sidebarType : 1 # Captify RTD Module {:.no_toc} +{: .alert.alert-warning :} +Captify RTD was removed in Prebid.js 8.0 + * TOC {:toc} From e74735571cedecf99b897b4f1546d0aee9040b3a Mon Sep 17 00:00:00 2001 From: dev-adverxo Date: Wed, 15 Jan 2025 20:03:36 +0100 Subject: [PATCH 380/816] Change pbs to true (#5807) Co-authored-by: Adverxo --- dev-docs/bidders/adport.md | 4 ++-- dev-docs/bidders/bidsmind.md | 4 ++-- dev-docs/bidders/mobupps.md | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dev-docs/bidders/adport.md b/dev-docs/bidders/adport.md index af49d131ab..62acd61772 100644 --- a/dev-docs/bidders/adport.md +++ b/dev-docs/bidders/adport.md @@ -4,8 +4,8 @@ title: AdPort description: Prebid AdPort Bidder Adapter aliasCode: adverxo pbjs: true -pbs: false -pbs_app_supported: false +pbs: true +pbs_app_supported: true biddercode: adport userIds: media_types: banner, native, video diff --git a/dev-docs/bidders/bidsmind.md b/dev-docs/bidders/bidsmind.md index c230fa19e7..08d5c146a5 100644 --- a/dev-docs/bidders/bidsmind.md +++ b/dev-docs/bidders/bidsmind.md @@ -4,8 +4,8 @@ title: Bidsmind description: Prebid Bidsmind Bidder Adapter aliasCode: adverxo pbjs: true -pbs: false -pbs_app_supported: false +pbs: true +pbs_app_supported: true biddercode: bidsmind userIds: media_types: banner, native, video diff --git a/dev-docs/bidders/mobupps.md b/dev-docs/bidders/mobupps.md index c7f114a744..f7c827efff 100644 --- a/dev-docs/bidders/mobupps.md +++ b/dev-docs/bidders/mobupps.md @@ -4,8 +4,8 @@ title: Mobupps description: Prebid Mobupps Bidder Adapter aliasCode: adverxo pbjs: true -pbs: false -pbs_app_supported: false +pbs: true +pbs_app_supported: true biddercode: mobupps userIds: media_types: banner, native, video From 94580d77d207af3194bbffe230888d7609ff4181 Mon Sep 17 00:00:00 2001 From: BitmediaDevTeam Date: Thu, 16 Jan 2025 21:09:45 +0200 Subject: [PATCH 381/816] Bitmedia Bidder Adapter MD : initial release (#5788) * add bitmedia MD * Changes at bitmedia.md * fix eslint errors at bitmedia.md --- dev-docs/bidders/bitmedia.md | 223 +++++++++++++++++++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 dev-docs/bidders/bitmedia.md diff --git a/dev-docs/bidders/bitmedia.md b/dev-docs/bidders/bitmedia.md new file mode 100644 index 0000000000..24ed5e6cc3 --- /dev/null +++ b/dev-docs/bidders/bitmedia.md @@ -0,0 +1,223 @@ +--- +layout: bidder +title: Bitmedia +description: Prebid Bitmedia Bidder Adapter +biddercode: bitmedia +pbjs: true +pbs: false +gvl_id: none +tcfeu_supported: false +usp_supported: false +coppa_supported: false +gpp_sids: none +schain_supported: false +dchain_supported: false +userId: none +media_types: banner +safeframes_ok: true +deals_supported: false +floors_supported: true +fpd_supported: false +ortb_blocking_supported: false +multiformat_supported: will-not-bid +privacy_sandbox: no +prebid_member: false +sidebarType: 1 +--- + + +### Table of Contents + +- [Table of Contents](#table-of-contents) +- [Description](#description) +- [Bid Params](#bid-params) +- [Test Parameters](#test-parameters) +- [Testing Instructions](#testing-instructions) + + + +### Description + +The Bitmedia Bid Adapter allows publishers to integrate with BitmediaIO for banner advertising. + +#### Key Points + +- Supported Media Type: **Banner** +- Bids are only provided in **USD**. +- Access to **local storage** is optional. + +Before using this adapter, simply [create a publisher account](https://bitmedia.io/become-a-publisher) on our platform to obtain your `adUnitID`. + +More about us: [https://bitmedia.io](https://bitmedia.io) + + + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|--------------|----------|------------------------------------|-------------------|----------| +| `adUnitID` | required | The ad unit ID from Bitmedia | `'exampleAdUnitID'` | `string` | +| `currency` | optional | Currency of the bid (default: USD) | `'USD'` | `string` | + + + +## Test Parameters +### Example + +```javascript +var adUnits = [ + { + code: 'banner-div', + mediaTypes: { + banner: { + sizes: [[300, 250], [300, 600]], + }, + }, + bids: [{ + bidder: 'bitmedia', + params: { + adUnitID: 'exampleAdUnitID', + currency: 'USD', + }, + }], + }, +]; +``` + +--- + +## Testing Instructions + +The HTML file below can be used to test the integration of the Bitmedia Bid Adapter. + +### Simple Test HTML + +```html + + + + + + + + + + + + + + + + + + +

    Ad Serverless Test Page

    + +
    +
    +
    + + +``` From 27597f338910b501a0f82dfd533146b3f51376ec Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 16 Jan 2025 15:13:23 -0500 Subject: [PATCH 382/816] PBS auction bidder-specific tmax (#5820) --- .../endpoints/openrtb2/pbs-endpoint-auction.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md index c6d3d950f3..b933e81d74 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -309,20 +309,21 @@ To summarize the process: ##### PBS-Java -Core concepts: +Definitions: - request_tmax: what the incoming ORTB request defines as tmax (as milliseconds) -- biddertmax_max: controls that upstream doesn't tell us ridiculous values. In milliseconds. (configuration auction.biddertmax.max) -- biddertmax_min: it's not worth calling bidders and give them less time than this number of milliseconds (configuration (auction.biddertmax.min). Note: we recommend this value be at least 150 ms) -- biddertmax_percent: a lower number means more buffer for network delay. Host companies should set this to a lower value in regions where the network connections are slower. (configuration auction.biddertmax.percent) -- tmax_upstream_response_time: the amount of time (in ms) that PBS needs to respond to the original caller (configuration auction.tmax-upstream-response-time) +- biddertmax_max: configuration that controls that upstream doesn't tell us ridiculous values. In milliseconds. Actual config value is configuration auction.biddertmax.max. The default is 5000 ms. +- biddertmax_min: configuration declaring that it's not worth calling bidders with a tmax of less than this number of milliseconds. Actual config value is auction.biddertmax.min. Note: we recommend this value be at least 150 ms, but the default is 50 ms. +- biddertmax_percent: configuration defining what percent of the tmax should be given to bidders. A lower number provides a larger buffer for network delay, meaning that host companies should set this to a lower value in regions where the network connections are slower. Actual config value is auction.biddertmax.percent. +- tmax_upstream_response_time: configuration estimating the amount of time (in ms) that PBS needs to respond to the original caller. Actual config value is auction.tmax-upstream-response-time. +- bidder_tmax_deduction: (PBS-Java 3.18+) configuration adjusting the tmax sent to the bidder to give them a higher sense of urgency for the expected network delays. It doesn't affect the actual timeout enforced by PBS. Actual config value is adapter.ADAPTER.tmax-deduction-ms. - processing_time: PBS calculation for how long it's been since the start of the request up to the point where the bidders are called -- bidder_tmax: this is what PBS-core tells the bidders they have to respond. The conceptual formula is: capped(request_tmax)*biddertmax_percent - processing_time - tmax_upstream_response_time ==> must be at least the configured min -- enforced_tmax: this is long PBS-core actually gives the bidders: capped(request_tmax)- processing_time - tmax_upstream_response_time ==> cannot be lower than bidder_tmax +- bidder_tmax: calculated value that PBS-core tells bidders indicating how long they have to respond. The conceptual formula is: capped(request_tmax)*biddertmax_percent - processing_time - tmax_upstream_response_time ==> must be at least the configured min +- enforced_tmax: calculated value for the actually enforced bidder timeout. The conceptual formula is: capped(request_tmax)- processing_time - tmax_upstream_response_time ==> cannot be lower than bidder_tmax The full formulas: -bidder_tmax=max(calculated_tmax, biddertmax_min)=max((min(request_tmax,biddertmax_max)*biddertmax_percent)-processing_time - tmax_upstream_response_time, biddertmax_min) +bidder_tmax=max(calculated_tmax, biddertmax_min)=max((min(request_tmax,biddertmax_max)*biddertmax_percent)-processing_time - tmax_upstream_response_time - bidder_tmax_deduction, biddertmax_min) enforced_tmax=max(calculated_enforcement,bidder_tmax)=max(min(request_tmax,biddertmax_max)-processing_time - tmax_upstream_response_time , bidder_tmax) From 9758c663dea760407a68cbf25dc56c91cc28f672 Mon Sep 17 00:00:00 2001 From: Sean McGroarty Date: Fri, 17 Jan 2025 12:53:02 +0100 Subject: [PATCH 383/816] Permutive RTD Module: updates GDPR docs #12660 (#5819) * feat(docs): updates permutive GDPR docs Ensures docs are up to date & have clear instructions * Update dev-docs/modules/permutiveRtdProvider.md * Update dev-docs/modules/permutiveRtdProvider.md --------- Co-authored-by: Muki Seiler --- dev-docs/modules/permutiveRtdProvider.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/dev-docs/modules/permutiveRtdProvider.md b/dev-docs/modules/permutiveRtdProvider.md index cdce9f2893..5e93744c3c 100644 --- a/dev-docs/modules/permutiveRtdProvider.md +++ b/dev-docs/modules/permutiveRtdProvider.md @@ -70,14 +70,15 @@ as well as enabling settings for specific use cases mentioned above (e.g. acbidd ### Context -Permutive is not listed as a TCF vendor as all data collection is on behalf of the publisher and based on consent the publisher has received from the user. -Rather than through the TCF framework, this consent is provided to Permutive when the user gives the relevant permissions on the publisher website which allow the Permutive SDK to run. -This means that if TCF controls are enabled _and_ the user consent isn’t given for Permutive to fire, no cohorts will populate. -As Prebid utilizes TCF vendor consent, for the Permutive RTD module to load, Permutive needs to be labeled within the Vendor Exceptions +While Permutive is listed as a TCF vendor (ID: 361), Permutive does not obtain consent directly from the TCF. As we act as a processor on behalf of our publishers consent is given to the Permutive SDK by the publisher, not by the [GDPR Consent Management Module](/dev-docs/modules/consentManagement.html). + +This means that if GDPR enforcement is configured within the Permutive SDK _and_ the user consent isn’t given for Permutive to fire, no cohorts will populate. + +If you are also using the [TCF Control Module](/dev-docs/modules/tcfControl.html), in order to prevent Permutive from being blocked, it needs to be labeled within the Vendor Exceptions. ### Instructions -1. Publisher enables rules within Prebid GDPR module +1. Publisher enables rules within Prebid.js configuration. 2. Label Permutive as an exception, as shown below. ```javascript From 86c076858852bc35b65b9e54ebd044c65ac74a3f Mon Sep 17 00:00:00 2001 From: michachen Date: Fri, 17 Jan 2025 14:01:54 +0200 Subject: [PATCH 384/816] Rprd 1694 native doc update (#5815) * RPRD-1694: Update `minutemedia.md` `openweb.md` `openwebxchange.md`, `rise.md` `risexchange.md` `shinez.md` `stn.md` docs with native and multi-format related docs. * RPRD-1694: Remove some doc lines from adapters as SSP Product manager asked. * RPRD-1694: latest version data * RPRD-1694: sync with version --- dev-docs/bidders/minutemedia.md | 14 ++++++++++++-- dev-docs/bidders/openweb.md | 14 ++++++++++++-- dev-docs/bidders/openwebxchange.md | 16 +++++++++------- dev-docs/bidders/rise.md | 12 ++++++++---- dev-docs/bidders/risexchange.md | 14 +++++++++----- dev-docs/bidders/shinez.md | 14 ++++++++++++-- dev-docs/bidders/stn.md | 14 ++++++++++++-- 7 files changed, 74 insertions(+), 24 deletions(-) diff --git a/dev-docs/bidders/minutemedia.md b/dev-docs/bidders/minutemedia.md index 8dff7047e4..ebc3dbcd90 100644 --- a/dev-docs/bidders/minutemedia.md +++ b/dev-docs/bidders/minutemedia.md @@ -4,7 +4,7 @@ title: MinuteMedia description: Prebid MinuteMedia Bidder Adapter pbjs: true biddercode: minutemedia -media_types: banner, video +media_types: banner, video, native multiformat_supported: will-bid-on-any schain_supported: true tcfeu_supported: true @@ -25,7 +25,7 @@ The MinuteMedia adapter requires setup and approval. Please reach out to = 6.14.0. + +Native >= 9.27.0. + +Multi-format requests >= 9.27.0. diff --git a/dev-docs/bidders/openweb.md b/dev-docs/bidders/openweb.md index b81650b9e5..d1a55d7979 100644 --- a/dev-docs/bidders/openweb.md +++ b/dev-docs/bidders/openweb.md @@ -4,7 +4,7 @@ title: OpenWeb description: Prebid OpenWeb Bidder Adapter pbjs: true biddercode: openweb -media_types: banner, video +media_types: banner, video, native multiformat_supported: will-bid-on-any schain_supported: true coppa_supported: true @@ -27,7 +27,7 @@ The OpenWeb adapter requires setup and approval. Please reach out to = 6.14.0. + +Native >= 9.27.0. + +Multi-format requests >= 9.27.0. diff --git a/dev-docs/bidders/openwebxchange.md b/dev-docs/bidders/openwebxchange.md index 66c03c160f..0dd779e6ee 100644 --- a/dev-docs/bidders/openwebxchange.md +++ b/dev-docs/bidders/openwebxchange.md @@ -5,7 +5,7 @@ description: Prebid OpenWebXChange Bidder Adapter multiformat_supported: will-bid-on-any pbjs: true biddercode: openwebxchange -media_types: banner, video +media_types: banner, video, native schain_supported: true coppa_supported: true pbs: false @@ -23,7 +23,7 @@ The OpenWebXChange adapter requires setup and approval. ### Bid Parameters -#### Banner, Video +#### Banner, Video, Native {: .table .table-bordered .table-striped } @@ -33,9 +33,6 @@ The OpenWebXChange adapter requires setup and approval. | `floorPrice` | optional | Number | Minimum price in USD.

    **WARNING:**
    Misuse of this parameter can impact revenue | 2.00 | `placementId` | optional | String | A unique placement identifier | "12345678" | `testMode` | optional | Boolean | This activates the test mode | false -| `rtbDomain` | optional | String | Sets the seller end point | "www.test.com" -| `is_wrapper` | private | Boolean | Please don't use unless your account manager asked you to | false -| `currency` | optional | String | 3 letters currency | "EUR" ### Example @@ -94,5 +91,10 @@ We recommend setting UserSync by iframe for monetization. ### Versions -Prebid versions 5.0-5.3 are not supported -Banner >= 6.14.0 +Prebid versions 5.0-5.3 are not supported. + +Banner >= 6.14.0. + +Native >= 9.27.0. + +Multi-format requests >= 9.27.0. diff --git a/dev-docs/bidders/rise.md b/dev-docs/bidders/rise.md index cee91e6414..f20e6598fd 100644 --- a/dev-docs/bidders/rise.md +++ b/dev-docs/bidders/rise.md @@ -26,7 +26,7 @@ The Rise adapter requires setup and approval. Please reach out to [prebid-rise-e ### Bid Parameters -#### Banner, Video +#### Banner, Video, Native {: .table .table-bordered .table-striped } @@ -36,7 +36,6 @@ The Rise adapter requires setup and approval. Please reach out to [prebid-rise-e | `floorPrice` | optional | Number | Minimum price in USD.

    **WARNING:**
    Misuse of this parameter can impact revenue | 2.00 | `placementId` | optional | String | A unique placement identifier | "12345678" | `testMode` | optional | Boolean | This activates the test mode | false -| `rtbDomain` | optional | String | Sets the seller end point | "www.test.com" ### Example @@ -95,5 +94,10 @@ Rise recommends setting UserSync by iframe for monetization. ### Versions -Prebid versions 5.0-5.3 are not supported -Banner >= 6.14.0 +Prebid versions 5.0-5.3 are not supported. + +Banner >= 6.14.0. + +Native >= 9.27.0. + +Multi-format requests >= 9.27.0. diff --git a/dev-docs/bidders/risexchange.md b/dev-docs/bidders/risexchange.md index 89df92a83c..f0e40882b3 100644 --- a/dev-docs/bidders/risexchange.md +++ b/dev-docs/bidders/risexchange.md @@ -5,7 +5,7 @@ description: Prebid RiseXChange Bidder Adapter multiformat_supported: will-bid-on-any pbjs: true biddercode: risexchange -media_types: banner, video +media_types: banner, video, native schain_supported: true coppa_supported: true pbs: false @@ -25,7 +25,7 @@ The RiseXChange adapter requires setup and approval. Please reach out to [prebid ### Bid Parameters -#### Banner, Video +#### Banner, Video, Native {: .table .table-bordered .table-striped } @@ -36,7 +36,6 @@ The RiseXChange adapter requires setup and approval. Please reach out to [prebid | `placementId` | optional | String | A unique placement identifier | "12345678" | `testMode` | optional | Boolean | This activates the test mode | false | `rtbDomain` | optional | String | Sets the seller end point | "www.test.com" -| `is_wrapper` | private | Boolean | Please don't use unless your account manager asked you to | false ### Example @@ -95,5 +94,10 @@ We recommend setting UserSync by iframe for monetization. ### Versions -Prebid versions 5.0-5.3 are not supported -Banner >= 6.14.0 +Prebid versions 5.0-5.3 are not supported. + +Banner >= 6.14.0. + +Native >= 9.27.0. + +Multi-format requests >= 9.27.0. diff --git a/dev-docs/bidders/shinez.md b/dev-docs/bidders/shinez.md index 642935d80e..eb6ae23063 100644 --- a/dev-docs/bidders/shinez.md +++ b/dev-docs/bidders/shinez.md @@ -5,7 +5,7 @@ description: Prebid Shinez Bidder Adapter multiformat_supported: will-bid-on-any pbjs: true biddercode: shinez -media_types: banner, video +media_types: banner, video, native schain_supported: true usp_supported: true floors_supported: true @@ -21,7 +21,7 @@ The Shinez adapter requires setup and approval. Please reach out to = 6.14.0. + +Native >= 9.27.0. + +Multi-format requests >= 9.27.0. diff --git a/dev-docs/bidders/stn.md b/dev-docs/bidders/stn.md index aab1fd1622..8e57a3b8a1 100644 --- a/dev-docs/bidders/stn.md +++ b/dev-docs/bidders/stn.md @@ -4,7 +4,7 @@ title: STN description: Prebid STN Bidder Adapter pbjs: true biddercode: stn -media_types: banner, video +media_types: banner, video, native multiformat_supported: will-bid-on-any schain_supported: true tcfeu_supported: false @@ -24,7 +24,7 @@ The STN adapter requires setup and approval. Please reach out to = 6.14.0. + +Native >= 9.27.0. + +Multi-format requests >= 9.27.0. From de8f7584f5177785d0aa88bddea35bc79af5ae58 Mon Sep 17 00:00:00 2001 From: AcuityAdsIntegrations <72594990+AcuityAdsIntegrations@users.noreply.github.com> Date: Fri, 17 Jan 2025 14:16:49 +0200 Subject: [PATCH 385/816] AcuityAds Bid Adapter: add endpointId param (#5806) * add prebid.js adapter * updates * updates * update Prebid Server documentation * add gpp * upd filename * add endpointId param --- dev-docs/bidders/acuityads.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidders/acuityads.md b/dev-docs/bidders/acuityads.md index fc30eeaf58..7cfb180f55 100644 --- a/dev-docs/bidders/acuityads.md +++ b/dev-docs/bidders/acuityads.md @@ -26,9 +26,12 @@ The Example Bidding adapter requires setup before beginning. Please contact us a ### Prebid.JS Bid Params {: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|---------------|----------|-----------------------|-----------|-----------| -| `placementId` | required | Placement ID | `'123'` | `string` | +| Name | Scope | Description | Example | Type | +|---------------|----------|--------------|---------------------------------|------------| +| `placementId` | optional | Placement Id | `'123'` | `'string'` | +| `endpointId` | optional | Endpoint Id | `'456'` | `'string'` | + +For the prebid.js you only need to use one parameter: either placementId or endpointId ### Prebid Server Bid Params From 67b31ec4cd0a78987b149220b26ecfe96f6d8f0c Mon Sep 17 00:00:00 2001 From: Jeff Palladino <1226357+jpalladino84@users.noreply.github.com> Date: Fri, 17 Jan 2025 05:20:19 -0700 Subject: [PATCH 386/816] =?UTF-8?q?symitriDapRtdProvider=20-=20update=20do?= =?UTF-8?q?cs=20with=20X2=20instructions=20for=20client=20c=E2=80=A6=20(#5?= =?UTF-8?q?800)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * symitriDapRtdProvider - update docs with X2 instructions for client configs * Cleanup docs --------- Co-authored-by: Jeff Palladino --- dev-docs/modules/symitriDapRtdProvider.md | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/dev-docs/modules/symitriDapRtdProvider.md b/dev-docs/modules/symitriDapRtdProvider.md index 0717bc10bf..de52b94551 100644 --- a/dev-docs/modules/symitriDapRtdProvider.md +++ b/dev-docs/modules/symitriDapRtdProvider.md @@ -42,14 +42,11 @@ pbjs.setConfig({ waitForIt: true, params: { apiHostname: '', - apiVersion: "x1", - apiAuthToken: '', + apiVersion: 'x1'|'x2', domain: 'your-domain.com', - identityType: 'simpleid'|'compositeid'|'hashedid'|'dap-signature:1.0.0', + identityType: 'simpleid'|'compositeid'|'hashedid', identityValue: '', segtax: 708, - dapEntropyUrl: 'https://sym-dist.symitri.net/dapentropy.js', - dapEntropyTimeout: 1500, pixelUrl: '', } } @@ -68,14 +65,11 @@ Please reach out to your Symitri account representative() to | name | String | Symitri Dap Rtd module name | 'symitriDap' always| | waitForIt | Boolean | Required to ensure that the auction is delayed until prefetch is complete | Optional. Defaults to false | | apiHostname | String | Hostname provided by Symitri | Please reach out to your Symitri account representative() for this value| -| apiVersion | String | This holds the API version | It should be "x1" always | -| apiAuthToken | String | Symitri API AuthToken | Please reach out to your Symitri account representative() for this value | +| apiVersion | String | This holds the API version | Please reach out to your Symitri account representative() for this value | | domain | String | The domain name of your webpage | | -| identityType | String | 'simpleid' or 'compositeid' or 'hashedid' or 'dap-signature:1.0.0' | See the section below labelled "identityType" for more details. | +| identityType | String | 'simpleid' or 'compositeid' or 'hashedid' | See the section below labelled "identityType" for more details. | | identityValue | String | This is optional field to pass user hid. Will be used only if identityType is hid | | | segtax | Integer | The taxonomy for Symitri | The value should be 708 | -| dapEntropyUrl | String | URL to dap entropy script | Optional if the script is directly included on the webpage. Contact your Symitri account rep for more details | -| dapEntropyTimeout | Integer | Maximum time allotted for the entropy calculation to happen | | | pixelUrl | String | Pixel URL provided by Symitri which will be triggered when bid matching with Symitri dealid wins and creative gets rendered | | ### identityType @@ -83,14 +77,16 @@ Use 'simpleid' to pass email or other plain text ids and SymitriRTD Module will Use 'hashedid' to pass in single already hashed id. -Use 'compositeid' to pass in multiple identifiers as key-value pairs as shown below: +Use 'compositeid' to pass in multiple identifiers as key-value pairs as shown below, can also be used for single already hashed identifiers: ```bash { - "identityType1": "identityValue1", - "identityType2": "identityValue2", + "identityType": "compositeid", + "identityValue": "HEM:,ID5:,RampId:", ... } + "identityType": "hashedid", + "identityValue": "", ``` ### Testing From 087cd68c3d09d0e2bb70ccac59ad5f7614c29b4d Mon Sep 17 00:00:00 2001 From: jeremy-greenbids Date: Fri, 17 Jan 2025 13:21:00 +0100 Subject: [PATCH 387/816] Doc for greebids adapter (#5733) * Doc for greebids adapter * review --- dev-docs/bidders/greenbids.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 dev-docs/bidders/greenbids.md diff --git a/dev-docs/bidders/greenbids.md b/dev-docs/bidders/greenbids.md new file mode 100644 index 0000000000..23ca4bf172 --- /dev/null +++ b/dev-docs/bidders/greenbids.md @@ -0,0 +1,35 @@ +--- +layout: bidder +title: Greenbids +description: Prebid Greenbids Bidder Adapter +biddercode: greenbids +tcfeu_supported: false +dsa_supported: true +gvl_id: none +usp_supported: true +coppa_supported: false +gpp_sids: tcfca, usnat, usstate_all, usp +schain_supported: true +dchain_supported: true +media_types: banner, video +deals_supported: false +floors_supported: true +fpd_supported: true +pbjs: true +pbs: true +prebid_member: false +multiformat_supported: will-not-bid +ortb_blocking_supported: false +sidebarType: 1 +--- + +### Note + +The Greenbids Bidding adapter requires setup before beginning. Please contact us at [sales@greenbids.ai](mailto:sales@greenbids.ai). + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|-----------------------|-----------|-----------| +| `placementId` | required | Placement id | `'11111'` | `string` | From 53fca805e1a07ea7f1f4dc71f89a7e450d70a290 Mon Sep 17 00:00:00 2001 From: Ben Brachmann <49547103+bevenio@users.noreply.github.com> Date: Fri, 17 Jan 2025 13:21:19 +0100 Subject: [PATCH 388/816] Goldbach adapter update (#5748) * Update goldbach.md * Update goldbach.md --- dev-docs/bidders/goldbach.md | 208 ++++------------------------------- 1 file changed, 24 insertions(+), 184 deletions(-) diff --git a/dev-docs/bidders/goldbach.md b/dev-docs/bidders/goldbach.md index 72ffa4a491..99aa9d3307 100644 --- a/dev-docs/bidders/goldbach.md +++ b/dev-docs/bidders/goldbach.md @@ -1,199 +1,39 @@ --- layout: bidder title: Goldbach -description: Prebid Goldbach Bidder Adaptor +description: Goldbach Bidder Adapter biddercode: goldbach -media_types: banner, video, native -gvl_id: 580 tcfeu_supported: true -prebid_member: true -userIds: criteo, unifiedId, netId, identityLink, uid2 -schain_supported: true -coppa_supported: true -usp_supported: true +dsa_supported: true +gvl_id: 580 +usp_supported: false +coppa_supported: false +gpp_sids: some (check with bidder) +schain_supported: false +dchain_supported: false +userId: goldbach.com, oneid.live +media_types: banner, video, native +safeframes_ok: true +deals_supported: true floors_supported: true +fpd_supported: true pbjs: true pbs: false +prebid_member: false +multiformat_supported: will-bid-on-any +ortb_blocking_supported: false +privacy_sandbox: no sidebarType: 1 --- +### Note -### Table of Contents - -- [Table of Contents](#table-of-contents) - - [Bid Params](#bid-params) - - [Video Object](#video-object) - - [User Object](#user-object) - - [App Object](#app-object) - - [Custom Targeting keys](#custom-targeting-keys) - - [Passing Keys Without Values](#passing-keys-without-values) - - [User Sync in AMP](#user-sync-in-amp) - - [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.
    -*Note: This requirement does not apply to adapters that are [aliasing](/dev-docs/publisher-api-reference/aliasBidder.html) the Goldbach adapter.* - -#### Bid Params - -{: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|---------------------|----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------|------------------| -| `placementId` | required | The placement ID from Goldbach. You may identify a placement using the `invCode` and `member` instead of a placement ID. The `placementID` parameter can be either a `string` or `integer` for Prebid.js, however `integer` is preferred. Legacy code can retain the `string` value. **Prebid Server requires an integer value.** | `234234` | `integer` | -| `member` | optional | The member ID from Goldbach. Must be used with `invCode`. | `'12345'` | `string` | -| `invCode` | optional | The inventory code from Goldbach. Must be used with `member`. | `'abc123'` | `string` | -| `publisherId` | optional | The publisher ID from Goldbach. It is used by the Goldbach end point to identify the publisher when `placementId` is not provided and `invCode` goes wrong. The `publisherId` parameter can be either a `string` or `integer` for Prebid.js, however `integer` is preferred. | `12345` | `integer` | -| `frameworks` | optional | Array of integers listing API frameworks for Banner supported by the publisher. | `integer` | -| `user` | optional | Object that specifies information about an external user. See [User Object](#godlbach-user-object) for details. | `user: { age: 25, gender: 0, dnt: true}` | `object` | -| `allowSmallerSizes` | optional | If `true`, ads smaller than the values in your ad unit's `sizes` array will be allowed to serve. Defaults to `false`. | `true` | `boolean` | -| `usePaymentRule` (PBJS) or `use_pmt_rule` (PBS) | optional | If `true`, Xandr will return net price to Prebid.js after publisher payment rules have been applied. | `true` | `boolean` | -| `keywords` | optional | A set of key-value pairs applied to all ad slots on the page. Mapped to [buy-side segment targeting](https://monetize.xandr.com/docs/segment-targeting) (login required). Values can be empty. See [Passing Keys Without Values](#godlbach-no-value) below for examples. Note that to use keyword with the Prebid Server adapter, that feature must be enabled for your account by an Goldbach account manager. | `keywords: { genre: ['rock', 'pop'] }` | `object` | -| `video` | optional | Object containing video targeting parameters. See [Video Object](#godlbach-video-object) for details. | `video: { playback_method: ['auto_play_sound_off'] }` | `object` | -| `app` | optional | Object containing mobile app parameters. See the [App Object](#godlbach-app-object) for details. | `app : { id: 'app-id'}` | `object` | -| `reserve` | optional | Sets a floor price for the bid that is returned. If floors have been configured in the Goldbach Console, those settings will override what is configured here unless 'Reserve Price Override' is checked. See [Xandr docs](https://docs.xandr.com/bundle/monetize_monetize-standard/page/topics/create-a-floor-rule.html) | `0.90` | `float` | -| `position` | optional | Identify the placement as above or below the fold. Allowed values: Unknown: `unknown`; Above the fold: `above`; Below the fold: `below` | `'above'` | `string` | -| `trafficSourceCode` | optional | Specifies the third-party source of this impression. | `'my_traffic_source'` | `string` | -| `supplyType` | optional | Indicates the type of supply for this placement. Possible values are `web`, `mobile_web`, `mobile_app` | `'web'` | `string` | -| `supplyType` | optional | Indicates the type of supply for this placement. Possible values are `web`, `mobile_web`, `mobile_app` | `'web'` | `string` | -| `pubClick` | optional | Specifies a publisher-supplied URL for third-party click tracking. This is just a placeholder into which the publisher can insert their own click tracker. This parameter should be used for an unencoded tracker. This parameter is expected to be the last parameter in the URL. Please note that the click tracker placed in this parameter will only fire if the creative winning the auction is using Goldbach click tracking properly. | `'http://click.adserver.com/'` | `string` | -| `extInvCode` | optional | Specifies predefined value passed on the query string that can be used in reporting. The value must be entered into the system before it is logged. | `'10039'` | `string` | -| `externalImpId` | optional | Specifies the unique identifier of an externally generated auction. | `'bacbab02626452b097f6030b3c89ac05'` | `string` | -| `generate_ad_pod_id`| optional | Signal to Goldbach to split impressions by ad pod and add unique ad pod id to each request. Specific to long form video endpoint only. Supported by Prebid Server, not Prebid JS. | `true` | `boolean` | - - +The Goldbach bidding adapter requires an individualized `'publisherId'` and approval from the Goldbach team. Please reach out to your account manager for more information. -#### Video Object +### Bid Params {: .table .table-bordered .table-striped } -| Name | Description | Type | -|-------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------| -| `minduration` | Integer that defines the minimum video ad duration in seconds. | `integer` | -| `maxduration` | Integer that defines the maximum video ad duration in seconds. | `integer` | -|`context` | A string that indicates the type of video ad requested. Allowed values: `"pre_roll"`; `"mid_roll"`; `"post_roll"`; `"outstream"`. | `string` | -| `skippable` | Boolean which, if `true`, means the user can click a button to skip the video ad. Defaults to `false`. | `boolean` | -|`skipoffset`| Integer that defines the number of seconds until an ad can be skipped. Assumes `skippable` setting was set to `true`. | `integer` | -| `playback_method` | A string that sets the playback method supported by the publisher. Allowed values: `"auto_play_sound_on"`; `"auto_play_sound_off"`; `"click_to_play"`; `"mouse_over"`; `"auto_play_sound_unknown"`. | `string` | -| `frameworks` | Array of integers listing API frameworks supported by the publisher. Allowed values: None: `0`; VPAID 1.0: `1`; VPAID 2.0: `2`; MRAID 1.0: `3`; MRAID 2.0: `4`; ORMMA: `5`; OMID 1.0 `6`. | `Array` | - - - -#### User Object - -{: .table .table-bordered .table-striped } -| Name | Description | Example | Type | -|-------------------|---------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------|------------------| -| `age` | The age of the user. | `35` | `integer` | -| `externalUid` | Specifies a string that corresponds to an external user ID for this user. | `'1234567890abcdefg'` | `string` | -| `segments` | Specifies the segments to which the user belongs. | `[1, 2]` | `Array` | -| `gender` | Specifies the gender of the user. Allowed values: Unknown: `0`; Male: `1`; Female: `2` | `1` | `integer` | -| `dnt` | Do not track flag. Indicates if tracking cookies should be disabled for this auction | `true` | `boolean` | -| `language` | Two-letter ANSI code for this user's language. | `EN` | `string` | - - - -#### App Object - -Goldbach supports using prebid within a mobile app's webview. If you are interested in using an SDK, please see [Prebid Mobile]({{site.baseurl}}/prebid-mobile/prebid-mobile.html) instead. - -{: .table .table-bordered .table-striped } -| Name | Description | Example | Type | -|-------------------|---------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------|------------------| -| `id` | The App ID. | `'B1O2W3M4AN.com.prebid.webview'` | `string` | -| `device_id` | Object that contains the advertising identifiers of the user (`idfa`, `aaid`, `md5udid`, `sha1udid`, or `windowsadid`). | `{ aaid: "38400000-8cf0-11bd-b23e-10b96e40000d" }` | `object` | -| `geo` | Object that contains the latitude (`lat`) and longitude (`lng`) of the user. | `{ lat: 40.0964439, lng: -75.3009142 }` | `object` | - - - -#### Custom Targeting keys -Goldbach returns custom keys that can be sent to the adserver through bidderSettings: buyerMemberId, dealPriority, and dealCode. The following snippet demonstrates how to add these custom keys as key-value pairs. - -```javascript -pbjs.bidderSettings = { - godlbach: { - adserverTargeting: [ - { - key: "apn_buyer_memberid", // Use key configured in your adserver - val: function(bidResponse) { - return bidResponse.appnexus.buyerMemberId; - } - }, - { - key: "apn_prio", // Use key configured in your adserver - val: function(bidResponse) { - return bidResponse.appnexus.dealPriority; - } - }, { - key: "apn_dealcode", // Use key configured in your adserver - val: function(bidResponse) { - return bidResponse.appnexus.dealCode; - } - } - ] - } -} -``` - - - -#### Passing Keys Without Values - -It's possible to use the `keywords` parameter to define keys that do not have any associated values. Keys with empty values can be created in Prebid.js and can also be sent through Prebid Server to Goldbach. The following are examples of sending keys with empty values: - -```javascript -keywords: { - myKeyword: '', - myOtherKeyword: [''] -} -``` - -The preceding example passes the key `myKeyword` with an empty value. The key `myOtherKeyword` contains an empty value array. - -You can define keys with values and without values in the same `keywords` definition. In this next example, we've defined the key `color` with an array of values: `red`, `blue`, and `green`. We've followed that with the key `otherKeyword` with an empty value array. - -```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 - -The Goldbach endpoint expects `imp.displaymanagerver` to be populated for mobile app sources -requests, however not all SDKs will populate this field. If the `imp.displaymanagerver` field -is not supplied for an `imp`, but `request.app.ext.prebid.source` -and `request.app.ext.prebid.version` are supplied, the adapter will fill in a value for -`diplaymanagerver`. It will concatenate the two `app` fields as `-` fo fill in -the empty `displaymanagerver` before sending the request to Goldbach. - -#### Debug Auction - -{: .alert.alert-danger :} -Enabling the Goldbach Debug Auction feature should only be done for diagnosing the Goldbach auction. Do not enable this feature in a production setting where it may impact users. - -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: - -```javascript -{ "enabled": true, "dongle": "QWERTY", "debug_timeout": 1000, "member_id": 958 } -``` - -To view the results of the debug auction, add the `pbjs_debug=true` query string parameter and open your browser's developer console. - -{: .table .table-bordered .table-striped } -| Name | Description | Example | Type | -|-------------------|-----------------------------------------------------------------|-----------------------|------------------| -| `enabled` | Toggle the debug auction to occur | `true` | `boolean` | -| `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` | +| Name | Scope | Description | Example | Type | +|---------------|----------|--------------------------|---------------------------|-----------| +| `publisherId` | required | Publisher Environment ID | `example.com_de_ios` | `string` | +| `slotId` | required | Slot Id | `1234/slot/id/news` | `string` | From dcca789def619c4e86722b28b93d5ff6092e796d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Primo=C5=BE?= Date: Fri, 17 Jan 2025 13:21:41 +0100 Subject: [PATCH 389/816] ResponsiveAds adapter doc file (#5757) * ResponsiveAds adapter doc file * added more information for responsiveads bidder --- dev-docs/bidders/responsiveads.md | 33 +++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 dev-docs/bidders/responsiveads.md diff --git a/dev-docs/bidders/responsiveads.md b/dev-docs/bidders/responsiveads.md new file mode 100644 index 0000000000..56639c6cbe --- /dev/null +++ b/dev-docs/bidders/responsiveads.md @@ -0,0 +1,33 @@ +--- +layout: bidder +title: ResponsiveAds +description: ResponsiveAds Prebid Adapter +biddercode: responsiveads +media_types: banner +pbjs: true +pbs: false +enable_download: true +gvl_id: 1189 +sidebarType: 1 +safeframes_ok: false +multiformat_supported: will-bid-on-one +deals_supported: false +floors_supported: false +fpd_supported: false +ortb_blocking_supported: false +privacy_sandbox: no +prebid_member: false +schain_supported: false +dchain_supported: false +--- + +### Note + +If you're using Google Ad Manager (GAM), ensure that the "Serve in Safeframe" option in the creative settings is disabled. + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------------|----------|--------------------------------|---------|-----------| +| `placementId` | optional | Placement Id | 'f93kf9knds8n3' | string | From e95e09cf5d5f1cc3f26f00dafead9f412241f351 Mon Sep 17 00:00:00 2001 From: Wiem Zine Elabidine Date: Fri, 17 Jan 2025 13:22:36 +0100 Subject: [PATCH 390/816] LiveIntent Rtd Provider: add doc (#5795) * update liveintent docs * update liveintentRtdProvider doc --- dev-docs/modules/liveIntentRtdProvider.md | 55 +++++++++++++++++++ .../modules/userid-submodules/liveintent.md | 9 ++- 2 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 dev-docs/modules/liveIntentRtdProvider.md diff --git a/dev-docs/modules/liveIntentRtdProvider.md b/dev-docs/modules/liveIntentRtdProvider.md new file mode 100644 index 0000000000..f91bcfdeb1 --- /dev/null +++ b/dev-docs/modules/liveIntentRtdProvider.md @@ -0,0 +1,55 @@ +--- +layout: page_v2 +title: LiveIntent RTD Module +display_name: LiveIntent RTD Module +description: LiveIntent Real Time Data Module +page_type: module +module_type: rtd +module_code : liveIntentRtdProvider +enable_download : true +vendor_specific: true +sidebarType : 1 +--- + +# LiveIntent RTD Module + +{% include dev-docs/loads-external-javascript.md %} + +The LiveIntent RTD module loads a script to extract segment information from bid requests. +These segments are resolved using the LiveIntent user ID module and are then supplied as user data segments in OpenRTB. + +Please visit [LiveIntent](https://www.liveIntent.com/) for more information. + +## Integration + +1) Build the LiveIntent RTD Module into the Prebid.js package with: + + ```bash + gulp build --modules=rtdModule,liveIntentRtdProvider,... + ``` + +2) Use `setConfig` to instruct Prebid.js to initialize the LiveIntent RTD module, as specified below. + +## Configuration + +```javascript +pbjs.setConfig({ + realTimeData: { + auctionDelay: 1000, + dataProviders: [ + { + name: "liveintent", + waitForIt: true + } + ] + } +}); +``` + +## Parameters + +{: .table .table-bordered .table-striped } +| Name |Type | Description |Required | Notes | +| :--------------- | :------------ | :------------------------------------------------------------------ |:---------|:------------ | +| `name` | String | Real time data module name | yes | Always 'liveIntent' | +| `waitForIt` | Boolean | Should be `true` if there's an `auctionDelay` defined (recommended) | no | Default `false` | diff --git a/dev-docs/modules/userid-submodules/liveintent.md b/dev-docs/modules/userid-submodules/liveintent.md index 52d3fbfa84..5edd194dde 100644 --- a/dev-docs/modules/userid-submodules/liveintent.md +++ b/dev-docs/modules/userid-submodules/liveintent.md @@ -101,7 +101,12 @@ pbjs.setConfig({ ### Multiple user IDs -The attributes `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sharethrough`, `sovrn`, `index`, `thetradedesk`, `vidazoo` and `fpid` are treated specially by LiveIntent's user ID sub-module. Each of these attributes will result in a separate ID returned by the sub-module. Note: `thetradedesk` will be exposed as `tdid` because of historical reasons. +The attributes `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, , `sharethrough`, `sovrn`, `index`, `thetradedesk`, `vidazoo` and `fpid` are treated specially by LiveIntent's user ID sub-module. Each of these attributes will result in a separate ID returned by the sub-module. + +#### Note + +* `thetradedesk` will be exposed as `tdid` because of historical reasons. +* In order for `segments` to be present in `ortb2.user.data` of the bid requests, you need to configure the [liveIntentRTDProvider](/dev-docs/modules/liveIntentRtdProvider.html) module. For example, in case `uid2` is configured to be requested in addition to the `nonID`, the `request.userId` object would look like the following: @@ -204,7 +209,7 @@ NOTE: For optimal performance, the LiveIntent ID sub-module should be called at | params.ajaxTimeout |Optional| Number |This configuration parameter defines the maximum duration of a call to the `IdentityResolution` endpoint. By default, 5000 milliseconds.|`5000`| | 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 and additional attributes.|`['my-id']`| -| params.requestedAttributesOverrides | Optional | Object | Object containing booleans used to override the default resolution. Attributes set to `true` will be added to the resolved list, while attributes set to `false` will be removed. Valid attributes are `nonId`, `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk` (`tdid`), `sharethrough`, `vidazoo` and `fpid`. | `{'uid2': true}` | +| params.requestedAttributesOverrides | Optional | Object | Object containing booleans used to override the default resolution. Attributes set to `true` will be added to the resolved list, while attributes set to `false` will be removed. Valid attributes are `nonId`, `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk` (`tdid`), `sharethrough`, `vidazoo`, `segments` and `fpid`. | `{'uid2': true}` | | params.emailHash |Optional| String |The hashed email address of a user. We can accept the hashes, which use the following hashing algorithms: md5, sha1, sha2.|`1a79a4d60de6718e8e5b326e338ae533`| | params.url | Optional| String |Use this to change the default endpoint URL if you can call the LiveIntent Identity Exchange within your own domain.|`https://idx.my-domain.com`| | params.liCollectConfig |Optional| Object |Container of all collector params.|| From f23d034a8ec3f52ae9da011fa48f70ef8a5127f5 Mon Sep 17 00:00:00 2001 From: Carlos Felix Date: Fri, 17 Jan 2025 06:23:09 -0600 Subject: [PATCH 391/816] Add the 33across hem optional parameter to the documentation (#5793) --- dev-docs/modules/userid-submodules/33across.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/dev-docs/modules/userid-submodules/33across.md b/dev-docs/modules/userid-submodules/33across.md index 0ec7bd2237..c923df0b9d 100644 --- a/dev-docs/modules/userid-submodules/33across.md +++ b/dev-docs/modules/userid-submodules/33across.md @@ -30,6 +30,7 @@ The following configuration parameters are available: | name | Required | String | The name of this sub-module | `"33acrossId"` | | params ||| Details for the sub-module initialization || | params.pid | Required | String | Partner ID (PID) | Please reach out to [PrebidUIM@33across.com](mailto:PrebidUIM@33across.com) and request your PID | +| params.hem | Optional | String | Hashed email address in sha256 format | `"ba4235544d6c91865fb07.."` | | params.storeFpid | Optional | Boolean | Indicates whether a supplemental first-party ID may be stored to improve addressability | `true` (default) or `false` | | params.storeTpid | Optional | Boolean | Indicates whether a supplemental third-party ID may be stored to improve addressability | `true` (default) or `false` | | storage ||||| @@ -46,8 +47,7 @@ pbjs.setConfig({ userIds: [{ name: "33acrossId", params: { - pid: "0010b00002GYU4eBAH", // Example ID - storeFpid: true + pid: "0010b00002GYU4eBAH" // Example ID }, storage: { name: "33acrossId", @@ -59,3 +59,7 @@ pbjs.setConfig({ } }); ``` + +## HEM Collection + +33Across ID System supports user's hashed emails (HEMs). HEMs could be collected from 3 different sources in following priority order: `hem` configuration parameter, global `_33across.hem.sha256` field or from storage (cookie or local storage). From 305475d5ce11a759965f175a4e9f535ec3e5b138 Mon Sep 17 00:00:00 2001 From: MadSense Ops Date: Fri, 17 Jan 2025 13:24:05 +0100 Subject: [PATCH 392/816] Submit MadSense Adapter (#5729) * Submit MadSense Adapter * Handle company_id as a string * Update madsense dev-docs --- dev-docs/bidders/madsense.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 dev-docs/bidders/madsense.md diff --git a/dev-docs/bidders/madsense.md b/dev-docs/bidders/madsense.md new file mode 100644 index 0000000000..cacbcbbd09 --- /dev/null +++ b/dev-docs/bidders/madsense.md @@ -0,0 +1,31 @@ +--- +layout: bidder +title: MadSense +description: Prebid MadSense Bidder Adapter +pbjs: true +pbs: false +biddercode: madsense +tcfeu_supported: false +gdpr_supported: true +usp_supported: true +schain_supported: true +media_types: banner, video +safeframes_ok: true +deals_supported: false +floors_supported: true +fpd_supported: false +multiformat_supported: will-not-bid +sidebarType: 1 + +--- + +### Integration + +The MadSense Header Bidding adapter needs approval from the MadSense team. For more details, contact . + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|------|----------|--------------------|-------------|-----------| +| `company_id` | required | Company ID | `'1234567'` | `string` | From 37a91501d2b7489c8812bfe45ead671cf4d4fedd Mon Sep 17 00:00:00 2001 From: escalax Date: Fri, 17 Jan 2025 14:24:25 +0200 Subject: [PATCH 393/816] Add Prebid.js bid parameters to Escalax documentation (#5721) --- dev-docs/bidders/escalax.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/escalax.md b/dev-docs/bidders/escalax.md index f3b1b2cbe9..3bede695da 100644 --- a/dev-docs/bidders/escalax.md +++ b/dev-docs/bidders/escalax.md @@ -10,6 +10,7 @@ schain_supported: true media_types: banner, video, native safeframes_ok: true deals_supported: true +pbjs: true pbs: true sidebarType: 1 floors_supported: true @@ -25,10 +26,19 @@ userIds: all The Escalax Bidding adapter requires setup before beginning. Please contact us at -### Bid Params +### Bid Params for Prebid Server {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |---------------|----------|-----------------------|-----------|-----------| | `sourceId` | required | Patner name | `'partner'` | `string` | | `accountId` | required | Hash | `'0800fc577294'` | `string` | + +### Bid Params for Prebid.js + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|-----------------------|-----------|-----------| +| `sourceId` | required | Unique hash | `'partner'` | `string` | +| `accountId` | required | Unique name | `'0800fc577294'` | `string` | +| `subdomain` | optional | Escalax region | `'bidder_us'` | `string` | From 63fce888239f4978aa978a757b9292a6a63dc022 Mon Sep 17 00:00:00 2001 From: PeiZ <74068135+peixunzhang@users.noreply.github.com> Date: Sun, 19 Jan 2025 15:27:08 +0100 Subject: [PATCH 394/816] LiveIntent UserId Module: add IP and User Agent Configuration Parameters (#5688) * CM-1329 Add IP and User Agent Configuration Parameters To Prebid * comment --- dev-docs/modules/userid-submodules/liveintent.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dev-docs/modules/userid-submodules/liveintent.md b/dev-docs/modules/userid-submodules/liveintent.md index 5edd194dde..f9379cdb45 100644 --- a/dev-docs/modules/userid-submodules/liveintent.md +++ b/dev-docs/modules/userid-submodules/liveintent.md @@ -101,7 +101,7 @@ pbjs.setConfig({ ### Multiple user IDs -The attributes `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, , `sharethrough`, `sovrn`, `index`, `thetradedesk`, `vidazoo` and `fpid` are treated specially by LiveIntent's user ID sub-module. Each of these attributes will result in a separate ID returned by the sub-module. +The attributes `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk`, `sharethrough`, `sonobi`, `vidazoo` and `fpid` are treated specially by LiveIntent's user ID sub-module. Each of these attributes will result in a separate ID returned by the sub-module. Note: `thetradedesk` will be exposed as `tdid` because of historical reasons. #### Note @@ -211,6 +211,9 @@ NOTE: For optimal performance, the LiveIntent ID sub-module should be called at | params.identifiersToResolve |Optional| Array[String] |Used to send additional identifiers in the request for LiveIntent to resolve against the LiveIntent ID and additional attributes.|`['my-id']`| | params.requestedAttributesOverrides | Optional | Object | Object containing booleans used to override the default resolution. Attributes set to `true` will be added to the resolved list, while attributes set to `false` will be removed. Valid attributes are `nonId`, `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk` (`tdid`), `sharethrough`, `vidazoo`, `segments` and `fpid`. | `{'uid2': true}` | | params.emailHash |Optional| String |The hashed email address of a user. We can accept the hashes, which use the following hashing algorithms: md5, sha1, sha2.|`1a79a4d60de6718e8e5b326e338ae533`| +| params.ipv4 |Optional| String |The IPv4 address of a user. |`1.2.3.4`| +| params.ipv6 |Optional| String |The IPv6 address of a user. |`2001:db8:3333:4444:5555:6666:7777:8888`| +| params.userAgent |Optional| String |The user agent of a user. Example of a Safari string: |`Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1`| | params.url | Optional| String |Use this to change the default endpoint URL if you can call the LiveIntent Identity Exchange within your own domain.|`https://idx.my-domain.com`| | params.liCollectConfig |Optional| Object |Container of all collector params.|| | params.liCollectConfig.fpiStorageStrategy |Optional| String |This parameter defines whether the first-party identifiers that LiveConnect creates and updates are stored in a cookie jar, or in local storage. If nothing is set, default behaviour would be `cookie`. Allowed values: [`cookie`, `ls`, `none`]|`cookie`| From 311f1fb813760e4b8a3f6b0fb3a74686d4874469 Mon Sep 17 00:00:00 2001 From: Jeff Mahoney Date: Mon, 20 Jan 2025 10:44:47 -0500 Subject: [PATCH 395/816] Equativ Bid Adapter: adding more examples (#5823) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * SADR-6590: initial documentation for Equativ JS bid adapter * SADR-6590: doc refinements * Update equativ.md SADR-6590: adjustments to doc from review feedback. * SADR-6590: fix linting issues * SADR-6590: another linting issue * update app.publisher.id * SADR-6590: providing link to Equativ OpenRTB API documentation * SADR-6590: providing additional required fields for documentation * SADR-6590: adding peer answers to questions * SADR-6590: remove FPD section for now * Equativ: updating documentation on bid adapter parameter requirements * SADR-6882: expanding documentation with additional examples --------- Co-authored-by: Krzysztof Sokół --- dev-docs/bidders/equativ.md | 297 ++++++++++++++++++++++++++++++------ 1 file changed, 253 insertions(+), 44 deletions(-) diff --git a/dev-docs/bidders/equativ.md b/dev-docs/bidders/equativ.md index 4ddca56f68..7d39a7a6f6 100644 --- a/dev-docs/bidders/equativ.md +++ b/dev-docs/bidders/equativ.md @@ -30,7 +30,9 @@ sidebarType: 1 The Equativ bidder adapter requires setup and approval from the Equativ service team. Please reach out to your account manager for more information to start using it. -### Bid params +### Bid Params + +#### Fields {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | @@ -40,16 +42,53 @@ The Equativ bidder adapter requires setup and approval from the Equativ service | `pageId` | optional | The placement page ID. _See **Bid Parameter Usage** notes below for more information_. | `1234` | `integer` | | `formatId` | optional | The placement format ID. _See **Bid Parameter Usage** notes below for more information_. | `1234` | `integer` | -#### Bid Parameter Usage +#### Usage Different combinations of parameters are required depending upon which ones you choose to use. -There are two options for passing parameters: +There are two options for passing Equativ-specific bidder parameters: through bidder params, or through ortb2. + +##### Through bidder params Object + +Publishers can specify required and/or optional parameters through the bidder params object hierarchy like this: + +```javascript +var adUnits = [ + { + /// ... mediaType and other stuff here + bids: [ + { + bidder: 'equativ', + params: { + networkId: 42, // REQUIRED + siteId: 142, // optional + pageId: 242, // optional + formatId: 342, // optional + }, + }, + ], + }, +]; +``` + +##### Through ortb2 -- **Option 1**. Specify `networkId` by itself (_and optionally providing_ `siteId`, `pageId` and `formatId`), or -- **Option 2**. Specify either `ortb2.site.publisher.id`, `ortb2.app.publisher.id` or `ortb2.dooh.publisher.id` +A second way to specify Equativ-specific bidder parameters is through the `ortb2` object. The example below references a `ortb2.site.publisher.id` hierarchy, but publishers can also use `ortb2.app.publisher.id` or `ortb2.dooh.publisher.id` as their needs dictate. -See **Sample Banner Setup** for examples of these parameter options. +```javascript +pbjs.setBidderConfig({ + bidders: ['equativ'], + config: { + ortb2: { + site: { + publisher: { + id: 42, + }, + }, + }, + }, +}); +``` ### Supported Media Types @@ -57,12 +96,12 @@ See **Sample Banner Setup** for examples of these parameter options. | Type | Support | |---|---| | `banner` | Supported | -| `video` | Not currently supported | -| `native` | Not currently supported | +| `video` | Supported | +| `native` | Supported | ### User Syncing -To enable cookie syncing, make sure their configuration setup is properly invoked. +To enable cookie syncing, make sure the configuration setup is properly invoked. This involves adding an entry for `setConfig()` that allows user syncing for iframes with `'equativ'` included as a bidder: @@ -88,54 +127,224 @@ pbjs.bidderSettings = { }; ``` -### Configuration Example +### Ad Unit Setup -#### Sample Banner Setup +#### Banner -As mentioned in the **Bid Parameter Usage** section, when including `'equativ'` as one of your available bidders your adunit setup, there are two approaches to how you can specify parameters. Below are examples that illustrate them. +As mentioned in the **Bid Params > Usage** section, when including `'equativ'` as one of the available bidders in an adunit setup, there are two approaches to how publishers can specify parameters. The below example uses the approach using the `params` object. -#### Option 1 -- Using networkId as a parameter +```javascript +var bannerAdUnits = [ + { + code: 'div-123', + mediaTypes: { + banner: { + sizes: [ + [600, 500], + [300, 600], + ], + }, + }, + bids: [ + { + bidder: 'equativ', + params: { + networkId: 42, // REQUIRED + siteId: 142, // optional + pageId: 242, // optional + formatId: 342, // optional + }, + }, + ], + }, +]; -```html - +pbjs.que.push(function () { + pbjs.addAdUnits(nativeAdUnits); +}); ``` -#### Option 2 - Using ortb2 for parameter info +#### Audio + +It is possible to specify audio inventory through the Equativ adapter. To do so, publishers can define a video-formatted ad unit and specify audio information through the `ortb2Imp` property, like the example shown below. -You can also, as an alternative to using bidder params, specify a value for `publisher.id` that may be nested under an `app`, `site` or `dooh` object. The Equativ adapter will, in turn, look for these property paths under the `ortb2` property of the request: +Note that the `optional`, `recommended` and `REQUIRED` comments apply to the property itself, and not necessarily the values used in this example (_i.e._ `minduration` _is a recommended property to include, but it is up to publishers to decide what particular value it should have_). + +```javascript +var audioAdUnits = [ + { + code: '/19968336/header-bid-tag-1', + mediaTypes: { + video: { + context: 'instream', + playerSize: [640, 480], + }, + }, + ortb2Imp: { + audio: { + mimes: ['audio/mpeg', 'audio/mp4'], // REQUIRED + api: [7], // optional + delivery: [2, 4], // optional + minbitrate: 128, // optional + maxbitrate: 192, // optional + minduration: 10, // recommended + maxduration: 30, // recommended + maxextended: -1, // optional + protocols: [1, 3, 4, 7], // recommended + startdelay: 5, // recommended + }, + }, + bids: [ + { + bidder: 'equativ', + params: { + networkId: 1234, + }, + }, + ], + }, +]; + +pbjs.que.push(function () { + pbjs.addAdUnits(audioAdUnits); +}); +``` -- `ortb2.app.publisher.id` -- `ortb2.site.publisher.id` -- `ortb2.dooh.publisher.id` +{: .alert.alert-warning :} +**Note**: If a demand partner of Equativ is not capable of reading an audio object, the audio object will be converted into a video object with audio mime types. There is, as of this writing, no built-in/default support for serving audio assets in Prebid, so publishers that wish to do so will need to ensure their ad server setups can process whatever hand-offs are necessary. ### Additional Resources From f985cefab7b5e507c9ff574789ff8fb90d76d5c5 Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 21 Jan 2025 16:06:43 -0500 Subject: [PATCH 396/816] Update prebid-universal-creative.md (#5826) adding links to specific examples --- overview/prebid-universal-creative.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/overview/prebid-universal-creative.md b/overview/prebid-universal-creative.md index d73c1b4e34..e691b8fcc4 100644 --- a/overview/prebid-universal-creative.md +++ b/overview/prebid-universal-creative.md @@ -43,6 +43,8 @@ by allowing the ad server creative to load banner.js, video.js, or native.js, wh This loads the PUC from the Prebid-maintained location. Your managed service provider may have a different location. +To see specific examples of how to use the PUC within your ad server, see the guides for [GAM](/adops/gam-creative-banner-sbs.html), [Microsoft](/adops/setting-up-prebid-with-the-appnexus-ad-server.html), or [other ad servers](/adops/adops-general-sbs.html). + ## Features of the PUC ### What the PUC does for Web iframe Banners/In-Renderer From 7df22f1d5d2e40da29d8836a07d598eedc1f3c1f Mon Sep 17 00:00:00 2001 From: Komal Kumari <169047654+pm-komal-kumari@users.noreply.github.com> Date: Fri, 24 Jan 2025 19:41:50 +0530 Subject: [PATCH 397/816] Bug: Update the code for ortb2Imp for setting floorMin (#5825) Co-authored-by: Komal Kumari --- dev-docs/modules/floors.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dev-docs/modules/floors.md b/dev-docs/modules/floors.md index 995c9cd850..b639d54909 100644 --- a/dev-docs/modules/floors.md +++ b/dev-docs/modules/floors.md @@ -1282,10 +1282,10 @@ pbjs.addAdUnits({ ortb2Imp: { ext: { prebid: { - data: { - floorMin: 0.25, - floorMinCur: "USD" - } + floors: { + floorMin: 0.25, + floorMinCur: "USD" + } } } }, From de81b7a8bfa8881e681072e23d9e263f74c37c14 Mon Sep 17 00:00:00 2001 From: Siminko Vlad <85431371+siminkovladyslav@users.noreply.github.com> Date: Mon, 27 Jan 2025 09:11:43 +0100 Subject: [PATCH 398/816] OMS Adapter: add video to media types list (#5821) --- dev-docs/bidders/oms.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/oms.md b/dev-docs/bidders/oms.md index 5990e56780..2dbb100676 100644 --- a/dev-docs/bidders/oms.md +++ b/dev-docs/bidders/oms.md @@ -11,7 +11,7 @@ biddercode: oms prebid_member: false floors_supported: true safeframes_ok: true -media_types: banner +media_types: banner, video schain_supported: true userIds: id5Id, identityLink, pubProvidedId pbs_app_supported: true From 98d455f82d417bba4c66b0e143d48e80328ed44f Mon Sep 17 00:00:00 2001 From: Saar Amrani Date: Mon, 27 Jan 2025 10:12:45 +0200 Subject: [PATCH 399/816] Added support for pbs in kueezrtb bid adapter. (#5814) --- dev-docs/bidders/kueezrtb.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/kueezrtb.md b/dev-docs/bidders/kueezrtb.md index 1913c1d63a..273a308753 100644 --- a/dev-docs/bidders/kueezrtb.md +++ b/dev-docs/bidders/kueezrtb.md @@ -21,6 +21,7 @@ ortb_blocking_supported: false multiformat_supported: will-bid-on-one gvl_id: 1165 pbjs: true +pbs: true sidebarType: 1 --- @@ -31,7 +32,7 @@ sidebarType: 1 | Name | Scope | Description | Example | Type | |------------|----------|-------------------------------------------------------------------------------------------|------------------------------|----------| | `cId` | required | The connection ID from KueezRTB. | `'562524b21b1c1f08117fc7f9'` | `string` | -| `pId` | required | The publisher ID from KueezRTB. | `'59ac17c192832d0011283fe3'` | `string` | +| `pId` | required | The publisher ID from KueezRTB (pbjs only). | `'59ac17c192832d0011283fe3'` | `string` | | `bidFloor` | optional | The minimum bid value desired. KueezRTB will not respond with bids lower than this value. | `0.90` | `float` | ### Example From 973f026350733ef53d452dee6eed6f9308de3b26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriela=20Mi=C4=99dlar?= <155444733+gmiedlar-ox@users.noreply.github.com> Date: Mon, 27 Jan 2025 09:45:34 +0100 Subject: [PATCH 400/816] Update OpenX docs with native support (#5829) --- dev-docs/bidders/openx.md | 86 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 85 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/openx.md b/dev-docs/bidders/openx.md index 2bdc0951f9..694e8e423c 100644 --- a/dev-docs/bidders/openx.md +++ b/dev-docs/bidders/openx.md @@ -5,7 +5,7 @@ description: Prebid OpenX Bidder Adaptor pbjs: true pbs: true biddercode: openx -media_types: banner, video +media_types: banner, video, native schain_supported: true tcfeu_supported: true usp_supported: true @@ -154,6 +154,63 @@ var videoAdUnits = [ }] ``` +#### Native + +{: .table .table-bordered .table-striped } + +| Name | Scope | Description | Example | Type | +| ---- | ----- | ----------- | ------- | ---- | +| `delDomain` ~~or `platform`~~** | required | OpenX delivery domain provided by your OpenX representative. | "PUBLISHER-d.openx.net" | String | +| `unit` | required | OpenX ad unit ID provided by your OpenX representative. | "1611023122" | String | +| `customParams` | optional | User-defined targeting key-value pairs. customParams applies to a specific unit. | `{key1: "v1", key2: ["v2","v3"]}` | Object | +| `customFloor` | optional | Minimum price in USD. customFloor applies to a specific unit. For example, use the following value to set a $1.50 floor: 1.50

    **WARNING:**
    Misuse of this parameter can impact revenue.

    Note:
    OpenX suggests using the [Price Floor Module](/dev-docs/modules/floors.html) instead of customFloor. The Price Floor Module is prioritized over customFloor if both are present. | 1.50 | Number | +| `doNotTrack` | optional | Prevents advertiser from using data for this user.

    **WARNING:**
    Impacts all bids in the request. May impact revenue. | true | Boolean | +| `coppa` | optional | Enables Child's Online Privacy Protection Act (COPPA) regulations. **WARNING:**
    Impacts all bids in the request. May impact revenue. | true | Boolean | + +** platform is deprecated. Please use delDomain instead. If you have any questions please contact your representative. + +### AdUnit Format for Native + +```javascript +var adUnits = [ + { + code: 'test-div-native', + mediaTypes: { + native: { + ortb: { + assets: [ + { + id: 1, + required: 1, + img: { + type: 3, + w: 150, + h: 50, + } + }, { + id: 2, + required: 1, + title: { + len: 80 + } + } + ] + } + } + }, + bids: [ + { + bidder: 'openx', + params: { + unit: '539439964', + delDomain: 'se-demo-d.openx.net' + } + } + ] + } +]; +``` + ### Example ```javascript @@ -202,6 +259,33 @@ var adUnits = [ delDomain: 'PUBLISHER-d.openx.net' } }] + }, + { + code: 'native1', + mediaTypes: { + native: { + ortb: { + assets: [ + { + id: 1, + required: 1, + img: { + type: 3, + w: 150, + h: 50, + } + } + ] + } + } + }, + bids: [{ + bidder: 'openx', + params: { + unit: '539439964', + delDomain: 'se-demo-d.openx.net' + } + }] } ]; ``` From a1681ca38f97f6964d2b2121eeab6d148c34af44 Mon Sep 17 00:00:00 2001 From: Patrick McCann Date: Mon, 27 Jan 2025 14:58:01 -0500 Subject: [PATCH 401/816] Update tcfControl.md (#5833) * Update tcfControl.md * lint fixed linting problem, removed extra quote --------- Co-authored-by: bretg --- dev-docs/modules/tcfControl.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dev-docs/modules/tcfControl.md b/dev-docs/modules/tcfControl.md index 6cf003986d..e5b336f07d 100644 --- a/dev-docs/modules/tcfControl.md +++ b/dev-docs/modules/tcfControl.md @@ -191,7 +191,7 @@ A goal of 'basic legal basis' is to confirm that there's enough evidence of cons Evidence of consent for a particular purpose or vendor means that: -* Prebid.js has the the user's purpose or vendor consent, or +* Prebid.js has the the user's vendor purpose or vendor consent, or * (for Purpose 2 only) we've confirmed the user's Legitimate Intereset (LI) Transparency is established for this purpose or vendor. Before allowing an activity tied to a TCF-protected Purpose for a given vendor, one of these scenarios must be true: @@ -210,6 +210,8 @@ Before allowing an activity tied to a TCF-protected Purpose for a given vendor, See the [IAB TCF Consent String Format](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20Consent%20string%20and%20vendor%20list%20formats%20v2.md) for details. +Before allowing an activity tied to a TCF-protected Purpose for a publisher module, such as Generic Analytics, SharedId, Pub-provided-id, configuration rules check for the relevant publisher purpose consent instead of vendor consent. IAB Europe officials have written to Prebid that "When one is seeking a signal indicating whether the Publisher has had their consent (or legitimate interest) legal basis established to the data subject by the CMP, one should examine the Publisher Purposes Transparency and Consent string segment signals, if present. The core string PurposesConsent bit sequence is intended solely to represent disclosures made by the CMP in the context of Vendors." + ### Note on Extended User IDs From 065f3d4fd553264d49c28b5fffad5b5961cfb979 Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 28 Jan 2025 16:20:50 -0500 Subject: [PATCH 402/816] PBS Floors updates (#5837) --- prebid-server/features/pbs-floors.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/prebid-server/features/pbs-floors.md b/prebid-server/features/pbs-floors.md index be0b30fabc..64a953f373 100644 --- a/prebid-server/features/pbs-floors.md +++ b/prebid-server/features/pbs-floors.md @@ -272,17 +272,20 @@ Here are the configurable items: | Config | Type | Default | Description | |---+---+---+---| | enabled | boolean | true | Master switch for turning off the floors feature for this account. | -| enforce-floors-rate | integer | 100 | Default value for the enforceRate attribute. | -| adjust-for-bid-adjustment | boolean | true | Default value for the enforcement.bidAdjustment attribute. | -| enforce-deal-floors | boolean | false | Default value for the enforcement.floorDeals attribute. | +| enforce-floors-rate (PBS-Java)
    enforce_floors_rate (PBS_Go) | integer | 100 | Default value for the enforceRate attribute. | +| adjust-for-bid-adjustment (PBS-Java)
    adjust_for_bid_adjustment (PBS_Go) | boolean | true | Default value for the enforcement.bidAdjustment attribute. | +| enforce-deal-floors (PBS-Java)
    enforce_deal_floors (PBS_Go) | boolean | false | Default value for the enforcement.floorDeals attribute. | | fetch.enabled | boolean | false | Turns on the polling of an external dynamic floor data source. | | fetch.url | string | - | URL for the external dynamic floor data source. | -| fetch.timeout-ms | integer | 3000 | How long to wait for the dynamic floor data source. | -| fetch.max-file-size-kb | integer | 100 | How big can the rule data get before being rejected. Helps protect memory problems. | -| fetch.max-rules | integer | 1000 | How many rules is too many. Helps protect processing time. | -| fetch.max-age-sec | integer | 86400 | How long is dynamically fetched data considered usable? | -| fetch.period-sec | integer | 3600 | How often between attempts to poll for updated data? | -| use-dynamic-data | boolean | true | Can be used as an emergency override to start ignoring dynamic floors data if something goes wrong. | +| fetch.timeout-ms (PBS-Java)
    fetch.timeout_ms (PBS_Go) | integer | 3000 | How long to wait for the dynamic floor data source. | +| fetch.max-file-size-kb (PBS-Java)
    fetch.max_file_size_kb (PBS_Go) | integer | 100 | How big can the rule data get before being rejected. Helps protect memory problems. | +| fetch.max-rules (PBS-Java)
    fetch.max_rules (PBS_Go) | integer | 1000 | How many rules is too many. Helps protect processing time. | +| fetch.max-age-sec (PBS-Java)
    fetch.max_age_sec (PBS_Go) | integer | 86400 | How long is dynamically fetched data considered usable? | +| fetch.period-sec (PBS-Java)
    fetch.period_sec (PBS_Go) | integer | 3600 | How often between attempts to poll for updated data? | +| fetch.max-schema-dims (PBS-Java)
    fetch.max_schema_dims (PBS_Go) | integer | 0 | Limit the number of concurrent schema dimensions a floor provider can include in a given set of floor rules. A value of 0 means no maximum. Valid values are 0-19. | +| use-dynamic-data (PBS-Java)
    use_dynamic_data (PBS_Go) | boolean | true | Can be used as an emergency override to start ignoring dynamic floors data if something goes wrong. | +| max-schema-dims (PBS-Java)
    max_schema_dims (PBS_Go) | integer | 0 | Limit the number of concurrent schema dimensions a floor provider can include in a given set of floor rules. A value of 0 means no maximum. Valid values are 0-19. | +| max-rules (PBS-Java)
    max_rules (PBS_Go) | integer | 100 | Limits the number of rules processed when they come in on the request (or in stored requests). A value of 0 means no maximum. | The precise details of configuration may differ for PBS-Java vs PBS-Go. See the configuration document for your platform. From ab162a8dc137b60116a2ee60ecc6884f05e5c07c Mon Sep 17 00:00:00 2001 From: Ivan Krdzavac Date: Wed, 29 Jan 2025 16:04:06 +0100 Subject: [PATCH 403/816] set pbs to true for ogury (#5742) --- dev-docs/bidders/ogury.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/ogury.md b/dev-docs/bidders/ogury.md index 151191dee1..35380a40cb 100644 --- a/dev-docs/bidders/ogury.md +++ b/dev-docs/bidders/ogury.md @@ -14,7 +14,7 @@ media_types: banner safeframes_ok: false deals_supported: false pbjs: true -pbs: false +pbs: true prebid_member: false sidebarType: 1 gpp_sids: tcfeu, usnat, usstate_all From 8dc827d0dcdba51049ff0e3988b9ee0729612b02 Mon Sep 17 00:00:00 2001 From: Florian Erl <46747754+florianerl@users.noreply.github.com> Date: Thu, 30 Jan 2025 19:09:24 +0100 Subject: [PATCH 404/816] Update criteo.md (#5839) --- dev-docs/bidders/criteo.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/criteo.md b/dev-docs/bidders/criteo.md index c09461da08..658147ca3f 100644 --- a/dev-docs/bidders/criteo.md +++ b/dev-docs/bidders/criteo.md @@ -34,9 +34,9 @@ Prebid-Server support is on alpha test and is currently a non-finished product. {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |-------------------|----------|----------------------------------------------------------------------------------------------------------------------|-----------------------------------------------|------------| -| `zoneId` | required | (deprecated) The zone ID from Criteo. Should be replaced by `networkId` when using zone matching. | `234234` | `integer` | +| `zoneId` | optional, deprecated | (deprecated) The zone ID from Criteo. Should be replaced by `networkId` when using zone matching. | `234234` | `integer` | | `networkId` | required | The network ID from Criteo. Please reach out your Criteo representative for more details. | `456456` | `integer` | -| `pubid` | required | publisher id | `'ABC123'` | `string` | +| `pubid` | optional | Publisher id of your inventory group provided by your Technical account manager if using inventory groups to map your inventory in Commerce Grid | `'ABC123'` | `string` | | `uid` | optional | Ad Unit ID | `'8888'` | `string` | | `nativeCallback` | optional | (deprecated) (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` | From 20503bdb5ae2988102806b1bcaf59c64c42eabe0 Mon Sep 17 00:00:00 2001 From: Dmytro Shyrokov Date: Fri, 31 Jan 2025 16:59:43 +0200 Subject: [PATCH 405/816] xeworks docs: change prebid_member flag (#5831) --- dev-docs/bidders/xe.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/xe.md b/dev-docs/bidders/xe.md index 44a50d2d88..061df3aa74 100644 --- a/dev-docs/bidders/xe.md +++ b/dev-docs/bidders/xe.md @@ -7,7 +7,7 @@ media_types: banner, video coppa_supported: true tcfeu_supported: false usp_supported: true -prebid_member: false +prebid_member: true pbjs: true pbs: true schain_supported: true From 7c6b0a9d020c290716fa8605469ded2e1a5f3732 Mon Sep 17 00:00:00 2001 From: jsut Date: Mon, 3 Feb 2025 02:29:29 -0500 Subject: [PATCH 406/816] Fix indenting on pbAdSlot examples (#5844) --- features/pbAdSlot.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/features/pbAdSlot.md b/features/pbAdSlot.md index c67054b0c1..51f36be49f 100644 --- a/features/pbAdSlot.md +++ b/features/pbAdSlot.md @@ -74,7 +74,7 @@ pbjs.addAdUnits({ ortb2Imp: { ext: { gpid: "/1111/homepage-leftnav", - data: { + data: { pbadslot: "/1111/homepage-leftnav" } } @@ -95,7 +95,7 @@ pbjs.addAdUnits({ ortb2Imp: { ext: { gpid: "/1111/homepage#div-leftnav", - data: { + data: { pbadslot: "/1111/homepage#div-leftnav" } } @@ -118,7 +118,7 @@ pbjs.addAdUnits({ ortb2Imp: { ext: { gpid: "/1111/homepage#300x250", - data: { + data: { pbadslot: "/1111/homepage#300x250" } } @@ -130,7 +130,7 @@ pbjs.addAdUnits({ ortb2Imp: { ext: { gpid: "/1111/homepage#728x90", - data: { + data: { pbadslot: "/1111/homepage#728x90" } } From ed7917a24cb56a65513a3495b220f9b7909818ba Mon Sep 17 00:00:00 2001 From: danijel-ristic <168181386+danijel-ristic@users.noreply.github.com> Date: Mon, 3 Feb 2025 08:30:44 +0100 Subject: [PATCH 407/816] TargetVideo: update docs (#5843) Co-authored-by: dnrstc --- dev-docs/bidders/targetvideo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/targetvideo.md b/dev-docs/bidders/targetvideo.md index 1262c5019e..61a73ace1c 100644 --- a/dev-docs/bidders/targetvideo.md +++ b/dev-docs/bidders/targetvideo.md @@ -16,4 +16,4 @@ sidebarType: 1 {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |---------------------|----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------|------------------| -| `placementId` | required | The placement ID from TargetVideo. You may identify a placement using the `invCode` and `member` instead of a placement ID. The `placementID` parameter can be either a `string` or `integer` for Prebid.js, however `integer` is preferred. Legacy code can retain the `string` value. **Prebid Server requires an integer value.** | `234234` | `integer` | +| `placementId` | required | The placement ID from TargetVideo. You will get this value from your TargetVideo account manager. The placementID parameter should be a `string`. | `234234` | `string` | From 98b8e4e2d7dc9f626e28eee83660911751b0d205 Mon Sep 17 00:00:00 2001 From: Antonios Sarhanis Date: Mon, 3 Feb 2025 18:33:03 +1100 Subject: [PATCH 408/816] Adds doco about supporting native ads. (#5841) --- dev-docs/bidders/adnuntius.md | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/adnuntius.md b/dev-docs/bidders/adnuntius.md index d720931716..978d434a77 100644 --- a/dev-docs/bidders/adnuntius.md +++ b/dev-docs/bidders/adnuntius.md @@ -5,7 +5,7 @@ description: Prebid Adnuntius Bidder Adaptor pbjs: true pbs: true biddercode: adnuntius -media_types: banner, video +media_types: banner, video, native tcfeu_supported: true fpd_supported: true gvl_id: 855 @@ -192,3 +192,36 @@ Currently we only support client requests and instream context. An example reque }] }; ``` + +### Native requests + +An example native request we support is as follows: + +```json +{ + "bid": [ + { + "bidId": "adn-0000000000000551", + "bidder": "adnuntius", + "params": { + "auId": "0000000000000551", + "network": "123", + }, + "mediaTypes": { + "native": { + "ortb": { + "assets": [{ + "id": 1, + "required": 1, + "img": { + "type": 3, + "w": 250, + "h": 250 + } + }] + } + } + } + } + ]} +``` From 6aaafebd4df75832c1d33a405236d03f8cab4391 Mon Sep 17 00:00:00 2001 From: bretg Date: Mon, 3 Feb 2025 14:05:48 -0500 Subject: [PATCH 409/816] Update native for sendTargetingKeys (#5852) * Update native docs to remove references to sendTargetingKeys * Update native for sendTargetingKeys * Undo changes to native-implementation * Fix example * Linter --------- Co-authored-by: Demetrio Girardi --- dev-docs/bidders/rubicon.md | 1 - dev-docs/bidders/yandex.md | 1 - prebid/native-implementation.md | 55 ++++++++++++++++----------------- 3 files changed, 26 insertions(+), 31 deletions(-) diff --git a/dev-docs/bidders/rubicon.md b/dev-docs/bidders/rubicon.md index c701ed3427..7256b383dc 100644 --- a/dev-docs/bidders/rubicon.md +++ b/dev-docs/bidders/rubicon.md @@ -270,7 +270,6 @@ var nativeAdUnit = { code: 'myNativeAdUnit', mediaTypes: { native: { - sendTargetingKeys: false, ortb: { ver:"1.2", context: 2, // required for 1.2 diff --git a/dev-docs/bidders/yandex.md b/dev-docs/bidders/yandex.md index 3aed7f78a4..1fbe3fc53c 100644 --- a/dev-docs/bidders/yandex.md +++ b/dev-docs/bidders/yandex.md @@ -57,7 +57,6 @@ const adUnits = [{ code: 'native-1', mediaTypes: { native: { - sendTargetingKeys: false, ortb: { assets: [{ id: 1, diff --git a/prebid/native-implementation.md b/prebid/native-implementation.md index f3eef59e63..ad1ab29313 100644 --- a/prebid/native-implementation.md +++ b/prebid/native-implementation.md @@ -24,7 +24,7 @@ This document replaces the [previous native documentation](/prebid/native-implem {% include alerts/alert_tip.html content=version2 %} - TOC -{:toc} + {:toc} ## Overview @@ -64,7 +64,7 @@ This table summarizes how the 3 approaches work: {: .table .table-bordered .table-striped } | Component | AdServer-Defined Creative Scenario | AdUnit-Defined Creative Scenario | Custom Renderer Scenario | | --- | --- |--- | --- | -| Prebid.js | mediaTypes. native.sendTargetingKeys: false | sendTargetingKeys:false and mediaTypes.native.adTemplate contains ##macros## | sendTargetingKeys:false and mediaTypes.native.rendererUrl | +| Prebid.js | mediaTypes. native.ortb | mediaTypes. native.ortb and mediaTypes.native.adTemplate contains ##macros## | mediaTypes. native.ortb and mediaTypes.native.rendererUrl | | Ad Server Key Value Pairs | hb_adid | hb_adid | hb_adid | | 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. | @@ -82,7 +82,7 @@ The Prebid.js AdUnit needs to define a native mediatype object to tell bidders w | adTemplate | optional | Used in the ‘AdUnit-Defined Creative Scenario’, this value will contain the Native template right in the page. | See [example](#42-implementing-an-adunit-defined-template) below. | escaped ES5 string | | rendererUrl | optional | Used in the ‘Custom Renderer Scenario’, this points to javascript code that will produce the Native template. | `'https://host/path.js'` | string | | ortb | recommended | OpenRTB configuration of the Native assets. The Native 1.2 specification can be found [here](https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf) | { assets: [], eventtrackers: [] } | object | -| sendTargetingKeys | deprecated | Defines whether or not to send the hb_native_ASSET targeting keys to the ad server. Defaults to `false`. | `false` | boolean | +| sendTargetingKeys | deprecated | (**NOTE**: not supported in 9.0 and later). Defines whether or not to send the hb_native_ASSET targeting keys to the ad server. Defaults to `false`. | `false` | boolean | ### 3.1. Prebid.js and the ORTB asset fields @@ -206,9 +206,7 @@ For instructions on implementing the native template within Google Ad Manager, s In this scenario, the body of the native creative template is managed within the ad server and includes special Prebid.js macros. -#### 4.1.1. Turn Targeting Keys off in Prebid.js - -When the native AdUnit is defined in the page, declare `sendTargetingKeys: false` in the native Object. This will prevent Prebid.js from sending all the native-related ad server targeting variables. +#### 4.1.1. Define the Native Assets in Prebid.js Example Native AdUnit: @@ -217,7 +215,6 @@ pbjs.addAdUnits({ code: slot.code, mediaTypes: { native: { - sendTargetingKeys: false, ortb: { assets: [{ id: 1, @@ -267,6 +264,9 @@ pbjs.addAdUnits({ }); ``` +{: .alert.alert-warning :} +In versions of Prebid.js before 9.0, you'll need to declare `mediatypes.native.sendTargetingKeys: false` in the AdUnit. This will prevent Prebid.js from sending all the native-related ad server targeting variables. + #### 4.1.2. Create the Native Template in the Ad Server There are three key aspects of the native template: @@ -274,9 +274,9 @@ 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.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 - 3. requestAllAssets - tells the renderer to get all the native assets from Prebid.js rather than having to scan the template to find which specific assets are needed. + 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 + 3. requestAllAssets - tells the renderer to get all the native assets from Prebid.js rather than having to scan the template to find which specific assets are needed. Example creative HTML: @@ -338,9 +338,6 @@ a { text-decoration: none; } -{: .alert.alert-info :} -See [Managing the Native Template in GAM](/adops/gam-native.html#managing-the-native-template-in-gam) for ad server instructions. - .attribution { color: #fff; font-size: 9px; @@ -353,6 +350,9 @@ See [Managing the Native Template in GAM](/adops/gam-native.html#managing-the-na } ``` +{: .alert.alert-info :} +See [Managing the Native Template in GAM](/adops/gam-native.html#managing-the-native-template-in-gam) for ad server instructions. + ### 4.2. Implementing an AdUnit-Defined Template In this scenario, the body of the native creative template is managed within the Prebid.js AdUnit and includes special Prebid.js macros. @@ -361,8 +361,8 @@ In this scenario, the body of the native creative template is managed within the When the Native AdUnit is defined in the page: -- Declare `sendTargetingKeys: false` in the native Object. This will prevent Prebid.js from sending all the native-related ad server targeting variables. - Define the adTemplate as an escaped ES5 string using Prebid.js ##macros##. (See the appendix for an exhaustive list of assets and macros.) Note that this approach only affects the HTML body. Any CSS definitions need to be defined in the body of the template or in the AdServer. +- In versions of Prebid.js before 9.0, declare `mediaTypes.native.sendTargetingKeys: false` in the AdUnit. This will prevent Prebid.js from sending all the native-related ad server targeting variables. Example AdUnit: @@ -371,7 +371,6 @@ var adUnits = [{ code: 'native-div', mediaTypes: { native: { - sendTargetingKeys: false, adTemplate: ` + \ No newline at end of file From b11cbd4bc817b699ea6c9fb5946ed82c5e84edb8 Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 20 Feb 2025 09:36:20 -0500 Subject: [PATCH 443/816] added storageAllowed disclaimer (#5898) * added storageAllowed disclaimer * lint * lint --- _includes/disclaimers/storageAllowed.md | 2 ++ dev-docs/bidders/adagio.md | 2 ++ dev-docs/bidders/amx.md | 4 +++- dev-docs/bidders/bitmedia.md | 2 ++ dev-docs/bidders/consumable.md | 2 ++ dev-docs/bidders/contxtful.md | 2 ++ dev-docs/bidders/equativ.md | 4 +++- dev-docs/bidders/impactify.md | 2 ++ dev-docs/bidders/ix-server.md | 8 ++++---- dev-docs/bidders/ix.md | 2 ++ dev-docs/bidders/kargo.md | 2 ++ dev-docs/bidders/mediaConsortium.md | 2 ++ dev-docs/bidders/nexx360.md | 3 ++- dev-docs/bidders/taboola.md | 2 ++ dev-docs/bidders/triplelift.md | 6 ++++-- dev-docs/bidders/visx.md | 6 ++++-- dev-docs/modules/userid-submodules/merkle.md | 2 +- prebid-mobile/pbm-api/android/pbm-targeting-android.md | 4 ++-- 18 files changed, 43 insertions(+), 14 deletions(-) create mode 100644 _includes/disclaimers/storageAllowed.md diff --git a/_includes/disclaimers/storageAllowed.md b/_includes/disclaimers/storageAllowed.md new file mode 100644 index 0000000000..ad0de11d01 --- /dev/null +++ b/_includes/disclaimers/storageAllowed.md @@ -0,0 +1,2 @@ +{: .alert.alert-info :} +Prebid note: please review with your legal counsel before enabling storageAllowed. Bidders utilizing browser storage may trigger the need for additional disclosures in your privacy policy and may imply that the bid adapter is performing an activity redundant with user ID systems like SharedID. See the ePrivacy Directive article 5(3) reference to 'comprehensive information'. diff --git a/dev-docs/bidders/adagio.md b/dev-docs/bidders/adagio.md index 1aa7b00cf4..87e44777e2 100644 --- a/dev-docs/bidders/adagio.md +++ b/dev-docs/bidders/adagio.md @@ -47,6 +47,8 @@ pbjs.setConfig({ The Adagio bid adapter uses browser local storage. Since Prebid.js 7.x, the access to it must be explicitly set. +{% include disclaimers/storageAllowed.md %} + ```js // https://docs.prebid.org/dev-docs/publisher-api-reference/bidderSettings.html pbjs.bidderSettings = { diff --git a/dev-docs/bidders/amx.md b/dev-docs/bidders/amx.md index b19d3bdce9..f2d59092ab 100644 --- a/dev-docs/bidders/amx.md +++ b/dev-docs/bidders/amx.md @@ -33,7 +33,9 @@ sidebarType: 1 ### Bidder Settings -The AMX RTB bid adapter uses local storage. Please add `storageAllowed` in your bidder settings: +The AMX RTB bid adapter uses local storage. Please add `storageAllowed` in your bidder settings. + +{% include disclaimers/storageAllowed.md %} ```js // https://docs.prebid.org/dev-docs/publisher-api-reference/bidderSettings.html diff --git a/dev-docs/bidders/bitmedia.md b/dev-docs/bidders/bitmedia.md index 24ed5e6cc3..dcc6c248da 100644 --- a/dev-docs/bidders/bitmedia.md +++ b/dev-docs/bidders/bitmedia.md @@ -93,6 +93,8 @@ The HTML file below can be used to test the integration of the Bitmedia Bid Adap ### Simple Test HTML +{% include disclaimers/storageAllowed.md %} + ```html >', + ext: { + adServerBaseUrl: '<<-- Required. Provided by Mobkoi -->>', + }, + }, + }, + }, + }, + }); +}); +``` diff --git a/dev-docs/bidders/mobkoi.md b/dev-docs/bidders/mobkoi.md new file mode 100644 index 0000000000..1929ad4b89 --- /dev/null +++ b/dev-docs/bidders/mobkoi.md @@ -0,0 +1,64 @@ +--- +layout: bidder +title: Mobkoi +description: Mobkoi Bidder Adapter +biddercode: mobkoi +tcfeu_supported: true +dsa_supported: false +gvl_id: 898 +usp_supported: false +coppa_supported: false +gpp_sids: tcfeu +schain_supported: false +dchain_supported: false +userId: mobkoiId +media_types: banner +safeframes_ok: false +deals_supported: false +floors_supported: false +fpd_supported: true +pbjs: true +pbs: false +prebid_member: false +multiformat_supported: will-bid-on-one +ortb_blocking_supported: partial +privacy_sandbox: no +sidebarType: 1 +--- + +### Note + +The Mobkoi Bidding adapter requires setup and approval before beginning. Please reach out to for +more details. + +### Bid Params + +{: .table .table-bordered .table-striped } +| Path | Scope | Description | Example | Type | +|---------------------------------------------|----------|------------------------------|---------------------------|-----------| +| `placementId` | required | Mobkoi Provided Placement ID | `'DF2FFFFF'` | `string` | + +#### Example Configuration + +```js +const adUnits = [ + { + code: 'banner-ad', + mediaTypes: { + banner: { sizes: [300, 200] }, + }, + bids: [ + { + bidder: 'mobkoi', + params: { + placementId: '<-- Placement ID provided by Mobkoi -->', + }, + }, + ], + }, +]; + +pbjs.que.push(function () { + pbjs.addAdUnits(adUnits); +}); +``` diff --git a/dev-docs/modules/userid-submodules/mobkoi.md b/dev-docs/modules/userid-submodules/mobkoi.md new file mode 100644 index 0000000000..92df14bbb9 --- /dev/null +++ b/dev-docs/modules/userid-submodules/mobkoi.md @@ -0,0 +1,51 @@ +--- +layout: userid +title: Mobkoi ID +description: Mobkoi ID User ID sub-module +useridmodule: mobkoiIdSystem +bidRequestUserId: mobkoiId +eidsource: mobkoi.com +example: '"1111111111111"' +--- + +The Mobkoi ID system provides user identification capabilities for improved addressability and targeted advertising. This module handles user ID synchronization and storage while supporting GDPR consent management. + +## Add Mobkoi ID to your Prebid.js Package + +Add the module to your Prebid.js package: + +```bash +gulp build --modules=consentManagementTcf,tcfControl,mobkoiIdSystem,userId +``` + +## Mobkoi ID Configuration + +{: .table .table-bordered .table-striped } +| Param under userSync.userIds[] | Scope | Type | Description | Example | +| --- | --- | --- | --- | --- | +| name | Required | String | The name of this module | `"mobkoiId"` | +| storage | Required | Object | Storage settings for the ID | | +| storage.type | Required | String | Where to store the ID - must be `"cookie"` | `"cookie"` | +| storage.name | Required | String | Cookie name for storing the ID | `"_mobkoi_Id"` | +| storage.expires | Required | Integer | Number of days before the cookie expires | `30` | + +## Example Configuration + +```javascript +pbjs.setConfig({ + userSync: { + userIds: [ + { + name: 'mobkoiId', + storage: { + type: 'cookie', + name: '_mobkoi_Id', + expires: 30, // days + }, + }, + ], + }, +}); +``` + +For integration support or questions, contact . From 40c1b854ef3ef67c0b973d2e1aef0ac6fc2ba1ce Mon Sep 17 00:00:00 2001 From: "Adserver.Online" <61009237+adserver-online@users.noreply.github.com> Date: Wed, 26 Feb 2025 17:35:51 +0200 Subject: [PATCH 458/816] add cordless alias doc (#5855) Co-authored-by: dev --- dev-docs/bidders/cordless.md | 44 ++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 dev-docs/bidders/cordless.md diff --git a/dev-docs/bidders/cordless.md b/dev-docs/bidders/cordless.md new file mode 100644 index 0000000000..d62f5623e2 --- /dev/null +++ b/dev-docs/bidders/cordless.md @@ -0,0 +1,44 @@ +--- +layout: bidder +title: Cordless.co +description: Cordless.co Bid Adapter +biddercode: cordless +tcfeu_supported: false +usp_supported: true +media_types: video, native +safeframes_ok: true +pbjs: true +pbs: true +pbs_app_supported: true +floors_supported: true +schain_supported: true +fpd_supported: true +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +userIds: all +sidebarType: 1 +aliasCode: aso +--- +### Note + +The Cordless.co adapter requires approval and setup. Please reach out to or visit us at [cordless.co](https://cordless.co) for more details. + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|------------------|---------------------------------|-----------| +| `server` | required | Server endpoint | `https://srv.cordlessmedia.com` | `String` | +| `zone` | required | Zone ID | `73815` | `Integer` | + +#### Video Caching + +Note that the Cordless.co adapter expects a client-side Prebid Cache to be enabled for video bidding. + +```js +pbjs.setConfig({ + cache: { + url: 'https://prebid.adnxs.com/pbc/v1/cache' + } +}); +``` From 375d8ca4b2a2199e081036fb9f23f63d905d9c55 Mon Sep 17 00:00:00 2001 From: SmartHubSolutions <87376145+SmartHubSolutions@users.noreply.github.com> Date: Wed, 26 Feb 2025 23:57:30 +0200 Subject: [PATCH 459/816] Attekmi: add new adapter Adinify (#5822) * Attekmi: add new adapter adinify * pbs to false, multiformat param fix * pbs to true --------- Co-authored-by: Victor --- dev-docs/bidders/adinify.md | 39 +++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 dev-docs/bidders/adinify.md diff --git a/dev-docs/bidders/adinify.md b/dev-docs/bidders/adinify.md new file mode 100644 index 0000000000..996e97836d --- /dev/null +++ b/dev-docs/bidders/adinify.md @@ -0,0 +1,39 @@ +--- +layout: bidder +title: Adinify +description: Adinify Bidder Adapter +biddercode: adinify +aliasCode : smarthub +usp_supported: true +coppa_supported: true +schain_supported: true +dchain_supported: true +media_types: banner, video, native +safeframes_ok: true +deals_supported: true +floors_supported: true +fpd_supported: false +pbjs: true +pbs: true +pbs_app_supported: true +multiformat_supported: will-bid-on-any +--- + +### Prebid.js Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|---------------------------------|-------------------------------------|-----------| +| `seat` | required | Seat value | `'9Q20EdGxzgWdfPYShScl'` | `string` | +| `token` | required | Token | `'eKmw6alpP3zWQhRCe3flOpz0wpuwRFjW'` | `string` | +| `iabCat` | optional | Array of IAB content categories that describe the content producer | `['IAB1-1', 'IAB3-1', 'IAB4-3']` | `Array(String)` | +| `minBidfloor` | optional | Minimal CPM value | `0.03` | `float` | +| `pos` | optional | The position of the placement on the page, see Open RTB spec v2.5. | `4` | `number` | + +### Prebid Server Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|---------------------|--------------------------------------|----------| +| `seat` | required | Seat value | `'9Q20EdGxzgWdfPYShScl'` | `string` | +| `token` | required | Token | `'eKmw6alpP3zWQhRCe3flOpz0wpuwRFjW'` | `string` | From 681ecb538409d3000dd271b4a949add55970a3ef Mon Sep 17 00:00:00 2001 From: rimaburder-index <55195208+rimaburder-index@users.noreply.github.com> Date: Sun, 2 Mar 2025 14:40:48 -0500 Subject: [PATCH 460/816] Updated the PAAPI section with the module names and correct links (#5917) * Update ix.md Updated the modules to add and the links in the PAAPI section * Update ix.md * Update ix.md updated links in the PAAPI section * Update ix.md Updated PAAPI section links --- dev-docs/bidders/ix.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/dev-docs/bidders/ix.md b/dev-docs/bidders/ix.md index 7784e32722..8485dd9d0b 100644 --- a/dev-docs/bidders/ix.md +++ b/dev-docs/bidders/ix.md @@ -376,15 +376,16 @@ pbjs.addAdUnits({ **Before you begin:** -* You must have Google Ad Manager and the [paapiForGpt](/dev-docs/modules/paapiForGpt.html) module. +* You must be using Google Ad Manager as your ad server. * In your Google Ad Manager configuration, make sure that you have not opted out from using the Protected Audience API. For more information about the configuration, see Google's documentation on [Protected Audience API and Ad Manager after Chrome GA](https://support.google.com/admanager/answer/13627134?hl=en&ref_topic=12264880&sjid=10591375417866092080-NA). Depending on the Prebid.js version that you are using, the steps to configure Prebid.js will differ. Follow the steps provided in the appropriate section for the version of Prebid.js that you are using: **Configure Protected Audience API for Prebid.js versions 8.18.0 to 8.36.0** -1. Build the `paapiForGpt` module in your Prebid.js configuration by adding `fledgeForGpt` to the list of modules that you are already using. For more information about the module, see Prebid's [Protected Audience API (PAAPI) for GPT Module](/dev-docs/modules/paapiForGpt.html) documentation. -2. Configure your ad units to make them eligible for Protected Audience API demand. You can do this in the global-level configuration, bidder level, or ad-unit level. For more information about the configurations, see Prebid's [Protected Audience API (PAAPI) for GPT Module](/dev-docs/modules/paapiForGpt.html) documentation. Index recommends that you do this in the global-level configuration by using the `defaultForSlots` parameter with a value of `1`. The following code is an example of the configuration done at the global level: +1. Build the [PAAPI module](/dev-docs/modules/paapi.html) and the Fledge for GPT module in your Prebid.js configuration by adding `paapi` and `fledgeForGpt` to the list of modules that you are already using.
    +**Note:** The `fledgeForGpt` module documentation no longer exists on Prebid's site. You can however refer to Prebid's [Protected Audience API (PAAPI) for GPT Module](/dev-docs/modules/paapiForGpt.html) documentation for information on adding module configurations. +2. Configure your ad units to make them eligible for Protected Audience API demand. You can do this in the global-level configuration, bidder level, or ad-unit level. Index recommends that you do this in the global-level configuration by using the `defaultForSlots` parameter with a value of `1`. The following code is an example of the configuration done at the global level: ```javascript pbjs.que.push(function() { @@ -413,7 +414,8 @@ Depending on the Prebid.js version that you are using, the steps to configure Pr **Configure Protected Audience API for Prebid.js versions 8.37.0 and up to 9.0.0** -1. Build the `fledgeForGpt` module in your Prebid.js configuration by adding `fledgeForGpt` to the list of modules that you are already using. For more information about the module, see Prebid's [Protected Audience API (PAAPI) for GPT Module](/dev-docs/modules/paapiForGpt.html) documentation. +1. Build the PAAPI module in your Prebid.js configuration by adding `fledgeForGpt` to the list of modules that you are already using. When you add the `fledgeForGpt` module, the `paapi` module automatically gets included as a sub-module. For more information about the module, see Prebid's [PAAPI module](/dev-docs/modules/paapi.html) documentation.
    +**Note:** The `fledgeForGpt` module documentation no longer exists on Prebid's site. You can however refer to Prebid's [Protected Audience API (PAAPI) for GPT Module](/dev-docs/modules/paapiForGpt.html) documentation for information on adding module configurations. 2. Complete the following steps to make your ad units eligible for Protected Audience API demand:
    **Note:** If you continue to use the `fledgeForGpt` property, you will receive a warning message in the console logs stating that the `fledgeForGpt` configuration options will soon be renamed to `paapi`. Therefore, Index recommends that you use the `paapi` property, which is available in Prebid.js version 8.37.0 or later. * In the `pbjs.setConfig().paapi` field, set the `defaultForSlots` parameter to `1`: @@ -464,9 +466,9 @@ Depending on the Prebid.js version that you are using, the steps to configure Pr **Configure Protected Audience API for Prebid.js version 9.0.0 or later** -1. Build the [PAAPI](/dev-docs/modules/paapi.html) module in your Prebid.js configuration by adding paapi to the list of modules that you are already using. For more information about the module, see Prebid's [Protected Audience API (PAAPI) for GPT Module(/dev-docs/modules/paapiForGpt.html) documentation. +1. Build the PAAPI for GPT module in your Prebid.js configuration by adding `paapi` to the list of modules that you are already using. For more information about the module, see Prebid's [Protected Audience API (PAAPI) for GPT Module](/dev-docs/modules/paapiForGpt.html) documentation. 2. In the `pbjs.setConfig().paapi` field, set the `defaultForSlots` parameter to `1`. -3. In the `paapi.gpt.configWithTargeting` field, set `configWithTargeting` to `true`. For more control over configuring GPT slots to use PAAPI, set the `configWithTargeting` to `false` and use the `setPAAPIConfigForGPT` API. For more information about the configurations, see Prebid’s Prebid's [Protected Audience API (PAAPI) for GPT Module(/dev-docs/modules/paapiForGpt.html) documentation.
    The following code is an example of the `defaultForSlots` and `configWithTargeting` configuration: +3. In the `paapi.gpt.configWithTargeting` field, set `configWithTargeting` to `true`. For more control over configuring GPT slots to use PAAPI, set the `configWithTargeting` to `false` and use the `setPAAPIConfigForGPT` API. For more information about the configurations, see Prebid's [Protected Audience API (PAAPI) for GPT Module](/dev-docs/modules/paapiForGpt.html) documentation.
    The following code is an example of the `defaultForSlots` and `configWithTargeting` configuration: ```javascript pbjs.que.push(function() { From b48930bd921f54f3ae91266b98b8715cbd203112 Mon Sep 17 00:00:00 2001 From: Kai Miyamoto <157671757+hogekai@users.noreply.github.com> Date: Mon, 3 Mar 2025 16:13:55 +0900 Subject: [PATCH 461/816] New Bidder: Michao (#5731) * New Bidder: Michao * Michao Bid Adapter: Fixed Lint error * Michao Bid Adapter: Support for rewarded advertising * Michao Bid Adapter: Support for native format * Michao Bid Adapter: Fix lint * Michao Bid Adapter: Supports placement string type * Michao Bid Adapter: Support for bid floor * Michao Bid Adapter: Add partner id param * Michao Bid Adapter: Fix first party data and required params and ortb blocking params * Michao Bid Adapter: Update documentation for bid parameters and first party data --- dev-docs/bidders/michao.md | 190 +++++++++++++++++++++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 dev-docs/bidders/michao.md diff --git a/dev-docs/bidders/michao.md b/dev-docs/bidders/michao.md new file mode 100644 index 0000000000..dd75f6313f --- /dev/null +++ b/dev-docs/bidders/michao.md @@ -0,0 +1,190 @@ +--- +layout: bidder +title: Michao +description: Prebid Michao SSP Bidder Adapter +biddercode: michao +tcfeu_supported: false +dsa_supported: false +gvl_id: none +usp_supported: false +coppa_supported: false +gpp_sids: none +schain_supported: true +dchain_supported: false +userId: all +media_types: banner, video, native +safeframes_ok: true +floors_supported: true +fpd_supported: true +pbjs: true +pbs: false +prebid_member: false +multiformat_supported: will-bid-on-one +ortb_blocking_supported: true +privacy_sandbox: topics +sidebarType: 1 +--- + +### Note + +The Michao Bidding adapter requires setup before beginning. + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +| ----------- | -------- | ------------ | --------- | --------- | +| `placement` | required | Placement id | `"12345"` | `string` | +| `site` | required | Site id | `6789` | `number` | +| `partner` | optional | Partner id | `6789` | `number` | +| `test` | optional | Test Mode | `true` | `boolean` | + +### 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.*` +- `ortb2.user.*` +- `ortb2.device.*` +- `ortb2.regs.*` + +Example: + +```javascript +pbjs.setBidderConfig({ + bidders: ["michao"], + config: { + ortb2: { + site: { + keywords: "kw1,kw2", + }, + }, + }, +}); +``` + +### ORTB Blocking + +supported: + +- `badv` +- `bcat` +- `bseat` +- `bapp` + +Example: + +```javascript +pbjs.setBidderConfig({ + bidders: ["michao"], + config: { + ortb2: { + badv: ["adomain.com"], + bcat: ["IAB2"], + bapp: ["com.app"], + bseat: ["seat"], + }, + }, +}); +``` + +### Media Types + +#### Video + +The following video parameters are supported here so publishers may fully declare their video inventory. These apply to both instream and outstream. + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +| -------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | --------------- | +| 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 | +| maxduration | recommended | Maximum video ad duration in seconds. | 30 | integer | +| minduration | recommended | Minimum video ad duration in seconds | 6 | integer | +| linearity | recommended | OpenRTB2 linearity. 1: linear (in-stream ad), 2: non-linear (overlay ad) | 1 | integer | +| playbackmethod | recommended | Playback methods that may be in use. Only one method is typically used in practice. (see openRTB v2.5 section 5.10 for options) | [2] | array | +| api | optional | Supported API framework values:
    1: VPAID 1.0
    2: VPAID 2.0
    3: MRAID-1
    4: ORMMA
    5: MRAID-2 | [2] | array | +| 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. | 6 | integer | +| minbitrate | optional | Minimum bit rate in Kbps. | 300 | integer | +| maxbitrate | optional | Maximum bit rate in Kbps. | 9600 | integer | +| placement | recommended | Placement type for the impression. (see OpenRTB v2.5 section 5.9 for options) | 1 | integer | +| plcmt | recommended | Placement type for the impression. (See [OpenRTB v2.6](https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/develop/AdCOM%20v1.0%20FINAL.md) Plcmt Subtypes - Video) | 1 | integer | + +Example: + +```javascript +var videoAdUnit = { + code: 'video', + mediaTypes: { + video: { + context: 'instream', + playerSize: [640, 480], + mimes: ['video/mp4'] + protocols: [2, 3, 5, 6], + api: [2], + maxduration: 30, + minduration: 0, + } + }, + bids: [{ + bidder: 'michao', + params: { + site: 123, + placement: "456", + } + }] +}; +``` + +##### Out-stream Video + +Michao adapter supports outstream video renderer in two ways: using your own renderer or using ours on Prebid.org. + +#### Native + +Example: + +```js +var nativeAdUnit = { + code: "myNativeAdUnit", + mediaTypes: { + native: { + ortb: { + assets: [ + { + id: 1, + required: 1, + img: { + type: 3, + w: 150, + h: 50, + }, + }, + { + id: 2, + required: 1, + video: { + minduration: 0, + maxduration: 120, + mimes: ["video/mp4"], + protocols: [8], + }, + }, + ], + }, + }, + }, + bids: [ + { + bidder: "michao", + params: { + site: 123, + placement: "456", + }, + }, + ], +}; +``` From 2dcbc13e879d6d630eaf950f00f4075c23aea0af Mon Sep 17 00:00:00 2001 From: SmartHubSolutions <87376145+SmartHubSolutions@users.noreply.github.com> Date: Mon, 3 Mar 2025 18:05:16 +0200 Subject: [PATCH 462/816] Attekmi: add Addigi adapter (#5836) * Attekmi: add Addigi adapter * multiformat_supported and pbs params change * pbs to true --------- Co-authored-by: Victor --- dev-docs/bidders/addigi.md | 39 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 dev-docs/bidders/addigi.md diff --git a/dev-docs/bidders/addigi.md b/dev-docs/bidders/addigi.md new file mode 100644 index 0000000000..a0eab555bb --- /dev/null +++ b/dev-docs/bidders/addigi.md @@ -0,0 +1,39 @@ +--- +layout: bidder +title: Addigi +description: Addigi Bidder Adapter +biddercode: addigi +aliasCode : smarthub +usp_supported: true +coppa_supported: true +schain_supported: true +dchain_supported: true +media_types: banner, video, native +safeframes_ok: true +deals_supported: true +floors_supported: true +fpd_supported: false +pbjs: true +pbs: true +pbs_app_supported: true +multiformat_supported: will-bid-on-any +--- + +### Prebid.js Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|---------------------------------|-------------------------------------|-----------| +| `seat` | required | Seat value | `'9Q20EdGxzgWdfPYShScl'` | `string` | +| `token` | required | Token | `'eKmw6alpP3zWQhRCe3flOpz0wpuwRFjW'` | `string` | +| `iabCat` | optional | Array of IAB content categories that describe the content producer | `['IAB1-1', 'IAB3-1', 'IAB4-3']` | `Array(String)` | +| `minBidfloor` | optional | Minimal CPM value | `0.03` | `float` | +| `pos` | optional | The position of the placement on the page, see Open RTB spec v2.5. | `4` | `number` | + +### Prebid Server Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|---------------------|--------------------------------------|----------| +| `seat` | required | Seat value | `'9Q20EdGxzgWdfPYShScl'` | `string` | +| `token` | required | Token | `'eKmw6alpP3zWQhRCe3flOpz0wpuwRFjW'` | `string` | From 2949e78569e97978a859c7afa98ee92cbaba8256 Mon Sep 17 00:00:00 2001 From: SmartHubSolutions <87376145+SmartHubSolutions@users.noreply.github.com> Date: Mon, 3 Mar 2025 20:04:29 +0200 Subject: [PATCH 463/816] Smarthub: renaming Smarthub to Attekmi (#5699) * Smarthub: renaming Smarthub to Attekmi * add attekmi.md * renamed title and description --------- Co-authored-by: Victor --- dev-docs/bidders/attekmi.md | 42 ++++++++++++++++++++++++++++++++++++ dev-docs/bidders/smarthub.md | 8 +++++-- 2 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 dev-docs/bidders/attekmi.md diff --git a/dev-docs/bidders/attekmi.md b/dev-docs/bidders/attekmi.md new file mode 100644 index 0000000000..f2c22d9b58 --- /dev/null +++ b/dev-docs/bidders/attekmi.md @@ -0,0 +1,42 @@ +--- +layout: bidder +title: Attekmi +description: Attekmi Bidder Adapter +biddercode: smarthub +usp_supported: true +media_types: banner, video, native +tcfeu_supported: false +pbjs: true +pbs: true +coppa_supported: true +schain_supported: true +dchain_supported: true +safeframes_ok: true +deals_supported: true +floors_supported: true +fpd_supported: false +pbs_app_supported: true +multiformat_supported: true +sidebarType: 1 +--- + +### Prebid.js Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|---------------------------------|-------------------------------------|-----------| +| `partnerName` | required | Unique partner name | `'partnertest'` | `string` | +| `seat` | required | Seat value | `'9Q20EdGxzgWdfPYShScl'` | `string` | +| `token` | required | Token | `'eKmw6alpP3zWQhRCe3flOpz0wpuwRFjW'` | `string` | +| `iabCat` | optional | Array of IAB content categories that describe the content producer | `['IAB1-1', 'IAB3-1', 'IAB4-3']` | `Array(String)` | +| `minBidfloor` | optional | Minimal CPM value | `0.03` | `float` | +| `pos` | optional | The position of the placement on the page, see Open RTB spec v2.5. | `4` | `number` | + +### Prebid Server Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|---------------------|--------------------------------------|----------| +| `partnerName` | required | Unique partner name | `'partnertest'` | `string` | +| `seat` | required | Seat value | `'9Q20EdGxzgWdfPYShScl'` | `string` | +| `token` | required | Token | `'eKmw6alpP3zWQhRCe3flOpz0wpuwRFjW'` | `string` | diff --git a/dev-docs/bidders/smarthub.md b/dev-docs/bidders/smarthub.md index c1853bd9c4..66ce57ba44 100644 --- a/dev-docs/bidders/smarthub.md +++ b/dev-docs/bidders/smarthub.md @@ -1,7 +1,7 @@ --- layout: bidder -title: SmartHub -description: SmartHub Bidder Adapter +title: Attekmi +description: Attekmi Bidder Adapter biddercode: smarthub usp_supported: true schain_supported: true @@ -13,6 +13,10 @@ pbs_app_supported: true sidebarType: 1 --- +### Note + +Please note that SmartHub has been renamed to Attekmi. + ### Prebid.js Bid Params {: .table .table-bordered .table-striped } From 9035b49a42f904f60bdf29cfede0a8178bc22017 Mon Sep 17 00:00:00 2001 From: Olena Stepaniuk <92721590+OlenaPostindustria@users.noreply.github.com> Date: Mon, 3 Mar 2025 20:05:20 +0200 Subject: [PATCH 464/816] Mobile: Update plugin renderer section (#5752) * Update plugin renderer section * Update pbm-plugin-renderer.md * Spelling fix --------- Co-authored-by: Muki Seiler --- .../pbm-api/ios/pbm-plugin-renderer.md | 161 +++++++++++++----- 1 file changed, 122 insertions(+), 39 deletions(-) diff --git a/prebid-mobile/pbm-api/ios/pbm-plugin-renderer.md b/prebid-mobile/pbm-api/ios/pbm-plugin-renderer.md index 845bb00fe7..38e5f7ad65 100755 --- a/prebid-mobile/pbm-api/ios/pbm-plugin-renderer.md +++ b/prebid-mobile/pbm-api/ios/pbm-plugin-renderer.md @@ -43,34 +43,117 @@ Please notice that all implementation on mobile related to the Plugin Renderer s ___ -#### Create your implementation from the interface PrebidMobilePluginRenderer +#### Create your implementation of the `PrebidMobilePluginRenderer` + +The `PrebidMobilePluginRenderer` protocol is designed to provide a standardized way for developers to implement custom ad rendering solutions within the Prebid Mobile framework. It provides a unified interface for managing ad rendering, event handling, and metadata integration. + +Below is the sample implementation of the renderer: ```swift -public class SampleCustomRenderer: NSObject, PrebidMobilePluginRenderer { - - public let name = "SampleCustomRenderer" +public class SampleRenderer: NSObject, PrebidMobilePluginRenderer { + public let name = "SampleRenderer" public let version = "1.0.0" + public var data: [String: Any]? - public var data: [AnyHashable: Any]? = nil + /// This method creates an instance of `SampleAdView`, which is a custom view used to display the ad. + public func createBannerView( + with frame: CGRect, + bid: Bid, + adConfiguration: AdUnitConfig, + loadingDelegate: DisplayViewLoadingDelegate, + interactionDelegate: DisplayViewInteractionDelegate + ) -> (UIView & PrebidMobileDisplayViewProtocol)? { + let adView = SampleAdView(frame: frame) + + adView.interactionDelegate = interactionDelegate + adView.loadingDelegate = loadingDelegate + adView.bid = bid + + return adView + } - private var adViewManager: PBMAdViewManager? + /// This method creates an instance of `SampleInterstitialController`, + /// a custom controller used to display interstitial ads. + public func createInterstitialController( + bid: Bid, + adConfiguration: AdUnitConfig, + loadingDelegate: InterstitialControllerLoadingDelegate, + interactionDelegate: InterstitialControllerInteractionDelegate + ) -> PrebidMobileInterstitialControllerProtocol? { + let interstitialController = SampleInterstitialController() + + interstitialController.loadingDelegate = loadingDelegate + interstitialController.interactionDelegate = interactionDelegate + interstitialController.bid = bid + + return interstitialController + } +} + +class SampleAdView: UIView, PrebidMobileDisplayViewProtocol { - public func isSupportRendering(for format: AdFormat?) -> Bool {} - - public func setupBid(_ bid: Bid, adConfiguration: AdUnitConfig, connection: PrebidServerConnectionProtocol) {} + weak var interactionDelegate: DisplayViewInteractionDelegate? + weak var loadingDelegate: DisplayViewLoadingDelegate? - public func createBannerAdView(with frame: CGRect, bid: Bid, adConfiguration: AdUnitConfig, - connection: PrebidServerConnectionProtocol, adViewDelegate: (any PBMAdViewDelegate)?) { - // TODO "Handle bid response as you want and display your banner ad" - } + var bid: Bid? - public func createInterstitialController(bid: Bid, adConfiguration: AdUnitConfig, connection: PrebidServerConnectionProtocol, - adViewManagerDelegate adViewDelegate: InterstitialController?, videoControlsConfig: VideoControlsConfiguration?) { - // TODO "Handle bid response as you want and display your interstitial ad" + // ... + // Setup view + // ... + + func loadAd() { + DispatchQueue.main.async { + if let adm = self.bid?.adm { + self.webView.loadHTMLString(adm, baseURL: nil) + self.loadingDelegate?.displayViewDidLoadAd(self) + } else { + self.loadingDelegate?.displayView(self, didFailWithError: SampleError.noAdm) + } + } } } +class SampleInterstitialController: NSObject, PrebidMobileInterstitialControllerProtocol { + + weak var loadingDelegate: InterstitialControllerLoadingDelegate? + weak var interactionDelegate: InterstitialControllerInteractionDelegate? + + var bid: Bid? + + // ... + // Setup view + // ... + + func loadAd() { + DispatchQueue.main.async { + guard let adm = self.bid?.adm else { + self.loadingDelegate?.interstitialController(self, didFailWithError: SampleError.noAdm) + return + } + + self.webView.loadHTMLString(adm, baseURL: nil) + self.loadingDelegate?.interstitialControllerDidLoadAd(self) + } + } + + func show() { + DispatchQueue.main.async { + guard let presentingController = UIApplication.shared.topViewController else { + self.loadingDelegate?.interstitialController( + self, + didFailWithError: SampleError.noAvailableController + ) + return + } + + presentingController.present( + self.interstitialViewController, + animated: true + ) + } + } +} ``` #### Global Initialization of Plugin Renderer @@ -86,7 +169,7 @@ import PrebidMobile class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - let sampleCustomRenderer = SampleCustomRenderer() + let sampleCustomRenderer = SampleRenderer() func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Initialize the Prebid SDK @@ -113,13 +196,11 @@ func applicationWillTerminate(_ application: UIApplication) { If you need to handle plugin registration in a specific view or controller for more granular control, you can still register the Plugin Renderer at that level: ```swift -class CustomRendererBannerController: NSObject, AdaptedController, PrebidConfigurableBannerController, BannerViewDelegate { +class CustomRendererBannerController: UIViewController { - required init(rootController: AdapterViewController) { + override init() { super.init() - self.rootController = rootController Prebid.registerPluginRenderer(sampleCustomRenderer) - setupAdapterController() } deinit { @@ -131,15 +212,15 @@ class CustomRendererBannerController: NSObject, AdaptedController, PrebidConfigu ## Limitations ### Supported Ad Formats -Currently the interface `PrebidMobilePluginRenderer` provide the ability to render `BANNER` and `INTERSTITIAL` only. The compability with more ad formats can be supported in future releases. -It is important to notice that the compliant formats you set on `isSupportRenderingFor` implementation are taken into account to add your Plugin Renderer to the bid request or not, according to the ad unit configuration that is bid requesting. +Currently the interface `PrebidMobilePluginRenderer` provides the ability to render `BANNER` and `INTERSTITIAL` only. The compability with more ad formats can be supported in future releases. ### Original API -The Plugin Renderer feature does not work with [GAM Original API](/prebid-mobile/pbm-api/android/android-sdk-integration-gam-original-api.html) since the ad rendering does not happen in the Prebid SDK but externally. Despite that if you are using the regular GAM integration it will work fine. +The Plugin Renderer feature does not work with [GAM Original API](/prebid-mobile/pbm-api/ios/ios-sdk-integration-gam-original-api.html) since the ad rendering does not happen in the Prebid SDK but externally. Despite that if you are using the regular GAM integration it will work fine. ## Ad Event Listeners + An optional dedicated generic ad event listener is offered in case of the existing event listeners are insufficient to keep your ad consumer fully aware of your ad lifecycle. ![Plugin Event Listener big picture](/assets/images/prebid-mobile/prebid-plugin-renderer-event-listeners.png) @@ -165,26 +246,19 @@ ___ // TODO on impressions } } - ``` #### Handle your plugin event delegate on your Plugin Renderer ```swift -public class SampleCustomRenderer: NSObject, PrebidMobilePluginRenderer { +public class SampleRenderer: NSObject, PrebidMobilePluginRenderer { // Store your listeners private var pluginEventDelegateMap = [String: SampleCustomRendererEventDelegate]() - public let name = "SampleCustomRenderer" - + public let name = "SampleRenderer" public let version = "1.0.0" - public var data: [AnyHashable: Any]? = nil - - private var adViewManager: PBMAdViewManager? - - public func isSupportRendering(for format: AdFormat?) -> Bool {} public func registerEventDelegate(pluginEventDelegate: any PluginEventDelegate, adUnitConfigFingerprint: String) { pluginEventDelegateMap[adUnitConfigFingerprint] = pluginEventDelegate as? SampleCustomRendererEventDelegate @@ -193,15 +267,24 @@ public class SampleCustomRenderer: NSObject, PrebidMobilePluginRenderer { public func unregisterEventDelegate(pluginEventDelegate: any PluginEventDelegate, adUnitConfigFingerprint: String) { pluginEventDelegateMap.removeValue(forKey: adUnitConfigFingerprint) } - - public func setupBid(_ bid: Bid, adConfiguration: AdUnitConfig, connection: PrebidServerConnectionProtocol) {} - public func createBannerAdView(with frame: CGRect, bid: Bid, adConfiguration: AdUnitConfig, - connection: PrebidServerConnectionProtocol, adViewDelegate: (any PBMAdViewDelegate)?) { + public func createAdView( + with frame: CGRect, + bid: Bid, + adConfiguration: AdUnitConfig, + loadingDelegate: DisplayViewLoadingDelegate, + interactionDelegate: DisplayViewInteractionDelegate + ) -> (UIView & PrebidMobileDisplayViewProtocol)? { + // ....... } - public func createInterstitialController(bid: Bid, adConfiguration: AdUnitConfig, connection: PrebidServerConnectionProtocol, - adViewManagerDelegate adViewDelegate: InterstitialController?, videoControlsConfig: VideoControlsConfiguration?) { + public func createInterstitialController( + bid: Bid, + adConfiguration: AdUnitConfig, + loadingDelegate: InterstitialControllerLoadingDelegate, + interactionDelegate: InterstitialControllerInteractionDelegate + ) -> PrebidMobileInterstitialControllerProtocol? { + // ....... } } ``` From 4c7728626e8b91b377a61686a07ab25f80a6f709 Mon Sep 17 00:00:00 2001 From: jansima-r2b2 Date: Mon, 3 Mar 2025 19:06:15 +0100 Subject: [PATCH 465/816] r2b2 analytic adapter md (#5758) --- dev-docs/analytics/r2b2.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 dev-docs/analytics/r2b2.md diff --git a/dev-docs/analytics/r2b2.md b/dev-docs/analytics/r2b2.md new file mode 100644 index 0000000000..004e56b35a --- /dev/null +++ b/dev-docs/analytics/r2b2.md @@ -0,0 +1,37 @@ +--- +layout: analytics +title: R2B2 +description: R2B2 Analytics Adapter +modulecode: r2b2 +prebid_member: false +tcfeu_supported: true +usp_supported: true +coppa_supported: true +gvl_id: 1235 +enable_download: true +--- + +#### About + +The R2B2 Analytics Adapter enables data collection for analysis and reporting purposes. Access to collected data and the ability to start data collection require prior approval from R2B2. For approval, please contact our account team on [partner@r2b2.io](mailto:partner@r2b2.io). + +#### Analytics Options + +| Name | Scope | Example | Type | Description | +|-----------|----------|-------------|----------|----------------------------------------------------------------| +| `domain` | required | example.com | `string` | R2B2 approved domain where data collection occurs | +| `configId` | optional | 1 | `int` | Identifier for different configurations under the same domain (e.g., 1 for mobile, 2 for desktop) | +| `configVer` | optional | 1 | `int` | Version number for configurations sharing the same `configId` | + +#### Example Configuration + +```js +pbjs.enableAnalytics({ + provider: 'r2b2', + options: { + domain: 'example.com', + configId: 1, + configVer: 1 + } +}); +``` From fc1abf77180ba2b5f3213e8f64d58dec86a34c26 Mon Sep 17 00:00:00 2001 From: CompassSSP <95415988+CompassSSP@users.noreply.github.com> Date: Mon, 3 Mar 2025 20:07:04 +0200 Subject: [PATCH 466/816] Compass: add support gpp (#5766) * add Compass Adapter * fix * add endpointId * add gpp info --- dev-docs/bidders/compass.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/compass.md b/dev-docs/bidders/compass.md index 49b7428af3..f962d3f7ef 100644 --- a/dev-docs/bidders/compass.md +++ b/dev-docs/bidders/compass.md @@ -8,6 +8,7 @@ tcfeu_supported: true coppa_supported: true schain_supported: true floors_supported: true +gpp_sids: tcfeu, usstate_all, usp media_types: banner, video, native pbjs: true pbs: true From fef4890038dccfe09c12c0bf283320d388deb740 Mon Sep 17 00:00:00 2001 From: iagoBMS Date: Mon, 3 Mar 2025 15:09:32 -0300 Subject: [PATCH 467/816] feat: Add BMS documentation (#5810) * feat: Add BMS documentation * update title in BMS documentation * chore: Update BMS documentation to reflect changes in PBS support and contact email --- dev-docs/bidders/bms.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 dev-docs/bidders/bms.md diff --git a/dev-docs/bidders/bms.md b/dev-docs/bidders/bms.md new file mode 100644 index 0000000000..d1cf2205b8 --- /dev/null +++ b/dev-docs/bidders/bms.md @@ -0,0 +1,30 @@ +--- +layout: bidder +title: Blue Media Services LTDA +description: Prebid BMS Bidder Adapter +tcfeu_supported: true +pbjs: true +pbs: false +biddercode: bms +prebid_member: false +floors_supported: true +safeframes_ok: true +media_types: banner +schain_supported: true +userIds: id5Id, identityLink, pubProvidedId +pbs_app_supported: false +gvl_id: 1105 +sidebarType: 1 +--- + +### Note + +The bidder requires setup before usage. Please get in touch with our publisher team at to get started. + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|---------------------|---------------|----------| +| `publisherId` | required | Unique publisher ID | `'ABCDEF'` | `string` | +| `placementId` | optional | Unique placement ID | `'ABCDEF'` | `string` | From 3f5053256e3cde77d41a1b80d617a07e02a61a8f Mon Sep 17 00:00:00 2001 From: xiaochang <106997162@qq.com> Date: Tue, 4 Mar 2025 02:11:03 +0800 Subject: [PATCH 468/816] update algorix.md (#5816) * update algorix.md * update algorix.md * update algorix.md * update algorix.md * update algorix.md * update algorix.md * update algorix.md * fix bug --- dev-docs/bidders/algorix.md | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/algorix.md b/dev-docs/bidders/algorix.md index 83265c579e..0edf4aba1a 100644 --- a/dev-docs/bidders/algorix.md +++ b/dev-docs/bidders/algorix.md @@ -9,7 +9,7 @@ usp_supported: true coppa_supported: true schain_supported: true media_types: banner, video, native -pbjs: false +pbjs: true pbs: true pbs_app_supported: true prebid_member: true @@ -21,7 +21,7 @@ userIds: all AlgoriX adapter requires setup and approval from the AlgoriX team, even for existing in-app developers and publishers. Please reach out to your account team or email to for more information. -### Bid Params +### Prebid Server Adapter Params {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | @@ -37,3 +37,35 @@ Note: * Prebid Server adapter only checks for and uses first imp bid params. All other imp bid params are ignored. * placementId and appId will be generated on AlgoriX Platform. * region is optional param, which determine the AlgoriX server. APAC for SG endpoint, USE for US endpoint, EUC for EU endpoint, Other for Global endpoint. + +### Prebid.js Adapter Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +| ------------- | -------- | ------------- | ------------------------------------ | -------- | +| `sid` | required | Sid | `'260785'` | `string` | +| `token` | required | Token | `'89b6d58567e3913e507f2be61fe8823e'` | `string` | +| `region` | optional | Server Region | `'APAC', 'USE', 'EUC'` | `string` | + +### Test Parameters + +```javascript +var adUnits = [ +{ + sizes: [ + [300, 250] // a display size + ], + bids: [{ + bidder: 'algorix', + params: { + region: 'APAC', // optional + sid: '260785', // required + token: '89b6d58567e3913e507f2be61fe8823e', // required + } + }] +}]; +``` + +Note: + +* AlgoriX server-side Prebid Server adapter supports only `banner`, `video`,`native` media types. But AlgoriX client-side Prebid.js adapter supports only `banner`, doesn't support `video` and `native`. From 409755ed3e17c0bfe2d0d1126aaa60825b33dde7 Mon Sep 17 00:00:00 2001 From: denis-s-oms Date: Mon, 3 Mar 2025 20:13:47 +0200 Subject: [PATCH 469/816] OMS: added video support (#5830) --- dev-docs/bidders/oms.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/oms.md b/dev-docs/bidders/oms.md index 2dbb100676..4675724ab5 100644 --- a/dev-docs/bidders/oms.md +++ b/dev-docs/bidders/oms.md @@ -40,4 +40,5 @@ The bidder requires setup before usage. Please get in touch with our team at Date: Mon, 3 Mar 2025 10:14:30 -0800 Subject: [PATCH 470/816] JS: update docs on `eventtrackers` and `markWinningBidAsUsed` (#5840) * JS: update docs for markWinningBidAsUsed * Document eventtrackers * Document bidResponse.eventtrackers --- dev-docs/bidder-adaptor.md | 36 ++++++++++--------- .../markWinningBidAsUsed.md | 2 +- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/dev-docs/bidder-adaptor.md b/dev-docs/bidder-adaptor.md index ce7eccb1ed..f3c6e5ebcd 100644 --- a/dev-docs/bidder-adaptor.md +++ b/dev-docs/bidder-adaptor.md @@ -502,22 +502,26 @@ The parameters of the `bidResponse` object are: | `vastXml` | Either this or `vastUrl` required for video | XML for VAST document to be cached for later retrieval. | `...` | | `bidderCode` | Optional | Bidder code to use for the response - for adapters that wish to reply on behalf of other bidders. Defaults to the code registered with [`registerBidder`](#bidder-adaptor-Overview); note that any other code will need to be [explicitly allowed by the publisher](/dev-docs/publisher-api-reference/bidderSettings.html#allowAlternateBidderCodes). | 'exampleBidder' | | `dealId` | Optional | Deal ID | `"123abc"` | -| `meta` | Optional | Object containing metadata about the bid | | -| `meta.networkId` | Optional | Bidder-specific Network/DSP Id | `"1111"` | -| `meta.networkName` | Optional | Network/DSP Name | `"NetworkN"` | -| `meta.agencyId` | Optional | Bidder-specific Agency ID | `"2222"` | -| `meta.agencyName` | Optional | Agency Name | `"Agency, Inc."` | -| `meta.advertiserId` | Optional | Bidder-specific Advertiser ID | `"3333"` | -| `meta.advertiserName` | Optional | Advertiser Name | `"AdvertiserA"` | -| `meta.advertiserDomains` | Required(*) | Array of Advertiser Domains for the landing page(s). This is an array that aligns with the OpenRTB 'adomain' field. See note below this table. | `["advertisera.com"]` | -| `meta.brandId` | Optional | Bidder-specific Brand ID (some advertisers may have many brands) | `"4444"` | -| `meta.brandName` | Optional | Brand Name | `"BrandB"` | -| `meta.demandSource` | Optional | Demand Source (Some adapters may functionally serve multiple SSPs or exchanges, and this would specify which) | `"SourceB"` -| `meta.dchain` | Optional | Demand Chain Object | `{ 'ver': '1.0', 'complete': 0, 'nodes': [ { 'asi': 'magnite.com', 'bsid': '123456789', } ] }` | -| `meta.dsa` | Optional | The [IAB DSA response object](https://github.com/InteractiveAdvertisingBureau/openrtb/blob/main/extensions/community_extensions/dsa_transparency.md) for the Digital Services Act (DSA) | `{ 'behalf': 'sample text', 'paid': 'sample value', 'transparency': [{ 'domain': 'sample domain', 'params': [1, 2] }], 'adrender': 1 }` | -| `meta.primaryCatId` | Optional | Primary [IAB category ID](https://www.iab.com/guidelines/iab-quality-assurance-guidelines-qag-taxonomy/) | `"IAB-111"` | -| `meta.secondaryCatIds` | Optional | Array of secondary IAB category IDs | `["IAB-222","IAB-333"]` | -| `meta.mediaType` | Optional | "banner", "native", or "video" - this should be set in scenarios where a bidder responds to a "banner" mediaType with a creative that's actually a video (e.g. outstream) or native. | `"native"` | +| `meta` | Optional | Object containing metadata about the bid | | +| `meta.networkId` | Optional | Bidder-specific Network/DSP Id | `"1111"` | +| `meta.networkName` | Optional | Network/DSP Name | `"NetworkN"` | +| `meta.agencyId` | Optional | Bidder-specific Agency ID | `"2222"` | +| `meta.agencyName` | Optional | Agency Name | `"Agency, Inc."` | +| `meta.advertiserId` | Optional | Bidder-specific Advertiser ID | `"3333"` | +| `meta.advertiserName` | Optional | Advertiser Name | `"AdvertiserA"` | +| `meta.advertiserDomains` | Required(*) | Array of Advertiser Domains for the landing page(s). This is an array that aligns with the OpenRTB 'adomain' field. See note below this table. | `["advertisera.com"]` | +| `meta.brandId` | Optional | Bidder-specific Brand ID (some advertisers may have many brands) | `"4444"` | +| `meta.brandName` | Optional | Brand Name | `"BrandB"` | +| `meta.demandSource` | Optional | Demand Source (Some adapters may functionally serve multiple SSPs or exchanges, and this would specify which) | `"SourceB"` +| `meta.dchain` | Optional | Demand Chain Object | `{ 'ver': '1.0', 'complete': 0, 'nodes': [ { 'asi': 'magnite.com', 'bsid': '123456789', } ] }` | +| `meta.dsa` | Optional | The [IAB DSA response object](https://github.com/InteractiveAdvertisingBureau/openrtb/blob/main/extensions/community_extensions/dsa_transparency.md) for the Digital Services Act (DSA) | `{ 'behalf': 'sample text', 'paid': 'sample value', 'transparency': [{ 'domain': 'sample domain', 'params': [1, 2] }], 'adrender': 1 }` | +| `meta.primaryCatId` | Optional | Primary [IAB category ID](https://www.iab.com/guidelines/iab-quality-assurance-guidelines-qag-taxonomy/) | `"IAB-111"` | +| `meta.secondaryCatIds` | Optional | Array of secondary IAB category IDs | `["IAB-222","IAB-333"]` | +| `meta.mediaType` | Optional | "banner", "native", or "video" - this should be set in scenarios where a bidder responds to a "banner" mediaType with a creative that's actually a video (e.g. outstream) or native. | `"native"` | +| `eventtrackers` | Optional | Array of objects in the same format as [ORTB native section 5.8, "Event Tracker Response Object"](https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf) | `[{event: 500, method: 1, url: "https://www.example.com/track"]}]` | +| `eventtrackers[].event` | Required | Event type. Prebid.js will fire tracking pixels for `500` (bid won) and `1` (bid was rendered). | `500` | +| `eventtrackers[].method` | Required | Tracking method. Prebid.js only fires image pixels (`1`) | `1` | +| `eventtrackers[].url` | Required | Tracker URL | `https//www.example.com/track` | {: .alert.alert-info :} **Note:** bid adapters must be coded to accept the 'advertiserDomains' parameter from their endpoint even if that endpoint doesn't currently respond with that value. diff --git a/dev-docs/publisher-api-reference/markWinningBidAsUsed.md b/dev-docs/publisher-api-reference/markWinningBidAsUsed.md index bf6338a1af..5a17d7f69d 100644 --- a/dev-docs/publisher-api-reference/markWinningBidAsUsed.md +++ b/dev-docs/publisher-api-reference/markWinningBidAsUsed.md @@ -19,4 +19,4 @@ If you know the adId, then be specific, otherwise Prebid will retrieve the winni | --- | --- | --- | | adUnitCode | `string` | (Optional) The ad unit code | | adId | `string` | (Optional) The id representing the ad we want to mark | -| analytics | `boolean` | (Optional) if true, triggers the 'bidWon' event for the marked bid | +| events | `boolean` | (Optional) if true, triggers the 'bidWon' event and tracking pixels for the marked bid | From dcedd1f1f396c3e3d231ee0c31cd7b91a5722446 Mon Sep 17 00:00:00 2001 From: vdo-ai-tech <126867429+vdo-ai-tech@users.noreply.github.com> Date: Mon, 3 Mar 2025 23:45:24 +0530 Subject: [PATCH 471/816] updated vdo.ai bidder adapter documentation according to the new server (#5842) Co-authored-by: rishabhsehrawat1 --- dev-docs/bidders/vdoai.md | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/dev-docs/bidders/vdoai.md b/dev-docs/bidders/vdoai.md index 1afc85545a..7a43e2c39e 100644 --- a/dev-docs/bidders/vdoai.md +++ b/dev-docs/bidders/vdoai.md @@ -2,22 +2,37 @@ layout: bidder title: VDO.AI description: Prebid vdo.ai Bidder Adaptor -pbjs: true biddercode: vdoai -media_types: banner, video -userIds: check with bidder -floors_supported: true -coppa_supported: true -schain_supported: true +pbjs: true +media_types: video, banner +userIds: all +fpd_supported: false tcfeu_supported: false 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 sidebarType: 1 --- - ### Bid Params {: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|---------------|----------|------------------|---------|----------| -| `placementId` | required | The placement ID | | `string` | + +| Name | Scope | Description | Example | Type | +|:--------------|:---------|:------------------------------------------------------------|:----------------------|:----------| +| `host` | required | Ad network's RTB host | `'exchange.ortb.net'` | `string` | +| `adUnitId` | required | Ad Unit Id will be generated on VDO.AI Platform. | `42` | `integer` | +| `adUnitType` | required | Type of Ad Unit (`'video'`, `'banner'`) | `'banner'` | `string` | +| `custom1` | optional | Custom targeting field 1 | `'custom1'` | `string` | +| `custom2` | optional | Custom targeting field 2 | `'custom2'` | `string` | +| `custom3` | optional | Custom targeting field 3 | `'custom3'` | `string` | +| `custom4` | optional | Custom targeting field 4 | `'custom4'` | `string` | +| `custom5` | optional | Custom targeting field 5 | `'custom5'` | `string` | + +VDO.AI client-side Prebid.js adapter requires only `host`, `adUnitId`, `adUnitType`. + +VDO.AI client-side Prebid.js adapter supports only `banner` and `video` media types, doesn't support `audio` and `native`. From eb2a4106ddbfbf6c6dd08c9b27d78d0adc9a5edf Mon Sep 17 00:00:00 2001 From: andreasgreen Date: Mon, 3 Mar 2025 19:18:34 +0100 Subject: [PATCH 472/816] Bidtheatre Bidder Adapter: pbs support (#5858) --- dev-docs/bidders/bidtheatre.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidders/bidtheatre.md b/dev-docs/bidders/bidtheatre.md index 65266bc0f6..17e70f2eb5 100644 --- a/dev-docs/bidders/bidtheatre.md +++ b/dev-docs/bidders/bidtheatre.md @@ -11,12 +11,12 @@ deals_supported: true floors_supported: true fpd_supported: true ortb_blocking_supported: partial -multiformat_supported: will-bid-on-any +multiformat_supported: will-bid-on-one privacy_sandbox: topics pbjs: true sidebarType: 1 -pbs: false -pbs_app_supported: false +pbs: true +pbs_app_supported: true --- ### Registration From df97534313ad4b85d7ef5fec3c1bf5c9e7e61480 Mon Sep 17 00:00:00 2001 From: Olena Stepaniuk <92721590+OlenaPostindustria@users.noreply.github.com> Date: Mon, 3 Mar 2025 20:23:48 +0200 Subject: [PATCH 473/816] Mobile: Support custom logger in iOS SDK (#5849) * docs: add section about SDK console logging * docs: remove empty line --------- Co-authored-by: Muki Seiler Co-authored-by: bretg --- .../pbm-api/ios/pbm-targeting-ios.md | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md b/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md index ca2be9b1a1..d5c12d4f9b 100644 --- a/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md +++ b/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md @@ -133,6 +133,77 @@ Parameters: none --- +## SDK Console Logging + +The `Log` class is designed to handle logging functionality for the SDK. It allows for categorized logging based on severity levels (e.g., error, warning, debug) and offers options for both console and file-based logging. It also provides the ability to set third-party logger. + +### `Log` Class Properties + +| Property | Type | Description | +|--------------|-----------|-----------------------------------------------------------------------------------------------------------| +| `logLevel` | `LogLevel`| The current logging level. Only messages at this level or higher will be logged. Default: `.debug` | +| `logToFile` | `Bool` | Indicates whether logs should also be saved to a file. Default: `false` | + +### `Log` Class Methods + +#### `setCustomLogger(_:)` +Sets a custom logger to handle log messages. + +- **Parameters**: + - `logger`: A custom object conforming to the `PrebidLogger` protocol. + +#### `serialWriteToLog(_:)` +Writes a log message asynchronously to the log file. + +- **Parameters**: + - `message`: The log message to be written to the file. + +#### `getLogFileAsString()` +Reads the contents of the log file as a single string. + +- **Returns**: The contents of the log file, or `nil` if an error occurs. + +#### `clearLogFile()` +Clears the contents of the log file. + +### `PrebidLogger` Protocol + +The `PrebidLogger` protocol defines the required methods for logging messages at various levels, such as error, info, debug, etc. This protocol allows for custom logging implementations. + +#### Methods + +- **`error(_:)`** + Logs an error message. + - **Parameters**: + - `object`: The object or message to log. + - `filename`: The name of the file where the log was generated. + - `line`: The line number where the log was generated. + - `function`: The function name where the log was generated. + +- **`info(_:)`** + Logs an informational message. + - **Parameters**: Same as `error(_:)`. + +- **`debug(_:)`** + Logs a debug message. + - **Parameters**: Same as `error(_:)`. + +- **`verbose(_:)`** + Logs a verbose message for detailed or low-level information. + - **Parameters**: Same as `error(_:)`. + +- **`warn(_:)`** + Logs a warning message. + - **Parameters**: Same as `error(_:)`. + +- **`severe(_:)`** + Logs a severe error message, indicating a critical issue. + - **Parameters**: Same as `error(_:)`. + +- **`whereAmI(_:)`** + Logs the current location in the code, useful for debugging. + - **Parameters**: Same as `error(_:)`. + ## Consent Management Parameters This section describes how app developers can provide info on user consent to the Prebid SDK and how SDK behaves under different kinds of restrictions. From 2208a97ef9cad4978e6019cb6bb5649c88108d11 Mon Sep 17 00:00:00 2001 From: Jan Skowronski Date: Mon, 3 Mar 2025 18:26:32 +0000 Subject: [PATCH 474/816] add permutiveIdentityManagerIdSystem docs (#5864) --- .../permutiveIdentityManagerIdSystem.md | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 dev-docs/modules/userid-submodules/permutiveIdentityManagerIdSystem.md diff --git a/dev-docs/modules/userid-submodules/permutiveIdentityManagerIdSystem.md b/dev-docs/modules/userid-submodules/permutiveIdentityManagerIdSystem.md new file mode 100644 index 0000000000..bf5e44a87d --- /dev/null +++ b/dev-docs/modules/userid-submodules/permutiveIdentityManagerIdSystem.md @@ -0,0 +1,65 @@ +--- +layout: userid +title: Permutive Identity Manager +description: Permutive Identity Manager User ID sub-module +useridmodule: permutiveIdentityManagerIdSystem +--- + +# Permutive Identity Manager + +This module supports [Permutive](https://permutive.com/) customers in using Permutive's Identity Manager functionality. + +To use this Prebid.js module it is assumed that the site includes Permutive's SDK, with Identity Manager configuration +enabled. See Permutive's user documentation for more information on Identity Manager. + +## Building Prebid.js with Permutive Identity Manager Support + +Prebid.js must be built with the `permutiveIdentityManagerIdSystem` module in order for Permutive's Identity Manager to be able to +activate relevant user identities to Prebid. + +To build Prebid.js with the `permutiveIdentityManagerIdSystem` module included: + +```sh +gulp build --modules=userId,permutiveIdentityManagerIdSystem +``` + +## Prebid configuration + +There is minimal configuration required to be set on Prebid.js, since the bulk of the behaviour is managed through +Permutive's dashboard and SDK. + +It is recommended to keep the Prebid.js caching for this module short, since the mechanism by which Permutive's SDK +communicates with Prebid.js is effectively a local cache anyway. + +```js +pbjs.setConfig({ + ... + userSync: { + userIds: [ + { + name: 'permutiveIdentityManagerId', + params: { + ajaxTimeout: 90 + }, + storage: { + type: 'html5', + name: 'permutiveIdentityManagerId', + refreshInSeconds: 5 + } + } + ], + auctionDelay: 100 + }, + ... +}); +``` + +### ajaxTimeout + +By default this module will read IDs provided by the Permutive SDK from local storage when requested by prebid, and if +nothing is found, will not provide any identities. If a timeout is provided via the `ajaxTimeout` parameter, it will +instead wait for up to the specified number of milliseconds for Permutive's SDK to become available, and will retrieve +identities from the SDK directly if/when this happens. + +This value should be set to a value smaller than the `auctionDelay` set on the `userSync` configuration object, since +there is no point waiting longer than this as the auction will already have been triggered. From 12bc650b4626b25b9e3f5a22bb2829511ca2b8cf Mon Sep 17 00:00:00 2001 From: sangarbe Date: Mon, 3 Mar 2025 19:27:21 +0100 Subject: [PATCH 475/816] adds pbs doc for seedtag pbs adapter (#5866) --- dev-docs/bidders/seedtag.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/seedtag.md b/dev-docs/bidders/seedtag.md index 05305438db..33b8b0d37b 100644 --- a/dev-docs/bidders/seedtag.md +++ b/dev-docs/bidders/seedtag.md @@ -14,6 +14,9 @@ coppa_supported: true ortb_blocking_supported: partial sidebarType: 1 gpp_supported: true +pbs: true +pbs_app_supported: false +floors_supported: true --- ### Note @@ -21,7 +24,7 @@ gpp_supported: true Please reach out to your seedtag account team before using this plugin. The publisher id 0000-0000-01 returns demo responses. -### Bid Params +### Bid Params (pbjs) {: .table .table-bordered .table-striped } @@ -31,6 +34,14 @@ The publisher id 0000-0000-01 returns demo responses. | `adUnitId` | required | The adunit id. | 00000 | `string` | | `placement` | required | Adunit placement, posibles values: inScreen, inArticle | inScreen | `string` | +### Bid Params (pbs) + +{: .table .table-bordered .table-striped } + +| Name | Scope | Description | Example | Type | +|-------------------|---------------------|--------------------------------------------------------------------------------|-----------------------|----------| +| `adUnitId` | required | The adunit id. | 00000 | `string` | + ### InScreen example The integration for Seedtag uses banner mediaTypes for all types of creatives (display/video) From c19270034f3694edf4c94274c84d3241e0ae06bf Mon Sep 17 00:00:00 2001 From: BaronJHYu <254878848@qq.com> Date: Tue, 4 Mar 2025 02:51:30 +0800 Subject: [PATCH 476/816] Upate mediago.md (#5869) --- dev-docs/bidders/mediago.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/mediago.md b/dev-docs/bidders/mediago.md index 8bb28539e0..75f2d26c8e 100644 --- a/dev-docs/bidders/mediago.md +++ b/dev-docs/bidders/mediago.md @@ -33,4 +33,5 @@ The MediaGo Bidding adapter requires setup before beginning. Please contact us a | `region` | recommend | Server region for PBS request: US for US Region, EU for EU Region, APAC for APAC Region, default is US. This parameter expects all imps to be the same. This parameter is available for PBS only. | `'US'` | `string` | | `test` | recommend | 0(default): production env mode.
    1: dev env mode and no charge.we will bid Higher frequency to make debug easier. This parameter is available for PBJS only. | `1/0` | `Number` | | `bidfloor` | recommend | Sets a floor price for the bid. This parameter is available for PBJS only. | `0.05` | `float` | +| `publisher` | required | publisher id | `'abcdefg'` | `string` | | `placementId` | recommend | The AD placement ID | `12341234` | `string` | From ef721ddd0c580568f0ffd0533ed916d66353e1d2 Mon Sep 17 00:00:00 2001 From: SmartHubSolutions <87376145+SmartHubSolutions@users.noreply.github.com> Date: Mon, 3 Mar 2025 20:57:01 +0200 Subject: [PATCH 477/816] Attekmi: add Jambojar adapter (#5874) Co-authored-by: Victor --- dev-docs/bidders/jamojar.md | 39 +++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 dev-docs/bidders/jamojar.md diff --git a/dev-docs/bidders/jamojar.md b/dev-docs/bidders/jamojar.md new file mode 100644 index 0000000000..572102a01c --- /dev/null +++ b/dev-docs/bidders/jamojar.md @@ -0,0 +1,39 @@ +--- +layout: bidder +title: Jambojar +description: Jambojar Bidder Adapter +biddercode: jambojar +aliasCode : smarthub +usp_supported: true +coppa_supported: true +schain_supported: true +dchain_supported: true +media_types: banner, video, native +safeframes_ok: true +deals_supported: true +floors_supported: true +fpd_supported: false +pbjs: true +pbs: true +pbs_app_supported: true +multiformat_supported: will-bid-on-any +--- + +### Prebid.js Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|---------------------------------|-------------------------------------|-----------| +| `seat` | required | Seat value | `'9Q20EdGxzgWdfPYShScl'` | `string` | +| `token` | required | Token | `'eKmw6alpP3zWQhRCe3flOpz0wpuwRFjW'` | `string` | +| `iabCat` | optional | Array of IAB content categories that describe the content producer | `['IAB1-1', 'IAB3-1', 'IAB4-3']` | `Array(String)` | +| `minBidfloor` | optional | Minimal CPM value | `0.03` | `float` | +| `pos` | optional | The position of the placement on the page, see Open RTB spec v2.5. | `4` | `number` | + +### Prebid Server Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|---------------------|--------------------------------------|----------| +| `seat` | required | Seat value | `'9Q20EdGxzgWdfPYShScl'` | `string` | +| `token` | required | Token | `'eKmw6alpP3zWQhRCe3flOpz0wpuwRFjW'` | `string` | From 1a2747bcd282efe4ef4a72c0833c64b5cb870e1c Mon Sep 17 00:00:00 2001 From: Kevin Siow Date: Mon, 3 Mar 2025 20:03:05 +0100 Subject: [PATCH 478/816] Dailymotion bid adapter: add ortb converter and floor price support (#5891) Co-authored-by: Kevin Siow --- dev-docs/bidders/dailymotion.md | 118 ++++++++++++++++++++++++++++++-- 1 file changed, 112 insertions(+), 6 deletions(-) diff --git a/dev-docs/bidders/dailymotion.md b/dev-docs/bidders/dailymotion.md index ec7f0ed607..ff6a709018 100644 --- a/dev-docs/bidders/dailymotion.md +++ b/dev-docs/bidders/dailymotion.md @@ -71,6 +71,116 @@ pbjs.setConfig({ }); ``` +#### Price floor + +The price floor can be set at the ad unit level, for example : + +```javascript +const adUnits = [{ + floors: { + currency: 'USD', + schema: { + fields: [ 'mediaType', 'size' ] + }, + values: { + 'video|300x250': 2.22, + 'video|*': 1 + } + }, + bids: [{ + bidder: 'dailymotion', + params: { + apiKey: 'dailymotion-testing', + } + }], + code: 'test-ad-unit', + mediaTypes: { + video: { + playerSize: [300, 250], + context: 'instream', + }, + } +}]; + +// Do not forget to set an empty object for "floors" to active the price floor module +pbjs.setConfig({floors: {}}); +``` + +The following request will be sent to Dailymotion Prebid Service : + +```javascript +{ + "pbv": "9.23.0-pre", + "ortb": { + "imp": [ + { + ... + "bidfloor": 2.22, + "bidfloorcur": "USD" + } + ], + } + ... +} +``` + +Or the price floor can be set at the package level, for example : + +```javascript +const adUnits = [ + { + bids: [{ + bidder: 'dailymotion', + params: { + apiKey: 'dailymotion-testing', + } + }], + code: 'test-ad-unit', + mediaTypes: { + video: { + playerSize: [1280,720], + context: 'instream', + }, + } + } +]; + +pbjs.setConfig({ + floors: { + data: { + currency: 'USD', + schema: { + fields: [ 'mediaType', 'size' ] + }, + values: { + 'video|300x250': 2.22, + 'video|*': 1 + } + } + } +}) +``` + +This will send the following bid floor in the request to Daiymotion Prebid Service : + +```javascript +{ + "pbv": "9.23.0-pre", + "ortb": { + "imp": [ + { + ... + "bidfloor": 1, + "bidfloorcur": "USD" + } + ], + ... + } +} +``` + +You can also [set dynamic floors](https://docs.prebid.org/dev-docs/modules/floors.html#bid-adapter-interface). + ### Test Parameters By setting the following bid parameters, you'll get a constant response to any request, to validate your adapter integration: @@ -175,7 +285,7 @@ const adUnits = [ maxduration: 30, playbackmethod: [3], plcmt: 1, - protocols: [7, 8, 11, 12, 13, 14] + protocols: [7, 8, 11, 12, 13, 14], startdelay: 0, w: 1280, h: 720, @@ -220,8 +330,4 @@ If you already specify [First-Party data](https://docs.prebid.org/features/first | `ortb2.site.content.keywords` | `tags` | | `ortb2.site.content.title` | `title` | | `ortb2.site.content.url` | `url` | -| `ortb2.app.bundle` | N/A | -| `ortb2.app.storeurl` | N/A | -| `ortb2.device.lmt` | N/A | -| `ortb2.device.ifa` | N/A | -| `ortb2.device.ext.atts` | N/A | +| `ortb2.*` | N/A | From cdb5dff560a730168b463cd834bda43cb170475c Mon Sep 17 00:00:00 2001 From: CKBrennan <69460288+CKBrennan@users.noreply.github.com> Date: Mon, 3 Mar 2025 20:16:01 +0100 Subject: [PATCH 479/816] Create overtoneRtdProvider.md (#5827) * Create overtoneRtdProvider.md * Update overtoneRtdProvider.md Changed structure * Update overtoneRtdProvider.md * Update overtoneRtdProvider.md * Update dev-docs/modules/overtoneRtdProvider.md Co-authored-by: Muki Seiler * Update dev-docs/modules/overtoneRtdProvider.md Co-authored-by: Muki Seiler * Update overtoneRtdProvider.md Updating to fix linting errors --------- Co-authored-by: Muki Seiler --- dev-docs/modules/overtoneRtdProvider.md | 81 +++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 dev-docs/modules/overtoneRtdProvider.md diff --git a/dev-docs/modules/overtoneRtdProvider.md b/dev-docs/modules/overtoneRtdProvider.md new file mode 100644 index 0000000000..a13f5cd232 --- /dev/null +++ b/dev-docs/modules/overtoneRtdProvider.md @@ -0,0 +1,81 @@ +# Overtone Real-time Data Submodule + +## Overview + + Module Name: Overtone Rtd Provider + Module Type: Rtd Provider + Maintainer: tech@overtone.ai + +## Description + +The Overtone RTD module appends Contextual segments to the bidding object based on the Overtone taxonomy and custom metrics added by the publisher. Please contact in order to be whitelisted for use of our API and to explore dozens of contextual signals. + +## Usage +To install and enable the Overtone RTD module, follow these steps: + +### Step 1: Prepare the base Prebid file + +* **Option 1**: Use Prebid [Download](https://docs.prebid.org/download.html) page to build the Prebid package. Ensure that you check the **Overtone Real-Time Data Module** checkbox. +* **Option 2**: From the command line, run `gulp build --modules=overtoneRtdProvider,...`. + +### Step 2: Configure the module + +### Configuration + +Use `setConfig` to instruct Prebid.js to initilize the Overtone RTD module, as specified below. + +This module is configured as part of the `realTimeData.dataProviders` + +javascript +pbjs.setConfig({ + realTimeData: { + dataProviders: [{ + name: 'overtone', + params: { + apiKey: 'YOUR_API_KEY', + domains: ['example.com'], + timeout: 500 + } + }] + } +}); + +| Name | Type | Description | Default | +| :------------------------ | :------------ | :--------------------------------------------------------------- |:----------------- | +| name | String | Real time data module name | Always 'overtone' | +| params | Object | | | +| params.apiKey | String | Your unique API key provided by Overtone | YOUR_API_KEY | +| params.domains | Array | Array of whitelisted domains for contextual analysis | | +| params.timeout | Integer | timeout (ms) | 500ms | + +## Validation and Testing + +Validation of the Overtone RTD module is essential to ensure proper configuration. Use the provided test suite in the Prebid.js repository: + +File: `test/spec/modules/overtoneRtdProvider_spec.mjs` + +### Test Scenarios + +#### Successful Response + +**Input**: Valid domain with contextual data. + +**Expected Output**: Populated `categories` array with status `1`. + +#### Failed Request + +**Input**: Invalid domain or missing API key. + +**Expected Output**: Empty `categories` array with status `3`. + +#### Ignored URL + +**Input**: Domain not whitelisted by Overtone. + +**Expected Output**: Empty `categories` array with status `4`. + +--- + +## Support and Contact + +For questions, issues, or support, contact the Overtone technical team at . From 2986fe4829e815ede05e568c57a10d54d785fc83 Mon Sep 17 00:00:00 2001 From: SmartHubSolutions <87376145+SmartHubSolutions@users.noreply.github.com> Date: Mon, 3 Mar 2025 21:20:16 +0200 Subject: [PATCH 480/816] Artechnology: add PBS support (#5913) Co-authored-by: Victor --- dev-docs/bidders/artechnology.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/artechnology.md b/dev-docs/bidders/artechnology.md index 7cfe1258b9..ecb0b3f28a 100644 --- a/dev-docs/bidders/artechnology.md +++ b/dev-docs/bidders/artechnology.md @@ -14,7 +14,7 @@ deals_supported: true floors_supported: true fpd_supported: false pbjs: true -pbs: false +pbs: true pbs_app_supported: true multiformat_supported: true --- From 217ab35f3aa4137c727d8f9fbad0a6e347887516 Mon Sep 17 00:00:00 2001 From: Jason Quaccia Date: Mon, 3 Mar 2025 13:17:52 -0800 Subject: [PATCH 481/816] Docs for the new PubMatic user id submodule (#5919) --- .../modules/userid-submodules/pubmatic.md | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 dev-docs/modules/userid-submodules/pubmatic.md diff --git a/dev-docs/modules/userid-submodules/pubmatic.md b/dev-docs/modules/userid-submodules/pubmatic.md new file mode 100644 index 0000000000..0231a6ddad --- /dev/null +++ b/dev-docs/modules/userid-submodules/pubmatic.md @@ -0,0 +1,54 @@ +--- +layout: userid +title: PubMatic ID +description: PubMatic ID User ID sub-module +useridmodule: pubmaticIdSystem +bidRequestUserId: pubmaticId +eidsource: esp.pubmatic.com +example: '"1111"' +--- + + +## PubMatic ID Configuration + +Please make sure to add the PubMatic user ID sub-module to your Prebid.js package with: + +```shell +gulp build --modules=pubmaticIdSystem,userId +``` + +The following configuration parameters are available: + +{: .table .table-bordered .table-striped } + +| Param under userSync.userIds[] | Scope | Type | Description | Example | +| --- | --- | --- | --- | --- | +| name | Required | String | The name of this sub-module | `"pubmaticId"` | +| params ||| Details for the sub-module initialization || +| params.publisherId | Required | Number | Publisher ID | `123456` | +| storage ||||| +| storage.name | Required | String | The name of the cookie or html5 local storage key | `"pubmaticId"` | +| storage.type | Required | String | This is where the PubMatic user ID will be stored | `"cookie&html5"` (recommended) or `"html5"` or `"cookie"` | +| storage.expires | Required (Must be `30`) | Number | How long (in days) the user ID information will be stored | `30` | +| storage.refreshInSeconds | Required (Must be `86400`) | Number | How many seconds until the ID is refreshed | `86400` | + +## PubMatic ID Example + +```javascript +pbjs.setConfig({ + userSync: { + userIds: [{ + name: "pubmaticId", + params: { + publisherId: "123456" // Example ID + }, + storage: { + name: "pubmaticId", + type: "cookie&html5", + expires: 30, + refreshInSeconds: 86400 + } + }] + } +}); +``` From c3ab883f37dd3ddef291cf760891ca2b4531a307 Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 4 Mar 2025 02:14:57 -0500 Subject: [PATCH 482/816] docpath change alert workflow (#5911) * docpath change alert workflow * added openx --- .github/workflows/code-path-changes.yml | 37 +++++ .../workflows/scripts/codepath-notification | 16 ++ .../scripts/send-notification-on-change.js | 139 ++++++++++++++++++ 3 files changed, 192 insertions(+) create mode 100644 .github/workflows/code-path-changes.yml create mode 100644 .github/workflows/scripts/codepath-notification create mode 100644 .github/workflows/scripts/send-notification-on-change.js diff --git a/.github/workflows/code-path-changes.yml b/.github/workflows/code-path-changes.yml new file mode 100644 index 0000000000..23e0c19db6 --- /dev/null +++ b/.github/workflows/code-path-changes.yml @@ -0,0 +1,37 @@ +name: Notify Code Path Changes + +on: + pull_request_target: + types: [opened, synchronize] + paths: + - '**' + +env: + OAUTH2_CLIENT_ID: ${{ secrets.OAUTH2_CLIENT_ID }} + OAUTH2_CLIENT_SECRET: ${{ secrets.OAUTH2_CLIENT_SECRET }} + OAUTH2_REFRESH_TOKEN: ${{ secrets.OAUTH2_REFRESH_TOKEN }} + GITHUB_REPOSITORY: ${{ github.repository }} + GITHUB_PR_NUMBER: ${{ github.event.pull_request.number }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + +permissions: + contents: read + +jobs: + notify: + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v3 + + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: '18' + + - name: Install dependencies + run: npm install axios nodemailer + + - name: Run Notification Script + run: | + node .github/workflows/scripts/send-notification-on-change.js diff --git a/.github/workflows/scripts/codepath-notification b/.github/workflows/scripts/codepath-notification new file mode 100644 index 0000000000..3b40b766c9 --- /dev/null +++ b/.github/workflows/scripts/codepath-notification @@ -0,0 +1,16 @@ +# when a changed file paths matches the regex, send an alert email +# structure of the file is: +# +# javascriptRegex : email address +# +# For example, in the Prebid docs repo, the file pattern is generally +# +# /dev-docs/bidders/BIDDERCODE.md +# +# The aim is to find a minimal set of regex patterns that matches any file in these paths + +/dev-docs/bidders/rubicon : header-bidding@magnite.com +/dev-docs/bidders/ix : pdu-supply-prebid@indexexchange.com +/dev-docs/bidders/appnexus|/dev-docs/bidders/msft : prebid@microsoft.com +/dev-docs/bidders/pubmatic : header-bidding@pubmatic.com +/dev-docs/bidders/openx : prebid@openx.com diff --git a/.github/workflows/scripts/send-notification-on-change.js b/.github/workflows/scripts/send-notification-on-change.js new file mode 100644 index 0000000000..af79cefd29 --- /dev/null +++ b/.github/workflows/scripts/send-notification-on-change.js @@ -0,0 +1,139 @@ +// send-notification-on-change.js +// +// called by the code-path-changes.yml workflow, this script queries github for +// the changes in the current PR, checks the config file for whether any of those +// file paths are set to alert an email address, and sends email to multiple +// parties if needed + +const fs = require('fs'); +const path = require('path'); +const axios = require('axios'); +const nodemailer = require('nodemailer'); + +async function getAccessToken(clientId, clientSecret, refreshToken) { + try { + const response = await axios.post('https://oauth2.googleapis.com/token', { + client_id: clientId, + client_secret: clientSecret, + refresh_token: refreshToken, + grant_type: 'refresh_token', + }); + return response.data.access_token; + } catch (error) { + console.error('Failed to fetch access token:', error.response?.data || error.message); + process.exit(1); + } +} + +(async () => { + const configFilePath = path.join(__dirname, 'codepath-notification'); + const repo = process.env.GITHUB_REPOSITORY; + const prNumber = process.env.GITHUB_PR_NUMBER; + const token = process.env.GITHUB_TOKEN; + + // Generate OAuth2 access token + const clientId = process.env.OAUTH2_CLIENT_ID; + const clientSecret = process.env.OAUTH2_CLIENT_SECRET; + const refreshToken = process.env.OAUTH2_REFRESH_TOKEN; + + // validate params + if (!repo || !prNumber || !token || !clientId || !clientSecret || !refreshToken) { + console.error('Missing required environment variables.'); + process.exit(1); + } + + // the whole process is in a big try/catch. e.g. if the config file doesn't exist, github is down, etc. + try { + // Read and process the configuration file + const configFileContent = fs.readFileSync(configFilePath, 'utf-8'); + const configRules = configFileContent + .split('\n') + .filter(line => line.trim() !== '' && !line.trim().startsWith('#')) // Ignore empty lines and comments + .map(line => { + const [regex, email] = line.split(':').map(part => part.trim()); + return { regex: new RegExp(regex), email }; + }); + + // Fetch changed files from github + const [owner, repoName] = repo.split('/'); + const apiUrl = `https://api.github.com/repos/${owner}/${repoName}/pulls/${prNumber}/files`; + const response = await axios.get(apiUrl, { + headers: { + Authorization: `Bearer ${token}`, + Accept: 'application/vnd.github.v3+json', + }, + }); + + const changedFiles = response.data.map(file => file.filename); + console.log('Changed files:', changedFiles); + + // match file pathnames that are in the config and group them by email address + const matchesByEmail = {}; + changedFiles.forEach(file => { + configRules.forEach(rule => { + if (rule.regex.test(file)) { + if (!matchesByEmail[rule.email]) { + matchesByEmail[rule.email] = []; + } + matchesByEmail[rule.email].push(file); + } + }); + }); + + // Exit successfully if no matches were found + if (Object.keys(matchesByEmail).length === 0) { + console.log('No matches found. Exiting successfully.'); + process.exit(0); + } + + console.log('Grouped matches by email:', matchesByEmail); + + // get ready to email the changes + const accessToken = await getAccessToken(clientId, clientSecret, refreshToken); + + // Configure Nodemailer with OAuth2 + // service: 'Gmail', + const transporter = nodemailer.createTransport({ + host: "smtp.gmail.com", + port: 465, + secure: true, + auth: { + type: 'OAuth2', + user: 'info@prebid.org', + clientId: clientId, + clientSecret: clientSecret, + refreshToken: refreshToken, + accessToken: accessToken + }, + }); + + // Send one email per recipient + for (const [email, files] of Object.entries(matchesByEmail)) { + const emailBody = ` + ${email}, +

    + Files owned by you have been changed in open source ${repo}. The pull request is #${prNumber}. These are the files you own that have been modified: +

      + ${files.map(file => `
    • ${file}
    • `).join('')} +
    + `; + + try { + await transporter.sendMail({ + from: `"Prebid Info" `, + to: email, + subject: `Files have been changed in open source ${repo}`, + html: emailBody, + }); + + console.log(`Email sent successfully to ${email}`); + console.log(`${emailBody}`); + } catch (error) { + console.error(`Failed to send email to ${email}:`, error.message); + } + } + } catch (error) { + console.error('Error:', error.message); + process.exit(1); + } +})(); From c7230a56ceffac22d6043f36d17c48a50459997e Mon Sep 17 00:00:00 2001 From: Oleksandr Solodovnikov Date: Wed, 5 Mar 2025 14:47:16 +0200 Subject: [PATCH 483/816] Aniview: Add examples and update params list (#5916) * Aniview: Add examples and update params list * Aniview: Added new line to the end of the file * Aniview: Updated features, params list, examples * Aniview: Clarified gpp_sids, multiformat_supported and userIds; Removed few examples --------- Co-authored-by: Oleksandr Solodovnikov --- dev-docs/bidders/aniview.md | 106 +++++++++++++++++++++++++++++++----- 1 file changed, 93 insertions(+), 13 deletions(-) diff --git a/dev-docs/bidders/aniview.md b/dev-docs/bidders/aniview.md index dfd04b313c..d9c6308417 100644 --- a/dev-docs/bidders/aniview.md +++ b/dev-docs/bidders/aniview.md @@ -5,6 +5,9 @@ description: Prebid Aniview Bidder Adapter pbjs: true biddercode: aniview media_types: banner, video +gpp_sids: tcfeu, tcfca, usnat, usstate_all, usp +ortb_blocking_supported: true +multiformat_supported: will-bid-on-any tcfeu_supported: true floors_supported: true usp_supported: true @@ -12,6 +15,7 @@ schain_supported: true safeframes_ok: true gvl_id: 780 sidebarType: 1 +userIds: all --- ### Note @@ -21,29 +25,105 @@ For more information about [Aniview Ad Server](https://www.aniview.com/), please ### Bid Params {: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|------------------|----------|------------------|------------------------------|----------| -| `AV_PUBLISHERID` | required | Publisher/Netid | `'55b88d4a181f465b3e8b4567'` | `string` | -| `AV_CHANNELID` | required | Channel id | `'5a5f17a728a06102d14c2718'` | `string` | +| Name | Scope | Description | Example | Type | +|------------------|----------|-----------------------|----------------------|----------| +| `AV_PUBLISHERID` | required | Publisher/Network ID | `'Get from Aniview'` | `string` | +| `AV_CHANNELID` | required | Channel ID | `'Get from Aniview'` | `string` | -### Test Parameters +### Setup for Video ```javascript -const videoAdUnit = [ -{ - code: 'video1', +const adUnit = [{ + code: 'videoAdUnit', mediaTypes: { video: { + // Required playerSize: [[640, 480]], - context: 'outstream' + context: 'outstream', + mimes: ['video/mp4', 'video/mpeg', 'application/javascript'], + + // Optional + playbackmethod: [1, 2], + protocols: [1, 2, 3, 5, 6, 7, 8], + api: [1, 2], + maxduration: 60, + plcmt: 4, }, }, bids: [{ bidder: 'aniview', params: { - AV_PUBLISHERID: '55b78633181f4603178b4568', - AV_CHANNELID: '5d19dfca4b6236688c0a2fc4' - } - }] + // Required + AV_PUBLISHERID: 'Get from Aniview', + AV_CHANNELID: 'Get from Aniview', + }, + }], +}]; +``` + +### Setup for Banner + +```javascript +const adUnit = [{ + code: 'bannerAdUnit', + mediaTypes: { + banner: { + // Required + sizes: [[300, 250], [300, 600]], + }, + }, + bids: [{ + bidder: 'aniview', + params: { + // Required + AV_PUBLISHERID: 'Get from Aniview', + AV_CHANNELID: 'Get from Aniview', + }, + }], +}]; +``` + +### Setup for Multi-format (Banner & Video) + +```javascript +const adUnit = [{ + code: 'multiformatAdUnit', + mediaTypes: { + banner: { + // Required + sizes: [[300, 250], [300, 600]], + }, + video: { + // Required + playerSize: [[640, 480]], + context: 'outstream', + mimes: ['video/mp4', 'video/mpeg', 'application/javascript'], + }, + }, + bids: [{ + bidder: 'aniview', + params: { + // Required + AV_PUBLISHERID: 'Get from Aniview', + AV_CHANNELID: 'Get from Aniview', + }, + }], }]; ``` + +### Bidder specific configs + +```javascript +pbjs.setBidderConfig({ + bidders: ['aniview'], + config: { + ortb2: { + ext: { + aniview: { + // Additional data to send to the Ad Server + }, + }, + }, + }, +}, true); +``` From 226781fa932d317e1dcb3df343eadef41e9f731c Mon Sep 17 00:00:00 2001 From: dmytro-po Date: Thu, 6 Mar 2025 09:15:00 +0200 Subject: [PATCH 484/816] AGT-415: Callback optional (#5924) --- dev-docs/modules/userid-submodules/intentiq.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/modules/userid-submodules/intentiq.md b/dev-docs/modules/userid-submodules/intentiq.md index 449b356983..4e3044de0e 100644 --- a/dev-docs/modules/userid-submodules/intentiq.md +++ b/dev-docs/modules/userid-submodules/intentiq.md @@ -41,7 +41,7 @@ Please find below list of parameters that could be used in configuring Intent IQ | params.partner | Required | Number | 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"` | -| params.callback | Required | Function | This is a callback which is trigered with data and AB group | `(data, group) => console.log({ data, group })` | +| params.callback | Optional | Function | This is a callback which is trigered with data and AB group | `(data, group) => console.log({ data, group })` | | params.timeoutInMillis | Optional | Number | This is the timeout in milliseconds, which defines the maximum duration before the callback is triggered. The default value is 500. | `450` | | params.browserBlackList | Optional |  String | This is the name of a browser that can be added to a blacklist. | `"chrome"` | | params.manualWinReportEnabled | Optional | Boolean | This variable determines whether the bidWon event is triggered automatically. If set to false, the event will occur automatically, and manual reporting with reportExternalWin will be disabled. If set to true, the event will not occur automatically, allowing manual reporting through reportExternalWin. The default value is false. | `true`| From 57a18fe1aadc34bf52c40ad6cdf5c01c6a5b003b Mon Sep 17 00:00:00 2001 From: kiho-shige <133089869+kiho-shige@users.noreply.github.com> Date: Thu, 6 Mar 2025 23:02:11 +0900 Subject: [PATCH 485/816] YieldOne Bid Adapter: add UID2.0 support and update email. (#5925) --- dev-docs/bidders/yieldone.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/yieldone.md b/dev-docs/bidders/yieldone.md index c2cb8ef6b3..e409e60811 100644 --- a/dev-docs/bidders/yieldone.md +++ b/dev-docs/bidders/yieldone.md @@ -4,7 +4,7 @@ title: YieldOne description: Prebid YieldOne Bidder Adaptor biddercode: yieldone media_types: banner, video -userIds: identityLink, imuid, AudienceOne ID, ID5 +userIds: identityLink, imuid, AudienceOne ID, ID5, UID2.0 pbjs: true pbs: true multiformat_supported: will-bid-on-any @@ -14,7 +14,7 @@ sidebarType: 1 ### Note THE YieldOne adapter requires setup and approval from the YieldOne team.
    -Please reach out to your account team or for more information. +Please reach out to your account team or for more information. ### Bid Params From 9a7d8b112403744891f97a2d9cdec0656f3dfc7b Mon Sep 17 00:00:00 2001 From: Pete Date: Thu, 6 Mar 2025 18:08:26 +0200 Subject: [PATCH 486/816] feat(): EXCO Bid Adapter: Support of new publisherId, accountId and tagId parameters. (#5926) * feat(): EXCO Bid Adapter: Support of new publisherId, accountId and tagId parameters. * feat(): EXCO Bid Adapter: Support of new publisherId, accountId and tagId parameters. * feat(): EXCO Bid Adapter: Support of new publisherId, accountId and tagId parameters. --- dev-docs/bidders/exco.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/dev-docs/bidders/exco.md b/dev-docs/bidders/exco.md index 72d2d3898b..36631c89e0 100644 --- a/dev-docs/bidders/exco.md +++ b/dev-docs/bidders/exco.md @@ -28,11 +28,14 @@ sidebarType: 1 {: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|------------|----------|-------------------------------------------------------------------------------------------|------------------------------|----------| -| `cId` | required | The connection ID from Exco. | `'562524b21b1c1f08117fc7f9'` | `string` | -| `pId` | required | The publisher ID from Exco. | `'59ac17c192832d0011283fe3'` | `string` | -| `bidFloor` | optional | The minimum bid value desired. Exco will not respond with bids lower than this value. | `0.90` | `float` | +| Name | Scope | Description | Example | Type | +|---------------|------------|---------------------------------------------------------------------------------------|------------------------------|----------| +| `cId` | deprecated | The connection ID from Exco. | `'562524b21b1c1f08117fc7f9'` | `string` | +| `pId` | deprecated | The publisher ID from Exco. | `'59ac17c192832d0011283fe3'` | `string` | +| `bidFloor` | deprecated | The minimum bid value desired. Exco will not respond with bids lower than this value. | `0.90` | `float` | +| `accountID` | required | A unique account identifier provided by EX.CO. | `'1234567890'` | `string` | +| `publisherId` | required | Publisher ID provided by EX.CO. | `'1234567890'` | `string` | +| `tagId` | required | A unique Tag ID (supply id) identifier provided by EX.CO. | `'1234567890'` | `string` | ### Example @@ -50,9 +53,9 @@ var adUnits = [{ bids: [{ bidder: 'exco', params: { - cId: '562524b21b1c1f08117fc7f9', // Required - PROVIDED DURING SETUP... - pId: '59ac17c192832d0011283fe3', // Required - PROVIDED DURING SETUP... - bidFloor: 1.23 // Optional + accountID: '1234567890', // Required - PROVIDED DURING SETUP... + publisherId: '1234567890', // Required - PROVIDED DURING SETUP... + tagId: '1234567890' // Required - PROVIDED DURING SETUP... } }] } From d45083cbf32612123f38af0444c34e2e26ba5731 Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 6 Mar 2025 11:31:11 -0500 Subject: [PATCH 487/816] PBS USGen doc update (#5927) * PBS USGen doc update Adding allowPersonalDataConsent2 option * Update pbs-usgen.md --- prebid-server/features/pbs-usgen.md | 1 + 1 file changed, 1 insertion(+) diff --git a/prebid-server/features/pbs-usgen.md b/prebid-server/features/pbs-usgen.md index 273699d1d6..bfe61d2481 100644 --- a/prebid-server/features/pbs-usgen.md +++ b/prebid-server/features/pbs-usgen.md @@ -74,6 +74,7 @@ Here's an example: | Parameter | Type | Scope | Description | |------|------|-------------| | skipSids | array of integer | Optional | Do not process the named section IDs. | +| allowPersonalDataConsent2 | boolean | Optional | Defaults to 'false'. [Prebid's logic](/features/mspa-usnat.html) for personal data consents considers a value of 2 as non-sensical. But it turns out that several CMPs didn't get that message and are reporting this value. We will deprecate this option once the CMPs are all on the same page. | By default the module will process GPP SIDs 7-12. The `skipSids` parameter allows the publisher to define a different processing flow for different GPP SIDs. From 37fb07454bc8326f6b7bcf6ed0dd6eb2df1bf704 Mon Sep 17 00:00:00 2001 From: bretg Date: Mon, 10 Mar 2025 15:50:10 -0400 Subject: [PATCH 488/816] PBS Activitycontrol typo (#5933) --- prebid-server/features/pbs-activitycontrols.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prebid-server/features/pbs-activitycontrols.md b/prebid-server/features/pbs-activitycontrols.md index dc2012ecdf..cce4e2b572 100644 --- a/prebid-server/features/pbs-activitycontrols.md +++ b/prebid-server/features/pbs-activitycontrols.md @@ -186,7 +186,7 @@ Here's the list of the 'potentially restricted activities' that Prebid Server co | `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 to their endpoint. (Note: this is combined with transmitEids in PBS-Go and PBJ-Java 2.11 and under) | User FPD and EIDs are hidden from the adapter or module: `user.{id, buyeruid, yob, gender, geo, eids, data}`, `user.ext.data`, `device.{device.ifa, macsha1, macmd5, dpidsha1, dpidmd5, didsha1, didmd5}` | +| `transmitUfpd` | A bid adapter, analytics adapter, or module wants to access and/or transmit user FPD to their endpoint. (Note: this is combined with transmitEids in PBS-Go and PBJ-Java 2.11 and under) | User FPD and EIDs are hidden from the adapter or module: `user.{id, buyeruid, yob, gender, geo, eids, data}`, `user.ext.data`, `device.{ifa, macsha1, macmd5, dpidsha1, dpidmd5, didsha1, didmd5}` | | `transmitEids` | (PBS-Java 2.12 and later) A bid adapter, analytics adapter, or module wants to access and/or transmit extended IDs to their endpoint. | User EIDs are hidden from the adapter or module: `user.eids`, `user.ext.eids` | | `transmitPreciseGeo` | A bid adapter, analytics adapter, or module wants to access and/or transmit precise geolocation data to their endpoint | device.geo 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. In PBS-Java 3.0 and later, device.geo.{country,region,utcoffset} are preserved, but device.geo.{metro,city,zip,accuracy,ipservice,ext} are removed.| | `transmitTid` | (PBS-Java only) The source.tid and imp.ext.tid fields can be generated or suppressed by PBS before going to bidders. The ext.prebid.createtid request parameter overrides the allow state of this activity. If `ext.prebid.createtid:false`, transmitTid is "denied". | If "allowed", then source.tid and imp.ext.tid will be generated by PBS. Otherwise, they won't be generated. | From 73d101de541b17cac801e5a1288d2750b939b2da Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 11 Mar 2025 14:27:19 -0400 Subject: [PATCH 489/816] Update pbs-endpoint-auction.md (#5938) --- prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md index b933e81d74..fba8218898 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -1891,8 +1891,9 @@ ext.prebid.biddercontrols: { Here's how this works: -1. If the bid adapter YAML declares support of multiformat, then `prefmtype` is ignored in the request. The default value of multiformat supported is `true`. +1. If the bid adapter YAML declares support of multiformat as `true`, then `prefmtype` is ignored in the request. The default value of multiformat supported is `false`. 1. If the bidder declares that they don't support multiformat and the incoming request contains multiple formats, then one of the formats is chosen by either `$.ext.prebid.biddercontrols.BIDDER.prefmtype` or config `auction.preferredmediatype.BIDDER` +1. If multiformat-supported is false, and if the specified prefmtype is not part of the request, then the imp doesn't go out to the bidder. #### OpenRTB Response Extensions From bc79e8c8d81e1bea7fac010ef6a5bb1ed1b6e7f4 Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 13 Mar 2025 13:24:46 -0400 Subject: [PATCH 490/816] documenting static floors (#5946) * documenting static floors * Update floors.md --- dev-docs/adunit-reference.md | 6 ++++-- dev-docs/modules/floors.md | 30 ++++++++++++++++++++++++++-- prebid-server/features/pbs-floors.md | 3 +++ 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/dev-docs/adunit-reference.md b/dev-docs/adunit-reference.md index 1369862c23..5a6967b77a 100644 --- a/dev-docs/adunit-reference.md +++ b/dev-docs/adunit-reference.md @@ -599,9 +599,9 @@ time to set targeting. -### First Party Data +### First Party Data and Floors -Example of an adunit-specific block of first party data: +Example of an adunit-specific block of first party data and a static floor: ```javascript pbjs.addAdUnits({ @@ -612,6 +612,8 @@ pbjs.addAdUnits({ } }, ortb2Imp: { + bidfloor: 1.00, + bidfloorcur: "EUR", ext: { data: { pbadslot: "homepage-top-rect", diff --git a/dev-docs/modules/floors.md b/dev-docs/modules/floors.md index b639d54909..839bfdcd88 100644 --- a/dev-docs/modules/floors.md +++ b/dev-docs/modules/floors.md @@ -58,6 +58,26 @@ Notes: * [Prebid Floor Service Providers](/dev-docs/modules/floors.html#floors-providers) * [Transcript of this video](/dev-docs/floors-video-overview.html) +### Simple Static Floors + +Some publishers just want to set a simple static floor. Please don't use this module for that. This module should only be used when you need to vary the floor by mediatype, size, etc. Here's how you can set static floors on each Prebid adunit: + +```javascript +pbjs.addAdUnits({ + code: "test-div", + mediaTypes: { + banner: { + sizes: [[300,250]] + } + }, + ortb2Imp: { + bidfloor: 1.00, + bidfloorcur: "EUR" + }, + // ... +}); +``` + ## How it Works There are several places where the Floor module changes the behavior of the Prebid.js auction process. Below is a diagram describing the general flow of the client-side Price Floors Module: @@ -298,10 +318,13 @@ Schema 1 restricts floors providers or publishers to applying only one data grou Note: if you're a dynamic floor provider service, your response must be a subset that will be merged under the 'data' object. +{: .alert.alert-warning :} +You **cannot** set the `floorMin` parameter without specifying a `data` object. See the [simple static floor](/dev-docs/modules/floors.html#simple-static-floors) section above for more info. + {: .table .table-bordered .table-striped } | Param | Type | Description | Default | |---+---+---+---+---| -| floorMin | float | The mimimum CPM floor used by the Price Floors Module (as of 4.13). The Price Floors Module will take the greater of floorMin and the matched rule CPM when evaluating getFloor() and enforcing floors. | - | +| floorMin | float | The mimimum CPM floor used by the Price Floors Module (as of 4.13). The Price Floors Module will take the greater of floorMin and the matched rule CPM when evaluating getFloor() and enforcing floors. **Note**: this is not a method of setting a [static floor](/dev-docs/modules/floors.html#simple-static-floors). | - | | floorProvider | string | Optional atribute (as of prebid version 4.1) used to signal to the Floor Provider's Analytics adapter their floors are being applied. They can opt to log only floors that are applied when they are the provider. If floorProvider is supplied in both the top level of the floors object and within the data object, the data object's configuration shall prevail.| - | | enforcement | object | Controls the enforcement behavior within the 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 | @@ -354,10 +377,13 @@ While some attributes are common in both schema versions, for completeness, all Note: if you're a dynamic floor provider service, your response must be a subset that will be merged under the 'data' object. +{: .alert.alert-warning :} +You **cannot** set the `floorMin` parameter without specifying a `data` object. See the [simple static floor](/dev-docs/modules/floors.html#simple-static-floors) section above for more info. + {: .table .table-bordered .table-striped } | Param | Type | Description | Default | |---+---+---+---+---| -| floorMin | float | The mimimum CPM floor used by the module (as of 4.13). The module will take the greater of floorMin and the matched rule CPM when evaluating getFloor() and enforcing floors. | - | +| floorMin | float | The mimimum CPM floor used by the module (as of 4.13). The module will take the greater of floorMin and the matched rule CPM when evaluating getFloor() and enforcing floors. **Note**: this is not a method of setting a [static floor](/dev-docs/modules/floors.html#simple-static-floors). | - | | floorMinCur | float | Prebid Server only: the currency used for the floorMin value. | - | | floorProvider | string | Optional atribute (as of prebid version 4.1) used to signal to the Floor Provider's Analytics adapter their floors are being applied. They can opt to log only floors that are applied when they are the provider. If floorProvider is supplied in both the top level of the floors object and within the data object, the data object's configuration shall prevail.| - | | skipRate | integer | skipRate is a random function whose input value is any integer 0 through 100 to determine when to skip all floor logic, where 0 is always use floor data and 100 is always skip floor data. The use case is for publishers or floor providers to learn bid behavior when floors are applied or skipped. Analytics adapters will have access to model version (if defined) when skipped is true to signal the module is in floors mode. If skipRate is supplied in both the root level of the floors object and within the data object, the skipRate configuration within the data object shall prevail. | 0 | diff --git a/prebid-server/features/pbs-floors.md b/prebid-server/features/pbs-floors.md index 64a953f373..8cdbc9fc6b 100644 --- a/prebid-server/features/pbs-floors.md +++ b/prebid-server/features/pbs-floors.md @@ -153,6 +153,9 @@ completely backwards-compatible -- PBS will accept and process any Prebid.js flo ### Defining Floor data +{: .alert.alert-warning :} +You **cannot** set the `floorMin` parameter without specifying a `data` object. See the [simple static floor](/dev-docs/modules/floors.html#simple-static-floors) section for more info. + As described in the [Signaling](#floor-signaling) section above, floor data may be defined in several ways. Here's the order of priority: 1. Dynamic data - if PBS finds recent (non-expired) floors data from a dynamic floors vendor, that takes precedence. From 424eaae4d48efbabc07abdbc5c1977c11e8920e2 Mon Sep 17 00:00:00 2001 From: Rich Audience Date: Mon, 17 Mar 2025 09:23:13 +0100 Subject: [PATCH 491/816] Update richaudience.md (#5937) * Update richaudience.md * Update richaudience.md * Update richaudience.md --- dev-docs/bidders/richaudience.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/dev-docs/bidders/richaudience.md b/dev-docs/bidders/richaudience.md index acb20c0fc5..0429d123c0 100644 --- a/dev-docs/bidders/richaudience.md +++ b/dev-docs/bidders/richaudience.md @@ -14,7 +14,6 @@ pbjs: true pbs: true schain_supported: true floors_supported: true -pbjs_version_notes: Please use version 9.1; version 9.0 does not support our adapter. sidebarType: 1 --- @@ -26,17 +25,4 @@ sidebarType: 1 | `pid` | required | The placement ID from Rich Audience. | `'ADb1f40rmi'` | `string` | | `supplyType`| required | Define if site or app. | `'site / app'` | `string` | | `ifa` | optional | Identifier For Advertisers | `'AAAAAAAAA-BBBB-CCCC-1111-222222220000234234234234234'` | `string` | -| `bidfloor` | optional | Bid Floor | `0.80` | `float` | | `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 } -| Name | Scope | Description | Example | Type | -|-------------|----------|----------------------------------------|-------------------------------|-----------| -| `init` | optional | Start mode of the player open or close | `'open / close'` | `string` | -| `end` | optional | End mode of the player open or close | `'open / close'` | `string` | -| `skin` | optional | Choose the background color | `'dark / light'` | `string` | From 52d15befbf38ecece9bc4adc79324bc344d38284 Mon Sep 17 00:00:00 2001 From: Pavlo Kyrylenko Date: Mon, 17 Mar 2025 22:29:06 +0200 Subject: [PATCH 492/816] anonymisedRtdProvider: can load Anonymised Marketing Tag external script (#5945) * added ref on how to load Anonymised Marketing Tag by the RTD module * corrected URLs to anonymised support portal --------- Co-authored-by: Pavlo --- dev-docs/modules/anonymisedRtdProvider.md | 25 +++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/dev-docs/modules/anonymisedRtdProvider.md b/dev-docs/modules/anonymisedRtdProvider.md index b0a3c1a553..755b5393cb 100644 --- a/dev-docs/modules/anonymisedRtdProvider.md +++ b/dev-docs/modules/anonymisedRtdProvider.md @@ -38,7 +38,11 @@ gulp build --modules=rtdModule,anonymisedRtdProvider,... params: { cohortStorageKey: "cohort_ids", bidders: ["appnexus", "onetag", "pubmatic", "smartadserver", ...], - segtax: 1000 + segtax: 1000, + tagConfig: { + clientId: 'testId' + //The rest of the Anonymised Marketing Tag parameters goes here + } } } ] @@ -46,16 +50,21 @@ gulp build --modules=rtdModule,anonymisedRtdProvider,... }); ``` -Please note that anonymisedRtdProvider should be integrated into the publisher website along with the [Anonymised Marketing Tag](https://support.anonymised.io/integrate/marketing-tag). -Please reach out to Anonymised [representative](mailto:support@anonymised.io) if you have any questions or need further help to integrate Prebid, anonymisedRtdProvider, and Anonymised Marketing Tag +The `anonymisedRtdProvider` must be integrated into the publisher's website along with the [Anonymised Marketing Tag](https://support.anonymised.io/integrate/marketing-tag?t=LPukVCXzSIcRoal5jggyeg). One way to install the Marketing Tag is through `anonymisedRtdProvider` by specifying the required [parameters](https://support.anonymised.io/integrate/optional-anonymised-tag-parameters?t=LPukVCXzSIcRoal5jggyeg) in the `tagConfig` object. + +The `tagConfig.clientId` parameter is mandatory for the Marketing Tag to initialize. If `tagConfig` is empty or `tagConfig.clientId` is undefined, the `anonymisedRtdProvider` will not initialize the Marketing Tag. The publisher's `clientId` is [provided by Anonymised](https://support.anonymised.io/integrate/install-the-anonymised-tag-natively#InstalltheAnonymisedtagnatively-Instructions?t=LPukVCXzSIcRoal5jggyeg). + +For any questions or assistance with integrating Prebid, `anonymisedRtdProvider`, or the Anonymised Marketing Tag, please contact an [Anonymised representative](mailto:support@anonymised.io). **Config Syntax details:** {: .table .table-bordered .table-striped } | Name |Type | Description | Notes | | :------------ | :------------ | :------------ |:------------ | -| name | String | Anonymised Rtd module name | 'anonymised' always| -| waitForIt | Boolean | Required to ensure that the auction is delayed until prefetch is complete | Optional. Defaults to false | -| params.cohortStorageKey | String | the `localStorage` key, under which Anonymised Marketing Tag stores the segment IDs | 'cohort_ids' always | -| params.bidders | Array | Bidders with which to share segment information | Required | -| params.segtax | Integer | The taxonomy for Anonymised | '1000' always | +| name | `String` | Anonymised Rtd module name | 'anonymised' always| +| waitForIt | `Boolean` | Required to ensure that the auction is delayed until prefetch is complete | Optional. Defaults to false | +| params.cohortStorageKey | `String` | the `localStorage` key, under which Anonymised Marketing Tag stores the segment IDs | 'cohort_ids' always | +| params.bidders | `Array` | Bidders with which to share segment information | Optional | +| params.segtax | `Integer` | The taxonomy for Anonymised | '1000' always | +| params.tagConfig | `Object` | Configuration for the Anonymised Marketing Tag | Optional. Defaults to `{}`. | +| params.tagUrl | `String` | The URL of the Anonymised Marketing Tag script | Optional. Defaults to `https://static.anonymised.io/light/loader.js`. | From 8ed034e54d39ff191091b633f7f22123490f1025 Mon Sep 17 00:00:00 2001 From: abermanov-zeta <95416296+abermanov-zeta@users.noreply.github.com> Date: Mon, 17 Mar 2025 21:30:59 +0100 Subject: [PATCH 493/816] Zeta SSP Adapter: sid is an optional PBS param, update supported modules and media types. (#5941) --- dev-docs/bidders/zeta_global_ssp.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidders/zeta_global_ssp.md b/dev-docs/bidders/zeta_global_ssp.md index b6d580dcae..11f32dceda 100644 --- a/dev-docs/bidders/zeta_global_ssp.md +++ b/dev-docs/bidders/zeta_global_ssp.md @@ -6,8 +6,11 @@ pbjs: true pbs: true biddercode: zeta_global_ssp deals_supported: false -media_types: banner, video +media_types: banner, video, audio tcfeu_supported: true +floors_supported: true +schain_supported: true +fpd_supported: true usp_supported: true coppa_supported: true userIds: all @@ -39,5 +42,7 @@ The Zeta Global SSP adapter requires setup and approval from the Zeta Global SSP #### Prebid Server Bid Params -Prebid Server Adapter does not support any parameters. -You must get `sid` value from Zeta Global and use it instead of the placeholder in the URL. +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|----------------------|----------|---------------------------------------------------------------------------------------------------------------------|--------------|-----------| +| `sid` | optional | Seller ID. The identifier associated with the seller or reseller account within the advertising system | `123` | `integer` | From d767b07ea9e5af85940216c70448bc2d91c68106 Mon Sep 17 00:00:00 2001 From: Muki Seiler Date: Mon, 17 Mar 2025 21:32:48 +0100 Subject: [PATCH 494/816] Add vendor-exceptions include (#5939) --- _includes/dev-docs/vendor-exception.md | 3 +++ dev-docs/modules/permutiveRtdProvider.md | 4 ++-- dev-docs/modules/tcfControl.md | 5 +++-- dev-docs/modules/userid-submodules/utiq.md | 3 +-- guide.md | 16 ++++++++++++++++ 5 files changed, 25 insertions(+), 6 deletions(-) create mode 100644 _includes/dev-docs/vendor-exception.md diff --git a/_includes/dev-docs/vendor-exception.md b/_includes/dev-docs/vendor-exception.md new file mode 100644 index 0000000000..65979daf1f --- /dev/null +++ b/_includes/dev-docs/vendor-exception.md @@ -0,0 +1,3 @@ +{: .alert.alert-warning :} +Prebid.org recommends working with a privacy lawyer before making enforcement exceptions for any vendor. +{% if include.gvlId %}We recommend publishers let Prebid.js make use of their registered GVL ID {{ include.gvlId }} instead of a vendor exception.{% endif %} diff --git a/dev-docs/modules/permutiveRtdProvider.md b/dev-docs/modules/permutiveRtdProvider.md index 67f7c6ed42..10c3836212 100644 --- a/dev-docs/modules/permutiveRtdProvider.md +++ b/dev-docs/modules/permutiveRtdProvider.md @@ -60,6 +60,7 @@ as well as enabling settings for specific use cases mentioned above (e.g. acbidd ## Parameters {: .table .table-bordered .table-striped } + | Name | Type | Description | Default | | ---------------------- | -------------------- | --------------------------------------------------------------------------------------------- | ------------------ | | name | String | This should always be `permutive` | - | @@ -78,8 +79,7 @@ If you are also using the [TCF Control Module](/dev-docs/modules/tcfControl.html ### Instructions -{: .alert.alert-warning :} -Prebid.org recommends working with a privacy lawyer before making enforcement exceptions for any vendor. Specifically for Permutive, we recommend publishers let Prebid.js make use of their registered GVL ID 361 instead of a vendor exception. +{% include dev-docs/vendor-exception.md gvlId="361" %} 1. Publisher enables rules within Prebid.js configuration. 2. Label Permutive as an exception, as shown below. diff --git a/dev-docs/modules/tcfControl.md b/dev-docs/modules/tcfControl.md index 0f493c3bff..ce10412285 100644 --- a/dev-docs/modules/tcfControl.md +++ b/dev-docs/modules/tcfControl.md @@ -40,6 +40,7 @@ The TCF Control Module adds the following: The following table details the Prebid.js activities that fall under the [Transparency and Consent Framework (TCF)](https://iabeurope.eu/iab-europe-transparency-consent-framework-policies/) scope: {: .table .table-bordered .table-striped } + | In-Scope Activity | TCF Legal Basis Required | Activity | Prebid.js Version | | --- | --- | --- | --- | | Invoke usersync pixels | Purpose 1 - Store and/or access information on a device | May prevent one or more vendor usersyncs. | 3.14+ | @@ -67,6 +68,7 @@ and (2) setConfig `consentManagement.gdpr.cmpApi` to either 'iab' or 'static' The following fields related to anonymizing aspects of the auction are supported in the [`consentManagement`](/dev-docs/modules/consentManagementTcf.html) object: {: .table .table-bordered .table-striped } + | Param | Type | Description | Example | | --- | --- | --- | --- | | gdpr.rules | `Array of Objects` | Lets the publisher override the default behavior. | | @@ -98,8 +100,7 @@ pbjs.setConfig({ The following examples cover a range of use cases and show how Prebid.js supports configuration of different business rules. -{: .alert.alert-warning :} -Prebid.org recommends working with a privacy lawyer before making enforcement exceptions for any vendor. +{% include dev-docs/vendor-exception.md %} 1. Restrict device access activity and basic ads. These are the default values (in Prebid.js 4.0) if the module is included in the build. diff --git a/dev-docs/modules/userid-submodules/utiq.md b/dev-docs/modules/userid-submodules/utiq.md index 625b530e07..7a95f72af5 100644 --- a/dev-docs/modules/userid-submodules/utiq.md +++ b/dev-docs/modules/userid-submodules/utiq.md @@ -42,8 +42,7 @@ If you use the Prebid.js [TCF Control Module](/dev-docs/modules/tcfControl.html) To do that, you can use below configuration: -{: .alert.alert-warning :} -Prebid.org recommends working with a privacy lawyer before making enforcement exceptions for any vendor. +{% include dev-docs/vendor-exception.md %} ```javascript pbjs.setConfig({ diff --git a/guide.md b/guide.md index ed618f1c79..e19f691cbb 100644 --- a/guide.md +++ b/guide.md @@ -326,6 +326,22 @@ The docs offer a set of predefined disclosures that should be used where appropr {%raw%}{% include legal-warning.html %}{%endraw%} ``` +#### Vendor exception disclosure + +{% include dev-docs/vendor-exception.md %} + +```liquid +{%raw%}{% include dev-docs/vendor-exception.md %}{%endraw%} +``` + +You can also add a `gvlId` parameter if the vendor has in fact an ID. + +{% include dev-docs/vendor-exception.md gvlId="123" %} + +```liquid +{%raw%}{% include dev-docs/vendor-exception.md gvlId="123" %}{%endraw%} +``` + ## Partners TBD From 6225f938bec931d90e2a66b71037d00d05723fb6 Mon Sep 17 00:00:00 2001 From: duancg Date: Mon, 17 Mar 2025 13:33:34 -0700 Subject: [PATCH 495/816] Update distroscale.md to include support contact email (#5928) * Update distroscale.md to include support contact email Added a section in the bidder doc to include support contact email * Update distroscale.md to fix bare URL error added angle brackets around email address --- dev-docs/bidders/distroscale.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dev-docs/bidders/distroscale.md b/dev-docs/bidders/distroscale.md index 380916a4d6..dba00b8fb3 100644 --- a/dev-docs/bidders/distroscale.md +++ b/dev-docs/bidders/distroscale.md @@ -19,6 +19,12 @@ gvl_id: 754 sidebarType: 1 --- +### Registration + +To use the DistroScale bidder you will need a pubid (Publisher ID) from an account on DistroScale. + +For further information, please contact . + ### Bid Params {: .table .table-bordered .table-striped } From ffdcfd2c0289605ca326738cd9c7aa721cb20c76 Mon Sep 17 00:00:00 2001 From: Fatih Kaya Date: Tue, 18 Mar 2025 08:21:38 +0300 Subject: [PATCH 496/816] AdMatic: documentation update for admatic and aliases (#5940) * added simple params * update * Update admatic.md * update * update * Pixad Bid Adapter: added simple params * AdMatic Adapter: Feature update Pixad alias is included in the update. * Update admatic.md * Update pixad.md * gvl_id add * Update pixad.md * admatic && pixad pbs support true * Create monetixads.md * new alias * new alias * Update adt.md * Revert "Update adt.md" This reverts commit c274c967792bb77e7c897501b70732df5acc6290. * Revert "new alias" This reverts commit cb15f2c27b28d937986d53ebaf3efeabfd5df9d3. * Create adt.md * Update adt.md * Update adt.md * Update adt.md * Update adt.md * Update adt.md * yobee * Update yobee.md * dev-doc update * Update admaticde.md --- dev-docs/bidders/admatic.md | 3 +++ dev-docs/bidders/admaticde.md | 5 ++++- dev-docs/bidders/pixad.md | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/admatic.md b/dev-docs/bidders/admatic.md index 841c14b16e..27d544f6b3 100644 --- a/dev-docs/bidders/admatic.md +++ b/dev-docs/bidders/admatic.md @@ -14,9 +14,12 @@ gpp_sids: tcfeu, tcfca, usnat, usstate_all, usp schain_supported: true dchain_supported: false userIds: all +prebid_member: true +pbs_app_supported: true safeframes_ok: true floors_supported: true multiformat_supported: will-bid-on-any +ortb_blocking_supported: partial sidebarType: 1 --- diff --git a/dev-docs/bidders/admaticde.md b/dev-docs/bidders/admaticde.md index ea409f24c9..e43064a136 100644 --- a/dev-docs/bidders/admaticde.md +++ b/dev-docs/bidders/admaticde.md @@ -14,16 +14,19 @@ gpp_sids: tcfeu, tcfca, usnat, usstate_all, usp schain_supported: true dchain_supported: false userIds: all +prebid_member: true +pbs_app_supported: true safeframes_ok: true floors_supported: true aliasCode: admatic multiformat_supported: will-bid-on-any +ortb_blocking_supported: partial sidebarType: 1 --- ### Description -AdMatic GMBH header bidding adapter connects with AdMatic GMBH demand sources to fetch bids for network ID. Please reach out to your account manager or for more information. +AdMatic GMBH header bidding adapter connects with AdMatic GMBH demand sources to fetch bids for network ID. Please reach out to your account manager or for more information. ### Bid params diff --git a/dev-docs/bidders/pixad.md b/dev-docs/bidders/pixad.md index 3ece67bd27..a0e0a32722 100644 --- a/dev-docs/bidders/pixad.md +++ b/dev-docs/bidders/pixad.md @@ -14,10 +14,13 @@ gpp_sids: tcfeu, tcfca, usnat, usstate_all, usp schain_supported: true dchain_supported: false userIds: all +prebid_member: true +pbs_app_supported: true safeframes_ok: true floors_supported: true aliasCode: admatic multiformat_supported: will-bid-on-any +ortb_blocking_supported: partial sidebarType: 1 --- From 8d58f27b59c7a68207cc71fcf5287d8606c2bf4e Mon Sep 17 00:00:00 2001 From: ss-toshihide-tajima <89903823+ss-toshihide-tajima@users.noreply.github.com> Date: Tue, 18 Mar 2025 18:09:47 +0900 Subject: [PATCH 497/816] Update adgeneration doc add first party data (#5949) * Supports im-uid * update features * Add FirstPartyData sample * Prebid Server Adapter not support * fix segment path * Update FPD sample * Add a single newline character --- dev-docs/bidders/adgeneration.md | 40 ++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/adgeneration.md b/dev-docs/bidders/adgeneration.md index 23b49e1e67..12e9914304 100644 --- a/dev-docs/bidders/adgeneration.md +++ b/dev-docs/bidders/adgeneration.md @@ -2,10 +2,13 @@ layout: bidder title: Ad Generation description: Prebid Ad Generation Bidder Adaptor +schain_supported: true pbjs: true -pbs: true +pbs: no +pbs_app_supported: no +fpd_supported: true biddercode: adgeneration -userIds: criteo, id5Id +userIds: all media_types: native sidebarType: 1 --- @@ -17,3 +20,36 @@ sidebarType: 1 | Name | Scope | Description | Example | Type | |------|----------|-------------|----------|----------| | `id` | required | adId | `'1234'` | `string` | + +#### First Party Data + +In release 1.6.4 and later, 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.content.data[] + +If `ad-generation.jp` is specified for ortb2.site.content.data[].name and `546` is specified for ortb2.site.content.data[].ext.segtax, +`ortb2.site.content.data[].segment[].name` and `ortb2.site.content.data[].segment[].value` can be any string value. + +Example first party data that's available to all bidders and all adunits: + +```javascript +pbjs.setConfig({ + ortb2: { + site: { + content: { + data: [{ + name: "ad-generation.jp", + ext: { + segtax: 546 + }, + segment: [ + { name: "news_category", value: "Sports_Sumo" },// name and value must be string types + { name: "local_gourmet", value: "sushi" }, + { name: "location", value: "tokyo" } + ] + }] + } + }, + } +}); +``` From eea66eaebaae5ad9f5c41b92a610a17e51db78d2 Mon Sep 17 00:00:00 2001 From: decemberWP <155962474+decemberWP@users.noreply.github.com> Date: Tue, 18 Mar 2025 15:33:06 +0100 Subject: [PATCH 498/816] ceeIdSystem documentation update (#5896) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: wojciech-bialy-wpm <67895844+wojciech-bialy-wpm@users.noreply.github.com> Co-authored-by: Wojciech Biały --- .../modules/userid-submodules/ceeIdSystem.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/dev-docs/modules/userid-submodules/ceeIdSystem.md b/dev-docs/modules/userid-submodules/ceeIdSystem.md index 3ab6277289..2e2194a1c7 100644 --- a/dev-docs/modules/userid-submodules/ceeIdSystem.md +++ b/dev-docs/modules/userid-submodules/ceeIdSystem.md @@ -29,12 +29,14 @@ gulp build --modules=ceeIdSystem | storage.expires | Optional | Int | Time when storage should expire it is recommended to use this options otherwise storage last only during session | `7` | | storage.refreshInSeconds | Optional | Int | Time when storage value and expiration date will get refreshed in seconds | `360` | | params | Required | Object | Container of all module params. | | -| params.tokenName | Required | String | Your custom name of token to read | `'myExampleTokenName'` | -| params.value | Optional | String | Optional param if you want to pass token value directly through setConfig | `'someTokenValue'` | +| params.publisherId | Required | String | Required param which defines your publisher ID to send in query | `'123'` | +| params.type | Required | String | Required param which defines type of encoding used on user email. Use 'email' if HEM was encoded by base64 or use 'hex' if it was encoded by hex | `'hex'` | +| params.value | Required | String | Required param where you pass HEM value | `'exampleHEMValue'` | +| params.cookieName | Optional | String | Your custom name of token to read it is only used if second way of integration is chosen. | `'myExampleCookieName'` | ## CEEID Examples -You can configure this submodule in your `userSync.userIds[]` configuration. Publishers manage ceeIds themselves can store ceeIds in local storage or 1st party cookies. You can use your custom name of token to read +You can configure this submodule in your `userSync.userIds[]` configuration. We have two implementation methods depending on the publisher's needs. The first method we suggest for publishers is to provide appropriate data that will allow you to query the endpoint to retrieve the ceeId token. To query the endpoint correctly, you will need the publisher's ID in the params.publisheId field. In addition, the HEM type, i.e. how the user's email was encoded, we consider two methods: base64 encoding and hex encoding. The value of HEM should be passed in the params.value field. ```javascript pbjs.setConfig({ @@ -48,14 +50,16 @@ pbjs.setConfig({ refreshInSeconds: 360 }, params: { - tokenName: 'name' // Your custom name of token to read + publisherId: '123', // Publisher ID + type: 'email', // use 'email' if HEM was encoded by base64 or use 'hex' if it was encoded by hex + value: 'exampleHEMValue', // HEM value } }] } }); ``` -Or pass value directly thorugh params.value. Note that tokenName is not required then. This param shouldn't be set if token value will be taken by tokenName +The second way is to use a token from a cookie or local storage previously prepared by the publisher. The only thing needed in this approach is to enter the name of the cookie/local storage that the module should use in the params.cookieName field. ```javascript pbjs.setConfig({ @@ -69,7 +73,7 @@ pbjs.setConfig({ refreshInSeconds: 360 }, params: { - value: 'tokenValue' + cookieName: 'name' // Your custom name of token to read from cookies or local storage } }] } From 4e4b95e31b773d66dc27a077bd599ec0f50c1ad4 Mon Sep 17 00:00:00 2001 From: Gabriel Chicoye Date: Wed, 19 Mar 2025 10:09:14 +0100 Subject: [PATCH 499/816] Add Prismassp Bidder docs (#5935) * prismassp added * multiformat added --------- Co-authored-by: Gabriel Chicoye --- dev-docs/bidders/1accord.md | 1 + dev-docs/bidders/easybid.md | 1 + dev-docs/bidders/nexx360.md | 27 ++++---- dev-docs/bidders/prismassp.md | 121 ++++++++++++++++++++++++++++++++++ 4 files changed, 139 insertions(+), 11 deletions(-) create mode 100644 dev-docs/bidders/prismassp.md diff --git a/dev-docs/bidders/1accord.md b/dev-docs/bidders/1accord.md index 9c99e0720a..680f299fc0 100644 --- a/dev-docs/bidders/1accord.md +++ b/dev-docs/bidders/1accord.md @@ -19,6 +19,7 @@ safeframes_ok: true deals_supported: true sidebarType: 1 fpd_supported: true +multiformat_supported: will-bid-on-any --- diff --git a/dev-docs/bidders/easybid.md b/dev-docs/bidders/easybid.md index 7f1ca702bd..478aea2043 100644 --- a/dev-docs/bidders/easybid.md +++ b/dev-docs/bidders/easybid.md @@ -18,6 +18,7 @@ safeframes_ok: true deals_supported: true sidebarType: 1 fpd_supported: true +multiformat_supported: will-bid-on-any --- diff --git a/dev-docs/bidders/nexx360.md b/dev-docs/bidders/nexx360.md index 8e4f5a5bc9..9eeca65cee 100644 --- a/dev-docs/bidders/nexx360.md +++ b/dev-docs/bidders/nexx360.md @@ -4,16 +4,21 @@ title: Nexx360 description: Prebid Nexx360 Bidder Adapter pbjs: true biddercode: nexx360 +gvl_id: 965 tcfeu_supported: true usp_supported: true +gpp_supported: true schain_supported: true +dchain_supported: false floors_supported: true userIds: all -tcf2_supported: true +tcfeu_supported: true media_types: banner, video, native -gvl_id: 965 -pbs: false +safeframes_ok: true +deals_supported: true sidebarType: 1 +fpd_supported: true +multiformat_supported: will-bid-on-any --- @@ -22,9 +27,9 @@ sidebarType: 1 {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |---------------|----------|----------------------------|-------------------------------------- |-----------| -| `tagId` | required | Nexx360 tag ID | `"luvxjvgn"` | `string` | -| `videoTagId` | optional | Nexx360 Video tag ID | `"luvxjvgn"` | `string` | -| `nativeTagId` | optional | Nexx360 Native tag ID | `"luvxjvgn"` | `string` | +| `tagId` | required | Nexx360 tag ID | `"testnexx"` | `string` | +| `videoTagId` | optional | Nexx360 Video tag ID | `"testnexx"` | `string` | +| `nativeTagId` | optional | Nexx360 Native tag ID | `"testnexx"` | `string` | | `allBids` | optional | Return all bids | `true` | `boolean` | | `divId` | optional | divId linked to adUnit | `"div-1"` | `string` | | `adUnitName` | optional | A code to identify adUnit | `"header-ad"` | `string` | @@ -63,7 +68,7 @@ var adUnits = [ bids: [{ bidder: 'nexx360', params: { - tagId: 'luvxjvgn' + tagId: 'testnexx' } }] }, @@ -79,7 +84,7 @@ var adUnits = [ bids: [{ bidder: 'nexx360', params: { - tagId: 'luvxjvgn' + tagId: 'testnexx' } }] }, @@ -102,7 +107,7 @@ var adUnits = [ bids: [{ bidder: 'nexx360', params: { - tagId: 'luvxjvgn' + tagId: 'testnexx' } }] }, @@ -124,8 +129,8 @@ var adUnits = [ bids: [{ bidder: 'nexx360', params: { - tagId: 'luvxjvgn', - videoTagId: 'luvxjvgn' + tagId: 'testnexx', + videoTagId: 'testnexx' } }] }; diff --git a/dev-docs/bidders/prismassp.md b/dev-docs/bidders/prismassp.md new file mode 100644 index 0000000000..d257868412 --- /dev/null +++ b/dev-docs/bidders/prismassp.md @@ -0,0 +1,121 @@ +--- +layout: bidder +title: Prismassp +description: Prebid Prismassp Bidder Adapter +pbjs: true +biddercode: prismassp +gvl_id: 965 +tcfeu_supported: true +usp_supported: true +gpp_supported: true +schain_supported: true +dchain_supported: false +floors_supported: true +userIds: all +tcfeu_supported: true +media_types: banner, video, native +safeframes_ok: true +deals_supported: true +sidebarType: 1 +fpd_supported: true +multiformat_supported: will-bid-on-any + +--- + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|----------------------------|-------------------------------------- |-----------| +| `tagId` | required | tag ID | `"testpris"` | `string` | + +### First Party Data + +Publishers should use the `ortb2` method of setting [First Party Data](/features/firstPartyData.html). +The following fields are supported: + +* ortb2.site.ext.data.* +* ortb2.site.content.data[] +* ortb2.user.ext.data.* +* ortb2.user.data[] + +### Test Parameters + +```javascript +var adUnits = [ + // Banner adUnit + { + code: 'banner-div', + mediaTypes: { + banner: { + sizes: [[300, 250], [300,600]] + } + }, + bids: [{ + bidder: 'prismassp', + params: { + tagId: 'testpris' + } + }] + }, + // Video adUnit + { + code: 'video1', + mediaTypes: { + video: { + playerSize: [640, 480], + context: 'instream' + } + }, + bids: [{ + bidder: 'prismassp', + params: { + tagId: 'testpris' + } + }] + }, + // Native adUnit + { + code: 'native1', + mediaTypes: + native: { + title: { + required: true + }, + image: { + required: true + }, + sponsoredBy: { + required: true + } + } + }, + bids: [{ + bidder: 'prismassp', + params: { + tagId: 'testpris' + } + }] + }, + // Multiformat Ad + { + code: 'multi1', + mediaTypes: { + video: { + playerSize: [640, 480], + context: 'instream' + }, + banner: { + sizes: [[300, 250], [300,600]] + } + }, + bids: [{ + bidder: 'prismassp', + params: { + tagId: 'testpris', + videoTagId: 'testpris' + } + }] + }; +]; +``` From 07603a6792f6cbfce871535dbf64cde0ad612dbc Mon Sep 17 00:00:00 2001 From: Jason Quaccia Date: Wed, 19 Mar 2025 13:16:26 -0700 Subject: [PATCH 500/816] Added docs for the prev auction info module (#5881) Merging as feedback is resolved with new commits. --- dev-docs/modules/previousAuctionInfo.md | 95 +++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 dev-docs/modules/previousAuctionInfo.md diff --git a/dev-docs/modules/previousAuctionInfo.md b/dev-docs/modules/previousAuctionInfo.md new file mode 100644 index 0000000000..37214e89e5 --- /dev/null +++ b/dev-docs/modules/previousAuctionInfo.md @@ -0,0 +1,95 @@ +--- +layout: page_v2 +page_type: module +title: Module - Previous Auction Info +description: Allows publishers and bidders to collect and inject past auction data into future bid requests +module_code : previousAuctionInfo +display_name : Previous Auction Info +enable_download : true +sidebarType : 1 + +--- + +# Previous Auction Info + +## Overview + +The Previous Auction Info module enables functionality to collect prior auction data for participating bidders and publishers (This feature is `opt-in`, by default it is disabled). + +## How to Enable the Module + +A Publisher must do the following in order for the module to work: + +* Include the Previous Auction Info module within your Prebid.js build: [https://docs.prebid.org/download.html](https://docs.prebid.org/download.html) + +* Configure Prebid.js to enable the Previous Auction Info module: + +```javascript +pbjs.setConfig({previousAuctionInfo: { enabled: true, bidders: ['bidderCode1', 'bidderCode2'], maxQueueLength: 10 }}) +``` + +* Only valid bid requests submitted by bidders who have enabled the Previous Auction Info module will be permitted. + +If the requirements above are met, the flow for how the module works is as follows: + +1. A Prebid.js auction runs and completes. +1. At the end of an auction, details about the auction are collected from each bidder using the module. +1. If a Prebid bid wins, then the `rendered` field is updated to `1` to indicate this in the collected auction data for all bidders who bid on the same adunit within the same Prebid auction. +1. During the next Prebid.js auction, if a bidder is included in previousAuctionInfo.bidders AND is included in the auction, then previous auction info data will be injected into the bidder's bid request of the new auction within the following path: `ortb2.ext.prebid.previousauctioninfo`. + +## Configuration Options + +{: .table .table-bordered .table-striped } +| Field | Required? | Type | Description | +|---|---|---|---| +| previousAuctionInfo.enabled | yes | boolean | Enables/disables the module. | +| previousAuctionInfo.bidders | no | array of strings | Array of bidder codes to determine which bidders are allowed to receive collected previous auction info. Omitting this field will enable all bidders. | +| previousAuctionInfo.maxQueueLength | no | integer | The number of previous auction info payloads to store/collect per bidder before injecting these payloads into the bidstream. Any payloads collected for a bidder during one auction will be injected into the bidstream during the next auction that the same bidder participates in with valid bids. If this field is omitted, the value of this field is 10. | + +## Example of Previous Auction Info Payload + +`previousAuctionInfo` is an array of prior auction data catered to a specific bidder (if present, it will be added to a bidder's bid request). See below for an example of how the structure of the data looks (Note: Once collected previous auction data has been injected into the bid stream, then it is removed and no longer stored within the module): + +```javascript +ortb2: { + ext: { + prebid: { + previousauctioninfo: [ + { + bidderRequestId: "123abc", + bidId: "456def", + rendered: 1, // default is 0 + source: "pbjs", + adUnitCode: "div-gpt-ad-123-0", + highestBidCpm: 0.052275935, // default is null + bidderCpm: 0.04, // default is null + bidderOriginalCpm: 0.04, // default is null + bidderCurrency: "USD", // default is null + bidderOriginalCurrency: "USD", // default is null + bidderErrorCode: -1, // default is null + timestamp: 1739400860310 + } + ] + } + } +} +``` + +## Description of Previous Auction Info Payload + +{: .table .table-bordered .table-striped } +| Field | Type | Description | Default | +|---|---|---|---| +| ortb2.ext.prebid.previousauctioninfo | array | | | +| ortb2.ext.prebid.previousauctioninfo[].bidderRequestId | string | ID of a previous bidder request | | +| ortb2.ext.prebid.previousauctioninfo[].bidId | string | ID of a previous bid request | | +| ortb2.ext.prebid.previousauctioninfo[].rendered | integer | Signifies if the relevant adunit bid on was rendered or not | 0 | +| ortb2.ext.prebid.previousauctioninfo[].source | string | Where the previous auction info was collected | | +| ortb2.ext.prebid.previousauctioninfo[].adUnitCode | string | Ad unit code of the ad slot that was bid on | | +| ortb2.ext.prebid.previousauctioninfo[].highestBidCpm | float | The highest Prebid bid cpm observed for the relative ad slot of a previous auction | null | +| ortb2.ext.prebid.previousauctioninfo[].bidderCpm | float | The bid cpm submitted by the bidder receiving the previous auction info payload | null | +| ortb2.ext.prebid.previousauctioninfo[].bidderOriginalCpm | float | The original bid cpm submitted by the bidder receiving the previous auction info payload | null | +| ortb2.ext.prebid.previousauctioninfo[].bidderCurrency | string | The bidder currency submitted by the bidder receiving the previous auction info payload | null | +| ortb2.ext.prebid.previousauctioninfo[].bidderOriginalCurrency | string | The original bidder currency submitted by the bidder receiving the previous auction info payload | null | +| ortb2.ext.prebid.previousauctioninfo[].bidderErrorCode | integer | Whether an error was present or not | null | +| ortb2.ext.prebid.previousauctioninfo[].timestamp | integer | Time that the previous auction info payload was collected | | From 65e08081604d0d1faa879fcfb93e3f90ab453265 Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Thu, 20 Mar 2025 02:57:41 -0700 Subject: [PATCH 501/816] JS: userID developer documentation (#5897) * First draft of userId dev docs * tweaked TOC and heading levels * adding user ID page to nav bar * table formatting --------- Co-authored-by: bretg --- _data/sidebar.yml | 8 ++ dev-docs/userId-module.md | 221 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 229 insertions(+) create mode 100644 dev-docs/userId-module.md diff --git a/_data/sidebar.yml b/_data/sidebar.yml index 5031ca0148..a193c37130 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -450,6 +450,14 @@ sectionTitle: subgroup: 4 +- sbSecId: 1 + title: How to Add A User ID submodule + link: /dev-docs/userId-module.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 4 + - sbSecId: 1 title: How to Add a Prebid.js Video submodule link: /dev-docs/add-video-submodule.html diff --git a/dev-docs/userId-module.md b/dev-docs/userId-module.md new file mode 100644 index 0000000000..2e766d6137 --- /dev/null +++ b/dev-docs/userId-module.md @@ -0,0 +1,221 @@ +--- +layout: page_v2 +title: How to Add a New Prebid.js User ID Module +description: Documentation on how to add a Prebid.js new user ID module +top_nav_section: dev_docs +nav_section: adapters +sidebarType: 1 +--- + +# How to Add a New Prebid.js User ID Module +{: .no_toc } + +* TOC +{:toc} + +## Overview + +A user ID module is responsible for providing user ID data to Prebid.js. The flow is as follows: + +1. The publisher includes and configures your module as described in [Module - User ID](/dev-docs/modules/userId.html); +2. Prebid.js determines whether your ID should be included, depending on [consent management](/support/privacy-resources.html) or other [activity controls](/dev-docs/activity-controls.html); +3. If it is, it invokes your module's `getId` and `decode` methods to obtain an ID, and uses your `eids` configuration to transform it into an ORTB [EID](https://github.com/InteractiveAdvertisingBureau/openrtb2.x/blob/main/2.6.md#objecteid) object; +4. Prebid.js then stores your ID (optionally and depending on the publisher's [storage configuration](/dev-docs/modules/userId.html#basic-configuration)) and injects it into the bid stream; +5. On subsequent sessions, Prebid.js retrieves your ID from storage (if applicable) and repeats this flow using `extendId` instead of `getId`. + +## Module interface + +A user ID module is a javascript file in the [modules](https://github.com/prebid/Prebid.js/tree/master/modules) folder that: + +* has a file name that ends with 'IdSystem.js'; +* is listed as a userID submodule in [.submodules.json](https://github.com/prebid/Prebid.js/blob/master/modules/.submodules.json); +* registers a module object using `submodule('userId', userIdSpec)`. + +`userIdSpec` has the following properties: + +{: .table .table-bordered .table-striped } +| Property | Scope | Type | Description | +|------------|------------------------------------|--------|---------------------------------------------------------------------------------------------------------------| +| `name` | Required | String | Name of your ID provider, used to match your module with the publisher's [userIds configuration](/dev-docs/modules/userId.html#basic-configuration) | +| `gvlid` | Optional | Number | GVL ID to use for TCF. If omitted your module may be be excluded when TCF is in scope. | +| `getId` | Required | Function | Retrieve serializable ID data, see [`getId`](#getId) | +| `extendId` | Optional | Function | Update previously stored ID data, see [`extendId`](#extendId) | +| `decode` | Required | Function | Decode result from `getId` or `extendId`, see [`decode`](#decode) | +| `eids` | Optional, but strongly recommended | Object | One or more [EID configurations](#eidConfig) used to translate the result from `decode` into ORTB EID Objects | + +See [SharedIdSystem](https://github.com/prebid/Prebid.js/blob/master/modules/sharedIdSystem.js) for an example. + + + +### `getId(config, consentData, storedId)` + +Invoked when: + +* Prebid.js did not previously store your ID, or +* your previously stored ID has expired (depending on the publisher's `expires` and/or `refreshInSeconds`[storage configuration](/dev-docs/modules/userId.html#basic-configuration)), or +* consent data has changed since the last time it was stored, or +* the publisher explicitly asked for a refresh using [`refreshUserIds`](/dev-docs/publisher-api-reference/refreshUserIds.html). + +#### Arguments + +{: .table .table-bordered .table-striped } + | Name | Type | Description | + |---------------------|--------|-------------------------------------------------------------------------------------------------------------------------------| + | `config` | Object | Configuration for your module as provided by the publisher | + | `consentData` | Object | | + | `consentData.gdpr` | Object | TCF consent data when [consentManagementTcf](/dev-docs/modules/consentManagementTcf.html) is included, or null otherwise | + | `consentData.gpp` | Object | GPP consent data when [consentManagementGpp](/dev-docs/modules/consentManagementGpp.html) is included, or null otherwise | + | `consentData.usp` | String | US Privacy string when [consentManagementUsp](/dev-docs/modules/consentManagementUsp.html) is included, or null otherwise | + | `consentData.coppa` | Boolean | COPPA flag as set by [publisher configuration](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html#coppa) | + | `storedId` | String or Object | Your previously stored ID data, if any, as was returned by `getId` or `extendId` | + +#### Return value + +`getId` should return an object containing one or both of: + +{: .table .table-bordered .table-striped } +| Property | Type | Description | +|-------------|------|-----------------------------------------------------------------------------------| +| `id` | String or Object | Serializable ID data. Objects will be passed through `JSON.stringify` | +| `callback` | Function | Invoked at a later point with another callback function `setId` as first argument | + +If your module can provide ID data synchronously it should set `id` directly; +otherwise it should provide a `callback` that calls its first argument `setId` passing it ID data. + +In both cases ID data should be a string or a plain, serializable JS object; this data is what may then get stored, passed to [`decode`](#decode) and, on later sessions, to `getId` or `extendId` as the `storedId` argument. + +#### Example: synchronous ID generation + +```javascript +function getId(config, consentData, storedId) { + return {id: storedId || generateUUID()} +} +``` + +#### Example: aynschronous ID retrieval + +```javascript +function getId(config, consentData, storedId) { + return { + callback: function(setId) { + fetch(ENDPOINT_URL, { + body: JSON.stringify({ + params: config.params, + consentData + }) + }).then(async function(response) { + if (reponse.ok) { + setId((await response.json()).id); + } + }); + } + } +} +``` + + + +### `extendId(config, consentData, storedId)` + +If provided, it's invoked when `getId` is not; namely: + +* Prebid.js previously stored your ID, and +* the stored ID has not expired, and +* consent data has not changed since it was stored, and +* the publisher is not asking for a refresh. + +Takes the same arguments and should return an object in the same format as [getId](#getId). + + + +### `decode(data, config)` + +Decode ID data. Invoked every time data from your module is available, either from storage or `getId` / `extendId`. + +Arguments are: + +{: .table .table-bordered .table-striped } +| Name | Type | Description | +|----------|--------------------|------------------------------------------------| +| `data` | String or Object | ID data as provided by `getId` / `extendId` | +| `config` | Object | Configuration for your module as provided by the publisher | + +Should return an object with at least one entry where the key is an identifier for your ID provider and the value is the ID (which can have any type or structure). + +The return value is what's made available to publishers through [`getUserIds()`](/dev-docs/publisher-api-reference/getUserIds.html) and to bid adapters in `bidRequest.userId`; it's also used to generate EIDs using your [EID configuration](#eidConfig). + +For example: + +```javascript +function decode(data, config) { + return {exampleId: data}; +} +``` + +would populate `bidRequest.userId.exampleId` and `pbjs.getUserIds().exampleId` with the ID as provided by `getId`; and would be used to generate EIDs your module's `eids.exampleId` configuration. + + + +### EID configuration + +For each `key` and `idValue` entry in the object returned by `decode`, Prebid.js will: + +* Normalize `idValue` into an array `idValues`, which is either the same as `idValue` if that's already an array, or an array containing a single member `idValue`; +* look for a matching `key` in `eids` and, if present, use the corresponding value `eidConfig` to translate `idValues` into EID Objects; + +`eidConfig` can be either a function or an object. + +#### EID translation functions + +If a function, `eidConfig` is invoked with: + +{: .table .table-bordered .table-striped } +| Name | Type | Description | +|------------|------|--------------------------------------------------------------------| +| `idValues` | Array | ID values from `decode`, normalized to an array as described above | +| `config` | Object | Configuration for your module as provided by the publisher | + +It should return an object or array of objects in the [ORTB EID](https://github.com/InteractiveAdvertisingBureau/openrtb2.x/blob/main/2.6.md#objecteid) format. + +Example: + +```javascript +exampleIdSpec.eids = { + exampleId: function(idValues, config) { + return { + source: 'exampleId.com', + uid: idValues.map(value => ({ + id: value, + atype: 1 + })) + }; + } +} +``` + +#### EID configuration objects + +If an object, `eidConfig` should contain: + +{: .table .table-bordered .table-striped } +| Property | Scope | Type | Description | +|-------------|-----------------------------------------|----------|--------------------------------------------------------------------------------------------------------------------------| +| `source` | Required if `getSource` is not provided | String | Value for `eid.source` | +| `getSource` | Required if `source` is not provided | Function | Returns a string to use for `eid.source` | +| `getEidExt` | Optional | Function | Returns an object to use for `eid.ext` | +| `getValue` | Optional | Function | Returns a string to use for `eid.uid.id`. If not provided, members of `idValues` must be strings, and will be used as-is | +| `atype` | Optional, but recommended | Number | Value for `eid.uid.atype` | +| `getUidExt` | Optional | Function | Returns an object to use for `eids.uid.ext` | + +All functions are invoked once for - and passed as an argument - each element in `idValues`. + +Example: + +```javascript +exampleIdSpec.eids = { + exampleId: { + source: 'exampleId.com', + atype: 1 + } +} +``` From 266e2b29430ede9a2802f49659b36a750631d9ba Mon Sep 17 00:00:00 2001 From: Olena Stepaniuk <92721590+OlenaPostindustria@users.noreply.github.com> Date: Thu, 20 Mar 2025 12:09:33 +0200 Subject: [PATCH 502/816] Mobile: Support GMA SDK v12 in iOS (#5903) * docs: add gma-versions-tabs template * fix: linting issues * docs: update template * docs: add code highlight * docs: update gam-bidding-only-html-banner * docs: update gam-bidding-only-html-banner * docs: update gam-bidding-only-html-banner * docs: update template * docs: update template * docs: update gam-bidding-only-html-banner * docs: update gam-bidding-only-html-banner * docs: update template * docs: update gam-bidding-only-html-banner.md * docs: update gam-bidding-only-html-banner * docs: update template * docs: update template * docs: update gam-bidding-only-interstitial-banner * docs: fix linting issue * docs: update the rest of original api examples * docs: fix linting errors * docs: small improvements * docs: updates in files where GAM is present * docs: fix linting issues * docs: minor corrections --- _includes/code/gma-versions-tabs.html | 61 +++++ .../rendering/ios-sdk-integration-admob.md | 231 ++++++++++++++---- .../rendering/ios-sdk-integration-gam.md | 34 +-- .../pbm-api/ios/code-integration-ios.md | 26 +- .../pbm-api/ios/pbm-targeting-ios.md | 2 +- prebid-mobile/pbm-api/ios/pbm-util-ios.md | 20 +- .../ios/gam-bidding-only-html-banner.md | 82 +++++-- .../gam-bidding-only-interstitial-banner.md | 45 +++- .../gam-bidding-only-interstitial-video.md | 79 ++++-- ...m-bidding-only-multiformat-interstitial.md | 57 ++++- .../ios/gam-bidding-only-multiformat.md | 91 ++++++- .../ios/gam-bidding-only-native-in-app.md | 110 +++++++-- .../ios/gam-bidding-only-native-in-webview.md | 46 +++- .../ios/gam-bidding-only-rewarded-video.md | 47 +++- .../ios/gam-bidding-only-video-outstream.md | 55 ++++- 15 files changed, 804 insertions(+), 182 deletions(-) create mode 100644 _includes/code/gma-versions-tabs.html diff --git a/_includes/code/gma-versions-tabs.html b/_includes/code/gma-versions-tabs.html new file mode 100644 index 0000000000..aa7aa312c0 --- /dev/null +++ b/_includes/code/gma-versions-tabs.html @@ -0,0 +1,61 @@ + + +
    + +
    +
    +
    {{ include.gma12 | xml_escape }}
    +
    +
    + +
    +
    +
    {{ include.gma11 | xml_escape }}
    +
    +
    +
    diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md b/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md index 60beae54c1..cc899357b9 100644 --- a/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md +++ b/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md @@ -5,6 +5,8 @@ description: Integrating Prebid SDK iOS with AdMob sidebarType: 2 --- + + # Prebid SDK iOS with AdMob Integration Method {:.no_toc} @@ -36,25 +38,53 @@ AdMobUtils.initializeGAD() ### Banners -Integration example: +**Integration example(Swift)**: -```swift -// 1. Create GADRequest and GADBannerView +{% capture gma12 %}// 1. Create a GADRequest +let gadRequest = Request() + +// 2. Create a BannerView +gadBanner = GoogleMobileAds.BannerView(adSize: adSizeFor(cgSize: AD_SIZE)) +gadBanner.adUnitID = AD_UNIT_ID +gadBanner.delegate = self +gadBanner.rootViewController = self + +// Add GMA SDK banner view to the app UI +bannerView.addSubview(gadBanner) + +// 3. Create an AdMobMediationBannerUtils +mediationDelegate = AdMobMediationBannerUtils(gadRequest: gadRequest, bannerView: gadBanner) + +// 4. Create a MediationBannerAdUnit +prebidAdMobMediaitonAdUnit = MediationBannerAdUnit( + configID: CONFIG_ID, + size: AD_SIZE, + mediationDelegate: mediationDelegate +) + +// 5. Make a bid request to Prebid Server +prebidAdMobMediaitonAdUnit.fetchDemand { [weak self] result in + PrebidDemoLogger.shared.info("Prebid demand fetch for AdMob \(result.name())") + + // 6. Load ad + self?.gadBanner.load(gadRequest) +} +{% endcapture %} +{% capture gma11 %}// 1. Create GADRequest and GADBannerView gadRequest = GADRequest() -gadBanner = GADBannerView(adSize: size) +gadBanner = GADBannerView(adSize: AD_SIZE) gadBanner.delegate = self gadBanner.rootViewController = self -gadBanner.adUnitID = adUnitId +gadBanner.adUnitID = AD_UNIT_ID // 2. Create an AdMobMediationBannerUtils -mediationDelegate = AdMobMediationBannerUtils(gadRequest: gadRequest, - bannerView: gadBanner) +mediationDelegate = AdMobMediationBannerUtils(gadRequest: gadRequest, bannerView: gadBanner) // 3. Create the MediationBannerAdUnit -prebidAdMobMediaitonAdUnit = MediationBannerAdUnit(configID: configID, - size: CGSize(width: 320, height: 50), +prebidAdMobMediaitonAdUnit = MediationBannerAdUnit(configID: CONFIG_ID, + size: AD_SIZE, mediationDelegate: mediationDelegate) // 4. Make a bid request @@ -63,9 +93,11 @@ prebidAdMobMediaitonAdUnit.fetchDemand { [weak self] result in // 5. Make an ad request to AdMob self?.gadBanner.load(self?.gadRequest) } -``` +{% endcapture %} + +{% include code/gma-versions-tabs.html id="admob-banner" gma11=gma11 gma12=gma12 %} -#### Step 1: Create GADRequest and GADBannerView +#### Step 1: Create Request and BannerView {:.no_toc} This step is the same as for the original [AdMob integration](https://developers.google.com/admob/ios/banner). You don't have to make any modifications here. @@ -92,24 +124,58 @@ Make a regular AdMob's ad request. Everything else will be handled by Prebid ada ### Interstitials -Integration example: +**Integration example(Swift)**: -```swift +{% capture gma12 %}// 1. Create a Request +let gadRequest = Request() + +// 2. Create an AdMobMediationInterstitialUtils +let mediationDelegate = AdMobMediationInterstitialUtils(gadRequest: gadRequest) + +// 3. Create a MediationInterstitialAdUnit +admobAdUnit = MediationInterstitialAdUnit( + configId: CONFIG_ID, + mediationDelegate: mediationDelegate +) + +// 4. Make a bid request to Prebid Server +admobAdUnit?.fetchDemand(completion: { [weak self] result in + PrebidDemoLogger.shared.info("Prebid demand fetch for AdMob \(result.name())") + + // 5. Load the interstitial ad + InterstitialAd.load( + with: AD_UNIT_ID, + request: gadRequest + ) { [weak self] ad, error in + guard let self = self else { return } + + if let error = error { + PrebidDemoLogger.shared.error("\(error.localizedDescription)") + return + } + + // 6. Present the interstitial ad + self.interstitial = ad + self.interstitial?.fullScreenContentDelegate = self + self.interstitial?.present(from: self) + } +}) +{% endcapture %} +{% capture gma11 %} // 1. Create GADRequest gadRequest = GADRequest() // 2. Create AdMobMediationInterstitialUtils -mediationDelegate = AdMobMediationInterstitialUtils(gadRequest: self.gadRequest) +let mediationDelegate = AdMobMediationInterstitialUtils(gadRequest: self.gadRequest) // 3. Create MediationInterstitialAdUnit -admobAdUnit = MediationInterstitialAdUnit(configId: configID, - mediationDelegate: mediationDelegate!) +admobAdUnit = MediationInterstitialAdUnit(configId: CONFIG_ID, mediationDelegate: mediationDelegate) // 4. Make a bid request admobAdUnit?.fetchDemand(completion: { [weak self]result in // 5. Make an ad request to AdMob -GADInterstitialAd.load(withAdUnitID: adUnitID, request: self?.gadRequest) { [weak self] ad, error in +GADInterstitialAd.load(withAdUnitID: AD_UNIT_ID, request: self?.gadRequest) { [weak self] ad, error in guard let self = self else { return } if let error = error { PBMLog.error(error.localizedDescription) @@ -122,7 +188,9 @@ GADInterstitialAd.load(withAdUnitID: adUnitID, request: self?.gadRequest) { [wea self.interstitial?.present(fromRootViewController: self) } }) -``` +{% endcapture %} + +{% include code/gma-versions-tabs.html id="admob-banner" gma11=gma11 gma12=gma12 %} The **default** ad format for interstitial is **.banner**. In order to make a `multiformat bid request`, set the respective values into the `adFormats` property. @@ -135,10 +203,9 @@ adUnit?.adFormats = [.video, .banner] // Make bid request for banner ad (default behaviour) adUnit?.adFormats = [.banner] - ``` -#### Step 1: Create GADRequest +#### Step 1: Create Request {:.no_toc} This step is the same as for the original [AdMob integration](https://developers.google.com/admob/ios/interstitial#swift). You don't have to make any modifications here. @@ -170,24 +237,63 @@ Once you receive the ad it will be ready for display. Follow the [AdMob instruct ### Rewarded Video -Integration example: +**Integration example(Swift)**: -```swift -// 1. Create GADRequest +{% capture gma12 %}// 1. Create a Request +let request = Request() + +// 2. Create an AdMobMediationRewardedUtils +mediationDelegate = AdMobMediationRewardedUtils(gadRequest: request) + +// 3. Create a MediationRewardedAdUnit +admobRewardedAdUnit = MediationRewardedAdUnit( + configId: CONFIG_ID, + mediationDelegate: mediationDelegate +) + +// 4. Make a bid request to Prebid Server +admobRewardedAdUnit.fetchDemand { [weak self] result in + guard let self = self else { return } + PrebidDemoLogger.shared.info("Prebid demand fetch for AdMob \(result.name())") + + // 5. Load the rewarded ad + RewardedAd.load(with: AD_UNIT_ID, request: request) { [weak self] ad, error in + guard let self = self else { return } + + if let error = error { + Log.error(error.localizedDescription) + return + } + + // 6. Present the rewarded ad + self.gadRewardedAd = ad + self.gadRewardedAd?.fullScreenContentDelegate = self + DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(3)) { + self.gadRewardedAd?.present( + from: self, + userDidEarnRewardHandler: { + print("User did earn reward.") + } + ) + } + } +} +{% endcapture %} +{% capture gma11 %}// 1. Create GADRequest let request = GADRequest() // 2. Create AdMobMediationInterstitialUtils let mediationDelegate = AdMobMediationRewardedUtils(gadRequest: request) // 3. Create MediationInterstitialAdUnit -admobRewardedAdUnit = MediationRewardedAdUnit(configId: "12f58bc2-b664-4672-8d19-638bcc96fd5c", mediationDelegate: mediationDelegate) +admobRewardedAdUnit = MediationRewardedAdUnit(configId: CONFIG_ID, mediationDelegate: mediationDelegate) // 4. Make a bid request admobRewardedAdUnit.fetchDemand { [weak self] result in guard let self = self else { return } // 5. Make an ad request to AdMob -GADRewardedAd.load(withAdUnitID: self.admobPrebidAdUnitId, request: request) { [weak self] ad, error in +GADRewardedAd.load(withAdUnitID: AD_UNIT_ID, request: request) { [weak self] ad, error in guard let self = self else { return } if let error = error { PBMLog.error(error.localizedDescription) @@ -204,13 +310,15 @@ GADRewardedAd.load(withAdUnitID: self.admobPrebidAdUnitId, request: request) { [ } } } -``` +{% endcapture %} + +{% include code/gma-versions-tabs.html id="admob-rewarded" gma11=gma11 gma12=gma12 %} The process of displaying the rewarded ad is the same as for displaying an Interstitial Ad. To be notified when a user earns a reward follow the [AdMob intructions](https://developers.google.com/admob/ios/rewarded#show_the_ad). -#### Step 1: Create GADRequest +#### Step 1: Create Request {:.no_toc} This step is the same as for the original [AdMob integration](https://developers.google.com/admob/ios/rewarded). You don't have to make any modifications here. @@ -247,10 +355,46 @@ Once the rewarded ad is received you can display it. Follow the [AdMob instructi In order to integrate AdMob adapters just add the adapters' source files to your app project. -Integration example: +**Integration example(Swift)**: -```swift -// 1. Create GAD Request +{% capture gma12 %}// 1. Create a Request +let gadRequest = Request() + +// 2. Create an AdMobMediationNativeUtils +mediationDelegate = AdMobMediationNativeUtils(gadRequest: gadRequest) + +// 3. Create a MediationNativeAdUnit +admobMediationNativeAdUnit = MediationNativeAdUnit( + configId: CONFIG_ID, + mediationDelegate: mediationDelegate +) + +// 4. Configure MediationNativeAdUnit +admobMediationNativeAdUnit.addNativeAssets(nativeRequestAssets) +admobMediationNativeAdUnit.setContextType(.Social) +admobMediationNativeAdUnit.setPlacementType(.FeedContent) +admobMediationNativeAdUnit.setContextSubType(.Social) +admobMediationNativeAdUnit.addEventTracker(eventTrackers) + +// 5. Make a bid request to Prebid Server +admobMediationNativeAdUnit.fetchDemand { [weak self] result in + guard let self = self else { return } + PrebidDemoLogger.shared.info("Prebid demand fetch for AdMob \(result.name())") + + // 6. Load the native ad + self.adLoader = AdLoader( + adUnitID: AD_UNIT_ID, + rootViewController: self, + adTypes: [ .native ], + options: nil + ) + + self.adLoader?.delegate = self + + self.adLoader?.load(gadRequest) +} +{% endcapture %} +{% capture gma11 %}// 1. Create GAD Request gadRequest = GADRequest() // 2. Create AdMobMediationNativeUtils @@ -272,24 +416,26 @@ nativeAdUnit.addEventTracker(eventTrackers) // 6. Make a bid request nativeAdUnit.fetchDemand { [weak self] result in -guard let self = self else { return } + guard let self = self else { return } -// 7. Load AdMob Native ad -self.adLoader = GADAdLoader(adUnitID: self.adMobAdUnitId!, - rootViewController: self.rootController, - adTypes: [ .native ], - options: nil) + // 7. Load AdMob Native ad + self.adLoader = GADAdLoader(adUnitID: AD_UNIT_ID, + rootViewController: self.rootController, + adTypes: [ .native ], + options: nil) -self.adLoader?.delegate = self + self.adLoader?.delegate = self -self.adLoader?.load(self.gadRequest) + self.adLoader?.load(self.gadRequest) } -``` +{% endcapture %} + +{% include code/gma-versions-tabs.html id="admob-native" gma11=gma11 gma12=gma12 %} -#### Step 1: Create GAD Request +#### Step 1: Create a Request {:.no_toc} -Prepare the `GADRequest` object before you make a bid request. It will be needed for the Prebid mediation utils. +Prepare the `Request` object before you make a bid request. It will be needed for the Prebid mediation utils. #### Step 2: Create AdMobMediationNativeUtils {:.no_toc} @@ -335,8 +481,7 @@ The example of creating the event trackers array: ```swift let eventTrackers = [ - NativeEventTracker(event: EventType.Impression, - methods: [EventTracking.Image,EventTracking.js]) + NativeEventTracker(event: EventType.Impression, methods: [EventTracking.Image,EventTracking.js]) ] ``` diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md b/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md index 6610406e66..d6198673c1 100644 --- a/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md +++ b/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md @@ -5,6 +5,8 @@ description: Integration of Prebid Rendering module whith Google Ad Manager sidebarType: 2 --- + + # Prebid SDK iOS with the GAM Prebid-Rendered Integration Method {:.no_toc} @@ -109,9 +111,9 @@ GAM setup: Integration: -1. Replace the `GAMBannerView` with `BannerView` in the UI. +1. Replace the `AdManagerBannerView` with `BannerView` in the UI. 2. Implement the protocol `BannerViewDelegate` in the ViewController. -3. Remove usage of `GAMBannerView`, `GAMRequest`, and implementation of the `GADBannerViewDelegate`. +3. Remove usage of `AdManagerBannerView`, `AdManagerRequest`, and implementation of the `GoogleMobileAds.BannerViewDelegate`. 4. Remove original `BannerAdUnit`. 5. Follow the instructions to integrate [Banner API](#banners). @@ -124,9 +126,9 @@ Integration example: let eventHandler = GAMInterstitialEventHandler(adUnitID: GAM_AD_UNIT_ID) // 2. Create Interstitial Ad Unit -interstitial = InterstitialRenderingAdUnit (configID: CONFIG_ID, - minSizePercentage: CGSize(width: 30, height: 30), - eventHandler: eventHandler) +interstitial = InterstitialRenderingAdUnit(configID: CONFIG_ID, + minSizePercentage: MIN_SIZE_PERC, + eventHandler: eventHandler) interstitial.delegate = self @@ -200,9 +202,9 @@ GAM setup: Integration: -1. Replace the `GAMInterstitialAd` with `InterstitialRenderingAdUnit` in the View Controller. +1. Replace the `AdManagerInterstitialAd` with `InterstitialRenderingAdUnit` in the View Controller. 2. Implement the protocol `InterstitialAdUnitDelegate` in the View Controller. -3. Remove usage of `GAMInterstitialAd`, `GAMRequest`. +3. Remove usage of `AdManagerInterstitialAd`, `AdManagerRequest`. 4. Remove original `InterstitialAdUnit`. 5. Follow the instructions to integrate [Interstitial API](#interstitials). @@ -215,8 +217,7 @@ Integration example: let eventHandler = GAMRewardedEventHandler(adUnitID: GAM_AD_UNIT_ID) // 2. Create an Ad Unit -rewardedAd = RewardedAdUnit(configID: CONFIG_ID, - eventHandler: eventHandler) +rewardedAd = RewardedAdUnit(configID: CONFIG_ID, eventHandler: eventHandler) rewardedAd.delegate = self @@ -242,11 +243,16 @@ To be notified when a user earns a reward - implement the method of `RewardedAdU The reward object is stored in the `RewardedAdUnit`: -```swift -if let reward = rewardedAd.reward as? GADAdReward { +{% capture gma12 %}if let reward = rewardedAd.reward as? GoogleMobileAds.AdReward { // ... } -``` +{% endcapture %} +{% capture gma11 %}if let reward = rewardedAd.reward as? GADAdReward { + // ... +} +{% endcapture %} + +{% include code/gma-versions-tabs.html id="gam-reward" gma11=gma11 gma12=gma12 %} #### Step 1: Create Event Handler {:.no_toc} @@ -289,9 +295,9 @@ GAM setup: Integration: -1. Replace the `GADRewardedAd` with `RewardedAdUnit` in the View Controller. +1. Replace the `RewardedAd` with `RewardedAdUnit` in the View Controller. 2. Implement the protocol `RewardedAdUnitDelegate` in the View Controller. -3. Remove usage of `GAMRequest`. +3. Remove usage of `AdManagerRequest`. 4. Remove original `RewardedVideoAdUnit`. 5. Follow the instructions to integrate [Rewarded API](#rewarded-video). diff --git a/prebid-mobile/pbm-api/ios/code-integration-ios.md b/prebid-mobile/pbm-api/ios/code-integration-ios.md index c8d2f08932..84b9f03fe7 100644 --- a/prebid-mobile/pbm-api/ios/code-integration-ios.md +++ b/prebid-mobile/pbm-api/ios/code-integration-ios.md @@ -8,6 +8,8 @@ nav_section: prebid-mobile-ios sidebarType: 2 --- + + # Prebid SDK Integration for iOS {:.no_toc} @@ -123,8 +125,24 @@ Once you set the account ID and the Prebid Server host, you should initialize th If you integrate Prebid Mobile with GMA SDK with version equal or higher than 10.7.0, use the following initializer, which checks the compatibility of Prebid SDK with GMA SDK used in the app: -```swift -Prebid.initializeSDK(gadMobileAdsVersion: GADGetStringFromVersionNumber(GADMobileAds.sharedInstance().versionNumber) { status, error in +{% capture gma12 %}Prebid.initializeSDK(gadMobileAdsVersion: string(for: MobileAds.shared.versionNumber)) { 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 + } +} +{% endcapture %} +{% capture gma11 %}Prebid.initializeSDK(gadMobileAdsVersion: GADGetStringFromVersionNumber(GADMobileAds.sharedInstance().versionNumber) { status, error in switch status { case .succeeded: print("Prebid SDK successfully initialized") @@ -140,7 +158,9 @@ Prebid.initializeSDK(gadMobileAdsVersion: GADGetStringFromVersionNumber(GADMobil break } } -``` +{% endcapture %} + +{% include code/gma-versions-tabs.html id="pbm-init" gma11=gma11 gma12=gma12 %} If you integrate Prebid Mobile with GMA SDK with version lower than 10.7.0, use the following initializer: diff --git a/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md b/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md index d5c12d4f9b..b3da208e65 100644 --- a/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md +++ b/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md @@ -572,7 +572,7 @@ let globalORTB = """ } }, "displaymanager": "Google", - "displaymanagerver": "\(GADGetStringFromVersionNumber(GADMobileAds.sharedInstance().versionNumber))" + "displaymanagerver": "\(string(for: MobileAds.shared.versionNumber))" } """ diff --git a/prebid-mobile/pbm-api/ios/pbm-util-ios.md b/prebid-mobile/pbm-api/ios/pbm-util-ios.md index 5b4a64776b..f823559914 100755 --- a/prebid-mobile/pbm-api/ios/pbm-util-ios.md +++ b/prebid-mobile/pbm-api/ios/pbm-util-ios.md @@ -23,8 +23,19 @@ It is recommended all Google Ad Manager integrations resize all ads served based Usage example: -```swift -func bannerViewDidReceiveAd(_ bannerView: GADBannerView) { +{% capture gma12 %} +func bannerViewDidReceiveAd(_ bannerView: GoogleMobileAds.BannerView) { + AdViewUtils.findPrebidCreativeSize(bannerView, success: { size in + guard let bannerView = bannerView as? AdManagerBannerView else { return } + + // In the case of Prebid's line item - resize te ad view + bannerView.resize(adSizeFor(cgSize: size)) + }, failure: { (error) in + PrebidDemoLogger.shared.error("Error occuring during searching for Prebid creative size: \(error)") + }) +} +{% endcapture %} +{% capture gma11 %}func bannerViewDidReceiveAd(_ bannerView: GADBannerView) { // Determine the kind of winning line item AdViewUtils.findPrebidCreativeSize(bannerView, success: { size in @@ -36,7 +47,6 @@ func bannerViewDidReceiveAd(_ bannerView: GADBannerView) { PrebidDemoLogger.shared.error("Error occuring during searching for Prebid creative size: \(error)") }) } -``` - - +{% endcapture %} +{% include code/gma-versions-tabs.html id="pbm-utils" gma11=gma11 gma12=gma12 %} diff --git a/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-html-banner.md b/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-html-banner.md index 140a8c6b19..b205ea09a7 100644 --- a/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-html-banner.md +++ b/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-html-banner.md @@ -4,21 +4,50 @@ title: iOS GAM Bidding-Only Integration - HTML Banner description: iOS GAM Bidding-Only Integration - HTML Banner sidebarType: 2 --- - + # iOS GAM Bidding-Only Integration - HTML Banner Back to [Bidding-Only Integration](/prebid-mobile/pbm-api/ios/ios-sdk-integration-gam-original-api.html#adunit-specific-instructions) To integrate HTML banner ads into the app you should use the `BannerAdUnit` class. It makes bid requests to Prebid Server and provides targeting keywords for the winning bid(s) to the GMA SDK. -Integration example: +**Integration example(Swift):** -```swift -func createAd() { +{% capture gma12 %}func createAd() { // 1. Create a BannerAdUnit using Prebid Mobile SDK - adUnit = BannerAdUnit(configId: CONFIG_ID, size: adSize) + adUnit = BannerAdUnit(configId: CONFIG_ID, size: AD_SIZE) adUnit.setAutoRefreshMillis(time: 30000) - adUnit.addAdditionalSize(adSize2) + adUnit.addAdditionalSize(AD_SIZE_2) + + // 2. Configure banner parameters using Prebid Mobile SDK + let parameters = BannerParameters() + parameters.api = [Signals.Api.MRAID_2, Signals.Api.OMID_1] + adUnit.parameters = parameters + + // 3. Create an AdManagerBannerView using Google Mobile Ads SDK + gamBanner = AdManagerBannerView(adSize: adSizeFor(cgSize: AD_SIZE)) + gamBanner.adUnitID = AD_UNIT_ID + gamBanner.rootViewController = self + gamBanner.delegate = self + + // Add GMA SDK banner view to the app UI + bannerView?.addSubview(gamBanner) + + // 4. Make a bid request to Prebid Server using Prebid Mobile SDK + let gamRequest = AdManagerRequest() + adUnit.fetchDemand(adObject: gamRequest) { [weak self] resultCode in + DemoLogger.shared.info("Prebid demand fetch for GAM \(resultCode.name())") + + // 5. Load GAM Ad using Google Mobile Ads SDK + self?.gamBanner.load(gamRequest) + } +} +{% endcapture %} +{% capture gma11 %}func createAd() { + // 1. Create a BannerAdUnit using Prebid Mobile SDK + adUnit = BannerAdUnit(configId: CONFIG_ID, size: AD_SIZE) + adUnit.setAutoRefreshMillis(time: 30000) + adUnit.addAdditionalSize(AD_SIZE_2) // 2. Configure banner parameters using Prebid Mobile SDK let parameters = BannerParameters() @@ -26,7 +55,7 @@ func createAd() { adUnit.parameters = parameters // 3. Create a GAMBannerView using Google Mobile Ads SDK - gamBanner = GAMBannerView(adSize: GADAdSizeFromCGSize(adSize)) + gamBanner = GAMBannerView(adSize: GADAdSizeFromCGSize(AD_SIZE)) gamBanner.adUnitID = AD_UNIT_ID gamBanner.rootViewController = self gamBanner.delegate = self @@ -43,14 +72,24 @@ func createAd() { self?.gamBanner.load(gamRequest) } } -``` +{% endcapture %} + +{% include code/gma-versions-tabs.html id="html-banner" gma11=gma11 gma12=gma12 %} -If you want to support several ad sizes, you also need to implement `GADBannerViewDelegate` to adjust banner view size according to the creative size. +If you want to support several ad sizes, you also need to implement `GoogleMobileAds.BannerViewDelegate` to adjust banner view size according to the creative size. In case you use a single-size banner (e.g., 300x250), you don't need to make a call to the `AdViewUtils.findPrebidCreativeSize` routine because you already know the size of the creative. However, you still need to call `bannerView.resize` because the creative in GMA has a default size of 1x1, and without this call, it will be rendered as a pixel. -```swift -func bannerViewDidReceiveAd(_ bannerView: GADBannerView) { +{% capture gma12 %}func bannerViewDidReceiveAd(_ bannerView: GoogleMobileAds.BannerView) { + AdViewUtils.findPrebidCreativeSize(bannerView, success: { size in + guard let bannerView = bannerView as? AdManagerBannerView else { return } + bannerView.resize(adSizeFor(cgSize: size)) + }, failure: { (error) in + PrebidDemoLogger.shared.error("Error occuring during searching for Prebid creative size: \(error)") + }) +} +{% endcapture %} +{% capture gma11 %}func bannerViewDidReceiveAd(_ bannerView: GADBannerView) { // 6. Resize ad view if needed (Prebid Mobile SDK) AdViewUtils.findPrebidCreativeSize(bannerView, success: { size in guard let bannerView = bannerView as? GAMBannerView else { return } @@ -59,7 +98,9 @@ func bannerViewDidReceiveAd(_ bannerView: GADBannerView) { // The received ad is not Prebid’s one }) } -``` +{% endcapture %} + +{% include code/gma-versions-tabs.html id="html-banner-did-receive-ad-callback" gma11=gma11 gma12=gma12 %} {: .alert.alert-info :} Make sure you process all possible cases in the `AdViewUtils.findPrebidCreativeSize` callbacks (both success and failure). Sometimes you might not get the size of the creative (or a failure callback) - it simply means that this is not a Prebid creative. It means that you still need to render the creative, but you most likely don’t need to resize it. @@ -77,35 +118,26 @@ If you need to bid on other ad sizes as well use `addAdditionalSize()` method to {% include mobile/banner-params.md %} -## Step 3: Create a GAMBannerView +## Step 3: Create a AdManagerBannerView 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 the bid request -The _fetchDemand_ method makes a bid request to the Prebid Server. The `GAMRequest` object provided to this method must be the one used in the next step to make the GAM ad request. +The _fetchDemand_ method makes a bid request to the Prebid Server. The `AdManagerRequest` object provided to this method must be the one used in the next step to make the GAM ad request. When Prebid Server responds, Prebid SDK will set the targeting keywords of the winning bid into provided object. ## Step 5: Call the ad server -Next, request the ad from GAM. If the `GAMRequest` object contains targeting keywords, the respective Prebid line item may be returned from GAM, and GMA SDK will render its creative. +Next, request the ad from GAM. If the `AdManagerRequest` object contains targeting keywords, the respective Prebid line item may be returned from GAM, and GMA SDK will render its creative. -Ensure that you call the _load_ method with the same `GAMRequest` object that you passed to the _fetchDemand_ method on the previous step. Otherwise, the ad request won't contain targeting keywords, and Prebid bids won't be displayed. +Ensure that you call the _load_ method with the same `AdManagerRequest` object that you passed to the _fetchDemand_ method on the previous step. Otherwise, the ad request won't contain targeting keywords, and Prebid bids won't be displayed. ## Step 6: Adjust the ad view size Once an app receives a signal that an ad is loaded, you should use the method `AdViewUtils.findPrebidCreativeSize` to verify whether it's Prebid Server’s ad and resize the ad slot respectively to the creative's properties. -```swift -// GMA SDK functions -func validBannerSizes(for adLoader: GADAdLoader) -> [NSValue] { - return [NSValueFromGADAdSize(GADAdSizeFromCGSize(adSize))] -} -``` - -The function above provides valid banner sizes for the ad loader. Adjust it according to the size of your ad. - ## Further Reading - [Prebid Mobile Overview](/prebid-mobile/prebid-mobile.html) diff --git a/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-interstitial-banner.md b/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-interstitial-banner.md index b09aa637f1..1f49df96f7 100644 --- a/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-interstitial-banner.md +++ b/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-interstitial-banner.md @@ -13,11 +13,40 @@ To integrate an interstitial banner ad into the app you use the Prebid SDK `Inte **Integration example(Swift):** -```swift -func createAd() { +{% capture gma12 %}func createAd() { + // 1. Create an InterstitialAdUnit + adUnit = InterstitialAdUnit( + configId: CONFIG_ID, + minWidthPerc: MIN_WIDTH_PERC, + minHeightPerc: MIN_HEIGHT_PERC + ) + + // 2. Make a bid request to Prebid Server + let gamRequest = AdManagerRequest() + adUnit.fetchDemand(adObject: gamRequest) { [weak self] resultCode in + PrebidDemoLogger.shared.info("Prebid demand fetch for GAM \(resultCode.name())") + + // 3. Load a GAM interstitial ad + AdManagerInterstitialAd.load( + with: AD_UNIT_ID, + 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 { + // 4. Present the interstitial ad + ad.fullScreenContentDelegate = self + ad.present(from: self) + } + } + } +} +{% endcapture %} +{% capture gma11 %}func createAd() { // 1. Create an InterstitialAdUnit using Prebid Mobile SDK - adUnit = InterstitialAdUnit(configId: CONFIG_ID, minWidthPerc: 75, minHeightPerc: 75) - adUnit.adUnitConfig.adSize = CGSize(width: 1, height: 1) + adUnit = InterstitialAdUnit(configId: CONFIG_ID, minWidthPerc: MIN_WIDTH_PERC, minHeightPerc: MIN_WIDTH_PERC) // 2. Make a bid request to Prebid Server using Prebid Mobile SDK let gamRequest = GAMRequest() @@ -38,7 +67,9 @@ func createAd() { } } } -``` +{% endcapture %} + +{% include code/gma-versions-tabs.html id="interstitial-banner" gma11=gma11 gma12=gma12 %} ## Step 1: Create an Ad Unit @@ -53,13 +84,13 @@ Here's how min size percentages work. If the adunit size is 1x1, Prebid Server u ## Step 2: Make the bid request -The _fetchDemand_ method makes a bid request to the Prebid Server. The `GAMRequest` object provided to this method must be the one used in the next step to make the GAM ad request. +The _fetchDemand_ method makes a bid request to the Prebid Server. The `AdManagerRequest` object provided to this method must be the one used in the next step to make the GAM ad request. When Prebid Server responds, Prebid SDK will set the targeting keywords of the winning bid into provided object. ## Step 3: Load a GAM interstitial ad -After receiving a bid it's time to load the ad from GAM. If the `GAMRequest` contains targeting keywords, the respective Prebid line item may be returned from GAM, and GMA SDK will render its creative. +After receiving a bid it's time to load the ad from GAM. If the `AdManagerRequest` contains targeting keywords, the respective Prebid line item may be returned from GAM, and GMA SDK will render its creative. ## Step 4: Render the interstitial ad diff --git a/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-interstitial-video.md b/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-interstitial-video.md index 1b63cac078..f01db9baf7 100644 --- a/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-interstitial-video.md +++ b/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-interstitial-video.md @@ -9,63 +9,106 @@ sidebarType: 2 Back to [Bidding-Only Integration](/prebid-mobile/pbm-api/ios/ios-sdk-integration-gam-original-api.html#adunit-specific-instructions) -To integrate Video Interstitial ads into the app you should use the Prebid SDK `VideoInterstitialAdUnit` class. It makes bid requests to Prebid Server and provides targeting keywords of the winning bid to the GMA SDK. +To integrate Video Interstitial ads into the app you should use the Prebid SDK `InterstitialAdUnit` class. It makes bid requests to Prebid Server and provides targeting keywords of the winning bid to the GMA SDK. -**Integration Example:** +**Integration example(Swift):** -```swift -func createAd() { - // 1. Create a VideoInterstitialAdUnit using Prebid Mobile SDK - adUnit = VideoInterstitialAdUnit(configId: CONFIG_ID) +{% capture gma12 %}func createAd() { + // 1. Create an InterstitialAdUnit + adUnit = InterstitialAdUnit(configId: CONFIG_ID) - // 2. Configure video parameters using Prebid Mobile SDK + // 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.videoParameters = parameters + + // 4. Make a bid request to Prebid Server + let gamRequest = AdManagerRequest() + adUnit.fetchDemand(adObject: gamRequest) { [weak self] resultCode in + PrebidDemoLogger.shared.info("Prebid demand fetch for GAM \(resultCode.name())") + + // 5. Load a GAM interstitial ad + AdManagerInterstitialAd.load( + with: AD_UNIT_ID, + 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 { + // 6. Present the interstitial ad + ad.present(from: self) + ad.fullScreenContentDelegate = self + } + } + } +} +{% endcapture %} +{% capture gma11 %}func createAd() { + // 1. Create a InterstitialAdUnit using Prebid Mobile SDK + adUnit = InterstitialAdUnit(configId: CONFIG_ID) + + // 2. Set ad format + adUnit.adFormats = [.video] + + // 3. Configure video parameters using Prebid Mobile SDK let parameters = VideoParameters() parameters.mimes = ["video/mp4"] parameters.protocols = [Signals.Protocols.VAST_2_0] parameters.playbackMethod = [Signals.PlaybackMethod.AutoPlaySoundOn] adUnit.parameters = parameters - // 3. Make a bid request to Prebid Server using Prebid Mobile SDK + // 4. Make a bid request to Prebid Server using Prebid Mobile SDK let gamRequest = GAMRequest() adUnit.fetchDemand(adObject: gamRequest) { [weak self] resultCode in DemoLogger.shared.info("Prebid demand fetch for GAM \(resultCode.name())") - // 4. Load a GAM interstitial ad using Google Mobile Ads SDK + // 5. Load a GAM interstitial ad using Google Mobile Ads SDK GAMInterstitialAd.load(withAdManagerAdUnitID: AD_UNIT_ID, request: gamRequest) { ad, error in guard let self = self else { return } if let error = error { DemoLogger.shared.error("Failed to load interstitial ad with error: \(error.localizedDescription)") } else if let ad = ad { - // 5. Immediately render the interstitial ad + // 6. Immediately render the interstitial ad ad.present(fromRootViewController: self) ad.fullScreenContentDelegate = self } } } } -``` +{% endcapture %} + +{% include code/gma-versions-tabs.html id="interstitial-video" gma11=gma11 gma12=gma12 %} ## Step 1: Create an Ad Unit -Initialize the `VideoInterstitialAdUnit` with properties: +Initialize the `InterstitialAdUnit` with properties: - `configId` - an ID of the Ad Unit Level Stored Request on Prebid Server -## Step 2: Configure video parameters +## Step 2: Set the ad format + +Set the desired ad formats using `adFormats` property. + +## Step 3: Configure video parameters {% include mobile/video-params.md %} -## Step 3: Make the bid request +## Step 4: Make the bid request -The _fetchDemand_ method makes a bid request to the Prebid Server. The `GAMRequest` object provided to this method must be the one used in the next step to make the GAM ad request. +The _fetchDemand_ method makes a bid request to the Prebid Server. The `AdManagerRequest` object provided to this method must be the one used in the next step to make the GAM ad request. When Prebid Server responds, Prebid SDK will set the targeting keywords of the winning bid into provided object. -## Step 4: Load a GAM interstitial ad +## Step 5: Load a GAM interstitial ad -After receiving a bid it's time to load the ad from GAM. If the `GAMRequest` contains targeting keywords, the respective Prebid line item may be returned from GAM, and GMA SDK will render its creative. +After receiving a bid it's time to load the ad from GAM. If the `AdManagerRequest` contains targeting keywords, the respective Prebid line item may be returned from GAM, and GMA SDK will render its creative. -## Step 5: Render the interstitial ad +## Step 6: Render the interstitial ad Follow the [GMA SDK guide](https://developers.google.com/ad-manager/mobile-ads-sdk/ios/interstitial#display_the_ad) to display the interstitial ad. Note that you'll need to decide whether it's going to be rendered immediately after receiving it or rendered later in the flow of an app. Note that the example above implements an immediate render approach. diff --git a/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-multiformat-interstitial.md b/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-multiformat-interstitial.md index debd6a4b7e..8dd9c3ca44 100644 --- a/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-multiformat-interstitial.md +++ b/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-multiformat-interstitial.md @@ -9,12 +9,45 @@ sidebarType: 2 Back to [Bidding-Only Integration](/prebid-mobile/pbm-api/ios/ios-sdk-integration-gam-original-api.html#adunit-specific-instructions) -Integration example: +**Integration example(Swift):** -``` swift -// 1. Create an InterstitialAdUnit -adUnit = InterstitialAdUnit(configId: CONFIG_ID, minWidthPerc: 60, minHeightPerc: 70) -adUnit.adUnitConfig.adSize = CGSize(width: 1, height: 1) +{% capture gma12 %}// 1. Create an InterstitialAdUnit +adUnit = InterstitialAdUnit( + configId: CONFIG_ID, + minWidthPerc: MIN_WIDTH_PERC, + minHeightPerc: MIN_HEIGHT_PERC +) + +// 2. Set adFormats +adUnit.adFormats = [.banner, .video] + +// 3. Configure video 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 = AdManagerRequest() +adUnit.fetchDemand(adObject: gamRequest) { [weak self] resultCode in + PrebidDemoLogger.shared.info("Prebid demand fetch for GAM \(resultCode.name())") + + // 5. Load a GAM interstitial ad + InterstitialAd.load(with: AD_UNIT_ID, 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(from: self) + } + } +} +{% endcapture %} +{% capture gma11 %} // 1. Create an InterstitialAdUnit +adUnit = InterstitialAdUnit(configId: CONFIG_ID, minWidthPerc: MIN_WIDTH_PERC, minHeightPerc: MIN_HEIGHT_PERC) // 2. Set adFormats adUnit.adFormats = [.banner, .video] @@ -31,7 +64,7 @@ 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 + GAMInterstitialAd.load(withAdManagerAdUnitID: AD_UNIT_ID, request: gamRequest) { ad, error in guard let self = self else { return } if let error = error { @@ -43,12 +76,14 @@ adUnit.fetchDemand(adObject: gamRequest) { [weak self] resultCode in } } } -``` +{% endcapture %} + +{% include code/gma-versions-tabs.html id="multiformat-interstitial" gma11=gma11 gma12=gma12 %} ## Step 1: Create an InterstitialAdUnit {:.no_toc} -Initialize the InterstitialAdUnit with the following properties: +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+ @@ -77,14 +112,14 @@ For multiformat ad unit, you must set both banner and video ad formats. ## 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. +The `fetchDemand` method makes a bid request to the Prebid Server. You should provide a `AdManagerRequest` 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. +You should now request the ad from GAM. If the `AdManagerRequest` 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. +Be sure that you make the ad request with the same `AdManagerRequest` 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} diff --git a/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-multiformat.md b/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-multiformat.md index 0371065fa4..9340f40d92 100644 --- a/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-multiformat.md +++ b/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-multiformat.md @@ -4,6 +4,7 @@ title: iOS GAM Bidding-Only Integration - Multiformat Banner+Video+InAppNative description: iOS GAM Bidding-Only Integration - Multiformat Banner+Video+InAppNative sidebarType: 2 --- + # iOS GAM Bidding-Only Integration - Multiformat Banner+Video+InAppNative @@ -13,10 +14,57 @@ Starting with version `2.1.5` Prebid SDK supports the fully multiformat ad unit. The following code demonstrates the integration of multiformat ad unit. -``` swift -func createAd() { +{% capture gma12 %}func createAd() { // 1. Setup a PrebidAdUnit - adUnit = PrebidAdUnit(configId: configId) + adUnit = PrebidAdUnit(configId: CONFIG_ID) + adUnit.setAutoRefreshMillis(time: 30_000) + + // 2. Setup the parameters + let bannerParameters = BannerParameters() + bannerParameters.api = [Signals.Api.MRAID_2] + bannerParameters.adSizes = [adSize] + + let videoParameters = VideoParameters(mimes: ["video/mp4"]) + videoParameters.protocols = [Signals.Protocols.VAST_2_0] + videoParameters.playbackMethod = [Signals.PlaybackMethod.AutoPlaySoundOff] + videoParameters.placement = Signals.Placement.InBanner + videoParameters.adSize = adSize + + let nativeParameters = NativeParameters() + nativeParameters.assets = nativeAssets + nativeParameters.context = ContextType.Social + nativeParameters.placementType = PlacementType.FeedContent + nativeParameters.contextSubType = ContextSubType.Social + nativeParameters.eventtrackers = eventTrackers + + // 3. Configure the PrebidRequest + let prebidRequest = PrebidRequest( + bannerParameters: bannerParameters, + videoParameters: videoParameters, + nativeParameters: nativeParameters + ) + + // 4. Make a bid request + let gamRequest = AdManagerRequest() + adUnit.fetchDemand(adObject: gamRequest, request: prebidRequest) { [weak self] _ in + guard let self = self else { return } + + // 5. Configure and make a GAM ad request + self.adLoader = AdLoader( + adUnitID: AD_UNIT_ID, + rootViewController: self, + adTypes: [AdLoaderAdType.customNative, AdLoaderAdType.adManagerBanner], + options: [] + ) + + self.adLoader.delegate = self + self.adLoader.load(gamRequest) + } +} +{% endcapture %} +{% capture gma11 %}func createAd() { + // 1. Setup a PrebidAdUnit + adUnit = PrebidAdUnit(configId: CONFIG_ID) adUnit.setAutoRefreshMillis(time: 30_000) // 2. Setup the parameters @@ -46,18 +94,35 @@ func createAd() { guard let self = self else { return } // 5. Configure and make a GAM ad request - self.adLoader = GADAdLoader(adUnitID: gamRenderingMultiformatAdUnitId, rootViewController: self, + self.adLoader = GADAdLoader(adUnitID: AD_UNIT_ID, rootViewController: self, adTypes: [GADAdLoaderAdType.customNative, GADAdLoaderAdType.gamBanner], options: []) self.adLoader.delegate = self self.adLoader.load(gamRequest) } } -``` +{% endcapture %} + +{% include code/gma-versions-tabs.html id="multiformat-2" gma11=gma11 gma12=gma12 %} To handle the banner, video and in-banner native (Native Styles) ads: -``` swift -func adLoader(_ adLoader: GADAdLoader, didReceive bannerView: GAMBannerView) { +{% capture gma12 %}func adLoader(_ adLoader: AdLoader, didReceive bannerView: AdManagerBannerView) { + self.bannerView.isHidden = false + self.nativeView.isHidden = true + self.bannerView.backgroundColor = .clear + self.bannerView.addSubview(bannerView) + + AdViewUtils.findPrebidCreativeSize(bannerView, success: { [weak self] size in + bannerView.resize(adSizeFor(cgSize: size)) + + self?.bannerView.constraints.first { $0.firstAttribute == .width }?.constant = size.width + self?.bannerView.constraints.first { $0.firstAttribute == .height }?.constant = size.height + }, failure: { (error) in + PrebidDemoLogger.shared.error("Error occuring during searching for Prebid creative size: \(error)") + }) +} +{% endcapture %} +{% capture gma11 %}func adLoader(_ adLoader: GADAdLoader, didReceive bannerView: GAMBannerView) { self.bannerView.isHidden = false self.nativeView.isHidden = true self.bannerView.backgroundColor = .clear @@ -72,7 +137,9 @@ func adLoader(_ adLoader: GADAdLoader, didReceive bannerView: GAMBannerView) { PrebidDemoLogger.shared.error("Error occuring during searching for Prebid creative size: \(error)") }) } -``` +{% endcapture %} + +{% include code/gma-versions-tabs.html id="multiformat" gma11=gma11 gma12=gma12 %} If you use Custom Native Ads follow the [guide](https://developers.google.com/ad-manager/mobile-ads-sdk/ios/native-banner) on how to implement processing of the ad response of the respective type. To handle the wining native ad: @@ -151,9 +218,9 @@ In addition you can set the following properties of the `PrebidRequest`. ## 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. +The `fetchDemand` method makes a bid request to the Prebid Server. You should provide a `AdManagerRequest` object to this method so Prebid SDK sets the targeting keywords of the winning bid for future ad requests. -## Step 5: Create a GAMBannerView +## Step 5: Create a BannerView {:.no_toc} Follow the [GMA SDK documentation](https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner) to integrate a banner ad unit. @@ -161,9 +228,9 @@ Follow the [GMA SDK documentation](https://developers.google.com/ad-manager/mobi ## Step 6: 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. +Now you should request the ad from GAM. If the `AdManagerRequest` 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. +Be sure that you make the ad request with the same `AdManagerRequest` 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 7: Process the Ad Response {:.no_toc} diff --git a/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-native-in-app.md b/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-native-in-app.md index 650a3baeea..98d48712b2 100644 --- a/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-native-in-app.md +++ b/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-native-in-app.md @@ -4,6 +4,7 @@ title: iOS GAM Bidding-Only Integration - Native In-App description: iOS GAM Bidding-Only Integration - Native In-App sidebarType: 2 --- + # iOS GAM Bidding-Only Integration - Native In-App @@ -23,7 +24,7 @@ At a high level, the in-app workflow follows this sequence: The cached assets might expire. If this occurs the publisher will receive a notification and they will have to fetch the assets again. {% endcapture %} -Integration Example: +**Integration example(Swift):** ``` swift private var nativeRequestAssets: [NativeAsset] { @@ -42,11 +43,90 @@ private var nativeRequestAssets: [NativeAsset] { } ``` -Then integrate the native style ad using GADAdLoader +Then integrate the native style ad using `GoogleMobileAds.AdLoader`: -``` swift -// 1. Setup NativeRequest -nativeUnit = NativeRequest(configId: storedPrebidImpression, assets: nativeRequestAssets) +{% capture gma12 %}// 1. Setup a NativeRequest +nativeUnit = NativeRequest(configId: CONFIG_ID, assets: nativeRequestAssets) + +// 2. Configure the NativeRequest +nativeUnit.context = ContextType.Social +nativeUnit.placementType = PlacementType.FeedContent +nativeUnit.contextSubType = ContextSubType.Social +nativeUnit.eventtrackers = eventTrackers + +// 3. Make a bid request +nativeUnit.fetchDemand(adObject: gamRequest) { [weak self] resultCode in + guard let self = self else { return } + + //4. Configure and make a GAM ad request + self.adLoader = AdLoader( + adUnitID: AD_UNIT_ID, + rootViewController: self, + adTypes: [AdLoaderAdType.customNative], + options: [] + ) + self.adLoader.delegate = self + self.adLoader.load(self.gamRequest) +} + +..... + +// Step 4 +// MARK: GoogleMobileAds.CustomNativeAdLoaderDelegate + +func customNativeAdFormatIDs(for adLoader: AdLoader) -> [String] { + [AD_FORMAT_ID] +} + +func adLoader(_ adLoader: AdLoader, didReceive customNativeAd: CustomNativeAd) { + Utils.shared.delegate = self + Utils.shared.findNative(adObject: customNativeAd) +} + +// Step 5 +// MARK: - NativeAdDelegate + +func nativeAdLoaded(ad: NativeAd) { + nativeAd = ad + titleLabel.text = ad.title + bodyLabel.text = ad.text + + if let iconString = ad.iconUrl { + ImageHelper.downloadImageAsync(iconString) { result in + if case let .success(icon) = result { + DispatchQueue.main.async { + self.iconView.image = icon + } + } + } + } + + if let imageString = ad.imageUrl { + ImageHelper.downloadImageAsync(imageString) { result in + if case let .success(image) = result { + DispatchQueue.main.async { + self.mainImageView.image = image + } + } + } + } + + callToActionButton.setTitle(ad.callToAction, for: .normal) + sponsoredLabel.text = ad.sponsoredBy + + nativeAd.registerView(view: view, clickableViews: [callToActionButton]) +} + +func nativeAdNotFound() { + PrebidDemoLogger.shared.error("Native ad not found") +} + +func nativeAdNotValid() { + PrebidDemoLogger.shared.error("Native ad not valid") +} +{% endcapture %} +{% capture gma11 %}// 1. Setup NativeRequest +nativeUnit = NativeRequest(configId: CONFIG_ID, assets: nativeRequestAssets) nativeUnit.context = ContextType.Social nativeUnit.placementType = PlacementType.FeedContent nativeUnit.contextSubType = ContextSubType.Social @@ -57,7 +137,7 @@ nativeUnit.fetchDemand(adObject: gamRequest) { [weak self] resultCode in guard let self = self else { return } //3. Configure and make a GAM ad request - self.adLoader = GADAdLoader(adUnitID: gamRenderingNativeAdUnitId,rootViewController: self, + self.adLoader = GADAdLoader(adUnitID: AD_UNIT_ID, rootViewController: self, adTypes: [GADAdLoaderAdType.customNative], options: []) self.adLoader.delegate = self self.adLoader.load(self.gamRequest) @@ -69,7 +149,7 @@ nativeUnit.fetchDemand(adObject: gamRequest) { [weak self] resultCode in // MARK: GADCustomNativeAdLoaderDelegate func customNativeAdFormatIDs(for adLoader: GADAdLoader) -> [String] { - ["11934135"] + [AD_FORMAT_ID] } func adLoader(_ adLoader: GADAdLoader, didReceive customNativeAd: GADCustomNativeAd) { @@ -118,7 +198,9 @@ func nativeAdNotFound() { func nativeAdNotValid() { PrebidDemoLogger.shared.error("Native ad not valid") } -``` +{% endcapture %} + +{% include code/gma-versions-tabs.html id="native-in-app" gma11=gma11 gma12=gma12 %} ## Step 1: Create a NativeRequest {:.no_toc} @@ -165,21 +247,21 @@ Initialize the `NativeRequest` with properties: ## Step 2: 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. +The `fetchDemand` method makes a bid request to the Prebid Server. You should provide a `AdManagerRequest` object to this method so Prebid SDK sets the targeting keywords of the winning bid for future ad requests. ## Step 3: Configure and make a GAM ad request {:.no_toc} -Prepare the `GADAdLoader` and run ad request as described in the GMA SDK docs for the [native ads](https://developers.google.com/ad-manager/mobile-ads-sdk/ios/native/start). +Prepare the `AdLoader` and run ad request as described in the GMA SDK docs for the [native ads](https://developers.google.com/ad-manager/mobile-ads-sdk/ios/native/start). -If the `GAMRequest` contains targeting keywords the respective Prebid line item will be returned from GAM and GMA SDK will render its creative. +If the `AdManagerRequest` 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. +Be sure that you make the ad request with the same `AdManagerRequest` 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 4: Implement GADCustomNativeAdLoaderDelegate protocol +## Step 4: Implement CustomNativeAdLoaderDelegate protocol {:.no_toc} -In order to capture the native ad response you need to implement the GADCustomNativeAdLoaderDelegate protocol. +In order to capture the native ad response you need to implement the `CustomNativeAdLoaderDelegate` protocol. In the method `-adLoader:didReceiveCustomNativeAd:` you should pass the following Prebid functions: diff --git a/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-native-in-webview.md b/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-native-in-webview.md index 308d953674..17587c1381 100644 --- a/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-native-in-webview.md +++ b/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-native-in-webview.md @@ -4,12 +4,13 @@ title: iOS GAM Bidding-Only Integration - Native In-Webview description: iOS GAM Bidding-Only Integration - Native In-Webview sidebarType: 2 --- + # iOS GAM Bidding-Only Integration - Native In-Webview Back to [Bidding-Only Integration](/prebid-mobile/pbm-api/ios/ios-sdk-integration-gam-original-api.html#adunit-specific-instructions) -Integration example: +**Integration example(Swift):** First, prepare the set of requested assets. @@ -32,8 +33,33 @@ private var nativeRequestAssets: [NativeAsset] { Then integrate the native style ad using GAM Banner ad unit -``` swift -// 1. Create NativeRequest +{% capture gma12 %}// 1. Create a NativeRequest +nativeUnit = NativeRequest(configId: CONFIG_ID, assets: nativeRequestAssets) + +// 2. Configure the NativeRequest +nativeUnit.context = ContextType.Social +nativeUnit.placementType = PlacementType.FeedContent +nativeUnit.contextSubType = ContextSubType.Social +nativeUnit.eventtrackers = eventTrackers + +// 3. Create a GAMBannerView +gamBannerView = AdManagerBannerView(adSize: AdSizeFluid) +gamBannerView.adUnitID = AD_UNIT_ID +gamBannerView.rootViewController = self +gamBannerView.delegate = self + +// Add GMA SDK banner view to the app UI +bannerView.addSubview(gamBannerView) + +// 4. Make a bid request to Prebid Server +nativeUnit.fetchDemand(adObject: gamRequest) { [weak self] resultCode in + PrebidDemoLogger.shared.info("Prebid demand fetch for GAM \(resultCode.name())") + + // 5. Load the native ad + self?.gamBannerView.load(self?.gamRequest) +} +{% endcapture %} +{% capture gma11 %}// 1. Create NativeRequest nativeUnit = NativeRequest(configId: CONFIG_ID, assets: nativeRequestAssets) nativeUnit.context = ContextType.Social nativeUnit.placementType = PlacementType.FeedContent @@ -42,7 +68,7 @@ nativeUnit.eventtrackers = eventTrackers // 2. Create GAMBannerView gamBannerView = GAMBannerView(adSize: GADAdSizeFluid) -gamBannerView.adUnitID = storedImpNativeStyleBanner +gamBannerView.adUnitID = AD_UNIT_ID gamBannerView.rootViewController = self gamBannerView.delegate = self bannerView.addSubview(gamBannerView) @@ -54,7 +80,9 @@ nativeUnit.fetchDemand(adObject: gamRequest) { [weak self] resultCode in // 4. Load and GAM ad self?.gamBannerView.load(self?.gamRequest) } -``` +{% endcapture %} + +{% include code/gma-versions-tabs.html id="native-in-webview" gma11=gma11 gma12=gma12 %} ## Step 1: Create a NativeRequest {:.no_toc} @@ -98,7 +126,7 @@ Initialize the `NativeRequest` with properties: {% include mobile/native-params.md %} -## Step 2: Create a GAMBannerView +## Step 2: Create a BannerView {:.no_toc} Just follow the [GMA SDK documentation](https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner) to integrate a banner ad unit. @@ -106,14 +134,14 @@ Just follow the [GMA SDK documentation](https://developers.google.com/ad-manager ## Step 3: 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. +The `fetchDemand` method makes a bid request to the Prebid Server. You should provide a `AdManagerRequest` object to this method so Prebid SDK sets the targeting keywords of the winning bid for future ad requests. ## Step 4: 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. +You should now request the ad from GAM. If the `AdManagerRequest` 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. +Be sure that you make the ad request with the same `AdManagerRequest` 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. ## Further Reading diff --git a/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-rewarded-video.md b/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-rewarded-video.md index a8f9bf6512..8174d0503b 100644 --- a/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-rewarded-video.md +++ b/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-rewarded-video.md @@ -11,10 +11,39 @@ Back to [Bidding-Only Integration](/prebid-mobile/pbm-api/ios/ios-sdk-integratio To integrate Rewarded Video ads into the app you should use the Prebid SDK `RewardedVideoAdUnit` class. It makes bid requests to Prebid Server and provides targeting keywords of the winning bid to the GMA SDK. -**Integration Example** +**Integration example(Swift):** -```swift -func createAd() { +{% capture gma12 %}func createAd() { + // 1. Create an RewardedVideoAdUnit + adUnit = RewardedVideoAdUnit(configId: CONFIG_ID) + + // 2. Configure video parameters + let parameters = VideoParameters(mimes: ["video/mp4"]) + parameters.protocols = [Signals.Protocols.VAST_2_0] + parameters.playbackMethod = [Signals.PlaybackMethod.AutoPlaySoundOff] + adUnit.videoParameters = parameters + + // 3. Make a bid request to Prebid Server + adUnit.fetchDemand(adObject: gamRequest) { [weak self] resultCode in + PrebidDemoLogger.shared.info("Prebid demand fetch for GAM \(resultCode.name())") + + // 4. Load the GAM rewarded ad + RewardedAd.load(with: AD_UNIT_ID, request: self?.gamRequest) { [weak self] ad, error in + guard let self = self else { return } + if let error = error { + PrebidDemoLogger.shared.error("Failed to load rewarded ad with error: \(error.localizedDescription)") + } else if let ad = ad { + // 5. Present the interstitial ad + ad.fullScreenContentDelegate = self + ad.present(from: self, userDidEarnRewardHandler: { + _ = ad.adReward + }) + } + } + } +} +{% endcapture %} +{% capture gma11 %}func createAd() { // 1. Create a RewardedVideoAdUnit using Prebid Mobile SDK adUnit = RewardedVideoAdUnit(configId: CONFIG_ID) @@ -28,13 +57,13 @@ func createAd() { // 3. Make a bid request to Prebid Server using Prebid Mobile SDK let gamRequest = GAMRequest() adUnit.fetchDemand(adObject: gamRequest) { [weak self] resultCode in - DemoLogger.shared.info("Prebid demand fetch for GAM \(resultCode.name())") + PrebidDemoLogger.shared.info("Prebid demand fetch for GAM \(resultCode.name())") // 4. Load the GAM rewarded ad using Google Mobile Ads SDK GADRewardedAd.load(withAdUnitID: AD_UNIT_ID, request: gamRequest) { [weak self] ad, error in guard let self = self else { return } if let error = error { - DemoLogger.shared.error("Failed to load rewarded ad with error: \(error.localizedDescription)") + PrebidDemoLogger.shared.error("Failed to load rewarded ad with error: \(error.localizedDescription)") } else if let ad = ad { // 5. Present the rewarded ad ad.fullScreenContentDelegate = self @@ -45,7 +74,9 @@ func createAd() { } } } -``` +{% endcapture %} + +{% include code/gma-versions-tabs.html id="rewarded-video" gma11=gma11 gma12=gma12 %} ## Step 1: Create an Ad Unit @@ -59,13 +90,13 @@ Initialize the `RewardedVideoAdUnit` with properties: ## Step 3: Make the bid request -The _fetchDemand_ method makes a bid request to the Prebid Server. The `GAMRequest` object provided to this method must be the one used in the next step to make the GAM ad request. +The _fetchDemand_ method makes a bid request to the Prebid Server. The `AdManagerRequest` object provided to this method must be the one used in the next step to make the GAM ad request. When Prebid Server responds, Prebid SDK will set the targeting keywords of the winning bid into provided object. ## **Step 4: Load a GAM Rewarded Ad** -After receiving a bid it's time to load the ad from GAM. If the `GAMRequest` contains targeting keywords, the respective Prebid line item may be returned from GAM, and GMA SDK will render its creative. +After receiving a bid it's time to load the ad from GAM. If the `AdManagerRequest` contains targeting keywords, the respective Prebid line item may be returned from GAM, and GMA SDK will render its creative. ## Step 5: Display the Rewarded Ad diff --git a/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-video-outstream.md b/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-video-outstream.md index 5a6659b535..7694451547 100644 --- a/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-video-outstream.md +++ b/prebid-mobile/recipes/subrecipes/ios/gam-bidding-only-video-outstream.md @@ -12,11 +12,10 @@ Back to [Bidding-Only Integration](/prebid-mobile/pbm-api/ios/ios-sdk-integratio {: .alert.alert-info :} "Non-Instream" refers to the IAB video categories "Accompanying Content" and "Standalone". See [the IAB document](https://iabtechlab.com/industry-adoption-of-amended-iab-tech-lab-guidelines-is-vital-to-drive-change/) for more information. -Integration example: +**Integration example(Swift):** -``` swift -// 1. Create a BannerAdUnit -adUnit = BannerAdUnit(configId: CONFIG_ID, size: adSize) +{% capture gma12 %}// 1. Create a BannerAdUnit +adUnit = BannerAdUnit(configId: CONFIG_ID, size: AD_SIZE) // 2. Set ad format adUnit.adFormats = [.video] @@ -29,14 +28,44 @@ parameters.placement = Signals.Placement.InBanner adUnit.videoParameters = parameters // 4. Create a GAMBannerView -gamBanner = GAMBannerView(adSize: GADAdSizeFromCGSize(adSize)) -gamBanner.adUnitID = gamAdUnitVideoBannerOriginal +gamBanner = AdManagerBannerView(adSize: adSizeFor(cgSize: AD_SIZE)) +gamBanner.adUnitID = AD_UNIT_ID +gamBanner.rootViewController = self +gamBanner.delegate = self + +// Add GMA SDK banner view to the app UI +bannerView.addSubview(gamBanner) + +// 5. Make a bid request to Prebid Server +let gamRequest = AdManagerRequest() +adUnit.fetchDemand(adObject: gamRequest) { [weak self] resultCode in + PrebidDemoLogger.shared.info("Prebid demand fetch for GAM \(resultCode.name())") + + // 6. Load GAM Ad + self?.gamBanner.load(gamRequest) +} +{% endcapture %} +{% capture gma11 %}// 1. Create a BannerAdUnit +adUnit = BannerAdUnit(configId: CONFIG_ID, size: AD_SIZE) + +// 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] +parameters.placement = Signals.Placement.InBanner +adUnit.videoParameters = parameters + +// 4. Create a GAMBannerView +gamBanner = GAMBannerView(adSize: GADAdSizeFromCGSize(AD_SIZE)) +gamBanner.adUnitID = AD_UNIT_ID gamBanner.rootViewController = self gamBanner.delegate = self // Add GMA SDK banner view to the app UI bannerView.addSubview(gamBanner) -bannerView.backgroundColor = .clear // 5. Make a bid request to Prebid Server let gamRequest = GAMRequest() @@ -46,7 +75,9 @@ adUnit.fetchDemand(adObject: gamRequest) { [weak self] resultCode in // 6. Load GAM Ad self?.gamBanner.load(gamRequest) } -``` +{% endcapture %} + +{% include code/gma-versions-tabs.html id="non-instream-video" gma11=gma11 gma12=gma12 %} {: .alert.alert-warning :} Starting from PrebidMobile `2.1.0` the `VideoAdUnit` class is deprecated. Use `BannerAdUnit` class with video ad format instead. @@ -69,7 +100,7 @@ For video ad unit, you must set video ad format. Default value for `adFormats` p {% include mobile/video-params.md %} -## Step 4: Create a GAMBannerView +## Step 4: Create a BannerView {:.no_toc} Follow the [GMA SDK documentation](https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner) to integrate a banner ad unit. @@ -77,14 +108,14 @@ Follow the [GMA SDK documentation](https://developers.google.com/ad-manager/mobi ## 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. +The `fetchDemand` method makes a bid request to the Prebid Server. You should provide a `AdManagerRequest` object to this method so Prebid SDK sets the targeting keywords of the winning bid for future ad requests. ## 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. +You should now request the ad from GAM. If the `AdManagerRequest` 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. +Be sure that you make the ad request with the same `AdManagerRequest` 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. ## Further Reading From e3990a5a11483ca597237823f6e041a79af9b8ae Mon Sep 17 00:00:00 2001 From: Sebastien Boisvert Date: Thu, 20 Mar 2025 15:28:21 -0400 Subject: [PATCH 503/816] Fix schain documentation tentatively (#5955) * fix schain documentation tentatively * fix schain documentation for amp * update schain doc for auction request --- dev-docs/show-prebid-ads-on-amp-pages.md | 6 ++---- prebid-server/developers/add-new-bidder-go.md | 2 +- prebid-server/developers/add-new-bidder-java.md | 2 +- .../endpoints/openrtb2/auction-request-example.md | 2 +- .../endpoints/openrtb2/pbs-endpoint-auction.md | 12 +++++++++--- prebid-server/features/pbs-feature-idx.md | 5 +++-- 6 files changed, 17 insertions(+), 12 deletions(-) diff --git a/dev-docs/show-prebid-ads-on-amp-pages.md b/dev-docs/show-prebid-ads-on-amp-pages.md index b9244d2611..09a80d6d63 100644 --- a/dev-docs/show-prebid-ads-on-amp-pages.md +++ b/dev-docs/show-prebid-ads-on-amp-pages.md @@ -65,10 +65,8 @@ that doesn't come from /amp parameters: "id": "some-request-id", "cur": ["USD"], "source": { - "ext": { - "schain": { - ... - } + "schain": { + ... } }, "site": { diff --git a/prebid-server/developers/add-new-bidder-go.md b/prebid-server/developers/add-new-bidder-go.md index b18d63acdb..b1c8b618b7 100644 --- a/prebid-server/developers/add-new-bidder-go.md +++ b/prebid-server/developers/add-new-bidder-go.md @@ -877,7 +877,7 @@ There are a several values of a bid that publishers expect to be populated. Some | [First Party Data (FPD)](https://docs.prebid.org/prebid-server/features/pbs-fpd.html)| Prebid | `request.imp[].ext.context.data.*`, `request.app.ext.data.*`, `request.site.ext.data.*`, `request.user.ext.data.*`
    The publisher may provide first party data (e.g. keywords). | GDPR | OpenRTB | `request.regs.ext.gdpr`, `request.user.ext.consent`
    The publisher is specifying the European General Data Protection Regulation flag and TCF consent string. | Site or App | OpenRTB | `request.site`, `request.app`
    The publisher will provide either the site or app, but not both, representing the client's device. -| Supply Chain | OpenRTB | `request.source.ext.schain`
    The publisher's declaration of all parties who are selling or reselling the bid request. +| Supply Chain | OpenRTB | `request.source.schain`
    The publisher's declaration of all parties who are selling or reselling the bid request. | Test | OpenRTB | `request.test`
    The publisher is sending non-production traffic which also enables verbose debugging information from Prebid Server. | Video | OpenRTB | `request.imp[].video`
    The publisher is specifying video ad requirements or preferences. diff --git a/prebid-server/developers/add-new-bidder-java.md b/prebid-server/developers/add-new-bidder-java.md index f0aa1b5f3c..5971683b0b 100644 --- a/prebid-server/developers/add-new-bidder-java.md +++ b/prebid-server/developers/add-new-bidder-java.md @@ -608,7 +608,7 @@ There are a several values of a bid request that publishers may supply that your | [First Party Data (FPD)](https://docs.prebid.org/prebid-server/features/pbs-fpd.html)| Prebid | `request.imp[].ext.context.data.*`, `request.app.ext.data.*`, `request.site.ext.data.*`, `request.user.ext.data.*`
    The publisher may provide first party data (e.g. keywords). | GDPR | OpenRTB | `request.regs.ext.gdpr`, `request.user.ext.consent`
    The publisher is specifying the European General Data Protection Regulation flag and TCF consent string. | Site or App | OpenRTB | `request.site`, `request.app`
    The publisher will provide either the site or app, but not both, representing the client's device. -| Supply Chain | OpenRTB | `request.source.ext.schain`
    The publisher's declaration of all parties who are selling or reselling the bid request. +| Supply Chain | OpenRTB | `request.source.schain`
    The publisher's declaration of all parties who are selling or reselling the bid request. | Test | OpenRTB | `request.test`
    The publisher is sending non-production traffic which also enables verbose debugging information from Prebid Server. | Video | OpenRTB | `request.imp[].video`
    The publisher is specifying video ad requirements or preferences. | Rewarded inventory | OpenRTB | `request.imp[].ext.prebid.is_rewarded_inventory`
    Signal to indicate the inventory is rewarded. diff --git a/prebid-server/endpoints/openrtb2/auction-request-example.md b/prebid-server/endpoints/openrtb2/auction-request-example.md index 261cd9b25f..4e46ecce9c 100644 --- a/prebid-server/endpoints/openrtb2/auction-request-example.md +++ b/prebid-server/endpoints/openrtb2/auction-request-example.md @@ -110,7 +110,7 @@ It serves 2 purposes: }, "schains": [{ "bidders": ["bidderA"], - "schain": { SCHAIN OBJECT 1} // bid adapters will see their schain on source.[ext.]schain. + "schain": { SCHAIN OBJECT 1} // bid adapters will see their schain on source.schain. }], "server": { "externalurl": "https://prebid-server.example.com", diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md index fba8218898..fdf2554860 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -142,7 +142,7 @@ Prebid Server accepts all OpenRTB 2.x fields and passes them in the request to a | user.consent | 2.6 | Bidders supporting 2.5 only: downgraded to user.ext.consent | | imp.rwdd | 2.6 | Bidders supporting 2.5 only: downgraded to imp[].ext.prebid.is_rewarded_inventory | | user.eids | 2.6 | Bidders supporting 2.5 only: downgraded to user.ext.eids | -| source.schain | 2.6 | Bidders supporting 2.5 only: downgraded to source.ext.schain | +| source.schain | 2.6 | Bidders supporting 2.5 only: downgraded to source.ext.schain, Bidders supporting 2.4 only: downgraded to ext.schain | | wlangb, {content, device}.langb, cattax, {site, app, publisher, content, producer}.cattax, ssai, {app, site}.content.{network, channel}, {app, content, site, user}.kwarray, device.sua | 2.6 | Bidders supporting 2.5 only: these fields are removed | | {video, audio}.{rqddurs, maxseq, poddur, podid, podseq, mincpmpersec, slotinpod} | 2.6 | Bidders supporting 2.5 only: these fields are removed | | regs.gpp | 2.6-202211 | Bidders supporting 2.5 only: this field is removed | @@ -998,7 +998,13 @@ An additional option is `usepbsrates`. When `true`, this flag indicates that dyn ##### Supply Chain Support -Basic supply chains are passed to Prebid Server on `source.ext.schain` and passed through to bid adapters. Prebid Server does not currently offer the ability to add a node to the supply chain. +Basic supply chains are passed to Prebid Server on `source.schain` and passed through to bid adapters. Prebid Server does not currently offer the ability to add a node to the supply chain. + +See +[OpenRTB 2.6, Section 3.2.2 - Object: Source](https://github.com/InteractiveAdvertisingBureau/openrtb2.x/blob/2.6-202501/2.6.md#322---object-source-) +and +[OpenRTB 2.6, Section 3.2.25 - Object: SupplyChain](https://github.com/InteractiveAdvertisingBureau/openrtb2.x/blob/2.6-202501/2.6.md#3225---object-supplychain-) +. Bidder-specific schains: @@ -1011,7 +1017,7 @@ Bidder-specific schains: In this scenario, Prebid Server sends the first schain object to `bidderA` and the second schain object to everyone else. -If there's already an source.ext.schain and a bidder is named in ext.prebid.schains (or covered by the wildcard condition), ext.prebid.schains takes precedent. +If there's already an source.schain and a bidder is named in ext.prebid.schains (or covered by the wildcard condition), ext.prebid.schains takes precedent. ##### User IDs diff --git a/prebid-server/features/pbs-feature-idx.md b/prebid-server/features/pbs-feature-idx.md index ee94695a33..0a9aec4e22 100644 --- a/prebid-server/features/pbs-feature-idx.md +++ b/prebid-server/features/pbs-feature-idx.md @@ -63,8 +63,9 @@ title: Prebid Server | Features | First Party Data | Bidder-specific impression data | Accepts [bidder-specific first party data attributes at the imp-level](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#bidder-specific-impression-level-fpd). | check | check | | First Party Data | AMP first party data | Accepts [first party data attributes on an AMP request](/prebid-server/endpoints/openrtb2/pbs-endpoint-amp.html#first-party-data). | check | check | | [Supply Chain](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#supply-chain-support) | Bidder-specific schains | Accepts bidder-specific schain | check | check | -| Supply Chain | Host SChain | The host company can supply a global schain that's appended to the list of incoming nodes in source.ext.schain. | check | check | -| Supply Chain | ORTB 2.4 compatibility | If source.ext.schain doesn't exist but ext.schain does, PBS copies the latter to the former. | check | | +| Supply Chain | Host SChain | The host company can supply a global schain that's appended to the list of incoming nodes in source.schain. | check | check | +| Supply Chain | ORTB 2.5 compatibility | If source.schain doesn't exist but source.ext.schain does, PBS copies the latter to the former. | check | | +| Supply Chain | ORTB 2.4 compatibility | If source.schain doesn't exist but ext.schain does, PBS copies the latter to the former. | check | | | Publisher Accounts | Core | Ability to enforce that requests coming in have a valid account ID. | check | check | | Publisher Accounts | AMP account parameter | Accept the account parameter on the AMP request. | check | check | | Publisher Accounts | Account-specific TTLs | Allow each account ID to have a custom PBC time-to-live for banner and video. | check | check | From efb47110400329903c3defc558eba0785f59ad0c Mon Sep 17 00:00:00 2001 From: fliccione <165936219+fliccione@users.noreply.github.com> Date: Fri, 21 Mar 2025 06:37:54 +0100 Subject: [PATCH 504/816] Update onetag.md (#5936) * Update onetag.md Add native support in media_types field * Update onetag.md adding multiformat_supported field * Update onetag.md fixed multiformat_supported field value --------- Co-authored-by: f-cali --- dev-docs/bidders/onetag.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/onetag.md b/dev-docs/bidders/onetag.md index e3f144a02e..c230166438 100644 --- a/dev-docs/bidders/onetag.md +++ b/dev-docs/bidders/onetag.md @@ -5,7 +5,7 @@ description: Prebid OneTag Bidder Adaptor pbjs: true pbs: true biddercode: onetag -media_types: banner, video +media_types: banner, video, native tcfeu_supported: true dsa_supported: true gpp_supported: true @@ -17,6 +17,7 @@ floors_supported: true sidebarType: 1 coppa_supported: true privacy_sandbox: topics +multiformat_supported: will-bid-on-one --- From 6f0ae0c2fba2b58e41fcca588ce9778b56b04b5c Mon Sep 17 00:00:00 2001 From: Viktor Dreiling <34981284+3link@users.noreply.github.com> Date: Fri, 21 Mar 2025 17:37:14 +0100 Subject: [PATCH 505/816] fix: Upgrade tj-actions Github action. [CVE-2025-30066] (#5957) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Christoph Bünte --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 53536e800d..4b63e8ff72 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: tj-actions/changed-files@v44 + - uses: tj-actions/changed-files@v46 id: changed-files with: files: '**/*.md' From 7dde2dd2ba4f6f5749f208f1ddea84e4aa7509a3 Mon Sep 17 00:00:00 2001 From: Olena Stepaniuk <92721590+OlenaPostindustria@users.noreply.github.com> Date: Tue, 25 Mar 2025 13:38:29 +0200 Subject: [PATCH 506/816] Mobile: Support Native Impression Tracking (#5873) * docs: add secion about native tracking to ios docs * Android code. * docs: small correction --------- Co-authored-by: Valentin Petrovych --- _includes/mobile/adunit-config-android.md | 36 ++++++++++++++++++++++- _includes/mobile/adunit-config-ios.md | 36 ++++++++++++++++++++++- 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/_includes/mobile/adunit-config-android.md b/_includes/mobile/adunit-config-android.md index aa522f9582..aedd88e520 100644 --- a/_includes/mobile/adunit-config-android.md +++ b/_includes/mobile/adunit-config-android.md @@ -67,4 +67,38 @@ You can set `adPosition` by using the following method: ```kotlin adUnit.setAdPosition(AdPosition.FOOTER); -``` \ No newline at end of file +``` + + +### Native Impression Tracking + +The SDK offers an API that enables impression tracking for the following ad unit types: `BannerAdUnit`, `InterstitialAdUnit`, and `PrebidAdUnit`. An example implementation is provided below: + +`BannerAdUnit`: + +```kotlin +val adView = AdManagerAdView(this) +val adUnit = BannerAdUnit(CONFIG_ID, WIDTH, HEIGHT) +adUnit.activatePrebidImpressionTracker(adView) +``` + +`InterstitialAdUnit`: + +```kotlin +val adUnit = InterstitialAdUnit(CONFIG_ID, 80, 60) +adUnit.activateInterstitialPrebidImpressionTracker() +``` + +`PrebidAdUnit`: + +```kotlin +val prebidAdUnit = PrebidAdUnit(configId) + +// Use this method for banners +prebidAdUnit.activatePrebidImpressionTracker(adView) + +// Use this method for interstitials +prebidAdUnit.activateInterstitialPrebidImpressionTracker() +``` + +**NOTE**: The SDK support only `seatbid[].bid[].burl` as impression tracking URL for now. \ No newline at end of file diff --git a/_includes/mobile/adunit-config-ios.md b/_includes/mobile/adunit-config-ios.md index 7fa4ad9490..3ba61a69b2 100644 --- a/_includes/mobile/adunit-config-ios.md +++ b/_includes/mobile/adunit-config-ios.md @@ -56,4 +56,38 @@ You can set `adPosition` by using the following property: ```swift adUnit.adPosition = .footer -``` \ No newline at end of file +``` + +### Native Impression Tracking + +The SDK offers an API that enables impression tracking for the following ad unit types: `BannerAdUnit`, `InterstitialAdUnit`, and `PrebidAdUnit`. An example implementation is provided below: + +`BannerAdUnit`: + +```swift +let adUnit = BannerAdUnit(configId: CONFIG_ID, size: AD_SIZE) +let gamBanner = GAMBannerView(adSize: GADAdSizeFromCGSize(AD_SIZE)) +adUnit.activatePrebidImpressionTracker(adView: gamBanner) +``` + +`InterstitialAdUnit`: + +```swift +let adUnit = InterstitialAdUnit(configId: CONFIG_ID, minWidthPerc: 50, minHeightPerc: 70) +adUnit.activatePrebidImpressionTracker() +``` + +`PrebidAdUnit`: + +```swift +let adUnit = PrebidAdUnit(configId: CONFIG_ID) + +// Use this method for intersitials +adUnit.activatePrebidInterstitialImpressionTracker() + +// Use this method for banners +let gamBanner = GAMBannerView(adSize: GADAdSizeFromCGSize(AD_SIZE)) +adUnit.activatePrebidAdViewImpressionTracker(adView: gamBanner) +``` + +**NOTE**: The SDK support only `seatbid[].bid[].burl` as impression tracking URL for now. \ No newline at end of file From 6e064f9492720fa2b7dd1ed3b0413d30a6bbd506 Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 25 Mar 2025 15:02:27 -0400 Subject: [PATCH 507/816] PBS module page update (#5961) * PBS module page update fixed braces in example * added endpoints note --- prebid-server/pbs-modules/index.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/prebid-server/pbs-modules/index.md b/prebid-server/pbs-modules/index.md index bae04a3aa3..95b2eae9b5 100644 --- a/prebid-server/pbs-modules/index.md +++ b/prebid-server/pbs-modules/index.md @@ -221,15 +221,18 @@ PBS-Java 3.16 introduced a new A/B testing framework that applies to any module. ... abtest config for other modules ... }], "endpoints": { - "/openrtb2/auction": { - ... - } + ... } - ] - ] -] + } + } +} ``` +{: .alert.alert-info :} +If the execution plans defined at the default account level are acceptable, but a specific account wants to test a module, +just add the `hooks.execution-plan.abtests` object and then `hooks.execution-plan.endpoints: {}`. The empty `endpoints` object will be merged +at runtime with the account default. Leaving the account-specific endpoints completely empty will result in an error. + These are the parameters accepted within the `abtests` object: {: .table .table-bordered .table-striped } From 66a31c15ad2ded1adbfd989cb16f66e72e95368d Mon Sep 17 00:00:00 2001 From: mkomorski Date: Thu, 27 Mar 2025 19:49:23 +0100 Subject: [PATCH 508/816] Add local way of caching VAST XML (#5947) * Add local way of caching VAST XML * update * fix --------- Co-authored-by: Marcin Komorski --- dev-docs/publisher-api-reference/setConfig.md | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/dev-docs/publisher-api-reference/setConfig.md b/dev-docs/publisher-api-reference/setConfig.md index 23cb8c179e..c85ac06772 100644 --- a/dev-docs/publisher-api-reference/setConfig.md +++ b/dev-docs/publisher-api-reference/setConfig.md @@ -1047,20 +1047,23 @@ pbjs.setConfig({ ### Client-side Caching of VAST XML -When serving video ads, VAST XML creatives must be cached on the network so the +When serving video ads, VAST XML creatives must be cached so the video player can retrieve them when it's ready. Players don't obtain the VAST XML from 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: +be retrieved. There are three different flows possible with Prebid.js around VAST XML 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: 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. +* Local client-side caching (Blob URL): + To reduce network traffic to the publisher-defined remote cache location, Prebid allows publishers to locally store the VAST XML of a bid as a blob in the browser's memory. When the `cache.useLocal` option is enabled, Prebid sets the bid’s `videoCacheKey` to the key assigned to the locally stored blob. In this scenario, `bid.vastUrl` becomes a blob URL. {: .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.useLocal | no | boolean | Flag determining whether to locally save VAST XML as a blob | | 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`. | @@ -1134,6 +1137,27 @@ If a batchSize is set to 2 and 5 video responses arrive (within the timeframe sp +As of Prebid.js 10, you can save VAST XML as blob in browser's memory. Here's how to leverage local caching to reduce network traffic while working with an ad server. Using Google Ad Manager (GAM) as an example, no additional configuration of VAST creatives is required within GAM. The existing process of building the GAM VAST ad tag URL and retrieving the VAST wrapper from GAM remains unchanged - except for one key difference. + +Consider the following Prebid configuration: + +```javascript +pbjs.setConfig({ + cache: { + url: 'https://prebid.adnxs.com/pbc/v1/cache', + useLocal: true + } +}); +``` + +When `useLocal` is set to true, the remote cache URL endpoint is never called. However, existing GAM creatives configured with a VAST ad tag URL, such as: + +`` +https://prebid.adnxs.com/pbc/v1/cache?uuid=%%PATTERN:hb_uuid%% +`` + +will continue to function correctly. `hb_uuid` is set to locally assigned blob UUID. If the bid wins the GAM auction and it's `videoCacheKey` (`hb_uuid`) is included in a GAM wrapper VAST XML, Prebid will update the VAST ad tag URL with the locally cached blob URL after receiving a response from Google Ad Manager. + ### Instream tracking {: .alert.alert-info :} From f1b7791f5c36f77eada02a2bbfeec9a65f9f9af3 Mon Sep 17 00:00:00 2001 From: kazutoshi-uekawa-muneee <114455471+kazutoshi-uekawa-muneee@users.noreply.github.com> Date: Mon, 31 Mar 2025 02:48:30 +0900 Subject: [PATCH 509/816] UNIQUEST Bid Adapter: initial release (#5929) * add uniquest bid adapter, analytics adapter * add infomation to uniquest.md --- dev-docs/analytics/uniquest.md | 14 +++++++++++++ dev-docs/bidders/uniquest.md | 36 ++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 dev-docs/analytics/uniquest.md create mode 100644 dev-docs/bidders/uniquest.md diff --git a/dev-docs/analytics/uniquest.md b/dev-docs/analytics/uniquest.md new file mode 100644 index 0000000000..c25bdb1c0f --- /dev/null +++ b/dev-docs/analytics/uniquest.md @@ -0,0 +1,14 @@ +--- +layout: analytics +title: UNIQUEST +description: UNIQUEST Prebid Analytics Adapter +modulecode: uniquest +enable_download: false +--- + +#### Analytics Options + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------|----------|---------------------------|----------|----------| +| `sid` | required | The AdUnit ID from UNIQUEST | `'SID00001'` | `string` | diff --git a/dev-docs/bidders/uniquest.md b/dev-docs/bidders/uniquest.md new file mode 100644 index 0000000000..c82f8a45b2 --- /dev/null +++ b/dev-docs/bidders/uniquest.md @@ -0,0 +1,36 @@ +--- +layout: bidder +title: UNIQUEST +description: Prebid UNIQUEST Bidder Adapter +biddercode: uniquest +pbjs: true +media_types: banner +sidebarType: 1 +safeframes_ok: false +pbs: false +deals_supported: false +tcfeu_supported: false +usp_supported: false +prebid_member: false +coppa_supported: false +schain_supported: false +dchain_supported: false +floors_supported: false +ortb_blocking_supported: false +gpp_sids: none +gvl_id: none +dsa_supported: false +fpd_supported: false +multiformat_supported: none +privacy_sandbox: none +--- + +### Registration +To use this bidder you will need with UNIQUEST. For further information, Please contact us at . + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------|----------|---------------------------|----------|----------| +| `sid` | required | The AdUnit ID from UNIQUEST | `'SID00001'` | `string` | From b063099b7c12a35ebd606ccee702b89016f81567 Mon Sep 17 00:00:00 2001 From: suzuki <70867995+logly-suzuki@users.noreply.github.com> Date: Mon, 31 Mar 2025 23:57:27 +0900 Subject: [PATCH 510/816] remove loglylift adapter (#5953) --- dev-docs/bidders/loglylift.md | 28 ---------------------------- 1 file changed, 28 deletions(-) delete mode 100644 dev-docs/bidders/loglylift.md diff --git a/dev-docs/bidders/loglylift.md b/dev-docs/bidders/loglylift.md deleted file mode 100644 index f15ce42f93..0000000000 --- a/dev-docs/bidders/loglylift.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -layout: bidder -title: LOGLY lift -description: Prebid LOGLY lift Bidder Adaptor -biddercode: loglylift -tcfeu_supported: false -usp_supported: false -coppa_supported: false -schain_supported: false -dchain_supported: false -media_types: banner, native -safeframes_ok: false -deals_supported: false -floors_supported: false -fpd_supported: false -pbjs: true -pbs: false -prebid_member: false -sidebarType: 1 ---- - - -### Bid Params - -{: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|--------|----------|----------------------------------------------------------|----------|-----------| -| `adspotId` | required | adspot id managed by LOGLY lift | `4302078` | `integer` | From 175fb6b8e79d79f04cb8df9de4c7aef11add2c44 Mon Sep 17 00:00:00 2001 From: kazutoshi-uekawa-muneee <114455471+kazutoshi-uekawa-muneee@users.noreply.github.com> Date: Tue, 1 Apr 2025 00:25:21 +0900 Subject: [PATCH 511/816] fix uniquest analytics adapter docs (#5970) --- dev-docs/analytics/uniquest.md | 1 - 1 file changed, 1 deletion(-) diff --git a/dev-docs/analytics/uniquest.md b/dev-docs/analytics/uniquest.md index c25bdb1c0f..e3cc26ed90 100644 --- a/dev-docs/analytics/uniquest.md +++ b/dev-docs/analytics/uniquest.md @@ -3,7 +3,6 @@ layout: analytics title: UNIQUEST description: UNIQUEST Prebid Analytics Adapter modulecode: uniquest -enable_download: false --- #### Analytics Options From c6dc9ad6e9682566b6e7925a4c084fa5a74081e2 Mon Sep 17 00:00:00 2001 From: bretg Date: Mon, 31 Mar 2025 11:25:46 -0400 Subject: [PATCH 512/816] codepath notification docs (#5922) --- dev-docs/bidder-adaptor.md | 6 ++++++ prebid-server/developers/add-a-module-go.md | 4 ++++ prebid-server/developers/add-a-module-java.md | 4 ++++ prebid-server/developers/add-new-bidder-go.md | 6 ++++++ prebid-server/developers/add-new-bidder-java.md | 6 ++++++ 5 files changed, 26 insertions(+) diff --git a/dev-docs/bidder-adaptor.md b/dev-docs/bidder-adaptor.md index f3c6e5ebcd..bfa42399c3 100644 --- a/dev-docs/bidder-adaptor.md +++ b/dev-docs/bidder-adaptor.md @@ -1362,6 +1362,12 @@ Once the inspection passes, the code will be merged and included with the next r The Prebid.org [download page](/download.html) will automatically be updated with your adapter once everything's been merged. +## Optional Code Update Notification + +The core Prebid engineering team sometimes makes changes to bid adapter files for various reasons: general refactoring, internal API changes, bug fixes, etc. If you want to receive an email alert about any changes made to your codebase, you can update the [codepath notification file](https://github.com/prebid/Prebid.js/blob/master/.github/workflows/scripts/codepath-notification). Please read the instructions in the file. In many cases, the regex will just be your biddercode, but if you have a short biddercode, you might need to be more precise or you'll get false notifications. + +Likewise, your bidder documentation can receive alerts by updating the [docs codepath notification file](https://github.com/prebid/prebid.github.io/blob/master/.github/workflows/scripts/codepath-notification). + ## Further Reading * [Prebid.js Repo - Bidder Adapter Sources](https://github.com/prebid/Prebid.js/tree/master/modules) diff --git a/prebid-server/developers/add-a-module-go.md b/prebid-server/developers/add-a-module-go.md index e76374d6a5..1b31e12647 100644 --- a/prebid-server/developers/add-a-module-go.md +++ b/prebid-server/developers/add-a-module-go.md @@ -268,6 +268,10 @@ In the `BidderRequest` or `RawBidderResponse` stage: {:start="5"} 5. More test implementations for each hook can be found in unit-tests at [github.com/prebid/prebid-server/tree/master/modules/prebid/ortb2blocking](https://github.com/prebid/prebid-server/tree/master/modules/prebid/ortb2blocking) folder. +### Optional Code Update Notification + +The core Prebid engineering team sometimes makes changes to module files for various reasons: general refactoring, internal API changes, bug fixes, etc. If you want to receive an email alert about any changes made to your codebase, you can update the [codepath notification file](https://github.com/prebid/prebid-server/blob/master/.github/workflows/scripts/codepath-notification). Please read the instructions in the file. In many cases, the regex will just be your modulecode, but if you have a short modulecode, you might need to be more precise or you'll get false notifications. + ### Configuration It's possible to define default module configuration which can be read by the module at PBS startup. An example configuration for hooks might look like this: diff --git a/prebid-server/developers/add-a-module-java.md b/prebid-server/developers/add-a-module-java.md index cdb00f8815..b457c5241b 100644 --- a/prebid-server/developers/add-a-module-java.md +++ b/prebid-server/developers/add-a-module-java.md @@ -93,6 +93,10 @@ The structure of your module source code inside the modules directory must have +- README.md <- documentation ``` +### Optional Code Update Notification + +The core Prebid engineering team sometimes makes changes to module files for various reasons: general refactoring, internal API changes, bug fixes, etc. If you want to receive an email alert about any changes made to your codebase, you can update the [codepath notification file](https://github.com/prebid/prebid-server-java/blob/master/.github/workflows/scripts/codepath-notification). Please read the instructions in the file. In many cases, the regex will just be your modulecode, but if you have a short modulecode, you might need to be more precise or you'll get false notifications. + ## Module Configuration There are several places to configure a module: diff --git a/prebid-server/developers/add-new-bidder-go.md b/prebid-server/developers/add-new-bidder-go.md index b1c8b618b7..b92351327d 100644 --- a/prebid-server/developers/add-new-bidder-go.md +++ b/prebid-server/developers/add-new-bidder-go.md @@ -1418,6 +1418,12 @@ Notes on the metadata fields: - `openrtb_ext/bidders.go` - `exchange/adapter_builders.go` +### Optional Code Update Notification + +The core Prebid engineering team sometimes makes changes to bid adapter files for various reasons: general refactoring, internal API changes, bug fixes, etc. If you want to receive an email alert about any changes made to your codebase, you can update the [codepath notification file](https://github.com/prebid/prebid-server/blob/master/.github/workflows/scripts/codepath-notification). Please read the instructions in the file. In many cases, the regex will just be your biddercode, but if you have a short biddercode, you might need to be more precise or you'll get false notifications. + +Likewise, your bidder documentation can receive alerts by updating the [docs codepath notification file](https://github.com/prebid/prebid.github.io/blob/master/.github/workflows/scripts/codepath-notification). + ## Contribute Thank you for taking the time to develop a Prebid Server bid adapter. When you're ready, [contribute](https://github.com/prebid/prebid-server/blob/master/docs/developers/contributing.md) your new bid adapter by opening a PR to the [PBS-Go GitHub repository](https://github.com/prebid/prebid-server) with the name "New Adapter: {Bidder}". diff --git a/prebid-server/developers/add-new-bidder-java.md b/prebid-server/developers/add-new-bidder-java.md index 5971683b0b..2b233fc32f 100644 --- a/prebid-server/developers/add-new-bidder-java.md +++ b/prebid-server/developers/add-new-bidder-java.md @@ -1431,6 +1431,12 @@ Notes on the metadata fields: - Register With The Core - `org/prebid/server/spring/config/bidder/{bidder}Configuration.java` +### Optional Code Update Notification + +The core Prebid engineering team sometimes makes changes to bid adapter files for various reasons: general refactoring, internal API changes, bug fixes, etc. If you want to receive an email alert about any changes made to your codebase, you can update the [codepath notification file](https://github.com/prebid/prebid-server-java/blob/master/.github/workflows/scripts/codepath-notification). Please read the instructions in the file. In many cases, the regex will just be your biddercode, but if you have a short biddercode, you might need to be more precise or you'll get false notifications. + +Likewise, your bidder documentation can receive alerts by updating the [docs codepath notification file](https://github.com/prebid/prebid.github.io/blob/master/.github/workflows/scripts/codepath-notification). + ## Contribute Whew! You're almost done. Thank you for taking the time to develop a Prebid Server bid adapter. When you're ready, [contribute](https://github.com/prebid/prebid-server-java/blob/master/docs/developers/contributing.md) your new bid adapter by opening a PR to the [PBS-Java GitHub repository](https://github.com/prebid/prebid-server-java) with the name "New Adapter: {Bidder}". From a705f23ee4577866de654c05eea28ac9c897c417 Mon Sep 17 00:00:00 2001 From: johnwier <49074029+johnwier@users.noreply.github.com> Date: Mon, 31 Mar 2025 08:28:57 -0700 Subject: [PATCH 513/816] add native support (#5932) Co-authored-by: johwier --- dev-docs/bidders/epsilon.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/epsilon.md b/dev-docs/bidders/epsilon.md index 1970221e85..aca745d176 100644 --- a/dev-docs/bidders/epsilon.md +++ b/dev-docs/bidders/epsilon.md @@ -5,7 +5,7 @@ description: Epsilon Prebid Bidder Adaptor (formerly Conversant) pbjs: true pbs: true biddercode: conversant -media_types: banner, video, audio +media_types: banner, video, audio, native tcfeu_supported: true userIds: criteo, id5Id, identityLink, liveIntentId, parrableId, pubCommonId, unifiedId, publinkId prebid_member: true From 72eb5fdbadb0508050ace87466238690dfbd7489 Mon Sep 17 00:00:00 2001 From: Saar Amrani Date: Mon, 31 Mar 2025 22:18:37 +0300 Subject: [PATCH 514/816] disable download on illumin adapter (#5948) --- dev-docs/bidders/illumin.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/illumin.md b/dev-docs/bidders/illumin.md index d8d7bfe70b..fc00073828 100644 --- a/dev-docs/bidders/illumin.md +++ b/dev-docs/bidders/illumin.md @@ -19,6 +19,7 @@ pbs_app_supported: false fpd_supported: false ortb_blocking_supported: false multiformat_supported: will-bid-on-one +enable_download: false pbjs: true sidebarType: 1 --- From 4665848768abc834f2c9a8df126add177eca4f24 Mon Sep 17 00:00:00 2001 From: Miguel Date: Mon, 31 Mar 2025 12:24:01 -0700 Subject: [PATCH 515/816] PAIR: adds TechLab version documentation (#5785) * adds techlab pair documentation * adds matcher/inserter config for pair module --------- Co-authored-by: Miguel Morales --- .../modules/userid-submodules/open-pair.md | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 dev-docs/modules/userid-submodules/open-pair.md diff --git a/dev-docs/modules/userid-submodules/open-pair.md b/dev-docs/modules/userid-submodules/open-pair.md new file mode 100644 index 0000000000..29b5f7e96d --- /dev/null +++ b/dev-docs/modules/userid-submodules/open-pair.md @@ -0,0 +1,91 @@ +--- +layout: userid +title: Open PAIR ID +description: Open PairId User ID sub-module +useridmodule: openPairIdSystem +bidRequestUserId: openPairId +eidsource: pair-protocol.com +example: '"nnjbddb46374634mndjhd78jh"' +--- + +Originally developed by Google and subsequently donated to the industry. +This version supports single and two Data Clean Room setups, in which the advertiser and publisher use different clean rooms. + +(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 [page](https://iabtechlab.com/pair/) for more information about the PAIR protocol. + +Add it to your Prebid.js package with: + +```bash +gulp build --modules=openPairIdSystem +``` + +## 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. | `"openPairId"` | +| params | Optional | Object | Container of all module params. Each entry can be used to configured a specific clean room. | | + +## 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`. + +```javascript + +// should have byte64 value ready in 'pairId' local storage/cookie entry + +pbjs.setConfig({ + userSync: { + userIds: [{ + name: 'openPairId' + }] + } +}); +``` + +Clean rooms may use specific storage keys, this version supports specifying the storage key for any clean room such as the following example. + +```javascript + +// value in 'pairId' local storage/cookie entry will be combined with ids provided by cleanroom liveramp +pbjs.setConfig({ + userSync: { + userIds: [ + { + name: 'openPairId', + params: { + cleanRoomVendor: { + storageKey: '_storage_key' + } + } + } + ] + } +}); +``` + +As per the PAIR specification, you can define the inserter and matcher. + +```javascript +pbjs.setConfig({ + userSync: { + userIds: [ + { + name: 'openPairId', + params: { + inserter: 'some-domain.com', + matcher: 'another-domain.com' + } + } + ] + } +}); +``` From 7b3776d2fd394a811707ce6954ebc6050807acc4 Mon Sep 17 00:00:00 2001 From: Komal Kumari <169047654+pm-komal-kumari@users.noreply.github.com> Date: Tue, 1 Apr 2025 01:00:05 +0530 Subject: [PATCH 516/816] PubMatic RTD Documentation and link added (#5860) * Initial commit : add pubmatic rtd documentation * Remove lint errors * Remove lint error * Update the pubmaticRTD documentation --------- Co-authored-by: Komal Kumari --- dev-docs/modules/pubmaticRtdProvider.md | 81 +++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 dev-docs/modules/pubmaticRtdProvider.md diff --git a/dev-docs/modules/pubmaticRtdProvider.md b/dev-docs/modules/pubmaticRtdProvider.md new file mode 100644 index 0000000000..f02ef2e190 --- /dev/null +++ b/dev-docs/modules/pubmaticRtdProvider.md @@ -0,0 +1,81 @@ +--- +layout: page_v2 +page_type: module +title: PubMatic RTD Provider +display_name: PubMatic RTD Module +description: RTD module for Prebid provided by PubMatic to set dynamic floors +module_type: rtd +module_code: pubmaticRtdProvider +enable_download: true +vendor_specific: true +sidebarType: 1 +--- + +# PubMatic RTD Module +{:.no_toc} + +* TOC +{:toc} + +## Overview + +The PubMatic RTD module fetches pricing floor data and updates the Price Floors Module based on user's context in real-time as per Price Floors Modules Floor Data Provider Interface guidelines [Dynamic Floor Data Provider](https://docs.prebid.org/dev-docs/modules/floors.html#floor-data-provider-interface). + +## Integration + +Step 1: Contact PubMatic to get a publisher ID and create your first profile. + +Step 2: Integrate the PubMatic Analytics Adapter (see Prebid Analytics modules) as well as the Price Floors module. + +Step 3: Prepare the base Prebid file. + +For example: + +To compile the Price Floors, PubMatic RTD module and PubMatic Analytics Adapter into your Prebid build: + +```shell +gulp build --modules=priceFloors,rtdModule,pubmaticRtdProvider,pubmaticAnalyticsAdapter +``` + +{: .alert.alert-info :} +Note: The PubMatic RTD module is dependent on the global real-time data module : `rtdModule`, price floor module : `priceFloors` and PubMatic Analytics Adapter : `pubmaticAnalyticsAdapter`. + +Step 4: Set configuration and enable PubMatic RTD Module using pbjs.setConfig. + +## Configuration + +This module is configured as part of the `realTimeData.dataProviders`. We recommend setting `auctionDelay` to at least 250 ms and make sure `waitForIt` is set to `true` for the `pubmatic` RTD provider. + +```js +const AUCTION_DELAY = 250; +pbjs.setConfig({ + // rest of the config + ..., + realTimeData: { + auctionDelay: AUCTION_DELAY, + dataProviders: [ + { + name: "pubmatic", + waitForIt: true, + params: { + publisherId: ``, // please contact PubMatic to get a publisherId for yourself + profileId: ``, // please contact PubMatic to get a profileId for yourself + }, + }, + ], + }, + // rest of the config + ..., +}); +``` + +## Parameters + +{: .table .table-bordered .table-striped } +| Name | Type | Description | Default | +| :----------------- | :------ | :------------------------------------------------------------- | :------------------------- | +| name | String | Name of the real-time data module | Always `pubmatic` | +| waitForIt | Boolean | Should be `true` if an `auctionDelay` is defined (mandatory) | `false` | +| params | Object | | | +| params.publisherId | String | Publisher ID | | +| params.profileId | String | Profile ID | | From 52aff9eb088d75ad5dbb0822453559272640437d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Sok=C3=B3=C5=82?= <88041828+krzysztofequativ@users.noreply.github.com> Date: Thu, 3 Apr 2025 10:25:00 +0200 Subject: [PATCH 517/816] Equativ Bid Adapter: fixing compatibilities (#5963) * SADR-6590: initial documentation for Equativ JS bid adapter * SADR-6590: doc refinements * Update equativ.md SADR-6590: adjustments to doc from review feedback. * SADR-6590: fix linting issues * SADR-6590: another linting issue * update app.publisher.id * SADR-6590: providing link to Equativ OpenRTB API documentation * SADR-6590: providing additional required fields for documentation * SADR-6590: adding peer answers to questions * SADR-6590: remove FPD section for now * Equativ: updating documentation on bid adapter parameter requirements * SADR-6882: expanding documentation with additional examples * update features * added info about first party data --------- Co-authored-by: Jeff Mahoney --- dev-docs/bidders/equativ.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/dev-docs/bidders/equativ.md b/dev-docs/bidders/equativ.md index b7d550a2c1..c126fe867a 100644 --- a/dev-docs/bidders/equativ.md +++ b/dev-docs/bidders/equativ.md @@ -8,19 +8,19 @@ dsa_supported: true gvl_id: 45 usp_supported: true coppa_supported: true -gpp_sids: tcfeu, usp +gpp_sids: tcfca, tcfeu, usnat, usstate_all, usp schain_supported: true dchain_support: false userIds: all -media_types: banner +media_types: banner, video, native safeframes_ok: true deals_supported: false floors_supported: true -fpd_supported: false +fpd_supported: true pbjs: true -pbs: true +pbs: false prebid_member: false -multiformat_supported: will-bid-on-one +multiformat_supported: will-bid-on-any ortb_blocking_supported: true privacy_sandbox: no sidebarType: 1 @@ -348,6 +348,10 @@ pbjs.que.push(function () { {: .alert.alert-warning :} **Note**: If a demand partner of Equativ is not capable of reading an audio object, the audio object will be converted into a video object with audio mime types. There is, as of this writing, no built-in/default support for serving audio assets in Prebid, so publishers that wish to do so will need to ensure their ad server setups can process whatever hand-offs are necessary. +### First Party Data + +Publishers should use the `ortb2` method of setting [First Party Data](https://docs.prebid.org/features/firstPartyData.html). + ### Additional Resources Information about how Equativ supports the oRTB specification, along with additional examples, can be found [on our OpenRTB API support site](https://help.smartadserver.com/s/article/OpenRTB-API-for-suppliers-Bid-request-specification-Part-1). From 3691f132028d182df08a38c000f156ef862b18b0 Mon Sep 17 00:00:00 2001 From: mkomorski Date: Thu, 3 Apr 2025 12:04:59 +0200 Subject: [PATCH 518/816] version fix (#5980) Co-authored-by: Marcin Komorski --- dev-docs/publisher-api-reference/setConfig.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/publisher-api-reference/setConfig.md b/dev-docs/publisher-api-reference/setConfig.md index c85ac06772..6b39588bb2 100644 --- a/dev-docs/publisher-api-reference/setConfig.md +++ b/dev-docs/publisher-api-reference/setConfig.md @@ -1137,7 +1137,7 @@ If a batchSize is set to 2 and 5 video responses arrive (within the timeframe sp -As of Prebid.js 10, you can save VAST XML as blob in browser's memory. Here's how to leverage local caching to reduce network traffic while working with an ad server. Using Google Ad Manager (GAM) as an example, no additional configuration of VAST creatives is required within GAM. The existing process of building the GAM VAST ad tag URL and retrieving the VAST wrapper from GAM remains unchanged - except for one key difference. +As of Prebid.js 9.37.0, you can save VAST XML as blob in browser's memory. Here's how to leverage local caching to reduce network traffic while working with an ad server. Using Google Ad Manager (GAM) as an example, no additional configuration of VAST creatives is required within GAM. The existing process of building the GAM VAST ad tag URL and retrieving the VAST wrapper from GAM remains unchanged - except for one key difference. Consider the following Prebid configuration: From 96774c7c0394fc2726427485e89a46ea3cd5b301 Mon Sep 17 00:00:00 2001 From: Olena Stepaniuk Date: Thu, 3 Apr 2025 13:41:44 +0300 Subject: [PATCH 519/816] Mobile: Rewarded Ad Unit Enhancements (#5659) * feat: reward earning section * feat: correct old info * feat: in app integration corrections * doc: ios rewarded doc updates * doc: add rewarded server-side configuration doc * feat: add rewarded config url * doc: fix table * doc: table updates * doc: rephrase the intro text * doc: format table. POC code formatting inside the table * doc: corrections * doc: try code tag * doc: use mode code blocks in table * doc: format text * doc: corrections in rewarded-server-side-configuration.md * doc: fix linting errors * doc: fix linting error * doc: update rewarded-server-side-configuration.md * doc: corrections in rewarded-server-side-configuration.md * docs: update ios-sdk-integration-admob.md --------- Co-authored-by: ValentinTeqBlaze Co-authored-by: Yuriy Velichko Co-authored-by: Yurii --- .../rewarded-server-side-configuration.md | 72 +++++++++++++++++++ .../android-sdk-integration-admob.md | 18 ++--- .../rendering/android-sdk-integration-gam.md | 50 +++++++------ .../rendering/android-sdk-integration-max.md | 19 ++--- .../rendering/android-sdk-integration-pb.md | 28 ++++++-- .../rendering/ios-sdk-integration-admob.md | 4 +- .../rendering/ios-sdk-integration-gam.md | 41 ++++++++--- .../rendering/ios-sdk-integration-max.md | 18 ++--- .../rendering/ios-sdk-integration-pb.md | 50 ++++++++++--- .../modules/rendering/modules-rendering.md | 7 +- .../android/code-integration-android.md | 3 +- .../pbm-api/ios/code-integration-ios.md | 3 +- 12 files changed, 232 insertions(+), 81 deletions(-) create mode 100644 _includes/mobile/rewarded-server-side-configuration.md diff --git a/_includes/mobile/rewarded-server-side-configuration.md b/_includes/mobile/rewarded-server-side-configuration.md new file mode 100644 index 0000000000..12ce47d281 --- /dev/null +++ b/_includes/mobile/rewarded-server-side-configuration.md @@ -0,0 +1,72 @@ +##### Server-side Rewarded Ad Unit Configuration + +The Rewarded Ad Unit assumes special behavior that should be configurable by the platform or publisher according to the application or ad experience guides. + +Configuration of rewarded ad unit can be done by defining the Prebid Server [passthrough extension](https://docs.prebid.org/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#request-passthrough) or by using a stored impression-level request on the server. + +Prebid SDK will search for a particular `rwdd` object in `$.seatbid.bid.ext.prebid.passthrough` of bid response to configure the behavior and rendering of the Rewarded Ad Unit. The following table describes the structure and usage purpose of `rwdd` configuration parameters. + +{: .table .table-bordered .table-striped } +| Attribute | Type | Description | Example | +|-----------|------|-------------|---------| +| `reward` | object
    (optional) | Metadata provided by the publisher to describe the reward. |{
     "type": "SuperDollars",
     "count": 10
    }
    | +| `reward.type` | string | Type of the reward in the app's coins. | `"SuperDollars"` | +| `reward.count` | integer | Amount of coins. | `10` | +| `reward.ext` | object | For future extensions. | {
     "ext": {}
    }
    | +| `completion` | object
    (optional) | Describes the condition when the SDK should send a signal to the app that the user has earned the reward. |{
     "video": {
      "endcard": {
       "time": 5
       }
      }
    }
    | +| `completion.banner` | object | Details for banner ad completion. |{
     "time": 5,
     "event": "custom_event_url"
    }
    | +| `completion.banner.time` | integer | Period of time the banner ad is on screen. | `5` | +| `completion.banner.event` | string | URL with custom schema sent by the creative to indicate that the user did earn a reward. | `"rwdd://userDidEarnReward"` | +| `completion.video` | object | Details for video ad completion. |{
     "endcard": {
      "time": 5
     }
    }
    | +| `completion.video.time` | integer | Period of time the video ad is on screen. | `10` | +| `completion.video.playbackevent` | string | The playback event stage in the video. | `"start"`, `"firstquartile"`, `"midpoint"`, `"thirdquartile"`, `"complete"` | +| `completion.video.endcard` | object | Properties for the end card. |{
     "time": 5
    }
    | +| `completion.video.endcard.time` | integer | Period of time the end card is on screen. | `5` | +| `completion.video.endcard.event` | string | URL with custom schema sent by the creative for end card. | `"rwdd://userDidEarnReward"` | +| `close` | object
    (optional) | Describes the ad close behavior after the reward is earned. |{
     "postrewardtime": 3,
     "action": "autoclose"
    }
    | +| `close.postrewardtime` | integer | Time interval (seconds) after reward event when SDK should close interstitial. | `3` | +| `close.action` | string | Action SDK should make: `"autoclose"` (close interstitial) or `"closebutton"` (show close button) | `"autoclose"` | + + +An example of an impression-level stored request: + +```json +{ + "video": { + "h": 480, + "w": 320, + "mimes": ["video/mp4"], + "linearity": 1, + "placement": 2, + "playbackmethod": [2] + }, + "ext": { + "prebid": { + "passthrough": [ + { + "type": "prebidmobilesdk", + "rwdd": { + "reward": { + "type": "SuperDollars", + "count": 10 + }, + "completion": { + "video": { + "endcard": { + "time": 5 + } + } + }, + "close": { + "postrewardtime": 3, + "action": "autoclose" + } + } + } + ] + } + } +} +``` + +More details about the SDK behavior according to the `rwdd` configuration you can find in the [GitHub Proposal](https://github.com/prebid/prebid-mobile-ios/pull/1058). diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-admob.md b/prebid-mobile/modules/rendering/android-sdk-integration-admob.md index cca7f118a0..b5f360f20e 100644 --- a/prebid-mobile/modules/rendering/android-sdk-integration-admob.md +++ b/prebid-mobile/modules/rendering/android-sdk-integration-admob.md @@ -186,9 +186,11 @@ Now you should just make a regular AdMob's ad request. Evetything else will be h Once you receive the ad it will be ready for display. You can show interstitial right in the listener or later according to the app logic. -### Rewarded Video +### Rewarded -Integration example: +{% include mobile/rewarded-server-side-configuration.md %} + +#### Integration example ```kotlin // 1. Create AsRequest @@ -230,32 +232,32 @@ adUnit?.fetchDemand { result -> } ``` -#### Step 1: Create AdRequest +##### Step 1: Create AdRequest {:.no_toc} This step is the same as for the original [AdMob integration](https://developers.google.com/admob/android/rewarded). You don't have to make any modifications here. -#### Step 2: Create AdMobRewardedMediationUtils +##### Step 2: Create AdMobRewardedMediationUtils {:.no_toc} The `AdMobRewardedMediationUtils` is a helper class, which performs certain utilty work for the `MediationInterstitialAdUnit`, like passing the targeting keywords to adapters. -#### Step 3: Create MediationRewardedVideoAdUnit +##### Step 3: Create MediationRewardedVideoAdUnit {:.no_toc} The `MediationRewardedVideoAdUnit` is part of the prebid mediation API. This class is responsible for making bid request and managing the winning bid. -#### Step 4: Make a bid request +##### Step 4: Make a bid request {:.no_toc} The `fetchDemand` method makes a bid request to the prebid server and provides a result in a completion handler. -#### Step 5: Make an ad request +##### Step 5: Make an ad request {:.no_toc} Now you should just make a regular AdMob's ad request. Evetything else will be handled by GMA SDK and prebid adapters. -#### Step 6: Display an ad +##### Step 6: Display an ad {:.no_toc} Once you receive the ad it will be ready for display. You can show interstitial right in the listener or later according to the app logic. diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-gam.md b/prebid-mobile/modules/rendering/android-sdk-integration-gam.md index 502a9d6629..72600a491d 100644 --- a/prebid-mobile/modules/rendering/android-sdk-integration-gam.md +++ b/prebid-mobile/modules/rendering/android-sdk-integration-gam.md @@ -215,9 +215,13 @@ Integration: 4. Remove the original `InterstitialAdUnit`. 5. Follow the instructions to integrate [Interstitial API](#interstitials). -### Rewarded Video +### Rewarded -To display a Rewarded Ad follow these steps: +{% include mobile/rewarded-server-side-configuration.md %} + +#### Integration example + +Displaying the **Rewarded Ad** is the same as displaying an Interstitial Ad, but it adds ability to handle reward. To display a Rewarded Ad follow these steps: ```kotlin // 1. Create a rewarded custom event handler for GAM ad server. @@ -243,21 +247,7 @@ Pay attention that the `loadAd()` should be called on the main thread. {% endcapture %} {% include /alerts/alert_warning.html content=warning_note %} -Displaying the **Rewarded Ad** is the same as displaying an Interstitial Ad. The type of ad can be customized to: - -Be notified when user earns a reward - implement `RewardedAdUnitListener` interface: - -```kotlin - fun onUserEarnedReward(rewardedAdUnit: RewardedAdUnit) -``` - -When the actual reward object is stored in the `RewardedAdUnit`: - -```kotlin -val reward = rewardedAdUnit.getUserReward() -``` - -#### Step 1: Create Event Handler +##### Step 1: Create Event Handler {:.no_toc} GAM's event handlers are special containers that wrap the GAM Ad Views and help to manage collaboration between GAM and Prebid views. @@ -266,7 +256,7 @@ GAM's event handlers are special containers that wrap the GAM Ad Views and help To create an event handler you should provide a GAM Ad Unit. -#### Step 2: Create Rewarded Ad Unit +##### Step 2: Create Rewarded Ad Unit {:.no_toc} **RewardedAdUnit** - is an object that will load and display the particular ad. To create it you should provide @@ -276,12 +266,12 @@ To create an event handler you should provide a GAM Ad Unit. You can also assign the listener for processing ad events. -#### Step 3: Load the Ad +##### Step 3: Load the Ad {:.no_toc} Call the `loadAd()` method to make a bid request. The ad unit will load an ad and will wait for explicit instructions to display the Rewarded Ad. -#### Step 4: Display the Ad when it is ready +##### Step 4: Display the Ad when it is ready {:.no_toc} The most convenient way to determine if the ad is ready for displaying is to listen for the listener method: @@ -292,7 +282,23 @@ override fun onAdLoaded(rewardedAdUnit: RewardedAdUnit) { } ``` -### Migrating rewarded video from a Bidding-Only integration +##### Step 5: Handle a reward +{:.no_toc} + +Handle earning the reward in the appropriate method. Important: a reward can be null. + +```kotlin +override fun onUserEarnedReward(rewardedAdUnit: RewardedAdUnit?, reward: Reward?) { + if (reward != null) { + val rewardType = reward.type + val rewardCount = reward.count + val rewardExt = reward.ext + // Process the reward + } +} +``` + +#### Migrating rewarded video from a Bidding-Only integration {:.no_toc} GAM setup: @@ -306,7 +312,7 @@ Integration: 1. Replace the `RewardedAd` with `RewardedAdUnit`. 2. Implement the interface for `RewardedAdUnitListener`. 3. Remove the original `RewardedVideoAdUnit`. -4. Follow the instructions to integrate [Rewarded API](#rewarded-video). +4. Follow the instructions to integrate [Rewarded API](#rewarded). ## Additional Ad Unit Configuration diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-max.md b/prebid-mobile/modules/rendering/android-sdk-integration-max.md index 715d7830a2..a8fa703109 100644 --- a/prebid-mobile/modules/rendering/android-sdk-integration-max.md +++ b/prebid-mobile/modules/rendering/android-sdk-integration-max.md @@ -161,9 +161,11 @@ Now you should make a regular MAX's ad request. Everything else will be handled Once you receive the ad it will be ready for display. Folow the [MAX instructions](https://dash.applovin.com/documentation/mediation/android/getting-started/interstitials#showing-an-interstitial-ad) about how to do it. -### Rewarded Video +### Rewarded -Integration example: +{% include mobile/rewarded-server-side-configuration.md %} + +#### Integration example ```kotlin // 1. Get an instance of MaxRewardedAd @@ -192,35 +194,36 @@ The way of displaying the rewarded ad is the same as for the Interstitial Ad. To be notified when user earns a reward follow the [MAX intructions](https://dash.applovin.com/documentation/mediation/android/getting-started/rewarded-ads#accessing-the-amount-and-currency-for-a-rewarded-ad). -#### Step 1: Get an instance of MaxRewardedAd +##### Step 1: Get an instance of MaxRewardedAd {:.no_toc} This step is totally the same as for original [MAX integration](https://dash.applovin.com/documentation/mediation/android/getting-started/rewarded-ads). You don't have to make any modifications here. -#### Step 2: Create MaxMediationRewardedUtils +##### Step 2: Create MaxMediationRewardedUtils {:.no_toc} The `MaxMediationRewardedUtils` is a helper class, which performs certain utilty work for the `MediationRewardedVideoAdUnit`, like passing the targeting keywords to the adapters. -#### Step 3: Create MediationRewardedVideoAdUnit +##### Step 3: Create MediationRewardedVideoAdUnit {:.no_toc} The `MediationRewardeVideoAdUnit` is part of the prebid mediation API. This class is responsible for making a bid request and providing a winning bid and targeting keywords to the adapters. -#### Step 4: Make bid request +##### Step 4: Make bid request {:.no_toc} The `fetchDemand` method makes a bid request to the prebid server and provides a result in a completion handler. -#### Step 5: Make an Ad Reuest +##### Step 5: Make an Ad Reuest {:.no_toc} Now you should make a regular MAX's ad request. Everything else will be handled by GMA SDK and prebid adapters. -#### Steps 6: Display an ad +##### Steps 6: Display an ad {:.no_toc} Once the rewarded ad is received you can display it. Folow the [MAX instructions](https://dash.applovin.com/documentation/mediation/android/getting-started/rewarded-ads#showing-a-rewarded-ad) for the details. + ### Native Ads Integration example: diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-pb.md b/prebid-mobile/modules/rendering/android-sdk-integration-pb.md index 6d6334cc88..9d4ac0ca65 100644 --- a/prebid-mobile/modules/rendering/android-sdk-integration-pb.md +++ b/prebid-mobile/modules/rendering/android-sdk-integration-pb.md @@ -192,9 +192,11 @@ override fun onAdLoaded(interstitialAdUnit: InterstitialAdUnit) { } ``` -#### Rewarded Video +#### Rewarded -Integration example: +{% include mobile/rewarded-server-side-configuration.md %} + +##### Integration example ``` kotlin // 1. Create an Ad Unit @@ -215,19 +217,19 @@ Pay attention that the `loadAd()` should be called on the main thread. {% endcapture %} {% include /alerts/alert_warning.html content=warning_note %} -##### Step 1: Create a Rewarded Ad Unit +###### Step 1: Create a Rewarded Ad Unit {:.no_toc} Create the `RewardedAdUnit` object with parameters: - `adUnitId` - an ID of Stored Impression on the Prebid server. -##### Step 2: Load the Ad +###### Step 2: Load the Ad {:.no_toc} Call the `loadAd()` to make a bid request. -##### Step 3: Show the Ad when it is ready +###### Step 3: Show the Ad when it is ready {:.no_toc} Wait until the ad is loaded and present it to the user in any suitable time. @@ -238,6 +240,22 @@ override fun onAdLoaded(rewardedAdUnit: RewardedAdUnit) { } ``` +##### Step 4: Handle a reward +{:.no_toc} + +Handle earning a reward in the appropriate method. Important: a reward can be null. + +```kotlin +override fun onUserEarnedReward(rewardedAdUnit: RewardedAdUnit?, reward: Reward?) { + if (reward != null) { + val rewardType = reward.type + val rewardCount = reward.count + val rewardExt = reward.ext + // Process the reward + } +} +``` + ## Additional Ad Unit Configuration {% include mobile/rendering-adunit-config-android.md %} diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md b/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md index cc899357b9..4d0cab980d 100644 --- a/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md +++ b/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md @@ -235,7 +235,9 @@ Make a regular AdMob's ad request. Everything else will be handled by GMA SDK an Once you receive the ad it will be ready for display. Follow the [AdMob instructions](https://developers.google.com/admob/ios/interstitial#swift) for displaying an ad. -### Rewarded Video +### Rewarded + +{% include mobile/rewarded-server-side-configuration.md %} **Integration example(Swift)**: diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md b/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md index d6198673c1..1075aa4747 100644 --- a/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md +++ b/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md @@ -185,7 +185,7 @@ Call the method `loadAd()` which will make a bid request to Prebid Server. Wait for the Prebid Server to return an ad and show it to the user in any suitable time. ```swift -// MARK: InterstitialRenderingAdUnitDelegate +// MARK: InterstitialAdUnitDelegate func interstitialDidReceiveAd(_ interstitial: InterstitialAdUnit) { // Now the ad is ready for display @@ -208,9 +208,11 @@ Integration: 4. Remove original `InterstitialAdUnit`. 5. Follow the instructions to integrate [Interstitial API](#interstitials). -### Rewarded Video +### Rewarded -Integration example: +{% include mobile/rewarded-server-side-configuration.md %} + +#### Integration example ```swift // 1. Create an Event Handler @@ -238,9 +240,12 @@ The proccess for displaying the Rewarded Ad is the same as for the Interstitial To be notified when a user earns a reward - implement the method of `RewardedAdUnitDelegate`: ```swift -- (void)rewardedAdUserDidEarnReward:(RewardedAdUnit *)rewardedAd; +func rewardedAdUserDidEarnReward(_ rewardedAd: RewardedAdUnit, reward: PrebidReward) {} ``` +##### Step 1: Create Event Handler +{:.no_toc} + The reward object is stored in the `RewardedAdUnit`: {% capture gma12 %}if let reward = rewardedAd.reward as? GoogleMobileAds.AdReward { @@ -254,12 +259,9 @@ The reward object is stored in the `RewardedAdUnit`: {% include code/gma-versions-tabs.html id="gam-reward" gma11=gma11 gma12=gma12 %} -#### Step 1: Create Event Handler -{:.no_toc} - To create an event handler you should provide a **GAM Ad Unit ID**. -#### Step 2: Create Rewarded Ad Unit +##### Step 2: Create Rewarded Ad Unit {:.no_toc} Create the `RewardedAdUnit` object with parameters: @@ -267,12 +269,12 @@ Create the `RewardedAdUnit` object with parameters: - `configID` - an ID of Stored Impression on the Prebid server - `eventHandler` - the instance of rewarded event handler -#### Step 3: Load the Ad +##### Step 3: Load the Ad {:.no_toc} Call the `loadAd()` method which will make a bid request to Prebid server. -#### Step 4: Show the Ad when it is ready +##### Step 4: Show the Ad when it is ready {:.no_toc} Wait for the ad to load and display it to the user in any suitable time. @@ -285,6 +287,23 @@ func rewardedAdDidReceiveAd(_ rewardedAd: RewardedAdUnit) { } ``` +###### Step 4: Handle the reward +{:.no_toc} + +Handle the reward in the appropriate method. + +``` swift +// MARK: RewardedAdUnitDelegate + +func rewardedAdUserDidEarnReward(_ rewardedAd: RewardedAdUnit, reward: PrebidReward) { + let type = reward.type + let count = reward.count + let ext = reward.ext + + // Process the reward +} +``` + #### Migrating Rewarded Video from a Bidding-Only integration GAM setup: @@ -299,7 +318,7 @@ Integration: 2. Implement the protocol `RewardedAdUnitDelegate` in the View Controller. 3. Remove usage of `AdManagerRequest`. 4. Remove original `RewardedVideoAdUnit`. -5. Follow the instructions to integrate [Rewarded API](#rewarded-video). +5. Follow the instructions to integrate [Rewarded API](#rewarded). ## Additional Ad Unit Configuration diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-max.md b/prebid-mobile/modules/rendering/ios-sdk-integration-max.md index 746d660e17..cd3a541f55 100644 --- a/prebid-mobile/modules/rendering/ios-sdk-integration-max.md +++ b/prebid-mobile/modules/rendering/ios-sdk-integration-max.md @@ -148,9 +148,11 @@ Now you should make a regular MAX's ad request. Everything else will be handled Once you receive the ad it will be ready for display. Follow the [MAX instructions](https://dash.applovin.com/documentation/mediation/ios/getting-started/interstitials#showing-an-interstitial-ad) for displaying an ad. -### Rewarded Video +### Rewarded -Integration example: +{% include mobile/rewarded-server-side-configuration.md %} + +#### Integration example ```swift // 1. Get an instance of MARewardedAd @@ -176,32 +178,32 @@ The process for displaying the rewarded ad is the same as for displaying the Int To be notified when a user earns a reward follow the [MAX intructions](https://dash.applovin.com/documentation/mediation/ios/getting-started/rewarded-ads#loading-a-rewarded-ad). -#### Step 1: Get an instance of MARewardedAd +##### Step 1: Get an instance of MARewardedAd {:.no_toc} This step is the same as for the original [MAX integration](https://dash.applovin.com/documentation/mediation/ios/getting-started/rewarded-ads). You don't have to make any modifications here. -#### Step 2: Create MAXMediationRewardedUtils +##### Step 2: Create MAXMediationRewardedUtils {:.no_toc} The `MAXMediationRewardedUtils` is a helper class, which performs certain utilty work for the `MediationRewardedAdUnit`, like passing the targeting keywords to the adapters. -#### Step 3: Create MediationRewardedAdUnit +##### Step 3: Create MediationRewardedAdUnit {:.no_toc} The `MediationRewardedAdUnit` is a part of the Prebid Mediation API. This class is responsible for making a bid request and providing a winning bid and targeting keywords to the adapters. -#### Step 4: Make bid request +##### Step 4: Make bid request {:.no_toc} The `fetchDemand` method makes a bid request to the Prebid Server and provides a result in a completion handler. -#### Step 5: Make an Ad Reuest +##### Step 5: Make an Ad Reuest {:.no_toc} Make a regular MAX's ad request. Everything else will be handled by GMA SDK and prebid adapters. -#### Steps 6: Display an ad +##### Steps 6: Display an ad {:.no_toc} Once the rewarded ad is received you can display it. Follow the [MAX instructions](https://dash.applovin.com/documentation/mediation/ios/getting-started/rewarded-ads#showing-a-rewarded-ad) for the details. diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md b/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md index d41ceb0386..fb6b7e5e55 100644 --- a/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md +++ b/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md @@ -150,16 +150,16 @@ if interstitial.isReady { ``` -The **default** ad format for interstitial is **.banner**. In order to make a `multiformat bid request`, set the respective values into the `adFormats` property. +The **default** ad formats for interstitial are **.banner** and **video**. In order to make a banner-only or video-only 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 and banner ads +// Make bid request for both video and banner ads (default behaviour) adUnit?.adFormats = [.video, .banner] -// Make bid request for banner ad (default behaviour) +// Make bid request for banner ad adUnit?.adFormats = [.banner] ``` @@ -192,9 +192,11 @@ func interstitialDidReceiveAd(_ interstitial: InterstitialRenderingAdUnit) { } ``` -#### Rewarded Video +#### Rewarded -Integration example: +{% include mobile/rewarded-server-side-configuration.md %} + +##### Integration example ``` swift // 1. Create an Ad Unit @@ -212,28 +214,54 @@ if rewardedAd.isReady { } ``` -##### Step 1: Create Rewarded Ad Unit +###### Step 1: Create Rewarded Ad Unit {:.no_toc} -Create the `RewardedAdUnit` object with parameter: +Create the `RewardedAdUnit` object with the parameter: - `configID` - an ID of Stored Impression on the Prebid Server -##### Step 2: Load the Ad +You can also customize ad unit by setting additional properties: + +- `adFormats` - the set of ad formats supported by the ad unit(the default value is `[.banner, .video]` formats); +- `bannerParameters` - the banner parameters used for configuring ad unit; +- `videoParameters` - the video parameters used for configuring ad unit. + +###### Step 2: Load the Ad {:.no_toc} Call the `loadAd()` method which will make a bid request to Prebid server. -##### Step 3: Show the Ad when it is ready +###### Step 3: Show the Ad when it is ready {:.no_toc} -Wait until the ad will be loaded and present it to the user in any suitable time. +Wait until the ad is loaded and present it to the user at any suitable time. ``` swift // MARK: RewardedAdUnitDelegate func rewardedAdDidReceiveAd(_ rewardedAd: RewardedAdUnit) { - // Now the ad is ready for display + // Now the ad is ready for display - call `show` method. + if rewardedAd.isReady { + rewardedAd.show(from: self) + } +} +``` + +###### Step 4: Handle the reward +{:.no_toc} + +Handle the reward in the appropriate method. + +``` swift +// MARK: RewardedAdUnitDelegate + +func rewardedAdUserDidEarnReward(_ rewardedAd: RewardedAdUnit, reward: PrebidReward) { + let type = reward.type + let count = reward.count + let ext = reward.ext + + // Process the reward } ``` diff --git a/prebid-mobile/modules/rendering/modules-rendering.md b/prebid-mobile/modules/rendering/modules-rendering.md index 9d82a5efd6..6b1f2cab98 100644 --- a/prebid-mobile/modules/rendering/modules-rendering.md +++ b/prebid-mobile/modules/rendering/modules-rendering.md @@ -17,7 +17,6 @@ Starting with `1.14.0-beta1` Prebid mobile supports integration with **AdMob**. Starting with `2.0.0` Prebid mobile supports integration with **AppLovin MAX**. - ## Supported Ad Formats Prebid Mobile rendering supports the following ad formats: @@ -26,7 +25,5 @@ Prebid Mobile rendering supports the following ad formats: * Video Banner * Display Interstitial * Video Interstitial -* Rewarded Video - - - +* Display Rewarded +* Video Rewarded diff --git a/prebid-mobile/pbm-api/android/code-integration-android.md b/prebid-mobile/pbm-api/android/code-integration-android.md index 01adcdc33b..4791cf1ac5 100644 --- a/prebid-mobile/pbm-api/android/code-integration-android.md +++ b/prebid-mobile/pbm-api/android/code-integration-android.md @@ -383,7 +383,8 @@ In the table below, you can find Prebid's test IDs that are used in the Demo App |`prebid-demo-video-interstitial-320-480-original-api`|**Video Interstitial** (Original API)|Returns a stored response that contains a Video Interstitial 320x480 winning bid.| |`prebid-demo-video-interstitial-320-480`|**Video Interstitial** (Rendering API)|Returns a stored response that contains a Video Interstitial 320x480 winning bid.| |`prebid-demo-video-rewarded-320-480-original-api`|**Rewarded Video** (Original API)|Returns a stored response that contains a Rewarded Video 320x480 winning bid.| -|`prebid-demo-video-rewarded-320-480`|**Rewarded Video** (Original API)|Returns a stored response that contains a Rewarded Video 320x480 winning bid.| +|`prebid-demo-banner-rewarded-time`|**Rewarded HTML** Returns a stored response that contains a Rewarded HTML 320x480 winning bid with rewarded configuration.|| +|`prebid-demo-video-rewarded-endcard-time`|**Rewarded Video** Returns a stored response that contains a Rewarded Video 320x480 winning bid with rewarded configuration.|| |`sample_video_response`|**Instream Video**|Returns a stored response that contains a Video 320x480 winning bid. Note: on Android we have an [issue](https://github.com/prebid/prebid-mobile-android/issues/517) with Instream Video demo example. When it is fixed the config id will be updated to the new one.| |`prebid-demo-banner-native-styles`|**Native Styles**|Returns a stored response that contains a Native winning bid.| |`prebid-demo-banner-native-styles`|**In-App Native**|Returns a stored response that contains a Native winning bid.| diff --git a/prebid-mobile/pbm-api/ios/code-integration-ios.md b/prebid-mobile/pbm-api/ios/code-integration-ios.md index 84b9f03fe7..c0a7f1c192 100644 --- a/prebid-mobile/pbm-api/ios/code-integration-ios.md +++ b/prebid-mobile/pbm-api/ios/code-integration-ios.md @@ -384,7 +384,8 @@ In the table below, you can find Prebid's test IDs that are used in the Demo App |`prebid-demo-video-interstitial-320-480-original-api`|**Video Interstitial** (Original API)|Returns a stored response that contains a Video Interstitial 320x480 winning bid.| |`prebid-demo-video-interstitial-320-480`|**Video Interstitial** (Rendering API)|Returns a stored response that contains a Video Interstitial 320x480 winning bid.| |`prebid-demo-video-rewarded-320-480-original-api`|**Rewarded Video** (Original API)|Returns a stored response that contains a Rewarded Video 320x480 winning bid.| -|`prebid-demo-video-rewarded-320-480`|**Rewarded Video** (Original API)|Returns a stored response that contains a Rewarded Video 320x480 winning bid.| +|`prebid-demo-banner-rewarded-time`|**Rewarded HTML** Returns a stored response that contains a Rewarded HTML 320x480 winning bid with rewarded configuration.|| +|`prebid-demo-video-rewarded-endcard-time`|**Rewarded Video** Returns a stored response that contains a Rewarded Video 320x480 winning bid with rewarded configuration.|| |`prebid-demo-video-interstitial-320-480`|**Instream Video**|Returns a stored response that contains a Video 320x480 winning bid.| |`prebid-demo-banner-native-styles`|**Native Styles**|Returns a stored response that contains a Native winning bid.| |`prebid-demo-banner-native-styles`|**In-App Native**|Returns a stored response that contains a Native winning bid.| From 7b95786fa8b2edda3f1570c2a7643599eb8484c6 Mon Sep 17 00:00:00 2001 From: Kai Miyamoto <157671757+hogekai@users.noreply.github.com> Date: Fri, 4 Apr 2025 02:38:40 +0900 Subject: [PATCH 520/816] Add renderer reference in ad unit reference (#5969) * Add renderer reference in ad unit reference * Fix markdown lint in ad unit reference * Fix: markdown lint in ad unit reference * Move renderer reference * Fix md lint in renderer reference --- _data/sidebar.yml | 8 + dev-docs/adunit-reference.md | 655 ++++++++++++++++++----------------- dev-docs/renderer.md | 203 +++++++++++ 3 files changed, 545 insertions(+), 321 deletions(-) create mode 100644 dev-docs/renderer.md diff --git a/_data/sidebar.yml b/_data/sidebar.yml index a193c37130..98a4e60a74 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -399,6 +399,14 @@ sectionTitle: subgroup: 3 +- sbSecId: 1 + title: Renderer + link: /dev-docs/renderer.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 3 + - sbSecId: 1 title: Bidder Params link: /dev-docs/bidders.html diff --git a/dev-docs/adunit-reference.md b/dev-docs/adunit-reference.md index 5a6967b77a..9f3c4af33b 100644 --- a/dev-docs/adunit-reference.md +++ b/dev-docs/adunit-reference.md @@ -27,64 +27,64 @@ This page describes the properties of the `adUnit` object. ## AdUnit -See the table below for the list of properties on the ad unit. For example ad units, see the [Examples](#adUnit-examples) below. +See the table below for the list of properties on the ad unit. For example ad units, see the [Examples](#adUnit-examples) below. {: .table .table-bordered .table-striped } -| Name | Scope | Type | Description | +| Name | Scope | Type | Description | |--------------+----------+---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `code` | Required | String | An identifier you create and assign to this ad unit. Generally this is set to the ad slot name or the div element ID. Used by [setTargetingForGPTAsync()](/dev-docs/publisher-api-reference/setTargetingForGPTAsync.html) to match which auction is for which ad slot. | -| `bids` | Optional | Array[Object] | Array of bid objects representing demand partners and associated parameters for a given ad unit. See [Bids](#adUnit.bids) below. | -| `mediaTypes` | Optional | Object | Defines one or more media types that can serve into the ad unit. For a list of properties, see [`adUnit.mediaTypes`](#adUnit.mediaTypes) below. | -| `labelAny` | Optional | Array[String] | Used for [conditional ads][conditionalAds]. Works with `sizeConfig` argument to [pbjs.setConfig][configureResponsive]. | -| `labelAll` | Optional | Array[String] | Used for [conditional ads][conditionalAds]. Works with `sizeConfig` argument to [pbjs.setConfig][configureResponsive]. | -| `ortb2Imp` | Optional | Object | ortb2Imp is used to signal OpenRTB Imp objects at the adUnit grain. Similar to the global ortb2 field used for [global first party data configuration](/dev-docs/publisher-api-reference/setConfig.html#setConfig-fpd), but specific to this adunit.| -| `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](#adunitvideo). | +| `code` | Required | String | An identifier you create and assign to this ad unit. Generally this is set to the ad slot name or the div element ID. Used by [setTargetingForGPTAsync()](/dev-docs/publisher-api-reference/setTargetingForGPTAsync.html) to match which auction is for which ad slot. | +| `bids` | Optional | Array[Object] | Array of bid objects representing demand partners and associated parameters for a given ad unit. See [Bids](#adUnit.bids) below. | +| `mediaTypes` | Optional | Object | Defines one or more media types that can serve into the ad unit. For a list of properties, see [`adUnit.mediaTypes`](#adUnit.mediaTypes) below. | +| `labelAny` | Optional | Array[String] | Used for [conditional ads][conditionalAds]. Works with `sizeConfig` argument to [pbjs.setConfig][configureResponsive]. | +| `labelAll` | Optional | Array[String] | Used for [conditional ads][conditionalAds]. Works with `sizeConfig` argument to [pbjs.setConfig][configureResponsive]. | +| `ortb2Imp` | Optional | Object | ortb2Imp is used to signal OpenRTB Imp objects at the adUnit grain. Similar to the global ortb2 field used for [global first party data configuration](/dev-docs/publisher-api-reference/setConfig.html#setConfig-fpd), but specific to this adunit.| +| `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](#adunitvideo). | | `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 -See the table below for the list of properties in the `bids` array of the ad unit. For example ad units, see the [Examples](#adUnit-examples) below. +See the table below for the list of properties in the `bids` array of the ad unit. For example ad units, see the [Examples](#adUnit-examples) below. Note that `bids` is optional only for [Prebid Server stored impressions](#stored-imp), and required in all other cases. {: .table .table-bordered .table-striped } -| Name | Scope | Type | Description | +| Name | Scope | Type | Description | |------------+----------+---------------+------------------------------------------------------------------------------------------------------------------------------------------| -| `bidder` | Optional | String | Unique code identifying the bidder. For bidder codes, see the [bidder param reference]({{site.baseurl}}/dev-docs/bidders.html). | -| `module` | Optional | String | Module code - for requesting bids from modules that are not bid adapters. See [Prebid Server stored impressions](#stored-imp). | -| `params` | Required | Object | Bid request parameters for a given bidder. For allowed params, see the [bidder param reference]({{site.baseurl}}/dev-docs/bidders.html). | -| `labelAny` | Optional | Array[String] | Used for [conditional ads][conditionalAds]. Works with `sizeConfig` argument to [pbjs.setConfig][configureResponsive]. | -| `labelAll` | Optional | Array[String] | Used for [conditional ads][conditionalAds]. Works with `sizeConfig` argument to [pbjs.setConfig][configureResponsive]. | -| `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. | +| `bidder` | Optional | String | Unique code identifying the bidder. For bidder codes, see the [bidder param reference]({{site.baseurl}}/dev-docs/bidders.html). | +| `module` | Optional | String | Module code - for requesting bids from modules that are not bid adapters. See [Prebid Server stored impressions](#stored-imp). | +| `params` | Required | Object | Bid request parameters for a given bidder. For allowed params, see the [bidder param reference]({{site.baseurl}}/dev-docs/bidders.html). | +| `labelAny` | Optional | Array[String] | Used for [conditional ads][conditionalAds]. Works with `sizeConfig` argument to [pbjs.setConfig][configureResponsive]. | +| `labelAll` | Optional | Array[String] | Used for [conditional ads][conditionalAds]. Works with `sizeConfig` argument to [pbjs.setConfig][configureResponsive]. | +| `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 -See the table below for the list of properties in the `mediaTypes` object of the ad unit. For example ad units showing the different media types, see the [Examples](#adUnit-examples) below. +See the table below for the list of properties in the `mediaTypes` object of the ad unit. For example ad units showing the different media types, see the [Examples](#adUnit-examples) below. {: .table .table-bordered .table-striped } -| Name | Scope | Type | Description | +| Name | Scope | Type | Description | |---------------------------------------+--------------------------------------------------------------------------+--------+------------------------------------------------------------------------------------------------------------------| -| [`banner`](#adUnit.mediaTypes.banner) | At least one of the `banner`, `native`, or `video` objects are required. | Object | Defines properties of a banner ad. For examples, see [`adUnit.mediaTypes.banner`](#adUnit.mediaTypes.banner). | -| [`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). | +| [`banner`](#adUnit.mediaTypes.banner) | At least one of the `banner`, `native`, or `video` objects are required. | Object | Defines properties of a banner ad. For examples, see [`adUnit.mediaTypes.banner`](#adUnit.mediaTypes.banner). | +| [`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 {: .table .table-bordered .table-striped } -| Name | Scope | Type | Description | +| Name | Scope | Type | Description | |---------+----------+---------------------------------------+-----------------------------------------------------------------------------------------| -| `sizes` | Required | Array[Number] or Array[Array[Number]] | All sizes this ad unit can accept. Examples: `[400, 600]`, `[[300, 250], [300, 600]]`. Prebid recommends that the sizes auctioned by Prebid should be the same auctioned by AdX and GAM OpenBidding, which means AdUnit sizes should match the GPT sizes. | -| `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. | +| `sizes` | Required | Array[Number] or Array[Array[Number]] | All sizes this ad unit can accept. Examples: `[400, 600]`, `[[300, 250], [300, 600]]`. Prebid recommends that the sizes auctioned by Prebid should be the same auctioned by AdX and GAM OpenBidding, which means AdUnit sizes should match the GPT sizes. | +| `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. | @@ -99,46 +99,46 @@ See [Prebid Native Implementation](/prebid/native-implementation.html) for detai #### adUnit.mediaTypes.video {: .table .table-bordered .table-striped } -| Name | Scope | Type | Description | +| Name | Scope | Type | Description | |------------------+-------------+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `pos` | Optional | Integer | Ad position on screen, see [OpenRTB 2.5 spec][openRTB]. OpenRTB page position value: 0=unknown, 1=above-the-fold, 3=below-the-fold, 4=header, 5=footer, 6=sidebar, 7=full-screen | -| `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]**. | -| `protocols` | Optional | Array[Integer] | Array of supported video protocols. For list, see [OpenRTB 2.5 spec][openRTB]. **Required by OpenRTB when using [Prebid Server][pbServer]**. | -| `playbackmethod` | Optional | Array[Integer] | Allowed playback methods. If none specified, all are allowed. For list, see [OpenRTB 2.5 spec][openRTB]. **Required by OpenRTB when using [Prebid Server][pbServer]**. | -| `minduration` | Recommended | Integer | Minimum video ad duration in seconds, see [OpenRTB 2.5 spec][openRTB]. | -| `maxduration` | Recommended | Integer | Maximum video ad duration in seconds, see [OpenRTB 2.5 spec][openRTB]. | -| `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]. | -| `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]. | -| `skipafter` | Optional | Integer | Number of seconds a video must play before skipping is enabled; only applicable if the ad is skippable., see [OpenRTB 2.5 spec][openRTB]. | -| `minbitrate` | Optional | Integer | Minimum bit rate in Kbps., see [OpenRTB 2.5 spec][openRTB]. | -| `maxbitrate` | Optional | Integer | Maximum bit rate in Kbps., see [OpenRTB 2.5 spec][openRTB]. | -| `delivery` | Optional | Array[Integer] | Supported delivery methods (e.g., streaming, progressive), see [OpenRTB 2.5 spec][openRTB]. | -| `playbackend` | Optional | Integer | The event that causes playback to end, see [OpenRTB 2.5 spec][openRTB]. | - -If `'video.context'` is set to `'adpod'` then the following parameters are also available. +| `pos` | Optional | Integer | Ad position on screen, see [OpenRTB 2.5 spec][openRTB]. OpenRTB page position value: 0=unknown, 1=above-the-fold, 3=below-the-fold, 4=header, 5=footer, 6=sidebar, 7=full-screen | +| `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]**. | +| `protocols` | Optional | Array[Integer] | Array of supported video protocols. For list, see [OpenRTB 2.5 spec][openRTB]. **Required by OpenRTB when using [Prebid Server][pbServer]**. | +| `playbackmethod` | Optional | Array[Integer] | Allowed playback methods. If none specified, all are allowed. For list, see [OpenRTB 2.5 spec][openRTB]. **Required by OpenRTB when using [Prebid Server][pbServer]**. | +| `minduration` | Recommended | Integer | Minimum video ad duration in seconds, see [OpenRTB 2.5 spec][openRTB]. | +| `maxduration` | Recommended | Integer | Maximum video ad duration in seconds, see [OpenRTB 2.5 spec][openRTB]. | +| `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]. | +| `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]. | +| `skipafter` | Optional | Integer | Number of seconds a video must play before skipping is enabled; only applicable if the ad is skippable., see [OpenRTB 2.5 spec][openRTB]. | +| `minbitrate` | Optional | Integer | Minimum bit rate in Kbps., see [OpenRTB 2.5 spec][openRTB]. | +| `maxbitrate` | Optional | Integer | Maximum bit rate in Kbps., see [OpenRTB 2.5 spec][openRTB]. | +| `delivery` | Optional | Array[Integer] | Supported delivery methods (e.g., streaming, progressive), see [OpenRTB 2.5 spec][openRTB]. | +| `playbackend` | Optional | Integer | The event that causes playback to end, see [OpenRTB 2.5 spec][openRTB]. | + +If `'video.context'` is set to `'adpod'` then the following parameters are also available. {: .table .table-bordered .table-striped } -| Name | Scope | Type | Description | +| Name | Scope | Type | Description | |------------------+-------------+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `adPodDurationSec` | Required | Number | The length of the adpod in seconds. Example: `adPodDurationSec = 120` | -| `durationRangeSec` | Required | Array[Number] | An array of numbers represents a list of the potential/accepted duration values that the creatives can be in the adpod block. Example: `durationRangeSec = [30, 60, 90]` | -| `requireExactDuration` | Optional | Boolean | Whether the returned creatives running time must match the value of `adPodDurationSec`. Example: `requireExactDuration = true` | -| `tvSeriesName` | Optional | String | The name of the television series video the adpod will appear in. Example: `tvSeriesName = 'Once Upon A Time'` | -| `tvEpisodeName` | Optional | String | The name of the episode of the television series video the adpod will appear in. Example: `tvEpisodeName = 'Pilot'` | -| `tvSeasonNumber` | Optional | Number | A number representing the season number of the television series video the adpod will appear in. Example: `tvSeasonNumber = 1` | -| `tvEpisodeNumber` | Optional | Number | A number representing the episode number of the television series video the adpod will appear in. Example: `tvEpisodeNumber = 1` | -| `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'` | +| `adPodDurationSec` | Required | Number | The length of the adpod in seconds. Example: `adPodDurationSec = 120` | +| `durationRangeSec` | Required | Array[Number] | An array of numbers represents a list of the potential/accepted duration values that the creatives can be in the adpod block. Example: `durationRangeSec = [30, 60, 90]` | +| `requireExactDuration` | Optional | Boolean | Whether the returned creatives running time must match the value of `adPodDurationSec`. Example: `requireExactDuration = true` | +| `tvSeriesName` | Optional | String | The name of the television series video the adpod will appear in. Example: `tvSeriesName = 'Once Upon A Time'` | +| `tvEpisodeName` | Optional | String | The name of the episode of the television series video the adpod will appear in. Example: `tvEpisodeName = 'Pilot'` | +| `tvSeasonNumber` | Optional | Number | A number representing the season number of the television series video the adpod will appear in. Example: `tvSeasonNumber = 1` | +| `tvEpisodeNumber` | Optional | Number | A number representing the episode number of the television series video the adpod will appear in. Example: `tvEpisodeNumber = 1` | +| `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'` | @@ -152,9 +152,9 @@ See the table below for the list of properties in the `video` object of the ad u When using the Video Module, the mediaTypes.video properties get filled out automatically. Any values already set by the Publisher will not be replaced by the Video Module. {: .table .table-bordered .table-striped } -| Field | Scope | Type | Description | +| Field | Scope | Type | Description | |----------+--------------------------------------------------------------+--------+--------------------------------------------------------------------------------------------------------------------| -| `divId` | required | string | Unique identifier of the player provider, used to specify which player should be used to render the ad. Equivalent to the HTML Div Id of the player. | +| `divId` | required | string | Unique identifier of the player provider, used to specify which player should be used to render the ad. Equivalent to the HTML Div Id of the player. | | `adServer` | optional | object | Configuration for ad server integration. Supersedes `video.adServer` configurations defined in the Prebid Config. | | `adServer.vendorCode` | required if `adServer` is defined | string | The identifier of the AdServer vendor (i.e. gam, etc). | | `adServer.baseAdTagUrl` | required if `adServer.params` is not defined | string | Your AdServer Ad Tag. The targeting params of the winning bid will be appended. | @@ -163,7 +163,7 @@ When using the Video Module, the mediaTypes.video properties get filled out auto ## Examples * [Banner](#adUnit-banner-example) -* [Video](#adUnit-video-example) +* [Video](#adUnit-video-example) * [With the Video Module](#adUnit-video-module-example) * [Instream Sound-On](#adUnit-video-example-instream) * [Accompanying Content](#adUnit-video-example-accompanying) @@ -178,24 +178,24 @@ When using the Video Module, the mediaTypes.video properties get filled out auto ### 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). +For an example of a banner ad unit, see below. For more detailed instructions, see [Getting Started]({{site.baseurl}}/dev-docs/getting-started.html). ```javascript pbjs.addAdUnits({ - code: slot.code, - mediaTypes: { - banner: { - sizes: [[300, 250]] - } + code: slot.code, + mediaTypes: { + banner: { + sizes: [[300, 250]], }, - bids: [ - { - bidder: 'appnexus', - params: { - placementId: 13144370 - } - } - ] + }, + bids: [ + { + bidder: "appnexus", + params: { + placementId: 13144370, + }, + }, + ], }); ``` @@ -211,23 +211,25 @@ For an example of a video ad unit linked to the Video Module, see below. For mor ```javascript pbjs.addAdUnits({ - code: slot.code, - mediaTypes: { - video: {}, + code: slot.code, + mediaTypes: { + video: {}, + }, + video: { + divId: "playerDiv", + adServer: { + vendorCode: "gam", // constant variable is GAM_VENDOR - see vendorCodes.js in the video library + baseAdTagUrl: "https://pubads.g.doubleclick.net/gampad/ads?iu=/12345/", }, - video: { - divId: 'playerDiv', - adServer: { - vendorCode: 'gam', // constant variable is GAM_VENDOR - see vendorCodes.js in the video library - baseAdTagUrl: 'https://pubads.g.doubleclick.net/gampad/ads?iu=/12345/' - } + }, + bids: [ + { + bidder: "appnexus", + params: { + placementId: 13232361, + }, }, - bids: [{ - bidder: 'appnexus', - params: { - placementId: 13232361 - } - }] + ], }); ``` @@ -239,24 +241,26 @@ For an example of an instream video ad unit that you handle on your own, see bel ```javascript pbjs.addAdUnits({ - code: slot.code, - mediaTypes: { - video: { - context: 'instream', - plcmt: 1, - playerSize: [640, 480], - mimes: ['video/mp4'], - protocols: [1, 2, 3, 4, 5, 6, 7, 8], - playbackmethod: [5], - skip: 1 - }, + code: slot.code, + mediaTypes: { + video: { + context: "instream", + plcmt: 1, + playerSize: [640, 480], + mimes: ["video/mp4"], + protocols: [1, 2, 3, 4, 5, 6, 7, 8], + playbackmethod: [5], + skip: 1, }, - bids: [{ - bidder: 'appnexus', - params: { - placementId: 13232361 - } - }] + }, + bids: [ + { + bidder: "appnexus", + params: { + placementId: 13232361, + }, + }, + ], }); ``` @@ -268,24 +272,26 @@ The IAB calls this scenario "Accompanying Content". Previously, this might have ```javascript pbjs.addAdUnits({ - code: slot.code, - mediaTypes: { - video: { - context: 'instream', - plcmt: 2, - playerSize: [640, 480], - mimes: ['video/mp4'], - protocols: [1, 2, 3, 4, 5, 6, 7, 8], - playbackmethod: [6], - skip: 1 - }, + code: slot.code, + mediaTypes: { + video: { + context: "instream", + plcmt: 2, + playerSize: [640, 480], + mimes: ["video/mp4"], + protocols: [1, 2, 3, 4, 5, 6, 7, 8], + playbackmethod: [6], + skip: 1, }, - bids: [{ - bidder: 'appnexus', - params: { - placementId: 13232361 - } - }] + }, + bids: [ + { + bidder: "appnexus", + params: { + placementId: 13232361, + }, + }, + ], }); ``` @@ -295,7 +301,7 @@ pbjs.addAdUnits({ This is the scenario formerly known as Outstream. As of April 2023, the IAB now calls this scenario "No Content/Standalone". -For an example of an outstream video ad unit that you handle on your own, see below. For more detailed instructions, see [Show Outstream Video Ads]({{site.baseurl}}/dev-docs/show-outstream-video-ads.html). +For an example of an outstream video ad unit that you handle on your own, see below. For more detailed instructions, see [Show Outstream Video Ads]({{site.baseurl}}/dev-docs/show-outstream-video-ads.html). ```javascript pbjs.addAdUnits({ @@ -357,7 +363,7 @@ pbjs.addAdUnits({ #### Adpod (Long-Form) -For an example of an adpod video ad unit that you handle on your own, see below. For more detailed instructions, see [Show Long-Form Video Ads]({{site.baseurl}}/prebid-video/video-long-form.html). +For an example of an adpod video ad unit that you handle on your own, see below. For more detailed instructions, see [Show Long-Form Video Ads]({{site.baseurl}}/prebid-video/video-long-form.html). ```javascript var longFormatAdUnit = { @@ -391,57 +397,63 @@ var longFormatAdUnit = { ### 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). +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). ```javascript pbjs.addAdUnits({ - code: slot.code, - mediaTypes: { - native: { - ortb: { - ver: "1.2", - assets: [{ - required: 1, - img: { - 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, - hmin: 200, - wmin: 267 - } - }] - } - } + code: slot.code, + mediaTypes: { + native: { + ortb: { + ver: "1.2", + assets: [ + { + required: 1, + img: { + 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, + hmin: 200, + wmin: 267, + }, + }, + ], + }, }, - bids: [ - { - bidder: 'appnexus', - params: { - placementId: 13232354 - } - } - ] + }, + bids: [ + { + bidder: "appnexus", + params: { + placementId: 13232354, + }, + }, + ], }); ``` @@ -449,94 +461,97 @@ 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). +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). ```javascript - -pbjs.addAdUnits([{ - code: 'div-banner-native', - mediaTypes: { - banner: { - sizes: [ - [300, 250] - ] - }, - native: { +pbjs.addAdUnits([ + { + code: "div-banner-native", + mediaTypes: { + banner: { + sizes: [[300, 250]], + }, + native: { ortb: { - ver: "1.2", - assets: [{ - required: 1, - img: { + ver: "1.2", + assets: [ + { + required: 1, + img: { type: 1, - hmin: 50 - } - }] - } + hmin: 50, + }, }, + ], }, - bids: [{ - bidder: 'appnexus', - params: { - placementId: 13232392, - } - }] + }, }, - - { - code: 'div-banner-outstream', - mediaTypes: { - banner: { - sizes: [ - [300, 250] - ] - }, - video: { - context: 'outstream', - playerSize: [300, 250] - }, + bids: [ + { + bidder: "appnexus", + params: { + placementId: 13232392, }, - bids: [{ - bidder: 'appnexus', - params: { - placementId: 13232392, - } - }, ] + }, + ], + }, + + { + code: "div-banner-outstream", + mediaTypes: { + banner: { + sizes: [[300, 250]], + }, + video: { + context: "outstream", + playerSize: [300, 250], + }, }, + bids: [ + { + bidder: "appnexus", + params: { + placementId: 13232392, + }, + }, + ], + }, - { - code: 'div-banner-outstream-native', - mediaTypes: { - banner: { - sizes: [ - [300, 250] - ] - }, - native: { + { + code: "div-banner-outstream-native", + mediaTypes: { + banner: { + sizes: [[300, 250]], + }, + native: { ortb: { - ver: "1.2", - assets: [{ - required: 1, - img: { + ver: "1.2", + assets: [ + { + required: 1, + img: { type: 1, - hmin: 50 - } - }] - } - }, - video: { - context: 'outstream', - playerSize: [300, 250] + hmin: 50, + }, }, + ], }, - bids: [{ - bidder: 'appnexus', - params: { - placementId: 13232392, - } - }, ] - } + }, + video: { + context: "outstream", + playerSize: [300, 250], + }, + }, + bids: [ + { + bidder: "appnexus", + params: { + placementId: 13232392, + }, + }, + ], + }, ]); - ``` @@ -605,23 +620,21 @@ Example of an adunit-specific block of first party data and a static floor: ```javascript pbjs.addAdUnits({ - code: "test-div", - mediaTypes: { - banner: { - sizes: [[300,250]] - } + code: "test-div", + mediaTypes: { + banner: { + sizes: [[300, 250]], }, - ortb2Imp: { - bidfloor: 1.00, - bidfloorcur: "EUR", - ext: { - data: { - pbadslot: "homepage-top-rect", - adUnitSpecificContextAttribute: "123" - } - } + }, + ortb2Imp: { + ext: { + data: { + pbadslot: "homepage-top-rect", + adUnitSpecificContextAttribute: "123", + }, }, - // ... + }, + // ... }); ``` @@ -638,16 +651,16 @@ Example of an adunit-specific interstitial signal: ```javascript pbjs.addAdUnits({ - code: "test-div", - mediaTypes: { - banner: { - sizes: [[300,250]] - } - }, - ortb2Imp: { - instl:1 + code: "test-div", + mediaTypes: { + banner: { + sizes: [[300, 250]], }, - // ... + }, + ortb2Imp: { + instl: 1, + }, + // ... }); ``` @@ -661,60 +674,60 @@ When using [PBS stored impressions](/dev-docs/modules/prebidServer.html#stored-i ```javascript pbjs.addAdUnits({ - code: "test-div", - ortb2Imp: { - ext: { - prebid: { - storedrequest: { - id: 'stored-request-id' - } - } - } - } -}) + code: "test-div", + ortb2Imp: { + ext: { + prebid: { + storedrequest: { + id: "stored-request-id", + }, + }, + }, + }, +}); ``` To use stored impressions together with client-side bidders - or stored impressions from other instances of Prebid Server - use `bids[].module`: ```javascript pbjs.addAdUnits({ - code: "test-div", - bids: [ - { - module: "pbsBidAdapter", - params: { - configName: "server-1" + code: "test-div", + bids: [ + { + module: "pbsBidAdapter", + params: { + configName: "server-1", + }, + ortb2Imp: { + ext: { + prebid: { + storedrequest: { + id: "stored-request-server-1", }, - ortb2Imp: { - ext: { - prebid: { - storedrequest: { - id: 'stored-request-server-1' - } - } - } - } + }, }, - { - module: "pbsBidAdapter", - params: { - configName: "server-2" + }, + }, + { + module: "pbsBidAdapter", + params: { + configName: "server-2", + }, + ortb2Imp: { + ext: { + prebid: { + storedrequest: { + id: "stored-request-server-2", }, - ortb2Imp: { - ext: { - prebid: { - storedrequest: { - id: 'stored-request-server-2' - } - } - } - } + }, }, - { - bidder: 'client-bidder', - // ... - } - ] + }, + }, + { + bidder: "client-bidder", + // ... + }, + ], }); ``` diff --git a/dev-docs/renderer.md b/dev-docs/renderer.md new file mode 100644 index 0000000000..879e624eea --- /dev/null +++ b/dev-docs/renderer.md @@ -0,0 +1,203 @@ +--- +layout: page_v2 +title: Renderer +description: Renderer Reference +sidebarType: 1 +--- + +# Renderer + +## What is a Renderer? + +A renderer provides publishers with precise control over how ads are displayed on their pages. It's especially valuable for video ads in non-video placements (such as outstream/in-renderer), but can be used with any media type. + +In simple terms, a renderer offers publishers: + +- The ability to customize how ads appear and behave +- A way to introduce new ad formats without disrupting user experience +- Control over maintaining design consistency between ads and site content + +## Renderer Object + +{: .table .table-bordered .table-striped } +| Name | Scope | Type | Description | +|--------------+----------+---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `url` | Required | String | URL to the renderer script that will be loaded. This script should create a renderer object in the global scope. | +| `render` | Required | Function | Function that tells Prebid.js how to invoke the renderer script to render a bid. The function receives the bid object as a parameter. | +| `backupOnly` | Optional | Boolean | if set to true, buyer or adapter renderer will be preferred | + +## Renderer Implementation Levels + +Renderers can be specified at multiple levels: + +1. MediaType Level (adUnit.mediaTypes.video|banner|native.renderer): If a renderer is associated with a specific mediaType (video, banner, or native), it will be used to display any demand associated with that mediaType. This is the preferred method for all ad types. +2. AdUnit Level (adUnit.renderer): Applied to all bids for this ad unit that don't override it. This is a legacy approach; using the mediaType-level renderer is preferred. +3. Bidder Level (adUnit.bids[].renderer): Applied only to this bidder, overriding adUnit renderer if both exist. +4. Default: If no renderer is specified at any level, Prebid will use the default renderer for the media type, if one exists. For banner and native ads, Prebid.js has built-in default rendering capabilities. + +### Priority Order + +When multiple renderers are defined, the following priority is used: + +1. MediaType Level renderer +2. AdUnit Level renderer +3. Bidder Level renderer +4. Default renderer + +## Special Cases + +### Banner with Custom Renderer + +Although renderers are commonly associated with video ads, they can also be used with banner ads to create custom rendering experiences: + +```javascript +pbjs.addAdUnits({ + code: "custom-banner-container", + mediaTypes: { + banner: { + sizes: [[300, 250]], + renderer: { + url: "https://cdn.example.com/banner-renderer.js", + render: function (bid) { + // Create an enhanced banner experience + const bannerRenderer = new window.BannerRenderer({ + adUnitCode: bid.adUnitCode, + adHtml: bid.ad, + width: bid.width, + height: bid.height, + // Add animation effects + effects: { + fadeIn: true, + duration: 300, + onViewable: true, + }, + }); + bannerRenderer.render(); + }, + }, + }, + }, + bids: [ + { + bidder: "appnexus", + params: { + placementId: 13144370, + }, + }, + ], +}); +``` + +A banner renderer might be used to: + +1. Add entrance/exit animations to standard banner ads +2. Implement viewability-triggered rendering +3. Create interactive enhancements to standard banner creatives +4. Apply custom styling or containers to maintain site design aesthetics +5. Implement fallback scenarios for different devices or browsers + +## Renderer Implementation Example + +```javascript +// Example of a secure custom banner renderer implementation +window.BannerRenderer = function (config) { + return { + render: function (bid) { + // Get the container element + const container = document.getElementById(config.adUnitCode); + if (!container) return; + + // Create iframe to provide a secure environment + const iframe = document.createElement("iframe"); + iframe.width = `${config.width}px`; + iframe.height = `${config.height}px`; + iframe.style.border = "none"; + iframe.style.transition = `opacity ${config.effects.duration}ms ease-in-out`; + iframe.style.opacity = "0"; + iframe.title = "Advertisement"; + iframe.setAttribute("scrolling", "no"); + + // Add iframe to container + container.appendChild(iframe); + + // Set iframe content + const iframeDoc = iframe.contentWindow.document; + iframeDoc.open(); + iframeDoc.write(` + + + + + + + + +
    ${bid.ad || ""}
    + + + `); + iframeDoc.close(); + + if (config.effects.onViewable) { + // Set up IntersectionObserver for viewability-triggered effects + const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + // Apply fade-in when ad comes into view + iframe.style.opacity = "1"; + observer.disconnect(); // Only need to trigger once + } + }); + }, + { threshold: 0.5 } + ); + + observer.observe(container); + } else { + // Immediate fade-in + setTimeout(() => { + iframe.style.opacity = "1"; + }, 10); + } + + // Cleanup function + return { + destroy: function () { + if (container && iframe) { + container.removeChild(iframe); + } + }, + }; + }, + }; +}; +``` + +## Common Renderer Properties + +Here are commonly used properties from the bid object that can be accessed in the renderer: + +{: .table .table-bordered .table-striped } +| Property | Description | +|--------------+------------------------------------------------------- | +| `adId` | Unique identifier for the bid | +| `adUnitCode` | The code for the ad unit | +| `vastUrl` | URL to the VAST XML for video ads | +| `vastXml` | The VAST XML content (if available instead of vastUrl) | +| `width` | Width of the creative | +| `height` | Height of the creative | +| `playerWidth` | Width of the video player | +| `playerHeight` | Height of the video player | +| `mediaType` | Type of media ('video', 'banner', etc.) | +| `cpm` | The bid's CPM | +| `ad` | Ad markup | +| `adUrl` | Ad markup url | From d8705b4e35d7859cde394c0fdecb06a27b849fda Mon Sep 17 00:00:00 2001 From: Jeff Palladino <1226357+jpalladino84@users.noreply.github.com> Date: Thu, 3 Apr 2025 13:35:29 -0600 Subject: [PATCH 521/816] symitriDapRTDProvider - Update docs to handle cases where no identity is avaialble to be shared (#5973) Co-authored-by: Jeff Palladino --- dev-docs/modules/symitriDapRtdProvider.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/dev-docs/modules/symitriDapRtdProvider.md b/dev-docs/modules/symitriDapRtdProvider.md index de52b94551..66211f6908 100644 --- a/dev-docs/modules/symitriDapRtdProvider.md +++ b/dev-docs/modules/symitriDapRtdProvider.md @@ -68,7 +68,7 @@ Please reach out to your Symitri account representative() to | apiVersion | String | This holds the API version | Please reach out to your Symitri account representative() for this value | | domain | String | The domain name of your webpage | | | identityType | String | 'simpleid' or 'compositeid' or 'hashedid' | See the section below labelled "identityType" for more details. | -| identityValue | String | This is optional field to pass user hid. Will be used only if identityType is hid | | +| identityValue | String | This is a required field to pass HEM and/or EIDs | See the "identity" section below for more details. | | segtax | Integer | The taxonomy for Symitri | The value should be 708 | | pixelUrl | String | Pixel URL provided by Symitri which will be triggered when bid matching with Symitri dealid wins and creative gets rendered | | @@ -89,6 +89,19 @@ Use 'compositeid' to pass in multiple identifiers as key-value pairs as shown be "identityValue": "", ``` +### Identity + +In the event there is no identity, the ""identityType" and "identityValue" can be set to: + +```javascript +pbjs.setConfig({ + ... + identityType: 'compositeid', + identityValue: 'HEM:', + ... +}); +``` + ### Testing To view an example of available segments returned by dap: From ba68d3ad758af1e6610a9b0f59066b3aa546364b Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 3 Apr 2025 14:46:13 -0500 Subject: [PATCH 522/816] NewsPassID Bidder Adapter: refactor update docs (#5962) * NewsPassID Bidder Adapter: refactor update docs * Fix markdown lint error with ordered lists * Update for placementId and publisherId * fix flags --- dev-docs/bidders/newspassid.md | 90 ++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 43 deletions(-) diff --git a/dev-docs/bidders/newspassid.md b/dev-docs/bidders/newspassid.md index 1cddd2f8a3..e09b22a326 100644 --- a/dev-docs/bidders/newspassid.md +++ b/dev-docs/bidders/newspassid.md @@ -1,22 +1,18 @@ --- -Module Name: NewspassId Bidder Adapter -Module Type: Bidder Adapter -Maintainer: techsupport@newspassid.com layout: bidder -title: Newspass ID -description: LMC Newspass ID Prebid JS Bidder Adapter +title: NewsPassID +description: Local Media Consortium's NewsPassID Prebid JS Bidder Adapter biddercode: newspassid -tcfeu_supported: false -gvl_id: none +media_types: banner, video, native +gvl_id: 1317 +tcfeu_supported: true usp_supported: true -coppa_supported: false +coppa_supported: true schain_supported: true -dchain_supported: false -userIds: criteo, id5Id, tdid, identityLink, liveIntentId, parrableId, pubCommonId, lotamePanoramaId, sharedId, fabrickId -media_types: banner +userIds: all safeframes_ok: true -deals_supported: true -floors_supported: false +deals_supported: false +floors_supported: true fpd_supported: false pbjs: true pbs: false @@ -27,10 +23,9 @@ sidebarType: 1 ### Description -LMC Newspass ID Prebid JS Bidder Adapter that connects to the NewspassId demand source(s). +LMC NewsPassID Prebid JS Bidder Adapter that connects to the NewsPassID demand source(s). Learn more about the NewsPassID initiative [here](https://www.newspassid.com). -The Newspass bid adapter supports Banner mediaTypes ONLY. -This is intended for USA audiences only, and does not support GDPR +This requires setup on the NewsPassID provider's end before beginning. Don't hesitate to reach out at . ### Bid Params @@ -38,37 +33,46 @@ This is intended for USA audiences only, and does not support GDPR | Name | Scope | Description | Example | Type | |-----------|----------|---------------------------|------------|----------| -| `siteId` | required | The site ID. | `"NPID0000001"` | `string` | -| `publisherId` | required | The publisher ID. | `"4204204201"` | `string` | -| `placementId` | required | The placement ID. | `"0420420421"` | `string` | -| `customData` | optional | publisher key-values used for targeting | `[{"settings":{},"targeting":{"key1": "value1", "key2": "value2"}}],` | `array` | +| `publisherId` | required | The publisher ID in the NewsPassID backend. | `"test-publisher"` | `string` | +| `placementId` | required | The placement ID in the NewsPassID backend. | `"test-group1"` | `string` | -### Test Parameters +### Integration -A test ad unit that will consistently return test creatives: +#### Step 1: Add your NewsPassID accountId to the Prebid.js bidder config before users syncs and initial ads are requested (Recommended) ```javascript -//Banner adUnit - -const adUnits = [{ - code: 'id-of-your-banner-div', - mediaTypes: { - banner: { - sizes: [[300, 250], [300,600]] - } - }, - bids: [{ - bidder: 'newspassid', - params: { - publisherId: 'NEWSPASS0001', /* an ID to identify the publisher account - required */ - siteId: '4204204201', /* An ID used to identify a site within a publisher account - required */ - placementId: '8000000015', /* an ID used to identify the piece of inventory - required - for appnexus test use 13144370. */ - customData: [{"settings": {}, "targeting": {"key": "value", "key2": ["value1", "value2"]}}],/* optional array with 'targeting' placeholder for passing publisher specific key-values for targeting. */ - } - }] - }]; +window.pbjs = window.pbjs || { que: [] }; +window.pbjs.que.push(function() { + window.pbjs.setConfig({ + newspassid: { + publisherId: 'test-publisher' + } + }); +}); ``` -### Note +#### Step 2: Add the `newspassid` bidder and params to your ad unit(s) + +```javascript +const adUnits = [ + { + code: 'id-of-your-banner-div', + mediaTypes: { + banner: { + sizes: [[300, 250]] + } + }, + bids: [ + { + bidder: 'newspassid', + params: { + publisherId: 'test-publisher', /* an ID to identify the publisher account - required if you skip step 1 */ + placementId: 'test-group1' /* An ID used to identify the ad placement configuration within a publisher account - required */ + } + } + ] + } +]; +``` -Please contact us at for any assistance testing your implementation before going live into production. +The `publisherId` and `placementId` are the only params needed for all media types we support. These values are setup by the LMC partnership before you begin. From f865e12fcdb9c8b5b0396245e3640e075ae2f6bc Mon Sep 17 00:00:00 2001 From: Ben Boonsiri Date: Fri, 4 Apr 2025 03:14:02 -0400 Subject: [PATCH 523/816] StackAdapt Bid Adapter: initial release (#5952) merged :) --- dev-docs/bidders/stackadapt.md | 157 +++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 dev-docs/bidders/stackadapt.md diff --git a/dev-docs/bidders/stackadapt.md b/dev-docs/bidders/stackadapt.md new file mode 100644 index 0000000000..08c57e01fa --- /dev/null +++ b/dev-docs/bidders/stackadapt.md @@ -0,0 +1,157 @@ +--- +layout: bidder +title: StackAdapt +description: StackAdapt Prebid Bidder Adapter +biddercode: stackadapt +pbjs: true +pbs: false +gvl_id: 238 +tcfeu_supported: true +usp_supported: true +userId: all +media_types: banner, video +coppa_supported: true +gpp_sids: tcfeu, tcfca, usnat, usstate_all, usp +gpp_supported: true +schain_supported: true +dchain_supported: false +deals_supported: true +floors_supported: true +fpd_supported: true +ortb_blocking_supported: true +multiformat_supported: will-bid-on-any +privacy_sandbox: no +prebid_member: false +sidebarType: 1 +--- + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|-----------------------------|--------------------|----------| +| `publisherId` | required | StackAdapt provided id | `'4cd53a92ra91'` | `string` | +| `placementId` | optional | StackAdapt provided id | `'e95365f397a7'` | `string` | +| `banner` | optional | banner supporting expdir | `{expdir: [1, 3]}` | `object` | +| `bidfloor` | optional | bid floor price | `1.01` | `float` | + +The following banner parameters are supported: + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|----------|----------|-----------------------------------|----------|------------------| +| `expdir` | optional | Directions the banner may expand. | `[1, 3]` | `Array[integer]` | + +### Banner + +#### `mediaTypes.banner` Parameters + +The StackAdapt bid adapter requires `sizes` to be defined in valid format. +See [mediaTypes.banner](https://docs.prebid.org/dev-docs/adunit-reference.html#adUnit.mediaTypes.banner) for defining mediaTypes parameters. + +Below are banner ad unit examples with required and optional parameters: + +```js + var adUnits = [ + // Banner adUnit - required parameters + { + code: 'div-test-ad-1', + mediaTypes: { + banner: { + sizes: [[300, 250]] + } + }, + bids: [{ + bidder: 'stackadapt', + params: { + publisherId: '4cd53a92ra91', + } + }] + }, + // Banner adUnit - including optional parameters + { + code: 'div-test-ad-2', + mediaTypes: { + banner: { + sizes: [[300, 250]], + pos: 1 + } + }, + bids: [{ + bidder: 'stackadapt', + params: { + publisherId: '4cd53a92ra91', + placementId: 'e95365f397a7', + bidfloor: 1.01, + banner: { + expdir: [1, 3] + } + } + }] + } + ]; +``` + +### Video + +#### `mediaTypes.video` Parameters + +The StackAdapt bid adapter requires `mimes`, `protocols`, `maxduration`, `api`, and `plcmt` to be defined in valid format. +See [mediaTypes.video](https://docs.prebid.org/dev-docs/adunit-reference.html#adUnit.mediaTypes.video) for defining mediaTypes parameters. + +Below are video ad unit examples with required and optional parameters: + +```js + var adUnits = [ + // Video adUnit - required parameters + { + code: 'div-test-ad-3', + mediaTypes: { + video: { + mimes: ['video/mp4'], + protocols: [2, 3, 5, 6], + maxduration: 60, + api: [1, 2], + plcmt: 1 + } + }, + bids: [{ + bidder: 'stackadapt', + params: { + publisherId: '4cd53a92ra91', + } + }] + }, + // Video adUnit - including optional parameters + { + code: 'div-test-ad-4', + mediaTypes: { + video: { + playerSize: [640, 360], + mimes: ['video/mp4'], + protocols: [2, 3, 5, 6], + minduration: 1, + maxduration: 60, + api: [1, 2], + playback_method: [1], + plcmt: 1, + startdelay: 1, + pos: 1, + minbitrate: 300, + maxbitrate: 1500, + skip: 1, + skipmin: 5, + skipafter: 15 + } + }, + bids: [{ + bidder: 'stackadapt', + params: { + publisherId: '4cd53a92ra91', + placementId: 'e95365f397a7', + bidfloor: 1.01, + } + }] + } + ]; +``` From 6439acd8604bbbc6d52f69b318d5c830a6a2222e Mon Sep 17 00:00:00 2001 From: Loic Pagny <90603301+lpagnypubstack@users.noreply.github.com> Date: Fri, 4 Apr 2025 11:00:22 +0200 Subject: [PATCH 524/816] Fixing deadlinks (#5978) Fixing deadlinks. Related to issue : https://github.com/prebid/prebid.github.io/issues/5451 Fixed : > Removed : https://kb.Consumableexchange.com > Modified : https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/US-National/IAB%20Privacy%E2%80%99s%20National%20Privacy%20Technical%20Specification.md into https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/US-National/IAB%20Privacy%E2%80%99s%20Multi-State%20Privacy%20Agreement%20(MSPA)%20US%20National%20Technical%20Specification.md > Removed https://onekey.community/ > Removed : https://documentation.help.yahooinc.com/platform/SSP/Sellers/Integrate/Create-an-Easy-OptIn-Optout-Toggle.htm > Modified : https://zeustechnology.com/docs/installation into https://zeustechnology.com > Changed /prebid-server/endpoints/pbs-endpoint-cookieSync.html into ../endpoints/pbs-endpoint-cookieSync.html --- dev-docs/bidders/consumable-server.md | 4 ++-- dev-docs/modules/gppControl_usnat.md | 4 ++-- dev-docs/modules/gppControl_usstates.md | 2 +- dev-docs/modules/userid-submodules/onekey.md | 2 +- dev-docs/modules/userid-submodules/yahoo.md | 2 +- dev-docs/modules/zeusPrimeRtdProvider.md | 2 +- features/mspa-usnat.md | 2 +- prebid-server/developers/pbs-cookie-sync.md | 6 +++--- prebid-server/features/pbs-usgen.md | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/dev-docs/bidders/consumable-server.md b/dev-docs/bidders/consumable-server.md index c9663b2432..cca8613e45 100644 --- a/dev-docs/bidders/consumable-server.md +++ b/dev-docs/bidders/consumable-server.md @@ -66,7 +66,7 @@ Publishers can use Prebid Server in any of the following ways with Consumable. C ### Supported media types -The following table lists the media types that Consumable supports. For information about the the Time-To-Live (TTL) for each media type, see [How Consumable counts impressions](https://kb.Consumableexchange.com/publishers/billing/how_Consumable_counts_impressions.htm) in our Knowledge Base. +The following table lists the media types that Consumable supports. {: .table .table-bordered .table-striped } @@ -156,7 +156,7 @@ To add Consumable as a bidder: ### Bid request parameters -For a list of the OpenRTB fields that Consumable supports in bid requests, see [List of supported OpenRTB bid request fields for sellers](https://kb.Consumableexchange.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. +For a list of the OpenRTB fields that Consumable supports in bid requests, see [List of supported OpenRTB bid request fields for sellers](https://iabtechlab.com/wp-content/uploads/2022/04/OpenRTB-2-6_FINAL.pdf). The following are the required fields for the various supported media types. ### Site (Banner, Video, Audio) You must include these parameters at the bidder level. diff --git a/dev-docs/modules/gppControl_usnat.md b/dev-docs/modules/gppControl_usnat.md index 95bfbb68f4..df2853e3c4 100644 --- a/dev-docs/modules/gppControl_usnat.md +++ b/dev-docs/modules/gppControl_usnat.md @@ -21,7 +21,7 @@ sidebarType : 1 ## Overview -This consent management control module is designed to support the [Global Privacy Platform](https://iabtechlab.com/gpp/) Section 7 string, USNat. For more Prebid-related background, see [Prebid US Compliance Support](/features/mspa-usnat.html). In sum, the USNat string is intended to unify various state laws into a single privacy string, with participants' behavior governed by the IAB's ([MSPA](https://www.iabprivacy.com/#)). It is intended to complement, not replace, the GPP consent management module, which gathers GPP consent strings and makes them available to vendor integrations. The goal is to gather sensible and conservative [activity controls](/dev-docs/activity-controls.html) for elements of Prebid.js given various expressions of the [USNat consent string](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/US-National/IAB%20Privacy%E2%80%99s%20National%20Privacy%20Technical%20Specification.md). +This consent management control module is designed to support the [Global Privacy Platform](https://iabtechlab.com/gpp/) Section 7 string, USNat. For more Prebid-related background, see [Prebid US Compliance Support](/features/mspa-usnat.html). In sum, the USNat string is intended to unify various state laws into a single privacy string, with participants' behavior governed by the IAB's ([MSPA](https://www.iabprivacy.com/#)). It is intended to complement, not replace, the GPP consent management module, which gathers GPP consent strings and makes them available to vendor integrations. The goal is to gather sensible and conservative [activity controls](/dev-docs/activity-controls.html) for elements of Prebid.js given various expressions of the [USNat consent string](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/US-National/IAB%20Privacy%E2%80%99s%20Multi-State%20Privacy%20Agreement%20(MSPA)%20US%20National%20Technical%20Specification.md). This module does not support any other GPP section id or local GPP api. For US state section see the [GPP Control - US State module](/dev-docs/modules/gppControl_usstates.html), Prebid.js encourages publishers to consider with their legal counsel use of the national string over state strings. New state strings are being released, yet national string support is mature and less error prone. In order to control activities in a section without a control module, publishers can express their controls directly in the syntax of the [activity control infrastructure](/dev-docs/activity-controls.html). If a publisher wants finer control over section 7 implications on Prebid.js behavior than this module provides (eg not invalidating certain strings), they are able to achieve that using the activity control syntax as an alternative to this module. @@ -46,7 +46,7 @@ You can also use the [Prebid.js Download](/download.html) page. - [IAB Global Privacy Platform Full Specification Repository](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform) - [IAB Global Privacy Platform CMP API Specification](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Core/CMP%20API%20Specification.md) -- [IAB Global Privacy Platform USNat string Specification](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/US-National/IAB%20Privacy%E2%80%99s%20National%20Privacy%20Technical%20Specification.md) +- [IAB Global Privacy Platform USNat string Specification](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/US-National/IAB%20Privacy%E2%80%99s%20Multi-State%20Privacy%20Agreement%20(MSPA)%20US%20National%20Technical%20Specification.md) - [Prebid US Compliance Support](/features/mspa-usnat.html) - [Prebid Activity Controls](/dev-docs/activity-controls.html) - [Prebid Consent Management - US Privacy Module](/dev-docs/modules/consentManagementUsp.html) diff --git a/dev-docs/modules/gppControl_usstates.md b/dev-docs/modules/gppControl_usstates.md index 7a434886d8..d15c603fd7 100644 --- a/dev-docs/modules/gppControl_usstates.md +++ b/dev-docs/modules/gppControl_usstates.md @@ -117,7 +117,7 @@ You can also use the [Prebid.js Download](/download.html) page. - [IAB Global Privacy Platform Full Specification Repository](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform) - [IAB Global Privacy Platform CMP API Specification](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Core/CMP%20API%20Specification.md) -- [IAB Global Privacy Platform USNat string Specification](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/US-National/IAB%20Privacy%E2%80%99s%20National%20Privacy%20Technical%20Specification.md) +- [IAB Global Privacy Platform USNat string Specification](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/US-National/IAB%20Privacy%E2%80%99s%20Multi-State%20Privacy%20Agreement%20(MSPA)%20US%20National%20Technical%20Specification.md - [Prebid US Compliance Support](/features/mspa-usnat.html) - [Prebid Activity Controls](/dev-docs/activity-controls.html) - [Prebid Consent Management - US Privacy Module](/dev-docs/modules/consentManagementUsp.html) diff --git a/dev-docs/modules/userid-submodules/onekey.md b/dev-docs/modules/userid-submodules/onekey.md index f371228764..5577abfe23 100644 --- a/dev-docs/modules/userid-submodules/onekey.md +++ b/dev-docs/modules/userid-submodules/onekey.md @@ -28,7 +28,7 @@ gulp build –modules=userId,oneKeyIdSystem ## OneKey Registration OneKey is a community based Framework with a decentralized approach. -Go to [onekey.community](https://onekey.community/) for more details. +Go to onekey.community for more details. ## OneKey Configuration diff --git a/dev-docs/modules/userid-submodules/yahoo.md b/dev-docs/modules/userid-submodules/yahoo.md index acf31747a9..34a983de36 100644 --- a/dev-docs/modules/userid-submodules/yahoo.md +++ b/dev-docs/modules/userid-submodules/yahoo.md @@ -101,7 +101,7 @@ Follow the steps below to check that ConnectIDs are being successfully retrieved 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. +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 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. diff --git a/dev-docs/modules/zeusPrimeRtdProvider.md b/dev-docs/modules/zeusPrimeRtdProvider.md index 338bcee32a..ada1fb6bd8 100644 --- a/dev-docs/modules/zeusPrimeRtdProvider.md +++ b/dev-docs/modules/zeusPrimeRtdProvider.md @@ -69,4 +69,4 @@ Zeus Prime requires the gamId parameter, or the Google Ad Manager Network Code, ## Troubleshooting -For troubleshooting steps and guides to assist with verifying your Zeus Prime installation, see our [installation documentation](https://zeustechnology.com/docs/installation). +For troubleshooting steps and guides to assist with verifying your Zeus Prime installation, see our [installation documentation](https://zeustechnology.com/). diff --git a/features/mspa-usnat.md b/features/mspa-usnat.md index 635783088d..aec0269dac 100644 --- a/features/mspa-usnat.md +++ b/features/mspa-usnat.md @@ -193,7 +193,7 @@ This table documents the default blocks of boolean logic that indicate whether a | transmitPreciseGeo | MspaServiceProviderMode=1 OR
    GPC=1 OR
    SensitiveDataProcessingOptOutNotice=2 OR
    SensitiveDataLimitUseNotice=2 OR
    ((SensitiveDataProcessingOptOutNotice=0 OR SensitiveDataLimitUseNotice=0) AND SensitiveDataProcessing[8]=2)
    SensitiveDataProcessing[8]=1 OR
    KnownChildSensitiveDataConsents[2]==1 OR
    KnownChildSensitiveDataConsents[2]==2 OR
    KnownChildSensitiveDataConsents[1]=1 OR
    PersonalDataConsents=2 | Round IP address and lat/long in both device.geo and user.geo when the activity is not allowed.

    The difference in this logic is that it includes "sensitive data 8" (geo) and does not include the UFPD- and ID-related fields. | | transmitTid | n/a | Sending transaction IDs is not an aspect of USNat. | -NOTE -- Here's what the numbers in the logic above indicate in the [IAB GPP USNat specification](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/US-National/IAB%20Privacy%E2%80%99s%20National%20Privacy%20Technical%20Specification.md): +NOTE -- Here's what the numbers in the logic above indicate in the [IAB GPP USNat specification](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/US-National/IAB%20Privacy%E2%80%99s%20Multi-State%20Privacy%20Agreement%20(MSPA)%20US%20National%20Technical%20Specification.md: MspaServiceProviderMode: diff --git a/prebid-server/developers/pbs-cookie-sync.md b/prebid-server/developers/pbs-cookie-sync.md index 04bf2856dd..b97d7e3b02 100644 --- a/prebid-server/developers/pbs-cookie-sync.md +++ b/prebid-server/developers/pbs-cookie-sync.md @@ -33,7 +33,7 @@ Here's how these IDs get placed in the cookie from Prebid.js: ![Prebid Server Cookie Sync](/assets/images/prebid-server/pbs-cookie-sync.png){:class="pb-lg-img"} -1. When the [s2sConfig](/dev-docs/modules/prebidServer.html) is set, Prebid.js initiates a call to the Prebid Server [`/cookie_sync`](/prebid-server/endpoints/pbs-endpoint-cookieSync.html), letting it know which server-side bidders will be participating in the header bidding auction. +1. When the [s2sConfig](/dev-docs/modules/prebidServer.html) is set, Prebid.js initiates a call to the Prebid Server [`/cookie_sync`](../endpoints/pbs-endpoint-cookieSync.html), letting it know which server-side bidders will be participating in the header bidding auction. ```text POST https://prebid-server.example.com/cookie_sync @@ -78,10 +78,10 @@ This is how to control the coop syncing behavior from Prebid.js: ### Manually initiating a sync -Where Prebid.js isn't present, like on [AMP](/prebid-server/use-cases/pbs-amp.html) pages, the call to [/cookie_sync](prebid-server/endpoints/pbs-endpoint-cookieSync.html) doesn't happen automatically. +Where Prebid.js isn't present, like on [AMP](/prebid-server/use-cases/pbs-amp.html) pages, the call to [/cookie_sync](../endpoints/pbs-endpoint-cookieSync.html) doesn't happen automatically. If there are scenarios where Prebid.js isn't around to initiate the /cookie_sync call, publishers can choose to put an iframe on their page. -This approach works in a way quite similar to Prebid.js except that the [/cookie_sync endpoint](/prebid-server/endpoints/pbs-endpoint-cookieSync.html) is initiated by a separate script that's part of `load-cookie.html'. This file must be placed on a CDN by the publisher's Prebid Server host company. Up until July 2024, the script existed in the [Prebid Universal Creative](https://github.com/prebid/prebid-universal-creative) repository, but has since been moved to the [user-sync](https://github.com/prebid/user-sync) repo. +This approach works in a way quite similar to Prebid.js except that the [/cookie_sync endpoint](../endpoints/pbs-endpoint-cookieSync.html) is initiated by a separate script that's part of `load-cookie.html'. This file must be placed on a CDN by the publisher's Prebid Server host company. Up until July 2024, the script existed in the [Prebid Universal Creative](https://github.com/prebid/prebid-universal-creative) repository, but has since been moved to the [user-sync](https://github.com/prebid/user-sync) repo. 1. The Prebid Server hosting company places the [load-cookie.html](#manually-initiating-a-sync) file onto a CDN. diff --git a/prebid-server/features/pbs-usgen.md b/prebid-server/features/pbs-usgen.md index bfe61d2481..5273f9ddce 100644 --- a/prebid-server/features/pbs-usgen.md +++ b/prebid-server/features/pbs-usgen.md @@ -178,4 +178,4 @@ Additional information about the outcoming of privacy module processing can be o * [Prebid US Compliance Support](/features/mspa-usnat.html) * [US Custom Logic Privacy Module](/prebid-server/features/pbs-uscustomlogic.html) * [Activity Control system](/prebid-server/features/pbs-activitycontrols.html) -* [IAB US National Privacy Specification](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/US-National/IAB%20Privacy%E2%80%99s%20National%20Privacy%20Technical%20Specification.md) +* [IAB US National Privacy Specification](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/US-National/IAB%20Privacy%E2%80%99s%20Multi-State%20Privacy%20Agreement%20(MSPA)%20US%20National%20Technical%20Specification.md) From 08cdd6200891b0fa89bcf8712c8ce61c77ed2529 Mon Sep 17 00:00:00 2001 From: Loic Pagny <90603301+lpagnypubstack@users.noreply.github.com> Date: Fri, 4 Apr 2025 11:02:47 +0200 Subject: [PATCH 525/816] Update Analytic Page based on bidder page (#5971) Redesign the analytics homepage using the bidder homepage as a reference : - Introduce a search bar for analytics modules. - Organize analytics modules in alphabetical order. - Dedicated page for each module with redirection functionality. Related to issue : https://github.com/prebid/prebid.github.io/issues/5359 --- overview/analytics.md | 116 +++++++++++++++++++++++++++++++++++------- 1 file changed, 99 insertions(+), 17 deletions(-) diff --git a/overview/analytics.md b/overview/analytics.md index 27240f2bb3..39b940802e 100644 --- a/overview/analytics.md +++ b/overview/analytics.md @@ -50,30 +50,112 @@ pbjs.que.push(function() { {% assign analytics_pages = site.pages | where: "layout", "analytics" %} -