+ ##hb_native_asset_id_1## +
+##hb_native_asset_id_9##
+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/.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 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f72c668240..4b63e8ff72 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@v46 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" 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..f3857c7a79 --- /dev/null +++ b/.github/workflows/scripts/codepath-notification @@ -0,0 +1,18 @@ +# 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 +/dev-docs/bidders/teads : tech-ssp-video@teads.tv +/dev-docs/bidders/kargo : kraken@kargo.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: +
{{ include.html | xml_escape}}
+ {{ include.js }}
+ <html>
+ <head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta http-equiv="X-UA-Compatible" content="ie=edge">
+ <title>{{ page.title }}</title>
+
+ <!-- required scripts -->
+ {% assign scripts = include.scripts | split: "," %}{% for script in scripts %}{% if script == "pbjs" %}<script async src="https://cdn.jsdelivr.net/npm/prebid.js@latest/dist/not-for-prod/prebid.js"></script>
+ {% elsif script == "gpt" %}<script async src="https://securepubads.g.doubleclick.net/tag/js/gpt.js"></script>
+ {% elsif script == "astjs" %}<script async src="https://adsdk.microsoft.com/ast/ast.js"></script>{% else %}<!-- unknown script tag '{{ script }}' required -->{% endif %}{% else %}<script async src="//cdn.jsdelivr.net/npm/prebid.js@latest/dist/not-for-prod/prebid.js"></script>
+ <script async src="https://securepubads.g.doubleclick.net/tag/js/gpt.js"></script>{% endfor %}
+ </head>
+ <body>
+
+ <!-- javascript -->
+ <script>{{ include.js }}</script>
+
+ <!-- html -->
+ {{ include.html | xml_escape}}
+ </body>
+</html>
+
+ 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 @@- In the JSFiddle example below: -
| Module | +{{ page.useridmodule }} | +
|---|---|
| EID Source | +{{ page.eidsource }} | +
| bidRequest.userId | +{{ page.bidRequestUserId }} | +
| Example | +{{ page.example }} |
+
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}
-
+## 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
+### 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.
-
-
-
-### Set Targeting Keywords
-
-The **Custom targeting** property should contain a special keyword with the price of winning bid. The same as a Rate of the Line Item.
-
-
-
-## Step 3: Prepare Prebid Creative
-
-### Display Banner, Video Banner, Display Interstitial, Video Interstitial
-
-The Prebid SDK integrates with GAM basing on [App Events](https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner#app_events) feature, almost for all ad formats. That means that creative should contain a special tag that will be processed by Prebid's GAM Event Handlers.
-
-If GAM Event Handler receives the `PrebidAppEvent` event it will render the winning bid. Otherwise the control will be passed to the GAM Ad View and it will render the received creative.
+Here's the body of the creative:
``` html
```
+TBD - what's `bidid`?
+
+It will look something like this in GAM interface:
+
+{: .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:
+
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..b95e83f50f 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
-Make sure that the `Custom Parameters` field contain expecting targetting keywords of the winning bid:
+Make sure that the `Custom Parameters` field contains the expected targeting 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..a4a1ca87ac 100644
--- a/adops/setting-up-prebid-video-in-dfp.md
+++ b/adops/setting-up-prebid-video-in-dfp.md
@@ -8,21 +8,28 @@ 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).
{: .alert.alert-info :}
For engineering setup instructions, see [Show Video Ads with a Google Ad Manager Video Tag](/dev-docs/show-video-with-a-dfp-video-tag.html).
-Each VAST creative contains a URL that points to the cached VAST XML. (This is because most video players can only work with a URL that returns VAST XML.) When setting up video creatives, it's important to understand where the VAST XML is stored for each of your bidders. The most common place to store VAST XML is the AppNexus cache, but some bidders (such as RubiconProject and SpotX) use their own cache services. To support such bidders, see [Multiple Cache Locations](#multiple-cache-locations) below.
+Each VAST creative contains a URL that points to the cached VAST XML. (This is because most video players can only work with a URL that returns VAST XML.) When setting up video creatives, it's important to understand where the VAST XML is stored for each of your bidders. Prebid.js supports server-side, client-side, and local caching as outlined in [pbjs.setConfig documentation](/dev-docs/publisher-api-reference/setConfig.html#client-side-caching-of-vast-xml). See [Multiple Cache Locations](#multiple-cache-locations) below for details on bidder-specific cache locations.
## Single Cache Location
@@ -48,7 +55,7 @@ Google Ad Manager will show you a warning stating that fetching VAST from the cr
If you’re using a Send Top Price Bid configuration, then the VAST URL will be the same for each bidder:
-`https://prebid.adnxs.com/pbc/v1/cache?uuid=%%PATTERN:hb_uuid%%`
+`https://my-pbs.example.com/cache?uuid=%%PATTERN:hb_uuid%%`
or
@@ -56,7 +63,7 @@ or
If you’re using Send All Bids, the VAST URL will include the bidder-specific targeting variable. Be sure to replace `BIDDERCODE` with the actual bidder code for your bidders:
-`https://prebid.adnxs.com/pbc/v1/cache?uuid=%%PATTERN:hb_uuid_BIDDERCODE%%`
+`https://my-pbs.example.com/cache?uuid=%%PATTERN:hb_uuid_BIDDERCODE%%`
or
@@ -66,11 +73,11 @@ or
If your creative is for long-form (OTT) video, you must include a prefix in your VAST URL. For example (Send Top Price Bid):
-`https://prebid.adnxs.com/pbc/v1/cache?uuid=50.00_news_30s_%%PATTERN:hb_cache_id%%`
+`https://my-pbs.example.com/cache?uuid=50.00_news_30s_%%PATTERN:hb_cache_id%%`
or (Send All Bids):
-`https://prebid.adnxs.com/pbc/v1/cache?uuid=50.00_news_30s_%%PATTERN:hb_cache_id_BIDDERCODE%%`
+`https://my-pbs.example.com/cache?uuid=50.00_news_30s_%%PATTERN:hb_cache_id_BIDDERCODE%%`
In these examples, the `uuid` is set to the value of the `hb_pb_cat_dur` key you target in your line item. This value consists of the price bucket, label (for competitive exculsions), and video duration. In this example we've specified a price bucket of `50.00`, a label of `news`, and a duration of `30s`. See [GAM with Prebid Step by Step](/adops/step-by-step.html#targeting) for more information.
@@ -79,7 +86,7 @@ In these examples, the `uuid` is set to the value of the `hb_pb_cat_dur` key you
The resulting creative should look something like the following:
-
+!
{:start="7"}
7. If you're using jsdelivr, set your **Associated ad technology provider**:
@@ -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..a0a9ade18e 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.
@@ -131,7 +136,7 @@ The scheme, host, and path should point to your Prebid Server cache. For instanc
utilize Xandr's AppNexus cache:
```text
-https://prebid.adnxs.com/pbc/v1/cache
+https://prebid.example.com/pbc/v1/cache
```
The query should have one key-value items:
@@ -147,13 +152,13 @@ The second macro, `#{request.keyValue(“hb_cache_id”)`, formats the unique Pr
In real-time, when the dynamic URL is formatted it will appear like:
```text
-https://prebid.adnxs.com/pbc/v1/cache?uuid=12.00_391_30s_6c422e51-46cf-4b0a-ae41-64c61c1ca125
+https://prebid.example.com/pbc/v1/cache?uuid=12.00_391_30s_6c422e51-46cf-4b0a-ae41-64c61c1ca125
```
In order for the above URL to format correctly ensure that the URL in the text box appears as:
```text
-https://prebid.adnxs.com/pbc/v1/cache?uuid=#{ad.placement.name}_#{request.keyValue("hb_cache_id")}
+https://prebid.example.com/pbc/v1/cache?uuid=#{ad.placement.name}_#{request.keyValue("hb_cache_id")}
```
Your ad ops should now be completed and set up for premium long-form video.
diff --git a/adops/setting-up-prebid-with-the-appnexus-ad-server.md b/adops/setting-up-prebid-with-the-appnexus-ad-server.md
index 43aa5ca4c1..cfff8b85d0 100644
--- a/adops/setting-up-prebid-with-the-appnexus-ad-server.md
+++ b/adops/setting-up-prebid-with-the-appnexus-ad-server.md
@@ -80,7 +80,7 @@ Follow the banner creative setup instructions in [Add Creatives](https://docs.xa
* Self-Audit the creative and confirm compliance.
```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` |
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 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 %}
'
+ }
+ }]
+ }
+ })
+ })
\ No newline at end of file
diff --git a/dev-docs/examples/legacy-browser-example.md b/dev-docs/examples/legacy-browser-example.md
deleted file mode 100644
index cae6e4c6c0..0000000000
--- a/dev-docs/examples/legacy-browser-example.md
+++ /dev/null
@@ -1,19 +0,0 @@
----
-layout: example
-title: Legacy Browser Support
-description: Legacy Browser Support
-
-sidebarType: 1
-
-about:
-- In Prebid 6.0, support for legacy browsers is no longer assured.
-- Publishers may conditionally deploy the 5.x branch and add polyfills
-- One strategy to do this is simply the module/nomodule approach discussed here https://philipwalton.com/articles/deploying-es2015-code-in-production-today/
-- Another strategy is to detect the user agent or the 'currentScript' mechanism as described here https://stackoverflow.com/questions/29987969/how-to-load-a-script-only-in-ie
-- Another strategy is to conditionally serve one file or another based on instructions to your cdn
-
-jsfiddle_link: jsfiddle.net/Prebid_Examples/kqe8L2jf/embedded/html,result
-
-code_height: 3050
-
----
diff --git a/dev-docs/examples/meta-bid-filtering.md b/dev-docs/examples/meta-bid-filtering.md
index f31e6bcd0c..7ff0d28077 100644
--- a/dev-docs/examples/meta-bid-filtering.md
+++ b/dev-docs/examples/meta-bid-filtering.md
@@ -8,8 +8,106 @@ sidebarType: 1
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.
+- Please note that we recommend a dedicated module for this case. See Bid Response Filter
-jsfiddle_link: jsfiddle.net/Prebid_Examples/0s4eug1d/embedded/html,result
-
-code_height: 2300
---
+
+## Meta Bid Filtering
+
+{% capture htmlCodePrebid %}No response
+ +No response
+ +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)
diff --git a/dev-docs/getting-started.md b/dev-docs/getting-started.md
index 0990fa77b7..7a770f5d5b 100644
--- a/dev-docs/getting-started.md
+++ b/dev-docs/getting-started.md
@@ -15,7 +15,7 @@ sidebarType: 1
## Overview
-To run heading bidding on your site with Prebid.js you need to [download the Prebid.js package](/download.html), including your selected bidders and adapters, and add the code to your page. This code will gather bids from your selected demand sources (bidders) and pass the information on to your ad server. For full details on how Prebid.js works, see [What is Prebid.js?](/prebid/prebidjs.html).
+To run header bidding on your site with Prebid.js you need to [download the Prebid.js package](/download.html), including your selected bidders and adapters, and add the code to your page. This code will gather bids from your selected demand sources (bidders) and pass the information on to your ad server. For full details on how Prebid.js works, see [What is Prebid.js?](/prebid/prebidjs.html).
Developers should work with their ad ops team to plan out your Prebid configuration. You'll need to add information to your code regarding things such as:
diff --git a/dev-docs/integrate-with-the-prebid-analytics-api.md b/dev-docs/integrate-with-the-prebid-analytics-api.md
index ba1a9dfb42..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
@@ -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
diff --git a/dev-docs/modules/1plusXRtdProvider.md b/dev-docs/modules/1plusXRtdProvider.md
index 70c2f215c5..8ce79efad6 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
@@ -47,7 +46,8 @@ pbjs.setConfig({
params: {
customerId: 'acme',
bidders: ['appnexus', 'rubicon'],
- timeout: TIMEOUT
+ timeout: TIMEOUT,
+ fpidStorageType: 'html5'
}
}]
}
@@ -57,6 +57,7 @@ pbjs.setConfig({
## Parameters
{: .table .table-bordered .table-striped }
+
| Name | Type | Description | Default |
| :---------------- | :------------ | :--------------------------------------------------------------- |:----------------- |
| name | String | Real time data module name | Always '1plusX' |
@@ -65,3 +66,4 @@ pbjs.setConfig({
| params.customerId | String | Your 1plusX customer id | |
| params.bidders | Array | List of bidders for which you would like data to be set | |
| params.timeout | Integer | timeout (ms) | 1000ms |
+| params.fpidStorageType | String | Where to read the first party id ('html5' or 'cookie') | 'html5' |
diff --git a/dev-docs/modules/51DegreesRtdProvider.md b/dev-docs/modules/51DegreesRtdProvider.md
index 9d99c83ed2..1fbf70bdf9 100644
--- a/dev-docs/modules/51DegreesRtdProvider.md
+++ b/dev-docs/modules/51DegreesRtdProvider.md
@@ -12,10 +12,12 @@ sidebarType : 1
---
{: .alert.alert-warning :}
-This module loads a dynamically generated JavaScript from cloud.51degrees.com (or your self-hosted domain) based on the evidence (HTTP headers and API results) available. The external resource is used to handle constant platform and browser evolution without requiring frequent changes to the Prebid source code.
+This module loads a dynamically generated JavaScript from Cloud API hosted at cloud.51degrees.com (or your self-hosted domain) based on the evidence (HTTP headers and API results) available. The external resource is used to handle constant platform and browser evolution without requiring frequent changes to the Prebid source code.
-# 51Degrees RTD Submodule
+{: .alert.alert-warning :}
+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
@@ -29,7 +31,7 @@ This module loads a dynamically generated JavaScript from cloud.51degrees.com (o
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?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).
@@ -51,7 +53,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/tWrhNfY6) - 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
@@ -62,11 +64,13 @@ In order to use the module please first obtain a Resource Key using the [Configu
* PlatformVersion
* ScreenPixelsHeight
* ScreenPixelsWidth
+* ScreenPixelsPhysicalHeight
+* ScreenPixelsPhysicalWidth
* ScreenInchesHeight
* ScreenInchesWidth
-* PixelRatio (optional)
+* PixelRatio
-PixelRatio is desirable, but it's a paid property requiring a paid license. Free API service is limited. Please check [51Degrees pricing](https://51degrees.com/pricing) to choose a plan that suits your needs.
+The Cloud API is **free** to integrate and use. To increase limits please check [51Degrees pricing](https://51degrees.com/pricing).
#### User Agent Client Hint (UA-CH) Permissions
@@ -106,20 +110,20 @@ In summary we recommend using `Delegate-CH` http-equiv as the preferred method o
### Configuration
-This module is configured as part of the `realTimeData.dataProviders`
+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 `51Degrees` RTD provider.
```javascript
pbjs.setConfig({
debug: true, // we recommend turning this on for testing as it adds more logging
realTimeData: {
- auctionDelay: 1000, // should be set lower in production use
+ auctionDelay: 250,
dataProviders: [
{
name: '51Degrees',
waitForIt: true, // should be true, otherwise the auctionDelay will be ignored
params: {
- // Get your resource key from https://configure.51degrees.com/tWrhNfY6 to connect to cloud.51degrees.com
resourceKey: '',
+ // 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'
},
@@ -133,6 +137,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' |
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/adagioRtdProvider.md b/dev-docs/modules/adagioRtdProvider.md
index 2078f4cc30..a3f2883766 100644
--- a/dev-docs/modules/adagioRtdProvider.md
+++ b/dev-docs/modules/adagioRtdProvider.md
@@ -15,10 +15,10 @@ sidebarType : 1
## Overview
-This module can be used in combination with [Adagio Bid Adapter](/dev-docs/bidders/adagioBidAdapter.md) (SSP) and/or with Adagio prebid server endpoint.
+This module can be used in combination with [Adagio Bid Adapter](/dev-docs/bidders/adagio.html) (SSP) and/or with Adagio prebid server endpoint.
It computes and collects data required to leverage Adagio viewability and attention prediction engine.
-Please contact [contact@adagio.io](contact@adagio.io) for more information.
+Please contact for more information.
{% include dev-docs/loads-external-javascript.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
diff --git a/dev-docs/modules/adlaneRtdProvider.md b/dev-docs/modules/adlaneRtdProvider.md
new file mode 100644
index 0000000000..955358d6bb
--- /dev/null
+++ b/dev-docs/modules/adlaneRtdProvider.md
@@ -0,0 +1,76 @@
+---
+layout: page_v2
+title: Adlane Real-Time Data Module
+display_name: Adlane RTD Module
+description: Adlane Real-Time Data Provider for Age Verification
+page_type: module
+module_type: rtd
+module_code: adlaneRtdProvider
+enable_download: true
+vendor_specific: true
+sidebarType: 1
+---
+
+# Adlane RTD Provider
+
+## Overview
+
+The Adlane Real-Time Data (RTD) Provider automatically retrieves age verification information and adds it to the bid stream, allowing for age-appropriate ad targeting. This module does not have a Global Vendor List ID (GVL ID).
+
+## Integration
+
+1. Compile the Adlane RTD Module into your Prebid build:
+
+ ```bash
+ gulp build --modules=adlaneRtdProvider ...
+ ```
+
+2. Use `setConfig` to instruct Prebid.js to initialize the adlaneRtdProvider module, as specified below.
+
+## Configuration
+
+```javascript
+pbjs.setConfig({
+ realTimeData: {
+ auctionDelay: 1000,
+ dataProviders: [
+ {
+ name: "adlane",
+ waitForIt: true,
+ }
+ ]
+ }
+});
+```
+
+## Parameters
+
+| Name | Type | Description | Default |
+|-----------|---------|-----------------------------------------------|---------|
+| name | String | Must be "adlane" | n/a |
+| waitForIt | Boolean | Whether to wait for the module before auction | true |
+
+## Age Verification Data
+
+The module attempts to retrieve age verification data from the following sources, in order:
+
+1. AdlCmp API (if available)
+2. Local storage
+
+The age verification data is added to the bid request in the following format:
+
+```javascript
+{
+ ortb2: {
+ regs: {
+ ext: {
+ age_verification: {
+ status: 'accepted', //The acceptance indicates that the user has confirmed they are 21 years of age or older (accepted/declined)
+ id: "123456789123456789", //unique identifier for the age verification // Optional
+ decisionDate: "2011-10-05T14:48:00.000Z", //ISO 8601 date string (e.g.,"2011-10-05T14:48:00.000Z") // Optional, represents the date when the age verification decision was made
+ }
+ }
+ }
+ }
+}
+```
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/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 d44922c3cd..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}
@@ -62,7 +61,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 |
diff --git a/dev-docs/modules/akamaiDapRtdProvider.md b/dev-docs/modules/akamaiDapRtdProvider.md
deleted file mode 100644
index b4efb216d6..0000000000
--- a/dev-docs/modules/akamaiDapRtdProvider.md
+++ /dev/null
@@ -1,84 +0,0 @@
----
-layout: page_v2
-title: Akamai DAP Real Time Data Provider Module
-display_name: Akamai DAP Real Time Data Provider Module
-description: Akamai DAP Real Time Data Provider Module
-page_type: module
-module_type: rtd
-module_code : akamaiDapRtdProvider
-enable_download : true
-vendor_specific: true
-sidebarType : 1
----
-
-# Akamai DAP Real Time Data Provider Module
-
-{:.no_toc}
-
-* TOC
-{:toc}
-
-The Akamai Data Activation Platform (DAP) is a privacy-first system that protects end-user privacy by only allowing them to be targeted as part of a larger cohort. Akamai DAP Real time data Provider automatically invokes the DAP APIs and submit audience segments and the Secure Ad ID(SAID) to the bid-stream. SAID is a JWT/JWE which carries with it the cohorts and only a side-car or trusted server in the demand-side platform is allowed to see its contents.
-
-## Publisher Usage
-
-1. Build the akamaiDapRTD module into the Prebid.js package with:
-
- ```bash
- gulp build --modules=akamaiDapRtdProvider,...
- ```
-
-2. Use `setConfig` to instruct Prebid.js to initilaize the akamaiDapRtdProvider module, as specified below.
-
-### Configuration
-
-```javascript
-pbjs.setConfig({
- realTimeData: {
- auctionDelay: 2000,
- dataProviders: [
- {
- name: "dap",
- waitForIt: true,
- params: {
- apiHostname: '',
- apiVersion: "x1",
- domain: 'your-domain.com',
- identityType: 'email' | 'mobile' | ... | 'dap-signature:1.3.0',
- segtax: 504,
- dapEntropyUrl: 'https://dap-dist.akamaized.net/dapentropy.js',
- dapEntropyTimeout: 1500
- }
- }
- ]
- }
-});
-```
-
-Please reach out to your Akamai account representative() to get provisioned on the DAP platform.
-
-**Config Syntax details:**
-
-{: .table .table-bordered .table-striped }
-| Name |Type | Description | Notes |
-| :------------ | :------------ | :------------ |:------------ |
-| name | String | Akamai Dap Rtd module name | 'dap' always|
-| waitForIt | Boolean | Required to ensure that the auction is delayed until prefetch is complete | Optional. Defaults to false |
-| apiHostname | String | Hostname provided by Akamai | Please reach out to your Akamai account representative() for this value|
-| apiVersion | String | This holds the API version | It should be "x1" always |
-| domain | String | The domain name of your webpage | |
-| identityType | String | Something like this 'email', 'mobile', ... 'dap-signature:1.3.0' | |
-| segtax | Integer | The taxonomy for Akamai | The value should be 504 |
-| dapEntropyUrl | String | URL to dap entropy script | Optional if the script is directly included on the webpage. Contact your Akamai account rep for more details |
-| dapEntropyTimeout | Integer | Maximum time allotted for the entropy calculation to happen | |
-
-### Testing
-
-To view an example of available segments returned by dap:
-
-```bash
-gulp serve --modules=rtdModule,akamaiDapRtdProvider,appnexusBidAdapter,sovrnBidAdapter
-```
-
-and then point your browser at:
-""
diff --git a/dev-docs/modules/anPspParamsConverter.md b/dev-docs/modules/anPspParamsConverter.md
new file mode 100644
index 0000000000..a575408ac3
--- /dev/null
+++ b/dev-docs/modules/anPspParamsConverter.md
@@ -0,0 +1,25 @@
+---
+layout: page_v2
+page_type: module
+title: Module - anPspParamsConverter
+description: Formats bid params for AppNexus PSP requests made through Prebid.js.
+module_code : anPspParamsConverter
+display_name : anPspParamsConverter
+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.
diff --git a/dev-docs/modules/anonymisedRtdProvider.md b/dev-docs/modules/anonymisedRtdProvider.md
index d266b01d6f..755b5393cb 100644
--- a/dev-docs/modules/anonymisedRtdProvider.md
+++ b/dev-docs/modules/anonymisedRtdProvider.md
@@ -21,10 +21,10 @@ Anonymised’s Real-time Data Provider automatically obtains segment IDs from th
- Build the anonymisedRtd module into the Prebid.js package with:
```bash
-gulp build --modules=anonymisedRtdProvider,...
+gulp build --modules=rtdModule,anonymisedRtdProvider,...
```
-- Use `setConfig` to instruct Prebid.js to initilaize the anonymisedRtdProvider module, as specified below.
+- Use `setConfig` to instruct Prebid.js to initialize the anonymisedRtdProvider module, as specified below.
### Configuration
@@ -37,8 +37,12 @@ gulp build --modules=anonymisedRtdProvider,...
waitForIt: true,
params: {
cohortStorageKey: "cohort_ids",
- bidders: ["smartadserver", "appnexus"],
- segtax: 1000
+ bidders: ["appnexus", "onetag", "pubmatic", "smartadserver", ...],
+ segtax: 1000,
+ tagConfig: {
+ clientId: 'testId'
+ //The rest of the Anonymised Marketing Tag parameters goes here
+ }
}
}
]
@@ -46,16 +50,21 @@ gulp build --modules=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`. |
diff --git a/dev-docs/modules/arcspanRtdProvider.md b/dev-docs/modules/arcspanRtdProvider.md
index ce1aecb4f9..b2fa82bd16 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
@@ -57,5 +56,13 @@ pbjs.setConfig({
})
```
+### Parameters
+
+{: .table .table-bordered .table-striped }
+
+| Name | Type | Description | Required | Default |
+| :--- | :--- | :--- | :--- | :--- |
+| `silo` | Integer | ArcSpan provided silo identifier used to load the contextual script | yes | n/a |
+
{: .alert.alert-info :}
For best results, we recommend that you also deploy ArcSpan's JavaScript tag in your tag management solution, as instructed in the implementation overview you received from your ArcSpan representative. This will ensure that more of your auctions contain ArcSpan's contextual signals. Please reach out to your ArcSpan representative if you have any questions.
diff --git a/dev-docs/modules/azerionedgeRtdProvider.md b/dev-docs/modules/azerionedgeRtdProvider.md
index 2c3da1eb4d..67884e5ad3 100644
--- a/dev-docs/modules/azerionedgeRtdProvider.md
+++ b/dev-docs/modules/azerionedgeRtdProvider.md
@@ -5,10 +5,13 @@ display_name: Azerion Edge RTD Provider
description: Client-side contextual cookieless audiences.
page_type: module
module_type: rtd
-module_code : azerionedgeRtdProvider
-enable_download : true
+module_code: azerionedgeRtdProvider
+enable_download: true
vendor_specific: true
-sidebarType : 1
+usp_supported: true
+gdpr_supported: true
+gvl_id: 253
+sidebarType: 1
---
# Azerion Edge RTD Provider
@@ -66,25 +69,3 @@ pbjs.setConfig(
| params.key | `String` | Publisher partner specific key | Mandatory. The key is required for the module to work. If you haven't received one, please reach |
| params.bidders | `Array` | Bidders with which to share segment information | Optional. Defaults to "improvedigital". |
| params.process | `Object` | Configuration for the Azerion Edge script. | Optional. Defaults to `{}`. |
-
-## Context
-
-As all data collection is on behalf of the publisher and based on the consent the publisher has
-received from the user, this module does not require a TCF vendor configuration. Consent is
-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
-as exception, as shown below:
-
-```js
-[
- {
- purpose: 'storage',
- enforcePurpose: true,
- enforceVendor: true,
- vendorExceptions: ["azerionedge"]
- },
- ...
-]
-```
diff --git a/dev-docs/modules/bidResponseFilter.md b/dev-docs/modules/bidResponseFilter.md
new file mode 100644
index 0000000000..85f753c272
--- /dev/null
+++ b/dev-docs/modules/bidResponseFilter.md
@@ -0,0 +1,52 @@
+---
+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
+
+---
+
+# Bid Response Filter
+
+## 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
+ }
+ }
+ });
+```
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/bidstailamedia.md b/dev-docs/modules/bidstailamedia.md
new file mode 100644
index 0000000000..24ea3f3de9
--- /dev/null
+++ b/dev-docs/modules/bidstailamedia.md
@@ -0,0 +1,120 @@
+---
+layout: bidder
+title: stailamedia Bidder
+description: Prebid bidstailamedia Bidder Adapter
+pbjs: true
+biddercode: bidstailamedia
+gvl_id: 965 (nexx360)
+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
+
+| Name | Scope | Description | Example | Type |
+|---------------|----------|----------------------------|-------------------------------------- |-----------|
+| `tagId` | required | tag ID | `"hk15z9sy"` | `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: 'bidstailamedia',
+ params: {
+ tagId: 'hk15z9sy'
+ }
+ }]
+ },
+ // Video adUnit
+ {
+ code: 'video1',
+ mediaTypes: {
+ video: {
+ playerSize: [640, 480],
+ context: 'instream'
+ }
+ },
+ bids: [{
+ bidder: 'bidstailamedia',
+ params: {
+ tagId: 'hk15z9sy'
+ }
+ }]
+ },
+ // Native adUnit
+ {
+ code: 'native1',
+ mediaTypes:
+ native: {
+ title: {
+ required: true
+ },
+ image: {
+ required: true
+ },
+ sponsoredBy: {
+ required: true
+ }
+ }
+ },
+ bids: [{
+ bidder: 'bidstailamedia',
+ params: {
+ tagId: 'hk15z9sy'
+ }
+ }]
+ },
+ // Multiformat Ad
+ {
+ code: 'multi1',
+ mediaTypes: {
+ video: {
+ playerSize: [640, 480],
+ context: 'instream'
+ },
+ banner: {
+ sizes: [[300, 250], [300,600]]
+ }
+ },
+ bids: [{
+ bidder: 'bidstailamedia',
+ params: {
+ tagId: 'hk15z9sy',
+ videoTagId: 'hk15z9sy'
+ }
+ }]
+ };
+];
+```
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..737177d3a6 100644
--- a/dev-docs/modules/browsiRtdProvider.md
+++ b/dev-docs/modules/browsiRtdProvider.md
@@ -1,18 +1,17 @@
---
layout: page_v2
-title: Browsi Viewability Module
-display_name: Browsi Viewability
-description: Browsi Real Time Viewability
+title: Browsi RTD Module
+display_name: Browsi RTD Module
+description: Browsi Real Time Module
page_type: module
module_type: rtd
-module_code : browsiRtdProvider
-enable_download : true
+module_code: browsiRtdProvider
+enable_download: true
vendor_specific: true
sidebarType : 1
---
-# Browsi Viewability Module
-
+# Browsi RTD Module
{:.no_toc}
* TOC
@@ -20,19 +19,24 @@ sidebarType : 1
## Overview
-The Browsi Viewability module provides viewability predictions for ad slots on the page.
-To use this module, you'll need to work with [Browsi](https://gobrowsi.com) to get
-an account and receive instructions on how to set up your pages and ad server.
+Browsi’s RTD module for Prebid.js provides real-time insights and predictive signals to optimize bid requests and ad delivery.
+This module leverages Browsi's AI models to give publishers access to:
+
+* **Real-time predictions for GAM**: Enhance ad placements and maximize revenue by leveraging viewability and revenue predictions as key values in GAM ad requests.
+* **Enhanced bid request signals**: Augment bid requests with additional contextual, behavioral, and engagement signals to improve demand partner performance.
+* **Dynamic ad serving optimization**: Enable smarter ad delivery strategies based on predicted user behavior and page context.
+
+## Integration
Implementation works like this:
-1. Build the Browsi module into the Prebid.js package with:
+1. Build the Browsi modules into the Prebid.js package with:
```bash
- gulp build --modules=browsiRtdProvider&...
+ gulp build --modules=browsiRtdProvider,browsiAnalyticsAdapter
```
-2. Use `setConfig` to instruct the browser to obtain the viewability data in parallel with the header bidding auction
+2. Use `setConfig` to instruct the browser to obtain Browsi’s predictive signals in parallel with the header bidding auction
## Configuration
@@ -40,16 +44,17 @@ This module is configured as part of the `realTimeData.dataProviders` object:
```javascript
pbjs.setConfig({
- "realTimeData": {
- dataProviders:[{
- "name": "browsi",
- "params": {
- "url": "testUrl.com", // get params values
- "siteKey": "testKey", // from Browsi
- "pubKey": "testPub", //
- "keyName":"bv" //
- }
- }]
+ realTimeData: {
+ auctionDelay : 3000,
+ dataProviders: [{
+ name: "browsi",
+ params: {
+ url: "domain.com",
+ siteKey: "SITE",
+ pubKey: "PUB",
+ waitForIt: true
+ }
+ }]
}
});
```
@@ -64,22 +69,9 @@ Syntax details:
| params.siteKey |String |Site key| |
| params.pubKey |String |Publisher key| |
| params.url |String |Server URL| |
-| params.keyName |String |Key value name| Optional. Defaults to 'bv'. |
+| params.keyName |String |GAM key value name for the viewability prediction| Optional. Defaults to ‘browsiViewability’. |
+| params.waitForIt |boolean |Allow waiting for data| true |
## Output
-For each ad slot, the module returns expected viewability prediction in a JSON format.
-When the data is received, it calls `pbjs.setTargetingForGPT` to set the defined `keyName` for each adunit.
-
-Example:
-
-```json
-{
- "slotA":{
- "p":0.56, // ad server targeting variable (e.g. bv) for slotA is 0.56
- },
- "slotB":{
- "p":0.824, // ad server targeting variable (e.g. bv) for slotB is 0.824
- }
-}
-```
+For each ad slot, the module generates predictive signals in JSON format, assigns key-value pairs for viewability and revenue predictions via `pbjs.setTargetingForGPT`, and embeds the full JSON in the bid request under `.ortb2Imp.ext.data.browsi`.
diff --git a/dev-docs/modules/captifyRtdProvider.md b/dev-docs/modules/captifyRtdProvider.md
index e7c0e634e1..e8de341105 100644
--- a/dev-docs/modules/captifyRtdProvider.md
+++ b/dev-docs/modules/captifyRtdProvider.md
@@ -6,15 +6,17 @@ 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
---
# Captify RTD Module
-
{:.no_toc}
+{: .alert.alert-warning :}
+Captify RTD was removed in Prebid.js 8.0
+
* TOC
{:toc}
@@ -73,4 +75,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..8651c6aff1 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.
@@ -39,6 +38,14 @@ pbjs.setConfig({
});
```
+### Parameters
+
+{: .table .table-bordered .table-striped }
+
+| Name | Type | Description | Required | Default |
+| :--- | :--- | :--- | :--- | :--- |
+| `translationFile` | String | URL of a custom brand category translation map | no | Prebid default map |
+
This file will be stored locally to expedite the conversion process. If a publisher opts to not provide a conversion mapping file Prebid will use its default conversion mapping file.
Publishers should ensure that the JSON returned from their custom file is valid for Prebid by adhering to the following structure:
diff --git a/dev-docs/modules/chromeAiRtdProvider.md b/dev-docs/modules/chromeAiRtdProvider.md
new file mode 100644
index 0000000000..e4c78a238e
--- /dev/null
+++ b/dev-docs/modules/chromeAiRtdProvider.md
@@ -0,0 +1,219 @@
+---
+layout: page_v2
+title: Chrome AI RTD Provider
+display_name: Chrome AI RTD Provider
+description: Use Chrome AI APIs for language detection and summarization.
+page_type: module
+module_type: rtd
+module_code : chromeAiRtdProvider
+enable_download : true
+sidebarType : 1
+---
+
+# Chrome AI RTD Provider
+
+## Overview
+
+The Chrome AI RTD Provider is a Prebid.js Real-Time Data (RTD) module that enhances bidding by leveraging Chrome's built-in AI capabilities. It can automatically detect page language using the [Chrome AI Language Detection API](https://developer.chrome.com/docs/ai/language-detection) and generate page summaries or keywords using the [Chrome AI Summarizer API](https://developer.chrome.com/docs/ai/summarizer-api). This information is added to the OpenRTB bid request objects, allowing bid adapters to optimize bids based on content language and context.
+
+## Features
+
+- Automatic language detection using the Chrome AI Language Detection API.
+- Automatic page summarization or keyword generation using the Chrome AI Summarizer API.
+- Caching of detected language and summaries/keywords in localStorage to reduce redundant API calls (configurable for summarizer).
+- Configurable options for both language detection (e.g., confidence threshold) and summarization (e.g., type, format, length).
+- Flexible ORTB2 path configuration for placing detected data.
+- Ability to enable/disable each feature independently.
+- Compatible with the Prebid.js RTD framework.
+
+## Integration
+
+### Build Setup
+
+To include the Chrome AI RTD Provider in your Prebid.js build, use the following command:
+
+```bash
+gulp build --modules=rtdModule,chromeAiRtdProvider
+```
+
+### Basic Integration
+
+Add the Chrome AI RTD Provider to your Prebid.js configuration:
+
+```javascript
+pbjs.setConfig({
+ realTimeData: {
+ dataProviders: [{
+ name: 'chromeAi',
+ waitForIt: true // Optional: delays the auction until language detection completes
+ }]
+ }
+});
+```
+
+### Advanced Configuration
+
+Configure language detection and summarization with additional options:
+
+```javascript
+pbjs.setConfig({
+ realTimeData: {
+ dataProviders: [{
+ name: 'chromeAi',
+ waitForIt: true, // Set to true if auction should wait for both enabled features
+ params: {
+ languageDetector: {
+ enabled: true, // Set to false to disable language detection
+ confidence: 0.9, // Set minimum confidence threshold (0.0 - 1.0)
+ ortb2Path: 'site.content.language' // Default path for language
+ },
+ summarizer: {
+ enabled: false, // Set to true to enable summarization/keyword generation
+ type: 'headline', // 'headline','key-points', 'tldr' or 'teaser'
+ format: 'markdown', // 'plain-text' or 'markdown'
+ length: 'short', // 'short', 'medium', or 'long'
+ ortb2Path: 'site.content.keywords', // Path for summary/keywords
+ cacheInLocalStorage: true // Whether to cache generated summary/keywords
+ }
+ }
+ }]
+ }
+});
+```
+
+## Configuration Options
+
+{: .table .table-bordered .table-striped }
+| Parameter | Scope | Type | Description | Default |
+|-----------|-------|------|-------------|---------|
+| `waitForIt` | Optional | Boolean | Whether to delay auction for data retrieval | `false` |
+| `languageDetector.enabled` | Optional | Boolean | Enable or disable language detection | `true` |
+| `languageDetector.confidence` | Optional | Number | Minimum confidence threshold for detected language (0.0 - 1.0) | `0.8` |
+| `languageDetector.ortb2Path` | Optional | String | Path in ORTB2 to store the detected language | `'site.content.language'` |
+| `summarizer.enabled` | Optional | Boolean | Enable or disable summarization/keyword generation | `false` |
+| `summarizer.type` | Optional | String | Type of summary: `'headline'`, `'key-points'`, `'tldr'`, or `'teaser'` | `'headline'` |
+| `summarizer.format` | Optional | String | Format of the summary: `'plain-text'` or `'markdown'` | `'mark-down'` |
+| `summarizer.length` | Optional | String | Length of the summary: `'short'`, `'medium'`, or `'long'` | `'short'` |
+| `summarizer.ortb2Path` | Optional | String | Path in ORTB2 to store the generated summary/keywords | `'site.content.keywords'` |
+| `summarizer.cacheInLocalStorage` | Optional | Boolean | Whether to cache the generated summary/keywords in localStorage | `true` |
+
+## How It Works
+
+The module initializes configured features (language detection, summarization) asynchronously.
+
+### Language Detection (`languageDetector`)
+
+1. **Data Prioritization**: On initialization or when `getBidRequestData` is called, the module first checks for existing language information in this order:
+ - Auction-specific ORTB2 data (from `reqBidsConfigObj` passed to `getBidRequestData`).
+ - Data cached in localStorage for the current page URL (from a previous detection).
+2. **API Call**: If no language is found and the feature is enabled, it attempts to detect the language of the visible page content using the Chrome AI Language Detection API.
+ - The API's `availability()` method is checked. If 'unavailable', detection is skipped. If 'after-download', the module may proceed if the model downloads.
+3. **Data Handling**: The detected language (if it meets the confidence threshold) is:
+ - Stored in localStorage for future page loads on the same URL.
+ - Added to the OpenRTB bid requests at the configured `languageDetector.ortb2Path` (default: `site.content.language`).
+
+### Summarization / Keyword Generation (`summarizer`)
+
+1. **Data Prioritization**: Similar to language detection, it checks for existing summary/keywords:
+ - Auction-specific ORTB2 data.
+ - Data cached in localStorage (if `cacheInLocalStorage: true`).
+2. **API Call**: If no data is found and the feature is enabled, it attempts to generate a summary/keywords from the page content using the Chrome AI Summarizer API.
+ - The API's `availability()` method is checked. If 'unavailable', summarization is skipped. If 'after-download', the module may proceed.
+3. **Data Handling**: The generated summary/keywords are:
+ - Stored in localStorage (if `cacheInLocalStorage: true`).
+ - Added to the OpenRTB bid requests at the configured `summarizer.ortb2Path` (default: `site.content.keywords`).
+
+If `waitForIt: true` is set in the RTD config, the auction will be delayed until all enabled and available Chrome AI features complete their processing.
+
+## Browser Compatibility
+
+- The browser must support the Chrome AI APIs being used (Language Detection, Summarizer).
+- The specific Chrome AI models (e.g., for language detection or summarization) must be 'available' or become 'available-after-download'. The module handles these states.
+- Sufficient text content must be available on the page (minimum 20 characters for language detection and summarization).
+- If using the `waitForIt: true` option, consider the potential impact on auction latency.
+
+## Limitations
+
+- Relies on browser support for Chrome AI APIs.
+- Requires sufficient and meaningful visible text content on the page for accurate results.
+- Language detection may not be accurate for pages with multiple languages mixed together.
+- Summarization quality depends on the page content and the capabilities of the underlying Chrome AI model.
+
+## Browser Compatibility
+
+[Language Detector API Support](https://caniuse.com/mdn-api_languagedetector)
+## Example Use Cases
+
+### Standard Implementation
+
+```javascript
+pbjs.setConfig({
+ realTimeData: {
+ dataProviders: [{
+ name: 'chromeAi',
+ waitForIt: true
+ }]
+ }
+});
+```
+
+### Disable Language Detection for Specific Sites
+
+```javascript
+pbjs.setConfig({
+ realTimeData: {
+ dataProviders: [{
+ name: 'chromeAi',
+ params: {
+ languageDetector: {
+ enabled: false
+ }
+ }
+ }]
+ }
+});
+```
+
+### Higher Confidence Requirement for Language Detection
+
+```javascript
+pbjs.setConfig({
+ realTimeData: {
+ dataProviders: [{
+ name: 'chromeAi',
+ waitForIt: true,
+ params: {
+ languageDetector: {
+ enabled: true,
+ confidence: 0.95 // Only use high-confidence detections
+ }
+ }
+ }]
+ }
+});
+```
+
+### Enable Summarizer with Custom Settings
+
+```javascript
+pbjs.setConfig({
+ realTimeData: {
+ dataProviders: [{
+ name: 'chromeAi',
+ waitForIt: true,
+ params: {
+ languageDetector: {
+ enabled: false // Example: only using summarizer
+ },
+ summarizer: {
+ enabled: true,
+ type: 'teaser',
+ format: 'markdown', // In markdown format
+ length: 'medium',
+ ortb2Path: 'site.ext.data.summary', // Custom ORTB2 path
+ }
+ }
+ }]
+ }
+});
+```
diff --git a/dev-docs/modules/cleanioRtdProvider.md b/dev-docs/modules/cleanioRtdProvider.md
index 455b8487b6..6bfe33b0a7 100644
--- a/dev-docs/modules/cleanioRtdProvider.md
+++ b/dev-docs/modules/cleanioRtdProvider.md
@@ -6,11 +6,20 @@ description: clean.io Real-time Anti-Malvertising Module
page_type: module
module_type: rtd
module_code : cleanioRtdProvider
-enable_download : true
+enable_download : false
vendor_specific: true
sidebarType : 1
---
+
+{: .alert.alert-warning :}
+**Warning!**
+
+The **cleanioRtdProvider** module has been renamed to [humansecurityMalvDefenseRtdProvider](humansecurityMalvDefenseRtdProvider.html) following HUMAN Security's acquisition of the Clean.io project in 2022.
+ **cleanioRtdProvider** module is maintained for backward compatibility until the next major Prebid release.
+
+Please use **humansecurityMalvDefenseRtdProvider** instead of **cleanioRtdProvider** in your Prebid integration.
+
# clean.io Real-time Anti-Malvertising Module
## Overview
@@ -49,6 +58,7 @@ pbjs.setConfig({
### Configuration parameters
{: .table .table-bordered .table-striped }
+
| Name | Type | Scope | Description |
| :------------ | :------------ | :------------ |:------------ |
| ``cdnUrl`` | ``string`` | Required | CDN URL of the script, which is to be used for protection. |
@@ -57,6 +67,7 @@ pbjs.setConfig({
## Integration modes
{: .table .table-bordered .table-striped }
+
| Integration Mode | Parameter Value | Description |
| :------------ | :------------ | :------------ |
| Full page protection | ``'full'`` | Preferred mode. The module will add the protector agent script directly to the page, and it will protect all placements. This mode will make the most out of various behavioral detection mechanisms, and will also prevent typical malicious behaviors. Please note that in this mode, depending on Prebid library naming, Chrome may mistakenly tag non-ad-related content as ads: . |
diff --git a/dev-docs/modules/confiantRtdProvider.md b/dev-docs/modules/confiantRtdProvider.md
index e8c8af20b7..7d881c4386 100644
--- a/dev-docs/modules/confiantRtdProvider.md
+++ b/dev-docs/modules/confiantRtdProvider.md
@@ -53,3 +53,14 @@ pbjs.setConfig({
}
});
```
+
+## Parameters
+
+{: .table .table-bordered .table-striped }
+
+| Name | Type | Description | Required | Default |
+| :--- | :--- | :--- | :--- | :--- |
+| `propertyId` | String | Identifier provided by Confiant | yes | n/a |
+| `prebidExcludeBidders` | String | Comma separated bidder codes to exclude from Confiant scanning | no | empty |
+| `prebidNameSpace` | String | Custom namespace for the integration | no | empty |
+| `shouldEmitBillableEvent` | Boolean | Emit a billable event when a Confiant scan occurs | no | `false` |
diff --git a/dev-docs/modules/consentManagementGpp.md b/dev-docs/modules/consentManagementGpp.md
index 1e8ad5cb19..80c3bd77b8 100644
--- a/dev-docs/modules/consentManagementGpp.md
+++ b/dev-docs/modules/consentManagementGpp.md
@@ -54,11 +54,14 @@ Once the CMP is implemented, simply include this module into your build and add
Here are the parameters supported in the `consentManagement` object specific for the GPP consent module:
{: .table .table-bordered .table-striped }
+
| Param | Type | Description | Example |
| --- | --- | --- | --- |
| gpp | `Object` | | |
+| gpp.enabled | `boolean` | Enables or disables the GPP consent management module. When set to `false`, Prebid does not initialize the CMP integration, does not delay auctions for consent, removes any active CMP event listeners. Defaults to `true` if not specified. | `false` |
| gpp.cmpApi | `string` | The CMP interface that is in use. Supported values are **'iab'** or **'static'**. Static allows integrations where IAB-formatted consent strings are provided in a non-standard way. Default is `'iab'`. | `'iab'` |
| gpp.timeout | `integer` | Length of time (in milliseconds) to allow the CMP to obtain the GPP consent information. Default is `10000`. | `10000` |
+| gpp.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` |
| gpp.consentData | `Object` | An object representing the IAB GPP consent data being passed directly; only used when cmpApi is 'static'. Default is `undefined`. | |
| gpp.consentData.sectionId | `integer` | Indicates the header section of the GPP consent string, recommended to be `3`. | |
| gpp.consentData.gppVersion | `string` | The version number parsed from the header of the GPP consent string. | |
@@ -115,6 +118,22 @@ Example 2: Static CMP using custom data passing.
});
```
+Example 3: Disabling the module. When disabled, Prebid.js will not fetch GPP data, will not wait for the CMP. Existing CMP listeners (if any were previously active) are cleaned up.
+
+```javascript
+ var pbjs = pbjs || {};
+ pbjs.que = pbjs.que || [];
+ pbjs.que.push(function() {
+ pbjs.setConfig({
+ consentManagement: {
+ gpp: {
+ enabled: false
+ }
+ }
+ });
+ });
+```
+
## Build the Package
Follow the basic build instructions in the GitHub Prebid.js repo's main [README](https://github.com/prebid/Prebid.js/blob/master/README.md). To include the consent management module, an additional option must be added to the **gulp build** command:
@@ -129,7 +148,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 +191,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".
@@ -200,7 +219,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 85%
rename from dev-docs/modules/consentManagement.md
rename to dev-docs/modules/consentManagementTcf.md
index 518ce48a02..f766a94aa9 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).
@@ -66,21 +66,23 @@ but we recommend migrating to the new config structure as soon as possible.
| Param | Type | Description | Example |
| --- | --- | --- | --- |
| gdpr | `Object` | | |
+| gdpr.enabled | `boolean` | Enables or disables the TCF consent management module. When set to `false`, Prebid does not initialize the CMP integration, does not delay auctions for consent, removes any active CMP event listeners. Defaults to `true` if not specified. | `false` |
| gdpr.cmpApi | `string` | The CMP interface that is in use. Supported values are **'iab'** or **'static'**. Static allows integrations where IAB-formatted consent strings are provided in a non-standard way. Default is `'iab'`. | `'iab'` |
| gdpr.timeout | `integer` | Length of time (in milliseconds) to allow the CMP to obtain the GDPR consent string. Default is `10000`. | `10000` |
| gdpr.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. | |
+| 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. | |
+| 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:
@@ -170,12 +172,28 @@ Example 3: Static CMP using custom data passing.
});
```
+Example 4: Disabling the module. When disabled, Prebid.js will not fetch TCF data, will not wait for the CMP. Existing CMP listeners (if any were previously active) are cleaned up.
+
+```javascript
+ var pbjs = pbjs || {};
+ pbjs.que = pbjs.que || [];
+ pbjs.que.push(function() {
+ pbjs.setConfig({
+ consentManagement: {
+ gdpr: {
+ enabled: false
+ }
+ }
+ });
+ });
+```
+
## Build the Package
Follow the basic build instructions in the GitHub Prebid.js repo's main [README](https://github.com/prebid/Prebid.js/blob/master/README.md). To include the consent management module, an additional option must be added to the **gulp build** command:
```bash
-gulp build --modules=consentManagement,bidAdapter1,bidAdapter2
+gulp build --modules=consentManagementTcf,tcfControl,bidAdapter1,bidAdapter2
```
You can also use the [Prebid.js Download](/download.html) page.
@@ -210,7 +228,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 +387,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..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/consentManagement.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:
diff --git a/dev-docs/modules/currency.md b/dev-docs/modules/currency.md
index be27ef75a7..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
@@ -30,6 +30,7 @@ currency conversion file while the bids are taking place. Alternately, the conve
be provided in the page.
1. At runtime, bids are converted to the ad server currency as needed.
1. Default rates can be provided in case the file cannot be loaded.
+1. When `requestBids` is called, the Currency Module will delay the auction up to the supplied amount of time in `currency.auctionDelay` or as soon as the dynamic endpoint returns data, whichever is first.
## Currency Architecture
@@ -195,6 +196,8 @@ pbjs.setConfig({
"conversionRateFile": "URL_TO_RATE_FILE",
// optionally provide a default rate in case the file can't be read
"defaultRates": { "USD": { "GPB": 0.75 }}
+ // optionally sets the auction defer time if the file has not been loaded yet
+ "auctionDelay": 1000
}
});
```
diff --git a/dev-docs/modules/debugging.md b/dev-docs/modules/debugging.md
index 2e2d954d56..d48c921634 100644
--- a/dev-docs/modules/debugging.md
+++ b/dev-docs/modules/debugging.md
@@ -10,6 +10,10 @@ sidebarType : 1
---
# Debugging module
+{: .no_toc}
+
+- TOC
+{:toc }
This module allows to "intercept" bids and replace their contents with arbitrary data for the purposes of testing and development.
@@ -169,10 +173,9 @@ pbjs.setConfig({
{
when: {
adUnitCode: "video-adunit",
- bidder: "bidderA'
+ bidder: "bidderA"
},
then: {
- cpm: 10,
mediaType: "video",
source: "client",
currency: "SEK",
@@ -180,6 +183,7 @@ pbjs.setConfig({
creativeId: "11111",
width: 640,
height: 360,
+ ttl: 300,
vastXml: "Prebid Test VAST 2.0 Linear Ad 00:00:15 "
}
},
@@ -187,3 +191,57 @@ pbjs.setConfig({
}
});
```
+
+### Force a Native Bid
+
+Note: the native response asset IDs and types must match the request.
+
+```javascript
+pbjs.setConfig({
+ debugging: {
+ enabled: true,
+ intercept: [
+ {
+ when: {
+ adUnitCode: "test-div",
+ bidder: "bidderA"
+ },
+ then: {
+ cpm: 10,
+ bidder: "bidderA",
+ mediaType: "native",
+ source: "client",
+ currency: "EUR",
+ cpm: 1.00,
+ creativeId: "222222",
+ native: { ortb: {
+ link: { url: "http://example.com" },
+ assets: [{
+ id: 1,
+ title: { text: "Test Native Creative" }
+ },{
+ id: 2,
+ data: {
+ type: 2,
+ value: "Test Description"
+ }
+ },{
+ id: 3,
+ img: {
+ type: 3,
+ url: "https://files.prebid.org/creatives/prebid300x250.png"
+ }
+ },{
+ id: 4,
+ data: {
+ type: 1,
+ value: "Prebid"
+ }
+ }]
+ }}
+ }
+ }
+ ]
+ }
+});
+```
diff --git a/dev-docs/modules/dfpAdpod.md b/dev-docs/modules/dfpAdpod.md
new file mode 100644
index 0000000000..6a8bf6df10
--- /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.html) 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/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..9df36217eb 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
@@ -30,7 +30,7 @@ pbjs.setConfig({
regs: {
ext: {
dsa: {
- dsarequired: 2,
+ dsarequired: 2,
pubrender: 0
// ...
}
@@ -40,6 +40,15 @@ pbjs.setConfig({
})
```
+### Parameters
+
+{: .table .table-bordered .table-striped }
+
+| Name | Type | Description | Required | Default |
+| :--- | :--- | :--- | :--- | :--- |
+| `dsarequired` | Integer | Indicates if DSA transparency information must be included (`0` = not required, `2` = required but advertiser may render, `3` = required and advertiser must render) | yes | n/a |
+| `pubrender` | Integer | Signals publisher rendering capabilities (`0` = cannot render, `2` = will render) | yes | n/a |
+
This module will then enforce that:
* all bids include DSA information, if required (`dsarequired` is either `2` or `3`);
diff --git a/dev-docs/modules/dynamicAdBoostRtdProvider.md b/dev-docs/modules/dynamicAdBoostRtdProvider.md
new file mode 100644
index 0000000000..38f4ce1a46
--- /dev/null
+++ b/dev-docs/modules/dynamicAdBoostRtdProvider.md
@@ -0,0 +1,34 @@
+---
+layout: page_v2
+title: Dynamic Ad Boost RTD Module
+display_name: Dynamic Ad Boost RTD Module
+description: This module is intended for publishers looking to enhance ad performance visibility and improve monetization through data analytics.
+page_type: module
+module_type: rtd
+module_code: dynamicAdBoostRtd
+enable_download: true
+vendor_specific: true
+sidebarType: 1
+---
+
+# Dynamic Ad Boost Module
+
+{% include dev-docs/loads-external-javascript.md %}
+
+The Dynamic Ad Boost module integrates with Lupon Media to collect ad unit viewability data, enabling performance analysis and revenue optimization.
+
+## Key features
+
+- Captures real-time viewability metrics per ad unit.
+- Supports site-specific configuration.
+- Enables data-driven ad optimization.
+
+## Requirements
+
+- A Lupon Media account.
+- Site integration guidelines provided by Lupon Media.
+- Coordination with Lupon Media for setup and deployment.
+
+## Parameters
+
+There is no need for any parameters — the module will handle everything automatically.
diff --git a/dev-docs/modules/ehealthcaresolutions.md b/dev-docs/modules/ehealthcaresolutions.md
new file mode 100644
index 0000000000..1b089365fd
--- /dev/null
+++ b/dev-docs/modules/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
+ }
+ }]
+ }
+ ];
+```
diff --git a/dev-docs/modules/enrichmentFpdModule.md b/dev-docs/modules/enrichmentFpdModule.md
deleted file mode 100644
index d80b64570e..0000000000
--- a/dev-docs/modules/enrichmentFpdModule.md
+++ /dev/null
@@ -1,80 +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: true
-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.
-
-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)
diff --git a/dev-docs/modules/enrichmentLiftMeasurement.md b/dev-docs/modules/enrichmentLiftMeasurement.md
new file mode 100644
index 0000000000..f43df57495
--- /dev/null
+++ b/dev-docs/modules/enrichmentLiftMeasurement.md
@@ -0,0 +1,67 @@
+---
+layout: page_v2
+title: Enrichment Lift Measurement Module
+display_name: Enrichment Lift Measurement Module
+description: Enrichment Lift Measurement Module
+page_type: module
+module_code: enrichmentLiftMeasurement
+enable_download: true
+vendor_specific: true
+sidebarType: 1
+---
+
+# Enrichment Lift Measurement
+
+The **Enrichment Lift Measurement Module** allows publishers to evaluate the performance of User ID submodules by configuring and executing A/B tests. It offers several configuration options that enable publishers to:
+
+- Route traffic to selected User ID submodules.
+- Control where the A/B test configuration is stored.
+- Specify how User ID submodules should be disabled.
+
+Additionally, the module attaches the A/B group configuration to analytics labels for tracking and reporting.
+
+## How It Works
+
+1. The publisher initializes the module using `config.setConfig`.
+2. When a user loads the page, the module determines which User ID submodules should participate in the test based on the configured percentages.
+3. Submodules not selected for the test are disabled via activity controls, either during submodule initialization or at the enrichment level.
+4. The A/B group configuration (enabled/disabled submodules) is saved in either `localStorage` or `sessionStorage`. (In `memory` mode, this step is skipped, and the configuration is recalculated on each page load.)
+5. The A/B configuration is attached to analytics labels to enable performance tracking and analysis.
+
+## Configuration
+
+{: .table .table-bordered .table-striped }
+
+| Parameter | Description | Allowed Values | Default |
+|-------------------------|------------------------------------------------------------------|--------------------------------------------|---------|
+| `storeSplits` | Defines where to store the A/B group configuration | `memory`, `sessionStorage`, `localStorage` | - |
+| `suppression` | Determines how to disable User ID submodules | `submodules`, `eids` | `eids` |
+| `modules[].name` | Name of the User ID submodule | *(string)* | - |
+| `modules[].percentage` | Percentage of users for whom the module is enabled | *(number between 0 and 1)* | - |
+| `testRun` | A label used for storing and reporting test configuration status | *(string)* | - |
+
+## Configuration Example
+
+```javascript
+pbjs.setConfig({
+ enrichmentLiftMeasurement: {
+ modules: [
+ { name: 'idSharedSystem', percentage: 1.0 }, // Enabled for 100% of users
+ { name: '33acrossIdSystem', percentage: 0.5 } // Enabled for ~50% of users
+ ],
+ storeSplits: 'memory', // Configuration is not stored; recalculated on each page load
+ suppression: 'submodules',
+ testRun: 'JulyTest'
+ }
+});
+```
+
+The following object will be attached to analytics labels based on the configuration above:
+
+```javascript
+{
+ JulyTest: [
+ { name: 'idSharedSystem', percentage: 1.0, enabled: true },
+ { name: '33acrossIdSystem', percentage: 0.5, enabled: false } // May be true or false depending on random selection
+ ]
+}
diff --git a/dev-docs/modules/floors.md b/dev-docs/modules/floors.md
index ea86698556..0bc7b02a33 100644
--- a/dev-docs/modules/floors.md
+++ b/dev-docs/modules/floors.md
@@ -58,6 +58,57 @@ Notes:
* [Prebid Floor Service Providers](/dev-docs/modules/floors.html#floors-providers)
* [Transcript of this video](/dev-docs/floors-video-overview.html)
+### Simple Static Floor Signaling
+
+Some publishers just want to set a simple static floor and don't need enforcement. 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 signal static floors on each Prebid adunit:
+
+```javascript
+pbjs.addAdUnits({
+ code: "test-div",
+ mediaTypes: {
+ banner: {
+ sizes: [[300,250]]
+ }
+ },
+ ortb2Imp: {
+ bidfloor: 1.00,
+ bidfloorcur: "EUR"
+ },
+ // ...
+});
+```
+
+### Simple Static Floor Enforcement
+
+If you need a static floor signal and also want to enforce that static floor, here's the quick start:
+
+```javascript
+ var adUnits = [
+ {
+ code: 'test-div',
+ mediaTypes: {
+ banner: { sizes: [[300,250],[300,600]] }
+ },
+ floors: {
+ currency: 'USD',
+ schema: {
+ delimiter: '|',
+ fields: [ 'mediaType' ]
+ },
+ values: {
+ '*': 1.00 // enter your static floor here
+ }
+ },
+ bids: [
+ ...
+ ]
+ }
+ ];
+```
+
+{: .alert.alert-warning :}
+Prebid does not recommend setting static floors. They are blunt tools and you'll forget to update them.
+
## 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 +349,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 |
@@ -315,7 +369,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. Floor Module will convert currency where necessary. See Currency section for more details. | 'USD' |
| data.skipRate | integer | skipRate is a random function whose input value is any integer 0 through 100 to determine when to skip all floor logic, where 0 is always use floor data and 100 is always skip floor data. The use case is for publishers or floor providers to learn bid behavior when floors are applied or skipped. Analytics adapters will have access to model version (if defined) when skipped is true to signal the Price Floors Module is in floors mode. If skipRate is supplied in both the root level of the floors object and within the data object, the skipRate configuration within the data object shall prevail. | 0 |
-| data.floorsSchemaVersion | integer | The module supports two versions of the data schema. Version 1 allows for only one model to be applied in a given data set, whereas Version 2 allows you to sample multiple models selected by supplied weights. If no schema version is provided, the module will assume version 1 for the sake of backwards compatiblity. For schema version 2 see the next section. | 1 |
+| data.floorsSchemaVersion | integer | The module supports two versions of the data schema. Version 1 allows for only one model to be applied in a given data set, whereas Version 2 allows you to sample multiple models selected by supplied weights. If no schema version is provided, the module will assume version 1 for the sake of backwards compatibility. For schema version 2 see the next section. | 1 |
| data.modelVersion | string | Used by floor providers to train on model version performance. The expectation is a floor provider’s analytics adapter will pass the model verson back for algorithm training. | - |
| data.modelTimestamp | integer | Epoch timestamp associated with modelVersion. Can be used to track model creation of floor file for post auction analysis.| - |
| data.schema | object |allows for flexible definition of how floor data is formatted. | - |
@@ -354,10 +408,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 |
@@ -371,16 +428,17 @@ 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. | - |
| 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.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.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 versions of the data schema. Version 1 allows for only one model to be applied in a given data set, whereas Version 2 allows you to sample multiple models selected by supplied weights. If no schema version is provided, the module will assume version 1 for the sake of backwards compatibility.| 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 +451,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 | - |
@@ -558,11 +616,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'
}
@@ -1237,7 +1295,7 @@ Even if a publisher is using a floors provider, they may wish to provide additio
1. default floor data if dynamic data fails to load on time
2. global floorMin: allows the publisher to constrain dynamic floors with a global min
-3. impression-level floor min (PBJS 6.24+): allows the publisher to constrain dynamic floors with an adunit-specific value
+3. impression-level floor min (PBJS 6.24+): allows the publisher to constrain dynamic floors with an adunit-specific value. Specify this in `ortb2Imp.ext.prebid.floors.floorMin` (prior to Prebid.js 8 it was `ortb2Imp.ext.prebid.floorMin`).
Here's an example covering the first two scenarios:
@@ -1281,10 +1339,10 @@ pbjs.addAdUnits({
ortb2Imp: {
ext: {
prebid: {
- data: {
- floorMin: 0.25,
- floorMinCur: "USD"
- }
+ floors: {
+ floorMin: 0.25,
+ floorMinCur: "USD"
+ }
}
}
},
@@ -1376,7 +1434,7 @@ Below is a chart explaining the behavior of currency conversion, if necessary, w
| bid.currency | bid.originalCurrency | floor.currency | result |
|---+---+---+---+---|
| USD | USD | USD | Bid.cpm is compared to floor. If bid meets or exceeds the floor, bid.originalCpm is sent to the ad server. |
-| USD | USD | EUR | Bid.cpm is converted to EUR then compared with floor. If bid meets or exceeds the floor, bid.originaCpm is sent to the ad server. |
+| USD | USD | EUR | Bid.cpm is converted to EUR then compared with floor. If bid meets or exceeds the floor, bid.originalCpm is sent to the ad server. |
| USD | EUR | EUR | bid.originalCpm is compared to floor. If bid meets or exceeds the floor, bid.Cpm is sent to the ad server. |
| USD | JPY | EUR | Bid.cpm is converted to EUR then compared with floor. If bid meets or exceeds the floor, bid.Cpm is sent to the ad server. |
| EUR | USD | EUR | Bid.cpm is compared to floor. If bid meets or exceeds the floor, bid.Cpm is sent to the ad server. |
diff --git a/dev-docs/modules/freewheel.md b/dev-docs/modules/freewheel.md
index de8b6a0571..43f23ea15e 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
@@ -61,6 +59,15 @@ pbjs.adServers.freewheel.getTargeting({
}
```
+### Parameters
+
+{: .table .table-bordered .table-striped }
+
+| Name | Type | Description | Required | Default |
+| :--- | :--- | :--- | :--- | :--- |
+| `codes` | Array | AdUnit codes to retrieve targeting for | yes | n/a |
+| `callback` | Function | Function invoked with error and targeting map | yes | n/a |
+
The values returned by `getTargeting` are concatenation of CPM, industy code, and video duration. FreeWheel SDK will send those values to FreeWheel Ad Server within the following query:
```text
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` |
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/geoedgeRtdProvider.md b/dev-docs/modules/geoedgeRtdProvider.md
index 6bae377267..944cf0f5bc 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
@@ -21,7 +20,7 @@ sidebarType : 1
## Overview
The Geoedge Realtime module lets publishers block bad ads such as automatic redirects, malware, offensive creatives and landing pages.
-To use this module, you'll need to work with [Geoedge](https://www.geoedge.com/publishers-real-time-protection/) to get an account and cutomer key.
+To use this module, you'll need to work with [Geoedge](https://www.geoedge.com/publishers-real-time-protection/) to get an account and customer key.
{% include dev-docs/loads-external-javascript.md %}
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.
diff --git a/dev-docs/modules/gppControl_usnat.md b/dev-docs/modules/gppControl_usnat.md
index b9de3e0585..df2853e3c4 100644
--- a/dev-docs/modules/gppControl_usnat.md
+++ b/dev-docs/modules/gppControl_usnat.md
@@ -21,9 +21,9 @@ 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%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). 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.
+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.
{: .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 yet intended to replace other consent modules; it supplements them.**
@@ -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.
@@ -46,8 +46,8 @@ 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)
+- [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)
- [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..d15c603fd7 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). 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.
{: .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.**
@@ -117,8 +117,8 @@ 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)
+- [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)
- [Prebid Consent Management - GPP Module](/dev-docs/modules/consentManagementGpp.html)
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/humansecurityMalvDefenseRtdProvider.md b/dev-docs/modules/humansecurityMalvDefenseRtdProvider.md
new file mode 100644
index 0000000000..8780ff2526
--- /dev/null
+++ b/dev-docs/modules/humansecurityMalvDefenseRtdProvider.md
@@ -0,0 +1,74 @@
+---
+layout: page_v2
+title: HUMAN Security Malvertising Defense Real-Time Data Submodule
+display_name: HUMAN Security Malvertising Defense RTD Submodule
+description: The HUMAN Malvertising Defense RTD blocks 0-/1-click redirects and deceptive creatives in real time, lets safe ads render, and can optionally include HUMAN Ad Quality for broader protection.
+page_type: module
+module_type: rtd
+module_code : humansecurityMalvDefense
+enable_download : true
+vendor_specific: true
+sidebarType : 1
+---
+
+# HUMAN Security Malvertising Defense Real-Time Data Submodule
+
+## Overview
+
+The HUMAN Security Malvertising Defense RTD submodule offers a robust, easy-to-implement anti-malvertising solution for publishers.
+Its automatic updates continuously detect and block on-page malicious ad behaviors — such as unwanted redirects and deceptive ads with harmful landing pages.
+This safeguards revenue and visitor experience without extra maintenance, and with minimal impact on page load speed and overall site performance.
+Publishers can also opt in to add HUMAN Ad Quality monitoring for broader protection.
+
+Using this module requires prior agreement with [HUMAN Security](https://www.humansecurity.com/) to obtain the necessary distribution key.
+
+{% include dev-docs/loads-external-javascript.md %}
+
+## Integration
+
+To integrate, add the HUMAN Security Malvertising Defense submodule to your Prebid.js package with:
+
+```bash
+gulp build --modules="rtdModule,humansecurityMalvDefenseRtdProvider,..."
+```
+
+> `rtdModule` is a required module to use HUMAN Security RTD module.
+
+## Configuration
+
+This module is configured as part of the `realTimeData.dataProviders` object.
+
+When built into Prebid.js, this module can be configured through the following `pbjs.setConfig` call:
+
+```javascript
+pbjs.setConfig({
+ realTimeData: {
+ dataProviders: [{
+ name: 'humansecurityMalvDefense',
+ params: {
+ cdnUrl: 'https://cadmus.script.ac//script.js', // Contact HUMAN Security to get your own CDN URL
+ protectionMode: 'full', // Supported modes are 'full', 'bids' and 'bids-nowait', see below.
+ }
+ }]
+ }
+});
+```
+
+### Configuration parameters
+
+{: .table .table-bordered .table-striped }
+
+| Name | Type | Scope | Description |
+| :------------ | :------------ | :------------ |:------------ |
+| ``cdnUrl`` | ``string`` | Required | CDN URL of the script, which is to be used for protection. |
+| ``protectionMode`` | ``'full'`` or ``'bids'`` or ``'bids-nowait'`` | Required | Integration mode. Please refer to the "Integration modes" section for details. |
+
+### Integration modes
+
+{: .table .table-bordered .table-striped }
+
+| Integration Mode | Parameter Value | Description |
+| :------------ | :------------ | :------------ |
+| Full page protection | ``'full'`` | Preferred mode. The module will add the protector agent script directly to the page, and it will protect all placements. This mode will make the most out of various behavioral detection mechanisms, and will also prevent typical malicious behaviors. |
+| Bids-only protection | ``'bids'`` | The module will protect specific bid responses - specifically, the HTML that represents the ad payload - by wrapping them with the agent script. Ads served outside of Prebid will not be protected in this mode, as the module can only access ads delivered through Prebid. |
+| Bids-only protection with no delay on bid rendering | ``'bids-nowait'`` | Same as above, but in this mode, the script will also *not* wrap those bid responses, which arrived prior to successful preloading of agent script. |
diff --git a/dev-docs/modules/humansecurityRtdProvider.md b/dev-docs/modules/humansecurityRtdProvider.md
new file mode 100644
index 0000000000..93b1b35ea9
--- /dev/null
+++ b/dev-docs/modules/humansecurityRtdProvider.md
@@ -0,0 +1,237 @@
+---
+layout: page_v2
+title: HUMAN Security Realtime Data Submodule
+display_name: HUMAN Security RTD Submodule
+description: The HUMAN Security RTD Submodule offers publishers a mechanism to integrate pre-bid signal collection for the purpose of providing real-time protection against all sorts of invalid traffic.
+page_type: module
+module_type: rtd
+module_code : humansecurity
+enable_download : true
+vendor_specific: true
+sidebarType : 1
+---
+
+# HUMAN Security Real-time Data Submodule
+{:.no_toc}
+
+* TOC
+{:toc}
+
+## Overview
+
+The HUMAN Security RTD submodule offers publishers a mechanism to integrate pre-bid signal collection
+for the purpose of providing real-time protection against all sorts of invalid traffic,
+such as bot-generated ad interactions or sophisticated ad fraud schemes.
+
+### How does it work?
+
+HUMAN Security RTD submodule generates a HUMAN Security token, which then can be consumed by adapters,
+sent within bid requests, and used for bot detection on the backend.
+
+### Key Facts about the HUMAN Security RTD Submodule
+
+* Enriches bid requests with IVT signal, historically done post-bid
+* No incremental signals collected beyond existing HUMAN post-bid solution
+* Offsets negative impact from loss of granularity in IP and User Agent at bid time
+* Does not expose collected IVT signal to any party who doesn’t otherwise already have access to the same signal collected post-bid
+* Does not introduce meaningful latency, as demonstrated in the Latency section
+* Comes at no additional cost to collect IVT signal and make it available at bid time
+* Leveraged to differentiate the invalid bid requests at device level, and cannot be used to identify a user or a device, thus preserving privacy.
+
+{% include dev-docs/loads-external-javascript.md %}
+
+## Build
+
+First, make sure to add the HUMAN Security submodule to your Prebid.js package with:
+
+```bash
+gulp build --modules="rtdModule,humansecurityRtdProvider,..."
+```
+
+> `rtdModule` is a required module to use HUMAN Security RTD module.
+
+## Configuration
+
+This module is configured as part of the `realTimeData.dataProviders` object.
+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*,
+besides just indicating that it should be loaded:
+
+```javascript
+pbjs.setConfig({
+ realTimeData: {
+ dataProviders: [{
+ name: 'humansecurity'
+ }]
+ }
+});
+```
+
+It can be optionally parameterized, for example, to include client ID obtained from HUMAN,
+should any advanced reporting be needed, or to have verbose output for troubleshooting:
+
+```javascript
+pbjs.setConfig({
+ realTimeData: {
+ dataProviders: [{
+ name: 'humansecurity',
+ params: {
+ clientId: 'ABC123',
+ verbose: true
+ }
+ }]
+ }
+});
+```
+
+### Supported parameters
+
+{: .table .table-bordered .table-striped }
+| Name |Type | Description | Required |
+| :--------------- | :------------ | :------------------------------------------------------------------ |:---------|
+| `clientId` | String | Should you need advanced reporting, contact [prebid@humansecurity.com](prebid@humansecurity.com) to receive client ID. | No |
+| `verbose` | Boolean | Only set to `true` if troubleshooting issues. | No |
+
+### Logging, latency and troubleshooting
+
+The optional `verbose` parameter can be especially helpful to troubleshoot any issues and/or monitor latency.
+
+By default, the submodule may, in case of unexpected issues, invoke `logError`, emitting `auctionDebug` events
+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](/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:
+
+```text
+INFO: [humansecurity]: impl JS time to init (ms): 6.
+INFO: [humansecurity]: impl JS time to collect (ms): 13.
+```
+
+Here, the two reported metrics are how much time the signal collection script spent blocking on initialization,
+and the total time required to obtain the signals, respectively. Note that "time to collect" metric accounts
+for all the time spent since the script has started initializing until the signals were made available to the bidders,
+therefore it includes "time to init", and typically some non-blocking time spent waiting for signals. Only “time to init” is blocking.
+
+## How can I contribute?
+
+Prebid has launched a Measurement Taskforce to address signal deprecation and measurement in the current environment,
+which has become a publisher-level issue. Without a solution, granularity of measurement disappears.
+If you would like to participate to help identify and develop solutions to these problems such as the one tackled
+by this submodule, please consider joining the [Measurement Taskforce](https://prebid.org/project-management-committees/).
+
+## Notes
+
+### Operation model
+
+Following is the expected data flow:
+
+* Prebid.js gets initialized, including the HUMAN RTD submodule.
+* The submodule loads the signal collection implementation script from a high-performance, low latency endpoint.
+* This script starts collecting the signals, and makes them available to the RTD submodule as soon as possible.
+* The RTD submodule places the collected signals into the ORTB structure for bid adapters to pick up.
+* Bid adapters are expected to retrieve the `ortb2.device.ext.hmns` object and incorporate it into their bid requests.
+* Bid requests having the `ortb2.device.ext.hmns` data allow their backend to make more informative requests to HUMAN Ad Fraud Defense.
+ * Should bid requests be passed to other platforms during the bidding process, adapter developers are
+ encouraged to keep `ortb2.device.ext.hmns` so that, for example, a downstream DSP can also have this data passed to HUMAN.
+
+### Remarks on the collected signals
+
+There are a few points that are worth being mentioned separately, to avoid confusion and unnecessary suspicion:
+
+* The nature of the collected signals is exactly the same as those already collected in analytics scripts
+ that arrive in the ads via existing post-bid processes.
+* The signals themselves are even less verbose than those HUMAN normally collects post-bid, because of timing / performance requirements.
+* No signals attempt to identify users. Their only purpose is to classify traffic into valid / invalid.
+* The signal collection script is external to Prebid.js. This ensures that it can be constantly kept up to date with
+ the ever-evolving nature of the threat landscape without the publishers having to rebuild their Prebid.js frequently.
+ * The signal collection script is also obfuscated, as a defense-in-depth measure in order to complicate tampering by
+ bad actors, as are all similar scripts in the industry, which is something that cannot be accommodated by Prebid.js itself.
+
+### Why is this approach an innovation?
+
+Historically, IVT protection is achieved via dropping analytics scripts and/or pixels in the ads, which enriches impression data with collected signals.
+Those signals, when analyzed by IVT protection vendors, allow distinguishing valid from invalid traffic, but only retroactively -
+after the impression was served, and all the participant infrastructures have already participated in serving the request.
+
+This not only leads to unnecessary infrastructure costs, but to uncomfortable and often difficult processes of reconciliation
+and reimbursement, or claw-back. When handled only at the post-bid stage, the true bad actors have already achieved their objectives,
+and legitimate advertisers, platforms, and publishers are left holding the bag.
+
+HUMAN’s Ad Fraud Defense solves this problem by making predictions at the pre-bid stage about whether the traffic is fraudulent,
+allowing the platforms to knowingly not participate in the IVT-generated auctions.
+
+However, the challenge in making those predictions is that even these prebid predictions rely primarily on historical data,
+which not only introduces lag, but typically might be less accurate than direct decision making (were it possible) using
+the high-quality signals obtained from the pixels and/or JS analytics scripts delivered in the ads.
+
+The HUMAN Security RTD submodule bridges the gap by introducing a new innovation: it **facilitates the very same signal
+collection that is typically performed post-bid, but at the pre-bid stage, and makes the signals available during bidding.**
+This not only permits for accurate invalid traffic detection at the earliest stages of the auction process, but diminishes
+the impacts of signal deprecation such as the loss of IP and User Agent on effective fraud mitigation.
+
+### Why is this good for publishers?
+
+In the process of Invalid Traffic reconciliation, publishers are often the last to know, as they are informed by their downstream
+partners that the inventory they had provided in good faith has been detected as invalid traffic. This is most painful when it
+happens via post-bid detection when publishers are often the last party in the chain from whom the others can collect clawbacks,
+and the publishers themselves are left with little recourse. And when invalid traffic is blocked by platforms prebid, it is after
+the fact of publishers having sent out bid requests, thus harming fill rates, revenue opportunities, and overall auction and bidding
+efficiencies. And of course, invalid traffic whether detected post-bid or pre-bid is damaging to the publisher’s reputation
+with its demand partners.
+
+The HUMAN Security RTD submodule creates a more efficient integration for the process of invalid traffic mitigation.
+Invalid traffic detection and filtration is being done already with or without the participation of publishers, and measurement
+will be done on the ad inventory because advertisers need it to manage their own ad spend. The HUMAN Security RTD submodule gives
+publishers a direct seat, and in fact the first seat, in the invalid traffic detection process, allowing it to be done effectively,
+directly, and in a way that provides the publisher with more direct insight.
+
+Existing models of signal deprecation suggest that IP protection is going to be 100 times or more less granular.
+This would normally be expected to significantly reduce the ability to do prebid publisher-side predictions. This in turn would prevent
+the ability to see if specific impressions are bad and instead potentially result in the whole publisher being identified as being
+invalid traffic by a buyer. It is important to note that the purpose of data collection by the HUMAN Security RTD submodule is
+specifically for invalid traffic detection and filtration. It will not be used for unrelated and unauthorized purposes
+like targeting audiences, etc.
+
+The HUMAN Security RTD submodule makes sure to have the best integration possible to avoid revenue loss.
+It will help publishers avoid painful clawbacks. Currently, clawbacks are based on opaque measurement processes downstream from
+publishers where the information is controlled and withheld. The HUMAN Security RTD submodule will make publishers a more direct
+party to the measurement and verification process and help make sure the origin and the recipient match.
+
+Importantly, the effective use of the HUMAN Security RTD submodule signifies to SSPs and buyers that the publisher
+is a joint partner in ensuring quality ad delivery, and demonstrates that the publisher is a premium supply source.
+
+Finally, the HUMAN Security RTD submodule sets the ecosystem up for a future where publisher level reporting is facilitated.
+This will allow for increased transparency about what is happening with publisher inventory, further enhancing and
+ensuring the value of the inventory.
+
+### FAQ
+
+#### Is latency an issue?
+
+The HUMAN Security RTD submodule is designed to minimize any latency in the auction within normal SLAs.
+
+#### Do publishers get any insight into how the measurement is judged?
+
+Having the The HUMAN Security RTD submodule be part of the prebid process will allow the publisher to have insight
+into the invalid traffic metrics as they are determined and provide confidence that they are delivering quality
+inventory to the buyer.
+
+#### How are privacy concerns addressed?
+
+The HUMAN Security RTD submodule seeks to reduce the impacts from signal deprecation that are inevitable without
+compromising privacy by avoiding re-identification. Each bid request is enriched with just enough signal
+to identify if the traffic is invalid or not.
+
+By having the The HUMAN Security RTD submodule operate at the Prebid level, data can be controlled
+and not as freely passed through the bidstream where it may be accessible to various unknown parties.
+
+Note: anti-fraud use cases typically have carve outs in laws and regulations to permit data collection
+essential for effective fraud mitigation, but this does not constitute legal advice and you should
+consult your attorney when making data access decisions.
diff --git a/dev-docs/modules/idLibrary.md b/dev-docs/modules/idLibrary.md
index f30dfa34ef..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:
@@ -26,8 +24,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 +44,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/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/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/index.md b/dev-docs/modules/index.md
index 952f2c0a61..41788113b3 100644
--- a/dev-docs/modules/index.md
+++ b/dev-docs/modules/index.md
@@ -10,11 +10,11 @@ sidebarType: 1
The core of Prebid.js contains only the foundational code needed for header bidding. Any functionality that could be considered an add-on is part of a module. These are the major categories:
-* [Bidder adapters](/dev-docs/bidders.html)
-* [Analytics adapters](/overview/analytics.html)
-* Any other extensible functionality - documented on this page
+- [Bidder adapters](/dev-docs/bidders.html)
+- [Analytics adapters](/overview/analytics.html)
+- Any other extensible functionality - documented on this page
-* TOC
+- TOC
{:toc}
{% assign module_pages = site.pages | where: "page_type", "module" %}
@@ -57,7 +57,7 @@ than others. See [the realTimeData setConfig](/dev-docs/publisher-api-reference/
-{% for page in module_pages %}{% if page.recommended == true or page.vendor_specific == true %}{% continue %}{% endif %}
+{% for page in module_pages %}{% if page.recommended == true or page.vendor_specific == true or page.enable_download == false %}{% continue %}{% endif %}
{{page.display_name}}
{{page.description}}
@@ -79,7 +79,7 @@ These modules may require accounts with a service provider.
-{% for page in module_pages %}{% if page.recommended == true %}{% continue %}{% endif %}{% if page.vendor_specific == true %}
+{% for page in module_pages %}{% if page.recommended == true or page.enable_download == false %}{% continue %}{% endif %}{% if page.vendor_specific == true %}
{{page.display_name}}
{{page.description}}
@@ -89,9 +89,35 @@ These modules may require accounts with a service provider.
+## User ID Modules
+
+UserID modules conform to a consistent set of publisher controls. The publisher can choose to run multiple user id modules, define an overall amount of time they're willing to wait for
+results. See [the userSync setConfig](/dev-docs/publisher-api-reference/setConfig.html#setConfig-ConfigureUserSyncing-UserSyncProperties) reference and the [User ID Module](/dev-docs/modules/userId) for more details.
+
+{% assign userid_module_pages = site.pages | where: "layout", "userid" %}
+
+
+
+
+ Module
+ Description
+ EID Source
+
+
+
+{% for page in userid_module_pages %}
+
+ {{page.title}}
+ {{page.description}}
+ {{page.eidsource}}
+
+{% endfor %}
+
+
+
## Further Reading
-* [Source code of all modules](https://github.com/prebid/Prebid.js/tree/master/modules)
-* [How to add a Bid Adapter](/dev-docs/bidder-adaptor.html)
-* [How to add an Analytics Adapter](/dev-docs/integrate-with-the-prebid-analytics-api.html)
-* [How to add a Real Time Data Submodule](/dev-docs/add-rtd-submodule.html)
+- [Source code of all modules](https://github.com/prebid/Prebid.js/tree/master/modules)
+- [How to add a Bid Adapter](/dev-docs/bidder-adaptor.html)
+- [How to add an Analytics Adapter](/dev-docs/integrate-with-the-prebid-analytics-api.html)
+- [How to add a Real Time Data Submodule](/dev-docs/add-rtd-submodule.html)
diff --git a/dev-docs/modules/instreamTracking.md b/dev-docs/modules/instreamTracking.md
index 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..ced4de6aca 100644
--- a/dev-docs/modules/intersectionRtdProvider.md
+++ b/dev-docs/modules/intersectionRtdProvider.md
@@ -2,6 +2,7 @@
layout: page_v2
title: Intersection Module
display_name: Intersection
+
description: Real Time Intersection
page_type: module
module_type: rtd
@@ -11,7 +12,6 @@ sidebarType : 1
---
# Intersection Module
-
{:.no_toc}
* TOC
@@ -27,6 +27,7 @@ Implementation works like this:
1. Build the Intersection module into the Prebid.js package with:
```bash
+
gulp build --modules=intersectionRtdProvider&...
```
@@ -37,6 +38,7 @@ Implementation works like this:
This module is configured as part of the `realTimeData.dataProviders` object:
```javascript
+
pbjs.setConfig({
"realTimeData": {
auctionDelay: 100,
@@ -46,14 +48,18 @@ pbjs.setConfig({
}]
}
});
+
```
+The optional `waitForIt` flag instructs the module to delay the auction until intersection data is collected for all ad units or the `auctionDelay` timeout is reached. It defaults to `false`.
+
## Output
For each bidder, the module adds intersection in a JSON format.
Example:
```javascript
+
{
"intersection":{
'boundingClientRect': {
diff --git a/dev-docs/modules/jwplayerRtdProvider.md b/dev-docs/modules/jwplayerRtdProvider.md
index dacdf35035..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
@@ -42,7 +41,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 +68,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 +185,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.
diff --git a/dev-docs/modules/konduit.md b/dev-docs/modules/konduit.md
index 720ce52d48..811753be93 100644
--- a/dev-docs/modules/konduit.md
+++ b/dev-docs/modules/konduit.md
@@ -5,16 +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
-{:.no_toc}
+{: .alert.alert-warning :}
+Prebid believes this module may no longer be maintained.
-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.
+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:
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/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/mediafilterRtdProvider.md b/dev-docs/modules/mediafilterRtdProvider.md
index 3020d971f9..74dab375c2 100644
--- a/dev-docs/modules/mediafilterRtdProvider.md
+++ b/dev-docs/modules/mediafilterRtdProvider.md
@@ -47,3 +47,11 @@ pbjs.setConfig({
}
});
```
+
+### Parameters
+
+{: .table .table-bordered .table-striped }
+
+| Name | Type | Description | Required | Default |
+| :--- | :--- | :--- | :--- | :--- |
+| `configurationHash` | String | Hash provided by The Media Trust to load the protection script | yes | n/a |
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/mobianRtdProvider.md b/dev-docs/modules/mobianRtdProvider.md
new file mode 100644
index 0000000000..cd347430ea
--- /dev/null
+++ b/dev-docs/modules/mobianRtdProvider.md
@@ -0,0 +1,15 @@
+---
+layout: page_v2
+title: Mobian Real-Time Data Provider
+display_name: Mobian Prebid Contextual Evaluation
+description: Mobian provides contextual 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 Contextual Module
+Mobian leverages AI to provide contextual measurement, inclusive of brand safety and suitability, as well as complex signals like emotion, sentiment, tonality and more.
+This real-time data module pings the Mobian Contextual API at pre-bid time so that advertisers can target and align with their choice of content across Mobian's network of partners.
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/neuwoRtdProvider.md b/dev-docs/modules/neuwoRtdProvider.md
index 667f469371..3120f6b520 100644
--- a/dev-docs/modules/neuwoRtdProvider.md
+++ b/dev-docs/modules/neuwoRtdProvider.md
@@ -1,8 +1,8 @@
---
layout: page_v2
-title: Neuwo Real-Time Data Module
-display_name: Neuwo Real-Time Data Module
-description: Enrich bids using neuwo.ai
+title: Neuwo RTD Module
+display_name: Neuwo RTD Module
+description: Enrich bids with contextual data from the Neuwo API.
page_type: module
module_type: rtd
module_code : neuwoRtdProvider
@@ -10,48 +10,112 @@ enable_download : true
sidebarType : 1
---
-# Neuwo Real-Time Data Module
+# Neuwo RTD Module
## Overview
-The Neuwo AI RTD module is an advanced AI solution for real-time data processing in the field of contextual targeting and advertising. With its cutting-edge algorithms, it allows advertisers to target their audiences with the highest level of precision based on context, while also delivering a seamless user experience.
+The Neuwo RTD provider fetches real-time contextual data from the Neuwo API. When installed, the module retrieves IAB content and audience categories relevant to the current page's content.
-The module provides advertisers with valuable insights and real-time contextual bidding capabilities. Whether you're a seasoned advertising professional or just starting out, Neuwo AI RTD module is the ultimate tool for contextual targeting and advertising.
+This data is then added to the bid request by populating the OpenRTB 2.x objects `ortb2.site.content.data` (for IAB Content Taxonomy) and `ortb2.user.data` (for IAB Audience Taxonomy). This enrichment allows bidders to leverage Neuwo's contextual analysis for more precise targeting and decision-making.
-The benefit of Neuwo AI RTD module is that it provides an alternative solution for advertisers to target their audiences and deliver relevant advertisements, as the widespread use of cookies for tracking and targeting is becoming increasingly limited.
+Here is an example scheme of the data injected into the `ortb2` object by our module:
-The RTD module uses cutting-edge algorithms to process real-time data, allowing advertisers to target their audiences based on contextual information, such as segments, IAB Tiers and brand safety. The RTD module is designed to be flexible and scalable, making it an ideal solution for advertisers looking to stay ahead of the curve in the post-cookie era.
+```javascript
+ortb2: {
+ site: {
+ content: {
+ // IAB Content Taxonomy data is injected here
+ data: [{
+ name: "www.neuwo.ai",
+ segment: [{
+ id: "274",
+ name: "Home & Garden",
+ },
+ {
+ id: "42",
+ name: "Books and Literature",
+ },
+ {
+ id: "210",
+ name: "Food & Drink",
+ },
+ ],
+ ext: {
+ segtax: 7,
+ },
+ }, ],
+ },
+ },
+ user: {
+ // IAB Audience Taxonomy data is injected here
+ data: [{
+ name: "www.neuwo.ai",
+ segment: [{
+ id: "49",
+ name: "Demographic | Gender | Female |",
+ },
+ {
+ id: "161",
+ name: "Demographic | Marital Status | Married |",
+ },
+ {
+ id: "6",
+ name: "Demographic | Age Range | 30-34 |",
+ },
+ ],
+ ext: {
+ segtax: 4,
+ },
+ }, ],
+ },
+}
+```
-Generate your token at: [neuwo.ai/generatetoken/]
+To get started, you can generate your API token at [https://neuwo.ai/generatetoken/](https://neuwo.ai/generatetoken/) or [contact us here](https://neuwo.ai/contact-us/).
## Configuration
-| Name | Scope | Description | Example | Type |
-|------------|----------|----------------------------------------|---------------|----------|
-| `name` | required | Handle of the module used in real-time data providers; for this, use 'NeuwoRTDModule' | 'NeuwoRTDModule' | static |
-| `params.publicToken` | required | Your neuwo.ai public token | `neu23-te45-idkf-44aa` (format example) | `string` |
-| `params.apiUrl` | required | Your neuwo.ai API url | `https://some-api-url.neuwo.ai/a/b/c` (format example) | `string` |
+> **Important:** You must add the domain (origin) where Prebid.js is running to the list of allowed origins in Neuwo Edge API configuration. If you have problems, [contact us here](https://neuwo.ai/contact-us/).
+
+This module is configured as part of the `realTimeData.dataProviders` object.
```javascript
-const neuwoDataProvider = {
- name: 'NeuwoRTDModule',
- params: {
- publicToken: '',
- apiUrl: ''
- }
-}
-pbjs.setConfig({realTimeData: { dataProviders: [ neuwoDataProvider ]}})
+pbjs.setConfig({
+ realTimeData: {
+ dataProviders: [{
+ name: 'NeuwoRTDModule',
+ params: {
+ neuwoApiUrl: '',
+ neuwoApiToken: '',
+ iabContentTaxonomyVersion: '3.0',
+ }
+ }]
+ }
+});
```
+**Parameters**
+
+| Name | Type | Required | Default | Description |
+| :--------------------------------- | :----- | :------- | :------ | :------------------------------------------------------------------------------------------------ |
+| `name` | String | Yes | | The name of the module, which is `NeuwoRTDModule`. |
+| `params` | Object | Yes | | Container for module-specific parameters. |
+| `params.neuwoApiUrl` | String | Yes | | The endpoint URL for the Neuwo Edge API. |
+| `params.neuwoApiToken` | String | Yes | | Your unique API token provided by Neuwo. |
+| `params.iabContentTaxonomyVersion` | String | No | `'3.0'` | Specifies the version of the IAB Content Taxonomy to be used. Supported values: `'2.2'`, `'3.0'`. |
+
## Installation
### Step 1: Install Prebid.js
-- Option 1: Use Prebid [Download](/download.html) page to build the Prebid.js package
- - Include Neuwo Real-Time Data Module
+#### Option 1
+
+Use Prebid [Download](https://docs.prebid.org/download.html) page to build the Prebid.js package and include Neuwo RTD Module
+
+#### Option 2
-- Option 2: Include `neuwoRtdProvider` in build: `gulp build --modules=rtdModule,neuwoRtdProvider,...`
+Include `neuwoRtdProvider` in build: `gulp build --modules=rtdModule,neuwoRtdProvider,...`
### Step 2: Set configuration
-Enable Neuwo Real-Time Data Module using `pbjs.setConfig` in a related Javascript context. Command example is provided in Configuration section.
+Enable Neuwo Real-Time Data Module using `pbjs.setConfig` in a related Javascript context. Command example is provided in [Configuration](#configuration) section.
diff --git a/dev-docs/modules/nodalsAiRtdProvider.md b/dev-docs/modules/nodalsAiRtdProvider.md
new file mode 100644
index 0000000000..28c12ea3ba
--- /dev/null
+++ b/dev-docs/modules/nodalsAiRtdProvider.md
@@ -0,0 +1,66 @@
+---
+layout: page_v2
+title: Nodals AI Real-Time Data Module
+display_name: Nodals AI Real-Time Data Module
+description: Nodals AI Real-Time Data Module provides a mechanism to utilise and optimise first-party signals for targeting.
+page_type: module
+module_type: rtd
+module_code : nodalsAiRtdProvider
+enable_download : true
+vendor_specific: true
+sidebarType : 1
+---
+
+# Nodals AI Real-Time Data Module
+
+## Overview
+Nodals AI provides a real-time data prebid module that will analyse first-party signals present on page load, determine the value of them to Nodals’ advertisers and add a key-value to the ad server call to indicate that value. The Nodals AI RTD module loads external code as part of this process.
+
+In order to be able to utilise this module, please contact [info@nodals.ai](mailto:info@nodals.ai) for account setup and detailed GAM setup instructions.
+
+## Build
+
+First, ensure that you include the generic Prebid RTD Module _and_ the Nodals AI RTD module into your Prebid build:
+
+```bash
+gulp build --modules=rtdModule,nodalsAiRtdProvider
+```
+
+## Configuration
+
+Update your Prebid configuration to enable the Nodals AI RTD module, as illustrated in the example below:
+
+```javascript
+pbjs.setConfig({
+ ...,
+ realTimeData: {
+ auctionDelay: 100, // optional auction delay
+ dataProviders: [{
+ name: 'nodalsAi',
+ waitForIt: true, // should be true only if there's an `auctionDelay`
+ params: {
+ propertyId: 'c10516af' // obtain your property id from Nodals AI support
+ }
+ }]
+ },
+ ...
+})
+```
+
+Configuration parameters:
+
+{: .table .table-bordered .table-striped }
+
+| Name | Scope | Description | Example | Type |
+|--------------------------|----------|-----------------------------------------------|-------------|----------|
+| `name` | required | Real time data module name: Always `'nodalsAi'` | `'nodalsAi'` | `String` |
+| `waitForIt` | optional | Set to `true` if there's an `auctionDelay` defined (defaults to `false`) | `false` | `Boolean` |
+| `params` | required | Submodule configuration parameters | `{}` | `Object` |
+| `params.propertyId` | required | Publisher specific identifier, provided by Nodals AI | `'76346cf3'` | `String` |
+| `params.storage` | optional | Optional storage configiration | `{}` | `Object` |
+| `params.storage.key` | optional | Storage key used to store Nodals AI data in local storage | `'yourKey'` | `String` |
+| `params.storage.ttl` | optional | Time in seconds to retain Nodals AI data in storage until a refresh is required | `900` | `Integer` |
+| `params.ptr` | optional | Optional partner configiration | `{}` | `Object` |
+| `params.ptr.permutive` | optional | Optional configiration for Permutive Audience Platform | `{}` | `Object` |
+| `params.ptr.permutive.cohorts` | optional | A method for the publisher to explicitly supply Permutive Cohort IDs, disabling automatic fetching by this RTD module | `['66711', '39032', '311']` | `Array` |
+| `params.ptr.permutive.storageKey` | optional | Publisher specific Permutive storage key where cohort data is held. | `'_psegs'` | `String` |
diff --git a/dev-docs/modules/oftmediaRtdProvider.md b/dev-docs/modules/oftmediaRtdProvider.md
new file mode 100644
index 0000000000..ababdb4866
--- /dev/null
+++ b/dev-docs/modules/oftmediaRtdProvider.md
@@ -0,0 +1,86 @@
+---
+layout: page_v2
+title: 152media RTD Module
+display_name: 152media
+description: Real-time data enrichment from 152media
+page_type: module
+module_type: rtd
+module_code : oftmediaRtdProvider
+enable_download : true
+sidebarType : 1
+---
+
+# 152media (Oftmedia) Real-time Data Submodule
+
+{:.no_toc}
+
+* TOC
+{:toc}
+
+## Overview
+
+The 152media Real-time Data (RTD) module enhances programmatic advertising performance by providing contextual and audience-based data at runtime. Integrated into Prebid.js, it enables publishers to:
+
+* Improve bid relevance with enriched targeting data
+* Filter unqualified or low-value bid requests
+* Leverage AI-based deal optimization
+
+This module is maintained by [152media](mailto:hello@152media.com) and requires the global `rtdModule` to function.
+
+{% include dev-docs/loads-external-javascript.md %}
+
+## Usage
+
+### Build
+
+To include the 152media RTD module in your Prebid.js build:
+
+```bash
+gulp build --modules="rtdModule,oftmediaRtdProvider"
+````
+
+> **Note:** `rtdModule` is required as a dependency.
+
+## Configuration
+
+Use `pbjs.setConfig` to initialize the 152media RTD module with the following syntax:
+
+```javascript
+pbjs.setConfig({
+ realTimeData: {
+ auctionDelay: 500, // Recommended setting
+ dataProviders: [
+ {
+ name: "oftmedia",
+ waitForIt: true, // Ensures data is available before auction starts
+ params: {
+ publisherId: "0653b3fc-a645-4bcc-bfee-b8982974dd53", // Required: Get this ID from 152media
+ keywords: ["red", "blue", "white"], // Optional: Contextual keywords
+ bidderCode: "appnexus", // Required: Targeted bidder
+ enrichRequest: true // Optional: Adds additional targeting fields
+ }
+ }
+ ]
+ }
+});
+```
+
+## Parameters
+
+| Parameter | Type | Description | Default |
+| ---------------------- | ---------------- | ------------------------------------------------------------ | ------------ |
+| `name` | String | Always `"oftmedia"` | |
+| `waitForIt` | Boolean | Ensures auction is delayed until data is ready | `false` |
+| `params.publisherId` | String | Your unique Publisher ID provided by 152media | **Required** |
+| `params.keywords` | Array of Strings | Contextual keywords for enhancing relevance | `[]` |
+| `params.bidderCode` | String | Bidder code that should receive the enriched data | **Required** |
+| `params.enrichRequest` | Boolean | Enriches the request object with extra targeting information | `false` |
+| `params.timeout` | Integer (ms) | Timeout for data retrieval (optional) | `1000` |
+
+## Output
+
+When active, the module appends targeting and/or deal data into the ad unit targeting objects and/or modifies the request payload, depending on the configuration and support by the selected bidder.
+
+## Support
+
+For questions, help, or to obtain a publisher ID, please contact [hello@152media.com](mailto:hello@152media.com).
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/optableRtdProvider.md b/dev-docs/modules/optableRtdProvider.md
new file mode 100644
index 0000000000..79c42fb4ba
--- /dev/null
+++ b/dev-docs/modules/optableRtdProvider.md
@@ -0,0 +1,156 @@
+---
+layout: page_v2
+title: Optable RTD Provider Module
+display_name: Optable RTD Module
+description: Optable Real Time Data Module
+page_type: module
+module_type: rtd
+module_code : optableRtdProvider
+enable_download : true
+vendor_specific: true
+sidebarType : 1
+---
+
+{: .alert.alert-warning :}
+This module may load a publisher-specific JavaScript bundle. The external resource provides flexibility in ID handling without the need to modify the RTD submodule source code.
+
+# Optable RTD Submodule
+{:.no_toc}
+
+* TOC
+{:toc}
+
+## Description
+
+Optable RTD submodule enriches the OpenRTB request by populating `user.ext.eids` and `user.data` using an identity graph and audience segmentation service hosted by Optable on behalf of the publisher. This RTD submodule primarily relies on the Optable bundle loaded on the page, which leverages the Optable-specific Visitor ID and other PPIDs to interact with the identity graph, enriching the bid request with additional user IDs and audience data.
+
+## Usage
+
+### Integration
+
+Compile the Optable RTD Module with other modules and adapters into your Prebid.js build:
+
+```bash
+gulp build --modules="rtdModule,optableRtdProvider,appnexusBidAdapter,..."
+```
+
+> Note that Optable RTD module is dependent on the global real-time data module, `rtdModule`.
+
+### Preloading Optable SDK bundle
+
+In order to use the module you first need to register with Optable and obtain a bundle URL. The bundle URL may be specified as a `bundleUrl` parameter to the script, or otherwise it can be added directly to the page source as:
+
+```html
+
+```
+
+In this case bundleUrl parameter is not needed and the script will await bundle loading before delegating to it.
+
+### Configuration
+
+This module is configured as part of the `realTimeData.dataProviders`. We recommend setting `auctionDelay` to 1000 ms and make sure `waitForIt` is set to `true` for the `Optable` RTD provider.
+
+```javascript
+pbjs.setConfig({
+ debug: true, // we recommend turning this on for testing as it adds more logging
+ realTimeData: {
+ auctionDelay: 1000,
+ dataProviders: [
+ {
+ name: 'optable',
+ waitForIt: true, // should be true, otherwise the auctionDelay will be ignored
+ params: {
+ bundleUrl: '',
+ adserverTargeting: '',
+ },
+ },
+ ],
+ },
+});
+```
+
+### Additional input to the module
+
+Optable bundle may use PPIDs (publisher provided IDs) from the `user.ext.eids` as input.
+In addition, other arbitrary keys can be used as input, f.e. the following:
+
+* `optableRtdConfig.email` - a SHA256-hashed user email
+* `optableRtdConfig.phone` - a SHA256-hashed [E.164 normalized phone](https://unifiedid.com/docs/getting-started/gs-normalization-encoding#phone-number-normalization) (meaning a phone number consisting of digits and leading plus sign without spaces or any additional characters, f.e. a US number would be: `+12345678999`)
+* `optableRtdConfig.postal_code` - a ZIP postal code string
+
+Each of these identifiers is completely optional and can be provided through `pbjs.mergeConfig(...)` like so:
+
+```javascript
+pbjs.mergeConfig({
+ optableRtdConfig: {
+ email: await sha256("test@example.com"),
+ phone: await sha256("12345678999"),
+ postal_code: "61054"
+ }
+})
+```
+
+Where `sha256` function can be defined as:
+
+```javascript
+async function sha256(input) {
+ return [...new Uint8Array(
+ await crypto.subtle.digest("SHA-256", new TextEncoder().encode(input))
+ )].map(b => b.toString(16).padStart(2, "0")).join("");
+}
+```
+
+To handle PPIDs and the above input - a custom `handleRtd` function may need to be provided.
+
+### Parameters
+
+{: .table .table-bordered .table-striped }
+
+| Name | Type | Description | Default | Notes |
+|--------------------------|----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------|----------|
+| name | String | Real time data module name | Always `optable` | |
+| waitForIt | Boolean | Should be set `true` together with `auctionDelay: 1000` | `false` | |
+| params | Object | | | |
+| params.bundleUrl | String | Optable bundle URL | `null` | Optional |
+| params.adserverTargeting | Boolean | If set to `true`, targeting keywords will be passed to the ad server upon auction completion | `true` | Optional |
+| params.handleRtd | Function | An optional function that uses Optable data to enrich `reqBidsConfigObj` with the real-time data. If not provided, the module will do a default call to Optable bundle. The function signature is `[async] (reqBidsConfigObj, optableExtraData, mergeFn) => {}` | `null` | Optional |
+
+## Publisher Customized RTD Handler Function
+
+When there is more pre-processing or post-processing needed prior/post calling Optable bundle - a custom `handleRtd`
+function can be supplied to do that.
+This function will also be responsible for the `reqBidsConfigObj` enrichment.
+It will also receive the `optableExtraData` object, which can contain the extra data required for the enrichment and
+shouldn't be shared with other RTD providers/bidders.
+`mergeFn` parameter taken by `handleRtd` is a standard Prebid.js utility function that take an object to be enriched and
+an object to enrich with: the second object's fields will be merged into the first one (also see the code of an example
+mentioned below):
+
+```javascript
+mergeFn(
+ reqBidsConfigObj.ortb2Fragments.global, // or other nested object as needed
+ rtdData,
+);
+```
+
+A `handleRtd` function implementation has access to its surrounding context including capturing a `pbjs` object, calling `pbjs.getConfig()` and f.e. reading off the `consentManagement` config to make the appropriate decision based on it.
+
+## Example
+
+If you want to see an example of how the optable RTD module works, run the following command:
+
+```bash
+gulp serve --modules=optableRtdProvider,consentManagementGpp,consentManagementTcf,appnexusBidAdapter
+```
+
+and then open the following URL in your browser:
+
+[`http://localhost:9999/integrationExamples/gpt/optableRtdProvider_example.html`](http://localhost:9999/integrationExamples/gpt/optableRtdProvider_example.html)
+
+Open the browser console to see the logs.
+
+## Maintainer contacts
+
+Any suggestions or questions can be directed to [prebid@optable.co](mailto:prebid@optable.co).
+
+Alternatively please open a 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.
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 .
diff --git a/dev-docs/modules/paapi.md b/dev-docs/modules/paapi.md
index 8a47f9402e..e158687e78 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,8 @@ 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) |
+|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:
@@ -72,30 +74,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 +102,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 +124,161 @@ 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
+3. (Optional, but recommended) implementing a `buildPAAPIConfigs` method to support [parallel auctions](#parallel)
-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.
+### Input parameters
-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 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 |
+
+### Output values
+
+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:
+
+{: .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 |
-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).
+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).
+
+
+## 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
-- [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 58%
rename from dev-docs/modules/fledgeForGpt.md
rename to dev-docs/modules/paapiForGpt.md
index 5f64dfa5a5..82f0959b2f 100644
--- a/dev-docs/modules/fledgeForGpt.md
+++ b/dev-docs/modules/paapiForGpt.md
@@ -1,9 +1,9 @@
---
layout: page_v2
page_type: module
-title: Module - fledgeForGpt
+title: Module - paapiForGpt
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,41 +24,42 @@ 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)
- (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();
+ // ...
}
})
```
-See the [API reference](/dev-docs/publisher-api-reference/setPAAPIConfigForGpt.html) for more options.
+## Refreshing Ads
+
+It's important to invoke the `pbjs.setPAAPIConfigForGPT()` function within the `bidsBackHandler` whenever new bids are requested, such as when refreshing ad slots. This ensures that the auctionConfig is manually applied to a GPT slot when autoconfig is disabled. Without this manual configuration, GPT slots will not be properly set up to handle new bids, potentially resulting in duplicate impression calls.
+
+See the [API reference](/dev-docs/publisher-api-reference/setPAAPIConfigForGPT.html) for more options.
## Related Reading
diff --git a/dev-docs/modules/permutiveRtdProvider.md b/dev-docs/modules/permutiveRtdProvider.md
index b09e2f0dba..10c3836212 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
@@ -61,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` | - |
@@ -71,14 +71,17 @@ 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 GDPR enforcement is configured _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
+{% 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.
```javascript
diff --git a/dev-docs/modules/prebidServer.md b/dev-docs/modules/prebidServer.md
index 22bb4c6737..627a94a890 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,
+ },
],
});
```
@@ -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. |
@@ -96,6 +96,9 @@ 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. |
+| `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"}`|
+| `endpointCompression` | Optional | Boolean | Gzip compress the auction request payload when supported and debug mode is off. Adds `gzip=1` to the request URL. |
+| `filterBidderlessCalls` | Optional | Boolean | When `true`, ad units that have no bidders defined are excluded from Prebid Server requests. Defaults to `false`. | `true` |
If `endpoint` and `syncEndpoint` are objects, these are the supported properties:
@@ -112,6 +115,7 @@ If `endpoint` and `syncEndpoint` are objects, these are the supported properties
- If `bidders` is omitted, only adUnits that also omit bidders will be sent to Prebid Server. See the [stored impressions](#stored-imp) example below.
- If the `s2sConfig` timeout is not specified, Prebid Server will utilize a configured default for `tmax`.
- When using the `endpoint` or `syncEndpoint` object configs, you should define both properties. If either property is not defined, Prebid Server requests for that type of user will not be made. If you do not need to distinguish endpoints for consent reasons, you can simply define the same URL value in both fields or use the String version of the field (which is configured to use defined URL for all users).
+- When `endpointCompression` is enabled, Prebid.js compresses the request body sent to Prebid Server and appends `gzip=1` to the endpoint URL. This feature is skipped when debug mode is active or the browser lacks GZIP support. Do not use if your PBS Host does not yet support gzip request compression.
- When `allowUnknownBidderCodes` is `true`, bidders that have not been explicitly requested in [`adUnit.bids`](../adunit-reference.html#adunitbids) may take part in the auction. This can break custom logic that relies on the availability of a bid request object for any given bid. Known scenarios where custom code won't get the request when there's an "unknown bidder":
- There will not be a [`bidRequested`](/dev-docs/publisher-api-reference/getEvents.html) event.
- In the [MASS custom renderers](/dev-docs/modules/mass.html#configuration-parameters) module, `payload.bidRequest` will be undefined.
@@ -203,6 +207,50 @@ Here's how it works:
1. The s2sConfig.bidders array contains 'tripleliftVideo' telling Prebid.js to direct bids for that code to the server
1. Finally, the extPrebid.aliases line tells Prebid Server to route the 'tripleliftVideo' biddercode to the 'triplelift' server-side adapter.
+Make sure to register your aliases' [`gvlMapping`](/dev-docs/publisher-api-reference/setConfig.html#setConfig-gvlMapping) via setConfig as well.
+
+### Routing for Multiple PBS instances
+
+Bids:
+
+```javascript
+[{
+ bidder: 'foobar',
+ params: {...},
+},
+{
+ bidder: 'foobar',
+ params: {...},
+ pbsHost: 'foobar-2'
+}]
+```
+
+s2sConfig:
+
+```javascript
+[{
+ accountId: 1234,
+ bidders: ['foobar'],
+ enabled: true,
+ endpoint: {
+ noP1Consent : 'https://pbs.auction/openrtb2/auction',
+ p1Consent : 'https://pbs.auction/openrtb2/auction'
+ }
+},
+{
+ accountId: 5678,
+ bidders: ['foobar-2'],
+ syncBidders: ['foobar'],
+ enabled: true,
+ endpoint: {
+ noP1Consent : 'https://pbs.alt.auction/openrtb2/auction',
+ p1Consent : 'https://pbs.alt.auction/openrtb2/auction'
+ }
+}]
+```
+
+The above would distribute `bid[0]` to s2s endpoint `https://pbs.auction/openrtb2/auction`, whereas `bid[1]` will be distributed to `https://pbs.alt.auction/openrtb2/auction`. The syncBidders is used to sync both with the original biddercode to as well as applying bidder specific FPD for pbs calls via bidderconfig.
+
### Video via s2sConfig
Supporting video through the Server-to-Server route can be done by providing a couple of extra arguments on the `extPrebid` object. e.g.
diff --git a/dev-docs/modules/previousAuctionInfo.md b/dev-docs/modules/previousAuctionInfo.md
new file mode 100644
index 0000000000..948bc87923
--- /dev/null
+++ b/dev-docs/modules/previousAuctionInfo.md
@@ -0,0 +1,97 @@
+---
+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
+ highestBidCurrency: "USD", // 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
+ rejectionReason: "Invalid request ID", // 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[].highestBidCurrency | string | The currency of the highest Prebid bid observed for an 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[].rejectionReason | string | The error reason, if one was present | null |
+| ortb2.ext.prebid.previousauctioninfo[].timestamp | integer | Time that the previous auction info payload was collected | |
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/pubmaticRtdProvider.md b/dev-docs/modules/pubmaticRtdProvider.md
new file mode 100644
index 0000000000..f1c159f4a2
--- /dev/null
+++ b/dev-docs/modules/pubmaticRtdProvider.md
@@ -0,0 +1,92 @@
+---
+layout: page_v2
+page_type: module
+title: PubMatic RTD Provider
+display_name: PubMatic RTD Module
+description: RTD module for Prebid provided by PubMatic for dynamic yield optimization
+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 provides dynamic yield optimization by fetching real-time pricing floor data and generating targeting data for ad server integration and reporting. The module integrates with Prebid's Price Floors system as per [Dynamic Floor Data Provider](https://docs.prebid.org/dev-docs/modules/floors.html#floor-data-provider-interface) guidelines.
+
+## Integration
+
+Step 1: Contact PubMatic to get a publisher ID and create your first profile. Additional settings like floor multipliers, and key-values enablement can be managed through the PubMatic UI.
+
+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 | |
+
+## Targeting Keys
+
+The module sets the following targeting keys for ad server integration and reporting:
+
+{: .table .table-bordered .table-striped }
+| Key | Description | Values |
+| :-- | :---------- | :----- |
+| pm_ym_flrs | Whether RTD floor was applied to the auction | 0 (not applied)/1 (applied) |
+| pm_ym_flrv | Floor value after applying dynamic multipliers | Decimal value (e.g., "1.25") |
+| pm_ym_bid_s | Bid outcome status | 0 (no bid), 1 (won), 2 (floored) |
diff --git a/dev-docs/modules/pubxaiRtdProvider.md b/dev-docs/modules/pubxaiRtdProvider.md
index 26a0f84923..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
@@ -48,18 +47,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
...,
});
diff --git a/dev-docs/modules/qortexRtdProvider.md b/dev-docs/modules/qortexRtdProvider.md
index 189d492345..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
@@ -22,12 +21,12 @@ sidebarType : 1
The Qortex RTD module appends contextual segments to the bidding object based on the content of a page using the Qortex API.
-Upon load, the Qortex context API will analyze the bidder page (video, text, image, etc.) and will return a [Content object](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf#page=26). The module will then merge that object into the appropriate bidders' `ortb2.site.content`, which can be used by prebid adapters that use `site.content` data.
+Upon load, if the `Qortex Group Id` and module parameters provided during configuration is active, the Qortex context API will attempt to generate and return a [Content object](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf#page=26) using indexed data from provided page content. The module will then merge that object into the appropriate bidders' `ortb2.site.content`, which can be used by prebid adapters that use `site.content` data.
## Build
```SH
-gulp build --modules="rtdModule,qortexRtdProvider,qortexBidAdapter,..."
+gulp build --modules="rtdModule,qortexRtdProvider,..."
```
> `rtdModule` is a required module to use Qortex RTD module.
@@ -50,24 +49,20 @@ pbjs.setConfig({
params: {
groupId: 'ABC123', //required
bidders: ['qortex', 'adapter2'], //optional (see below)
- tagConfig: { // optional, please reach out to your account manager for configuration reccommendation
- videoContainer: 'string',
- htmlContainer: 'string',
- attachToTop: 'string',
- esm6Mod: 'string',
- continuousLoad: 'string'
- }
+ enableBidEnrichment: true, //optional (see below)
+ tagConfig: { } // optional, please reach out to your account manager for configuration reccommendation
}
}]
}
});
```
-### Paramter Details
+### Parameter Details
{: .table .table-bordered .table-striped }
| Name |Type | Description |Required | Notes |
| :--------------- | :------------ | :------------------------------------------------------------------ |:---------|:------------ |
| `groupId` | String | The Qortex groupId linked to the publisher | Yes | Your account manager can provide this information for you if needed, it is required for any type integration and access to Qortex services |
| `bidders` | Array of Strings | this is a list containing the bidder code of the prebid adapters you would like this module to impact | No | If this parameter is included, `ortb2.site.content` will be updated *only* for adapters in this array. If this parameter is omitted, the RTD module will default to updating `ortb2.site.content` on *all* bid adapters being used on the page|
-| `tagConfig` | Object | The config settings that could be used to initialize the Qortex integration on your page | No | A preconfigured object for this step will be provided to you by the Qortex team. The RTD module will only carry out this process if a valid tagConfig is provided.
+|`enableBidEnrichment`| Bool | Indicate whether to opt-in to the features of the RTD module that use our API to enrich bids with first party data for contextuality | No | Enabling this feature will allow this module to interact with the Qortex AI contextuality server for indexing and analysis. Please use caution when adding this module to pages that may contain personal user data or proprietary information. By default, the adapter will disable these features if this is marked `null` or omitted from the configuration parameters.|
+|`tagConfig` | Object | The config settings that could be used to initialize the Qortex integration on your page | No | A preconfigured object for this step will be provided to you by the Qortex team. The RTD module will only carry out this process if a valid tagConfig is provided. If this parameter is not present, the Qortex integration can still be configured and loaded manually on your page outside of prebid. The RTD module will continue to initialize and operate as normal.|
diff --git a/dev-docs/modules/raveltechRtdProvider.md b/dev-docs/modules/raveltechRtdProvider.md
new file mode 100644
index 0000000000..596720699f
--- /dev/null
+++ b/dev-docs/modules/raveltechRtdProvider.md
@@ -0,0 +1,84 @@
+---
+layout: page_v2
+title: Raveltech RTD Module
+display_name: Raveltech RTD Module
+description: Raveltech Real Time Data Module
+page_type: module
+module_type: rtd
+module_code : raveltechRtdProvider
+enable_download : true
+vendor_specific: true
+sidebarType : 1
+---
+
+# Raveltech RTD Module for Prebid.js
+
+## Overview
+
+```text
+Module Name: Raveltech RTD Provider
+Module Type: RTD Provider
+Maintainer: maintainers@raveltech.io
+```
+
+The RavelTech RTD (Real-Time Data) module for Prebid.js enables publishers to integrate seamlessly with Ravel Technologies' privacy-focused solution, ensuring bidder requests are anonymized before reaching SSPs and DSPs. By leveraging the Ravel Privacy Bus, this module prevents the transmission of personally identifiable information (PII) in bid requests, strengthening privacy compliance and security.
+
+## How It Works
+
+The module operates in two modes:
+
+1. Bid URL Replacement:
+** The module modifies the bid request URL of the configured bidders to pass through the Ravel proxy, ensuring that all IDs are anonymized.
+2. Bid Duplication (if `preserveOriginalBid` is enabled):
+** The module duplicates the original bid request, sending one request as-is and another through the Ravel proxy with anonymized IDs.
+
+## Configuration
+
+To enable the Raveltech RTD module, you need to configure it with a list of bidders and specify whether to preserve the original bid request.
+For the anonymization feature to work, you also need to load a javascript in the header of your HTML page:
+
+```html
+
+```
+
+**NB: the URL to load zkad.js may change depending your setup. Please reach out to your contact at Ravel Technologies to ensure you have the correct URL.**
+
+Please contact to activate your adapter after installation or for more information.
+
+### Build
+
+```bash
+gulp build --modules="rtdModule,raveltechRtdProvider,appnexusBidAdapter,..."
+```
+
+> Note that the global RTD module, `rtdModule`, is a prerequisite of the raveltech RTD module.
+
+### Parameters
+
+| Parameter | Type | Description |
+|--------------------|--------|-------------|
+| `bidders` | Array | A list of bidder codes (or their alias if an alias is used) that should have their bid requests anonymized via Ravel. |
+| `preserveOriginalBid` | Boolean | If `true`, the original bid request is preserved, and an additional bid request is sent through the Ravel proxy. If `false`, the original bid request is replaced with the Ravel-protected request. |
+
+### Example Configuration
+
+```javascript
+pbjs.setConfig({
+ realTimeData: {
+ dataProviders: [{
+ name: 'raveltech',
+ params: {
+ bidders: ['appnexus', 'rubicon'],
+ preserveOriginalBid: true
+ }
+ }]
+ }
+});
+```
+
+## Privacy Features
+
+The RavelTech RTD module allows publishers to implement the following privacy protections:
+
+- Personally Identifiable Information (PII) is either removed or converted into Anonymized IDs (RIDs).
+- Bid requests are routed through an anonymized proxy before reaching the SSP, ensuring IP address anonymization.
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..b394d20b48 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
@@ -28,6 +27,10 @@ Two modes are supported:
## How to Use the Module
+{: .alert.alert-warning :}
+Since Prebid 10, schain is treated as first party data: this module just copies `schain.config` into `ortb2.source.ext.schain`. You may provide it (or `ortb2.source.schain`) directly, removing the need for this module.
+Note that bidder-specific first party data is merged with global first party data, while up until Prebid 9 bidder-specific schains override the global schain. The simplest way to upgrade to 10 is to avoid using both.
+
First, build the schain module into your Prebid.js package:
```bash
@@ -87,20 +90,29 @@ pbjs.setBidderConfig({
You can find more information about the `pbjs.setBidderConfig` function in the [Publisher API Reference]({{site.baseurl}}/dev-docs/publisher-api-reference/setBidderConfig.html).
+{: .alert.alert-warning :}
+**Prebid 10 :** You can either use above method or `ortb2.source.schain` property to pass schain. You can read more about passing [First Party Data](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html#first-party-data). As far as precedence is concerned, `ortb2.source.schain` property takes precedence over the schain config setup via `pbjs.setConfig` using above mentioned method.
+
### Global and Bidder-Specific Together
Yes, you can set both global and bidder-specific SChain configs. When together, the schain config setup via `pbjs.setConfig` acts as a global config that applies to all your bidders, while `pbjs.setBidderConfig` overrides the global config for the noted bidder(s).
## SChain Config Syntax
+{: .alert.alert-warning :}
+**Prebid 10 :** Validation will be automatically performed by the **validationFpdModule** if you have included it in your Prebid.js build. If the `skipValidation` parameter is set to true in the validationFpdModule configuration, validation will be skipped. Please visit the [validationFpdModule documentation](https://docs.prebid.org/dev-docs/modules/validationFpdModule.html) for more information.
+
{: .table .table-bordered .table-striped }
| SChain Param | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
-| validation | optional | string | `'strict'`: In this mode, schain object will not be passed to adapters if it is invalid. Errors are thrown for invalid schain object. `'relaxed'`: Errors are thrown for an invalid schain object but the invalid schain object is still passed to adapters. `'off'`: No validations are performed and schain object is passed as-is to adapters. The default value is `'strict'`. | 'strict' |
+| validation (deprecated from Prebid 10) | optional | string | `'strict'`: In this mode, schain object will not be passed to adapters if it is invalid. Errors are thrown for invalid schain object. `'relaxed'`: Errors are thrown for an invalid schain object but the invalid schain object is still passed to adapters. `'off'`: No validations are performed and schain object is passed as-is to adapters. The default value is `'strict'`. | 'strict' |
| config | required | object | This is the full Supply Chain object sent to bidders conforming to the [IAB OpenRTB SupplyChain Object Specification](https://github.com/InteractiveAdvertisingBureau/openrtb/blob/master/supplychainobject.md). | (See examples above) |
## Adapter Information
+{: .alert.alert-warning :}
+**Prebid 10 :** Adapters can read `bidderRequest.ortb2.source.ext.schain` instead of `bidRequest.schain`.
+
Adapters can read the `bidRequest.schain` object and pass it through to their endpoint. The adapter does not need to be concerned about whether a bidder-specific schain was provided; the system will provide the relevant one.
## Adapters Supporting the schain Module
diff --git a/dev-docs/modules/scope3RtdProvider.md b/dev-docs/modules/scope3RtdProvider.md
new file mode 100644
index 0000000000..37ba682928
--- /dev/null
+++ b/dev-docs/modules/scope3RtdProvider.md
@@ -0,0 +1,215 @@
+---
+layout: page_v2
+title: Scope3 RTD Provider
+display_name: Scope3 RTD Provider
+description: Scope3 Real-Time Data Provider for Prebid.js
+page_type: module
+module_type: rtd
+module_code: scope3RtdProvider
+enable_download: true
+vendor_specific: true
+sidebarType: 1
+---
+
+# Scope3 RTD Provider
+
+The Scope3 RTD (Real-Time Data) Provider enables publishers to leverage Scope3's Agentic Execution Engine (AEE) for real-time media buying optimization. This module sends complete OpenRTB requests to Scope3 and receives contextual signals that enhance auction targeting.
+
+{:.no_toc}
+
+* TOC
+{:toc}
+
+## Overview
+
+The Scope3 RTD Provider:
+
+* Sends complete OpenRTB 2.x requests including extended UIDs, geo data, and device information
+* Receives AEE signals for include/exclude targeting and macros
+* Supports bidder-specific segments and deal IDs
+* Enables configurable GAM targeting keys
+* Works client-side without API keys
+
+## Usage
+
+### Basic Configuration
+
+```javascript
+pbjs.setConfig({
+ realTimeData: {
+ auctionDelay: 100,
+ dataProviders: [{
+ name: "scope3",
+ waitForIt: true,
+ params: {
+ orgId: "your-org-id"
+ }
+ }]
+ }
+});
+```
+
+### Full Configuration
+
+```javascript
+pbjs.setConfig({
+ realTimeData: {
+ auctionDelay: 200,
+ dataProviders: [{
+ name: "scope3",
+ waitForIt: true,
+ params: {
+ orgId: "your-org-id",
+ endpoint: "",
+ timeout: 1500,
+ bidders: ["appnexus", "rubicon", "pubmatic"],
+ includeKey: "scope3_include",
+ excludeKey: "scope3_exclude",
+ macroKey: "scope3_macro",
+ publisherTargeting: true,
+ advertiserTargeting: true,
+ cacheEnabled: true,
+ cacheTtl: 300000
+ }
+ }]
+ }
+});
+```
+
+## Configuration Parameters
+
+{: .table .table-bordered .table-striped }
+
+| Name | Type | Required | Description |
+|------|------|----------|-------------|
+| orgId | String | Yes | Your Scope3 organization ID |
+| endpoint | String | No | API endpoint (default: `https://prebid.scope3.com/prebid`) |
+| timeout | Number | No | Request timeout in milliseconds (default: 1000) |
+| bidders | Array | No | List of bidders to target (default: all auction bidders) |
+| includeKey | String | No | GAM targeting key for include signals (default: "scope3_include") |
+| excludeKey | String | No | GAM targeting key for exclude signals (default: "scope3_exclude") |
+| macroKey | String | No | GAM targeting key for macro data (default: "scope3_macro") |
+| publisherTargeting | Boolean | No | Enable publisher-level targeting (default: true) |
+| advertiserTargeting | Boolean | No | Enable advertiser-level targeting (default: true) |
+| cacheEnabled | Boolean | No | Enable response caching (default: true) |
+| cacheTtl | Number | No | Cache TTL in milliseconds (default: 300000) |
+
+## Response Format
+
+The Scope3 AEE returns signals in this format:
+
+```json
+{
+ "aee_signals": {
+ "include": ["sports_fan", "auto_intender"],
+ "exclude": ["competitor_exposed"],
+ "macro": "eyJjb250ZXh0IjogImhpZ2hfdmFsdWUifQ==",
+ "bidders": {
+ "appnexus": {
+ "segments": ["seg1", "seg2"],
+ "deals": ["DEAL123"]
+ },
+ "rubicon": {
+ "segments": ["seg3"],
+ "deals": []
+ }
+ }
+ }
+}
+```
+
+## GAM Integration
+
+### Line Item Setup
+
+Create GAM line items with key-value targeting using the configured keys:
+
+**Include Targeting:**
+
+* Key: `scope3_include` (or your configured includeKey)
+* Values: `sports_fan`, `auto_intender`, etc.
+* Operator: "is any of"
+
+**Exclude Targeting:**
+
+* Key: `scope3_exclude` (or your configured excludeKey)
+* Values: `competitor_exposed`, etc.
+* Operator: "is none of"
+
+**Macro Targeting:**
+
+* Key: `scope3_macro` (or your configured macroKey)
+* Values: Base64-encoded contextual data
+
+### Example Line Item Configuration
+
+```text
+Creative: 300x250 Banner
+Targeting:
+ * scope3_include is any of "sports_fan", "auto_intender"
+ * scope3_exclude is none of "competitor_exposed"
+ * scope3_macro is "eyJjb250ZXh0IjogImhpZ2hfdmFsdWUifQ=="
+```
+
+## Data Flow
+
+1. **Request**: Module sends complete OpenRTB request to Scope3 including:
+ * All extended user IDs
+ * Geo and device data
+ * Ad unit configurations
+ * Bidder list
+
+2. **Processing**: Scope3's AEE analyzes the request context
+
+3. **Response**: AEE returns targeting signals:
+ * Global include/exclude segments
+ * Bidder-specific segments and deals
+ * Contextual macro data
+
+4. **Application**: Module applies signals to bid request:
+ * Global targeting in `ortb2Fragments.global.site.ext.data`
+ * Bidder segments in `ortb2Fragments.bidder[].user.data`
+ * Deal IDs in ad unit `ortb2Imp.ext`
+
+## Testing
+
+### Integration Testing
+
+Use the Hello World example to verify integration:
+
+1. Configure the module with your orgId
+2. Monitor network requests to confirm data is sent
+3. Check that targeting data appears in bid requests
+4. Verify GAM line items receive the targeting keys
+
+### Debug Mode
+
+Enable Prebid debug mode to see targeting data:
+
+```javascript
+pbjs.debug = true;
+```
+
+Check the browser console for RTD provider logs and bid request modifications.
+
+## Privacy Considerations
+
+The Scope3 RTD Provider:
+
+* Respects user consent choices
+* Only processes data necessary for contextual targeting
+* Does not store personal information
+* Complies with privacy regulations when properly configured
+
+## Support
+
+For questions about the Scope3 RTD Provider:
+
+* Technical issues: Open a GitHub issue in the Prebid.js repository
+* Integration support: Contact your Scope3 representative
+* Documentation: Submit PRs to improve this documentation
+
+## Related Modules
+
+* [Real-Time Data Module]({{site.baseurl}}/dev-docs/modules/realTimeData.html)
+* [RTD Sub-Module Development]({{site.baseurl}}/dev-docs/add-rtd-submodule.html)
diff --git a/dev-docs/modules/scoremedia.md b/dev-docs/modules/scoremedia.md
new file mode 100644
index 0000000000..430c77b423
--- /dev/null
+++ b/dev-docs/modules/scoremedia.md
@@ -0,0 +1,121 @@
+---
+layout: bidder
+title: scoremedia
+description: Prebid scoremedia Bidder Adapter
+pbjs: true
+biddercode: scoremedia
+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 | `"795dtj21"` | `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: 'scoremedia',
+ params: {
+ tagId: '795dtj21'
+ }
+ }]
+ },
+ // Video adUnit
+ {
+ code: 'video1',
+ mediaTypes: {
+ video: {
+ playerSize: [640, 480],
+ context: 'instream'
+ }
+ },
+ bids: [{
+ bidder: 'scoremedia',
+ params: {
+ tagId: '795dtj21'
+ }
+ }]
+ },
+ // Native adUnit
+ {
+ code: 'native1',
+ mediaTypes:
+ native: {
+ title: {
+ required: true
+ },
+ image: {
+ required: true
+ },
+ sponsoredBy: {
+ required: true
+ }
+ }
+ },
+ bids: [{
+ bidder: 'scoremedia',
+ params: {
+ tagId: '795dtj21'
+ }
+ }]
+ },
+ // Multiformat Ad
+ {
+ code: 'multi1',
+ mediaTypes: {
+ video: {
+ playerSize: [640, 480],
+ context: 'instream'
+ },
+ banner: {
+ sizes: [[300, 250], [300,600]]
+ }
+ },
+ bids: [{
+ bidder: 'scoremedia',
+ params: {
+ tagId: '795dtj21',
+ videoTagId: 'testscore'
+ }
+ }]
+ };
+];
+```
diff --git a/dev-docs/modules/semantiqRtdProvider.md b/dev-docs/modules/semantiqRtdProvider.md
new file mode 100644
index 0000000000..d15f254b0f
--- /dev/null
+++ b/dev-docs/modules/semantiqRtdProvider.md
@@ -0,0 +1,57 @@
+---
+layout: page_v2
+title: SemantIQ RTD module
+display_name : SemantIQ
+description: SemantIQ RTD module allows to retrieve real-time data from the SemantIQ service.
+page_type: module
+module_type: rtd
+module_code: semantiqRtdProvider
+enable_download: true
+sidebarType: 1
+vendor_specific: true
+
+---
+
+# Semantiq Rtd Provider
+
+## Description
+
+This module retrieves real-time data from the SemantIQ service and populates ORTB data.
+
+You need to obtain a company ID from [Audienzz](https://audienzz.com) for the module to function properly. Contact [service@audienzz.ch](mailto:service@audienzz.ch) for details.
+
+## Integration
+
+1. Include the module into your `Prebid.js` build.
+
+ ```sh
+ gulp build --modules='rtdModule,semantiqRtdProvider,...'
+ ```
+
+1. Configure the module via `pbjs.setConfig`.
+
+ ```js
+ pbjs.setConfig({
+ ...
+ realTimeData: {
+ dataProviders: [
+ {
+ name: 'semantiq',
+ waitForIt: true,
+ params: {
+ companyId: 12345,
+ timeout: 1000,
+ },
+ },
+ ],
+ },
+ });
+ ```
+
+## Parameters
+
+{: .table .table-bordered .table-striped }
+|Name |Required|Description |Type |Default value|Example |
+|---------+--------+------------------------------------------------------------+--------+-------------+---------------------|
+|companyId|No |Company ID obtained from [Audienzz](https://audienzz.com). |number \| number[] |- |12345 |
+|timeout |No |The maximum time to wait for a response in milliseconds. |number |1000 |3000 |
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/spm.md b/dev-docs/modules/spm.md
new file mode 100644
index 0000000000..15f6ab7a41
--- /dev/null
+++ b/dev-docs/modules/spm.md
@@ -0,0 +1,121 @@
+---
+layout: bidder
+title: Sportplatz Media
+description: Prebid spm Bidder Adapter
+pbjs: true
+biddercode: spm
+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 | `"n1x53vta"` | `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: 'spm',
+ params: {
+ tagId: 'n1x53vta'
+ }
+ }]
+ },
+ // Video adUnit
+ {
+ code: 'video1',
+ mediaTypes: {
+ video: {
+ playerSize: [640, 480],
+ context: 'instream'
+ }
+ },
+ bids: [{
+ bidder: 'spm',
+ params: {
+ tagId: 'n1x53vta'
+ }
+ }]
+ },
+ // Native adUnit
+ {
+ code: 'native1',
+ mediaTypes:
+ native: {
+ title: {
+ required: true
+ },
+ image: {
+ required: true
+ },
+ sponsoredBy: {
+ required: true
+ }
+ }
+ },
+ bids: [{
+ bidder: 'spm',
+ params: {
+ tagId: 'n1x53vta'
+ }
+ }]
+ },
+ // Multiformat Ad
+ {
+ code: 'multi1',
+ mediaTypes: {
+ video: {
+ playerSize: [640, 480],
+ context: 'instream'
+ },
+ banner: {
+ sizes: [[300, 250], [300,600]]
+ }
+ },
+ bids: [{
+ bidder: 'spm',
+ params: {
+ tagId: 'n1x53vta',
+ videoTagId: 'n1x53vta'
+ }
+ }]
+ };
+];
+```
diff --git a/dev-docs/modules/storageControl.md b/dev-docs/modules/storageControl.md
new file mode 100644
index 0000000000..9c467841f0
--- /dev/null
+++ b/dev-docs/modules/storageControl.md
@@ -0,0 +1,124 @@
+---
+layout: page_v2
+page_type: module
+title: Module - Storage Control
+description: Check or enforce disclosure of device storage use
+module_code : storageControl
+display_name : storageControl
+enable_download : true
+recommended: true
+sidebarType : 1
+min_js_version: 10.0.0
+---
+
+# Storage Control Module
+
+This module checks other modules' use of device storage against their disclosed list of storage keys and warns about or (optionally) denies undisclosed storage use.
+Additionally, it provides an API to list all disclosed storage keys.
+
+## Background
+
+The TCF Global Vendor List (GVL) requires vendors to disclose their use of device storage by publishing a [JSON file](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/Vendor%20Device%20Storage%20%26%20Operational%20Disclosures.md) that lists all the identifiers (cookie names and/or localStorage keys) and their associated domains.
+The Storage Control module uses that information to validate that when a Prebid module accesses storage, it uses identifiers that have been disclosed as in use for first party domains.
+Vendors not in the GVL can provide a disclosure JSON to Prebid directly - see [adapter integration](#adapter-integration) below.
+
+## Publisher Integration
+
+Include this module in the Prebid bundle:
+
+ ```bash
+ gulp build --modules=storageControl,...
+ ```
+
+If you are instead using Prebid as an NPM dependency, you'll need to explicitly import disclosure metadata.
+This is done by including `metadata/prebid-core` and pairing each module import with a corresponding `import 'prebid.js/metadata/'`. For example:
+
+```javascript
+import {pbjs} from 'prebid.js';
+import 'prebid.js/modules/userId';
+import 'prebid.js/modules/sharedIdSystem';
+
+import 'prebid.js/metadata/prebid-core';
+import 'prebid.js/metadata/userId';
+import 'prebid.js/metadata/sharedIdSystem';
+
+// ...
+```
+
+### Module Configuration
+
+This module exposes a single configuration option `storageControl.enforcement`, e.g.:
+
+```javascript
+pbjs.setConfig({
+ storageControl: {
+ enforcement: 'off'
+ }
+})
+```
+
+Possible values for it are:
+
+{: .table .table-bordered .table-striped }
+|Value | Description |
+| ------------ | ------------ |
+|`'off''` | The default. Use of undisclosed storage keys only generates a console warning. |
+|`'strict'` | Deny access to undisclosed storage keys |
+|`'allowAliases'` | Deny access to undisclosed storage keys, unless the use is from an alias of a module that does disclose them, in which case only log a warning. This can happen for instance when a bidder provides an alias linked to a different vendor in the GVL. |
+
+### Storage Disclosure Summary
+
+With this module included, the `getStorageUseDisclosures` API returns a list of all disclosures pertaining the first party domain for all installed modules. For example:
+
+```javascript
+pbjs.getStorageUseDisclosures()
+
+/**
+ [
+ {
+ "disclosedIn": "https://cdn.jsdelivr.net/gh/prebid/Prebid.js/metadata/disclosures/prebid/sharedId-optout.json",
+ "disclosedBy": [
+ "sharedIdSystem"
+ ],
+ "identifier": "_pubcid_optout",
+ "type": "cookie",
+ "maxAgeSeconds": 31536000,
+ "cookieRefresh": false,
+ "purposes": []
+ },
+ ...
+ ]
+ */
+```
+
+The return value follows the same format as the TCF [disclosures array](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/Vendor%20Device%20Storage%20%26%20Operational%20Disclosures.md), except that
+
+- `domain`/`domains` is omitted (and always `'*'` in the original disclosure, as Prebid's storage is always on the first party domain);
+- each item in the array contains these additional fields:
+
+{: .table .table-bordered .table-striped }
+|Name | Type | Description |
+| ------------ | ------------ | ------------ |
+|`disclosedIn` | String | URL of the JSON containing this disclosure. Can be `null` for identifiers chosen trough publisher configuration - such as those set by the [userId module](/dev-docs/modules/userId.html) |
+|`disclosedBy` | Array of Strings | Names of the Prebid modules providing this disclosure |
+
+
+
+## Adapter Integration
+
+Modules that use storage should publish a [disclosure file](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/Vendor%20Device%20Storage%20%26%20Operational%20Disclosures.md) listing all keys that the pass to `storageManager` for the first party domain (`'*'`). This can be done by either:
+
+- providing a GVL ID in your adapter. The corresponding `deviceStorageDisclosureUrl` from the GVL is then used as your disclosure.
+- providing a `disclosureURL` directly. This does not require membership in the GVL, and overrides its disclosure if provided. For example:
+
+```javascript
+registerBidder({
+ code: 'exampleBidder',
+ disclosureURL: 'https://exampleBidder.com/disclosures.json'
+})
+```
+
+## Related Reading
+
+- [Vendor Device Storage & Operational Disclosures](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/Vendor%20Device%20Storage%20%26%20Operational%20Disclosures.md)
+- [Consent string and vendor list formats](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20Consent%20string%20and%20vendor%20list%20formats%20v2.md)
diff --git a/dev-docs/modules/symitriDapRtdProvider.md b/dev-docs/modules/symitriDapRtdProvider.md
new file mode 100644
index 0000000000..66211f6908
--- /dev/null
+++ b/dev-docs/modules/symitriDapRtdProvider.md
@@ -0,0 +1,114 @@
+---
+layout: page_v2
+title: Symitri DAP Real Time Data Provider Module
+display_name: Symitri DAP Real Time Data Provider Module
+description: Symitri DAP Real Time Data Provider Module
+page_type: module
+module_type: rtd
+module_code : symitriDapRtdProvider
+enable_download : true
+vendor_specific: true
+sidebarType : 1
+---
+
+# Symitri DAP Real Time Data Provider Module
+
+{:.no_toc}
+
+* TOC
+{:toc}
+
+The Symitri Data Activation Platform (DAP) is a privacy-first system that protects end-user privacy by only allowing them to be targeted as part of a larger cohort. Symitri DAP Real time data Provider automatically invokes the DAP APIs and submit audience segments and the Secure Ad ID(SAID) to the bid-stream. SAID is a JWT/JWE which carries with it the cohorts and only a side-car or trusted server in the demand-side platform is allowed to see its contents.
+
+## Publisher Usage
+
+1. Build the symitriDapRTD module into the Prebid.js package with:
+
+ ```bash
+ gulp build --modules=symitriDapRtdProvider,...
+ ```
+
+2. Use `setConfig` to instruct Prebid.js to initilaize the symitriDapRtdProvider module, as specified below.
+
+### Configuration
+
+```javascript
+pbjs.setConfig({
+ realTimeData: {
+ auctionDelay: 2000,
+ dataProviders: [
+ {
+ name: "symitriDap",
+ waitForIt: true,
+ params: {
+ apiHostname: '',
+ apiVersion: 'x1'|'x2',
+ domain: 'your-domain.com',
+ identityType: 'simpleid'|'compositeid'|'hashedid',
+ identityValue: '',
+ segtax: 708,
+ pixelUrl: '',
+ }
+ }
+ ]
+ }
+});
+```
+
+Please reach out to your Symitri account representative() to get provisioned on the DAP platform.
+
+**Config Syntax details:**
+
+{: .table .table-bordered .table-striped }
+| Name |Type | Description | Notes |
+| :------------ | :------------ | :------------ |:------------ |
+| 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 | 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 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 | |
+
+### 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, can also be used for single already hashed identifiers:
+
+```bash
+{
+ "identityType": "compositeid",
+ "identityValue": "HEM:,ID5:,RampId:",
+ ...
+}
+ "identityType": "hashedid",
+ "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:
+
+```bash
+gulp serve --modules=rtdModule,symitriDapRtdProvider,appnexusBidAdapter,sovrnBidAdapter
+```
+
+and then point your browser at:
+""
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.
diff --git a/dev-docs/modules/gdprEnforcement.md b/dev-docs/modules/tcfControl.md
similarity index 70%
rename from dev-docs/modules/gdprEnforcement.md
rename to dev-docs/modules/tcfControl.md
index 27906a944b..c3d385eeaa 100644
--- a/dev-docs/modules/gdprEnforcement.md
+++ b/dev-docs/modules/tcfControl.md
@@ -1,42 +1,46 @@
---
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
---
-# GDPR Enforcement Module
+# TCF Control Module
{: .no_toc }
+{: .alert.alert-info :}
+Until Prebid.js 9.0 this was known as the "GDPR Enforcement" module.
+
* TOC
{: toc }
{% 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.
+1. Allows the page to define which activities should be restricted at the Prebid.js level.
+2. Actively restricts those activities based on user consent data.
The following table details the Prebid.js activities that fall under the [Transparency and Consent Framework (TCF)](https://iabeurope.eu/iab-europe-transparency-consent-framework-policies/) scope:
{: .table .table-bordered .table-striped }
+
| 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+ |
@@ -50,41 +54,42 @@ The following table details the Prebid.js activities that fall under the [Transp
## Page Integration
-A page needs to define configuration rules about how Prebid.js should enforce each in-scope activity.
+A page needs to define configuration rules about how Prebid.js should restricts each in-scope activity.
{: .alert.alert-warning :}
**Important Legal Note:** Prebid.org cannot provide legal advice about GDPR or any other governmental regulation. Our aim is to provide a toolkit of functionality that will let publishers configure header bidding as defined by their legal counsel. We will consider feature suggestions, and review any code offered by the community.
{: .alert.alert-info :}
-To turn on Prebid.js enforcement you must:
+To turn on Prebid.js restrictions 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 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. | |
| gdpr.rules[].purpose | `String` | Supported values: "storage" (Purpose 1), "basicAds" (Purpose 2), "personalizedAds" (purpose 4), "measurement" (Purpose 7), "transmitPreciseGeo" (Special Feature 1) | "storage" |
-| gdpr.rules[].enforcePurpose | `Boolean` | Determines whether to enforce the purpose consent. The default in Prebid.js 3.x is not to enforce purposes. Prebid.js 4.0 enforces legal basis for Purposes 1 and 2 by default. | true |
-| gdpr.rules[].enforceVendor | `Boolean` | Determines whether to enforce vendor signals for this purpose. The default in Prebid.js 3.x is not to enforce vendor signals. Prebid.js 4.0 enforces legal basis for Purposes 1 and 2 by default. | true |
-| gdpr.rules[].vendorExceptions | `Array of Strings` | Defines a list of biddercodes or module names that are exempt from the enforcement of this Purpose. | ["bidderA", "userID-module-B"] |
-| gdpr.rules[].softVendorExceptions | `Array of Strings` | Defines a list of biddercodes or module names that are exempt from the enforcement of vendor signals for this purpose. Unlike with `vendorExceptions`, Purpose consent is still enforced . | ["bidderA", "userID-module-B"] |
+| gdpr.rules[].enforcePurpose | `Boolean` | Determines whether to enforce the purpose consent. The default in Prebid.js 3.x was not to enforce any purposes. Prebid.js 4.0 and later require legal basis for Purposes 1 and 2 by default. | true |
+| gdpr.rules[].enforceVendor | `Boolean` | Determines whether to check vendor signals for this purpose. The default in Prebid.js 3.x is not to check vendor signals. Prebid.js 4.0 and later require legal basis for Purposes 1 and 2 by default. | true |
+| gdpr.rules[].vendorExceptions | `Array of Strings` | Defines a list of biddercodes or module names that are exempt from determining legal basis for this Purpose. **Note:** Prebid.org recommends working with a privacy lawyer before making enforcement exceptions for any vendor. | ["bidderA", "userID-module-B"] |
+| gdpr.rules[].softVendorExceptions | `Array of Strings` | Defines a list of biddercodes or module names that are exempt from the checking vendor signals for this purpose. Unlike with `vendorExceptions`, Purpose consent is still checked. **Note:** Prebid.org recommends working with a privacy lawyer before making enforcement exceptions for any vendor. | ["bidderA", "userID-module-B"] |
| gdpr.rules[].eidsRequireP4Consent | `Boolean` | Only relevant on the personalizedAds `purpose`. If true, user IDs and EIDs will not be shared without evidence of consent for TCF Purpose 4. If false, evidence of consent for any of Purposes 2-10 is sufficient for sharing user IDs and EIDs. Defaults to false. See [note](#note-transmitEids) | true |
| strictStorageEnforcement | `Boolean` | If false (the default), allows some use of storage regardless of purpose 1 consent - see [note](#strictStorageEnforcement) below | true |
Notes:
-* By default, Prebid allows some limited use of storage even when purpose 1 consent was not given: this is limited to non-PII, such as [category translation mappings](/dev-docs/modules/categoryTranslation.html), or temporary test data used to probe the browser's storage features. If `strictStorageEnforcement` is true, purpose 1 consent will always be enforced for any access to storage.
-* To accomodate Prebid.js modules and adapters that don't have GVL IDs, the vendorExceptions list is based on Prebid.js biddercodes instead of Global Vendor List (GVL) IDs (i.e. "bidderA" instead of "12345").
+* By default, Prebid allows some limited use of storage even when purpose 1 consent was not given: this is limited to non-PII, such as [category translation mappings](/dev-docs/modules/categoryTranslation.html), or temporary test data used to probe the browser's storage features. If `strictStorageEnforcement` is true, Purpose 1 consent will always be enforced for any access to storage.
+* To accommodate Prebid.js modules and adapters that don't have GVL IDs, the vendorExceptions list is based on Prebid.js biddercodes instead of Global Vendor List (GVL) IDs (i.e. "bidderA" instead of "12345").
* An alternate way of establishing a GVL mapping is to define a 'gvlMapping' object:
```javascript
pbjs.setConfig({
gvlMapping: {
- bidderA: 12345,
+ bidderA: 12345,
bidderB: 67890
}
});
@@ -95,13 +100,15 @@ pbjs.setConfig({
The following examples cover a range of use cases and show how Prebid.js supports
configuration of different business rules.
+{% 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.
```javascript
pbjs.setConfig({
consentManagement: {
gdpr: {
- cmpApi: 'iab', // activates the enforcement module
+ cmpApi: 'iab', // activates the control module
defaultGdprScope: true,
rules: [{ // these are the default values
purpose: "storage",
@@ -111,10 +118,17 @@ configuration of different business rules.
purpose: "basicAds",
enforcePurpose: true,
enforceVendor: true
+ },{
+ purpose: "personalizedAds",
+ enforcePurpose: true,
+ enforceVendor: true
},{
purpose: "measurement",
enforcePurpose: true,
enforceVendor: true
+ },{
+ purpose: "transmitPreciseGeo",
+ enforcePurpose: true
}]
}
}
@@ -142,9 +156,9 @@ configuration of different business rules.
enforcePurpose: true,
enforceVendor: true
},{
- purpose: "basicAds",
- enforcePurpose: true,
- enforceVendor: true,
+ purpose: "basicAds",
+ enforcePurpose: true,
+ enforceVendor: true,
vendorExceptions: ["firstPartyBidder"]
}]
```
@@ -168,38 +182,40 @@ configuration of different business rules.
purpose: "measurement",
enforcePurpose: true,
enforceVendor: true,
- vendorExceptions: ["analyticsB"]
+ vendorExceptions: ["analyticsB"]
}]
```
-## Basic Enforcement
+## Basic Legal Basis
Prebid.js does not have access to the Global Vendor List (GVL), so it implements
a "basic" form of TCF 'legal basis' validation using the supplied consent string.
-A goal of 'basic enforcement' is to confirm that there's enough evidence of consent to pass data on to vendors who do have access to the GVL and can fully parse and enforce.
+A goal of 'basic legal basis' is to confirm that there's enough evidence of consent to pass data on to vendors who do have access to the GVL and can fully parse and take any necessary action.
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:
-* Configuration rules enforce both consent and vendor signals and:
+* Configuration rules check both consent and vendor signals and:
* we have evidence of consent for both, or
* we have evidence of consent for the purpose, and the vendor is excepted through `softVendorException`, or
* the vendor is excepted through `vendorExceptions`;
-* Configuration rules enforce only purpose consent and either:
+* Configuration rules check only purpose consent and either:
* we have evidence of consent for the purpose, or
* the vendor is excepted through `vendorExceptions`;
-* Configuration rules enforce only vendor signals and either:
+* Configuration rules check only vendor signals and either:
* we have evidence of consent for the vendor, or
* the vendor is excepted through either `softVendorExceptions` or `vendorExceptions`;
-* Configuration rules enforce neither purpose consent nor vendor signal.
+* Configuration rules check neither purpose consent nor vendor signal.
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
@@ -213,7 +229,7 @@ By default, sending user IDs and EIDs to bid adapters or RTD modules (the `trans
* We have evidence of consent for any purpose between 2 and 10, and the vendor is excepted through `softVendorException` in at least one of: `basicAds`, `personalizedAds`, or `measurement`;
* The vendor is excepted through `vendorExceptions` in at least one of `basicAds`, `personalizedAds`, or `measurement`.
-This behavior can be changed to the same "basic enforcement" algorithm described above, tied to TCF Purpose 4, by setting `eidsRequireP4Consent: true` on a `personalizedAds` rule:
+This behavior can be changed to the same "basic legal basis" algorithm described above, tied to TCF Purpose 4, by setting `eidsRequireP4Consent: true` on a `personalizedAds` rule:
```javascript
...
@@ -225,17 +241,17 @@ This behavior can be changed to the same "basic enforcement" algorithm described
## Build the Package
-Follow the basic build instructions in the GitHub Prebid.js repo's main [README](https://github.com/prebid/Prebid.js/blob/master/README.md). Include the base consent management module and this enforcement module as additional options on the **gulp build** command:
+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 control 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/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/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'
}]
}
// ...
diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md
index 3025b6e144..911cd4b2e7 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):
@@ -71,9 +71,13 @@ 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"` |
+| autoRefresh | Optional | Boolean | Refresh IDs automatically when their configuration changes. Defaults to `false`. | `true` |
+| retainConfig | Optional | Boolean | When set to `false`, previously configured IDs are removed if they are not present in updated configuration. Defaults to `true`. | `false` |
+| enforceStorageType | Optional | Boolean | Restrict submodules to storing IDs only in the location defined by `storage.type`. | `true` |
The table below has the options that are common across ID systems. See the sections below for specific configuration needed by each system and examples.
@@ -83,12 +87,13 @@ 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 -%}{% 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 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` |
@@ -97,7 +102,7 @@ The table below has the options that are common across ID systems. See the secti
## Permissions
-Publishers can control which user ids are shared with the bid adapters they choose to work with by using the bidders array. The bidders array is part of the User id module config, publisher may choose to send an id to some bidders but not all, the default behavior is that each user id go to all bid adapters the publisher is working with.
+Publishers can control which user ids are shared with the bid adapters they choose to work with by using the bidders array. The bidders array is part of the User id module config, publisher may choose to send an id to some bidders but not all, the default behavior is that each user id goes to all bid adapters the publisher is working with.
Use the optional `bidders` parameter to define an array of bidder codes to which this user ID may be sent.
@@ -159,7 +164,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": {
@@ -202,9 +207,22 @@ The corresponding user id object and the eids array will look like this:
{% assign userid_pages = site.pages | where: "layout", "userid" | sort_natural: "title" %}
+
+
+ ID System Name
+ Prebid.js Attr: bidRequest.userId
+ EID Source
+ Example
+
{% for page in userid_pages %}
-{{page.title}}
+
+ {{page.title}}
+ {{page.bidRequestUserId}}
+ {{page.eidsource}}
+ {{page.example}}
+
{% endfor %}
+
## Bidder Adapter Implementation
@@ -216,50 +234,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" |
-| 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" |
-| 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" |
-
For example, the adapter code might do something like:
```javascript
@@ -344,9 +318,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
## ESP Configurations
@@ -357,6 +333,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 | |
@@ -411,4 +388,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/modules/userid-submodules/33across.md b/dev-docs/modules/userid-submodules/33across.md
index 903bc2a9df..c923df0b9d 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,15 +24,18 @@ gulp build --modules=33acrossIdSystem,userId
The following configuration parameters are available:
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | The name of this sub-module | `"33acrossId"` |
| params ||| Details for the sub-module initialization ||
| params.pid | Required | String | Partner ID (PID) | Please reach out to [PrebidUIM@33across.com](mailto:PrebidUIM@33across.com) and request your PID |
-| params.storeFpid | Optional | Boolean | Indicates whether a supplemental first-party ID may be stored to improve addressability | `false` (default) or `true` |
+| 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 |||||
| 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) |
@@ -41,12 +47,11 @@ pbjs.setConfig({
userIds: [{
name: "33acrossId",
params: {
- pid: "0010b00002GYU4eBAH", // Example ID
- storeFpid: true
+ pid: "0010b00002GYU4eBAH" // Example ID
},
storage: {
name: "33acrossId",
- type: "html5",
+ type: "cookie&html5",
expires: 30,
refreshInSeconds: 8 * 3600
}
@@ -54,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).
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/adplus.md b/dev-docs/modules/userid-submodules/adplus.md
new file mode 100644
index 0000000000..fefbb4611c
--- /dev/null
+++ b/dev-docs/modules/userid-submodules/adplus.md
@@ -0,0 +1,43 @@
+---
+layout: userid
+title: AdPlus ID
+description: AdPlus ID User ID sub-module
+useridmodule: adplusIdSystem
+bidRequestUserId: adplusId
+eidsource: ad-plus.com.tr
+example: '"1111"'
+---
+
+## AdPlus ID Configuration
+
+Please make sure to add the AdPlus user ID sub-module to your Prebid.js package with:
+
+```shell
+gulp build --modules=adplusIdSystem,userId
+```
+
+{: .table .table-bordered .table-striped }
+
+| Param under userSync.userIds[] | Scope | Type | Description | Example |
+| --- | --- | --- | --- | --- |
+| name | Required | String | The name of this module: `"adplusId"` | `"adplusId"` |
+| storage.expires | Optional | Number | How long (in days) the user ID information will be stored | `7` (recommended) |
+| storage.refreshInSeconds | Optional | Number | How many seconds until the ID is refreshed | `24 * 3600` (recommended) |
+
+## AdPlus ID Example
+
+```javascript
+pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: "adplusId",
+ storage: {
+ name: "adplusId",
+ type: "cookie&html5",
+ expires: 7,
+ refreshInSeconds: 24 * 3600
+ }
+ }]
+ }
+});
+```
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 1ad65a74ff..d96c00a0d5 100644
--- a/dev-docs/modules/userid-submodules/britepool.md
+++ b/dev-docs/modules/userid-submodules/britepool.md
@@ -3,6 +3,10 @@ layout: userid
title: BritePool
description: BritePool User ID sub-module
useridmodule: britepoolIdSystem
+enable_download: false
+bidRequestUserId: britepoolid
+eidsource: britepool.com
+example: '"1111"'
---
{: .alert.alert-warning :}
@@ -13,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
@@ -23,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
new file mode 100644
index 0000000000..2e2194a1c7
--- /dev/null
+++ b/dev-docs/modules/userid-submodules/ceeIdSystem.md
@@ -0,0 +1,81 @@
+---
+layout: userid
+title: CEEIdSystem
+description: CEEID User ID sub-module
+useridmodule: ceeIdSystem
+bidRequestUserId: ceeId
+eidsource: ceeid.eu
+example: '"1111"'
+---
+
+## Prebid Configuration
+
+First, make sure to add ceeIdSystem to your Prebid.js package with:
+
+```bash
+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"` |
+| storage | Required | Object | Container of storage options. | |
+| storage.type | Required | String | Type of storage to use | `"cookie"` |
+| storage.name | Required | String | Name of storage to set | `"ceeIdToken"` |
+| 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.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. 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({
+ userSync: {
+ userIds: [{
+ name: 'ceeId',
+ storage: {
+ type: 'cookie',
+ name: 'ceeIdToken',
+ expires: 7,
+ refreshInSeconds: 360
+ },
+ params: {
+ 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
+ }
+ }]
+ }
+});
+```
+
+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({
+ userSync: {
+ userIds: [{
+ name: 'ceeId',
+ storage: {
+ type: 'cookie',
+ name: 'ceeIdToken',
+ expires: 7,
+ refreshInSeconds: 360
+ },
+ params: {
+ cookieName: 'name' // Your custom name of token to read from cookies or local storage
+ }
+ }]
+ }
+});
+```
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 6a56d887d6..171b2c0b4d 100644
--- a/dev-docs/modules/userid-submodules/deepintent.md
+++ b/dev-docs/modules/userid-submodules/deepintent.md
@@ -2,7 +2,10 @@
layout: userid
title: Deepintent
description: Deepintent User ID sub-module
-useridmodule: deepintentIdSystem
+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 console.log({ data })` |
+| 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"` |
+| params.gamObjectReference | Optional | Object | This is a reference to the Google Ad Manager (GAM) object, which will be used to set targeting. If this parameter is not provided, the group reporting will not be configured. | `googletag` |
+| params.gamParameterName | Optional | String | The name of the targeting parameter that will be used to pass the group. If not specified, the default value is `intent_iq_group`. | `"intent_iq_group"` |
+| params.adUnitConfig | Optional | Number | Determines how the `placementId` parameter is extracted in the report (default is 1). Possible values: 1 – adUnitCode first, 2 – placementId first, 3 – only adUnitCode, 4 – only placementId | `1` |
+| params.sourceMetaData | Optional | String | This metadata can be provided by the partner and will be included in the requests URL as a query parameter | `"123.123.123.123"` |
+| params.sourceMetaDataExternal | Optional | Number | This metadata can be provided by the partner and will be included in the requests URL as a query parameter | `123456` |
+| params.iiqServerAddress | Optional | String | The base URL for the IntentIQ API server. If parameter is provided in `configParams`, it will be used. | `"https://domain.com"` |
+| params.iiqPixelServerAddress | Optional | String | The base URL for the IntentIQ pixel synchronization server. If parameter is provided in `configParams`, it will be used. | `"https://domain.com"` |
+| params.reportingServerAddress | Optional | String | The base URL for the IntentIQ reporting server. If parameter is provided in `configParams`, it will be used. | `"https://domain.com"` |
+| params.reportMethod | Optional | String | Defines the HTTP method used to send the analytics report. If set to `"POST"`, the report payload will be sent in the body of the request. If set to `"GET"` (default), the payload will be included as a query parameter in the request URL. |`"GET"` |
+| params.siloEnabled | Optional | Boolean | Determines if first-party data is stored in a siloed storage key. When set to `true`, first-party data is stored under a modified key that appends `_p_` plus the partner value rather than using the default storage key. The default value is `false`. | `true` |
+| params.groupChanged | Optional | Function | A callback that is triggered every time the user’s A/B group is set or updated. |`(group) => console.log('Group changed:', group)` |
+| params.chTimeout | Optional | Number | Maximum time (in milliseconds) to wait for Client Hints from the browser before sending request. Default value is `10ms` | `30` |
+| params.additionalParameters | Optional | Array | This parameter allows sending additional custom key-value parameters with specific destination logic (sync, VR, winreport). Each custom parameter is defined as an object in the array. | `[ { parameterName: “abc”, parameterValue: 123, destination: [1,1,0] } ]` |
+| params.additionalParameters [0].parameterName | Required | String | Name of the custom parameter. This will be sent as a query parameter. | `"abc"` |
+| params.additionalParameters [0].parameterValue | Required | String / Number | Value to assign to the parameter. | `123` |
+| params.additionalParameters [0].destination | Required | Array | Array of numbers either `1` or `0`. Controls where this parameter is sent `[sendWithSync, sendWithVr, winreport]`. | `[1, 0, 0]` |
### Configuration example
-```javascript
-pbjs.setConfig({
- userSync: {
- userIds: [
- {
- name: "intentIqId",
- params: {
- partner: 123456, // valid partner id
- percentage: 95,
- enableCookieStorage: true
- },
- storage: {
- type: "html5",
- name: "intentIqId", // set localstorage with this name
- expires: 60,
- refreshInSeconds: 4 * 3600, // refresh ID every 4 hours to ensure it's fresh
- },
- },
- ],
- syncDelay: 3000,
- },
-});
-```
-
```javascript
pbjs.setConfig({
userSync: {
userIds: [{
name: "intentIqId",
params: {
- partner: 123456 // valid partner id
- pcid: PCID_VARIABLE, // string value, dynamically loaded into a variable before setting the configuration
- pai: PAI_VARIABLE , // string value, dynamically loaded into a variable before setting the configuration
- percentage: 95,
- enableCookieStorage: false
+ partner: 123456, // valid partner id
+ timeoutInMillis: 500,
+ browserBlackList: "chrome",
+ callback: (data) => {...}, // your logic here
+ groupChanged: (group) => console.log('Group is', group),
+ manualWinReportEnabled: true, // Optional parameter
+ domainName: "currentDomain.com",
+ gamObjectReference: googletag, // Optional parameter
+ gamParameterName: "intent_iq_group", // Optional parameter
+ adUnitConfig: 1, // Extracting placementId strategy (adUnitCode or placementId order of priorities)
+ sourceMetaData: "123.123.123.123", // Optional parameter
+ sourceMetaDataExternal: 123456, // Optional parameter
+ reportMethod: "GET", // Optional parameter
+ chTimeout: 10, // Optional parameter
+ additionalParameters: [ // Optional parameter
+ {
+ parameterName: "abc",
+ parameterValue: 123,
+ destination: [1, 1, 0] // sendWithSync: true, sendWithVr: true, winreport: false
+ },
+ {
+ parameterName: "xyz",
+ parameterValue: 111,
+ destination: [0, 1, 1] // sendWithSync: false, sendWithVr: true, winreport: true
+ }
+ ]
},
storage: {
type: "html5",
name: "intentIqId", // set localstorage with this name
- expires: 60
+ expires: 0,
+ refreshInSeconds: 0
}
- }],
- syncDelay: 3000
+ }]
}
});
```
diff --git a/dev-docs/modules/userid-submodules/jixie.md b/dev-docs/modules/userid-submodules/jixie.md
new file mode 100644
index 0000000000..8fa3f89cfd
--- /dev/null
+++ b/dev-docs/modules/userid-submodules/jixie.md
@@ -0,0 +1,49 @@
+---
+layout: userid
+title: Jixie ID
+description: Jixie ID User ID sub-module
+useridmodule: jixieId
+bidRequestUserId: jixieId
+eidsource: jixie.io
+example: '"1111"'
+---
+
+
+The Jixie ID module is specially useful for publishers that will connect with Jixie bidder through PrebidServer adapter feature of PrebidJS and/or for publishers that are unable to integrate with the Jixie ID/event script to still acquire the important Jixie client ID for users.
+
+For assistance setting up your module, please contact us at
+
+Add the Jixie ID to your Prebid.js Package with:
+
+```bash
+gulp build --modules=userId,jixieIdSystem
+```
+
+## Jixie ID Registration
+
+Please reach out to [partners.jixie.io](mailto:partners.jixie.io) to request your `accountid`
+
+## Jixie ID Configuration
+
+{: .table .table-bordered .table-striped }
+
+| Param under userSync.userIds[] | Scope | Type | Description | Example |
+| --- | --- | --- | --- | --- |
+| name | Required | String | The name of Module | `"jixieId"` |
+| params | optional | Object | Container of all module params. | |
+| params.accountid | optional | String | This is your `accountid` as provided by Jixie. | `Mo165qXxxx` |
+
+## DMD ID Example
+
+```javascript
+pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: 'jixieId',
+ params: {
+ accountid: 'Mo165qXxxx' // provided to you by Jixie
+ }
+ }]
+ }
+});
+```
diff --git a/dev-docs/modules/userid-submodules/kinesso.md b/dev-docs/modules/userid-submodules/kinesso.md
index 0253366081..f8adbb2f04 100644
--- a/dev-docs/modules/userid-submodules/kinesso.md
+++ b/dev-docs/modules/userid-submodules/kinesso.md
@@ -3,6 +3,9 @@ layout: userid
title: Kinesso ID
description: Kinesso ID User ID sub-module
useridmodule: kinessoIdSystem
+bidRequestUserId: kpuid
+eidsource: kpuid.com
+example: '"1111"'
---
@@ -15,6 +18,7 @@ The Kinesso identity solution creates a persistent cross domain authenticated us
The Kinesso ID sub adapter sets two cookies, one as a third party cookie and the other as a first party cookie in the publisher's domain. These cookies are merged with the user's hashed email address (when present) server side and sent to Kinesso. The combined output looks like this:
{: .table .table-bordered .table-striped }
+
| kpuid | knsso | hid | account_id | created on |
| --- | --- | --- | --- | --- |
| `` | `` | `` | `` | `` |
@@ -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 =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 +48,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 +101,12 @@ 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`, `sharethrough`, `sonobi`, `vidazoo`, `zetassp`, `triplelift`, `nexxen` 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
+
+* `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:
@@ -100,9 +124,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`), `sharethrough`, `vidazoo`, `zetassp`, `triplelift`, `nexxen` and `fpid` behave the same way.
+
+For the attributes `lipbid` (nonID), `uid2`, `medianet`, `magnite`, `bidswitch`, `pubmatic`, `openx`, `sovrn`, `index`, `thetradedesk` (`tdid`), `sharethrough`, `vidazoo`, `zetassp`, `triplelift`, `nexxen` 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
+ }
+ }
+}
+```
-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.
+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
@@ -126,10 +195,8 @@ pbjs.setConfig({
## LiveIntent ID configuration
-{: .alert.alert-info :}
-NOTE: For optimal performance, the LiveIntent ID sub-module should be called at every opportunity. It is best not to use `params.storage` with this sub-module as it has its own optimal caching mechanism.
-
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | The name of this sub-module. | `liveIntentId` |
@@ -139,8 +206,11 @@ 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`), `sharethrough`, `vidazoo`, `zetassp`, `triplelift`, `segments`, `nexxen` 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`|
@@ -148,6 +218,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 +278,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"
}
}
}]
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'
+ }
+ }]
+ }
+});
+```
diff --git a/dev-docs/modules/userid-submodules/lotame.md b/dev-docs/modules/userid-submodules/lotame.md
index f9d9e89a3a..0b03b81f7d 100644
--- a/dev-docs/modules/userid-submodules/lotame.md
+++ b/dev-docs/modules/userid-submodules/lotame.md
@@ -3,31 +3,36 @@ layout: userid
title: Lotame Panorama ID
description: Lotame Panorama ID User ID sub-module
useridmodule: lotamePanoramaIdSystem
+bidRequestUserId: lotamePanoramaId
+eidsource: crwdcntrl.net
+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 ID. For more information on how the Panorama ID 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).
Add it to your Prebid.js package with:
-{: .alert.alert-info :}
+```bash
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
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | The name of the module | "lotamePanoramaId" |
diff --git a/dev-docs/modules/userid-submodules/mediawallah.md b/dev-docs/modules/userid-submodules/mediawallah.md
index 14e5e1bd06..7dde08f051 100644
--- a/dev-docs/modules/userid-submodules/mediawallah.md
+++ b/dev-docs/modules/userid-submodules/mediawallah.md
@@ -3,6 +3,9 @@ layout: userid
title: MediaWallah OpenLinkID
description: MediaWallah OpenLinkID User ID sub-module
useridmodule: mwOpenLinkIdSystem
+bidRequestUserId: mwOpenLinkId
+eidsource: mediawallahscript.com
+example: '"1111"'
---
@@ -10,8 +13,9 @@ MediaWallah's openLink is an anonymous person based ID that enables buyers and s
Add support for MediaWallah OpenLinkID to your Prebid.js package with:
-{: .alert.alert-info :}
+```bash
gulp build --modules=userId,mwOpenLinkIdSystem
+```
## MediaWallah OpenLinkID Registration
@@ -19,7 +23,8 @@ MediaWallah requires the creation of an accountId a partnerId in order to take a
## MediaWallah OpenLinkID Configuration
-
+{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | The name of this module. | `'mwOpenLinkId'` |
@@ -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..534f88ce8b 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/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 .
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..5577abfe23 100644
--- a/dev-docs/modules/userid-submodules/onekey.md
+++ b/dev-docs/modules/userid-submodules/onekey.md
@@ -19,19 +19,21 @@ 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).
## 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
{: .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/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'
+ }
+ }
+ ]
+ }
+});
+```
diff --git a/dev-docs/modules/userid-submodules/pair.md b/dev-docs/modules/userid-submodules/pair.md
index b53ca71ec9..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"` |
@@ -45,8 +47,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 cleamroom liveramp
-
+// value in 'pairId' local storage/cookie entry will be combined with ids provided by cleamroom liveramp
pbjs.setConfig({
userSync: {
userIds: [{
diff --git a/dev-docs/modules/userid-submodules/parrable.md b/dev-docs/modules/userid-submodules/parrable.md
index f022af4c33..99bdf612ec 100644
--- a/dev-docs/modules/userid-submodules/parrable.md
+++ b/dev-docs/modules/userid-submodules/parrable.md
@@ -2,7 +2,11 @@
layout: userid
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..."}'
---
@@ -10,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
@@ -24,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/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.
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/pubmatic.md b/dev-docs/modules/userid-submodules/pubmatic.md
new file mode 100644
index 0000000000..296fe7cc3e
--- /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 | String | 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
+ }
+ }]
+ }
+});
+```
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/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"
+ }]
+ }
+})
+```
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/taboola.md b/dev-docs/modules/userid-submodules/taboola.md
new file mode 100644
index 0000000000..5e6cca82e7
--- /dev/null
+++ b/dev-docs/modules/userid-submodules/taboola.md
@@ -0,0 +1,60 @@
+---
+layout: userid
+title: Taboola ID
+description: Taboola ID User ID sub-module
+useridmodule: taboolaIdSystem
+bidRequestUserId: taboolaId
+eidsource: taboola.com
+example: '"abc123def456"'
+---
+
+
+Taboola is a global leader in powering recommendations across the open web. The Taboola ID module allows publishers to enable identity support for Taboola demand by leveraging a persistent user ID from Taboola's identity infrastructure.
+
+This ID helps improve addressability, performance, and monetization opportunities across Taboola-integrated supply paths, particularly in environments where third-party cookies are limited or unavailable.
+
+The Taboola privacy policy can be found at [www.taboola.com/privacy-policy](https://www.taboola.com/privacy-policy).
+
+Add it to your Prebid.js package with:
+
+```bash
+gulp build --modules=taboolaIdSystem,userId
+```
+
+## Taboola ID Configuration
+
+The Taboola ID module does not require any configuration parameters. If needed, it supports an optional `storage` config to persist the ID locally.
+
+{: .alert.alert-info :}
+NOTE: The Taboola ID module supports both first-party and server-side Prebid identity environments.
+
+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 | `"taboolaId"` |
+| storage ||| | |
+| storage.name | Required | String | The name of the cookie or html5 local storage key | `"taboolaId"` (recommended) |
+| storage.type | Required | String | This is where the taboola user ID will be stored | `"cookie&html5"` (recommended) or `"html5"` |
+| storage.expires | Strongly Recommended | Number | How long (in days) the user ID information will be stored | `365` (recommended) |
+
+## Taboola ID Example
+
+```javascript
+pbjs.setConfig({
+ userSync: {
+ userIds: [
+ {
+ name: 'taboolaId',
+ storage: { //Optionally specify where to store the ID, e.g. cookies or localStorage
+ name: 'taboolaId',
+ type: 'html5', // or 'html5&cookie'
+ expires: 365 // days
+ }
+ }
+ ]
+ }
+});
+```
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
new file mode 100644
index 0000000000..27d005b70e
--- /dev/null
+++ b/dev-docs/modules/userid-submodules/tncIdSystem.md
@@ -0,0 +1,57 @@
+---
+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
+
+First, make sure to add the TNCID submodule to your Prebid.js package with:
+
+```bash
+gulp build --modules=tncIdSystem,userId
+```
+
+## TNCIdSystem module Configuration
+
+{% include dev-docs/loads-external-javascript.md %}
+
+You can configure this submodule in your `userSync.userIds[]` configuration:
+
+```javascript
+pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: 'tncId',
+ params: {
+ 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
+ }
+});
+```
+
+## Configuration Params
+
+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"` |
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..3192b42492 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"` |
@@ -33,6 +38,8 @@ The Unified ID privacy is covered under the [TradeDesk Services Privacy Policy](
| params.url | Required for UnifiedId if not using TradeDesk | String | If specified for UnifiedId, overrides the default Trade Desk URL. | "" |
| value | Optional | Object | Used only if the page has a separate mechanism for storing the Unified 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 | `{"tdid": "D6885E90-2A7A-4E0F-87CB-7734ED1B99A3"}` |
+Either `params.partner` or `params.url` must be provided.
+
## Unified ID Examples
1. Publisher has a partner ID with The Trade Desk, and is using the default endpoint for Unified ID.
diff --git a/dev-docs/modules/userid-submodules/unified2.md b/dev-docs/modules/userid-submodules/unified2.md
index c61b98bec0..74593d37df 100644
--- a/dev-docs/modules/userid-submodules/unified2.md
+++ b/dev-docs/modules/userid-submodules/unified2.md
@@ -11,15 +11,17 @@ 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
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,11 +63,16 @@ 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.
{: .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 e895f5268a..87ca81589f 100644
--- a/dev-docs/modules/userid-submodules/utiq.md
+++ b/dev-docs/modules/userid-submodules/utiq.md
@@ -2,7 +2,10 @@
layout: userid
title: Utiq ID
description: Utiq User ID sub-module
-useridmodule: utiqSystem
+useridmodule: utiqIdSystem
+bidRequestUserId: utiqId
+eidsource: utiq.com
+example: '"1111"'
---
Utiq generates unique tokens, enabling improved efficiency in programmatic advertising while safeguarding transparency and control for end customers via `consenthub.utiq.com`. A website visitor’s Utiq is generated based on network identifiers provided by network operators and requires explicit user consent.
@@ -12,9 +15,10 @@ 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 | `"utiq"` |
+| name | Required | String | The name of the module | `"utiqId"` |
Configuration example:
@@ -23,13 +27,39 @@ pbjs.setConfig({
userSync: {
userIds: [
{
- name: "utiq",
+ name: "utiqId",
},
],
},
})
```
+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:
+
+{% include dev-docs/vendor-exception.md %}
+
+```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
diff --git a/dev-docs/modules/userid-submodules/utiqMtp.md b/dev-docs/modules/userid-submodules/utiqMtp.md
index 854042d27e..6f061622a4 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,9 +24,11 @@ If you are interested in using Utiq on your website, please contact Utiq on to verify which are these SSPs.
+
+## TCF Activity Integration
+
+If you use the Prebid.js [TCF Control Module](/dev-docs/modules/tcfControl), 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: ["utiqMtpId"], // configuration line to add to make utiq exception
+ },
+ ],
+ },
+ },
+});
+```
+
## Utiq ID onboarding
If you wish to find out more about Utiq, please contact
diff --git a/dev-docs/modules/userid-submodules/yahoo.md b/dev-docs/modules/userid-submodules/yahoo.md
index ee4eb0f50a..34a983de36 100644
--- a/dev-docs/modules/userid-submodules/yahoo.md
+++ b/dev-docs/modules/userid-submodules/yahoo.md
@@ -3,14 +3,18 @@ layout: userid
title: Yahoo ConnectID
description: Yahoo ConnectID User ID sub-module
useridmodule: connectIdSystem
+bidRequestUserId: connectId
+eidsource: yahoo.com
+example: {"connectId": "72d04af6..."}
---
Yahoo ConnectID is a person based ID and does not depend on 3rd party cookies. It enables ad tech platforms to recognize and match users consistently across the open web. Built on top of Yahoo's robust and proprietary ID Graph it delivers higher monetization while respecting user privacy via multiple controls.
Add support for Yahoo ConnectID to your Prebid.js package using:
-{: .alert.alert-info :}
+```bash
gulp build --modules=userId,connectIdSystem
+```
## Yahoo ConnectID Registration
@@ -20,17 +24,15 @@ A Yahoo-supplied publisher-specific pixel ID is required. Reach out to [connecti
Note: Parameters are case-sensitive. ConnectID is the proper name of our product, however, when used in code it is spelled as connect**I**d. Follow the example in the table below.
-
+{: .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
@@ -99,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.
@@ -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
new file mode 100644
index 0000000000..7d7884de0f
--- /dev/null
+++ b/dev-docs/modules/userid-submodules/yandex.md
@@ -0,0 +1,43 @@
+---
+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.
+
+## Step 1. Add Yandex ID to Prebid.js package
+
+Add the module to your Prebid.js package:
+
+```bash
+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,
+ },
+ },
+ ],
+ },
+});
+```
+
+**Storage Requirements**: Yandex ID requires the storage object to specify cookie `type`, name `_ym_uid`, and an expiration of at least 30 days.
diff --git a/dev-docs/modules/validationFpdModule.md b/dev-docs/modules/validationFpdModule.md
index acf440cf89..ecf2d88bef 100644
--- a/dev-docs/modules/validationFpdModule.md
+++ b/dev-docs/modules/validationFpdModule.md
@@ -65,5 +65,4 @@ and if it exists, certain fields will be removed.
# Related Reading
- [Prebid.js First Party Data feature](/features/firstPartyData.html)
-- [First Party Data Enrichment Module](/dev-docs/modules/enrichmentFpdModule)
- [OpenRTB 2.5](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf)
diff --git a/dev-docs/modules/weboramaRtdProvider.md b/dev-docs/modules/weboramaRtdProvider.md
index 29d450291a..f558c47da3 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
@@ -151,12 +150,8 @@ On this section we will explain the `params.weboUserDataConf` subconfiguration:
##### User Consent
-The WAM User-Centric configuration will check for user consent if gdpr applies. It will check for consent:
-
-* Vendor ID 284 (Weborama)
-* Purpose IDs: 1, 3, 4, 5 and 6
-
-If the user consent does not match such conditions, this module will not load, means we will not check for any data in local storage and the default profile will be ignored.
+In a user-centric configuration, the WAM module will verify user consent when GDPR is applicable. It specifically checks for consent related to the purposes declared by Weborama in the Global Vendor List (Vendor ID 284).
+If the required consent is not provided, the module will not activate, and it will neither access local storage nor apply any default user profile.
#### Sfbx LiTE Site-Centric Configuration
diff --git a/dev-docs/modules/wurflRtdProvider.md b/dev-docs/modules/wurflRtdProvider.md
new file mode 100644
index 0000000000..8668ac5438
--- /dev/null
+++ b/dev-docs/modules/wurflRtdProvider.md
@@ -0,0 +1,166 @@
+---
+layout: page_v2
+title: WURFL RTD Provider Module
+display_name: WURFL RTD Module
+description: WURFL Real Time Data Module
+page_type: module
+module_type: rtd
+module_code : wurflRtdProvider
+enable_download : true
+vendor_specific: true
+sidebarType : 1
+---
+
+{: .alert.alert-warning :}
+This module loads a dynamically generated JavaScript from prebid.wurflcloud.com
+
+# WURFL RTD Submodule
+{:.no_toc}
+
+* TOC
+{:toc}
+
+## 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` 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.
+
+## A Note About User-Agent Client Hints
+
+WURFL.js is fully compatible with Chromium's User-Agent Client Hints (UA-CH) device identification mechanisms. If the User-Agent string is generic and Client Hints are not available in the HTTP request, the service will automatically request and obtain [high entropy client hint values](https://wicg.github.io/ua-client-hints/#getHighEntropyValues) from the client.
+
+However, it is still recommended to explicitly opt-in and declare support for User-Agent Client Hints on the publisher's website. Doing so improves performance and contributes to a faster user experience. For detailed instructions on implementing User-Agent Client Hint support, refer to the [relevant documentation here](https://docs.scientiamobile.com/guides/implementing-useragent-clienthints).
+
+## Integration Notes
+
+While the WURFL RTD module enriches the OpenRTB 2.0 payload, it is the responsibility of the SSP's adapter to access and pass the information to the auction endpoint. The auction endpoint must then use the new data to support its business logic.
+
+The following scenarios are possible:
+
+{: .table .table-bordered .table-striped }
+
+| | 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` 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
+
+### Build
+
+To build the WURFL RTD module with Prebid.js, use the following command:
+
+```bash
+gulp build --modules="wurflRtdProvider,appnexusBidAdapter,..."
+```
+
+### Configuration
+
+To initialize the WURFL RTD module in Prebid.js, use the `setConfig` function as shown below.
+The module is configured within `realTimeData.dataProviders`.
+Ensure `waitForIt` is set to `true`. We recommend setting `auctionDelay` to `500 ms` initially,
+though lower values may be suitable with fine-tuning.
+
+```javascript
+pbjs.setConfig({
+ realTimeData: {
+ auctionDelay: 500,
+ dataProviders: [{
+ name: 'wurfl',
+ waitForIt: true,
+ params: {
+ debug: false
+ }
+ }]
+ }
+});
+```
+
+### Parameters
+
+{: .table .table-bordered .table-striped }
+
+| Name | Type | Description | Default |
+| :------------------------ | :------------ | :--------------------------------------------------------------- |:----------------------|
+| name | String | Real time data module name | Always set to 'wurfl' |
+| waitForIt | Boolean | Set to `true` if an `auctionDelay` is defined (required) | `false` |
+| params | Object | Configuration parameters for the WURFL RTD module. | |
+| params.altHost | String | Alternate host for connecting to WURFL.js | |
+| params.debug | Boolean | Enable debug mode. | `false` |
+
+## Testing
+
+To test how the WURFL RTD module works, run the following command:
+
+`gulp serve --modules=wurflRtdProvider,appnexusBidAdapter`
+
+Then, point your browser to:
+
+`http://localhost:9999/integrationExamples/gpt/wurflRtdProvider_example.html`
+
+## Expected Behavior
+
+WURFL RTD adds device information to the bidderRequest's `ortb2.device.ext.wurfl` object (enabled SSPs have access to an extended capability set).
+
+```json
+{
+ "id": "1edd88d3-12c6-40b2-a80b-138e276b4553",
+ "at": 1,
+ "site": {...},
+ "device": {
+ "w": 1170,
+ "h": 2532,
+ "dnt": 0,
+ "ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 18_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3 Mobile/15E148 Safari/604.1",
+ "language": "it",
+ "make": "Apple",
+ "model": "iPhone 16e",
+ "devicetype": 1,
+ "os": "iOS",
+ "osv": "18.3",
+ "hwv": "iPhone 16e",
+ "ppi": 456,
+ "pxratio": 3.0,
+ "js": 1,
+ "ext": {
+ "vpw": 980,
+ "vph": 1429,
+ "wurfl": {
+ "wurfl_id": "apple_iphone_ver18_3_subhw16e",
+ "advertised_browser": "Mobile Safari",
+ "advertised_browser_version": "18.3",
+ "advertised_device_os": "iOS",
+ "advertised_device_os_version": "18.3",
+ "ajax_support_javascript": true,
+ "brand_name": "Apple",
+ "complete_device_name": "Apple iPhone 16e",
+ "density_class": "3.0",
+ "form_factor": "Smartphone",
+ "is_app_webview": false,
+ "is_connected_tv": false,
+ "is_full_desktop": false,
+ "is_mobile": true,
+ "is_ott": false,
+ "is_phone": true,
+ "is_robot": false,
+ "is_smartphone": true,
+ "is_smarttv": false,
+ "is_tablet": false,
+ "manufacturer_name": "",
+ "marketing_name": "",
+ "max_image_height": 568,
+ "max_image_width": 320,
+ "model_name": "iPhone 16e",
+ "physical_screen_height": 141,
+ "physical_screen_width": 65,
+ "pixel_density": 456,
+ "pointing_method": "touchscreen",
+ "resolution_height": 2532,
+ "resolution_width": 1170
+ }
+ }
+ }
+}
+```
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/dev-docs/pb10-notes.md b/dev-docs/pb10-notes.md
new file mode 100644
index 0000000000..20fa95ba27
--- /dev/null
+++ b/dev-docs/pb10-notes.md
@@ -0,0 +1,120 @@
+---
+layout: page_v2
+title: Prebid.js 10.0 Release Notes & Publisher API Changes
+description: Description of the breaking changes included for Prebid.js 10.0
+sidebarType: 1
+---
+
+# Prebid.js 10.0 Bidder Interface and Publisher API Changes
+
+{:.no_toc}
+
+This document describes the changes included for Prebid.js version 10.0.
+
+* TOC
+{:toc}
+
+## Publisher Summary
+
+1. A large number of obsolete modules have been removed. Many modules have changed name. See below for the list.
+2. The legacy method of native targeting keys, `sendTargetingKeys`, has been removed.
+3. `pbadslot` has been removed from the preAuction module. Use `ortb2Imp.ext.gpid` instead.
+4. The API methods `getBidResponses` and `getNoBidsForAdUnitCode` now return arrays of bids.
+5. TypeScript support has landed and Node.js 20+ is required to build.
+6. Using Prebid as an NPM dependency no longer requires using Babel or Prebid's Babel settings.
+7. `targetingControls.allBidsCustomTargeting` now defaults to `false`, this prevents custom targeting values from being set for non-winning bids.
+8. Storage use disclosures can now be enforced and catalogued
+
+## Removed Modules
+
+The following modules have been removed from Prebid.js as part of the 10.0 release. The `dfp` modules are still there but now import the `gam` modules. 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 |
+|:-----------------------------|:-------------------------|
+| dfpAdServerVideo | gamAdServerVideo |
+| dfpAdPod | gamAdPod |
+| telariaBidAdapter | |
+| eclickads | eclick |
+| imdsBidAdapter | advertisingBidAdapter |
+| cleanmedianetBidAdapter | gamoshiBidAdapter |
+| kueezBidAdapter | kueezRTBBidAdapter |
+| saambaaBidAdapter | advangelistBidAdapter |
+| adoceanBidAdapter | |
+| radsBidAdapter | |
+| freewheelsspBidAdapter | fwsspBidAdapter |
+| akamaiDapRtdProvider | symetriRtdProvider |
+| bidwatchAnalyticsAdapter | oxxionAnalyticsAdapter |
+| conversantAnalyticsAdapter | |
+| konduitAnalyticsAdapter | |
+| konduitWrapper | |
+| globalsunBidAdapter | global_sunBidAdapter |
+| verizonMediaIdSystem | yahooConnectId |
+| loglyliftBidAdapter | |
+| apnPspParamsConverter | |
+| yieldmoSyntheticInventoryModule | |
+| adsinteractiveBidAdapter | ads_interactiveBidAdapter |
+| admanBidAdapter | |
+| bridgeuppBidAdapter | sonaradsBidAdapter |
+| BTBidAdapter | blockthroughBidAdaper |
+| brightMountainMediaBidAdapter | bmtmBidAdapter |
+| vubleAnalyticsAdapter | |
+| serverbidServerBidAdapter | |
+| gothamAdsBidAdapter | intenzeBidAdapter |
+| growadvertisingBidAdapter | growAdsBidAdapter |
+| incrxBidAdapter | incrementxBidAdapter |
+| viantOrtbBidAdapter | viantBidAdapter |
+| zetaBidAdapter | zeta_globalBidAdapter |
+| fanAdapter | fanBidAdapter |
+| cadentaperturemxBidAdapter | cadent_aperture_mxBidAdapter |
+| epomDspBidAdapter | epom_dspBidAdapter |
+| pubwiseBidAdapter | pwbidBidAdapter |
+
+## Consent and Data Handling
+
+* **Default behavior for publisher purpose permissions in the TCF control module now enables purposes P4, P7 and special feature 1.**
+* Global vendor list IDs have been filled in for a number of bidder and analytics modules.
+* **A new activity control, and purpose 1 enforcement, prevent bidder endpoint access to third party storage via set-cookie headers.**
+* **The storage disclosures module enables publishers to identify all keys used in the first party and deny access to undisclosed keys. A build artifact is produced to help provide clear and concise information on device storage use for e-privacy directive adherence.**
+
+## User Id Module
+
+* **The user ID module introduces an `enforceStorageType` flag, which why by default warn when a userId submodule accesses the incorrect storage type. Future versions will prevent access.**
+* **`userId` accepts two new config flags, autoRefresh (default false) and retainConfig (default true).** With `autoRefresh: true`, `userId` automatically refreshes IDs for which the configuration changed (either a previously configured module now has different config, or a new module was configured). With `retainConfig: false`, `userId` "forgets" userIds that were previously configured, but are missing from `userSync.userIds[]` in a later setConfig.
+* For bidders: `bid.userId` is no longer populated; bid modules should rely on `userIdAsEids` or `user.ext.eids`. Several bid adapters made this change in the 10.0 release; others in 9.x in anticipation.
+* Eids in `user.eids` are appended to the array in `user.ext.eids` and de-duplicated.
+
+## TypeScript and Build Updates
+
+* **TypeScript files are now accepted in the code base. Tooling and linting were updated accordingly.**
+* The build target browser use statistics are now updated as part of the build process.
+* Tests now target Chrome 109 as the minimum version. `not dead` was added to the babel target.
+* **The `pbYield` helper was added and greedy rendering is disabled by default.**
+
+## `Schain` is now first party data
+
+* Publishers should provide schain as first party data in `ortb2.source.schain` or `ortb2.source.ext.schain`.
+* The schain module is no longer necessary and has been updated to simply copy `schain` configuration into first party data; it will be removed in the future.
+* Adapters should look for schain in `ortb2.source.ext.schain`.
+* Like all first party data, **bidder-specific schains are now merged with the global schain**, where previously they would replace it. Publishers setting both global and bidder-specific schains will need to make changes; the simplest way to address this is to use only bidder-specific schains.
+
+## API Changes
+
+* The `ADPOD` mediatype has received a deprecation warning.
+* Bid response helper methods (`getBidResponses*` and `getNoBids*`) now return an array which also exposes the array under `.bids` for backward compatibility.
+* `getHighestUnusedBidResponseForAdUnitCode` returns null instead of an empty object when no suitable bid exists.
+* **Schain data now lives under `ortb2.source.ext.schain` and is normalized when provided in first party data. The module is now superfluous for publishers transitioned to seeing this object directly and will be removed in the future.**
+* **Native ad units no longer support `sendTargetingKeys`, and native key-value pairs can no longer be sent to the ad server. Please migrate to a newer setup.**
+* The `createBid` API has been removed.
+* The `statusMessage` and `getStatusCode()` properties were removed from bid objects.
+* **The DFP modules have been renamed to GAM modules (`gamAdServerVideo`, `gamAdpod`, etc.). Please migrate to the new names.**
+* **Default configuration of various PBS Host companies has been removed. The PBS adapter now requires an explicit endpoint in its configuration.**
+* Support for the legacy `pbadslot` field has been removed from all utilities and adapters.
+* All public API methods have a log message in debug mode.
+* **`mediatypes.banner` params that match to imp[].banner are type checked**
+
+## Further Reading
+
+* [Publisher API Reference](/dev-docs/publisher-api-reference.html)
+* [First Party Data](/features/firstPartyData.html)
diff --git a/dev-docs/pb9-notes.md b/dev-docs/pb9-notes.md
new file mode 100644
index 0000000000..39bf23619b
--- /dev/null
+++ b/dev-docs/pb9-notes.md
@@ -0,0 +1,124 @@
+---
+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}
+
+## 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 |
+|:-----------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| 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 | Update: added to 9.1.0 |
+| 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.
+
+getConfig is no longer allowed to gather consent, as it may be stale; use the consent object.
+
+Bidder companion scripts are now completely removed; only other module types may source js.
diff --git a/dev-docs/pbs-bidders.md b/dev-docs/pbs-bidders.md
index cbc289e03b..690618f725 100644
--- a/dev-docs/pbs-bidders.md
+++ b/dev-docs/pbs-bidders.md
@@ -8,7 +8,7 @@ sidebarType: 5
# Prebid Server Bidder Params
This page contains documentation on the specific parameters required by each supported bidder.
-These docs only apply to Prebid Server bidders. For Prebid.js bidders see the
+These docs only apply to Prebid Server-based bidders. For Prebid.js, see the
[Prebid.js Bidders](/dev-docs/bidders.html) page.
For each bidder listed below, you'll find the following information:
@@ -20,51 +20,116 @@ For each bidder listed below, you'll find the following information:
You can also download the full CSV data file.
-{% assign bidder_pages = site.pages | where: "layout", "bidder" | where: "pbs", true %}
+{% assign bidder_pages = site.pages | where: "layout", "bidder" | where: "pbs", true | sort_natural: "title" %}
{: .alert.alert-warning :}
Publishers are advised to check with legal counsel before doing business with any particular bidder.
-## Prebid Server Bidder List
+## Search a Prebid Server bidder
-
+
+
+
+
+
+
+## Full List
+
+### #-A
+
+
{% for page in bidder_pages %}
--
-{{ page.title }}
-
+ {% assign firstletter = page.title | slice:0 | downcase %}
+ {% unless firstletter == "0" or firstletter == "1" or firstletter == "2" or firstletter == "3" or firstletter == "4" or firstletter == "5" or firstletter == "6" or firstletter == "7" or firstletter == "8" or firstletter == "9" or firstletter == "a" %}{% continue %}{% endunless %}
+ -
+ {{ page.title }}
+
{% endfor %}
-## Bidder Documentation
+### B-C
+
{% for page in bidder_pages %}
+ {% assign firstletter = page.title | slice:0 | downcase %}
+ {% unless firstletter == "b" or firstletter == "c" %}{% continue %}{% endunless %}
+ -
+ {{ page.title }}
+
+{% endfor %}
+
-
-
-{{ page.title }}
+### D-G
-Features
+
+{% for page in bidder_pages %}
+ {% assign firstletter = page.title | slice:0 | downcase %}
+ {% unless firstletter == "d" or firstletter == "e" or firstletter == "f" or firstletter == "g" %}{% continue %}{% endunless %}
+ -
+ {{ page.title }}
+
+{% endfor %}
+
-{% include dev-docs/bidder-meta-data.html page=page %}
+### H-L
-"Send All Bids" Ad Server Keys
+
+{% for page in bidder_pages %}
+ {% assign firstletter = page.title | slice:0 | downcase %}
+ {% unless firstletter == "h" or firstletter == "i" or firstletter == "j" or firstletter == "k" or firstletter == "l" %}{% continue %}{% endunless %}
+ -
+ {{ page.title }}
+
+{% endfor %}
+
-These are the bidder-specific keys that would be targeted within GAM in a Send-All-Bids scenario. GAM truncates keys to 20 characters.
+### M-O
-{: .table .table-bordered .table-striped }
-| {{ "hb_pb_" | append: page.biddercode | slice: 0,20 }} | {{ "hb_bidder_" | append: page.biddercode | slice: 0,20 }} | {{ "hb_adid_" | append: page.biddercode | slice: 0,20 }} |
-| {{ "hb_size_" | append: page.biddercode | slice: 0,20 }} | {{ "hb_source_" | append: page.biddercode | slice: 0,20 }} | {{ "hb_format_" | append: page.biddercode | slice: 0,20 }} |
-| {{ "hb_cache_host_" | append: page.biddercode | slice: 0,20 }} | {{ "hb_cache_id_" | append: page.biddercode | slice: 0,20 }} | {{ "hb_uuid_" | append: page.biddercode | slice: 0,20 }} |
-| {{ "hb_cache_path_" | append: page.biddercode | slice: 0,20 }} | {{ "hb_deal_" | append: page.biddercode | slice: 0,20 }} | |
+
+{% for page in bidder_pages %}
+ {% assign firstletter = page.title | slice:0 | downcase %}
+ {% unless firstletter == "m" or firstletter == "n" or firstletter == "o" %}{% continue %}{% endunless %}
+ -
+ {{ page.title }}
+
+{% endfor %}
+
-{% if page.prevBiddercode %}
+### P-R
-This bidder previously had a bidder code of `{{ page.prevBiddercode }}`, but prefers new configurations to use `{{ page.biddercode }}`.
+
+{% for page in bidder_pages %}
+ {% assign firstletter = page.title | slice:0 | downcase %}
+ {% unless firstletter == "p" or firstletter == "q" or firstletter == "r" %}{% continue %}{% endunless %}
+ -
+ {{ page.title }}
+
+{% endfor %}
+
-{% endif %}
+### S-T
-{{ page.content }}
+
+{% for page in bidder_pages %}
+ {% assign firstletter = page.title | slice:0 | downcase %}
+ {% unless firstletter == "s" or firstletter == "t" %}{% continue %}{% endunless %}
+ -
+ {{ page.title }}
+
+{% endfor %}
+
-
+### U-Z
+
+{% for page in bidder_pages %}
+ {% assign firstletter = page.title | slice:0 | downcase %}
+ {% unless firstletter == "u" or firstletter == "v" or firstletter == "w" or firstletter == "x" or firstletter == "y" or firstletter == "z" %}{% continue %}{% endunless %}
+ -
+ {{ page.title }}
+
{% endfor %}
+
+
diff --git a/dev-docs/plugins/bc/bc-prebid-plugin-api.md b/dev-docs/plugins/bc/bc-prebid-plugin-api.md
index 1225dab7a0..d9be241b21 100644
--- a/dev-docs/plugins/bc/bc-prebid-plugin-api.md
+++ b/dev-docs/plugins/bc/bc-prebid-plugin-api.md
@@ -130,7 +130,7 @@ If the results of the prebid process is being determined outside of the plugin,
}]
},
"prebidConfigOptions": {
- "cache": {"url": "https://prebid.adnxs.com/pbc/v1/cache"},
+ "cache": {"url": "https://prebid.example.com/pbc/v1/cache"},
" enableSendAllBids": true
},
"prebidTimeout": 700,
diff --git a/dev-docs/plugins/bc/bc-prebid-plugin-integration-studio.md b/dev-docs/plugins/bc/bc-prebid-plugin-integration-studio.md
index 1dd031a918..d7f53f6e03 100644
--- a/dev-docs/plugins/bc/bc-prebid-plugin-integration-studio.md
+++ b/dev-docs/plugins/bc/bc-prebid-plugin-integration-studio.md
@@ -150,7 +150,7 @@ var adOptions =
}]
},
"prebidConfigOptions": {
- "cache": {"url": "https://prebid.adnxs.com/pbc/v1/cache"},
+ "cache": {"url": "https://prebid.example.com/pbc/v1/cache"},
"enableSendAllBids": true
},
"prebidTimeout": 700,
@@ -353,7 +353,7 @@ None
},
"prebidConfigOptions": {
"cache": {
- "url": "https://prebid.adnxs.com/pbc/v1/cache"
+ "url": "https://prebid.example.com/pbc/v1/cache"
},
"enableSendAllBids": true
},
diff --git a/dev-docs/plugins/bc/bc-prebid-plugin-multiad-options.md b/dev-docs/plugins/bc/bc-prebid-plugin-multiad-options.md
index f4ea87f6aa..7edbfcf383 100644
--- a/dev-docs/plugins/bc/bc-prebid-plugin-multiad-options.md
+++ b/dev-docs/plugins/bc/bc-prebid-plugin-multiad-options.md
@@ -109,7 +109,7 @@ The following is a sample JSON definition of the plugin configuration defining c
},
"prebidConfigOptions" : {
"cache": {
- "url": "https://prebid.adnxs.com/pbc/v1/cache"
+ "url": "https://prebid.example.com/pbc/v1/cache"
},
"enableSendAllBids" : true
},
@@ -204,7 +204,7 @@ The following is a sample JSON definition of the plugin configuration defining c
},
"prebidConfigOptions" : {
"cache": {
- "url": "https://prebid.adnxs.com/pbc/v1/cache"
+ "url": "https://prebid.example.com/pbc/v1/cache"
},
"enableSendAllBids" : true
},
@@ -310,7 +310,7 @@ The following is a sample JSON definition of the plugin configuration defining c
},
"prebidConfigOptions" : {
"cache": {
- "url": "https://prebid.adnxs.com/pbc/v1/cache"
+ "url": "https://prebid.example.com/pbc/v1/cache"
},
"enableSendAllBids" : true
},
@@ -406,7 +406,7 @@ The following is a sample JSON definition of the plugin configuration defining c
},
"prebidConfigOptions" : {
"cache": {
- "url": "https://prebid.adnxs.com/pbc/v1/cache"
+ "url": "https://prebid.example.com/pbc/v1/cache"
},
"enableSendAllBids" : true
},
@@ -502,7 +502,7 @@ The following is a sample JSON definition of the plugin configuration defining c
},
"prebidConfigOptions" : {
"cache": {
- "url": "https://prebid.adnxs.com/pbc/v1/cache"
+ "url": "https://prebid.example.com/pbc/v1/cache"
},
"enableSendAllBids" : true
},
diff --git a/dev-docs/plugins/bc/bc-prebid-plugin-render-options.md b/dev-docs/plugins/bc/bc-prebid-plugin-render-options.md
index 57f5c104e7..4a60a60c3b 100644
--- a/dev-docs/plugins/bc/bc-prebid-plugin-render-options.md
+++ b/dev-docs/plugins/bc/bc-prebid-plugin-render-options.md
@@ -321,7 +321,7 @@ String that can be one of the following:
* `'start'` (for preroll)
* `'end'` (for postroll)
* `'hh:mm:ss'` (to specify a midroll at a specific time)
-* `'hh:mm:ss.mmm'` (to specify a midroll at a specfic time, including millseconds)
+* `'hh:mm:ss.mmm'` (to specify a midroll at a specific time, including milliseconds)
* `'n%'` (to specify a midroll to play after the specified percentage of the content video has played)
**Required?**
diff --git a/dev-docs/plugins/bc/bc-prebid-plugin-sample-studio-integration-general-method.md b/dev-docs/plugins/bc/bc-prebid-plugin-sample-studio-integration-general-method.md
index 38f81618fd..6f6ca02132 100644
--- a/dev-docs/plugins/bc/bc-prebid-plugin-sample-studio-integration-general-method.md
+++ b/dev-docs/plugins/bc/bc-prebid-plugin-sample-studio-integration-general-method.md
@@ -72,7 +72,7 @@ This page presents a sample publisher page using the General Integration Method
}]
},
"prebidConfigOptions": {
- "cache": {"url": "https://prebid.adnxs.com/pbc/v1/cache"},
+ "cache": {"url": "https://prebid.example.com/pbc/v1/cache"},
"enableSendAllBids": true
},
"prebidTimeout": 700,
diff --git a/dev-docs/publisher-api-reference/adServers.dfp.buildAdpodVideoUrl.md b/dev-docs/publisher-api-reference/adServers.dfp.buildAdpodVideoUrl.md
index 02adfbb293..2622837b3c 100644
--- a/dev-docs/publisher-api-reference/adServers.dfp.buildAdpodVideoUrl.md
+++ b/dev-docs/publisher-api-reference/adServers.dfp.buildAdpodVideoUrl.md
@@ -30,7 +30,7 @@ pbjs.que.push(function(){
pbjs.addAdUnits(videoAdUnit);
pbjs.setConfig({
cache: {
- url: 'https://prebid.adnxs.com/pbc/v1/cache'
+ url: 'https://my-pbs.example.com/cache'
},
adpod: {
brandCategoryExclusion: true
diff --git a/dev-docs/publisher-api-reference/adServers.gam.getVastXml.md b/dev-docs/publisher-api-reference/adServers.gam.getVastXml.md
new file mode 100644
index 0000000000..9a45bd6d96
--- /dev/null
+++ b/dev-docs/publisher-api-reference/adServers.gam.getVastXml.md
@@ -0,0 +1,75 @@
+---
+layout: api_prebidjs
+title: pbjs.adServers.gam.getVastXml(options)
+description: adServers.gam.getVastXml API
+sidebarType: 1
+---
+
+
+{: .alert.alert-info :}
+The Google Ad Manager implementation of this function requires including the dfpAdServerVideo module in your Prebid.js build.
+
+This method extends the behavior of `buildVideoUrl` by not only constructing the Google Ad Manager video ad tag URL, but also fetching and processing the resulting VAST wrapper returned by GAM.
+
+If the `cache.useLocal` flag is set to true, the function scans the received GAM VAST wrapper for the bid’s cached asset URL that corresponds to a locally stored blob in Prebid.js. When such a match is found, it replaces the contents of the GAM wrapper with the contents of the locally cached VAST XML blob, effectively inlining the ad markup instead of referencing it remotely.
+
+#### Argument Reference
+
+##### The `options` object
+
+{: .table .table-bordered .table-striped }
+| Field | Type | Description |
+|----------+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `adUnit` | object | *Required*. The Prebid ad unit to which the returned URL will map. |
+| `params` | object | *Optional*. Querystring parameters that will be used to construct the Google Ad Manager video ad tag URL. Publisher-supplied values will override values set by Prebid.js. See below for fields. |
+| `url` | string | *Optional*. The video ad server URL. When given alongside params, the parsed URL will be overwritten with any matching components of params. |
+| `bid` | object | *Optional*. The Prebid bid for which targeting will be set. If this is not defined, Prebid will use the bid with the highest CPM for the adUnit. |
+
+{: .alert.alert-warning :}
+One or both of options.params and options.url is required. In other words, you may pass in one, the other, or both, but not neither.
+
+##### The `options.params` object
+
+{: .table .table-bordered .table-striped }
+| Field | Type | Description | Example |
+|-------------------+--------+-----------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------|
+| `iu` | string | *Required*. Google Ad Manager ad unit ID. | `/19968336/prebid_cache_video_adunit` |
+| `cust_params` | object | *Optional*. Key-value pairs merged with Prebid's targeting values and sent to Google Ad Manager on the video ad tag URL. | `{section: "blog", anotherKey: "anotherValue"}` |
+| `description_url` | string | *Optional*. Describes the video. Required for Ad Exchange. Prebid.js will build this for you unless you pass it explicitly. | `https://www.example.com` |
+
+For more information on any of these params, see [the Google Ad Manager video tag documentation](https://support.google.com/admanager/answer/1068325).
+
+#### Example
+
+```javascript
+pbjs.requestBids({
+ bidsBackHandler: async function(bidResponses) {
+ const bidResponse = bidResponses['div-gpt-ad-51545-0'];
+ if (!bidResponse) {
+ return;
+ }
+ const bid = bidResponse.bids[0];
+ const vastXml = await pbjs.adServers.gam.getVastXml({
+ bid,
+ adUnit: 'div-gpt-ad-51545-0',
+ params: {
+ iu: '/41758329/localcache',
+ url: "https://pubads.g.doubleclick.net/gampad/ads?iu=/41758329/localcache&sz=640x480&gdfp_req=1&output=vast&env=vp",
+ }
+ });
+ jwplayer("player").setup({
+ playlist: "https://cdn.jwplayer.com/v2/media/hWF9vG66",
+ autostart: "viewable",
+ advertising: {
+ client: "vast",
+ schedule: [
+ {
+ vastxml: vastXml,
+ offset: 'pre'
+ }
+ ]
+ }
+ });
+ }
+});
+```
diff --git a/dev-docs/publisher-api-reference/adServers.targetVideo.buildVideoUrl.md b/dev-docs/publisher-api-reference/adServers.targetVideo.buildVideoUrl.md
new file mode 100644
index 0000000000..7f4893b45e
--- /dev/null
+++ b/dev-docs/publisher-api-reference/adServers.targetVideo.buildVideoUrl.md
@@ -0,0 +1,78 @@
+---
+layout: api_prebidjs
+title: pbjs.adServers.targetVideo.buildVideoUrl(options)
+description: adServers.targetVideo.buildVideoUrl API
+sidebarType: 1
+---
+
+
+{: .alert.alert-info :}
+TargetVideo Ad Server implementation of this function requires including the `targetVideoAdServerVideo` module in your Prebid.js build.
+
+This method combines publisher-provided parameters with Prebid.js targeting parameters to build a TargetVideo Ad Server video ad tag URL that can be used by a video player.
+
+#### Argument Reference
+
+##### The `options` object
+
+{: .table .table-bordered .table-striped }
+| Field | Type | Description |
+|----------+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `adUnit` | object | *Optional*. The Prebid ad unit to which the returned URL will map. |
+| `params` | object | *Required*. Querystring parameters that will be used to construct the TargetVideo Ad Server video ad tag URL. See below for fields. |
+| `bid` | object | *Optional*. The Prebid bid for which targeting will be set. If this is not defined, Prebid will use the bid with the highest CPM for the adUnit. |
+
+{: .alert.alert-warning :}
+One or both of options.adUnit and options.bid is required. In other words, you may pass in one, the other, or both, but not neither.
+
+##### The `options.params` object
+
+{: .table .table-bordered .table-striped }
+| Field | Type | Description | Example |
+|-------------------+--------+-----------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------|
+| `iu` | string | *Required*. TargetVideo Ad Server ad unit ID or link. | `/19968336/prebid_cache_video_adunit` |
+| `cust_params` | object | *Optional*. Key-value pairs merged with Prebid's targeting values and sent to TargetVideo Ad Server on the video ad tag URL. | `{section: "blog", anotherKey: "anotherValue"}` |
+
+#### Examples
+
+There are several different ways to build up your video URL, as shown in the examples below:
+
+Using `options.params.iu` as ad unit id:
+
+```javascript
+pbjs.requestBids({
+ bidsBackHandler: function(bids) {
+ var videoUrl = pbjs.adServers.targetVideo.buildVideoUrl({
+ adUnit: videoAdUnit,
+ params: {
+ iu: "/19968336/prebid_cache_video_adunit",
+ cust_params: {
+ section: "blog",
+ anotherKey: "anotherValue"
+ },
+ }
+ });
+ invokeVideoPlayer(videoUrl);
+ }
+});
+```
+
+Using `options.params.iu` as ad link:
+
+```javascript
+pbjs.requestBids({
+ bidsBackHandler: function(bids) {
+ var videoUrl = pbjs.adServers.targetVideo.buildVideoUrl({
+ adUnit: videoAdUnit,
+ params: {
+ iu: "https://vid.tvserve.io/ads/bid?iu=/19968336/prebid_cache_video_adunit",
+ cust_params: {
+ section: "blog",
+ anotherKey: "anotherValue"
+ },
+ }
+ });
+ invokeVideoPlayer(videoUrl);
+ }
+});
+```
diff --git a/dev-docs/publisher-api-reference/aliasBidder.md b/dev-docs/publisher-api-reference/aliasBidder.md
index fd0a7248ef..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 [GDPR Enforcement module](/dev-docs/modules/gdprEnforcement.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'
diff --git a/dev-docs/publisher-api-reference/bidderSettings.md b/dev-docs/publisher-api-reference/bidderSettings.md
index f40399cd2e..a39d866c98 100644
--- a/dev-docs/publisher-api-reference/bidderSettings.md
+++ b/dev-docs/publisher-api-reference/bidderSettings.md
@@ -213,7 +213,10 @@ In the above example, the AOL bidder will inherit from "standard" adserverTarget
When using [price floors](/dev-docs/modules/floors.html), Prebid attempts to calculate the inverse of `bidCpmAdjustment`, so that the floor values it requests from SSPs take into account how the bid will be adjusted.
For example, if the adjustment is `bidCpm * .85` as above, floors are adjusted by `bidFloor * 1 / .85`.
-The automatically derived inverse function is correct only when `bidCpmAdjustment` is a simple multiplication. If it isn't, the inverse should also be provided through `inverseBidAdjustment`. For example:
+The automatically derived inverse function is correct only when `bidCpmAdjustment` is a simple multiplication.
+If it isn't, the inverse should also be provided, as a function taking 3 arguments: `inverseBidAdjustment(cpm, bidRequest, floorRequest)`, where `floorRequest` is an object containing `{mediaType, size}`, both of which can be null if calculating non-specific floors.
+
+For example:
```javascript
pbjs.bidderSettings = {
diff --git a/dev-docs/publisher-api-reference/clearAllAuctions.md b/dev-docs/publisher-api-reference/clearAllAuctions.md
new file mode 100644
index 0000000000..3a545e5b29
--- /dev/null
+++ b/dev-docs/publisher-api-reference/clearAllAuctions.md
@@ -0,0 +1,31 @@
+---
+layout: api_prebidjs
+title: pbjs.clearAllAuctions
+description:
+sidebarType: 1
+---
+
+
+Utility to clear all ad units of bids. This is useful for testing or to clear caches in a single page application.
+
+```javascript
+// Function to call when the URL changes
+function onUrlChange() {
+ pbjs.clearAllAuctions();
+}
+
+// Function to initialize the URL change listener
+function initUrlChangeListener() {
+ // Listen for changes to the history state
+ window.addEventListener('popstate', onUrlChange);
+
+ // Optionally, you might want to handle the initial load as well
+ onUrlChange();
+}
+
+// Call the function to set up the listener
+initUrlChangeListener();
+
+```
+
+
diff --git a/dev-docs/publisher-api-reference/getAdserverTargetingForAdUnitCodeStr.md b/dev-docs/publisher-api-reference/getAdserverTargetingForAdUnitCodeStr.md
new file mode 100644
index 0000000000..bd4fe3627a
--- /dev/null
+++ b/dev-docs/publisher-api-reference/getAdserverTargetingForAdUnitCodeStr.md
@@ -0,0 +1,27 @@
+---
+layout: api_prebidjs
+title: pbjs.getAdserverTargetingForAdUnitCodeStr(adunitCode)
+description: getAdserverTargetingForAdUnitCodeStr API
+sidebarType: 1
+---
+
+Returns the query string targeting parameters available at the moment for the specified ad unit.
+
+**Kind**: static method of `pbjs`.
+
+**Returns**: `Array` - list of targeting key-value strings.
+
+**Request Params:**
+
+{: .table .table-bordered .table-striped }
+
+| Param | Type | Description |
+| --- | --- | --- |
+| `adunitCode` | `string` | adUnitCode to get the bid responses for |
+
+**Example**
+
+```javascript
+const targetingStrings = pbjs.getAdserverTargetingForAdUnitCodeStr('div-1');
+// ["hb_bidder=appnexus", "hb_adid=233bcbee889d46d", ...]
+```
diff --git a/dev-docs/publisher-api-reference/getAllPrebidWinningBids.md b/dev-docs/publisher-api-reference/getAllPrebidWinningBids.md
index 9d9bb09271..251f4f760b 100644
--- a/dev-docs/publisher-api-reference/getAllPrebidWinningBids.md
+++ b/dev-docs/publisher-api-reference/getAllPrebidWinningBids.md
@@ -6,6 +6,6 @@ sidebarType: 1
---
-Use this method to get all of the bids that have won their respective auctions but not rendered on the page. Useful for [troubleshooting your integration]({{site.baseurl}}/dev-docs/prebid-troubleshooting-guide.html).
+Use this method to get all the bids that have been used to generate targeting but have not yet been rendered on the page. It matches winning bids only after targeting has been applied and before the ad is rendered. Useful for [troubleshooting your integration]({{site.baseurl}}/dev-docs/prebid-troubleshooting-guide.html).
-* `pbjs.getAllPrebidWinningBids()`: returns an array of bid objects that have won their respective auctions but not rendered on the page.
+* `pbjs.getAllPrebidWinningBids()`: returns an array of bid objects that have been used to generate targeting and have not yet been rendered on the page.
diff --git a/dev-docs/publisher-api-reference/getEvents.md b/dev-docs/publisher-api-reference/getEvents.md
index ccf5c2711f..1dd6744d91 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 |
@@ -46,6 +47,7 @@ The available events are:
| bidderError | A bidder responded with an error | Object with the XMLHttpRequest error and the bid request object `{ error, bidderRequest }` |
| tcf2Enforcement | There was a TCF2 enforcement action taken | `{ storageBlocked: ['moduleA', 'moduleB'], biddersBlocked: ['moduleB'], analyticsBlocked: ['moduleC'] }` |
| bidAccepted | A bid was accepted and is about to be added to auction | Bid response object |
+| browserIntervention | The browser reported an intervention affecting a rendered creative (e.g., heavy-ad unload). | `{ bid, adId, intervention }` |
The example below shows how these events can be used.
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