From f8391e3f0277121be964851563dc4284ab05fc38 Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 22 Jul 2021 16:32:26 -0400 Subject: [PATCH 01/71] initial control --- _data/sidebar.yml | 8 ++ .../images/prebid-server/module-example.png | Bin 0 -> 38702 bytes prebid-server/developers/add-a-module.md | 99 ++++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 assets/images/prebid-server/module-example.png create mode 100644 prebid-server/developers/add-a-module.md diff --git a/_data/sidebar.yml b/_data/sidebar.yml index a5a92549b0..525ff675d2 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -1746,6 +1746,14 @@ sectionTitle: subgroup: 5 +- sbSecId: 5 + title: Building a Module + link: /prebid-server/developers/add-a-module.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 5 + - sbSecId: 5 title: Code Reviews link: /prebid-server/developers/code-reviews.html diff --git a/assets/images/prebid-server/module-example.png b/assets/images/prebid-server/module-example.png new file mode 100644 index 0000000000000000000000000000000000000000..24e419909c5609c056d4938f0cbc7362a8eb7cb4 GIT binary patch literal 38702 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 Wjiq<&3lzOWp{&g8OiO59vHt>na)QzT literal 0 HcmV?d00001 diff --git a/prebid-server/developers/add-a-module.md b/prebid-server/developers/add-a-module.md new file mode 100644 index 0000000000..3cce1d69a7 --- /dev/null +++ b/prebid-server/developers/add-a-module.md @@ -0,0 +1,99 @@ +--- +layout: page_v2 +sidebarType: 5 +title: Prebid Server | Developers | Adding a Module + +--- + +# Prebid Server - Adding a Module +{: .no_toc} + +Thank you for contributing a bid adapter to the open source Prebid Server project. Each new adapter gives publishers more options for monetizing their inventory and strengthens the header bidding community. + +This document guides you through the process of developing a module for host companies to plug into Prebid Server. We encourage you to look at [existing modules](GITHUB-LINK) for working examples. You can also ask us questions by [submitting a GitHub issue](https://github.com/prebid/prebid-server/issues/new). + +{: .alert.alert-info :} +**NOTE:** Modules are currently only supported in [PBS-Java](https://github.com/prebid/prebid-server-java). + + +* TOC +{:toc } + +## Overview + +The ability to add optional modules in Prebid.js has been widely used, +with dozens of interesting features forming a healthy ecosystem of vendor choice that's good for publishers and the industry. + +Prebid Server (Java) now supports a rich module interface that +allows anyone to contribute functionality at predefined places +along the request pipeline. Here's the general development process: + +1. The module-writer plans out which "hooks" will be used in the feature and codes up the module and unit tests. +1. The module-writer creates user documentation. +1. Code, tests, and documentation are submitted to the Prebid Server team for review. +1. Once accepted, Prebid Server Host Companies may choose to activate the new module for their publishers. +1. Publishers can utilize the feature, doing any required account setup described in the module documentation. + +The first module written was the ORTB2 Blocking module. Example ideas for future modules are creative validation and traffic quality, which are +possible with this framework. If you have an idea for a module that's not feasible (e.g. a new endpoint), open [an issue](https://github.com/prebid/prebid-server/issues) with a detailed description of what you're looking to do. + +### Terminology + +- PBS: Prebid Server +- PBS-Java: the Java version of Prebid Server +- PBS-Go: the Go-Lang version of Prebid Server (doesn't currently support modules) +- Host Company: the entity running the PBS cluster, e.g. one of the ones on [this list](https://prebid.org/product-suite/managed-services/). +- Module: a coherent feature set that plugs into Prebid Server with its own configuration. +- Stage: a place in the Prebid Server process flow from which a module can be invoked. A given module may utilize one or more hooks. +- Hook: a function with module code that executes at a given stage with a particular function signature. +- Endpoint: an externally-visible service that responds to web requests. e.g. /openrtb2/auction, /cookie-sync. +- Analytics Tags: a mechanism for a module to inform other modules of what it has encountered or changed. + +## Planning Your Module + +### 1. Review the Module Rules + +There are a number of things modules are not allowed to do, or at least not +allowed to do without disclosing prominently on documentation. Please review +the [Module Rules](/dev-docs/module-rules.html) page. Here are some examples: + +- a module can't add pixels to the creative without disclosure +- every module must obey privacy regulations: GDPR, CCPA, COPPA +- modules cannot create new bids. That is reserved for bid adapters. +- modules must be configurable to make data available to all bidders. i.e. you can't make a module that works always and forever with just one bidder without prominent disclosure. + +### 2. Understand the Endpoints and Stages + +Here's a description of the Stages of a PBS request that modules can tap into for each supported endpoint: + +{: .table .table-bordered .table-striped } +| Stage | Description | Endpoints | Example Use Cases | +|-------------|-------------|-------|-----| +| Entrypoint | Hook functions can see the raw request before PBS has processed or validated anything | auction, amp, video | A/B testing of account parameters, Alternate account validation, AMP pre-processing | +| Raw Auction Request | Validations have been done, but no enrichments | auction, amp, video | A/B testing of StoredRequests, Advanced device detection, Traffic Quality | +| Processed Auction Request | Any stored requests have been merged in and all PBS enrichments are done | auction, amp, video | Inject First Party Data, Channel determination, Bid floors, Bidder optimization | +| Bidder Request | The request has been customized for a particular bidder in the auction | auction, amp, video | Bidder-specific bcat/badv, Bidder-specific deals | +| Raw Bidder Response | Hook functions can get access to the unprocessed bidder response | auction, amp, video | Response validations | +| Processed Bidder Response | PBS has done its own validations on an individual bidder's response | auction, amp, video | Advanced CPM adjustments, Custom VAST macros | +| Auction Response | Last step before the response goes back to the client | auction, amp, video | Inject ad server targeting, alternate auction winner logic | + +### 3. Figure out which Stages You're going to Hook Into + +A module may be comprised of: + +- functions that are called by Prebid Server +- internal functions and state +- optional external connections to data sources or other services + +![Prebid Server Modularity Architecture](/assets/images/prebid-server/module-example.png){:class="pb-xlg-img"} + +### 4. Rejecting Requests or Responses +### 5. Determine what Should be Configurable +### 6. Consider Storage Needs +### 7. Think about Analytics Tags +### 8. Write the Code and Unit Test +### 9. Write the Documentation +### 10. Submit the Pull Requests + +## Example Modules + From c3e949d52f8353f9a1c9c2a84128d3d543746148 Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 30 Jul 2021 11:24:07 -0400 Subject: [PATCH 02/71] checkpoint --- _data/sidebar.yml | 10 +- dev-docs/modules/index.md | 26 ++-- prebid-server/developers/add-a-module-java.md | 41 +++++ prebid-server/developers/add-a-module.md | 147 ++++++++++++++---- prebid-server/developers/module-atags.md | 24 +++ 5 files changed, 204 insertions(+), 44 deletions(-) create mode 100644 prebid-server/developers/add-a-module-java.md create mode 100644 prebid-server/developers/module-atags.md diff --git a/_data/sidebar.yml b/_data/sidebar.yml index 525ff675d2..091b974634 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -359,7 +359,7 @@ subgroup: 4 - sbSecId: 1 - title: Prebid Modules + title: Prebid.js Modules link: isHeader: 1 headerId: pbjsmodules @@ -1713,6 +1713,14 @@ sectionTitle: subgroup: 3 +- sbSecId: 5 + title: Modules + link: /prebid-server/pbs-modules/index.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 3 + - sbSecId: 5 title: Developers link: diff --git a/dev-docs/modules/index.md b/dev-docs/modules/index.md index 7721060433..d6a7d45c43 100644 --- a/dev-docs/modules/index.md +++ b/dev-docs/modules/index.md @@ -1,25 +1,23 @@ --- layout: page_v2 -title: Prebid Modules -description: Module Documentation +title: Prebid.js Modules +description: Prebid.js Module Documentation sidebarType: 1 --- # Prebid.js Module Overview {:.no_toc} -The core of Prebid.js contains only the foundational code needed for header bidding. Any functionality that could be considered an add-on or that covers a special case is being moved out into modules. Examples of this kind of code include: +The core of Prebid.js contains only the foundational code needed for header bidding. Any functionality that could be considered an add-on or that covers a special case is part of a module. -- Bidder adapters -- Special auction logic -- Ad server API integrations -- Any other extensible functionality +Modules are in the [`modules` folder in the repo](https://github.com/prebid/Prebid.js/tree/master/modules). There are several categories: -This section of the site contains user-submitted module documentation. We're hoping that it will grow over time. - -To see all of the modules that are available, see the [`modules` folder in the repo](https://github.com/prebid/Prebid.js/tree/master/modules). - -If you are looking for bidder adapter parameters, see [Bidders' Params]({{site.baseurl}}/dev-docs/bidders.html). +- [Bid adapters](/dev-docs/bidders.html) +- The [Prebid Server Bid Adapter](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Server-to-Server) - this is a special case module that integrates with Prebid.js core. +- [Analytics adapters](/overview/analytics.html) +- [User ID Modules](/dev-docs/modules/userId.html) +- General Modules - see below. +- Real Time Data Modules - see below. * TOC {:toc} @@ -33,18 +31,16 @@ If you are looking for bidder adapter parameters, see [Bidders' Params]({{site.b | **ConsentManagement** | Collecting and passing consent information in support of privacy regulations:{::nomarkdown}{:/} See [CMP Best Practices.](/dev-docs/cmp-best-practices.html) | | [**Google Ad Manager Express**](/dev-docs/modules/dfp_express.html) | A simplified installation mechanism for publishers that have Google Publisher Tag (GPT) ad calls in their pages. | | [**Supply Chain Object**](/dev-docs/modules/schain.html) | Validates and makes the Supply Object available to bidders | -| [**User ID**](/dev-docs/modules/userId.html) | Sub-modules are available to support a range of identification approaches. | | [**ID Import Library**](/dev-docs/modules/idLibrary.html) | Retrieve user ids deployed on your site, and return them to a configurable endpoint for ID Graphing | | [**Advanced Size Mapping**](/dev-docs/modules/sizeMappingV2.html) | Display Responsive AdUnits in demanding page environments. | | [**Price Floors Module**](/dev-docs/modules/floors.html) | Configure and enforce minimum bids. | | [**GPT Pre-Auction Module**](/dev-docs/modules/gpt-pre-auction.html) | Adds a PB Ad Slot and matching GAM ad unit name to each ad unit's first-party data before bid requests are sent to the adapters. | -| [**ID Import Library**](/dev-docs/modules/idLibrary.html) | Retrieve user ids deployed on your site, and return them to a configurable endpoint for ID Graphing | | [**First Party Data Enrichment**](/dev-docs/modules/enrichmentFpdModule.html) | Pulls well-known FPD from the environment to form a base of data available to all adapters. | | [**MASS**](/dev-docs/modules/mass.html) | Enables the MASS protocol for Prebid and custom renderers by DealID | | [**MultiBid Module**](/dev-docs/modules/multibid.html) | Allows bidders to send multiple bids to the ad server. | | [**Bid Viewability**](/dev-docs/modules/bidViewable.html) | Triggers an event which can be consumed by analytics and bid adapters. | -## Real-Time Data Providers +## Real-Time Data Modules All of the modules that fall under the Real-Time Data (RTD) category conform to a consistent set of publisher controls. The pub can choose to run multiple diff --git a/prebid-server/developers/add-a-module-java.md b/prebid-server/developers/add-a-module-java.md new file mode 100644 index 0000000000..c6109a0705 --- /dev/null +++ b/prebid-server/developers/add-a-module-java.md @@ -0,0 +1,41 @@ +--- +layout: page_v2 +sidebarType: 5 +title: Prebid Server | Developers | Adding a Java Module + +--- + +# Prebid Server - Adding a Java Module +{: .no_toc} + +This document details how to make a module for PBS-Java. Please see +the [module overview](/prebid-server/developers/add-a-module.html) for background information. + +* TOC +{:toc } + +## Overview + +Repo structure + +How to build and install a bundle + +## PBS-Java Hook Interfaces + +Hook interfaces for each of the 7 stages + +Include examples for: +- how to change a request, response +- how to reject a request, response +- how to supply an analytics tag + +Async example + +Unit Tests + +Functional Tests + +## Further Reading + +- [PBS Module Overview](/prebid-server/developers/add-a-module.html) +- [PBS Module Analytics Tags Conventions() diff --git a/prebid-server/developers/add-a-module.md b/prebid-server/developers/add-a-module.md index 3cce1d69a7..2319b1dfb1 100644 --- a/prebid-server/developers/add-a-module.md +++ b/prebid-server/developers/add-a-module.md @@ -8,12 +8,11 @@ title: Prebid Server | Developers | Adding a Module # Prebid Server - Adding a Module {: .no_toc} -Thank you for contributing a bid adapter to the open source Prebid Server project. Each new adapter gives publishers more options for monetizing their inventory and strengthens the header bidding community. - -This document guides you through the process of developing a module for host companies to plug into Prebid Server. We encourage you to look at [existing modules](GITHUB-LINK) for working examples. You can also ask us questions by [submitting a GitHub issue](https://github.com/prebid/prebid-server/issues/new). +This document guides you through the process of developing a module for host companies to plug into their instance of Prebid Server. +We encourage you to look at [existing modules](https://github.com/prebid/prebid-server-modules-java) for working examples. You can also ask us questions by [submitting a GitHub issue](https://github.com/prebid/prebid-server/issues/new). {: .alert.alert-info :} -**NOTE:** Modules are currently only supported in [PBS-Java](https://github.com/prebid/prebid-server-java). +Modules are currently only supported in [PBS-Java](https://github.com/prebid/prebid-server-java). * TOC @@ -21,40 +20,41 @@ This document guides you through the process of developing a module for host com ## Overview -The ability to add optional modules in Prebid.js has been widely used, +The ability to add optional modules in [Prebid.js](/prebid/prebidjs.html) has been widely used, with dozens of interesting features forming a healthy ecosystem of vendor choice that's good for publishers and the industry. -Prebid Server (Java) now supports a rich module interface that +Prebid Server (Java) supports a rich module interface that allows anyone to contribute functionality at predefined places along the request pipeline. Here's the general development process: -1. The module-writer plans out which "hooks" will be used in the feature and codes up the module and unit tests. -1. The module-writer creates user documentation. +1. The module writer designs the feature, then optionally posts it as an [issue](https://github.com/prebid/prebid-server/issues) for community feedback. +1. They then code the module and unit tests and write user documentation. 1. Code, tests, and documentation are submitted to the Prebid Server team for review. -1. Once accepted, Prebid Server Host Companies may choose to activate the new module for their publishers. +1. Once accepted, Prebid Server Host companies may choose to activate the new module for their publishers. 1. Publishers can utilize the feature, doing any required account setup described in the module documentation. -The first module written was the ORTB2 Blocking module. Example ideas for future modules are creative validation and traffic quality, which are -possible with this framework. If you have an idea for a module that's not feasible (e.g. a new endpoint), open [an issue](https://github.com/prebid/prebid-server/issues) with a detailed description of what you're looking to do. +The first module written was the ORTB2 Blocking module. Example ideas for future modules include creative validation and traffic quality. +If you have an idea for a module that's not feasible (e.g. a new endpoint), open [an issue](https://github.com/prebid/prebid-server/issues) with a detailed description of what you're looking to do. ### Terminology -- PBS: Prebid Server -- PBS-Java: the Java version of Prebid Server -- PBS-Go: the Go-Lang version of Prebid Server (doesn't currently support modules) -- Host Company: the entity running the PBS cluster, e.g. one of the ones on [this list](https://prebid.org/product-suite/managed-services/). -- Module: a coherent feature set that plugs into Prebid Server with its own configuration. -- Stage: a place in the Prebid Server process flow from which a module can be invoked. A given module may utilize one or more hooks. -- Hook: a function with module code that executes at a given stage with a particular function signature. -- Endpoint: an externally-visible service that responds to web requests. e.g. /openrtb2/auction, /cookie-sync. -- Analytics Tags: a mechanism for a module to inform other modules of what it has encountered or changed. +- **PBS**: short for **P**re**b**id **S**erver +- **PBS-core**: The inner workings of Prebid Server -- not part of a module, bid adpater, or analytics adapter +- **PBS-Java**: the Java version of Prebid Server +- **PBS-Go**: the Go-Lang version of Prebid Server (doesn't currently support modules) +- **Host Company**: the entity running the PBS cluster, e.g. one of the ones on [this list](https://prebid.org/product-suite/managed-services/). +- **Module**: a coherent feature set that plugs into Prebid Server with its own configuration. +- **Stage**: a place in the Prebid Server process flow from which a module can be invoked. A given module may utilize one or more hooks. +- **Hook**: a function with module code that executes at a given stage with a particular function signature. +- **Endpoint**: an externally-visible service that responds to web requests. e.g. /openrtb2/auction, /cookie-sync. +- **Analytics Tags**: a mechanism for a module to inform other modules of what it has encountered or changed. ## Planning Your Module ### 1. Review the Module Rules -There are a number of things modules are not allowed to do, or at least not -allowed to do without disclosing prominently on documentation. Please review +There are a number of things modules are not allowed to do +without disclosing prominently on their documentation. Please review the [Module Rules](/dev-docs/module-rules.html) page. Here are some examples: - a module can't add pixels to the creative without disclosure @@ -68,7 +68,7 @@ Here's a description of the Stages of a PBS request that modules can tap into fo {: .table .table-bordered .table-striped } | Stage | Description | Endpoints | Example Use Cases | -|-------------|-------------|-------|-----| +|-------------+-------------+-------+-----| | Entrypoint | Hook functions can see the raw request before PBS has processed or validated anything | auction, amp, video | A/B testing of account parameters, Alternate account validation, AMP pre-processing | | Raw Auction Request | Validations have been done, but no enrichments | auction, amp, video | A/B testing of StoredRequests, Advanced device detection, Traffic Quality | | Processed Auction Request | Any stored requests have been merged in and all PBS enrichments are done | auction, amp, video | Inject First Party Data, Channel determination, Bid floors, Bidder optimization | @@ -81,19 +81,110 @@ Here's a description of the Stages of a PBS request that modules can tap into fo A module may be comprised of: -- functions that are called by Prebid Server +- init and hook functions that are called by Prebid Server - internal functions and state - optional external connections to data sources or other services +Some modules may plug into only one endpoint and one stage of processing. Others may coordinate activity across multiple stages. For example, +this diagram illustrates the design of a module that's configured to plug into two stages of +the processing workflow: + ![Prebid Server Modularity Architecture](/assets/images/prebid-server/module-example.png){:class="pb-xlg-img"} -### 4. Rejecting Requests or Responses +### 4. Module Hook Actions: Read, Change and/or Reject + +There are a few basic ways a module's hook function can respond to PBS-core: + +- inspect the request/response +- change the request by adding a new field to the request/response or updating an existing field +- instruct PBS-core to reject the request or response entirely + +The amount of time your module takes to perform its actions will be limited +by PBS-core. For example, if a creative validation module needs to 'phone home' +to analyze the bid creative, it will have a tight window of a few milliseconds +to get the response and apply it. Your documentation can request how long +the module needs, but keep in mind that PBS host companies may not use your +module if it leads to an increased rate in header bidding timeouts. + ### 5. Determine what Should be Configurable + +There are two sources of configuration for each module: + +#### 5.1. Initialization Config + +When Prebid Server starts up, it will be configured to initialize the +modules supported by the Host Company. This start up config should contain +values that are constant across requests. e.g.: + +- endpoints for external services +- host-company specific settings like cache sizes, installation ID, global timeout, other defaults + +Values in this config can only change with a bounce of Prebid Server. + +#### 5.2. Runtime Config + +For each user request, modules can have a default configuration or account-specific +configuration stored in the account-config data source. This configuration +is used to store parameters that could vary for different publishers +utilizing this PBS instance. e.g.: + +- publisher account ID +- application config (e.g. 'blocked advertisers') +- publisher timeout override + ### 6. Consider Storage Needs + +If your module will require state of some sort beyond configurtaion, you'll have to provide instructions +to the PBS host company. Examples: + +- a module could require a No-SQL endpoint that's populated at init and refreshed periodically +- modules may require a local SQL DB populated with application data +- some modules may require access to local disk to read a security certificate + ### 7. Think about Analytics Tags -### 8. Write the Code and Unit Test -### 9. Write the Documentation + +Analytics Tags (aka 'ATags') are a log mechanism provided by PBS-core to inform downstream +modules about what's happened in the request so far. Use of the Analytics Tag structure +is completely optional, but there may be application or reporting reasons for sharing +the results. Examples: + +- The [ORTB2 Blocking module](/prebid-server/pbs-modules/ortb2-blocking.html) creates ATags informing analytics adapters that +a bid response was inspected and/or blocked for violating a publisher-defined +rule like advertiser domains. This data can be used to alert the analytics users +that a given bidder is losing bid opportunities by not adhering to the auction parameters. +- A bid optimization module could inform analytics how many times it dropped a bidder from an auction for various reasons. e.g. "dropped this bidder X% of the time due to geographic reasons, Y% of the time due to session length. + +See the [Module Analytics Tag Conventions](/prebid-server/developers/module-atags.html) for more specific details +about how to format ATags. + +### 8. Write the Code, Config, and Unit Tests + +The details of the implementation depend on the platform. + +- PBS-Java: see [Adding a PBS-Java module](/prebid-server/developers/add-a-module-java.html) +- PBS-Go: doesn't currently support the module infrastructure + +Other rules for open source PBS pull request: + +- Unit test coverage must exceed 80%. +- A maintainer email address must be provided and be a group, not an individual. e.g. "support@example.com rather than jsmith@example.com + +### 9. Write the Module Documentation + +Fork the [documentation repo](https://github.com/prebid/prebid.github.io) and +create a file in /prebid-server/pbs-modules. You can start by copying one of the existing files. It should contain: + +- A description of the module functionality: why people might be interested in using it. +- Prerequisites: any necessary account activation, other required modules, etc. +- Configuration: both init and runtime +- Analytics Tag support +- Privacy Support: disclose whether the module has user privacy implications and support for GDPR, CCPA, etc. + ### 10. Submit the Pull Requests -## Example Modules +When everthing checks out on your dev environment, submit the PRs for review. + +## Further Reading +- [Prebid Server Module List](/prebid-server/pbs-modules/index.html) +- [PBS Module Analytics Tags Conventions](/prebid-server/developers/module-atags.html) diff --git a/prebid-server/developers/module-atags.md b/prebid-server/developers/module-atags.md new file mode 100644 index 0000000000..31b837e7ad --- /dev/null +++ b/prebid-server/developers/module-atags.md @@ -0,0 +1,24 @@ +--- +layout: page_v2 +sidebarType: 5 +title: Prebid Server | Developers | Module Analytics Tags Conventions + +--- + +# Prebid Server - Module Analytics Tags Conventions +{: .no_toc} + +This document details how to make a module for PBS-Java. Please see +the [module overview](/prebid-server/developers/add-a-module.html) for background information. + +* TOC +{:toc } + +## Overview + + + +## Further Reading + +- [PBS Module Overview](/prebid-server/developers/add-a-module.html) +- [PBS Module Analytics Tags Conventions() From 9d538724f82e089079ea7301ea713f5ddcaef06d Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 30 Jul 2021 11:24:53 -0400 Subject: [PATCH 03/71] checkpoint --- prebid-server/pbs-modules/index.md | 34 ++ prebid-server/pbs-modules/ortb2-blocking.md | 507 ++++++++++++++++++++ 2 files changed, 541 insertions(+) create mode 100644 prebid-server/pbs-modules/index.md create mode 100644 prebid-server/pbs-modules/ortb2-blocking.md diff --git a/prebid-server/pbs-modules/index.md b/prebid-server/pbs-modules/index.md new file mode 100644 index 0000000000..1fe27b731d --- /dev/null +++ b/prebid-server/pbs-modules/index.md @@ -0,0 +1,34 @@ +--- +layout: page_v2 +title: Prebid Server Modules +description: Prebid Server Module Documentation +sidebarType: 5 +--- + +# Prebid Server Module Overview +{:.no_toc} + +The core of Prebid Server contains the foundational code needed for header bidding. Any functionality that could be considered an add-on or that covers a special case is covered by modules. + +If you're looking for bidder adapter parameters, see [Bidders' Params](/dev-docs/pbs-bidders.html). + +* TOC +{:toc} + +## Installing a Module + +Currently, modules are only offered in PBS-Java. The Prebid Server host company decides which modules they want to use: + +1. Build Prebid Server using the ['bundle'](FIXME) approach. +1. Configure each module. + +## General Modules + +{: .table .table-bordered .table-striped } +| Module | Description | PBS-Go | PBS-Java | +|---------------------+--------------+--------+----------| +| [**ORTB2 Blocking**](/prebid-server/pbs-modules/ortb2-blocking.html) | Support bidders that aren't full-service SSPs. | | | + +## Further Reading + ++ [Developing a Prebid Server Module](/prebid-server/developers/add-a-module.html) diff --git a/prebid-server/pbs-modules/ortb2-blocking.md b/prebid-server/pbs-modules/ortb2-blocking.md new file mode 100644 index 0000000000..47cb728cd6 --- /dev/null +++ b/prebid-server/pbs-modules/ortb2-blocking.md @@ -0,0 +1,507 @@ +--- +layout: page_v2 +page_type: pbs-module +title: Prebid Server ORTB2 Blocking Module +description: Converts bids to the ad server currency +display_name : ORTB2 Blocking Module +sidebarType : 5 +--- + +# ORTB2 Blocking Module +{:.no_toc} + +## Overview + +This module helps support bidders that aren't full-service SSPs by allowing +PBS host companies to configure per-account OpenRTB blocking configuration. +[OpenRTB 2.5](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf) defines the following 6 attributes available for some kind +of bid exclusion logic: + +1. badv: blocked advertiser domains +1. bcat: blocked advertiser categories +1. bapp: blocked advertiser mobile app bundles +1. btype: blocked creative types (e.g. XHTML) +1. battr: blocked creative attributes (e.g. audio) +1. bseat: blocked bidder seat (e.g. agency) + +The module supports all of these blocking scenarios except the last: bseat. Prebid uses the 'seat' field in OpenRTB to indicate the biddercode, losing any agency +information that might have been passed to the bid adapter. + +### Features + +For each of the supported attributes, there are a range of behaviors that +can be configured: + +- **Configure Blocks**: allows host companies to define blocks globally, per-account, or per-account/bidder combination. This blocking config is sent in the OpenRTB requests to all or specific bidders for consideration in bid determination. +- **Enforce Blocks**: PBS can reject bids from bidders that don't conform to the blocking lists sent in the request. +- **Enforce Unknown Values**: for some attributes it may makes sense to reject requests that don't contain a required value. For instance, the publisher may want to drop any bid that doesn't report the advertiser domain. +- **Deal Overrides**: Private Marketplace deals may have exceptions to standard blocked attributes. + +Here's a summary of the features the module supports: + +{: .table .table-bordered .table-striped } +| Scenario | Configure Blocks | Enforce Blocks | Enforce Unknown Values | Deal Overrides | +|---+---+---+---+---| +| Advertiser Domains | | | | | +| Advertiser Categories | | | | | +| Apps | | | | | +| Banner Types | | | | | +| Banner Attributes | | | | | + +## Configuration + +### Execution Plan + +This module supports running at two stages: + +- bidder-request: this is where outgoing auction requests to each bidder are enriched with the account-specific blocks. +- raw-bidder-response: this is where incoming bid responses are verified and enforced. If a host-company or account don't want to do any enforcement activities, this part of the module doesn't need to be configured. + +Here's an example PBS execution-plan: + +``` +hooks: + host-execution-plan: > + { + "/openrtb2/auction": { + "stages": { + "bidder-request": { + "groups": [ + { + "timeout": 5000, + "hook-sequence": [ + { + "modulecode": "ortb2-blocking", + "hookimplcode": "ortb2-blocking-bidder-request" + } + ] + } + ] + }, + "raw-bidder-response": { # assumes enforcement is turned on + "groups": [ + { + "timeout": 5000, + "hook-sequence": [ + { + "modulecode": "ortb2-blocking", + "hookimplcode": "ortb2-blocking-bidder-response" + } + ] + } + ] + } + } + }, + "/openrtb2/amp": { + ... same as above ... + } + } +``` + +### Global Config + +There is no host-company level config for this module. + +### Account-Level Config + +The basic form of the account config is: +``` +{ + "config": { + "hooks": { + "modules": { + "ortb2-blocking": { // start of this module's config + "attributes": { + "ATTRIBUTE": { // badv, bcat, bapp, btype, battr + DEFAULT_SETTINGS, + "action-overrides": [{ + OVERRIDE_SETTING: [{ + "conditions": { ... }, + // the value below will be the datatype of the SETTING + "override": VALUE + }] + }] + } + } + } + } + } + } +} +``` + +The 'ATTRIBUTE' above is one of the 5 blockable entities defined in OpenRTB. A 'SETTING' is a feature this module supports. +The following sections detail each of the 5 blockable entities. + +#### Blocked Advertiser Config + +This attribute is related to the 'badv' of the request, and the 'adomain' of the response. + +{: .table .table-bordered .table-striped } +| Setting | Description | Data Type | Override Conditions Supported | +|---+---+---+---| +| blocked-adomain | List of adomains not allowed to display on this inventory | array of strings | bidders (array of strings), media-types (array of strings) | +| enforce-blocks | Whether to enforce adomains in responses | boolean | bidders (array of strings), media-types (array of strings) | +| block-unknown-adomain | Whether to block responses not specifying adomain. Only active if enforce-blocks is true. | bidders (array of strings), media-types (array of strings) | +| allowed-adomain-for-deals | List of adomains allowed for deals in general or a specific dealid. | array of strings | deal-ids (array of strings) | + +Here's an example account config with several scenarios: +``` +{ + "config": { + "hooks": { + "modules": { + "ortb2-blocking": { // start of this module's config + "attributes": { + "badv": { + // enforce domain blocks by default + "enforce-blocks": true, + "block-unknown-adomain": true, + // these are the default undesirable domains + "blocked-adomain": [ "a.com", "b.com", "c.com" ], + // but deals can return this one + "allowed-adomain-for-deals": [ "a.com" ], + "action-overrides": [{ + "blocked-adomain": [{ + // c.com allowed on these bidders for video + "conditions": { + "bidders": [ "bidderA", "bidderB" ], + "media-type": [ "video" ] + }, + "override": [ "a.com", "b.com" ] + }, + { + // more domains blocked for this bidder + "conditions": { + "bidders": [ "bidderc" ] + }, + "override": [ "a.com", "b.com", "c.com", "d.com", "e.com" ] + } + ], + "block-unknown-adomain": [ + { + // don't block unnknown for video bids from this bidder + "conditions": { + "bidders": [ "bidderA" ], + "media-type": [ "video" ] + }, + "override": false + } + ], + "allowed-adomain-for-deals": [ + { + // this deal is for normally blocked domain b.com + "conditions": { + "deal-ids": [ "12345678" ] + }, + "override": [ "b.com" ] + } + ] + } + ] + } + } + } + } + } + } +} +``` + +#### Blocked Advertiser Category + +This attribute is related to the 'bcat' of the request and 'cat' of the response. + +{: .table .table-bordered .table-striped } +| Setting | Description | Data Type | Override Conditions Supported | +|---+---+---+---| +| blocked-adv-cat | List of IAB categories not allowed to display on this inventory | array of strings | bidders (array of strings), media-types (array of strings) | +| enforce-blocks | Whether to enforce cat in responses | boolean | bidders (array of strings), media-types (array of strings) | +| block-unknown-adv-cat | Whether to block responses not specifying cat. Only active if enforce-blocks is true. | bidders (array of strings), media-types (array of strings) | +| allowed-adv-cat-for-deals | List of adomains allowed for deals in general or a specific dealid. | array of strings | deal-ids (array of strings) | + +Here's an example account config with several scenarios: +``` +{ + "config": { + "hooks": { + "modules": { + "ortb2-blocking": { // start of this module's config + "attributes": { + "bcat": { + // don't enforce blocks + "enforce-blocks": false, + // block these categories by default + "blocked-adv-cat": [ "IAB-1", "IAB-2" ], + // deals can return this cat + "allowed-adv-cat-for-deals": [ "IAB-1" ], + "action-overrides": [ { + "blocked-adv-cat": [ + { + // block additional categories for video + "conditions": { + "media-types": [ "video" ] + }, + "override": [ "IAB-1", "IAB-2", "IAB-3", "IAB-4" ] + } + ], + "enforce-blocks": [ + { + // enforce bcat blocks for this bidder + "conditions": { + "bidders": [ "bidderA" ] + }, + "override": true + } + ], + "block-unknown-adv-cat": [ + { + // enforce unknown cat for this bidder + "conditions": { + "bidders": [ "bidderA" ] + }, + "override": true + } + ], + "allowed-adv-cat-for-deals": [ + { + // this deal ID allowed to be this category + "conditions": { + "deal-ids": [ "1111111" ] + }, + "override": [ "IAB-2" ] + } + ] + } + ] + } + } + } + } + } + } +} +``` + +#### Blocked App + +This attribute is related to the 'bapp' of the request and 'bundle' of the response. + +{: .table .table-bordered .table-striped } +| Setting | Description | Data Type | Override Conditions Supported | +|---+---+---+---| +| blocked-app | List of bundles not allowed to display on this inventory | array of strings | bidders (array of strings), media-types (array of strings) | +| enforce-blocks | Whether to enforce bundles in responses | boolean | bidders (array of strings), media-types (array of strings) | +| allowed-bapp-for-deals | List of bundles allowed for deals in general or a specific dealid. | array of strings | deal-ids (array of strings) | + +Here's an example account config: +``` +{ + "config": { + "hooks": { + "modules": { + "ortb2-blocking": { // start of this module's config + "attributes": { + "bapp": { + // don't enforce + "enforce-blocks": false, + // these bundles blocked by default + "blocked-app": [ "app1", "app2" ], + "action-overrides": [ + { + "blocked-app": [ + { + // this bidder also blocked for an additional app + "conditions": { + "bidders": [ "bidderA" ] + }, + "override": [ "app1", "app2", "app3" ] + } + ] + } + ] + } + } + } + } + } + } +} +``` + +#### Blocked Banner Type + +This attribute is related to the 'btype' of the request. + +{: .table .table-bordered .table-striped } +| Setting | Description | Data Type | Override Conditions Supported | +|---+---+---+---| +| blocked-banner-type | List of IAB banner types not allowed to display on this inventory | array of int | bidders (array of strings), media-types (array of strings) | + +See Table 5.2 in the [OpenRTB 2.5 spec](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf) for the possible values. + +Note: no enforcement is possible because the creative type is not explictly +part of the response and Prebid Server does not currently contain logic to +parse creatives to derive the type. + +Here's an example account config: +``` +{ + "config": { + "hooks": { + "modules": { + "ortb2-blocking": { // start of this module's config + "attributes": { + "btype": { + // block these types for all bidders + "blocked-banner-type": [ 3, 4 ], + "action-overrides": [ + { + "blocked-banner-type": [ + { + // block an additional type for this bidder + "conditions": { + "bidders": [ "bidderA" ] + }, + "override": [ 3, 4, 5 ] + } + ] + } + ] + } + } + } + } + } + } +} +``` + +#### Blocked Banner Attributes + +This attribute is related to the 'battr' of the request and 'attr' of the response. + +{: .table .table-bordered .table-striped } +| Setting | Description | Data Type | Override Conditions Supported | +|---+---+---+---| +| blocked-banner-attr | List of IAB banner attributes not allowed to display on this inventory | array of int | bidders (array of strings), media-types (array of strings) | +| enforce-blocks | Whether to enforce attr in responses | boolean | bidders (array of strings), media-types (array of strings) | +| allowed-banner-attr-for-deals | List of IAB attributes allowed for deals in general or a specific dealid. | array of strings | deal-ids (array of strings) | + +See Table 5.3 in the [OpenRTB 2.5 spec](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf) for the possible values. + +Here's an example account config: +``` +{ + "config": { + "hooks": { + "modules": { + "ortb2-blocking": { // start of this module's config + "attributes": { + "battr": { + // don't enforce + "enforce-blocks": false, + // block these attributes for all bidders + "blocked-banner-attr": [ 1, 8, 9, 10 ], + "action-overrides": [ + { + "enforce-blocks": [ + { + // enforce the attr block for this bidder + "conditions": { + "bidders": [ "bidderA" ] + }, + "override": true + } + ] + } + ] + } + } + } + } + } + } +} +``` +## Analytics Tags + +There's only one analytics activity defined by this module: "enforce-blocking". +It's only applied to attributes where `enforce-blocks` is true, which means 'btype' never shows up here. ATag values: + +1. for activities[].results[].status **success-block** + 1. Attributes in the `values` block: + 1. **bidder**: which bidder triggered the response analysis + 1. **attributes**: string array indicating 1 or more of the 4 blockable attributes (badv, bcat, battr, bapp) triggered the enforcement action + 1. **adomain**: array-of-strings. if badv enforcement fired, which domain(s) triggered the action. Could include the empty string for unknown domain. + 1. **bcat**: array-of-strings. if bcat enforcement fired, which IAB category(s) triggered the action. Could include the empty string for unknown category. + 1. **bundle**: string. If bapp enforcement fired, which bundle triggered the action. + 1. **attr**: array-of-ints. If battr enforcement fired, which IAB creative attribute(s) triggered the action. + 1. Attributes in the `appliedto` block: + 1. **imp**: the seatbid.bid.impid of the blocked response + 1. **bidder**: the biddercode of the blocked response +1. for activities[].results[].status **success-allow** + 1. No `values` block + 1. Attributes in the `appliedto` block: + 1. **imp**: the seatbid.bid.impid of the blocked response + 1. **bidder**: the biddercode of the blocked response + +Here's an example analytics tag: +``` +[{ + activities: [{ + name: "enforce-blocking", + status: "success", + results: [{ + // bidderA was blocked for both badv and bcat for imp=1 + status: "success-block", + values: { + "attributes": ["badv", "bcat"], + "adomain": ["bad.com"], + "bcat": ["IAB-7"] + }, + appliedto: { + "bidder": "bidderA", + imp: ["1"] + } + },{ + // the other 3 bids from bidderA were ok + status: "success-allow", + appliedto: { + "bidder": "bidderA", + "imp": ["2","3","4"] + } + },{ + // scenario: bidderB not blocked at all + status: "success-allow", + appliedto: { + "bidder": "bidderB", + "imp": ["1","2","3","4"] } + },{ + // scenario: bidderC blocked on battr and bapp for imp=3 + status: "success-block", + values: { + "app": "com.test", + "attr": [2] + "attributes": ["bapp", "battr"] + }, + appliedto: { + "bidder": "bidderC", + "imp": ["3"] + } + },{ + // otherwise bidderC's bids were fine + status: "success-allow", + appliedto: { + "bidder": "bidderC", + "imp": ["1","2","4"] + } + }] + }] +}] +``` + +## Further Reading + +- [Prebid Server Module List](/prebid-server/pbs-modules/index.html) From 04e5171c2c66b4488916713fa4f77af9584b7294 Mon Sep 17 00:00:00 2001 From: bretg Date: Mon, 2 Aug 2021 11:13:21 -0400 Subject: [PATCH 04/71] checkpoint --- _data/sidebar.yml | 16 ++++++++-------- prebid-server/pbs-modules/index.md | 5 ++++- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/_data/sidebar.yml b/_data/sidebar.yml index 091b974634..1a09630df6 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -1673,6 +1673,14 @@ sectionTitle: subgroup: 3 +- sbSecId: 5 + title: Modules + link: /prebid-server/pbs-modules/ + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 3 + - sbSecId: 5 title: Interstitials link: /prebid-server/features/pbs-interstitials.html @@ -1713,14 +1721,6 @@ sectionTitle: subgroup: 3 -- sbSecId: 5 - title: Modules - link: /prebid-server/pbs-modules/index.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 3 - - sbSecId: 5 title: Developers link: diff --git a/prebid-server/pbs-modules/index.md b/prebid-server/pbs-modules/index.md index 1fe27b731d..c5d1045285 100644 --- a/prebid-server/pbs-modules/index.md +++ b/prebid-server/pbs-modules/index.md @@ -5,13 +5,16 @@ description: Prebid Server Module Documentation sidebarType: 5 --- -# Prebid Server Module Overview +# Prebid Server Modules {:.no_toc} The core of Prebid Server contains the foundational code needed for header bidding. Any functionality that could be considered an add-on or that covers a special case is covered by modules. If you're looking for bidder adapter parameters, see [Bidders' Params](/dev-docs/pbs-bidders.html). +{: .alert.alert-info :} +Only the Java version of PBS currently supports the module infrastructure. + * TOC {:toc} From a48ed2027914fe25eabf0ebad3ec36e1bbada980 Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 3 Aug 2021 09:57:47 -0400 Subject: [PATCH 05/71] working on atags --- assets/images/prebid-server/module-atags.png | Bin 0 -> 34988 bytes prebid-server/developers/module-atags.md | 24 +++++++++++++++---- prebid-server/pbs-modules/ortb2-blocking.md | 8 ++++++- 3 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 assets/images/prebid-server/module-atags.png diff --git a/assets/images/prebid-server/module-atags.png b/assets/images/prebid-server/module-atags.png new file mode 100644 index 0000000000000000000000000000000000000000..2a626c5742a9e9bf73437fae80da5e11d10a9ed5 GIT binary patch literal 34988 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 H Date: Wed, 4 Aug 2021 17:05:58 -0400 Subject: [PATCH 06/71] atags and navbar --- _includes/left_nav.html | 7 + prebid-server/developers/module-atags.md | 194 ++++++++++++++++++++++- 2 files changed, 200 insertions(+), 1 deletion(-) diff --git a/_includes/left_nav.html b/_includes/left_nav.html index edaa1e4548..a76431b00d 100644 --- a/_includes/left_nav.html +++ b/_includes/left_nav.html @@ -73,6 +73,9 @@ {% if thisSubItem.link == page.url %} {% assign isOpen = 1 %} {% endif %} + {% if thisSubItem.link == page.sidebar_entry %} + {% assign isOpen = 1 %} + {% endif %} {% endfor %} {% assign item_classes = base_item_classes | push: 'list-group-item--level-1' %} @@ -100,6 +103,10 @@ {% assign isPage = 1 %} {% endif %} + {% if thisSubItem.link == page.sidebar_entry %} + {% assign isPage = 1 %} + {% endif %} + {% assign item_classes = base_item_classes | push: 'list-group-item--level-2' %} {% if isPage == 1 %} {% assign item_classes = item_classes | push: 'is-active' %} diff --git a/prebid-server/developers/module-atags.md b/prebid-server/developers/module-atags.md index e93f11f00e..70c84b031a 100644 --- a/prebid-server/developers/module-atags.md +++ b/prebid-server/developers/module-atags.md @@ -2,7 +2,7 @@ layout: page_v2 sidebarType: 5 title: Prebid Server | Developers | Module Analytics Tags Conventions - +sidebar_entry: /prebid-server/developers/add-a-module.html --- # Prebid Server - Module Analytics Tags Conventions @@ -29,12 +29,204 @@ consistent ATags that can be easily read by analytics adapters. ## Analytics Tag Conventions +The general idea is that ATags are a list of module-specific "activities" that have these attributes: +- activity name: should be unique within the context of this module. e.g. 'enrich-request' +- an overall status +- an array of specific results within the activity +- within the results: + - status of each result + - scope of the result + - module-specific values for the result + +Here's an example from the [ORTB2 Blocking module](/prebid-server/pbs-modules/ortb2-blocking.html): + +``` +[{ + // scenario: response from bidderA blocked on badv for imp=1 + activities: [{ + name: "enforce-blocking", + status: "success", // no errors from the module + results: [{ + status: "success-block", + values: { // these are module-specific details about the result + "attributes": ["badv"], + "adomain": ["bad.com"] + }, + appliedto: { + "bidder": "bidderA", + impids: ["1"] + } + },{ + status: "success-allow", + // no details needed when the response isn't blocked + appliedto: { + "bidder": "bidderA", + "impids": ["2","3","4"] + } + }] + }] +``` + +The following table contains the field conventions. + +{: .table .table-bordered .table-striped } +| ATag Attr | Required? | Description | Type | +|---+---+---+---| +| activities | yes | One or more activities carried out by the module. | array of objects | +| activities .name | yes | Name of the activity. Must be documented and unique within the module. | string | +| activities .status | yes | Did the module operate successfully? Values are "error" or "success". | string | +| activities. results | no | Service-dependent details for what the service actually did. | array of objects | +| activities. results. status | no | Detailed status for this specific action. Values: "error", "success-allow", "success-block", "success-modify" | string | +| activities. results. values | no | service-specific details | object | +| activities. results .appliedto | no | Which object(s) the service examined or modified. | object | +| activities. results. appliedto. impids | no | The service examined these specific impression objects or bid responses corresponding to imp objects | array of strings | +| activities. results. appliedto. bidders | no | The service examined these specific bidders within the request or response. | array of strings | +| activities. results. appliedto. bidder | no | The service examined this specific bidder (singular) within the request or response. | string | +| activities. results. appliedto. request | no | The service examined the entire openrtb request object. This is in case the module updated something not adunit-specific. | boolean | +| activities. results. appliedto. response | no | The service examined the entire openrtb response object. This is in case the module updated something not adunit-specific. | boolean | ## Designing Analytics Tags +ATags are for reporting. Start by considering what the module's doing that consumers might want to display. Each processing stage the module operates in may be +reported as a separate activity, or perhaps everything the module does is lumped +as one activity. + +Once the activities are defined, determine what reportable metric would be useful. Examples: + +- percentage of impressions enriched +- percentage of imps where a specific bidder was removed due to optimization +- A/B testing data +- percentage and value of bid responses that were rejected due to creative validations + +{: .alert.alert-info :} +**Case study:** for the ORTB2 Blocking module, the requirement was to be able +to report on what percentage of responses from each bidder were being thrown +away due to blocking rules. This could have been done by defining a separate 'activity' for each of the 4 types of enforcement, but it was decided +to just have one kind of activity ('enforce-blocking') and get the specific +details as part of the 'value'. There was no requirement to report on the +outbound part of what the module does, so no ATags are created for that part +of the functionality. + +Once you know what reports are desired, figure out which activity 'results' +are needed to generate those numbers. + +{: .alert.alert-info :} +For the ORTB2 Blocking module, the numbers needed are how often a given +bidder has a response compared to how often their responses are rejected. +So overall the block rate is: successBlock divided by (successBlock + successAllow). + +## Document the Analytics Tags Produced + +Be sure to detail the results in your module documentation so that analytics adapters are +aware of what they can look for. + +Let them know: +- which activities your module supports +- what kind of results to expect +- whether the results objects have module-specific `values` + ## Parsing the Invocation Context +If you're an analytics adapter, you will be given the entire PBS 'invocation context', which contains a wealth of information about the auction. + +In short, to get analytics tags, you'll need to parse this data structure: + +- Loop through stages[] + - If the stage has relevant info, loop through outcomes[] + - Outcomes.entity is a label describing the contents + - Loop through groups[] + - Loop through invocationresults[] + - if `hookid.modulecode` is relevant for your analytics, grab `analyticstags` + +Here's an example of the data structured as JSON, though the details +of the actual object will differ in PBS-Java and PBS-Go. +``` + "stages": [ + { + "stage": "raw-auction-request", + "outcomes": [ + { + "entity": "bidrequest", + "executiontimemillis": 246, + "groups": [ + { + "executiontimemillis": 190, + "invocationresults": [ + { + "hookid": { + "modulecode": "MODULE1", + "hookimplcode": "HOOK_A" + }, + "executiontimemillis": 123, + "status": "success", + "action": "update", + "debugmessages": [ + "debug message" + ], + "analyticstags": { + "activities": [ + { + "name": "device-id", + "status": "success", + "results": [ + { + "status": "success", + "values": { + "some-field": "some-value" + }, + "appliedto": { + "impids": [ "impId1" ] + } + } + ] + } + ] + } + }, + { + "hookid": { + "modulecode": "MODULE1", + "hookimplcode": "HOOK_B" + }, + "status": "success", + "message": "inventory has no value", + "action": "reject" + } + ] + } + ] + } + ] + }, + { + "stage": "bidder-request", + "outcomes": [ + { + "entity": "pubmatic", // entity is biddercode for some stages + "executiontimemillis": 246, + "groups": [ + "invocationresults": { + "hookid": { ... } + "analyticstags": [{ + ... + ] + } + ] + }, + { + "entity": "adform", + "executiontimemillis": 246, + "groups": [...] + } + ] + } + ] +``` + +See the implementation guide for your platform for specific syntax. + ## Further Reading - [PBS Module Overview](/prebid-server/developers/add-a-module.html) +- [PBS-Java Module Implementation](/prebid-server/developers/add-a-module-java.html) From 32712209eecb228d83dc8a201ebf222b9526f8b5 Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 13 Aug 2021 14:45:24 -0400 Subject: [PATCH 07/71] added note about allowed-for-deals overrides --- prebid-server/pbs-modules/ortb2-blocking.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/prebid-server/pbs-modules/ortb2-blocking.md b/prebid-server/pbs-modules/ortb2-blocking.md index 5214a0218f..ec0f57babf 100644 --- a/prebid-server/pbs-modules/ortb2-blocking.md +++ b/prebid-server/pbs-modules/ortb2-blocking.md @@ -146,10 +146,10 @@ This attribute is related to the 'badv' of the request, and the 'adomain' of the {: .table .table-bordered .table-striped } | Setting | Description | Data Type | Override Conditions Supported | |---+---+---+---| -| blocked-adomain | List of adomains not allowed to display on this inventory | array of strings | bidders (array of strings), media-types (array of strings) | +| blocked-adomain | List of adomains not allowed to display on this inventory | array of strings | bidders (array of strings), media-types (array of strings). | | enforce-blocks | Whether to enforce adomains in responses | boolean | bidders (array of strings), media-types (array of strings) | | block-unknown-adomain | Whether to block responses not specifying adomain. Only active if enforce-blocks is true. | bidders (array of strings), media-types (array of strings) | -| allowed-adomain-for-deals | List of adomains allowed for deals in general or a specific dealid. | array of strings | deal-ids (array of strings) | +| allowed-adomain-for-deals | List of adomains allowed for deals in general or a specific dealid. | array of strings | deal-ids (array of strings). This isn't a true override - values are added to the global. | Here's an example account config with several scenarios: ``` @@ -224,7 +224,7 @@ This attribute is related to the 'bcat' of the request and 'cat' of the response | blocked-adv-cat | List of IAB categories not allowed to display on this inventory | array of strings | bidders (array of strings), media-types (array of strings) | | enforce-blocks | Whether to enforce cat in responses | boolean | bidders (array of strings), media-types (array of strings) | | block-unknown-adv-cat | Whether to block responses not specifying cat. Only active if enforce-blocks is true. | bidders (array of strings), media-types (array of strings) | -| allowed-adv-cat-for-deals | List of adomains allowed for deals in general or a specific dealid. | array of strings | deal-ids (array of strings) | +| allowed-adv-cat-for-deals | List of adomains allowed for deals in general or a specific dealid. | array of strings | deal-ids (array of strings). This isn't a true override - values are added to the global.| Here's an example account config with several scenarios: ``` @@ -298,7 +298,7 @@ This attribute is related to the 'bapp' of the request and 'bundle' of the respo |---+---+---+---| | blocked-app | List of bundles not allowed to display on this inventory | array of strings | bidders (array of strings), media-types (array of strings) | | enforce-blocks | Whether to enforce bundles in responses | boolean | bidders (array of strings), media-types (array of strings) | -| allowed-bapp-for-deals | List of bundles allowed for deals in general or a specific dealid. | array of strings | deal-ids (array of strings) | +| allowed-bapp-for-deals | List of bundles allowed for deals in general or a specific dealid. | array of strings | deal-ids (array of strings). This isn't a true override - values are added to the global. | Here's an example account config: ``` @@ -392,7 +392,7 @@ This attribute is related to the 'battr' of the request and 'attr' of the respon |---+---+---+---| | blocked-banner-attr | List of IAB banner attributes not allowed to display on this inventory | array of int | bidders (array of strings), media-types (array of strings) | | enforce-blocks | Whether to enforce attr in responses | boolean | bidders (array of strings), media-types (array of strings) | -| allowed-banner-attr-for-deals | List of IAB attributes allowed for deals in general or a specific dealid. | array of strings | deal-ids (array of strings) | +| allowed-banner-attr-for-deals | List of IAB attributes allowed for deals in general or a specific dealid. | array of strings | deal-ids (array of strings). This isn't a true override - values are added to the global. | See Table 5.3 in the [OpenRTB 2.5 spec](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf) for the possible values. From 7568dec37de876e104b6556e1ba5ae9595fe1919 Mon Sep 17 00:00:00 2001 From: bretg Date: Mon, 13 Sep 2021 13:46:33 -0400 Subject: [PATCH 08/71] Restructuring modules for download and modules index (#3265) * restructure module lists * changing pubcommon message to deprecated --- dev-docs/modules/adpod.md | 2 +- dev-docs/modules/bidViewable.md | 3 +- dev-docs/modules/bidViewableIO.md | 2 +- dev-docs/modules/browsiRtdProvider.md | 1 + dev-docs/modules/categoryTranslation.md | 2 +- dev-docs/modules/consentManagement.md | 3 +- dev-docs/modules/consentManagementUsp.md | 3 +- dev-docs/modules/currency.md | 2 +- dev-docs/modules/dfp_express.md | 3 +- dev-docs/modules/dfp_video.md | 5 +- dev-docs/modules/dgkeywordRtdProvider.md | 1 + dev-docs/modules/enrichmentFpdModule.md | 3 +- dev-docs/modules/floors.md | 2 +- dev-docs/modules/freewheel.md | 5 +- dev-docs/modules/gdprEnforcement.md | 3 +- dev-docs/modules/geoedgeRtdProvider.md | 1 + dev-docs/modules/gpt-pre-auction.md | 4 +- dev-docs/modules/haloRtdProvider.md | 1 + dev-docs/modules/iabCatagoryTranslation.md | 73 ----------- dev-docs/modules/iasRtdProvider.md | 1 + dev-docs/modules/idLibrary.md | 2 +- dev-docs/modules/index.md | 118 +++++++++--------- dev-docs/modules/instreamTracking.md | 2 +- dev-docs/modules/jwplayerRtdProvider.md | 1 + dev-docs/modules/konduit.md | 3 +- dev-docs/modules/mass.md | 4 +- dev-docs/modules/medianetRtdProvider.md | 1 + dev-docs/modules/multibid.md | 2 +- dev-docs/modules/optimeraRtdProvider.md | 1 + dev-docs/modules/permutiveRtdProvider.md | 1 + dev-docs/modules/pubCommonId.md | 2 +- dev-docs/modules/reconciliationRtdProvider.md | 3 +- dev-docs/modules/schain.md | 2 +- dev-docs/modules/sirdataRtdProvider.md | 3 +- dev-docs/modules/sizeMappingV2.md | 2 +- dev-docs/modules/userId.md | 2 +- dev-docs/modules/validationFpdModule.md | 2 +- download.md | 54 ++++++-- 38 files changed, 151 insertions(+), 174 deletions(-) delete mode 100644 dev-docs/modules/iabCatagoryTranslation.md diff --git a/dev-docs/modules/adpod.md b/dev-docs/modules/adpod.md index 519b1a1a87..0519cd9db6 100644 --- a/dev-docs/modules/adpod.md +++ b/dev-docs/modules/adpod.md @@ -2,7 +2,7 @@ layout: page_v2 page_type: module title: Module - Adpod -description: Adds functions to validate, cache, and modify long-form video bids. +description: Enables developers to add support for a new adserver that handles ad pod (long-form) videos. module_code : adpod display_name : Adpod enable_download : true diff --git a/dev-docs/modules/bidViewable.md b/dev-docs/modules/bidViewable.md index 5b2889986c..a9da963a12 100644 --- a/dev-docs/modules/bidViewable.md +++ b/dev-docs/modules/bidViewable.md @@ -2,10 +2,11 @@ layout: page_v2 page_type: module title: Module - Bid Viewability - GAM -description: Triggers BID_VIEWABLE event when a rendered PBJS-Bid is viewable according to [Active View criteria](https://support.google.com/admanager/answer/4524488) +description: Triggers a BID_VIEWABLE event when a rendered bid is viewable according to Active View criteria module_code : bidViewability display_name : Bid Viewability - GAM enable_download : true +vendor_specific: true sidebarType : 1 --- diff --git a/dev-docs/modules/bidViewableIO.md b/dev-docs/modules/bidViewableIO.md index f399562109..b483bc5b80 100644 --- a/dev-docs/modules/bidViewableIO.md +++ b/dev-docs/modules/bidViewableIO.md @@ -2,7 +2,7 @@ layout: page_v2 page_type: module title: Module - Bid Viewability - Ad Server Independent -description: Triggers BID_VIEWABLE event when a rendered PBJS-Bid is viewable according to an approximation of IAB viewability criteria +description: Triggers a BID_VIEWABLE event when a rendered bid is viewable according to an approximation of IAB viewability criteria module_code : bidViewabilityIO display_name : Bid Viewability - Ad Server Independent enable_download : true diff --git a/dev-docs/modules/browsiRtdProvider.md b/dev-docs/modules/browsiRtdProvider.md index 6d269adf3a..062f47f45f 100644 --- a/dev-docs/modules/browsiRtdProvider.md +++ b/dev-docs/modules/browsiRtdProvider.md @@ -7,6 +7,7 @@ page_type: module module_type: rtd module_code : browsiRtdProvider enable_download : true +vendor_specific: true sidebarType : 1 --- diff --git a/dev-docs/modules/categoryTranslation.md b/dev-docs/modules/categoryTranslation.md index 4102eb82c6..cb1bd0f987 100644 --- a/dev-docs/modules/categoryTranslation.md +++ b/dev-docs/modules/categoryTranslation.md @@ -2,7 +2,7 @@ layout: page_v2 page_type: module title: Module - Category Translation -description: Converts IAB sub category to ad server group. +description: Converts IAB category to ad server category for long-form videos. module_code : categoryTranslation display_name : CategoryTranslation enable_download : true diff --git a/dev-docs/modules/consentManagement.md b/dev-docs/modules/consentManagement.md index a1dc9b9794..f3ea32002f 100644 --- a/dev-docs/modules/consentManagement.md +++ b/dev-docs/modules/consentManagement.md @@ -2,10 +2,11 @@ layout: page_v2 page_type: module title: Consent Management - GDPR -description: Module to consume and distribute GDPR consent information to bidder adapters +description: If you have users in Europe, this module works with your Consent Management Platform to pass consent info to bidders and help align with EU regulations. See also the GDPR Enforcement module. module_code : consentManagement display_name : Consent Management - GDPR enable_download : true +recommended: true sidebarType : 1 --- diff --git a/dev-docs/modules/consentManagementUsp.md b/dev-docs/modules/consentManagementUsp.md index c365dd0ce5..ddfa9be3fc 100644 --- a/dev-docs/modules/consentManagementUsp.md +++ b/dev-docs/modules/consentManagementUsp.md @@ -2,10 +2,11 @@ layout: page_v2 page_type: module title: Consent Management - US Privacy -description: Module to consume and distribute US Privacy information to bidder adapters +description: If you have users in California, this module works with your Consent Management Platform to pass CCPA/US-Privacy data to bidders. module_code : consentManagementUsp display_name : Consent Management - US Privacy enable_download : true +recommended: true sidebarType : 1 --- diff --git a/dev-docs/modules/currency.md b/dev-docs/modules/currency.md index 5f51829cf8..bc8dd3562d 100644 --- a/dev-docs/modules/currency.md +++ b/dev-docs/modules/currency.md @@ -2,7 +2,7 @@ layout: page_v2 page_type: module title: Module - Currency -description: Converts bids to the ad server currency +description: Converts bid currency into ad server currency based on data in a supplied exchange rate file. module_code : currency display_name : Currency enable_download : true diff --git a/dev-docs/modules/dfp_express.md b/dev-docs/modules/dfp_express.md index 598fb1c126..fef264c9db 100644 --- a/dev-docs/modules/dfp_express.md +++ b/dev-docs/modules/dfp_express.md @@ -2,10 +2,11 @@ layout: page_v2 page_type: module title: Module - Google Ad Manager Express -description: Simplified installation mechanism for publishers that have Google Ad Manager in their pages +description: A simplified installation mechanism for publishers that have Google Publisher Tag (GPT) ad calls in their pages. module_code : express display_name : Google Ad Manager Express enable_download : true +vendor_specific: true sidebarType : 1 --- diff --git a/dev-docs/modules/dfp_video.md b/dev-docs/modules/dfp_video.md index 95f51a11e7..e9219ac3b6 100644 --- a/dev-docs/modules/dfp_video.md +++ b/dev-docs/modules/dfp_video.md @@ -2,10 +2,11 @@ layout: page_v2 page_type: module title: Module - Google Ad Manager Video -description: Addition of GAM Video to the Prebid package +description: Required for serving instream video through Google Ad Manager. module_code : dfpAdServerVideo -display_name : DFP Video +display_name : Google Ad Manager Video Support enable_download : true +vendor_specific: true sidebarType : 1 --- diff --git a/dev-docs/modules/dgkeywordRtdProvider.md b/dev-docs/modules/dgkeywordRtdProvider.md index 2153cddc64..217971cc31 100644 --- a/dev-docs/modules/dgkeywordRtdProvider.md +++ b/dev-docs/modules/dgkeywordRtdProvider.md @@ -7,6 +7,7 @@ page_type: module module_type: rtd module_code : dgkeywordRtdProvider enable_download : true +vendor_specific: true sidebarType : 1 --- diff --git a/dev-docs/modules/enrichmentFpdModule.md b/dev-docs/modules/enrichmentFpdModule.md index aaaa1bc0e4..857c4f2129 100644 --- a/dev-docs/modules/enrichmentFpdModule.md +++ b/dev-docs/modules/enrichmentFpdModule.md @@ -2,10 +2,11 @@ layout: page_v2 page_type: module title: Module - First Party Data Enrichment -description: Enriches First Party Data +description: Injects additional data into the auction stream, including: domain, keywords, and page url. module_code : enrichmentFpdModule display_name : First Party Data Enrichment enable_download : true +recommended: true sidebarType : 1 --- diff --git a/dev-docs/modules/floors.md b/dev-docs/modules/floors.md index dd0c904e18..212b6fa9ad 100644 --- a/dev-docs/modules/floors.md +++ b/dev-docs/modules/floors.md @@ -2,7 +2,7 @@ layout: page_v2 page_type: module title: Module - Price Floors -description: Determine and enforce auction price floors +description: Configure and enforce minimum bids. module_code : priceFloors display_name : Price Floors enable_download : true diff --git a/dev-docs/modules/freewheel.md b/dev-docs/modules/freewheel.md index 24cba9286f..2aa357c750 100644 --- a/dev-docs/modules/freewheel.md +++ b/dev-docs/modules/freewheel.md @@ -2,10 +2,11 @@ layout: page_v2 page_type: module title: Module - Freewheel -description: Returns targeting key/value pairs for adpod mediaType adUnits. +description: Passes key value targeting to Freewheel SDK for adpod mediaType adUnits. module_code : freeWheelAdserverVideo -display_name : Freewheel +display_name : Freewheel Video Support enable_download : true +vendor_specific: true sidebarType : 1 --- diff --git a/dev-docs/modules/gdprEnforcement.md b/dev-docs/modules/gdprEnforcement.md index 03acfeb352..2afd260ac9 100644 --- a/dev-docs/modules/gdprEnforcement.md +++ b/dev-docs/modules/gdprEnforcement.md @@ -2,10 +2,11 @@ layout: page_v2 page_type: module title: GDPR Enforcement Module -description: Module to enforce GDPR consent +description: If you have users in Europe, you'll want this module that enforces GDPR consent module_code : gdprEnforcement display_name : GDPR Enforcement enable_download : true +recommended: true sidebarType : 1 --- diff --git a/dev-docs/modules/geoedgeRtdProvider.md b/dev-docs/modules/geoedgeRtdProvider.md index a9c4367cef..42113e0086 100644 --- a/dev-docs/modules/geoedgeRtdProvider.md +++ b/dev-docs/modules/geoedgeRtdProvider.md @@ -7,6 +7,7 @@ page_type: module module_type: rtd module_code : geoedgeRtdProvider enable_download : true +vendor_specific: true sidebarType : 1 --- diff --git a/dev-docs/modules/gpt-pre-auction.md b/dev-docs/modules/gpt-pre-auction.md index d9bc49169b..6beebdd1ca 100644 --- a/dev-docs/modules/gpt-pre-auction.md +++ b/dev-docs/modules/gpt-pre-auction.md @@ -2,10 +2,12 @@ layout: page_v2 page_type: module title: Module - GPT Pre-Auction -description: Adds PB Ad Slot and matching GAM ad unit name to each ad unit's first-party data before bid requests are sent to the adapters +description: If you run GAM, this module generates the 'global placement id' that's becoming required for successful auctions. module_code : gptPreAuction display_name : GPT Pre-Auction enable_download : true +recommended: true +vendor_specific: true sidebarType : 1 --- diff --git a/dev-docs/modules/haloRtdProvider.md b/dev-docs/modules/haloRtdProvider.md index 6cd47ece14..6e9be1b0d5 100644 --- a/dev-docs/modules/haloRtdProvider.md +++ b/dev-docs/modules/haloRtdProvider.md @@ -7,6 +7,7 @@ page_type: module module_type: rtd module_code : haloRtdProvider enable_download : true +vendor_specific: true sidebarType : 1 --- diff --git a/dev-docs/modules/iabCatagoryTranslation.md b/dev-docs/modules/iabCatagoryTranslation.md deleted file mode 100644 index 7831fbd198..0000000000 --- a/dev-docs/modules/iabCatagoryTranslation.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -layout: page_v2 -page_type: module -title: Module - IAB Category Translation -description: Converts between ad agency brand categories and IAB brand categories. -module_code : CategoryTranslation -display_name : CategoryTranslation -enable_download : true -sidebarType : 1 ---- - -# IAB Category Translation - -{:.no_toc} - -This module converts the IAB sub category to FreeWheel industry group identifiers. The FreeWheel identifiers ensure competitve separation of industries and products. - -Each bid request must return one [IAB subcategory](https://support.aerserv.com/hc/en-us/articles/207148516-List-of-IAB-Categories). - -The module provides the following: - -- Converts IAB subcategories to a FreewWheel industry group identifier. - -## How to use the module: - -1. A Prebid.js package is built that contains this module and the [FreeWheel](/dev-docs/modules/freewheel.html) module. -2. The inclusion of this module causes Prebid to download a mapping file to local storage. The user also has the option to provide their own mapping file. -3. At runtime, brand category translation happens as needed. - - -## Using A Custom Map File -The IAB Category Translation module uses a default mapping file to convert adserver categories to IAB sub categories. If a publisher prefers to use their own mapping file they will need to set the URL location of that file. They can do so by adding the following to their Prebid.js configuration: - -``` -pbjs.setConfig({ - "brandCategoryTranslation": { - "translationFile": "" - } -}); -``` - -This file will be stored locally to expedite the conversion process. If a publisher opts to not provide a conversion mapping file Prebid will use its default conversion mapping file. - -Publishers should ensure that the JSON returned from their custom file is valid for Prebid by adhering to the following structure: - -```JSON -{ - “mapping”: { - ““: { - “id”: ““, - “name”: “” - }, - .... - } -} -``` - -Refer to Prebid Github repository for a [custom file reference](https://github.com/prebid/category-mapping-file). - - -## Further Reading - -[Prebid.js](/dev-docs/getting-started.html) -[Prebid Video](/prebid-video/video-overview.html) -[FreeWheel Module](/dev-docs/modules/freewheel.html) -[Adapter Integration](/dev-docs/bidder-adaptor.html) - - - - - - - diff --git a/dev-docs/modules/iasRtdProvider.md b/dev-docs/modules/iasRtdProvider.md index b1585553a1..99dae5c16a 100644 --- a/dev-docs/modules/iasRtdProvider.md +++ b/dev-docs/modules/iasRtdProvider.md @@ -7,6 +7,7 @@ page_type: module module_type: rtd module_code : iasRtdProvider enable_download : true +vendor_specific: true sidebarType : 1 --- diff --git a/dev-docs/modules/idLibrary.md b/dev-docs/modules/idLibrary.md index 306b877158..5874353f8e 100644 --- a/dev-docs/modules/idLibrary.md +++ b/dev-docs/modules/idLibrary.md @@ -2,7 +2,7 @@ layout: page_v2 page_type: module title: ID Import Library -description: ID Graphing Adapter +description: Retrieve user ids deployed on your site, and return them to a configurable endpoint for ID Graphing. module_code : currency display_name : ID Import Library enable_download : true diff --git a/dev-docs/modules/index.md b/dev-docs/modules/index.md index 1fe7bb2a4b..35f1311756 100644 --- a/dev-docs/modules/index.md +++ b/dev-docs/modules/index.md @@ -8,95 +8,89 @@ sidebarType: 1 # Prebid.js Module Overview {:.no_toc} -The core of Prebid.js contains only the foundational code needed for header bidding. Any functionality that could be considered an add-on or that covers a special case is being moved out into modules. Examples of this kind of code include: +The core of Prebid.js contains only the foundational code needed for header bidding. Any functionality that could be considered an add-on is part of a module. These are the major categories: -- Bidder adapters -- Special auction logic -- Ad server API integrations -- Any other extensible functionality - -This section of the site contains user-submitted module documentation. We're hoping that it will grow over time. - -To see all of the modules that are available, see the [`modules` folder in the repo](https://github.com/prebid/Prebid.js/tree/master/modules). - -If you are looking for bidder adapter parameters, see [Bidders' Params]({{site.baseurl}}/dev-docs/bidders.html). +- [Bidder adapters](/dev-docs/bidders.html) +- [Analytics adapters](/overview/analytics.html) +- Any other extensible functionality - documented on this page * TOC {:toc} -## General Modules - -{: .table .table-bordered .table-striped } -| Module | Description | -|---------------------+--------------| -| [**Currency**](/dev-docs/modules/currency.html) | Converts bid currency into ad server currency based on data in a supplied exchange rate file. | -| **ConsentManagement** | Collecting and passing consent information in support of privacy regulations:{::nomarkdown}{:/} See [CMP Best Practices.](/dev-docs/cmp-best-practices.html) | -| [**Google Ad Manager Express**](/dev-docs/modules/dfp_express.html) | A simplified installation mechanism for publishers that have Google Publisher Tag (GPT) ad calls in their pages. | -| [**Supply Chain Object**](/dev-docs/modules/schain.html) | Validates and makes the Supply Object available to bidders | -| [**User ID**](/dev-docs/modules/userId.html) | Sub-modules are available to support a range of identification approaches. | -| [**ID Import Library**](/dev-docs/modules/idLibrary.html) | Retrieve user ids deployed on your site, and return them to a configurable endpoint for ID Graphing | -| [**Advanced Size Mapping**](/dev-docs/modules/sizeMappingV2.html) | Display Responsive AdUnits in demanding page environments. | -| [**Price Floors Module**](/dev-docs/modules/floors.html) | Configure and enforce minimum bids. | -| [**GPT Pre-Auction Module**](/dev-docs/modules/gpt-pre-auction.html) | Adds a PB Ad Slot and matching GAM ad unit name to each ad unit's first-party data before bid requests are sent to the adapters. | -| [**ID Import Library**](/dev-docs/modules/idLibrary.html) | Retrieve user ids deployed on your site, and return them to a configurable endpoint for ID Graphing | -| [**First Party Data Enrichment**](/dev-docs/modules/enrichmentFpdModule.html) | Pulls well-known FPD from the environment to form a base of data available to all adapters. | -| [**MASS**](/dev-docs/modules/mass.html) | Enables the MASS protocol for Prebid and custom renderers by DealID | -| [**MultiBid Module**](/dev-docs/modules/multibid.html) | Allows bidders to send multiple bids to the ad server. | -| [**Bid Viewability - GAM**](/dev-docs/modules/bidViewable.html) | Triggers an event which can be consumed by analytics and bid adapters. Supports Google Ad Manager. | -| [**Bid Viewability - Ad Server Independent**](/dev-docs/modules/bidViewableIO.html) | Triggers an event which can be consumed by analytics and bid adapters. No ad server requirements. | +{% assign module_pages = site.pages | where: "page_type", "module" %} -## Real-Time Data Providers +## Recommended Modules -All of the modules that fall under the Real-Time Data (RTD) category conform to -a consistent set of publisher controls. The pub can choose to run multiple -RTD modules, define an overall amount of time they're willing to wait for -results, and even flag some of the modules as being more "important" -than others. +Prebid.org highly recommends that publishers utilize the following modules: +
+ + + + + + + + +{% for page in module_pages %}{% if page.recommended == true %} + + + + +{% endif %}{% endfor %} + +
ModuleDescription
{{page.display_name}}{{page.description}}
-See [the realTimeData setConfig](/dev-docs/publisher-api-reference/setConfig.html#setConfig-realTimeData) reference for more details. +## General Modules -{% assign module_pages = site.pages | where: "page_type", "module" | where: "module_type", "rtd" %} +Modules in the Real-Time Data (RTD) category conform to +a consistent set of publisher controls. The publisher can choose to run multiple +RTD modules, define an overall amount of time they're willing to wait for +results, and even flag some of the modules as being higher priority +than others. See [the realTimeData setConfig](/dev-docs/publisher-api-reference/setConfig.html#setConfig-realTimeData) reference for more details. + -{% for page in module_pages %} - {% if page.enable_download == false %}{% continue %}{% endif %} +{% for page in module_pages %}{% if page.recommended == true or page.vendor_specific == true %}{% continue %}{% endif %} - + + {% if page.module_type == "rtd" %}{% else %}{% endif %} {% endfor %}
Module DescriptionRTD?
{{page.title}}{{page.display_name}} {{page.description}}yesno
-## Video Modules - -{: .table .table-bordered .table-striped } -| Module | Description | -|---------------------+--------------| -| [**Ad Pod**](/dev-docs/modules/adpod.html) | Enables developers to add support for a new adserver that handles ad pod (long-form) videos | -| [**Freewheel**](/dev-docs/modules/freewheel.html) | Passes key value targeting to Freewheel SDK | -| [**Google Ad Manager Video**](/dev-docs/modules/dfp_video.html) | Required for serving instream video through Google Ad Manager. | -| [**IAB Category Translation**](/dev-docs/modules/categoryTranslation.html) | Converts IAB sub category to Ad server category for long-form videos. | -| [**Instream Video Ads Tracking**](/dev-docs/modules/instreamTracking.html) | Allow Analytics Adapters and Bid Adapters to track `BID_WON` events for Instream video bids. | -| [**Konduit Accelerate**](/dev-docs/modules/konduit.html) | Provides Real Time Start Rate Performance per Bidder. | - -## Testing and Debug Modules - -{: .table .table-bordered .table-striped } -| Module | Description | -|---------------------+--------------| -| [**Server-to-Server Testing**](/dev-docs/modules/s2sTesting.html) | Adds A/B test support to ease into server-side header bidding. | -| [**First Party Data Validation**](/dev-docs/modules/validationFpdModule.html) | Verify First Party Data ortb2 fields and data types. | +## Vendor-Specific Modules +These modules may require accounts with a service provider. + + + + + + + + + +{% for page in module_pages %}{% if page.recommended == true %}{% continue %}{% endif %}{% if page.vendor_specific == true %} + + + + {% if page.module_type == "rtd" %}{% else %}{% endif %} + +{% endif %}{% endfor %} + +
ModuleDescriptionRTD?
{{page.display_name}}{{page.description}}yesno
## Further Reading + [Source code of all modules](https://github.com/prebid/Prebid.js/tree/master/modules) -+ [Bidders' Params](/dev-docs/bidders.html) ++ [How to add a Bid Adapter](/dev-docs/bidder-adaptor.html) ++ [How to add an Analytics Adapter](/dev-docs/integrate-with-the-prebid-analytics-api.html) + [How to add a Real Time Data Submodule](/dev-docs/add-rtd-submodule.html) diff --git a/dev-docs/modules/instreamTracking.md b/dev-docs/modules/instreamTracking.md index 4e3d18255e..1e2c16f128 100644 --- a/dev-docs/modules/instreamTracking.md +++ b/dev-docs/modules/instreamTracking.md @@ -2,7 +2,7 @@ layout: page_v2 page_type: module title: Module - Instream Video Ads Tracking -description: Allows to track `BID WON` events for instream ad units +description: Allow Analytics Adapters and Bid Adapters to track `BID_WON` events for instream video bids. module_code : instreamTracking display_name : Instream Tracking enable_download : true diff --git a/dev-docs/modules/jwplayerRtdProvider.md b/dev-docs/modules/jwplayerRtdProvider.md index 66b4fc3024..2950e4fceb 100644 --- a/dev-docs/modules/jwplayerRtdProvider.md +++ b/dev-docs/modules/jwplayerRtdProvider.md @@ -7,6 +7,7 @@ page_type: module module_type: rtd module_code : jwplayerRtdProvider enable_download : true +vendor_specific: true sidebarType : 1 --- diff --git a/dev-docs/modules/konduit.md b/dev-docs/modules/konduit.md index 7623ae7aa2..f9bb831eea 100644 --- a/dev-docs/modules/konduit.md +++ b/dev-docs/modules/konduit.md @@ -2,10 +2,11 @@ layout: page_v2 page_type: module title: Module - Konduit Accelerate -description: Applies Konduit video ad acceleration optimization to a provided bid. +description: Applies Konduit video ad acceleration optimization to wining video bid. module_code : konduitWrapper display_name : Konduit Accelerate enable_download : true +vendor_specific: true sidebarType : 1 --- diff --git a/dev-docs/modules/mass.md b/dev-docs/modules/mass.md index eba3a6898b..019e5c58b6 100644 --- a/dev-docs/modules/mass.md +++ b/dev-docs/modules/mass.md @@ -2,9 +2,9 @@ layout: page_v2 page_type: module title: Module - MASS -description: Enable MASS protocol for Prebid +description: General deal rendering functionality. module_code : mass -display_name : MASS +display_name : Deal Rendering (aka MASS) enable_download : true sidebarType : 1 --- diff --git a/dev-docs/modules/medianetRtdProvider.md b/dev-docs/modules/medianetRtdProvider.md index b80a3aa501..fac7f1cf1c 100644 --- a/dev-docs/modules/medianetRtdProvider.md +++ b/dev-docs/modules/medianetRtdProvider.md @@ -7,6 +7,7 @@ page_type: module module_type: rtd module_code : medianetRtdProvider enable_download : true +vendor_specific: true sidebarType : 1 --- diff --git a/dev-docs/modules/multibid.md b/dev-docs/modules/multibid.md index 49f04d8786..e9ae46f0cc 100644 --- a/dev-docs/modules/multibid.md +++ b/dev-docs/modules/multibid.md @@ -2,7 +2,7 @@ layout: page_v2 page_type: module title: Module - MultiBid -description: Allows bidders to return more than one bid response +description: Allows bidders to send multiple bids to the ad server. module_code : multibid display_name : MultiBid enable_download : true diff --git a/dev-docs/modules/optimeraRtdProvider.md b/dev-docs/modules/optimeraRtdProvider.md index 19fdfb4b89..351febd353 100644 --- a/dev-docs/modules/optimeraRtdProvider.md +++ b/dev-docs/modules/optimeraRtdProvider.md @@ -7,6 +7,7 @@ page_type: module module_type: rtd module_code : optimeraRtdProvider enable_download : true +vendor_specific: true sidebarType : 1 --- diff --git a/dev-docs/modules/permutiveRtdProvider.md b/dev-docs/modules/permutiveRtdProvider.md index 059cdfb49a..0983fe4d8a 100644 --- a/dev-docs/modules/permutiveRtdProvider.md +++ b/dev-docs/modules/permutiveRtdProvider.md @@ -7,6 +7,7 @@ page_type: module module_type: rtd module_code : permutiveRtdProvider enable_download : true +vendor_specific: true sidebarType : 1 --- diff --git a/dev-docs/modules/pubCommonId.md b/dev-docs/modules/pubCommonId.md index 7e42c44ade..455e89bb38 100644 --- a/dev-docs/modules/pubCommonId.md +++ b/dev-docs/modules/pubCommonId.md @@ -4,7 +4,7 @@ page_type: module title: Module - Publisher Common ID description: User ID persisted in first party domain module_code : pubCommonId -display_name : Publisher Common ID +display_name : Publisher Common ID (deprecated) enable_download : true sidebarType : 1 --- diff --git a/dev-docs/modules/reconciliationRtdProvider.md b/dev-docs/modules/reconciliationRtdProvider.md index da9da39642..47ff52d92e 100644 --- a/dev-docs/modules/reconciliationRtdProvider.md +++ b/dev-docs/modules/reconciliationRtdProvider.md @@ -5,8 +5,9 @@ description: Reconciliation Real Time Data Module page_type: module module_type: rtd module_code: reconciliationRtdProvider -display_name: Reconciliation +display_name: Reconciliation Supply Chain Validation enable_download: true +vendor_specific: true sidebarType: 1 --- diff --git a/dev-docs/modules/schain.md b/dev-docs/modules/schain.md index 77934e227c..4534f4840b 100644 --- a/dev-docs/modules/schain.md +++ b/dev-docs/modules/schain.md @@ -2,7 +2,7 @@ layout: page_v2 page_type: module title: Module - Supply Chain Object -description: Validates Supply Chain object and makes it available to bidder +description: Validates the Supply Chain object and makes it available to bidders. module_code : schain display_name : Supply Chain Object enable_download : true diff --git a/dev-docs/modules/sirdataRtdProvider.md b/dev-docs/modules/sirdataRtdProvider.md index 419c8f0876..68a07237f2 100644 --- a/dev-docs/modules/sirdataRtdProvider.md +++ b/dev-docs/modules/sirdataRtdProvider.md @@ -7,6 +7,7 @@ page_type: module module_type: rtd module_code : sirdataRtdProvider enable_download : true +vendor_specific: true sidebarType : 1 --- @@ -195,4 +196,4 @@ To view an example of available segments returned by Sirdata's backends: and then point your browser at: -`http://localhost:9999/integrationExamples/gpt/sirdataRtdProvider_example.html` \ No newline at end of file +`http://localhost:9999/integrationExamples/gpt/sirdataRtdProvider_example.html` diff --git a/dev-docs/modules/sizeMappingV2.md b/dev-docs/modules/sizeMappingV2.md index e51406e929..7583b4bb5d 100644 --- a/dev-docs/modules/sizeMappingV2.md +++ b/dev-docs/modules/sizeMappingV2.md @@ -2,7 +2,7 @@ layout: page_v2 page_type: module title: Module - Size Mapping -description: Display Conditional and Responsive Ad Units +description: Display Responsive AdUnits in demanding page environments. module_code: sizeMappingV2 display_name: Advanced Size Mapping enable_download: true diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md index 7abe9b6366..ac7d756f47 100644 --- a/dev-docs/modules/userId.md +++ b/dev-docs/modules/userId.md @@ -2,7 +2,7 @@ layout: page_v2 page_type: module title: Module - User ID -description: Supports multiple cross-vendor user IDs +description: Vendor-specific user ID sub-modules are available to support a range of identification approaches. module_code : userId display_name : User ID enable_download : false diff --git a/dev-docs/modules/validationFpdModule.md b/dev-docs/modules/validationFpdModule.md index 00c3cae15a..571eb26f7f 100644 --- a/dev-docs/modules/validationFpdModule.md +++ b/dev-docs/modules/validationFpdModule.md @@ -2,7 +2,7 @@ layout: page_v2 page_type: module title: Module - First Party Data Validation -description: Validates First Party Data +description: Verify First Party Data fields and data types. Not recommended for production use. module_code : validationFpdModule display_name : First Party Data Validation enable_download : true diff --git a/download.md b/download.md index 496ccb4596..6d4c3be385 100644 --- a/download.md +++ b/download.md @@ -5,6 +5,33 @@ description: Documentation on how to download Prebid.js for header bidding. sidebarType: 0 --- + + + + + +

In-image

+
+
+ +
+ +
+ +

Just Banner

+
+
+ +
+ + +``` +### InImage Example page with GPT + +```html + + + + + Prebid.js In-image Example + + + + + +

In-image

+
+
+ +
+
+ +
+
+ + +``` From abea589d9e93c368b4924ec027819b3a1dd45123 Mon Sep 17 00:00:00 2001 From: IQZoneAdx <88879712+IQZoneAdx@users.noreply.github.com> Date: Tue, 21 Sep 2021 16:40:21 +0300 Subject: [PATCH 20/71] IQzone Adapter: update doc (#3278) * add IQZone adapter doc * add new bid param * fix * updates --- dev-docs/bidders/iqzone.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/iqzone.md b/dev-docs/bidders/iqzone.md index 2c5c50e850..099cde3ba5 100644 --- a/dev-docs/bidders/iqzone.md +++ b/dev-docs/bidders/iqzone.md @@ -19,10 +19,14 @@ pbs_app_supported: true |---------------|----------|-----------------------|-----------|-----------| | `placementId` | required | Placement Id | `'0'` | `'string'` | - ### Prebid server Bid Params {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |---------------|----------|-----------------------|-----------|-----------| -| `endpointId` | required | Endpoint Id | `'0'` | `'string'` | \ No newline at end of file +| `placementId` | optional | Placement Id | `'0'` | `'string'` | +| `endpointId` | optional | Endpoint Id | `'0'` | `'string'` | + +### Note + +For the prebid server, you only need to use one parameter, placementId or endpointId From 44ec5c503ae522c23818c313255b9377c2c352db Mon Sep 17 00:00:00 2001 From: Noam Tzuberi Date: Tue, 21 Sep 2021 16:44:42 +0300 Subject: [PATCH 21/71] Rise docs (#3276) * Update Rise readme * update docs --- dev-docs/bidders/rise.md | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/dev-docs/bidders/rise.md b/dev-docs/bidders/rise.md index 0d2af523a2..b66676d156 100644 --- a/dev-docs/bidders/rise.md +++ b/dev-docs/bidders/rise.md @@ -1,13 +1,14 @@ --- layout: bidder title: Rise -description: Prebid Bidder Adaptor +description: Prebid Bidder Adaptor pbjs: true biddercode: rise -media_types: no-display, video +media_types: video schain_supported: true gdpr_supported: true usp_supported: true +getFloor: true userIds: all gvl_id: 1043 --- @@ -25,7 +26,7 @@ The Rise adapter requires setup and approval. Please reach out to prebid-rise-en | ---- | ----- | ---- | ----------- | ------- | `org` | required | String | Rise publisher Id provided by your Rise representative | "56f91cd4d3e3660002000033" | `floorPrice` | optional | Number | Minimum price in USD.

**WARNING:**
Misuse of this parameter can impact revenue | 2.00 -| `ifa` | optional | String | The ID for advertisers (also referred to as "IDFA") | "XXX-XXX" +| `placementId` | optional | String | A unique placement identifier | "12345678" | `testMode` | optional | Boolean | This activates the test mode | false ## Example @@ -45,7 +46,7 @@ var adUnits = [ params: { org: '56f91cd4d3e3660002000033', // Required floorPrice: 5.00, // Optional - ifa: 'XXX-XXX', // Optional + placementId: '12345678', // Optional testMode: false // Optional } }] @@ -56,18 +57,5 @@ var adUnits = [ ### Configuration Rise recommends setting UserSync by iframe for monetization. -For Prebid.js v1.15.0 and later: - -pbjs.setConfig({ - userSync: { - filterSettings: { - iframe: { - bidders: '*', // '*' represents all bidders - filter: 'include' - } - } - } -}); - ### Versions Prebid versions 5.0-5.3 are not supported From 40595bae529fa0feaf9c8793163cc57ac1a3b359 Mon Sep 17 00:00:00 2001 From: Chris Huie Date: Tue, 21 Sep 2021 06:55:28 -0700 Subject: [PATCH 22/71] Seeding Alliance Bid Adapter: update Prebid 5 comp (#3271) per per -> https://github.com/prebid/Prebid.js/pull/7426 --- dev-docs/bidders/seedingAlliance.md | 1 - 1 file changed, 1 deletion(-) diff --git a/dev-docs/bidders/seedingAlliance.md b/dev-docs/bidders/seedingAlliance.md index bba20fe71b..0683e3a3d8 100644 --- a/dev-docs/bidders/seedingAlliance.md +++ b/dev-docs/bidders/seedingAlliance.md @@ -6,7 +6,6 @@ pbjs: true biddercode: seedingAlliance media_types: native gdpr_supported: true -pbjs_version_notes: not in 5.x --- ### Bid params From b1a7380d383b2781f3e66a652d401db002be6a1c Mon Sep 17 00:00:00 2001 From: Jurij Sinickij Date: Tue, 21 Sep 2021 16:56:49 +0300 Subject: [PATCH 23/71] Adf adapter: floors module support (#3270) --- dev-docs/bidders/adf.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/adf.md b/dev-docs/bidders/adf.md index 674a46caa9..44045bed9f 100644 --- a/dev-docs/bidders/adf.md +++ b/dev-docs/bidders/adf.md @@ -13,6 +13,7 @@ schain_supported: true userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, sharedId, unifiedId gvl_id: 50 prevBiddercode: adformOpenRTB +getFloor: true --- ### Bid params From c3af4e613cc37fe22b0f56684d070e4331c84b5e Mon Sep 17 00:00:00 2001 From: Damyan Date: Tue, 21 Sep 2021 17:04:31 +0300 Subject: [PATCH 24/71] AdHash bidder adaptor for 5.0 (#3264) * AdHash Bidder Adapter: initial prebid.js integration * AdHash Bidder Adapter: changing the example text Changing the example text as it's one of our actual client's name * AdHash bidder adaptor for 5.0 update --- dev-docs/bidders/adhash.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/adhash.md b/dev-docs/bidders/adhash.md index 93b4dd61bc..f341d3e6de 100644 --- a/dev-docs/bidders/adhash.md +++ b/dev-docs/bidders/adhash.md @@ -5,7 +5,7 @@ description: Prebid AdHash Bidder Adapter pbjs: true biddercode: adhash safeframes_ok: false -pbjs_version_notes: not in 5.x +gdpr_supported: true --- ### Note From a3a57e83e31756c9423c22b2567dfc9d58c306f9 Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 24 Sep 2021 12:48:23 -0400 Subject: [PATCH 25/71] Update guide.md (#3288) --- guide.md | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/guide.md b/guide.md index f397c5a8d5..84cbfba55b 100644 --- a/guide.md +++ b/guide.md @@ -9,11 +9,29 @@ sidebarType: 0 # Prebid Website Maintenance Guide -v 1.1 -Sept 7, 2019 +v 1.2 +Sept 24, 2021 *** +## Reviewing Pull Requests and Issues + +Being a reviewer means you're in weekly rotation where you keep an eye on pull requests (PRs) and issues opened in this repo. + +### PR Review Guidelines + +1. Make sure no inappropriate changes are made. This covers obvious things like bad language and content, but we also don't allow overt marketing language on the site. Phrases like "we're the best BLAH" or "number one FOOZIT" need to be toned down. +2. Make sure competitors aren't messing with each other's docs. This can be hard to tell because we don't know which github handles belong to which companies, but in general, if a destructive or suspicious change is being made to a doc, check on the Prebid Slack channel to confirm that the affected company approves the change. +3. Make sure the change doesn't break formatting. It's not always necessary to preview locally, but for large changes, it's worthwhile verifying visually because markdown can be cranky. +4. Help the author with basic readability - if you as a reviewer don't understand a sentence, probably others will have trouble too. Push back and ask questions about what they're really trying to say. +5. We don't generally merge a docs PR until the related code is released. Prebid.js releases happen on Weds or Thurs, and people really like to have their docs PRs merged shortly after the code is released. For Prebid Server, it's ok to merge the docs after the code is merged. +6. Fix broken or out-of-date things you run across. At least flag it in the team slack channel so we can fix it someday. +7. Bid Adapter Guidelines + 1. Check the front-matter: required fields are title and either pbjs or pbs. + 2. Every adapter needs a parameters table that contains exactly 5 columns in this order: Name, Scope, Description, Example, Type. + 3. Discourage full-page HTML examples. Better to have just the bidder-specific logic and a pointer to a standard Prebid.js example. + 4. All headers must be level 3, 4, or 5. + ## Core Technologies The Prebid website is developed using [Jekyll](https://jekyllrb.com/), a static site generator which uses the following technology to create and style HTML pages. From 060947a699a49fd5e1c55e2ae77ed7c4c253f8dc Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 24 Sep 2021 13:10:16 -0400 Subject: [PATCH 26/71] minor updates to guide (#3289) --- guide.md | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/guide.md b/guide.md index 84cbfba55b..48f65e03a5 100644 --- a/guide.md +++ b/guide.md @@ -34,7 +34,7 @@ Being a reviewer means you're in weekly rotation where you keep an eye on pull r ## Core Technologies -The Prebid website is developed using [Jekyll](https://jekyllrb.com/), a static site generator which uses the following technology to create and style HTML pages. +The Prebid website is developed using [Jekyll](https://jekyllrb.com/), a static site generator which uses the following technology to create and style HTML pages. See the [main README file](https://github.com/prebid/prebid.github.io/blob/master/README.md) for instructions on how to set this up. **Markdown**: The majority of the content is written in Markdown language. Jekyll transform this into raw HTML. @@ -56,7 +56,7 @@ Learn more about [Liquid](https://help.shopify.com/en/themes/liquid/basics) ## Site Config -The _config.yml file (note underscore prefix) sets the base configuration for the site. Refer to [Jekyll](https://jekyllrb.com/docs/configuration/) documentation on which properties can be set in the _congig.yml file. +The _config.yml file (note underscore prefix) sets the base configuration for the site. Refer to [Jekyll](https://jekyllrb.com/docs/configuration/) documentation on which properties can be set in the _config.yml file. *** @@ -254,18 +254,14 @@ The attributes in the Jekyll 'front matter' drive various behaviors and dynamic | ----- | ------ | ------ | ------ | | layout | yes | bidder | Links this file to the bidder.html layout | | title | yes | company name | For display | +| pbjs | sorta | true or false | defines whether this is a Prebid.js bidder | +| pbs | sorta | true or false | defines whether this is a Prebid Server bidder | | description | no | - | Not used | -| hide | no | - | Not used | | biddercode | yes | preferred bidder code | Used as the default ad server targeting suffix and the default download filename | | aliasCode | no | download filename | Overrides the filename used to build the PBJS package on the download page | | prevBiddercode | no | secondary bidder code | Adds a note about an alternate code that may have been used. | -| bidder_supports_deals | no | true or false, whether the adapter supports deals | For display. Defaults to 'true'. | -| s2s_only | no | true or false, whether the adapter is server-to-server only | Adds a note to the display. Defaults to 'false'. | -| gdpr_supported | no | true or false, whether the adapter supports GDPR | For display. Defaults to 'false'. | -| coppa_supported | no | true or false, whether the adapter supports COPPA | For display. Defaults to 'false'. | -| media_types | no | comma-separated list of: banner, video, native | For display. | -| userIds | no | comma-separated list of supported user id modules | For display. | -| prebid_member | no | true or false, whether this company is a prebid.org member | For display. | +| pbjs_version_notes | no | string | Displays on the download page | +| ANYTHING ELSE | no | string | There are many pieces of metadata (e.g. GDPR support, user IDs supported) that bid adapters can disclose. They're displayed on the bidder's parameter page. | The bidderCode, aliasCode, and prevBiddercode parameters bear some description. Some adapters have a longer bidderCode and a shorter bidderCode -- their adapter supports both (with the `alias` feature) but From 909a55126a2a7bff06e9871a14c8da409d96e514 Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 24 Sep 2021 13:16:52 -0400 Subject: [PATCH 27/71] added environment section to guide (#3290) --- guide.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/guide.md b/guide.md index 48f65e03a5..434d04a776 100644 --- a/guide.md +++ b/guide.md @@ -34,7 +34,7 @@ Being a reviewer means you're in weekly rotation where you keep an eye on pull r ## Core Technologies -The Prebid website is developed using [Jekyll](https://jekyllrb.com/), a static site generator which uses the following technology to create and style HTML pages. See the [main README file](https://github.com/prebid/prebid.github.io/blob/master/README.md) for instructions on how to set this up. +The Prebid website is developed using [GitHub pages](https://pages.github.com/) and [Jekyll](https://jekyllrb.com/), a static site generator which uses the following technology to create and style HTML pages. See the [main README file](https://github.com/prebid/prebid.github.io/blob/master/README.md) for instructions on how to set this up. **Markdown**: The majority of the content is written in Markdown language. Jekyll transform this into raw HTML. @@ -52,7 +52,14 @@ Learn more about [Liquid](https://help.shopify.com/en/themes/liquid/basics) **CSS**: The site builds on the base Bootstrap template with custom CSS stored in the style.css file. -*** +### Environment + +- prebid.org is built with Wordpress. We call it "the marketing site". We generally use a contracting company to make major updates there so it's pretty. But if you know Wordpress, we may give you permissions to do minor updates there. +- docs.prebid.org is the Github pages site. We call it "the docs site". +- dev.prebid.org is served through Netlify from the 'dev' branch of the repo. It's often out of date and only used for major projects or for sharing major docs for external review. +- stage.prebid.org is also served through Netlify, but from the 'staging' branch. You should assume it's out of date. + +On the rare occasions where we need to use the 'dev' or 'stage' sites, we just check with each other to make sure it's not already being used for something. ## Site Config From ec5b5ac517a55baa30ac7bbcc36fa9f695a74568 Mon Sep 17 00:00:00 2001 From: adquery <89853721+adquery@users.noreply.github.com> Date: Fri, 24 Sep 2021 19:25:41 +0200 Subject: [PATCH 28/71] new adquery adapter (#3275) * new Adapter * Removed prebid version note. We support version 5.x Co-authored-by: m.czerwiak --- dev-docs/bidders/adquery.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 dev-docs/bidders/adquery.md diff --git a/dev-docs/bidders/adquery.md b/dev-docs/bidders/adquery.md new file mode 100644 index 0000000000..6276c9650c --- /dev/null +++ b/dev-docs/bidders/adquery.md @@ -0,0 +1,19 @@ +--- +layout: bidder +title: Adquery +description: Prebid Adquery Bidder Adaptor +pbjs: true +biddercode: adquery +gdpr_supported: true +usp_supported: true +schain_supported: true +gvl_id: 902 +--- + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|---------------|-------------------------------------------|-----------| +| `placementId` | required | Placement ID | `6d93f2a0e5f0fe2cc3a6e9e3ade964b43b07f897`| `string` | +| `type` | required | Ad Type | `banner300x250` | `string` | \ No newline at end of file From 6be107a41841359821862694a6851a6534471abf Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 24 Sep 2021 13:26:29 -0400 Subject: [PATCH 29/71] fixed ortb2Imp (#3291) --- dev-docs/modules/gpt-pre-auction.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dev-docs/modules/gpt-pre-auction.md b/dev-docs/modules/gpt-pre-auction.md index 6beebdd1ca..1f53ca3ff6 100644 --- a/dev-docs/modules/gpt-pre-auction.md +++ b/dev-docs/modules/gpt-pre-auction.md @@ -24,9 +24,9 @@ This module enables targeting and tracking at the ad server adunit level. Enabled by default if compiled into your package, this module will add the [Prebid Ad Slot](/features/pbAdSlot.html) and matching GAM ad unit name to each ad unit's first-party data before bid requests are sent to the adapters. * **Prebid.js Adapters** - will be able to utilize these values as: - * AdUnit.ortb2imp.ext.data.adserver.name="gam" - * AdUnit.ortb2imp.ext.data.adserver.adslot="/1111/home" - * AdUnit.ortb2imp.ext.data.pbadslot="/1111/home-left" + * AdUnit.ortb2Imp.ext.data.adserver.name="gam" + * AdUnit.ortb2Imp.ext.data.adserver.adslot="/1111/home" + * AdUnit.ortb2Imp.ext.data.pbadslot="/1111/home-left" * **Prebid Server Adapters** - will see the OpenRTB as: * imp[].ext.data.adserver.name * imp[].ext.data.adserver.adslot @@ -74,13 +74,13 @@ When this module is on, it uses the BEFORE_REQUEST_BIDS event to insert function If GPT slot matching succeeds: -- it sets the Adunit ortb2imp.ext.data.adserver.name to 'gam' -- it copies the resulting GPT slot name to ortb2imp.ext.data.adserver.adslot +- it sets the Adunit ortb2Imp.ext.data.adserver.name to 'gam' +- it copies the resulting GPT slot name to ortb2Imp.ext.data.adserver.adslot -The customPbAdSlot function is called if it was specified, writing the results to ortb2imp.ext.data.pbadslot. -If there's no customPbAdSlot, a default algorithm is used to determine ortb2imp.ext.data.pbadslot: +The customPbAdSlot function is called if it was specified, writing the results to ortb2Imp.ext.data.pbadslot. +If there's no customPbAdSlot, a default algorithm is used to determine ortb2Imp.ext.data.pbadslot: -- first use the AdUnit's ortb2imp.ext.data.pbadslot if defined +- first use the AdUnit's ortb2Imp.ext.data.pbadslot if defined - else, see if the AdUnit.code corresponds to a div and if so, try to retrieve a data element from the div called data-adslotid. - else if the GPT slot matching succeeded, use the GPT slot name - else, just use the AdUnit.code, assuming that that's the ad unit slot From 2aca0312b64d42d7115fed6efe2412dc39ddfb99 Mon Sep 17 00:00:00 2001 From: Tiago Peczenyj Date: Fri, 24 Sep 2021 19:26:53 +0200 Subject: [PATCH 30/71] add weborama RTD doc (#3277) Co-authored-by: Tiago Peczenyj --- dev-docs/modules/weboramaRtdProvider.md | 81 +++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 dev-docs/modules/weboramaRtdProvider.md diff --git a/dev-docs/modules/weboramaRtdProvider.md b/dev-docs/modules/weboramaRtdProvider.md new file mode 100644 index 0000000000..b4b1e632c9 --- /dev/null +++ b/dev-docs/modules/weboramaRtdProvider.md @@ -0,0 +1,81 @@ +--- +layout: page_v2 +title: Weborama Real Time Data Provider +display_name: Weborama Real-time Segmentation Module +description: Weborama Real-time Segmentation Module +page_type: module +module_type: rtd +module_code : weboramaRtdProvider +enable_download : true +vendor_specific: true +sidebarType : 1 +--- + +# Weborama RTD Segmentation Module +{:.no_toc} + +* TOC +{:toc} + +Weborama provides a Semantic AI Contextual API that classifies in Real-time a web page seen by a web user within generic and custom topics. It enables publishers to better monetize their inventory and unlock it to programmatic. + +ORTB2 compliant and FPD support for Prebid versions < 4.29 + +Please contact prebid-support@weborama.com for more information. + +## Publisher Usage + +### Configure Prebid.js + +Compile the Weborama RTD module into your Prebid build: + +`gulp build --modules=rtdModule,weboramaRtdProvider` + +Add the Weborama RTD provider to your Prebid config. + + +#### Minimal configuration + +``` +pbjs.setConfig( + ... + realTimeData: { + auctionDelay: 1000, + dataProviders: [ + { + name: "WeboramaRTDModule", + waitForIt: true, + params: { + token: "" + } + } + ] + } + ... +} +``` + +### Parameter Descriptions for the Weborama Configuration Section + +| Name |Type | Description | Notes | +| :------------ | :------------ | :------------ |:------------ | +| name | String | Real time data module name | Mandatory. Always 'Weborama' | +| waitForIt | Boolean | Mandatory. Required to ensure that the auction is delayed until prefetch is complete | Optional. Defaults to false but recommended to true | +| params | Object | | Optional | +| params.weboCtxConf | Object | Weborama Contextual Configuration | Optional | +| params.weboCtxConf.token | String | Security Token provided by Weborama, unique per client | Mandatory | +| params.weboCtxConf.targetURL | String | Url to be profiled in the contextual api | Optional. Defaults to `document.URL` | +| params.weboCtxConf.defaultProfile | Object | default value of the profile to be used when there are no response from contextual api (such as timeout)| Optional. Default is `{}` | +| params.weboCtxConf.setTargeting|Boolean|If true, will use the contextual profile to set the gam targeting of all adunits managed by prebid.js| Optional. Default is *true*.| +| params.weboCtxConf.setOrtb2|Boolean|If true, will use the contextual profile to set the ortb2 configuration on `site.ext.data`| Optional. Default is *false*.| + + +### Testing + +To view an example of available segments returned by Weborama's backends: + +`gulp serve --modules=rtdModule,weboramaRtdProvider,appnexusBidAdapter` + +and then point your browser at: + +`http://localhost:9999/integrationExamples/gpt/weboramaRtdProvider_example.html` From 648291c3a51464d1ba179f1b002c0d61b30cf00e Mon Sep 17 00:00:00 2001 From: Scott Kay Date: Mon, 27 Sep 2021 10:21:01 -0400 Subject: [PATCH 31/71] PBS-Go User Sync (#3220) * Initial Commit * Auction Endpoint JSON Formatting * Added User Sync Config Doc * Update Feature Comparison List * Proof Read Pass * Clarified part of the process * Fixed a typo * Edits for PBS docs Co-authored-by: SSuranie --- dev-docs/publisher-api-reference/setConfig.md | 2 +- prebid-server/developers/add-new-bidder-go.md | 497 ++++++-------- prebid-server/developers/pbs-cookie-sync.md | 35 +- .../openrtb2/pbs-endpoint-auction.md | 613 +++++++++--------- prebid-server/endpoints/pbs-endpoint-event.md | 2 +- .../endpoints/pbs-endpoint-overview.md | 4 +- .../endpoints/pbs-endpoint-setuid.md | 12 +- prebid-server/features/pbs-currency.md | 14 +- prebid-server/features/pbs-feature-idx.md | 18 +- prebid-server/features/pbs-privacy.md | 2 +- prebid-server/hosting/pbs-database.md | 4 +- prebid-server/hosting/pbs-hosting.md | 2 +- prebid-server/versions/pbs-versions-go.md | 2 +- prebid-server/versions/pbs-versions-java.md | 2 +- 14 files changed, 568 insertions(+), 641 deletions(-) diff --git a/dev-docs/publisher-api-reference/setConfig.md b/dev-docs/publisher-api-reference/setConfig.md index e9c0a4ee33..1d2904bc70 100644 --- a/dev-docs/publisher-api-reference/setConfig.md +++ b/dev-docs/publisher-api-reference/setConfig.md @@ -472,7 +472,7 @@ The `s2sConfig` properties: | `endpoint` | Required | URL or Object | Defines the auction endpoint for the Prebid Server cluster. See table below for object config properties. | | `syncEndpoint` | Required | URL or Object | Defines the cookie_sync endpoint for the Prebid Server cluster. See table below for object config properties. | | `userSyncLimit` | Optional | Integer | Max number of userSync URLs that can be executed by Prebid Server cookie_sync per request. If not defined, PBS will execute all userSync URLs included in the request. | -| `coopSync` | Optional | Boolean | Whether or not PBS is allowed to perform "cooperative syncing" for bidders not on this page. Publishers help each other improve match rates by allowing this. Default is true. Supported in PBS-Java only. | +| `coopSync` | Optional | Boolean | Whether or not PBS is allowed to perform "cooperative syncing" for bidders not on this page. Publishers help each other improve match rates by allowing this. Default is true. | | `defaultTtl` | Optional | Integer | Configures the default TTL in the Prebid Server adapter to use when Prebid Server does not return a bid TTL - 60 if not set | | `adapterOptions` | Optional | Object | Arguments will be added to resulting OpenRTB payload to Prebid Server in every impression object at request.imp[].ext.BIDDER. See the example above. | | `extPrebid` | Optional | Object | Arguments will be added to resulting OpenRTB payload to Prebid Server in request.ext.prebid. See the examples below. | diff --git a/prebid-server/developers/add-new-bidder-go.md b/prebid-server/developers/add-new-bidder-go.md index b710431d91..3acc766ae2 100644 --- a/prebid-server/developers/add-new-bidder-go.md +++ b/prebid-server/developers/add-new-bidder-go.md @@ -13,7 +13,7 @@ Thank you for contributing a bid adapter to the open source Prebid Server projec This document guides you through the process of developing a new bid adapter for your bidding server. We encourage you to look at [existing bid adapters](https://github.com/prebid/prebid-server/tree/master/adapters) for working examples and practical guidance. You can also ask us questions by [submitting a GitHub issue](https://github.com/prebid/prebid-server/issues/new). {: .alert.alert-info :} -**NOTE:** There are two implementations of Prebid Server, [PBS-Go](https://github.com/prebid/prebid-server) and [PBS-Java](https://github.com/prebid/prebid-server-java). We recommend you build new adapters for PBS-Go and allow us to port it to PBS-Java within a couple of months. If you'd like to build both yourself, please also follow these [instructions for building an adapter in PBS-Java](/prebid-server/developers/add-new-bidder-java.html). +There are two implementations of Prebid Server, [PBS-Go](https://github.com/prebid/prebid-server) and [PBS-Java](https://github.com/prebid/prebid-server-java). We recommend you build new adapters for PBS-Go and allow us to port it to PBS-Java within a couple of months. If you'd like to build both yourself, please also follow these [instructions for building an adapter in PBS-Java](/prebid-server/developers/add-new-bidder-java.html). * TOC @@ -31,7 +31,7 @@ An OpenRTB 2.5 Bid Request contains one or more Impressions, each representing a You will need to choose a unique name for your bid adapter. Names should be written in lower case and may not contain special characters or emoji. If you already have a Prebid.js bid adapter, we encourage you to use the same name with the same bidder parameters. You may not name your adapter `all`, `context`, `data`, `general`, `prebid`, or `skadn` as those have special meaning in various contexts. Existing bid adapter names are [maintained here](https://github.com/prebid/prebid-server/blob/master/openrtb_ext/bidders.go#L37). -We ask that the first 6 letters of the name you choose be unique among the existing bid adapters. This consideration helps with generating targeting keys for use by some ad exchanges, such as Google Ad Manager. There's no need to manually check, as this constraint is enforced by the [`TestBidderUniquenessGatekeeping`](https://github.com/prebid/prebid-server/blob/master/openrtb_ext/bidders_test.go#L61) test. +We ask that the first 6 letters of the name you choose be unique among the existing bid adapters. This consideration helps with generating targeting keys for use by some ad exchanges, such as Google Ad Manager. There's no need to manually check, as this constraint is enforced by the [`TestBidderUniquenessGatekeeping`](https://github.com/prebid/prebid-server/blob/master/openrtb_ext/bidders_validate_test.go#L45) test. Throughout the rest of this document, substitute `{bidder}` with the name you've chosen. @@ -48,9 +48,9 @@ We are proud to run the Prebid Server project as a transparent and trustworthy h - Adapters must annotate the bid response with the proper media type, ideally based on the response from the bidding server. {: .alert.alert-warning :} -Failure to follow the rules will lead to delays in approving your adapter for inclusion in Prebid Server. If you'd like to discuss an exception to a rule, please make your request by [submitting a GitHub issue](https://github.com/prebid/prebid-server/issues/new). +Failure to follow the rules will lead to delays in approving your adapter. If you'd like to discuss an exception to a rule, please make your request by [submitting a GitHub issue](https://github.com/prebid/prebid-server/issues/new). -### Ongoing Support and Maintenance +### Support and Maintenance You are expected to provide support and maintenance for the code you contribute to Prebid Server as part of your bid adapter. We ask that you proactively update your adapter when your bidding server introduces new features or breaking changes. @@ -60,18 +60,18 @@ Please be attentive in reading and responding to emails and [GitHub issues](http ## Create Your Adapter -Prebid Server bid adapters consist of several components: bidder info, bidder parameters, adapter code, user sync code, registration with the core framework, and default configuration values. This chapter will guide you though each component. +Prebid Server bid adapters consist of several components: bidder info, bidder parameters, adapter code, registration with the core framework, and default configuration values. This document will guide you though each component. -Please refer to [existing bid adapters](https://github.com/prebid/prebid-server/tree/master/adapters) for working examples and practical guidance, but understand that our adapter interfaces and coding style evolve over time. Please refer to the examples in this document over differences you may find in an existing bid adapter. +Please refer to [existing bid adapters](https://github.com/prebid/prebid-server/tree/master/adapters) for working examples and practical guidance, but understand that our adapter interfaces and coding style evolve over time. The examples in this document have precedence over differences you may find in an existing bid adapter. Our project is written in the [Go programming language](https://golang.org/). We understand not everyone has prior experience writing Go code. Please try your best and we'll respectfully steer you in the right direction during the review process. {: .alert.alert-info :} -Please do not ignore errors from method calls made in your bid adapter code. Even if it's seemingly impossible for an error to occur, such as from `json.Marshal`, it's still possible under the high throughput multi-threaded nature of Prebid Server. +**Please do not ignore errors from method calls made in your bid adapter code.** Even if it's seemingly impossible for an error to occur, such as from `json.Marshal`, it's still possible under the high throughput multi-threaded nature of Prebid Server. ### Bidder Info -Let's begin with your adapter's bidder information YAML file. This file is required and contains your maintainer email address, your [GDPR Global Vendor List (GVL) id](https://iabeurope.eu/vendor-list-tcf-v2-0/), specifies the ad formats your adapter will accept, and allows you to opt-out of video impression tracking. +Let's begin with your adapter's bidder information YAML file. This file is required and contains your bid adapter's maintainer email address, [GDPR Global Vendor List (GVL) ID](https://iabeurope.eu/vendor-list-tcf-v2-0/), supported ad formats, user sync endpoints, and allows you to opt-out of video impression tracking. Create a file with the path `static/bidder-info/{bidder}.yaml` and begin with the following template: @@ -93,6 +93,10 @@ capabilities: - video - audio - native +userSync: + redirect: + url: https://foo.com/sync?gdpr={%raw%}{{.GDPR}}{%endraw%}&consent={%raw%}{{.GDPRConsent}}{%endraw%}&us_privacy={%raw%}{{.USPrivacy}}{%endraw%}&redirect={%raw%}{{.RedirectURL}}{%endraw%} + userMacro: $UID ``` Modify this template for your bid adapter: @@ -100,6 +104,7 @@ Modify this template for your bid adapter: - Change the `gvlVendorID` from the sample value of `42` to the id of your bidding server as registered with the [GDPR Global Vendor List (GVL)](https://iabeurope.eu/vendor-list-tcf-v2-0/), or remove this line entirely if your bidding server is not registered with IAB Europe. - Change the `modifyingVastXmlAllowed` value to `false` if you'd like to opt-out of [video impression tracking](https://github.com/prebid/prebid-server/issues/1015), or remove this line entirely if your adapter doesn't support VAST video ads. - Remove the `capabilities` (app/site) and `mediaTypes` (banner/video/audio/native) combinations which your adapter does not support. +- Follow the [User Sync Configuration](#user-sync-configuration) documentation below to configure the endpoints for your bid adapter, or remove the `userSync` section if not supported.
Example: Website with banner ads only. @@ -112,6 +117,10 @@ capabilities: site: mediaTypes: - banner +userSync: + redirect: + url: https://foo.com/sync?gdpr={%raw%}{{.GDPR}}{%endraw%}&consent={%raw%}{{.GDPRConsent}}{%endraw%}&us_privacy={%raw%}{{.USPrivacy}}{%endraw%}&redirect={%raw%}{{.RedirectURL}}{%endraw%} + userMacro: $UID ```
@@ -125,6 +134,10 @@ capabilities: site: mediaTypes: - banner +userSync: + redirect: + url: https://foo.com/sync?gdpr={%raw%}{{.GDPR}}{%endraw%}&consent={%raw%}{{.GDPRConsent}}{%endraw%}&us_privacy={%raw%}{{.USPrivacy}}{%endraw%}&redirect={%raw%}{{.RedirectURL}}{%endraw%} + userMacro: $UID ``` @@ -145,22 +158,72 @@ capabilities: mediaTypes: - banner - video +userSync: + redirect: + url: https://foo.com/sync?gdpr={%raw%}{{.GDPR}}{%endraw%}&consent={%raw%}{{.GDPRConsent}}{%endraw%}&us_privacy={%raw%}{{.USPrivacy}}{%endraw%}&redirect={%raw%}{{.RedirectURL}}{%endraw%} + userMacro: $UID ```

+#### User Sync Configuration + +Prebid Server offers a federated [user sync](https://docs.prebid.org/prebid-server/developers/pbs-cookie-sync.html) process to store user ids from multiple bidders in a single cookie under the host's domain. You may add support for your bid adapter by configuring iframe and/or redirect endpoints. + +The Bidder Info template above demonstrates configuration of a `redirect` user sync. The `url` points to an endpoint on your bidding server which will honor the privacy policies, replace the `userMacro` in the redirect url with the user's tracking id, and respond with an HTTP 302 redirect to that url. You may also specify an `iframe` endpoint which will return an HTML document to be rendered in an `iframe` on the user's device and use JavaScript to perform the redirect. You may omit the `{%raw%}{{.GDPR}}{%endraw%}`, `{%raw%}{{.GDPRConsent}}{%endraw%}`, and/or `{%raw%}{{.USPrivacy}}{%endraw%}` macros if they are not applicable to your legal situation. + +If both `iframe` and `redirect` endpoints are provided, you must specify a `default` field with a value of either `iframe` or `redirect`, based on your preference. + +```yaml +userSync: + default: iframe + iframe: + url: https://foo.com/iframe/sync?gdpr={%raw%}{{.GDPR}}{%endraw%}&consent={%raw%}{{.GDPRConsent}}{%endraw%}&us_privacy={%raw%}{{.USPrivacy}}{%endraw%}&redirect={%raw%}{{.RedirectURL}}{%endraw%} + userMacro: $UID + redirect: + url: https://foo.com/redirect/sync?gdpr={%raw%}{{.GDPR}}{%endraw%}&consent={%raw%}{{.GDPRConsent}}{%endraw%}&us_privacy={%raw%}{{.USPrivacy}}{%endraw%}&redirect={%raw%}{{.RedirectURL}}{%endraw%} + userMacro: $UID +``` + +If your bid adapter supports user sync and doesn't have a good default, you may optionally specify a `supports` array with the items `iframe` and/or `redirect` to inform Prebid Server hosts. Hosts will receive a warning on startup if a bid adapter supports user sync and isn't configured. Expect hosts to contact you at the maintainer email address in this file for instructions. + +```yaml +userSync: + # foo supports user syncing, but requires configuration by the host. contact this + # bidder directly at the email address in this file to ask about enabling user sync. + supports: + - iframe + - redirect +``` + +Each user sync is assigned a case-sensitive `key`, defaulting to your bidder name. You may use a different `key` value, but we discourage doing so except for when multiple bidders share the same bidding server. You might encounter this use case for built-in aliases or for multiple bidders implementing different protocols for the same bidding server. Only one bid adapter may specify endpoints when using a shared key, or Prebid Server will fail to startup due to the ambiguity. + +```yaml +foo.yaml +-------- +userSync: + redirect: + url: https://foo.com/sync?gdpr={%raw%}{{.GDPR}}{%endraw%}&consent={%raw%}{{.GDPRConsent}}{%endraw%}&us_privacy={%raw%}{{.USPrivacy}}{%endraw%}&redirect={%raw%}{{.RedirectURL}}{%endraw%} + userMacro: $UID + +bar.yaml +-------- +userSync: + key: foo +``` + ### Bidder Parameters -Your bid adapter might require extra information from the publisher to form a request to your bidding server. The bidder parameters JSON Schema codifies this information to allow Prebid Server to verify requests and to provide an API for third party configuration systems. +Your bid adapter might require extra information from the publisher to form a request to your bidding server. The bidder parameters JSON Schema codifies this information to allow Prebid Server to verify requests and to provide an API for configuration systems. Publishers will provide extra information using an OpenRTB 2.5 Bid Request Extension, preferably at `request.imp[].ext.prebid.bidder.{bidder}` but also supported at `request.imp[].ext.{bidder}`. Prebid Server will validate the publisher information based on your schema and relocate the data to `request.imp[].ext.bidder`, regardless of your bidder name or the publisher's chosen location. -We request that you do not duplicate information that is already present in the [OpenRTB 2.5 Bid Request specification](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf#page=13) or is already part of an established Prebid convention. For example, your bidder parameters should not include first party data, bid floors, schain, video parameters, referrer information, or privacy consent including COPPA, CCPA, and GDPR TCF. For video parameters in particular, you must prefer the OpenRTB 2.5 Bid Request standard of `request.imp[].video`. +We request you do not duplicate information already present in the [OpenRTB 2.5 Bid Request specification](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf#page=13) or already part of an established Prebid convention. For example, your bidder parameters should not include first party data, bid floors, schain, video parameters, referrer information, or privacy consent including COPPA, CCPA, and GDPR TCF. For video parameters in particular, you must prefer the OpenRTB 2.5 Bid Request standard of `request.imp[].video`. {: .alert.alert-warning :} -**ENDPOINT NOTE:** You may not use an endpoint domain as a bidder parameter. Prebid Server is not an open proxy. If absolutely necessary, you may specify a portion of the domain as a parameter to support geo regions or account specific servers. However, this is discouraged and may degrade the performance of your adapter since the server needs to maintain more outgoing connections. Host companies may choose to disable your adapter if it uses a dynamically configured domain. +You may not use an endpoint domain as a bidder parameter. Prebid Server is not an open proxy. If absolutely necessary, you may specify a portion of the domain as a parameter to support geo regions or account specific servers. However, this is discouraged and may degrade the performance of your adapter since the server needs to maintain more outgoing connections. Host companies may choose to disable your adapter if it uses a dynamically configured domain. -Create a file with the path `static/bidder-params/{bidder}.json` using [JSON Schema](https://spacetelescope.github.io/understanding-json-schema/) to define your bidder parameters. Prebid Server requires this file for every adapter, even if yours doesn't require bidder parameters (see the 'no parameters' example at the end of this section). +Create a file with the path `static/bidder-params/{bidder}.json` and use [JSON Schema](https://spacetelescope.github.io/understanding-json-schema/) to define your bidder parameters. Prebid Server requires this file for every adapter, even if yours doesn't require bidder parameters (see the 'no parameters' example at the end of this section). Let's start with this example which defines one required `placementId` string parameter: @@ -183,7 +246,9 @@ Let's start with this example which defines one required `placementId` string pa ``` We encourage you to utilize the full features of [JSON Schema](https://spacetelescope.github.io/understanding-json-schema/) to narrowly define your bidder parameter data types. If you copy and paste these examples, please remember to change the `title` and `description` to refer to your bidder name instead of our fictional Foo example. -When choosing your parameter names, please consider aligning with the OpenRTB 2.5 standard by using lower case letters without camel casing or special characters. +When choosing your parameter names, please consider aligning with the OpenRTB 2.5 standard by using lower case letters without camel casing or special characters. + +Properties in [JSON Schema](https://spacetelescope.github.io/understanding-json-schema/) are case sensitive. If you choose to specify multiple properties differing only by case for compatibility, we ask that you include the word 'preferred' in one of the descriptions to give a hint to third party configuration systems. In addition to the examples listed below, please refer to [existing bidder parameter files](https://github.com/prebid/prebid-server/tree/master/static/bidder-params) for guidance. @@ -234,7 +299,7 @@ In addition to the examples listed below, please refer to [existing bidder param "title": "Foo Adapter Params", "description": "A schema which validates params accepted by the Foo adapter", "type": "object", - + "properties": { "token": { "type": "string", @@ -280,18 +345,47 @@ In addition to the examples listed below, please refer to [existing bidder param } ``` + +
+ Example: Multiple properties differing only by case. + +```json +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Foo Adapter Params", + "description": "A schema which validates params accepted by the Foo adapter", + "type": "object", + + "properties": { + "partnerid": { + "type": "string", + "description": "Partner ID, preferred." + }, + "partnerID": { + "secret": "string", + "description": "Partner ID" + } + }, + + "oneOf": [ + { "required": ["partnerid"] }, + { "required": ["partnerID"] } + ] +} +``` +

### Bidder Parameters Code {: .alert.alert-info :} -You can skip this step if your adapter has no bidder parameters. +You can skip this section if your adapter has no bidder parameters. -If you've defined bidder parameters for your adapter, you also need to represent your bidder parameters in code. The core framework uses the JSON Schema file for validation, but your adapter code needs a data structure to support JSON unmarshalling / deserialization. These data structures are organized in a shared path using a standard naming convention, which also serves as documentation of all adapter parameters. +If you defined bidder parameters for your adapter, you also need to represent your bidder parameters in code. The core framework uses the JSON Schema file for validation, but your adapter code needs a data structure to support JSON unmarshalling / deserialization. These data structures are organized in a shared path using a standard naming convention, which also serves as documentation of all adapter parameters. Create a file with the path `openrtb_ext/imp_{bidder}.go` containing an exported (must start with an upper case letter) data structure named `ImpExt{Bidder}`. All required and optional bidder parameters from the JSON Schema should be represented as fields. -For example, this is what the bidder parameter code looks like for the example we used in the previous section: +For example, this is what the bidder parameter code looks like for the Foo example we used in the previous section: ```go package openrtb_ext @@ -301,7 +395,7 @@ type ImpExtFoo struct { } ``` -Please follow [Go's standard naming convention](https://golang.org/doc/effective_go.html) for the field names (particularly for acronyms) and use `` `json:...` `` attributes to specify the JSON name, matching exactly what you defined in the bidder parameters JSON Schema. Please keep in mind that JSON is case sensitive. +Please follow [Go's standard naming convention](https://golang.org/doc/effective_go.html) for the field names (particularly for acronyms) and use `` `json:...` `` attributes to specify the JSON name, matching exactly what you defined in the bidder parameters JSON Schema. ### Adapter Code @@ -326,7 +420,7 @@ import ( "fmt" "net/http" - "github.com/mxmCherry/openrtb" + "github.com/mxmCherry/openrtb/v15/openrtb2" "github.com/prebid/prebid-server/adapters" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/errortypes" @@ -345,7 +439,7 @@ func Builder(bidderName openrtb_ext.BidderName, config config.Adapter) (adapters return bidder, nil } -func (a *adapter) MakeRequests(request *openrtb.BidRequest, requestInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { +func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { requestJSON, err := json.Marshal(request) if err != nil { return nil, []error{err} @@ -356,15 +450,15 @@ func (a *adapter) MakeRequests(request *openrtb.BidRequest, requestInfo *adapter Uri: a.endpoint, Body: requestJSON, } - + return []*adapters.RequestData{requestData}, nil } -func (a *adapter) MakeBids(request *openrtb.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) { +func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) { if responseData.StatusCode == http.StatusNoContent { return nil, nil } - + if responseData.StatusCode == http.StatusBadRequest { err := &errortypes.BadInput{ Message: "Unexpected status code: 400. Bad request from publisher. Run with request.debug = 1 for more info.", @@ -379,18 +473,17 @@ func (a *adapter) MakeBids(request *openrtb.BidRequest, requestData *adapters.Re return nil, []error{err} } - var response openrtb.BidResponse + var response openrtb2.BidResponse if err := json.Unmarshal(responseData.Body, &response); err != nil { return nil, []error{err} } - + bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp)) bidResponse.Currency = response.Cur for _, seatBid := range response.SeatBid { - for _, bid := range seatBid.Bid { - bid := bid // pin https://github.com/kyoh86/scopelint#whats-this + for i, bid := range seatBid.Bid { b := &adapters.TypedBid{ - Bid: &bid, + Bid: &seatBid.Bid[i], BidType: getMediaTypeForBid(bid), } bidResponse.Bids = append(bidResponse.Bids, b) @@ -409,16 +502,16 @@ The first argument, `bidderName`, is the name of the bidder being built. This ma The second argument, `config`, is all the configuration values set for your adapter. However, not all of this information is intended for use by the `Builder` method. The only two fields relevant here are `config.Endpoint` and `config.ExtraAdapterInfo`: - `config.Endpoint` is the base url of your bidding server and may be interpreted as either a literal address or as a templated macro to support dynamic domains or dynamic paths. -- `config.ExtraAdapterInfo` may be used for any other values your adapter may need, such as an application token or publisher allow/deny list. You may interpret this string however you like, although JSON is a common choice. +- `config.ExtraAdapterInfo` is an optional setting may be used for any other values your adapter may need, such as an application token or publisher allow/deny list. You may interpret this string however you like, although JSON is a common choice. -The `Builder` method is expected to return an error if either the `config.Endpoint` or the `config.ExtraAdapterInfo` values are invalid or cannot be parsed. Errors will be surfaced to the host during application startup as a fatal error. +The `Builder` method is expected to return an error if either the `config.Endpoint` or the `config.ExtraAdapterInfo` values are invalid or cannot be parsed. Errors will be surfaced to the host during application startup as a fatal error.
Example: Builder using endpoint macros. ```go type adapter struct { - endpointTemplate template.Template + endpointTemplate *template.Template } // Builder builds a new instance of the Foo adapter for the given bidder with the given config. @@ -427,9 +520,9 @@ func Builder(bidderName openrtb_ext.BidderName, config config.Adapter) (adapters if err != nil { return nil, fmt.Errorf("unable to parse endpoint url template: %v", err) } - + bidder := &adapter{ - endpointTemplate: *template, + endpointTemplate: template, } return bidder, nil } @@ -450,7 +543,7 @@ func Builder(bidderName openrtb_ext.BidderName, config config.Adapter) (adapters if err != nil { return nil, err } - + bidder := &adapter{ endpoint: config.Endpoint, token: info.token, @@ -484,9 +577,9 @@ func buildDefaultExtraInfo() extraInfo { The `MakeRequests` method is responsible for returning none, one, or many HTTP requests to be sent to your bidding server. Bid adapters are forbidden from directly initiating any form of network communication and must entirely rely upon the core framework. This allows the core framework to optimize outgoing connections using a managed pool and record networking metrics. The return type `adapters.RequestData` allows your adapter to specify the HTTP method, url, body, and headers. -This method is called once by the core framework for bid requests which have at least one valid Impression for your adapter. Impressions not configured for your adapter will be removed and are not accessible. +This method is called once by the core framework for bid requests which have at least one valid Impression for your adapter. Impressions not configured for your adapter are not accessible. -The first argument, `request`, is the OpenRTB 2.5 Bid Request object. Extension information is stored as `json.RawMessage` byte arrays and must be unmarshalled and/or marshalled to be read and/or mutated. It is *critical* to understand that the `request` object contains pointers to shared memory. If your adapter needs to alter any data referenced by a pointer then you *must* first make a shallow copy. The only exception is for `request.Imp` and its elements, as these are already shallow copies. The exact same instance of the `request` object is also passed to the `MakeBids` method, so please be careful when mutating. It's safe to assume that `request.Imp[]` always contains at least one element and that the `request.Imp[].ext.bidder` was successfully validated by your bidder parameter JSON Schema. +The first argument, `request`, is the OpenRTB 2.5 Bid Request object. Extension information is stored as `json.RawMessage` byte arrays and must be unmarshalled and/or marshalled to be read and/or mutated. It is *critical* to understand that the `request` object contains pointers to shared memory. If your adapter needs to alter any data referenced by a pointer then you *must* first make a shallow copy. The only exception is for `request.Imp` and its elements, as these are already shallow copies. The exact same instance of the `request` object is also passed to the `MakeBids` method, so please be careful when mutating. It's safe to assume that `request.Imp[]` always contains at least one element and that the `request.Imp[].ext.bidder` was successfully validated per your bidder parameter JSON Schema.
Example: Mutating banner shared memory (make a copy). @@ -506,36 +599,35 @@ if request.Imp[i].W == nil && request.Imp[i].H == nil && len(request.Imp[i].Form The second argument, `requestInfo`, is for extra information and helper methods provided by the core framework. This includes: -- `requestInfo.PbsEntryPoint` to access the entry point of the bid request, commonly used to determine if the request is for AMP or for a Long Form Video Ad Pod. -- `requestInfo.GlobalPrivacyControlHeader` to read the value of the Sec-GPC Global Privacy Control (GPC) header of the bid request. +- `requestInfo.PbsEntryPoint` to access the entry point of the bid request, commonly used to determine if the request is for AMP or for a [Long Form Video Ad Pod](/dev-docs/modules/adpod.html). +- `requestInfo.GlobalPrivacyControlHeader` to read the value of the `Sec-GPC` Global Privacy Control (GPC) header of the bid request. - `requestInfo.ConvertCurrency` a method to perform currency conversions. -The `MakeRequests` method is expected to return a slice (similar to a C# `List` or a Java `ArrayList`) of `adapters.RequestData` objects representing the HTTP calls to be sent to your bidding server and a slice of type `error` for any issues encountered creating them. If there are no HTTP calls or if there are no errors, please return `nil` for both return values. Neither slices may contain `nil` elements. +The `MakeRequests` method is expected to return a slice (similar to a C# `List` or a Java `ArrayList`) of `adapters.RequestData` objects representing the HTTP calls to be sent to your bidding server and a slice of type `error` for any issues encountered creating them. If there are no HTTP calls or if there are no errors, please return `nil` for both return values. Please do not add `nil` items in the slices. {: .alert.alert-info :} HTTP calls to your bidding server will automatically prefer GZIP compression. You should not specify it yourself using headers. You don't have to worry about decompressing the response in `MakeBids` either, as that will be taken care of automatically. -An Impression may define multiple sizes and/or multiple ad formats. If your bidding server limits requests to a single ad placement, size, or format, then your adapter will need to split the Impression into multiple calls and merge the responses. +##### Impression Splitting -
- Example: Impression splitting. +An Impression may define multiple sizes and/or multiple ad formats. If your bidding server limits requests to a single ad placement, size, or format, then your adapter will need to split the Impression into multiple calls and merge the responses. ```go -func (a *adapter) MakeRequests(request *openrtb.BidRequest, requestInfo *adapters.ExtraRequestInfo) (*adapters.RequestData, []error) { +func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapters.ExtraRequestInfo) (*adapters.RequestData, []error) { var requests []*adapters.RequestData var errors []error - + requestCopy := *request for _, imp := range request.Imp { - requestCopy.Imp = []openrtb.Imp{imp} + requestCopy.Imp = []openrtb2.Imp{imp} requestJSON, err := json.Marshal(request) if err != nil { errors = append(errors, err) continue } - + requestData := &adapters.RequestData{ Method: "POST", Uri: a.endpoint, @@ -546,10 +638,12 @@ func (a *adapter) MakeRequests(request *openrtb.BidRequest, requestInfo *adapter return requests, errors } ``` -
-

-If your bidding server supports multiple currencies, please be sure to pass through the `request.cur` field. If your bidding server only bids in a single currency, such as USD or EUR, that's fine. Prebid Server will convert your bid to the request currency if you include it in the bid response, otherwise we assume USD and conversion will not occur. +##### Currency + +If your bidding server supports multiple currencies, please pass through the `request.cur` field. If your bidding server only bids in a single currency, such as USD or EUR, that's fine. Prebid Server will convert your bid to the request currency if you include it in the bid response, otherwise we assume USD and conversion will not occur. + +Please ensure you forward the bid floor (`request.imp[].bidfloor`) and bid floor currency (`request.imp[].bidfloorcur`) values to your bidding server for enforcement. You can use of the `requestInfo.ConvertCurrency` helper method for currency conversions if your endpoint only supports floors in a specific currency. Please ensure you forward the bid floor (`request.imp[].bidfloor`) and bid floor currency (`request.imp[].bidfloorcur`) values to your bidding server for enforcement. You have access to the currency conversion helper method `ConvertCurrency` in case your endpoint only supports floors in a single currency. @@ -558,9 +652,8 @@ Please ensure you forward the bid floor (`request.imp[].bidfloor`) and bid floor ```go func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapters.ExtraRequestInfo) (*adapters.RequestData, []error) { - - for _, imp := range request.Imp { + for _, imp := range request.Imp { // Check if imp comes with bid floor amount defined in a foreign currency if imp.BidFloor > 0 && imp.BidFloorCur != "" && strings.ToUpper(imp.BidFloorCur) != "USD" { @@ -571,8 +664,7 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapte } // Update after conversion. All imp elements inside request.Imp are shallow copies - // therefore, their non-pointer values are not shared memory and are safe to modify - // without risking a data race condition + // therefore, their non-pointer values are not shared memory and are safe to modify. imp.BidFloorCur = "USD" imp.BidFloor = convertedValue } @@ -588,13 +680,15 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapte Uri: a.endpoint, Body: requestJSON, } - + return []*adapters.RequestData{requestData}, nil } ```

+##### Common Data + There are a several values of a bid that publishers expect to be populated. Some are defined by the OpenRTB 2.5 specification and some are defined by Prebid conventions. {: .table .table-bordered .table-striped } @@ -607,7 +701,7 @@ There are a several values of a bid that publishers expect to be populated. Some | [Request-Defined currency conversion rates](https://docs.prebid.org/prebid-server/features/pbs-currency.html) | Prebid | `request.ext.prebid.currency`
The publisher decides to prioritize its own custom currency conversion rates over Prebid Server's currency conversion rates. If a currency rate is not found in `request.ext.prebid.currency`, Prebid Server's rates will be used unless `usepbsrates` is set to `false`. If missing, `usepbsrates` defaults to true. | [First Party Data (FPD)](https://docs.prebid.org/prebid-server/features/pbs-fpd.html)| Prebid | `request.imp[].ext.context.data.*`, `request.app.ext.data.*`, `request.site.ext.data.*`, `request.user.ext.data.*`
The publisher may provide first party data (e.g. keywords). | GDPR | OpenRTB | `request.regs.ext.gdpr`, `request.user.ext.consent`
The publisher is specifying the European General Data Protection Regulation flag and TCF consent string. -| Site or App | OpenRTB | `request.site`, `request.app`
The publisher will provide either the site or app, but not both, representing the client's device. +| Site or App | OpenRTB | `request.site`, `request.app`
The publisher will provide either the site or app, but not both, representing the client's device. | Supply Chain | OpenRTB | `request.source.ext.schain`
The publisher's declaration of all parties who are selling or reselling the bid request. | Test | OpenRTB | `request.test`
The publisher is sending non-production traffic which also enables verbose debugging information from Prebid Server. | Video | OpenRTB | `request.imp[].video`
The publisher is specifying video ad requirements or preferences. @@ -619,18 +713,20 @@ For simplicity, adapters are expected to make net-price bids (e.g. "If this ad w The `MakeBids` method is responsible for parsing the bidding server's response and mapping it to the [OpenRTB 2.5 Bid Response object model](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf#page=32). -This method is called for each response received from your bidding server within the bidding window (`request.tmax`). If there are no requests or if all requests time out, the `MakeBids` method will not be called. +This method is called for each response received from your bidding server within the bidding time window (`request.tmax`). If there are no requests or if all requests time out, the `MakeBids` method will not be called. -{: .alert.alert-info :} +{: .alert.alert-warning :} It's *imperative* to include all required information in the response for your bid to be accepted. Please avoid common mistakes, such as not specifying the bid currency and not properly detecting the media type from the bidding server response. The first argument, `request`, is the exact same OpenRTB 2.5 Bid Request object provided to (and potentially mutated by) the `MakeRequests` method. The information in the `request` may be useful when detecting the media type. The second argument, `requestData`, is the exact same `adapters.RequestData` object returned by the `MakeRequests` method. It's rare for adapters to make use of this information, but it's provided for potential edge cases. -The third argument, `responseData`, is the HTTP response received from your bidding server and contains the status code, body, and headers. If your bidding server replies with a GZIP encoded body, it will be automatically decompressed. +The third argument, `responseData`, is the HTTP response received from your bidding server and contains the status code, body, and headers. If your bidding server replies with a GZIP encoded body, it will be automatically decompressed. -The `MakeBids` method is expected to return an `adapters.BidderResponse` object with one or more bids mapped from your bidding server's response. This may be as simple as decorating an OpenRTB 2.5 Bid Response with a some Prebid Server metadata (such as the media type) or more complicated mapping logic depending on your server's response format. +The `MakeBids` method is expected to return an `adapters.BidderResponse` object with one or more bids mapped from your bidding server's response. This may be as simple as decorating an OpenRTB 2.5 Bid Response with some Prebid Server metadata (such as the media type) or more complicated mapping logic depending on your server's response format. + +##### Object Model Please review the entire [OpenRTB 2.5 Bid Response](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf#page=32) documentation to fully understand the response object model and expectations. We've summarized some common fields below. Data which is listed as required is enforced by the core framework and cannot be omitted. @@ -639,12 +735,12 @@ Please review the entire [OpenRTB 2.5 Bid Response](https://www.iab.com/wp-conte | - | - | - | `.Currency` | Required | [3-letter ISO 4217 code](https://www.iso.org/iso-4217-currency-codes.html) defining the currency of the bid. The Prebid Server default is USD. | `.Bids[].BidType` | Required | Prebid Server defined value identifying the media type as `banner`, `video`, `audio`, or `native`. Should be mapped from the bidding server response. -| `.Bids[].Bid.ADomain` | Optional | Advertiser domain for block list checking. -| `.Bids[].Bid.AdM` | Optional | Ad markup to serve if the bid wins. May be HTML, Native, or VAST/VMAP formats. You should resolve any AUCTION_PRICE macros. | `.Bids[].Bid.CrID` | Required | Unique id of the creative. | `.Bids[].Bid.ID` | Required | Bidder generated id to assist with logging and tracking. | `.Bids[].Bid.ImpID` | Required | ID of the corresponding bid request Impression. Prebid Server validates the id is actually found in the bid request. | `.Bids[].Bid.Price` | Required | Net price CPM of the bid, not gross price. Publishers can correct for gross price bids by setting Bid Adjustments to account for fees. We recommend the most granular price a bidder can provide. +| `.Bids[].Bid.ADomain` | Optional | Advertiser domain for block list checking. +| `.Bids[].Bid.AdM` | Optional | Ad markup to serve if the bid wins. May be HTML, Native, or VAST/VMAP formats. You should resolve any AUCTION_PRICE macros. | `.Bids[].Bid.W` | Optional | Width of the creative in pixels. | `.Bids[].Bid.H` | Optional | Height of the creative in pixels. | `.Bids[].Bid.Ext` | Optional | Embedded JSON containing Prebid metadata (see below) or custom information. @@ -652,19 +748,22 @@ Please review the entire [OpenRTB 2.5 Bid Response](https://www.iab.com/wp-conte {: .alert.alert-info :} We recommend resolving creative OpenRTB macros in your adapter. Otherwise, AUCTION_PRICE will eventually get resolved by the [Prebid Universal Creative](https://github.com/prebid/prebid-universal-creative), but by then the bid price will be in the ad server currency and quantized by the price granularity. -If you'd like to support Long Form Video Ad Pods, then you'll need to provide the followings information: +If you'd like to support [Long Form Video Ad Pods](/dev-docs/modules/adpod.html)s, then you'll need to provide the followings information: {: .table .table-bordered .table-striped } | BidderResponse Path | Description | - | - -| `.Bids[].BidVideo.PrimaryCategory` | Category for the bid. Should be able to be translated to the primary ad server format. -| `.Bids[].Bid.Cat` | Category for the bid. Should be able to be translated to the primary ad server format. +| `.Bids[].BidVideo.PrimaryCategory` | Category for the bid in the taxonomy used by the ad server. Will be passed through without translation. +| `.Bids[].Bid.Cat` | IAB category for the bid which may be translated to the taxonomy used by the ad server. | `.Bids[].BidVideo.Duration` | Length of the video in integer seconds. | `.Bids[].DealPriority` | Deal tier integer value. Defaults to 0. {: .alert.alert-info :} Either `.Bids[].BidVideo.PrimaryCategory` or `.Bids[].Bid.Cat` should be provided. -Prebid has historically struggled with sharing granular bid response data with publishers, analytics, and reporting systems. To address this, we've introduced a standard object model. We encourage adapters to provide as much information as possible in the bid response. + +##### Metadata + +Prebid has introduced a standard object model for sharing granular bid response data with publishers, analytics, and reporting systems. We encourage adapters to provide as much information as possible in the bid response. {: .alert.alert-danger :} Bid metadata will be *required* in Prebid.js 5.X+ release, specifically for bid.ADomain and MediaType. We recommend making sure your adapter sets these values or Prebid.js may throw out the bid. @@ -680,7 +779,7 @@ Bid metadata will be *required* in Prebid.js 5.X+ release, specifically for bid. | `.AdvertiserName` | Bidder-specific advertiser name. | `.BrandID` | Bidder-specific brand id for advertisers with multiple brands. | `.BrandName` | Bidder-specific brand name. -| `.DChain` | Demand Chain Object. +| `.DChain` | Demand chain object. | `.PrimaryCategoryID` | Primary IAB category id. | `.SecondaryCategoryIDs` | Secondary IAB category ids. | `.MediaType` | Either `banner`, `audio`, `video`, or `native`. This is used in the scenario where a bidder responds with a mediatype different than the stated type. e.g. native when the impression is for a banner. One use case is to help publishers determine whether the creative should be wrapped in a safeframe. @@ -691,82 +790,46 @@ Bid metadata will be *required* in Prebid.js 5.X+ release, specifically for bid. Example: Setting metadata. ```go -func (a *adapter) MakeBids(request *openrtb.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) { +func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) { ... for _, seatBid := range response.SeatBid { - for _, bid := range seatBid.Bid { - bid := bid // pin https://github.com/kyoh86/scopelint#whats-this + for i, bid := range seatBid.Bid { b := &adapters.TypedBid{ - Bid: &bid, + Bid: &seatBid.Bid[i], BidType: getMediaTypeForBid(bid), - } - - if meta, err := buildMeta(b); err != nil { - errs = append(errs, metaErr) - } else { - b.Bid.Ext = meta - bidResponse.Bids = append(bidResponse.Bids, b) + BidMeta: getBidMeta(bid), } } ... } -func buildMeta(bid *adapters.TypedBid) (json.RawMessage, error) { - metaExt := openrtb_ext.ExtBidPrebid { - Meta: &openrtb_ext.ExtBidPrebidMeta { - NetworkID: 1, - NetworkName: "Some Network Name", - AgencyID: 2, - AgencyName: "Some Agency Name", - AdvertiserID: 3, - AdvertiserName: "Some Advertiser Name", - DChain: json.RawMessage(`{Some Demand Chain JSON}`), - BrandID: 4, - BrandName: "Some Brand Name", - PrimaryCategoryID: "IAB-1", - SecondaryCategoryIDs: []string{"IAB-2", "IAB-3"}, - MediaType: b.BidType, - } +func getBidMeta(bid *adapters.TypedBid) *openrtb_ext.ExtBidPrebidMeta { + // Not all fields are required. This example includes all fields for + // demonstration purposes. + return &openrtb_ext.ExtBidPrebidMeta { + NetworkID: 1, + NetworkName: "Some Network Name", + AgencyID: 2, + AgencyName: "Some Agency Name", + AdvertiserID: 3, + AdvertiserName: "Some Advertiser Name", + AdvertiserDomains: []string{"Some Domain"}, + DemandSource: "Some Demand Source", + DChain: json.RawMessage(`{Some Demand Chain JSON}`), + BrandID: 4, + BrandName: "Some Brand Name", + PrimaryCategoryID: "IAB-1", + SecondaryCategoryIDs: []string{"IAB-2", "IAB-3"}, + MediaType: "banner", } - return json.Marshal(meta) } ```

-### Create A User Syncer (Optional) - -Prebid Server offers a federated [user sync solution](https://docs.prebid.org/prebid-server/developers/pbs-cookie-sync.html) to store user ids in a single cookie under the host's domain. You may add support with a relatively small amount of code if your bidding server supports this protocol. - -Create a file with the path `adatpers/{bidder}/usersync.go` using the following template: - -```go -package {bidder} - -import ( - "text/template" - - "github.com/prebid/prebid-server/adapters" - "github.com/prebid/prebid-server/usersync" -) - -func NewSyncer(template *template.Template) usersync.Usersyncer { - return adapters.NewSyncer("{bidder}", template, adapters.SyncTypeRedirect) -} -``` - -The heavy lifting is handled by the `adapters.NewSyncer` method. You just need to provide a few arguments: - -{: .table .table-bordered .table-striped } -| Argument | Description -| - | - -| `familyName` | Name used for storing your user sync id within the federated cookie. Please keep this the same as your bidder name. -| `urlTemplate` | Pass through the `template` argument. -| `syncType` | Type of user sync supported by your bidding server. The valid options are `SyncTypeRedirect` and `SyncTypeIframe`. - ### Register With The Core -Prebid Server does not use reflection or any other automagic technology to recognize your new bid adapter. You must manually register it with the core framework. +Prebid Server does not use reflection or any other automated technology to recognize your new bid adapter. You must manually register it with the core framework. {: .alert.alert-info :} You will need to add an `import` statement for your bid adapter package in these files. Modern code editors such as Visual Studio Code and JetBrain's GoLand will automatically do that for you. @@ -791,7 +854,7 @@ const ( func CoreBidderNames() []BidderName { return []BidderName{ ... - Bidder{Bidder}, + Bidder{Bidder}, ... } } @@ -809,20 +872,9 @@ func newAdapterBuilders() map[openrtb_ext.BidderName]adapters.Builder { } ``` -If you have a user syncer, edit the file `usersync/usersyncers/syncer.go` to include it in the syncer map. - -```go -func NewSyncerMap(cfg *config.Configuration) map[openrtb_ext.BidderName]usersync.Usersyncer { - syncers := make(map[openrtb_ext.BidderName]usersync.Usersyncer, len(cfg.Adapters)) - ... - insertIntoMap(cfg, syncers, openrtb_ext.Bidder{Bidder}, {bidder}.NewSyncer) - ... -} -``` - ### Set Adapter Defaults -Lastly, you need to provide default settings for your bid adapter. You can decide if you'd like your bid adapter to be enabled out of the box, and if so, you'll need to provide a default endpoint and default extra adapter info if applicable. If your bid adapter requires host specific information to function properly, such as a security token or host account, then it's best to leave the adapter disabled. +You need to provide default settings for your bid adapter. You can decide if you'd like your bid adapter to be enabled out of the box, and if so, you'll need to provide a default endpoint and default extra adapter info (if applicable). If your bid adapter requires host specific information to function properly, such as a security token or host account, then it's best to leave the adapter disabled. {: .alert.alert-warning :} **HOST SPECIFIC INFO:** The default endpoint must not be specific to any particular host, such as Xandr/AppNexus. We may ask you about suspicious looking ids during the review process. Please reach out to individual hosts if you need to set specialized configuration. @@ -835,7 +887,7 @@ Edit the file `config/config.go` to register your default endpoint within the `S func SetupViper(v *viper.Viper, filename string) { ... v.SetDefault("adapters.{bidder}.endpoint", "https://your.url/any/path") - v.SetDefault("adapters.{bidder}.extra_info", `{"your": "extra info"}`) + v.SetDefault("adapters.{bidder}.extra_info", `{"your": "extra info"}`) ... } ``` @@ -852,76 +904,9 @@ func SetupViper(v *viper.Viper, filename string) { } ``` -### Set User Syncer Defaults - -If you implemented a user syncer, you'll need to provide a default endpoint. Edit the file `config/config.go` to alphabetically register your user syncer in the `setDerivedDefaults` method: - -```go -func (cfg *Configuration) setDerivedDefaults() { - ... - setDefaultUsersync(cfg.Adapters, openrtb_ext.Bidder{Bidder}, "https://your.url/sync?r="+url.QueryEscape(externalURL)+"%2Fsetuid%3Fbidder%3D{bidder}%26gdpr%3D{%raw%}{{.GDPR}}%26gdpr_consent%3D{{.GDPRConsent}}{%endraw%}%26uid%3D%5BUUID%5D") - ... -} -``` - -If you don't have a good default, please add a comment instead. - -```go -func (cfg *Configuration) setDerivedDefaults() { - ... - // openrtb_ext.Bidder{Bidder} doesn't have a good default. - ... -} -``` - - -Yes, you're right. That url value is quite complicated. You can find further details in our [user sync documentation](https://docs.prebid.org/prebid-server/developers/pbs-cookie-sync.html). - -The user sync endpoint is composed of two main parts, the url of your user syncer and a redirect back to Prebid Server. The url of your user syncer is responsible for reading the user id from the client's cookie and redirecting to Prebid Server with a user id macro resolved. - -The url of your user syncer can make use of the following privacy policy macros which will be resolved by Prebid Server before sending the url to your server: -- `{%raw%}{{.USPrivacy}}{%endraw%}`: Client's CCPA consent string. -- `{%raw%}{{.GDPR}}{%endraw%}`: Client's GDPR TCF enforcement flag. -- `{%raw%}{{.GDPRConsent}}{%endraw%}`: Client's GDPR TCF consent string. - -
- Example: Bidding server url with no macros. - -```go -"https://your.url/sync?r=" -``` -
- -
- Example: Bidding server url with CCPA privacy consent. - -```go -"https://your.url/sync?usp={%raw%}{{.USPrivacy}}{%endraw%}&r=" -``` -
-

- -The redirect url for Prebid Server must follow this format: -``` -{host}/setuid?bidder={bidder}&gdpr={%raw%}{{.GDPR}}&gdpr_consent={{.GDPRConsent}}{%endraw%}&uid=[UUID] -``` - -{: .table .table-bordered .table-striped } -| Token | Description -| - | - -| `{host}` | Placeholder for the Prebid Server host url. In code, you would substitute it with `url.QueryEscape(externalURL)`. -| `{bidder}` | Placeholder for the name of your bid adapter. -| `[UUID]` | Macro defined by your user sync server which will be replaced with the user's id. - -The final value of the redirect url is encoded for safe use within a query string: - -``` -{host}%2Fsetuid%3Fbidder%3D{bidder}%26gdpr%3D{%raw%}{{.GDPR}}%26gdpr_consent%3D{{.GDPRConsent}}{%endraw%}%26uid%3D%5BUUID%5D -``` - ## Test Your Adapter -This chapter will guide you through the creation of automated unit tests to cover your bid adapter code, bidder parameters JSON Schema, and user sync code. We use GitHub Action Workflows to ensure the code you submit passes validation. You can run the same validation locally with this command: +This section will guide you through the creation of automated unit tests to cover your bid adapter code and bidder parameters JSON Schema. We use GitHub Action Workflows to ensure the code you submit passes validation. You can run the same validation locally with this command: ```bash ./validate.sh --nofmt --cov --race 10 @@ -940,7 +925,7 @@ package {bidder} import ( "testing" - + "github.com/prebid/prebid-server/adapters/adapterstest" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/openrtb_ext" @@ -949,11 +934,11 @@ import ( func TestJsonSamples(t *testing.T) { bidder, buildErr := Builder(openrtb_ext.Bidder{Bidder}, config.Adapter{ Endpoint: "http://whatever.url"}) - + if buildErr != nil { t.Fatalf("Builder returned unexpected error %v", buildErr) } - + adapterstest.RunJSONBidderTest(t, "{bidder}test", bidder) } ``` @@ -1008,7 +993,7 @@ The format of a JSON test is as follows: The `mockBidRequest`, `httpCalls`, and `expectedBidResponses` fields are required. The `expectedMakeRequestsErrors` and `expectedMakeBidsErrors` may be omitted if there are no expected errors. We provide a `literal` and `regex` mode for testing error values. We often use the `regex` mode to handle error messages produced by the core Go framework which changed between recent releases. -To make everyone's life easier, please use a JSON 'prettifier' to apply standard formatting to your test files. We recommend the use of Visual Studio Code's [Beautify](https://marketplace.visualstudio.com/items?itemName=HookyQR.beautify) extension. +Please use a JSON 'prettifier' to apply standard formatting to your test files. We recommend the use of Visual Studio Code's [Beautify](https://marketplace.visualstudio.com/items?itemName=HookyQR.beautify) extension. ### Builder Tests @@ -1020,7 +1005,7 @@ If your adapter supports template parsing, we recommend adding this failure test func TestEndpointTemplateMalformed(t *testing.T) { _, buildErr := Builder(openrtb_ext.Bidder{Bidder}, config.Adapter{ Endpoint: "{%raw%}{{Malformed}}{%endraw%}"}) - + assert.Error(t, buildErr) } ``` @@ -1033,7 +1018,7 @@ func TestBadConfig(t *testing.T) { Endpoint: `http://it.doesnt.matter/bid`, ExtraAdapterInfo: `{foo:42}`, }) - + assert.Error(t, buildErr) } @@ -1042,9 +1027,9 @@ func TestEmptyConfig(t *testing.T) { Endpoint: `http://it.doesnt.matter/bid`, ExtraAdapterInfo: ``, }) - + bidder{Bidder} := bidder.(*adapter) - + assert.NoError(t, buildErr) assert.Empty(t, bidder{Bidder}.extraInfo.SomeInfo) } @@ -1060,7 +1045,7 @@ package {bidder} import ( "encoding/json" "testing" - + "github.com/prebid/prebid-server/openrtb_ext" ) @@ -1069,7 +1054,7 @@ func TestValidParams(t *testing.T) { if err != nil { t.Fatalf("Failed to fetch the json schema. %v", err) } - + for _, p := range validParams { if err := validator.Validate(openrtb_ext.Bidder{Bidder}, json.RawMessage(p)); err != nil { t.Errorf("Schema rejected valid params: %s", p) @@ -1082,7 +1067,7 @@ func TestInvalidParams(t *testing.T) { if err != nil { t.Fatalf("Failed to fetch the json schema. %v", err) } - + for _, p := range invalidParams { if err := validator.Validate(openrtb_ext.Bidder{Bidder}, json.RawMessage(p)); err == nil { t.Errorf("Schema allowed invalid params: %s", p) @@ -1101,66 +1086,11 @@ var invalidParams = []string{ ``` Please include tests for required fields, optional fields, conditional fields such as `oneOf`, regex filters, and data type mismatches. For example, if the field is defined as a string please include one invalid case for the wrong data type such as an integer in this example. -You don't have to go crazy with combinatorials. We're looking for just enough test cases to build confidence. - -### User Syncer Tests - -{: .alert.alert-info :} -Please skip to the end of this section if your adapter doesn't define a user syncer. - -We ask that you include a user syncer test to verify the basic mechanics of macro substitution. The `syncURL` should be the same value used in the `setDefaultUsersync` call with the `url.QueryEscape(externalURL)` code replaced with a simple hardcoded value such as `"host"`. Please keep the privacy policy values simple, as we're only testing substitution. - -Create a file with the path `adapters/{bidder}/usersync_test.go` using the following template: - -```go -package {bidder} - -import ( - "testing" - "text/template" - - "github.com/prebid/prebid-server/privacy" - "github.com/prebid/prebid-server/privacy/ccpa" - "github.com/prebid/prebid-server/privacy/gdpr" - "github.com/stretchr/testify/assert" -) - -func TestSyncer(t *testing.T) { - syncURL := "" - syncURLTemplate := template.Must( - template.New("sync-template").Parse(syncURL), - ) - - syncer := NewSyncer(syncURLTemplate) - syncInfo, err := syncer.GetUsersyncInfo(privacy.Policies{ - GDPR: gdpr.Policy{ - Signal: "A", - Consent: "B", - }, - CCPA: ccpa.Policy{ - Consent: "C", - }, - }) - - assert.NoError(t, err) - assert.Equal(t, "", syncInfo.URL) - assert.Equal(t, "redirect", syncInfo.Type) -} -``` - -If you *DON'T* have a user syncer, edit the file `usersync/usersyncers/syncer_test.go` to exclude your bid adapter from user sync tests: - -```go -adaptersWithoutSyncers := map[openrtb_ext.BidderName]bool{ - ... - openrtb_ext.Bidder{Bidder}: true, - ... -} -``` +There is no need to provide a combinatorial for every edge case possibility. We're looking for just enough test cases to build confidence. ### Manual End To End Tests -We'll verify your adapter works correctly on a technical level during the code review, but you'll need to perform separate end-to-end testing: +We'll verify your adapter works correctly on a technical level during the code review, but you'll need to perform manual end-to-end testing: 1. Build the project and start your server: ```bash @@ -1204,13 +1134,15 @@ We'll verify your adapter works correctly on a technical level during the code r }' ``` -If your bid adapters defines a user syncer, please perform end-to-end testing of the user sync process: +### User Sync Testing + +If your bid adapter defines one or more user sync endpoints, you'll need to perform manual end-to-end testing of each endpoint using the following process: -1. [Save a User ID](https://docs.prebid.org/prebid-server/endpoints/pbs-endpoint-setuid.html) using the `familyName` of your user syncer. This is likely the same as your bidder name. +1. [Save a User ID](https://docs.prebid.org/prebid-server/endpoints/pbs-endpoint-setuid.html) using the `key` of your user sync endpoint. This should default to your bidder name and is case sensitive. 1. Run a test auction (see the curl example above) and verify in the debug response that the outgoing `request.ext.debug.httpcalls` calls includes the User ID you saved in step 1. -It may be a bit tricky to track down the root cause of user sync errors. If you get stuck, please [submit a GitHub issue](https://github.com/prebid/prebid-server/issues/new) and we'll provide guidance. +If you are having issues finding the root cause of user sync errors, please [submit a GitHub issue](https://github.com/prebid/prebid-server/issues/new) and we'll provide guidance. ## User Documentation @@ -1281,13 +1213,6 @@ Notes on the metadata fields: - `adapters/{bidder}/{bidder}_test.go` - `adapters/{bidder}/{bidder}test/exemplary/*.json` - `adapters/{bidder}/{bidder}test/supplemental/*.json` - - `adapters/{bidder}/{bidder}test/params/race/{mediaType}.json` -- User Syncer - If You Have One - - `adapters/{bidder}/usersync.go` - - `adapters/{bidder}/usersync_test.go` - - `usersync/usersyncers/syncer.go` -- User Syncer - If You Don't - - `usersync/usersyncers/syncer_test.go` - Register With The Core - `openrtb_ext/bidders.go` - `exchange/adapter_builders.go` @@ -1296,7 +1221,7 @@ Notes on the metadata fields: ## Contribute -Whew! You're almost done. Thank you for taking the time to develop a Prebid Server bid adapter. When you're ready, [contribute](https://github.com/prebid/prebid-server/blob/master/docs/developers/contributing.md) your new bid adapter by opening a PR to the [PBS-Go GitHub repository](https://github.com/prebid/prebid-server) with the name "New Adapter: {Bidder}". +Thank you for taking the time to develop a Prebid Server bid adapter. When you're ready, [contribute](https://github.com/prebid/prebid-server/blob/master/docs/developers/contributing.md) your new bid adapter by opening a PR to the [PBS-Go GitHub repository](https://github.com/prebid/prebid-server) with the name "New Adapter: {Bidder}". {: .alert.alert-warning :} You don't need to ask permission or open a GitHub issue before submitting an adapter. diff --git a/prebid-server/developers/pbs-cookie-sync.md b/prebid-server/developers/pbs-cookie-sync.md index 5469f89994..dc739375db 100644 --- a/prebid-server/developers/pbs-cookie-sync.md +++ b/prebid-server/developers/pbs-cookie-sync.md @@ -50,9 +50,9 @@ POST https://prebid-server.example.com/cookie_sync 3) When it receives the response, Prebid.js loops through each element of `bidder_status[]`, dropping a pixel for each `bidder_status[].usersync.url`. -4) The bidder-specific endpoints read the users's cookie for the bidder's domain and respond with a redirect back to Prebid Server's [`/setuid` endpoint](/prebid-server/endpoints/pbs-endpoint-setuid.html) +4) The bidder-specific endpoints read the users' cookie for the bidder's domain and respond with a redirect back to Prebid Server's [`/setuid` endpoint](/prebid-server/endpoints/pbs-endpoint-setuid.html) -5) When the browser receives this redirect, it contacts Prebid Server, which will once again check the privacy settings and will update the `uids` cookie if allowed. +5) When the browser receives this redirect, it contacts Prebid Server, which will once again check the privacy settings and if allowed, update the `uids` cookie. ### Setting the uids cookie from AMP @@ -60,7 +60,8 @@ Cookie sync for AMP works in a way quite similar to Prebid.js. 1) The Prebid Server hosting company places a modified version of the `load-cookie` script onto a CDN. This script is part of the [Prebid Universal Creative](https://github.com/prebid/prebid-universal-creative/blob/master/src/cookieSync.js) repo. -Note that the only two values currently valid for 'endpoint' are 'appnexus' and 'rubicon' -- other host companies should update their copy to include their endpoint. +{: .alert.alert-warning :} +The only two values currently valid for 'endpoint' are 'appnexus' and 'rubicon' -- other host companies should update their copy to include their endpoint. See [the AMP implementation guide](/dev-docs/show-prebid-ads-on-amp-pages.html#user-sync) for more information. @@ -76,21 +77,19 @@ See [the AMP implementation guide](/dev-docs/show-prebid-ads-on-amp-pages.html#u ``` -Note: if the publisher has an AMP Consent Management Platform, they should use `load-cookie-with-consent.html`. +{: .alert.alert-info :} +If the publisher has an AMP Consent Management Platform, they should use `load-cookie-with-consent.html`. 3) At runtime, the `load-cookie` script just calls the Prebid Server /cookie_sync endpoint. The rest works the same as described for Prebid.js above. ## Bidder Instructions for Building a Sync Endpoint -Building a sync endpoint is optional -- mobile-only bidders don't benefit from -ID syncing. But for browser-based bidding, ID syncing can help improve buyer bid rate. There are two main options a bidder can choose to support: +Building a sync endpoint is optional -- there is no benefit from ID syncing for mobile-only bidders. For browser-based bidding, ID syncing can help improve buyer bid rate. There are two main options a bidder can choose to support: - redirect: the client will drop an IMG tag into the page, then call the bidder's URL which needs to redirect to the Prebid Server /setuid endpoint. - iframe: the client will drop an IFRAME tag into the page, then call the bidder's URL which responds with HTML and Javascript that calls the Prebid Server /setuid endpoint at some point. -PBS-Java allows bidders to support both options. - Bidders must implement an endpoint under their domain which accepts an encoded URI for redirects. This URL should be able to accept privacy parameters: - gdpr: if 0, declares this request isn't in GDPR scope. If 1, declares it is in scope. Otherwise indeterminate. @@ -99,20 +98,24 @@ Bidders must implement an endpoint under their domain which accepts an encoded U The specific attributes can differ for your endpoint. For instance, you could choose to receive gdprConsent rather than gdpr_consent. -Here's an example that shows the privacy macros as coded into PBS-Go: +Here's an example that shows the privacy macros as configured in PBS-Go: ``` -GET some-bidder-domain.com/usersync-url?gdpr={%raw%}{{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}{%endraw%}&redirectUri=prebid-server.example.com%2Fsetuid%3Fbidder%3Dsomebidder%26uid%3DYOURMACRO +userSync: + redirect: + url: https://some-bidder-domain.com/usersync-url?gdpr={%raw%}{{.GDPR}}{%endraw%}&consent={%raw%}{{.GDPRConsent}}{%endraw%}&us_privacy={%raw%}{{.USPrivacy}}{%endraw%}&redirect={%raw%}{{.RedirectURL}}{%endraw%} + userMacro: YOURMACRO ``` + PBS-Java uses slightly different macros in the bidder config: ``` - usersync: - url: https://some-bidder-domain.com/usersync-url?gdpr={%raw%}{{gdpr}}&gdpr_consent={{gdpr_consent}}&us_privacy={{us_privacy}}{%endraw%}&redirectUri= - redirect-url: /setuid?bidder=acuityads&gdpr={{gdpr}}&gdpr_consent={{gdpr_consent}}&us_privacy={{us_privacy}}&uid=YOURMACRO +usersync: + url: https://some-bidder-domain.com/usersync-url?gdpr={%raw%}{{gdpr}}&gdpr_consent={{gdpr_consent}}&us_privacy={{us_privacy}}{%endraw%}&redirectUri= + redirect-url: /setuid?bidder=acuityads&gdpr={%raw%}{{gdpr}}{%endraw%}&gdpr_consent={%raw%}{{gdpr_consent}}{%endraw%}&us_privacy={%raw%}{{us_privacy}}{%endraw%}&uid=YOURMACRO ``` -In either case, the {%raw%}{{}}{%endraw%} macros are resolved by PBS. +In either case, the {%raw%}{{...}}{%endraw%} macros are resolved by PBS. -{: .alert.alert-info :} -Important: The "YOURMACRO" string here needs to be whatever your sync endpoint will recognize and resolve to the user's ID from your domain. Some examples of macros that bidders use: $UID, ${UID}, $$visitor_cookie$$, ${DI_USER_ID}, etc. Every bidder has their own value here. +{: .alert.alert-warning :} +The "YOURMACRO" string here needs to be whatever your sync endpoint will recognize and resolve to the user's ID from your domain. Some examples of macros that bidders use: $UID, ${UID}, $$visitor_cookie$$, ${DI_USER_ID}, etc. Every bidder has their own value here. Here's how this all comes together: diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md index 1f685b7eff..007d721f2b 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -211,10 +211,10 @@ It's also possible to define different bid adjustment factors by mediatype, whic "prebid": { "bidadjustmentfactors": { "bidderA": 0.9, - "bidderB": 0.8 + "bidderB": 0.8, "mediatypes": { "banner": { - "bidderA": 0.8, + "bidderA": 0.8 }, "video-outstream": { "bidderC": 0.9 @@ -222,7 +222,7 @@ It's also possible to define different bid adjustment factors by mediatype, whic "video": { "bidderB": 0.85 } - } + } } } } @@ -268,7 +268,8 @@ to set these params on the response at `response.seatbid[i].bid[j].ext.prebid.ta "precision": 2, "ranges": [{ "max": 20.00, - "increment": 0.10 // This is equivalent to the deprecated "pricegranularity": "medium" + "increment": 0.10 // This is equivalent to the deprecated + // "pricegranularity": "medium" }] }, "includewinners": true, // Optional param defaulting to false @@ -423,9 +424,9 @@ This prevents breaking API changes as new Bidders are added to the project. For example, if the Request defines an alias like this: ``` - "aliases": { - "appnexus": "rubicon" - } +"aliases": { + "appnexus": "rubicon" +} ``` then any `imp.ext.appnexus` params will actually go to the **rubicon** adapter. @@ -438,13 +439,16 @@ For environments that have turned on [GDPR enforcement](/prebid-server/features/ To do this, just set `ext.prebid.aliasgvlids` alongside ext.prebid.aliases: ``` -"ext": +"ext": { "prebid": { - "aliases": { "newAlias": "originalBidderCode" }, - "aliasgvlids": { "newAlias": 11111 } + "aliases": { + "newAlias": "originalBidderCode" + }, + "aliasgvlids": { + "newAlias": 11111 } } -}); +} ``` ##### Stored Requests @@ -526,12 +530,10 @@ Example: { "imp": [{ ... - "banner": { - ... - } + "banner": { ... }, "instl": 1, ... - }] + }], "device": { ... "h": 640, @@ -556,20 +558,20 @@ PBS with interstitial support will come preconfigured with a list of common ad s To set the desired 'ad server currency', use the standard OpenRTB `cur` attribute. Note that Prebid Server only looks at the first currency in the array. ``` - "cur": ["USD"] +"cur": ["USD"] ``` If you want or need to define currency conversion rates (e.g. for currencies that your Prebid Server doesn't support), -define ext.prebid.currency.rates. (Currently supported in PBS-Java only) +define ext.prebid.currency.rates. ``` "ext": { "prebid": { - "currency": { - "rates": { - "USD": { "UAH": 24.47, "ETB": 32.04 } - } - } + "currency": { + "rates": { + "USD": { "UAH": 24.47, "ETB": 32.04 } + } + } } } ``` @@ -585,9 +587,9 @@ Basic supply chains are passed to Prebid Server on `source.ext.schain` and passe Bidder-specific schains: ``` -ext.prebid.schains: [ - { bidders: ["bidderA"], schain: { SCHAIN OBJECT 1}}, - { bidders: ["*"], schain: { SCHAIN OBJECT 2}} +"ext.prebid.schains": [ + { "bidders": ["bidderA"], "schain": { SCHAIN OBJECT 1}}, + { "bidders": ["*"], "schain": { SCHAIN OBJECT 2}} ] ``` In this scenario, Prebid Server sends the first schain object to `bidderA` and the second schain object to everyone else. @@ -600,24 +602,23 @@ Prebid Server adapters can support the [Prebid.js User ID modules](/dev-docs/mod ``` { - "user": { - "ext": { - "eids": [{ - "source": "adserver.org", - "uids": [{ - "id": "111111111111", - "ext": { - "rtiPartner": "TDID" - } - }] - }, - { - "source": "pubcid.org", - "id":"11111111" - } - ] - } + "user": { + "ext": { + "eids": [{ + "source": "adserver.org", + "uids": [{ + "id": "111111111111", + "ext": { + "rtiPartner": "TDID" + } + }] + }, + { + "source": "pubcid.org", + "id":"11111111" + }] } + } } ``` @@ -627,17 +628,17 @@ Publishers can constrain which bidders receive which user.ext.eids entries. See ``` { - ext: { - prebid: { - data: { - eidpermissions: [ // prebid server will use this to filter user.ext.eids - {"source": "sharedid.org", "bidders": ["*"]}, // * is the default - {"source": "neustar.biz", "bidders": ["bidderB"]}, - {"source": "id5-sync.com", "bidders": ["bidderA","bidderC"]} - ] - } - } + "ext": { + "prebid": { + "data": { + "eidpermissions": [ // prebid server will use this to filter user.ext.eids + {"source": "sharedid.org", "bidders": ["*"]}, // * is the default + {"source": "neustar.biz", "bidders": ["bidderB"]}, + {"source": "id5-sync.com", "bidders": ["bidderA","bidderC"]} + ] + } } + } } ``` @@ -678,24 +679,34 @@ When a storedauctionresponse ID is specified: This request: ``` { - "test":1, - "tmax":500, + "test": 1, + "tmax": 500, "id": "test-auction-id", "app": { ... }, "ext": { - "prebid": { - "targeting": {}, - "cache": { "bids": {} } - } + "prebid": { + "targeting": {}, + "cache": { + "bids": {} + } + } }, "imp": [ { "id": "a", - "ext": { "prebid": { "storedauctionresponse": { "id": "1111111111" } } } + "ext": { + "prebid": { + "storedauctionresponse": { "id": "1111111111" } + } + } }, { "id": "b", - "ext": { "prebid": { "storedauctionresponse": { "id": "22222222222" } } } + "ext": { + "prebid": { + "storedauctionresponse": { "id": "22222222222" } + } + } } ] } @@ -704,16 +715,16 @@ This request: Will result in this response, assuming that the ids exist in the appropriate DB table read by Prebid Server: ``` { - "id": "test-auction-id", - "seatbid": [ - { - // BidderA bids from storedauctionresponse=1111111111 - // BidderA bids from storedauctionresponse=22222222 - }, - { - // BidderB bids from storedauctionresponse=1111111111 - // BidderB bids from storedauctionresponse=22222222 - } + "id": "test-auction-id", + "seatbid": [ + { + // BidderA bids from storedauctionresponse=1111111111 + // BidderA bids from storedauctionresponse=22222222 + }, + { + // BidderB bids from storedauctionresponse=1111111111 + // BidderB bids from storedauctionresponse=22222222 + } ] } ``` @@ -724,37 +735,37 @@ In contrast to what's outlined above, this approach lets some real auctions take ``` { - "test":1, - "tmax":500, + "test": 1, + "tmax": 500, "id": "test-auction-id", "app": { ... }, "ext": { - "prebid": { - "targeting": {}, - "cache": { "bids": {} } - } + "prebid": { + "targeting": {}, + "cache": { "bids": {} } + } }, "imp": [ { "id": "a", "ext": { - "prebid": { - "storedbidresponse": [ - { "bidder": "BidderA", "id": "333333" }, - { "bidder": "BidderB", "id": "444444" }, - ] - } + "prebid": { + "storedbidresponse": [ + { "bidder": "BidderA", "id": "333333" }, + { "bidder": "BidderB", "id": "444444" }, + ] + } } }, { "id": "b", "ext": { - "prebid": { - "storedbidresponse": [ - { "bidder": "BidderA", "id": "5555555" }, - { "bidder": "BidderB", "id": "6666666" }, - ] - } + "prebid": { + "storedbidresponse": [ + { "bidder": "BidderA", "id": "5555555" }, + { "bidder": "BidderB", "id": "6666666" }, + ] + } } } ] @@ -764,18 +775,18 @@ Could result in this response: ``` { - "id": "test-auction-id", - "seatbid": [ - { - "bid": [ - // contents of storedbidresponse=3333333 as parsed by bidderA adapter - // contents of storedbidresponse=5555555 as parsed by bidderA adapter - ] - }, - { - // contents of storedbidresponse=4444444 as parsed by bidderB adapter - // contents of storedbidresponse=6666666 as parsed by bidderB adapter - } + "id": "test-auction-id", + "seatbid": [ + { + "bid": [ + // contents of storedbidresponse=3333333 as parsed by bidderA adapter + // contents of storedbidresponse=5555555 as parsed by bidderA adapter + ] + }, + { + // contents of storedbidresponse=4444444 as parsed by bidderB adapter + // contents of storedbidresponse=6666666 as parsed by bidderB adapter + } ] } ``` @@ -793,49 +804,52 @@ It specifies where in the OpenRTB request non-standard attributes should be pass ``` { + "ext": { + "prebid": { + "data": { "bidders": [ "rubicon", "appnexus" ] } // these are the bidders allowed to see protected data + } + }, + "site": { + "keywords": "", + "search": "", "ext": { - "prebid": { - "data": { "bidders": [ "rubicon", "appnexus" ] } // these are the bidders allowed to see protected data - } - }, - "site": { - "keywords": "", - "search": "", - "ext": { - data: { GLOBAL SITE DATA } // only seen by bidders named in ext.prebid.data.bidders[] - } - }, - "user": { - "keywords": "", - "gender": "", - "yob": 1999, - "geo": {}, - "ext": { - data: { GLOBAL USER DATA } // only seen by bidders named in ext.prebid.data.bidders[] + "data": { GLOBAL SITE DATA } // only seen by bidders named in ext.prebid.data.bidders[] + } + }, + "user": { + "keywords": "", + "gender": "", + "yob": 1999, + "geo": {}, + "ext": { + "data": { GLOBAL USER DATA } // only seen by bidders named in ext.prebid.data.bidders[] + } + }, + "imp": [ + { + ... + "ext": { + "data": { + ADUNIT SPECFIC CONTEXT DATA // can be seen by all bidders } - }, - "imp": [ - ... - "ext": { - "data": { - ADUNIT SPECFIC CONTEXT DATA // can be seen by all bidders - } - } - ] + } + } + ] +} ``` Bidder-specific data can be defined with ext.prebid.bidderconfig: ``` -ext: { - prebid: { - bidderconfig: - bidders: ["bidderA", "bidderB"], - config: [ - ortb2: { - site: { ... }, - user: { ... } - } - ] +"ext": { + "prebid": { + "bidderconfig": { + "bidders": ["bidderA", "bidderB"] + }, + "config": { + "ortb2": { + "site": { ... }, + "user": { ... } + } } } } @@ -858,20 +872,21 @@ An OpenRTB extension, whether in the the original request or the [stored-request The OpenRTB field is `ext.prebid.adservertargeting`. Here's an example: ``` - ext.prebid.adservertargeting: [{ - "key": "hb_amp_ow", // the targeting key - "source": "bidrequest", // pull the value from the path specified in the bid request object - "value": "ext.prebid.amp.data.ow" // path to value in the bidrequest - },{ - "key": "hb_static_thing", - "source": "static", // just use the 'value' provided - "value": "my-static-value" - },{ - "key": "{{BIDDER}}_custom1", // {{BIDDER}} is a macro to be resolved - "source": "bidresponse", // pull the value from the path specified in the bid response object - "value": "seatbid.bid.ext.custom1" - } - }] +"ext.prebid.adservertargeting": [ + { + "key": "hb_amp_ow", // the targeting key + "source": "bidrequest", // pull the value from the path specified in the bid request object + "value": "ext.prebid.amp.data.ow" // path to value in the bidrequest + },{ + "key": "hb_static_thing", + "source": "static", // just use the 'value' provided + "value": "my-static-value" + },{ + "key": "{% raw %}{{BIDDER}}{% endraw %}_custom1", // {% raw %}{{BIDDER}}{% endraw %} is a macro to be resolved + "source": "bidresponse", // pull the value from the path specified in the bid response object + "value": "seatbid.bid.ext.custom1" + } +] ``` `ext.prebid.adservertargeting` is an array objects. Each object has the following format: @@ -884,30 +899,30 @@ The OpenRTB field is `ext.prebid.adservertargeting`. Here's an example: In order to pull AMP parameters out into targeting, Prebid Server places AMP query string parameters in ext.prebid.amp.data. e.g. ``` - "ext": { - "prebid": { - "amp": { - "data": { - "adc": "GA1.2.662776284.1602172186", - "curl": "https://example.com/index.html", - "debug": "1", - "pvid": "", // page view ID - "ms": "", // multi-size - "ow": "", // override-width - "oh": "", // override-height - "w": "300", - "h": "50", - "gdpr_consent": "", - "purl": "https://example.com/index.html", - "slot": "/11111/amp_test", - "timeout": "1000", - "targeting": "{\"site\":{\"attr\":\"val\"}}", - "tag_id": "amp-AMP_Test-300x250", - "account": "22222" - } - } - } +"ext": { + "prebid": { + "amp": { + "data": { + "adc": "GA1.2.662776284.1602172186", + "curl": "https://example.com/index.html", + "debug": "1", + "pvid": "", // page view ID + "ms": "", // multi-size + "ow": "", // override-width + "oh": "", // override-height + "w": "300", + "h": "50", + "gdpr_consent": "", + "purl": "https://example.com/index.html", + "slot": "/11111/amp_test", + "timeout": "1000", + "targeting": "{\"site\":{\"attr\":\"val\"}}", + "tag_id": "amp-AMP_Test-300x250", + "account": "22222" + } } + } +} ``` ##### EID Permissions (PBS-Go only) @@ -917,17 +932,17 @@ in user.ext.eids is allowed to be passed to which bid adapter. For example: ``` { - ext: { - prebid: { - data: { - eidpermissions: [ // prebid server will use this to filter user.ext.eids - {"source": "sharedid.org", "bidders": ["*"]}, // * is the default - {"source": "neustar.biz", "bidders": ["bidderB"]}, - {"source": "id5-sync.com", "bidders": ["bidderA","bidderC"]} - ] - } - } + "ext": { + "prebid": { + "data": { + "eidpermissions": [ // prebid server will use this to filter user.ext.eids + {"source": "sharedid.org", "bidders": ["*"]}, // * is the default + {"source": "neustar.biz", "bidders": ["bidderB"]}, + {"source": "id5-sync.com", "bidders": ["bidderA","bidderC"]} + ] + } } + } } ``` @@ -942,19 +957,19 @@ The Prebid extension to the OpenRTB protocol is `ext.prebid.multibid`. For examp ``` { - ext: { - prebid: { - multibid: [{ - bidder: "bidderA", - maxbids: 2, - targetbiddercodeprefix: "bidA" - },{ - bidder: "bidderB", - maxbids: 3, - targetbiddercodeprefix: "bidB" - },{ - bidders: ["bidderC", "bidderD"] - maxbids: 2 + "ext": { + "prebid": { + "multibid": [{ + "bidder": "bidderA", + "maxbids": 2, + "targetbiddercodeprefix": "bidA" + }, { + "bidder": "bidderB", + "maxbids": 3, + "targetbiddercodeprefix": "bidB" + }, { + "bidders": ["bidderC", "bidderD"], + "maxbids": 2 }] } } @@ -980,36 +995,36 @@ Prebid Server core does the following when it sees `ext.prebid.multibid`: Here's an example response: ``` { -seatbid: [{ - seat: "bidderA", - bid: [{ - id: "bid1", - impid: "imp1", - price: 1.04, - ext: { - prebid: { - targeting: { - hb_pb_bidderA: 1.00 - }, - targetbiddercode: "bidderA" + "seatbid": [{ + "seat": "bidderA", + "bid": [{ + "id": "bid1", + "impid": "imp1", + "price": 1.04, + "ext": { + "prebid": { + "targeting": { + "hb_pb_bidderA": 1.00 + }, + "targetbiddercode": "bidderA" } - } - ... - },{ - id: "bid2", - impid: "imp1", // same imp as above - price:0.8, - ext: { - prebid: { - targeting: { - hb_pb_bidA2: 0.50 - }, - targetbiddercode: "bidA2" + } + ... + }, { + "id": "bid2", + "impid": "imp1", // same imp as above + "price": 0.8, + "ext": { + "prebid": { + "targeting": { + "hb_pb_bidA2": 0.50 + }, + "targetbiddercode": "bidA2" } - } - ... + } + ... + }] }] -}] } ``` @@ -1022,24 +1037,25 @@ which causes PBS-core to place the video-related attributes on the response. ``` { - ... - - "imp": [ - { - "id": "123456789", - "video": { ... }, - "ext": { - "prebid": { - "storedrequest": { "id": "xxx" }, - "options": { - "echovideoattrs": true - } - } - }, - ... + ... + "imp": [{ + "id": "123456789", + "video": { + ... + }, + "ext": { + "prebid": { + "storedrequest": { + "id": "xxx" + }, + "options": { + "echovideoattrs": true } - ] + } + }, ... + }] + ... } ``` 1. Prebid Server receives this request and expands the `storedrequest` value, merging it with the imp object. @@ -1047,31 +1063,26 @@ which causes PBS-core to place the video-related attributes on the response. ``` { - "seatbid": [{ - "bid": [{ - ... - "ext": { - "prebid": { - "storedrequestattributes":{ - "maxduration": 60, - "mimes": [ - "video/mp4" - ], - "minduration": 15, - "protocols": [ - 1, - 2 - ], - "skipafter": 0, - "skipmin": 0, - "startdelay": 0, - "playbackmethod": [1] - } - } - } - }] - }], -... + "seatbid": [{ + "bid": [{ + ... + "ext": { + "prebid": { + "storedrequestattributes": { + "maxduration": 60, + "mimes": ["video/mp4"], + "minduration": 15, + "protocols": [1, 2], + "skipafter": 0, + "skipmin": 0, + "startdelay": 0, + "playbackmethod": [1] + } + } + } + }] + }], + ... } ``` @@ -1133,31 +1144,31 @@ Prebid Server will generate ad server targeting variables as defined by request ``` { -seatbid: [{ - seat: "bidderA", - bid: [{ - id: "bid1", - impid: "imp1", - price: 1.04, - ext: { - prebid: { - targeting: { - hb_pb: 1.00, // values without prefixes on the winning bids only - hb_pb_bidderA: 1.00, // only if includebidderkeys is true - hb_bidder: "bidderA", - hb_size: "300x250", - hb_size_bidderA: "300x250", - hb_format: "video" // only if includeformat is specified - hb_deal: "123" // only if bid response contains a deal - } + "seatbid": [{ + "seat": "bidderA", + "bid": [{ + "id": "bid1", + "impid": "imp1", + "price": 1.04, + "ext": { + "prebid": { + "targeting": { + "hb_pb": 1.00, // values without prefixes on the winning bids only + "hb_pb_bidderA": 1.00, // only if includebidderkeys is true + "hb_bidder": "bidderA", + "hb_size": "300x250", + "hb_size_bidderA": "300x250", + "hb_format": "video", // only if includeformat is specified + "hb_deal": "123" // only if bid response contains a deal + } } - } - ... + } + ... + }] }] -}] +} ``` - ##### Debug Output `response.ext.debug.httpcalls.{bidder}` will be populated only if `test:1` or `ext.prebid.debug:true`. @@ -1170,20 +1181,16 @@ It is only returned on `test` bids for performance reasons, but may be useful du This contains the request after the resolution of stored requests and implicit information (e.g. site domain, device user agent). ``` - "ext": { - "debug": { - "httpcalls": { - "bidderA": [ - ... - ] - }, - "resolvedrequest": { - ... - }, - "responsetimemillis": { - ... - } - ... +"ext": { + "debug": { + "httpcalls": { + "bidderA": [ ... ] + }, + "resolvedrequest": { ... }, + "responsetimemillis": { ... } + ... + } +} ``` ##### Original Bid CPM (PBS-Java only) @@ -1244,9 +1251,9 @@ The PBJS version comes from ext.prebid.channel: `{name: "pbjs", version: "4.39"} The Prebid SDK version comes from: ``` -app.ext.prebid: { - source: "prebid-mobile" - version: "1.2.3" +"app.ext.prebid": { + "source": "prebid-mobile" + "version": "1.2.3" } ``` diff --git a/prebid-server/endpoints/pbs-endpoint-event.md b/prebid-server/endpoints/pbs-endpoint-event.md index 0c354142a3..28a4f38b05 100644 --- a/prebid-server/endpoints/pbs-endpoint-event.md +++ b/prebid-server/endpoints/pbs-endpoint-event.md @@ -7,7 +7,7 @@ title: Prebid Server | Endpoints | Events # Prebid Server | Endpoints | Events (Java-only) -PBS-Java supports events as described in these GitHub issues: +Prebid Server supports events as described in these GitHub issues: - [Prebid Server Event Notification proposal](https://github.com/prebid/prebid-server/issues/800) - [Prebid Server Event Updates](https://github.com/prebid/prebid-server/issues/1202) diff --git a/prebid-server/endpoints/pbs-endpoint-overview.md b/prebid-server/endpoints/pbs-endpoint-overview.md index 502dcfe7b1..e6f0e6c739 100644 --- a/prebid-server/endpoints/pbs-endpoint-overview.md +++ b/prebid-server/endpoints/pbs-endpoint-overview.md @@ -22,8 +22,8 @@ The API endpoints recognized by Prebid Server: | [GET /getuids](/prebid-server/endpoints/pbs-endpoint-getuids.html) | Parses the `uids` cookie and returns JSON. | | [GET /status](/prebid-server/endpoints/pbs-endpoint-status.html) | A health check. | | [GET /info](/prebid-server/endpoints/info/pbs-endpoint-info.html) | Returns various information about how the server is configured. | -| [GET /event](/prebid-server/endpoints/pbs-endpoint-event.html) | (PBS-Java only) Alerts Prebid Server to process an event. | -| [POST /vtrack](/prebid-server/endpoints/pbs-endpoint-event.html) | (PBS-Java only) Cache VAST XML after inserting tracking string. | +| [GET /event](/prebid-server/endpoints/pbs-endpoint-event.html) | Alerts Prebid Server to process an event. | +| [POST /vtrack](/prebid-server/endpoints/pbs-endpoint-event.html) | Cache VAST XML after inserting tracking string. | | [/currency/rates](/prebid-server/endpoints/pbs-endpoint-admin.html) | (Admin port only) Retrieves the server's current currency conversion rates. | ## Prebid Cache diff --git a/prebid-server/endpoints/pbs-endpoint-setuid.md b/prebid-server/endpoints/pbs-endpoint-setuid.md index ea379418ac..eb47472dd5 100644 --- a/prebid-server/endpoints/pbs-endpoint-setuid.md +++ b/prebid-server/endpoints/pbs-endpoint-setuid.md @@ -16,7 +16,7 @@ This endpoint saves a UserID for a Bidder in the Cookie. Saved IDs will be recog ### Query Params -- `bidder`: The FamilyName of the Usersyncer (`../../usersync/usersync.go`) which is being synced. +- `bidder`: The key of the bidder which is being synced. This may not always match the bidder name,. - `uid`: The ID which the Bidder uses to recognize this user. If undefined, the UID for `bidder` will be deleted. - `gdpr`: This should be `1` if GDPR is in effect, `0` if not, and undefined if the caller isn't sure - `gdpr_consent`: This is required if `gdpr` is one, and optional (but encouraged) otherwise. If present, it should be an [unpadded base64-URL](https://tools.ietf.org/html/rfc4648#page-7) encoded [Vendor Consent String](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/Consent%20string%20and%20vendor%20list%20formats%20v1.1%20Final.md). @@ -38,16 +38,8 @@ If in doubt, contact the company hosting Prebid Server and ask if they're GDPR-r ### Return Values -PBS-Go: - -- HTTP 200 - - Success: blank body with Set-Cookies header - - Failure: error message in body - -PBS-Java: - - HTTP 400 - The request is in GDPR scope and the consent string is missing or invalid. -- HTTP 451 - PBS does not have permission to set a cookie due to GDPR or other privacy rule. +- HTTP 451 - PBS does not have permission to set a cookie due to GDPR or another privacy rule. - HTTP 200 - Success with image response: if the f=i parameter is specified or if the named bidder prefers redirect cookie_syncs, then PBS responds with a blank 1x1 PNG, set the Content-Length to the appropriate number of bytes, and set Content-Type to image/png - Success with empty response: if the f=b parameter is specified or if the named bidder prefers iframe cookie_syncs, then PBS responds with empty HTML, Content-Length 0 and Content-Type to text/html diff --git a/prebid-server/features/pbs-currency.md b/prebid-server/features/pbs-currency.md index 3fe503fe98..67cc607f0b 100644 --- a/prebid-server/features/pbs-currency.md +++ b/prebid-server/features/pbs-currency.md @@ -84,13 +84,13 @@ Rates can be passed in on the request: ``` "ext": { - "prebid": { - "currency": { - "rates": { - "USD": { "UAH": 24.47, "ETB": 32.04, "EUR": 0.92, ... } - }, - "usepbsrates": false // defaults to true - } + "prebid": { + "currency": { + "rates": { + "USD": { "UAH": 24.47, "ETB": 32.04, "EUR": 0.92, ... } + }, + "usepbsrates": false // defaults to true + } } } ``` diff --git a/prebid-server/features/pbs-feature-idx.md b/prebid-server/features/pbs-feature-idx.md index dec47eb023..7c36297221 100644 --- a/prebid-server/features/pbs-feature-idx.md +++ b/prebid-server/features/pbs-feature-idx.md @@ -11,8 +11,8 @@ title: Prebid Server | Features | Feature Set | Feature | Description | PBS-Go | PBS-Java | |-------------+---------+-------------+--------+----------| | [Currency](/prebid-server/features/pbs-currency.html) | Core | Loads currency conversions from an outside source, allows non-supported currencies to come in on the OpenRTB2 request, converts bid currencies to the request's prefered currency. | | | -| [Currency](/prebid-server/features/pbs-currency.html) | Request-Defined Rates | Allows the request to define its own currency rates. | | | -| Currency | pbsConvertCurrency method | Allows adapters to convert bid floors to a different currency if needed. | | | +| [Currency](/prebid-server/features/pbs-currency.html) | Request-Defined Rates | Allows the request to define its own currency rates. | | | +| Currency | Convert Currency Method | Allows adapters to convert bid floors to a different currency if needed. | | | | [Deals](/prebid-server/features/pbs-deals.html) | Core | Basic deal support, creating hb_deal targeting when appropriate. | | | | Deals | Deal prioritization | Supports the 'preferdeals' [targeting flag](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#targeting) to give deals the priority when PBS returns ad server targeting. | | | | [AMP](/prebid-server/use-cases/pbs-amp.html) | Core | Reads and responds to the /openrtb2/amp endpoint | | | @@ -49,25 +49,25 @@ title: Prebid Server | Features | [Supply Chain](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#supply-chain-support) | Bidder-specific schains | Accepts bidder-specific schain | | | | Supply Chain | Host SChain | The host company can supply a global schain that's appended to the list of incoming nodes in source.ext.schain. | | | | Publisher Accounts | Core | Ability to enforce that requests coming in have a valid account ID. | | | -| Publisher Accounts | AMP account parameter | Accept the account parameter on the AMP request. | | | +| Publisher Accounts | AMP account parameter | Accept the account parameter on the AMP request. | | | | Publisher Accounts | Account-specific TTLs | Allow each account ID to have a custom PBC time-to-live for banner and video. | | | | [Video](/formats/video.html) | Core | Support for basic instream and outstream video: passes video parameters to adapters, stores VAST responses when instructed. | | | | Video | Outstream renderers | Support for bidders specifying their own renderers for outstream video. | | | | Video | Long-form video | Support for the [long-form video endpoint](/prebid-server/endpoints/openrtb2/pbs-endpoint-video.html). | | | | Video | IAB advertiser category mapping | Able to map IAB advertiser categories to a supplied mapping table. | | | -| Video | [Echo video attributes](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#echo-storedrequest-video-attributes-pbs-java-only) | To support mobile video, copies stored request video attributes to the response. | | | +| Video | [Echo video attributes](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#echo-storedrequest-video-attributes-pbs-java-only) | To support mobile video, copies stored request video attributes to the response. | | | | [Interstitials](/prebid-server/features/pbs-interstitials.html) | Core | Support device.ext.prebid.interstitial.minwidthperc and device.ext.prebid.interstitial.minheightperc parameters, [dynamically updating the impression format object](https://github.com/prebid/prebid-server/issues/755) from a configurable list of sizes filtered by these parameters. | | | | [Aliases](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#bidder-aliases) | Core | Maps a biddercode on an incoming request to a specific server-side bid adapter named in the request or defined in config. | | | | Aliases | [GVL ID support](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#bidder-alias-gvl-ids-pbs-java-only) | Define the IAB GVL ID for an aliased biddercode. | | | | [User ID Sync](/prebid-server/developers/pbs-cookie-sync.html) | Core | Implements the /cookie_sync and /setuid endpoints. Bidders may choose either redirect or iframe method. | | | -| User ID Sync | Multi-Method | Bidders can supply both pixel redirects as well as iframe syncs. | | | -| User ID Sync | Cooperative sync | Does a pixel sync with more than just the bidders on the page. | | | +| User ID Sync | Multi-Method | Bidders can supply both pixel redirects as well as iframe syncs. | | | +| User ID Sync | Cooperative sync | Does a pixel sync with more than just the bidders on the page. | | | | User ID Permissions | Extended ID Permissions | Allows publishers to determine which bidders are allowed to receive which extended ID. | | | | User ID Sync | Account override | Allows accounts to override the cooperative sync feature and bidder limits. | | | | User ID | [EID Permissions](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#eid-permissions) | The Publisher can define which bidders receive which extended user IDs. | | | -| [Events](https://docs.google.com/document/d/1ry0X4C2EV-R0pMrm1IQk9BstxaT395UCl3KKqTGa5c8/edit#heading=h.7w5yevygp2gz) | Events | Ability to process the /event endpoint, place /event URLs in the OpenRTB response, and place /event URLs in VAST XML. | | | -| Events | Events vasttrack endpoint | Ability to process the /vasttrack endpoint initated by Prebid.js, placing /event URLs in VAST XML. | | | -| Events | Events BidID Generation | Some bidders don't generate unique enough BidIDs to join with auction events. This feature allows the host company to inject a PBS-generated BidID alongside the bidder-generated ID. | | | +| [Events](https://docs.google.com/document/d/1ry0X4C2EV-R0pMrm1IQk9BstxaT395UCl3KKqTGa5c8/edit#heading=h.7w5yevygp2gz) | Events | Ability to process the /event endpoint, place /event URLs in the OpenRTB response, and place /event URLs in VAST XML. | | | +| Events | Events vasttrack endpoint | Ability to process the /vasttrack endpoint initated by Prebid.js, placing /event URLs in VAST XML. | | | +| Events | Events BidID Generation | Some bidders don't generate unique enough BidIDs to join with auction events. This feature allows the host company to inject a PBS-generated BidID alongside the bidder-generated ID. | | | | Auction | [MultiBid](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#multibid-pbs-java-only) | Allow named bidders to supply more than one response. | | | | Analytics | Analytics module support | Allows developers to plug in a [custom analytics adapter](/developers/pbs-build-an-analytics-adapter.html). | | | | Bid Response Validation | Validate secure markup | PBS can configurably reject bid responses that don't supply a secure creative when in a secure context. | | | diff --git a/prebid-server/features/pbs-privacy.md b/prebid-server/features/pbs-privacy.md index bceda67ffe..bc83cc5a6c 100644 --- a/prebid-server/features/pbs-privacy.md +++ b/prebid-server/features/pbs-privacy.md @@ -58,7 +58,7 @@ There are a number of GDPR configuration settings that PBS Host Companies must consider: - **GDPR enabled** - Allows the host company to turn off GDPR support. Default setting is enabled=true. -- **Default GDPR applies** - How Prebid Server should respond if the incoming request doesn't have the `gdpr` flag. (Note: this config is currently called `usersync_if_ambiguous` in PBS-Go and gdpr.default-value in PBS-Java.) +- **Default GDPR applies** - How Prebid Server should respond if the incoming request doesn't have the `gdpr` flag. (Note: this config is currently called `gdpr.default_value` in PBS-Go and `gdpr.default-value` in PBS-Java.) - **Host company GVL ID** - Currently PBS requires the host company to have a GVL-ID or the setting of the `uids` cookie in GDPR scope will fail. - **GDPR enforcement flags** - for each Purpose - **Host Cookie TTL** - The default expiration time of the `uids` cookie set in the host company domain should be defined to match what's in the TCF 2.1 `maxCookieAgeSeconds` GVL field. (This is the host-cookie.ttl-days setting in both Go and Java.) diff --git a/prebid-server/hosting/pbs-database.md b/prebid-server/hosting/pbs-database.md index 4dfde3d158..08efe50163 100644 --- a/prebid-server/hosting/pbs-database.md +++ b/prebid-server/hosting/pbs-database.md @@ -99,7 +99,7 @@ create a view as desired. We'll fix this someday. Account data is queried on every request to pull in important data. There is an LRU cache in the server so the database isn't actually hit on every request. -In PBS-Java, many account-configuration options come from the database, while in PBS-Go, those options are available in YAML configuration. +In PBS-Java, many account-configuration options come from the database. In PBS-Go, those options are available in either a YAML configuration or from an HTTP API. In both versions the server can optionally validate the account against this database and reject accounts from unknown sources. @@ -108,7 +108,7 @@ The algorithm the server uses for determining the account ID of the incoming req 1. look in site.publisher.id 2. look in app.publisher.id -3. if AMP, look for the 'account' parameter on the query string (PBS-Java only) +3. if AMP, look for the 'account' parameter on the query string Here are the fields the server can recognize in the database response: diff --git a/prebid-server/hosting/pbs-hosting.md b/prebid-server/hosting/pbs-hosting.md index 96402bd87c..144fd0f196 100644 --- a/prebid-server/hosting/pbs-hosting.md +++ b/prebid-server/hosting/pbs-hosting.md @@ -68,7 +68,7 @@ populating data from their internal systems. You'll want to hook both Prebid Server and Prebid Cache up to an operational monitoring system. -- PBS-Go currently supports Influx and Promotheus +- PBS-Go currently supports Influx and Prometheus - PBS-Java currently supports Influx and Graphite ## Installing the Software diff --git a/prebid-server/versions/pbs-versions-go.md b/prebid-server/versions/pbs-versions-go.md index 9f6a45ea99..d2de934923 100644 --- a/prebid-server/versions/pbs-versions-go.md +++ b/prebid-server/versions/pbs-versions-go.md @@ -28,7 +28,7 @@ The Go version of Prebid Server is for those who: ## Features -PBS-Go has all the core PBS features, but does have a backlog of newer [features](/prebid-server/features/pbs-feature-idx.html), so you'll want to look over the list to be familiar with the differences. +We recommend you review the [feature comparison list](/prebid-server/features/pbs-feature-idx.html) to familiarize yourself with the differences between this and PBS-Java in deciding which version is right for you. ## Code Repositories diff --git a/prebid-server/versions/pbs-versions-java.md b/prebid-server/versions/pbs-versions-java.md index d024930727..7f68600244 100644 --- a/prebid-server/versions/pbs-versions-java.md +++ b/prebid-server/versions/pbs-versions-java.md @@ -27,7 +27,7 @@ The Java version of Prebid Server is for those who: ## Features -PBS-Java look over the [feature list](/prebid-server/features/pbs-feature-idx.html) to be familiar with the differences. +We recommend you review the [feature comparison list](/prebid-server/features/pbs-feature-idx.html) to familiarize yourself with the differences between this and PBS-Go in deciding which version is right for you. ## Code Repositories From b9a8e72f5f2a32cc3d7d4c3644ef00a5ad2d3090 Mon Sep 17 00:00:00 2001 From: Patrick McCann Date: Tue, 28 Sep 2021 17:16:53 -0400 Subject: [PATCH 32/71] Update firstPartyData.md with app.content.data example (#3299) * Update firstPartyData.md * Update firstPartyData.md * fixing indentation Co-authored-by: bretg --- features/firstPartyData.md | 50 +++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/features/firstPartyData.md b/features/firstPartyData.md index cceb41322d..1d8f94ca29 100644 --- a/features/firstPartyData.md +++ b/features/firstPartyData.md @@ -63,7 +63,7 @@ pbjs.setConfig({ userrating: "4", data: [{ name: "www.dataprovider1.com", - ext: { "segtax": 1 }, + ext: { segtax: 4 }, segment: [ { id: "687" }, { id: "123" } @@ -177,6 +177,54 @@ pbjs.setBidderConfig({ // different bidders can receive different data }); {% endhighlight %} +### Supplying App Content Data + +Occasionally, an app which embeds a webview might run Prebid.js. In this case, the app object is often specified for OpenRTB, and the site object would be invalid. When this happens, one should specify app.content.data in place of site.content.data. + +{% highlight js %} +pbjs.setConfig({ + ortb2: { + app: { + name: "myappname", + keywords: "power tools, drills", + content: { + data: [ + { + name: "www.dataprovider1.com", + ext: { + segtax: 6 + }, + segment: [ + { + id: "687" + }, + { + id: "123" + } + ] + }, + { + name: "www.dataprovider1.com", + ext: { + segtax: 7 + }, + segment: [ + { + id: "456" + }, + { + id: "789" + } + ] + } + ] + } + } + } +) + +{% endhighlight %} + ## Segments and Taxonomy The [IAB](https://iab.com) offers standard content and audience taxonomies for categorizing sites and users. Prebid supports defining these values as first party data in `site.content.data` or `user.data` as shown in the examples above. From 58bc4fc2fdbbde45501433a26cda383115d0f5c7 Mon Sep 17 00:00:00 2001 From: Alex Maltsev Date: Wed, 29 Sep 2021 21:50:39 +0300 Subject: [PATCH 33/71] Update docs to match with pbj (#3280) * Fixed typo * Updated docs to match with current PBJ state. * Added default configuration section * Removed redundant space between parentheses * tweaked default configs * Updated default config documentation to match with pbj * Update add-new-bidder-java.md * Reverted invalid changes * Synced with pbj * Added information about unmodifiable defaults, cleaned up bidder alias example. * Removed obsolete field pbs-enforces-gdpr Co-authored-by: bretg Co-authored-by: MartianTribe --- .../developers/add-new-bidder-java.md | 32 ++++--------------- 1 file changed, 6 insertions(+), 26 deletions(-) diff --git a/prebid-server/developers/add-new-bidder-java.md b/prebid-server/developers/add-new-bidder-java.md index a40bebcad0..99c3d2a78f 100644 --- a/prebid-server/developers/add-new-bidder-java.md +++ b/prebid-server/developers/add-new-bidder-java.md @@ -104,7 +104,6 @@ adapters: Modify this template for your bid adapter: - Change the maintainer email address to a group distribution list on your ad server's domain. A distribution list is preferred over an individual mailbox to allow for robustness, as roles and team members naturally change. - Change the `modifying-vast-xml-allowed` value to `false` if you'd like to opt out of video impression tracking. It defaults to `true`. -- Change the `pbs-enforces-gdpr` to `false` if you'd like to disable gdpr enforcement. Defaults to `true`. - Change the `pbs-enforces-ccpa` to `false` if you'd like to disable ccpa enforcement. Defaults to `true`. - Change the `vendor-id` value to id of your bidding server as registered with the [GDPR Global Vendor List (GVL)](https://iabeurope.eu/vendor-list-tcf-v2-0/). Leave this as `0` if you are not registered with IAB Europe. - Remove the `capabilities` (app/site) and `mediaTypes` (banner/video/audio/native) combinations which your adapter does not support. @@ -129,13 +128,15 @@ Default configuration: ```yaml adapter-defaults: enabled: false - pbs-enforces-gdpr: true pbs-enforces-ccpa: true - deprecated-names: - aliases: {} modifying-vast-xml-allowed: true ``` +There are also some default properties which can't be overridden in adapter-defaults, but rather in particular adapter's config: +- `aliases`: Defaults to empty +- `deprecated-names`: Defaults to empty +- `extra-info`: Defaults to empty + ### Create bidder alias If you want to add bidder that is an alias of existing bidder, you need just to update configuration of parent bidder: @@ -143,7 +144,7 @@ Example of adding bidder alias: ```yaml adapters: yourBidderCode: - endpoint: http://possible.endpoint + ... aliases: yourBidderAlias: endpoint: http://possible.alias/endpoint @@ -155,26 +156,6 @@ adapters: - video usersync: cookie-family-name: yourBidderCode - meta-info: - maintainer-email: maintainer@email.com - app-media-types: - - banner - - video - - audio - - native - site-media-types: - - banner - - video - - audio - - native - supported-vendors: - vendor-id: your_vendor_id - usersync: - url: your_bid_adapter_usersync_url - redirect-url: /setuid?bidder=yourBidderCode&gdpr={%raw%}{{gdpr}}{%endraw%}&gdpr_consent={%raw%}{{gdpr_consent}}{%endraw%}&us_privacy={%raw%}{{us_privacy}}{%endraw%} - cookie-family-name: yourBidderCode - type: redirect - support-cors: false ``` Aliases are configured by adding child configuration object at `adapters.yourBidderCode.aliases.yourBidderAlias` @@ -814,7 +795,6 @@ Go to `test-application.properties` file and add folowing properties ```yaml adapters.{bidder}.enabled=true adapters.{bidder}.endpoint=http://localhost:8090/{bidder}-exchange -adapters.{bidder}.pbs-enforces-gdpr=true adapters.{bidder}.usersync.url=//{bidder}-usersync ``` From 40cceda31560395ea66835b04557599d013adcc8 Mon Sep 17 00:00:00 2001 From: Gena Date: Wed, 29 Sep 2021 21:53:46 +0300 Subject: [PATCH 34/71] Viewdeos page pbs separation (#3282) * add Bidsxchange page * Add openweb doc * change params * add ViewDeos pbs page --- dev-docs/bidders/viewdeos.md | 39 ++++++++++++++++++++++++++++++++++ dev-docs/bidders/viewdeosDX.md | 8 +++---- 2 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 dev-docs/bidders/viewdeos.md diff --git a/dev-docs/bidders/viewdeos.md b/dev-docs/bidders/viewdeos.md new file mode 100644 index 0000000000..aacb4a2a6d --- /dev/null +++ b/dev-docs/bidders/viewdeos.md @@ -0,0 +1,39 @@ +--- +layout: bidder +title: Viewdeos Server +description: Prebid Server ViewDeos Adapter +pbjs: false +pbs: true +biddercode: viewdeos +media_types: banner,video +gdpr_supported: true +gvl_id: 924 +--- + +### Bid params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------|----------|---------------------------------|----------|-----------| +| `aid` | required | The source ID from member zone | `350975` | `integer` | + +### Test Parameters +``` + var adUnits = [ + // Banner adUnit + { + code: 'div-test-div', + mediaTypes: { + banner: { + sizes:[[300, 250]] + } + }, + bids: [{ + bidder: 'viewdeos', + params: { + aid: 672854 + } + }] + } + ]; +``` diff --git a/dev-docs/bidders/viewdeosDX.md b/dev-docs/bidders/viewdeosDX.md index 2756611309..3c8ee83b72 100644 --- a/dev-docs/bidders/viewdeosDX.md +++ b/dev-docs/bidders/viewdeosDX.md @@ -1,16 +1,16 @@ --- layout: bidder -title: Viewdeos -description: Prebid ViewDeos Bidder Adaptor +title: ViewdeosDX Client +description: Prebid.js ViewDeos Bidder Adapter pbjs: true -pbs: true +pbs: false biddercode: viewdeosDX media_types: banner,video gdpr_supported: true gvl_id: 924 --- -Note that for Prebid Server, viewdeosDX is an alias of the Adtelligent server-side bid adapter. It has its own Prebid.js adapter. +Note that for Prebid Server, use "viewdeos" bidder code. ### Bid params From d613041dfec1d2b4abe5129759a3b0d381707463 Mon Sep 17 00:00:00 2001 From: oath-jac <45564796+oath-jac@users.noreply.github.com> Date: Wed, 29 Sep 2021 21:55:10 +0300 Subject: [PATCH 35/71] Rebranding yssp adapter to yahoossp. (#3283) Co-authored-by: oath-jac --- dev-docs/bidders/yahoossp.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 dev-docs/bidders/yahoossp.md diff --git a/dev-docs/bidders/yahoossp.md b/dev-docs/bidders/yahoossp.md new file mode 100644 index 0000000000..3b3fd3805e --- /dev/null +++ b/dev-docs/bidders/yahoossp.md @@ -0,0 +1,18 @@ +--- +layout: bidder +title: YahooSSP +pbs: true +media_types: banner +biddercode: yahoossp +prebid_member: true +gdpr_supported: true +gvl_id: 25 +--- + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|------------|----------|------------------------|---------|----------| +| dcn | required | Site ID provided by One Mobile | 'site1' | string | +| pos | required | Placement ID | 'placement1' | string | From 318b3c39a01da41223b72554670beac2bbf53153 Mon Sep 17 00:00:00 2001 From: Ignat Khaylov Date: Wed, 29 Sep 2021 21:55:59 +0300 Subject: [PATCH 36/71] update between doc (#3284) Co-authored-by: khaylov --- dev-docs/bidders/between.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dev-docs/bidders/between.md b/dev-docs/bidders/between.md index 748f0d23fc..b37304b1b5 100644 --- a/dev-docs/bidders/between.md +++ b/dev-docs/bidders/between.md @@ -11,6 +11,7 @@ pbs_app_supported: true userIds: all gvl_id: 724 usp_supported: true +safeframes_ok: false --- ### Prebid.js Bid Params @@ -19,8 +20,6 @@ usp_supported: true | Name | Scope | Description | Example | Type | |---------------|----------|-------------|---------|----------| | `s` | required | Section ID from Between SSP control panel | 999999 | `integer` | -| `w` | required | width of placement(Number) | 240 | -| `h` | required | height of placement(Number) | 400 | ### Prebid-Server Bid Params From 7707e5413aa5d9a7ebced1b88174ccb2a531f481 Mon Sep 17 00:00:00 2001 From: Chris Huie Date: Wed, 29 Sep 2021 11:58:24 -0700 Subject: [PATCH 37/71] Download: fix akamai typo on download page (#3292) --- download.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/download.md b/download.md index 6d4c3be385..36b1908272 100644 --- a/download.md +++ b/download.md @@ -252,7 +252,7 @@ These modules may require accounts with a service provider.
- +
From f1aecb619ca4c9ef4d2d620c36a8a6635a8cd0bb Mon Sep 17 00:00:00 2001 From: jsut Date: Wed, 29 Sep 2021 15:55:39 -0400 Subject: [PATCH 38/71] fix links on modules/index.html (#3296) --- dev-docs/modules/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/modules/index.md b/dev-docs/modules/index.md index 35f1311756..a7f5965270 100644 --- a/dev-docs/modules/index.md +++ b/dev-docs/modules/index.md @@ -33,7 +33,7 @@ Prebid.org highly recommends that publishers utilize the following modules: {% for page in module_pages %}{% if page.recommended == true %} - {{page.display_name}} + {{page.display_name}} {{page.description}} {% endif %}{% endfor %} From a48b9d11c2b5a4e51c51121876306484b6f48a59 Mon Sep 17 00:00:00 2001 From: Chris Huie Date: Wed, 29 Sep 2021 14:47:17 -0700 Subject: [PATCH 39/71] Just Premium Bid Adapter: update schain support (#3301) per pr https://github.com/prebid/Prebid.js/pull/7506 --- dev-docs/bidders/justpremium.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/justpremium.md b/dev-docs/bidders/justpremium.md index 20732ff502..f5eebddc3c 100644 --- a/dev-docs/bidders/justpremium.md +++ b/dev-docs/bidders/justpremium.md @@ -6,6 +6,7 @@ pbjs: true biddercode: justpremium gdpr_supported: true usp_supported: true +schain_supported: true userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId --- From b892f421120a2bdc1fff969db2a2a4ef4a928ac7 Mon Sep 17 00:00:00 2001 From: Nick Jacob Date: Wed, 29 Sep 2021 17:48:34 -0400 Subject: [PATCH 40/71] change tagId to be required, and add note about test tagId value (#3303) --- dev-docs/bidders/amx.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/amx.md b/dev-docs/bidders/amx.md index bddf72a938..44b91b61e0 100644 --- a/dev-docs/bidders/amx.md +++ b/dev-docs/bidders/amx.md @@ -22,8 +22,8 @@ gvl_id: 737 {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |-------------|----------|-----------------------------------------------------------------|---------------------------------|----------| +| `tagId` | required | Tag ID | `'cHJlYmlkLm9yZw'` | `string` | | `testMode` | optional | Activate 100% fill ads | `true` | `boolean`| -| `tagId` | optional | Tag ID | `'cHJlYmlkLm9yZw'` | `string` | | `adUnitId` | optional | Ad Unit ID used in reporting. Will default to `bid.adUnitCode` | `'sticky_banner'` | `string` | ### Test Parameters @@ -37,4 +37,6 @@ To enable 100% fill test ads, you can use the following `params`: } ``` -Note that the `tagId` is case-sensitive. This will produce a bid at $10 with a test creative. +This will produce a bid at $10 with a test creative. + +Note that the `tagId` is case-sensitive. Do not use `cHJlYmlkLm9yZw` in production environments: this ID is for testing only. From d096299b911603627abd3583cf2acf30cdca6dbd Mon Sep 17 00:00:00 2001 From: ym-abaranov <78230460+ym-abaranov@users.noreply.github.com> Date: Wed, 29 Sep 2021 15:01:15 -0700 Subject: [PATCH 41/71] yieldmo: multiple changes (#3246) * multiple changes * schain support for video ads * device.ip support * gpid support * device.ip support cleaned up --- dev-docs/bidders/yieldmo.md | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/dev-docs/bidders/yieldmo.md b/dev-docs/bidders/yieldmo.md index 18a5a691bb..86998b1c85 100644 --- a/dev-docs/bidders/yieldmo.md +++ b/dev-docs/bidders/yieldmo.md @@ -4,7 +4,7 @@ title: Yieldmo description: Prebid Yieldmo Bidder Adaptor biddercode: yieldmo media_types: banner, video -userIds: pubCommonId, unifiedId, criteo +userIds: pubCommonId, unifiedId, criteo, sharedId gdpr_supported: true usp_supported: true schain_supported: true @@ -14,7 +14,7 @@ pbs: true --- # Registration -## In order to use Yieldmo adapter please reach out to your Yieldmo account's person or support@yieldmo.com for more information. +### Note: In order to use Yieldmo adapter please reach out to your Yieldmo account's person or support@yieldmo.com for more information.
### Bid Params @@ -52,7 +52,6 @@ In addition, Yieldmo adapter relies on parameters specified in the `mediaTypes.v |-------------------|----------|--------------------------------------------------------|-----------------|------------------| | `playerSize` | required | Width and height of the player | `[640, 480]` | `Array` | | `context` | required | `instream` or `outstream ` are only supported | `instream` | `string` | - ### Example of in-stream Video Ad-unit ```javascript var videoAdUnits = [{ @@ -77,7 +76,7 @@ var videoAdUnits = [{ bids: [{ bidder: 'yieldmo', params: { - placementId: '1524592390382976659' // required + placementId: '1524592390382976659',// required, } }] }]; @@ -88,23 +87,23 @@ var videoAdUnit = [{ code: 'div-video-ad-1234567890', mediaTypes: { video: { - playerSize: [640, 480], // required + playerSize: [640, 480], // required context: 'outstream', - mimes: ['video/mp4'], // required, array of strings - placement: 3, // required, integer ( 3,4,5 ) - maxduration: 30, // required, integer - protocols: [2, 3], // required, array of integers - api: [2, 3], // required, array of integers - playbackmethod: [1,2] // required, array of integers + mimes: ['video/mp4'], // required, array of strings + placement: 3, // required, integer ( 3,4,5 ) + maxduration: 30, // required, integer + protocols: [2, 3], // required, array of integers + api: [2, 3], // required, array of integers + playbackmethod: [1,2] // required, array of integers } }, bids: [{ bidder: 'yieldmo', params: { - placementId: '1524592390382976659' // required + placementId: '1524592390382976659', // required } }] }]; ``` -> Prebid out-stream demo - https://prebid-outstream-qa.yieldmo.com/prebid-outstream.html +> [Prebid out-stream demo](https://prebid-outstream-qa.yieldmo.com/prebid-outstream.html) From bc15dc781b83e564a070d58480042081b7253dea Mon Sep 17 00:00:00 2001 From: Luigi Sayson <48766825+luigi-sayson@users.noreply.github.com> Date: Thu, 30 Sep 2021 06:21:23 -0700 Subject: [PATCH 42/71] Add doc for timeout rtd module (#3266) * Add doc for timeout rtd module * Remove 'sets' --- dev-docs/modules/timeoutRtdProvider.md | 152 +++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 dev-docs/modules/timeoutRtdProvider.md diff --git a/dev-docs/modules/timeoutRtdProvider.md b/dev-docs/modules/timeoutRtdProvider.md new file mode 100644 index 0000000000..f0db6239be --- /dev/null +++ b/dev-docs/modules/timeoutRtdProvider.md @@ -0,0 +1,152 @@ +--- +layout: page_v2 +title: Timeout Rtd Module +description: Module for managing timeouts in real time +page_type: module +module_type: rtd +module_code : example +enable_download : true +sidebarType : 1 +--- + +## Overview +The timeout RTD module enables publishers to set rules that determine the timeout based on +certain features. It supports rules dynamically retrieved from a timeout provider as well as rules +set directly via configuration. +Build the timeout RTD module into the Prebid.js package with: +``` +gulp build --modules=timeoutRtdProvider,rtdModule... +``` + +## Configuration +The module is configured in the realTimeData.dataProviders object. The module will override +`bidderTimeout` in the pbjs config. + +### Timeout Data Provider interface +The timeout RTD module provides an interface of dynamically fetching timeout rules from +a data provider just before the auction begins. The endpoint url is set in the config just as in +the example below, and the timeout data will be used when making bid requests. + +``` +pbjs.setConfig({ + ... + "realTimeData": { + "dataProviders": [{ + "name": 'timeout', + "params": { + "endpoint": { + "url": "http://{cdn-link}.json" + } + } + } + ]}, + + // This value below will be modified by the timeout RTD module if it successfully + // fetches the timeout data. + "bidderTimeout": 1500, + ... +}); +``` + +Sample Endpoint Response: +``` +{ + "rules": { + "includesVideo": { + "true": 200, + "false": 50 + }, + "numAdUnits" : { + "1-5": 100, + "6-10": 200, + "11-15": 300 + }, + "deviceType": { + "2": 50, + "4": 100, + "5": 200 + }, + "connectionSpeed": { + "slow": 200, + "medium": 100, + "fast": 50, + "unknown": 10 + }, +} +``` + +### Rule Handling: +The rules retrieved from the endpoint will be used to add time to the `bidderTimeout` based on certain features such as +the user's deviceType, connection speed, etc. These rules can also be configured statically on page via a `rules` object. +Note that the timeout Module will ignore the static rules if an endpoint url is provided. The timeout rules follow the +format: +``` +{ + '': { + '': + } +} +``` +See bottom of page for examples. + +Currently supported features: + +|Name |Description | Keys | Example +| :------------ | :------------ | :------------ |:------------ | +| includesVideo | Adds time to the timeout based on whether there is a video ad unit in the auction or not | 'true'/'false'| { "true": 200, "false": 50 } | +| numAdUnits | Adds time based on the number of ad units. Ranges in the format `'lowerbound-upperbound` are accepted. This range is inclusive | numbers or number ranges | {"1": 50, "2-5": 100, "6-10": 200} | +| deviceType | Adds time based on device type| 2, 4, or 5| {"2": 50, "4": 100} | +| connectionSpeed | Adds time based on connection speed. `connectionSpeed` defaults to 'unknown' if connection speed cannot be determined | slow, medium, fast, or unknown | { "slow": 200} | + +If there are multiple rules set, all of them would be used and any that apply will be added to the base timeout. For example, if the rules object contains: +``` +{ + "includesVideo": { + "true": 200, + "false": 50 + }, + "numAdUnits" : { + "1-3": 100, + "4-5": 200 + } +} +``` +and there are 3 ad units in the auction, all of which are banner, then the timeout to be added will be 150 milliseconds (50 for `includesVideo[false]` + 100 for `numAdUnits['1-3']`). + +Full example: +``` +pbjs.setConfig({ + ... + "realTimeData": { + "dataProviders": [{ + "name": 'timeout', + "params": { + "rules": { + "includesVideo": { + "true": 200, + "false": 50 + }, + "numAdUnits" : { + "1-5": 100, + "6-10": 200, + "11-15": 300 + }, + "deviceType": { + "2": 50, + "4": 100, + "5": 200 + }, + "connectionSpeed": { + "slow": 200, + "medium": 100, + "fast": 50, + "unknown": 10 + } + } + } + ]} + } + ... + // The timeout RTD module will add time to `bidderTimeout` based on the rules set above. + "bidderTimeout": 1500, +``` From 04187d368a27f344b63a9c5fb9091ad0a00a911b Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 1 Oct 2021 20:33:49 -0400 Subject: [PATCH 43/71] fixing 404 for other module types (#3313) --- dev-docs/modules/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/modules/index.md b/dev-docs/modules/index.md index a7f5965270..11ac8c2ecf 100644 --- a/dev-docs/modules/index.md +++ b/dev-docs/modules/index.md @@ -59,7 +59,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 %} - {{page.display_name}} + {{page.display_name}} {{page.description}} {% if page.module_type == "rtd" %}yes{% else %}no{% endif %} @@ -80,7 +80,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 %} - {{page.display_name}} + {{page.display_name}} {{page.description}} {% if page.module_type == "rtd" %}yes{% else %}no{% endif %} From 57034253a74e985c3151ca9cf6120d3e2e3505b4 Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 1 Oct 2021 21:28:30 -0400 Subject: [PATCH 44/71] another batch of dead links (#3314) --- debugging/debugging.md | 2 +- dev-docs/adunit-reference.md | 2 +- dev-docs/bidders.md | 16 ++++++++-------- dev-docs/modules/gpt-pre-auction.md | 2 +- download.md | 6 +++--- prebid-server/features/pbs-default-request.md | 2 +- prebid-server/features/pbs-feature-idx.md | 2 +- prebid-video/video-getting-started.md | 2 +- troubleshooting/troubleshooting-guide.md | 2 +- 9 files changed, 18 insertions(+), 18 deletions(-) diff --git a/debugging/debugging.md b/debugging/debugging.md index 5c88a7050b..906dba744c 100644 --- a/debugging/debugging.md +++ b/debugging/debugging.md @@ -20,4 +20,4 @@ benefit from implementation improvements. Further Reading -+ [Prebid.js Troubleshooting Guide]({{site.github.url}}/dev-docs/prebid-troubleshooting-guide.html) ++ [Prebid.js Troubleshooting Guide](/dev-docs/prebid-troubleshooting-guide.html) diff --git a/dev-docs/adunit-reference.md b/dev-docs/adunit-reference.md index f8be5d59ad..ad7436892b 100644 --- a/dev-docs/adunit-reference.md +++ b/dev-docs/adunit-reference.md @@ -594,7 +594,7 @@ For more information on Interstitial ads, reference the [Interstitial feature pa ## Related Topics -+ [Publisher API Reference]({{site.baseurl}}/dev-docs/publisher-api-reference/) ++ [Publisher API Reference]({{site.baseurl}}/dev-docs/publisher-api-reference) + [Conditional Ad Units][conditionalAds] + [Show Native Ads]({{site.baseurl}}/dev-docs/show-native-ads.html) + [Show Video Ads]({{site.baseurl}}/dev-docs/show-video-with-a-dfp-video-tag.html) diff --git a/dev-docs/bidders.md b/dev-docs/bidders.md index 98cb8f9906..523c77f224 100644 --- a/dev-docs/bidders.md +++ b/dev-docs/bidders.md @@ -41,7 +41,7 @@ var AutocompleteList = [{% for page in bidder_pages %}{ label: '{{ 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 }} + {{ page.title }}
  • {% endfor %} @@ -52,7 +52,7 @@ var AutocompleteList = [{% for page in bidder_pages %}{ label: '{{ page.title }} {% assign firstletter = page.title | slice:0 | downcase %} {% unless firstletter == "b" or firstletter == "c" %}{% continue %}{% endunless %}
  • - {{ page.title }} + {{ page.title }}
  • {% endfor %} @@ -63,7 +63,7 @@ var AutocompleteList = [{% for page in bidder_pages %}{ label: '{{ page.title }} {% assign firstletter = page.title | slice:0 | downcase %} {% unless firstletter == "d" or firstletter == "e" or firstletter == "f" or firstletter == "g" %}{% continue %}{% endunless %}
  • - {{ page.title }} + {{ page.title }}
  • {% endfor %} @@ -74,7 +74,7 @@ var AutocompleteList = [{% for page in bidder_pages %}{ label: '{{ page.title }} {% 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 }} + {{ page.title }}
  • {% endfor %} @@ -85,7 +85,7 @@ var AutocompleteList = [{% for page in bidder_pages %}{ label: '{{ page.title }} {% assign firstletter = page.title | slice:0 | downcase %} {% unless firstletter == "m" or firstletter == "n" or firstletter == "o" %}{% continue %}{% endunless %}
  • - {{ page.title }} + {{ page.title }}
  • {% endfor %} @@ -96,7 +96,7 @@ var AutocompleteList = [{% for page in bidder_pages %}{ label: '{{ page.title }} {% assign firstletter = page.title | slice:0 | downcase %} {% unless firstletter == "p" or firstletter == "q" or firstletter == "r" %}{% continue %}{% endunless %}
  • - {{ page.title }} + {{ page.title }}
  • {% endfor %} @@ -107,7 +107,7 @@ var AutocompleteList = [{% for page in bidder_pages %}{ label: '{{ page.title }} {% assign firstletter = page.title | slice:0 | downcase %} {% unless firstletter == "s" or firstletter == "t" %}{% continue %}{% endunless %}
  • - {{ page.title }} + {{ page.title }}
  • {% endfor %} @@ -118,7 +118,7 @@ var AutocompleteList = [{% for page in bidder_pages %}{ label: '{{ page.title }} {% 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 }} + {{ page.title }}
  • {% endfor %} diff --git a/dev-docs/modules/gpt-pre-auction.md b/dev-docs/modules/gpt-pre-auction.md index 1f53ca3ff6..504b648e59 100644 --- a/dev-docs/modules/gpt-pre-auction.md +++ b/dev-docs/modules/gpt-pre-auction.md @@ -43,7 +43,7 @@ Optional initialization parameters: {: .table .table-bordered .table-striped } | Param | Required? | Type | Description | Example | | enabled | no | boolean | allows turning off of module. Default value is true | true | -| customGptSlotMatching | no | function | GPT slot matching function should match the customSlotMatching function sent to [setTargetingForGptAsync](/publisher-api-reference/setTargetingForGPTAsync.html) | | +| customGptSlotMatching | no | function | GPT slot matching function should match the customSlotMatching function sent to [setTargetingForGptAsync](/dev-docs/publisher-api-reference/setTargetingForGPTAsync.html) | | | customPbAdSlot | no | function | Custom PB AdSlot function | | | mcmEnabled | no | boolean | Removes extra network IDs when Multiple Customer Management is active. Default is false. | true | diff --git a/download.md b/download.md index 36b1908272..bf78bbb148 100644 --- a/download.md +++ b/download.md @@ -227,19 +227,19 @@ Prebid.js is open source software that is offered for free as a convenience. Whi

    Recommended Modules

    Prebid.org highly recommends that publishers utilize the following modules:
    -{% for page in module_pages %}{% if page.recommended == true %}
    {% endif %}{% endfor %} +{% for page in module_pages %}{% if page.recommended == true %}
    {% endif %}{% endfor %}

    General Modules

    {% for page in module_pages %}{% if page.enable_download == false or page.recommended == true or page.vendor_specific == true %}{% continue %}{% endif %}{% endfor %}

    Vendor-Specific Modules

    These modules may require accounts with a service provider.
    - {% for page in module_pages %}{% if page.enable_download == false or page.recommended == true %}{% continue %}{% endif %}{% if page.vendor_specific == true %}
    + {% for page in module_pages %}{% if page.enable_download == false or page.recommended == true %}{% continue %}{% endif %}{% if page.vendor_specific == true %}{% endif %}{% endfor %}
    diff --git a/prebid-server/features/pbs-default-request.md b/prebid-server/features/pbs-default-request.md index 3badc95482..d11b01a092 100644 --- a/prebid-server/features/pbs-default-request.md +++ b/prebid-server/features/pbs-default-request.md @@ -21,7 +21,7 @@ default_request: alias_info: false ``` -The `file.name` option is the path/filename of a JSON file containing default request JSON. See the [stored request doc](/prebid-server/features/pbs-storedreqs.html) and the [openrtb2/auction endpoint doc](/prebid-server/endpoints/openrtb2/auction.html) for details about the syntax. +The `file.name` option is the path/filename of a JSON file containing default request JSON. See the [stored request doc](/prebid-server/features/pbs-storedreqs.html) and the [openrtb2/auction endpoint doc](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html) for details about the syntax. PBS-Java has a slightly different configuration in application.yaml: ``` diff --git a/prebid-server/features/pbs-feature-idx.md b/prebid-server/features/pbs-feature-idx.md index 7c36297221..c7bcf46a02 100644 --- a/prebid-server/features/pbs-feature-idx.md +++ b/prebid-server/features/pbs-feature-idx.md @@ -69,7 +69,7 @@ title: Prebid Server | Features | Events | Events vasttrack endpoint | Ability to process the /vasttrack endpoint initated by Prebid.js, placing /event URLs in VAST XML. | | | | Events | Events BidID Generation | Some bidders don't generate unique enough BidIDs to join with auction events. This feature allows the host company to inject a PBS-generated BidID alongside the bidder-generated ID. | | | | Auction | [MultiBid](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#multibid-pbs-java-only) | Allow named bidders to supply more than one response. | | | -| Analytics | Analytics module support | Allows developers to plug in a [custom analytics adapter](/developers/pbs-build-an-analytics-adapter.html). | | | +| Analytics | Analytics module support | Allows developers to plug in a [custom analytics adapter](/prebid-server/developers/pbs-build-an-analytics-adapter.html). | | | | Bid Response Validation | Validate secure markup | PBS can configurably reject bid responses that don't supply a secure creative when in a secure context. | | | | Bid Response Validation | Validate bid sizes | PBS can configurably reject bid responses with sizes that are bigger than the request dimensions. | | | | [Bidder Info Endpoints](/prebid-server/endpoints/info/pbs-endpoint-info.html) | Core | Provides details on which bidders and parameters exist in this Prebid Server. | | | diff --git a/prebid-video/video-getting-started.md b/prebid-video/video-getting-started.md index 82bc941d97..fbc05431c3 100644 --- a/prebid-video/video-getting-started.md +++ b/prebid-video/video-getting-started.md @@ -137,7 +137,7 @@ And this is where setups for instream and outstream diverge. Please follow one o Be sure to note the setting for price granularity. You might need to set up a custom price granularity. (See “Custom CPM Bucket Sizing” under [Price Granularity](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Price-Granularity). Or, if you’re monetizing both banner and video inventory with Prebid, you might need to define format-specific price granularity settings through [mediaTypePriceGranularity](/dev-docs/publisher-api-reference/setConfig.html#setConfig-MediaType-Price-Granularity). {: .alert.alert-info :} -**Prebid Server** If you’re using Prebid Server, you also need to configure your server-to-server bidder adapters. See [Getting Started with Prebid Server]({{site.github.url}}/dev-docs/get-started-with-prebid-server.html#step-4-configure-s2s-bidder-adapters) for details and examples. +**Prebid Server** If you’re using Prebid Server, you also need to configure your server-to-server bidder adapters. See [Getting Started with Prebid Server](/overview/prebid-server-overview.html). ### Examples diff --git a/troubleshooting/troubleshooting-guide.md b/troubleshooting/troubleshooting-guide.md index 7dd94f51f8..12843faac9 100644 --- a/troubleshooting/troubleshooting-guide.md +++ b/troubleshooting/troubleshooting-guide.md @@ -182,7 +182,7 @@ Here's another scenario using the 'debugging' feature described in the previous This section covers cases in which a particular server-side bidder doesn't always respond with a bid, or you want to try specific bid CPM values to verify line item setup. -If you're using Prebid Server (i.e. the [s2sConfig](/dev-docs/publisher-api-reference/setconfig#setConfig-Server-to-Server) option), you can force it to respond with a particular canned response on any page by defining a storedAuctionResponse ID on the javascript console: +If you're using Prebid Server (i.e. the [s2sConfig](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Server-to-Server) option), you can force it to respond with a particular canned response on any page by defining a storedAuctionResponse ID on the javascript console: ```javascript javascript console> pbjs.setConfig({ From d1209b960a91b3cd7725a5ceb129370e0c6b3dd4 Mon Sep 17 00:00:00 2001 From: bretg Date: Mon, 4 Oct 2021 09:23:41 -0400 Subject: [PATCH 45/71] download page 404 for modules (#3316) --- download.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/download.md b/download.md index bf78bbb148..c648268a4d 100644 --- a/download.md +++ b/download.md @@ -232,7 +232,7 @@ Prebid.org highly recommends that publishers utilize the following modules:

    General Modules

    {% for page in module_pages %}{% if page.enable_download == false or page.recommended == true or page.vendor_specific == true %}{% continue %}{% endif %}{% endfor %}
    From d14084cae9a7c908a94e0c5d80f38ef3d615ac4b Mon Sep 17 00:00:00 2001 From: Bill Newman Date: Mon, 4 Oct 2021 16:26:32 +0300 Subject: [PATCH 46/71] Colossus Bid Adapter: Unified ID 2.0 (#3236) * Updated docs Colossusssp Adapter * Update colossusssp.md Add media types * Update colossusssp.md add usp consent support * adding schain flag * gdpr and user ids * id5id support * Prebid server info * Remove PBS params * Add colossus PBS docs * Add short note for pbs adapter parametres * Add note for pbjs parametres * Fix * remove duplicate string * Update colossusssp.md Ad biddflorr parameter * add uid2 * fix * fix Co-authored-by: Vladislav Isaiko Co-authored-by: bretg Co-authored-by: Aiholkin --- dev-docs/bidders/colossus.md | 2 +- dev-docs/bidders/colossusssp.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/colossus.md b/dev-docs/bidders/colossus.md index a01899d0af..e7b322df75 100644 --- a/dev-docs/bidders/colossus.md +++ b/dev-docs/bidders/colossus.md @@ -6,7 +6,7 @@ biddercode: colossus usp_supported: true schain_supported: true media_types: banner, video, native -userIds: britepoolid, identityLink, unifiedId, id5Id +userIds: britepoolid, identityLink, unifiedId, id5Id, uid2 gdpr: true pbjs: false pbs: true diff --git a/dev-docs/bidders/colossusssp.md b/dev-docs/bidders/colossusssp.md index e64677b05d..6a9aafeca4 100644 --- a/dev-docs/bidders/colossusssp.md +++ b/dev-docs/bidders/colossusssp.md @@ -6,7 +6,7 @@ biddercode: colossusssp usp_supported: true schain_supported: true media_types: banner, video, native -userIds: britepoolid, identityLink, unifiedId, id5Id +userIds: britepoolid, identityLink, unifiedId, id5Id, uid2 gdpr: true pbjs: true pbs: false From 40dbcba35a56220b6fece4249eefc4a86042278d Mon Sep 17 00:00:00 2001 From: bretg Date: Mon, 4 Oct 2021 12:17:44 -0400 Subject: [PATCH 47/71] Fix timeout rtd (#3317) * download page 404 for modules * fixed modulecode for timeout RTD --- dev-docs/modules/timeoutRtdProvider.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/modules/timeoutRtdProvider.md b/dev-docs/modules/timeoutRtdProvider.md index f0db6239be..969b9311aa 100644 --- a/dev-docs/modules/timeoutRtdProvider.md +++ b/dev-docs/modules/timeoutRtdProvider.md @@ -4,7 +4,7 @@ title: Timeout Rtd Module description: Module for managing timeouts in real time page_type: module module_type: rtd -module_code : example +module_code : timeoutRtdProvider enable_download : true sidebarType : 1 --- From f021e9a5ccf4f60c8bc637dd04955e8d34686cf8 Mon Sep 17 00:00:00 2001 From: Denis Logachov Date: Wed, 6 Oct 2021 21:06:44 +0300 Subject: [PATCH 48/71] Adkernel: documenting ergadx alias (#3324) Documenting https://github.com/prebid/Prebid.js/pull/7544 --- dev-docs/bidders/ergadx.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 dev-docs/bidders/ergadx.md diff --git a/dev-docs/bidders/ergadx.md b/dev-docs/bidders/ergadx.md new file mode 100644 index 0000000000..2aedf405a1 --- /dev/null +++ b/dev-docs/bidders/ergadx.md @@ -0,0 +1,27 @@ +--- +layout: bidder +title: eRGADX +description: eRGADX Bidder Adaptor +pbjs: true +pbs: true +biddercode: ergadx +aliasCode : adkernel +media_types: banner, native, video +gdpr_supported: true +usp_supported: true +coppa_supported: true +pbs_app_supported: true +schain_supported: true +--- + +### Note: + +The eRGADX bidding adapter requires setup and approval before implementation. Please reach out to for more details. + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|----------|----------|-----------------------|---------------------------|----------| +| `host` | required | RTB host | `'cpm.ergadx.com'` | `string` | +| `zoneId` | required | Zone Id | 30164 | `integer` | From 3f2af06e50446e03035a6e2e9c29dea187a68f72 Mon Sep 17 00:00:00 2001 From: Patrick McCann Date: Wed, 6 Oct 2021 14:07:38 -0400 Subject: [PATCH 49/71] Update InterstitialAds.md (#3319) --- features/InterstitialAds.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/InterstitialAds.md b/features/InterstitialAds.md index 3eda2187fa..e034212528 100644 --- a/features/InterstitialAds.md +++ b/features/InterstitialAds.md @@ -54,7 +54,7 @@ pbjs.addAdUnits({ } }, ortb2Imp: { - intl:1 + instl:1 }, ... }); From dbe99db6519e0652ffba05a8952efc24f0594521 Mon Sep 17 00:00:00 2001 From: nllerandi3lift <75995508+nllerandi3lift@users.noreply.github.com> Date: Wed, 6 Oct 2021 14:08:24 -0400 Subject: [PATCH 50/71] adds disclaimer (#3318) --- dev-docs/bidders/triplelift.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/dev-docs/bidders/triplelift.md b/dev-docs/bidders/triplelift.md index 9406329245..dfc94cf0e9 100644 --- a/dev-docs/bidders/triplelift.md +++ b/dev-docs/bidders/triplelift.md @@ -19,6 +19,11 @@ pbs_app_supported: true gvl_id: 28 --- +{% capture version2 %} +The Triplelift Prebid Server bidding adapter and user sync endpoint require setup before beginning. Please contact us at prebid@triplelift.com. +{% endcapture %} +{% include alerts/alert_important.html content=version2 %} + ### Bid Params {: .table .table-bordered .table-striped } From 10693bb6a8c837c1c64a74b84392c452f8bbcb62 Mon Sep 17 00:00:00 2001 From: jsfledd Date: Wed, 6 Oct 2021 11:09:51 -0700 Subject: [PATCH 51/71] Nativo Bid Adapter: Bid Params Update (#3307) * Added nativo markup documentation to dev-docs/bidders * Added IAB Global Vendor List ID number. * Adjusted placementId Type to be integer * Changed pbjs value to true * Added optional url parameter * Updated placementId parameter to be optional --- dev-docs/bidders/nativo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/nativo.md b/dev-docs/bidders/nativo.md index 67d7921d18..9c72c55f07 100644 --- a/dev-docs/bidders/nativo.md +++ b/dev-docs/bidders/nativo.md @@ -18,5 +18,5 @@ The Nativo Bidder adapter requires setup before beginning. Please contact us at {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |---------------|----------|---------------------------------------------------------------------------------|--------------|-----------| -| `placementId` | required | Publication placement ID value from the Nativo Platform | `13144370` | `integer` | +| `placementId` | optional | Publication placement ID value from the Nativo Platform | `13144370` | `integer` | | `url` | optional | Publication url value associated with placement ID value in the Nativo Platform | `https://test-sites.internal.nativo.net/testing/prebid_adpater.html` | `string` | From 3afec767b04362333ba118d95baa7b6c83c35d17 Mon Sep 17 00:00:00 2001 From: Paul Yang Date: Wed, 6 Oct 2021 11:10:25 -0700 Subject: [PATCH 52/71] PubLink adds params for site id and api key. (#3306) --- dev-docs/modules/userId.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md index ac7d756f47..5c321ac786 100644 --- a/dev-docs/modules/userId.md +++ b/dev-docs/modules/userId.md @@ -1411,11 +1411,11 @@ traffic. Publisher first-party authenticated data and a user's unique encrypted Epsilon CORE ID. By utilizing Publisher Link, publishers are able to reap the benefits of Epsilon's CORE ID. #### Publisher Link Registration -There is no registration needed. +Please contact [Epsilon](mailto:PublisherSupport@Epsilon.com) to sign up. The Epsilon privacy is covered in the [Epsilon Privacy Policy](https://www.epsilon.com/us/privacy-policy). -The Publisher Link opt-out is include [here](https://www.epsilon.com/privacy/dms/opt-out/email) +The Publisher Link opt-out is included [here](https://www.epsilon.com/privacy/dms/opt-out/email) #### Publisher Link Configuration @@ -1425,8 +1425,10 @@ In addition to the parameters documented above in the Basic Configuration sectio | 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 | `e80b5017098950fc58aad83c8c14978e` | +| 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. | `'7ab62359-bdc0-4095-b573-ef474fb55d2'` #### Publisher Link Examples ```javascript @@ -1440,7 +1442,9 @@ In addition to the parameters documented above in the Basic Configuration sectio expires: 30 }, params: { - e: "e80b5017098950fc58aad83c8c14978e", // example hashed email (md5) + e: "7D320454942620664D96EF78ED4E3A2A", // example hashed email (md5) + site_id: "123456", + api_key: "7ab62359-bdc0-4095-b573-ef474fb55d2" } }] } From 1f7d3c1fb6d3ec9fd893a189002f14e494bca23e Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 6 Oct 2021 14:11:02 -0400 Subject: [PATCH 53/71] Slimcut: removing 5.x note (#3305) --- dev-docs/bidders/slimcut.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dev-docs/bidders/slimcut.md b/dev-docs/bidders/slimcut.md index c308a7322a..598794aeac 100644 --- a/dev-docs/bidders/slimcut.md +++ b/dev-docs/bidders/slimcut.md @@ -1,12 +1,11 @@ --- layout: bidder title: Slimcut -description: SlimCut Bidder Adaptor +description: SlimCut Bidder Adapter pbjs: true biddercode: slimcut media_types: video, banner gdpr_supported: true -pbjs_version_notes: not in 5.x --- ### Overview From 90ae17cb1820bbacd6ce6baae40a93b8a9a674a9 Mon Sep 17 00:00:00 2001 From: Amanda Dillon <41923726+agdillon@users.noreply.github.com> Date: Wed, 6 Oct 2021 12:12:40 -0600 Subject: [PATCH 54/71] SpotX: add support for price floors module (#3293) --- dev-docs/bidders/spotx.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/spotx.md b/dev-docs/bidders/spotx.md index 9a63dfb00d..b52eef3265 100644 --- a/dev-docs/bidders/spotx.md +++ b/dev-docs/bidders/spotx.md @@ -12,6 +12,7 @@ usp_supported: true safeframes_ok: false pbjs: true gvl_id: 165 +getFloor: true pbjs_version_notes: avoid 4.31-4.35 --- @@ -32,7 +33,7 @@ Publishers using SpotX that haven't yet updated their ad server line items and t | `secure` | optional | Boolean identifying whether the requests should be https or not (used to override the protocol if the page isn't secure). | `true` | `boolean` | | `mimes` | optional | List of MIME types to allow in ad. | `['application/javascript', 'video/mp4', 'video/webm']` | `array` | | `ad_volume` | optional | Value between 0 and 1 to denote the volume the ad should start at | `0.7` | `float` | -| `price_floor` | optional | Set the current channel price floor in real time. | `10` | `integer` | +| `price_floor` | optional | Set the current channel price floor in real time. | `10` | `float` | | `hide_skin` | optional | Set to true to hide the SpotX skin | | `boolean` | | `custom` | optional | An object containing key-value pairs for reporting. See SpotX documentation [here](https://developer.spotxchange.com/content/local/docs/sdkDocs/DirectSdk/dsdk-custom-configs.md#custom-key-value-pair-reporting) | | `object` | | `min_duration` | optional | Minimum video ad duration in seconds | | `integer` | From d77d1fd9f652f214acc1caf6e0a9366a5790082a Mon Sep 17 00:00:00 2001 From: Abimael Martinez Date: Wed, 6 Oct 2021 12:13:26 -0600 Subject: [PATCH 55/71] Update NextRoll BidAdapter docs for v5 (#3286) * Update NextRoll BidAdapter docs for v5 * Add comment to `floors` section in example --- dev-docs/bidders/nextroll.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/nextroll.md b/dev-docs/bidders/nextroll.md index accca4ab35..c99e92a4b3 100644 --- a/dev-docs/bidders/nextroll.md +++ b/dev-docs/bidders/nextroll.md @@ -8,7 +8,6 @@ media_types: display, native gdpr_supported: false usp_supported: true prebid_member: true -pbjs_version_notes: not in 5.x --- ### Bid Params @@ -19,7 +18,7 @@ pbjs_version_notes: not in 5.x | `sellerId` | required | The seller ID from NextRoll.Please reach out your NextRoll representative for more details. | `'541459'` | `string` | | `publisherId` | optional | The publisher ID from NextRoll.Please reach out your NextRoll representative for more details. | `'956812'` | `string` | | `zoneId` | optional | Descriptive or unique identifier for the ad position | `'main-banner-505/600x160'` | `string` | -| `bidfloor` | optional | Per ad-unit bid floor | `2.3` | `number` | +| `bidfloor` | optional | Per ad-unit bid floor, used if the floor module is not available | `2.3` | `number` | #### Example of Banner Ad-unit ``` @@ -29,6 +28,17 @@ var adUnits = [ mediaTypes: { banner: {sizes: [[300, 250], [160, 600]]} }, + // If floors module is enabled + floors: { + currency: "USD", + schema: { + delimiter: "|", + fields: ["mediaType", "size"] + }, + values: { + "*|*": 2.0 + } + }, bids: [{ bidder: 'nextroll', params: { From bb4a8b5cc3d7c7df213103a8db45cbacca3632c8 Mon Sep 17 00:00:00 2001 From: Chris Huie Date: Wed, 6 Oct 2021 11:13:50 -0700 Subject: [PATCH 56/71] Mytarget Bid Adapter: update Prebid 5 compliance (#3285) Per pr -> https://github.com/prebid/Prebid.js/pull/7397 --- dev-docs/bidders/mytarget.md | 1 - 1 file changed, 1 deletion(-) diff --git a/dev-docs/bidders/mytarget.md b/dev-docs/bidders/mytarget.md index cf96c21dff..d53cbca13a 100644 --- a/dev-docs/bidders/mytarget.md +++ b/dev-docs/bidders/mytarget.md @@ -4,7 +4,6 @@ title: myTarget description: Prebid myTarget Bidder Adapter pbjs: true biddercode: mytarget -pbjs_version_notes: not in 5.x --- From aff552a1d4eac1540ff8abacc6b668094c26e306 Mon Sep 17 00:00:00 2001 From: Jeremy Sadwith Date: Wed, 6 Oct 2021 14:14:55 -0400 Subject: [PATCH 57/71] Added video support (#3281) --- dev-docs/bidders/kargo.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/kargo.md b/dev-docs/bidders/kargo.md index 926a62f1a1..562d797b4d 100644 --- a/dev-docs/bidders/kargo.md +++ b/dev-docs/bidders/kargo.md @@ -4,6 +4,7 @@ title: Kargo description: Prebid Kargo Bidder Adaptor pbjs: true biddercode: kargo +media_types: banner, video gdpr_supported: true userIds: unifiedId usp_supported: true From 1336b5057cd3013b2c9bd16c8bf22f4432546904 Mon Sep 17 00:00:00 2001 From: wojciech-bialy-wpm <67895844+wojciech-bialy-wpm@users.noreply.github.com> Date: Wed, 6 Oct 2021 20:15:31 +0200 Subject: [PATCH 58/71] [sspbc-adapter] update dev-docs for adapter (native & video support) (#3279) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Wojciech Biały --- dev-docs/bidders/sspBC.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/sspBC.md b/dev-docs/bidders/sspBC.md index 41a319747a..48c9ffa1e0 100644 --- a/dev-docs/bidders/sspBC.md +++ b/dev-docs/bidders/sspBC.md @@ -4,7 +4,7 @@ title: sspBC description: Prebid sspBC Bidder Adaptor pbjs: true biddercode: sspBC -media_types: banner +media_types: banner, video, native getFloor: true gdpr_supported: true gvl_id: 676 From f456d239a041b6558c5c6a533f566e3f10beb919 Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 6 Oct 2021 20:16:30 +0200 Subject: [PATCH 59/71] Prebid Server Support (#3273) Add the prebid server support --- dev-docs/bidders/impactify.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/impactify.md b/dev-docs/bidders/impactify.md index 4cb59868c8..5b36a8eeae 100644 --- a/dev-docs/bidders/impactify.md +++ b/dev-docs/bidders/impactify.md @@ -3,7 +3,7 @@ layout: bidder title: Impactify description: Prebid Impactify Bidder Adapter pbjs: true -pbs: false +pbs: true biddercode: impactify gdpr_supported: true tcf2_supported: true From becec5abd93c3daa3201076187468e7fe5d6e56e Mon Sep 17 00:00:00 2001 From: relaido <63339139+relaido@users.noreply.github.com> Date: Thu, 7 Oct 2021 03:17:09 +0900 Subject: [PATCH 60/71] Relaido Bid Adapter: add support imuid (#3272) * add relaido adapter * Add support for imuid Co-authored-by: ishigami_shingo Co-authored-by: cmertv-sishigami --- dev-docs/bidders/relaido.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/relaido.md b/dev-docs/bidders/relaido.md index 451554d9d4..08ef84f34f 100644 --- a/dev-docs/bidders/relaido.md +++ b/dev-docs/bidders/relaido.md @@ -3,6 +3,7 @@ layout: bidder title: Relaido description: Prebid Relaido Bidder Adapter biddercode: relaido +userIds: imuid pbjs: true media_types: banner, video --- From 38491fde4812767d52f152ab70d6a09333e3dd2a Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 6 Oct 2021 20:18:07 +0200 Subject: [PATCH 61/71] Impactify - Add UserID module (#3245) Add UserID support in documentation --- dev-docs/bidders/impactify.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/impactify.md b/dev-docs/bidders/impactify.md index 5b36a8eeae..20c55f326b 100644 --- a/dev-docs/bidders/impactify.md +++ b/dev-docs/bidders/impactify.md @@ -11,6 +11,7 @@ usp_supported: true schain_supported: true coppa_supported: true media_types: video +userIds: criteo, id5Id, pubCommonId, unifiedId, uid2, netId gvl_id: 606 --- From 1f14efc409f4f3a8b9cd61c49f74a81644173105 Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 6 Oct 2021 15:24:20 -0400 Subject: [PATCH 62/71] Added First Party Data to feature list (#3325) * added fpd_supported, renamed getFloor and deals * removing stray file --- _layouts/bidder.html | 8 ++++---- dev-docs/bidder-adaptor.md | 14 ++++++++------ dev-docs/bidder-data.csv | 4 ++-- dev-docs/bidders/33across.md | 2 +- dev-docs/bidders/aceex.md | 2 +- dev-docs/bidders/acuityads.md | 2 +- dev-docs/bidders/adagio.md | 3 ++- dev-docs/bidders/adf.md | 3 ++- dev-docs/bidders/admixer.md | 1 + dev-docs/bidders/adnuntius.md | 1 + dev-docs/bidders/adpone.md | 2 +- dev-docs/bidders/adquery.md | 2 +- dev-docs/bidders/adrelevantis.md | 1 + dev-docs/bidders/adriver.md | 4 ++-- dev-docs/bidders/adxcg.md | 2 +- dev-docs/bidders/adyoulike.md | 2 +- dev-docs/bidders/amx.md | 1 + dev-docs/bidders/apacdex.md | 4 ++-- dev-docs/bidders/appnexus.md | 3 ++- dev-docs/bidders/aso.md | 6 +++--- dev-docs/bidders/automatad.md | 1 + dev-docs/bidders/beachfront.md | 2 +- dev-docs/bidders/beop.md | 1 + dev-docs/bidders/bidmachine.md | 2 +- dev-docs/bidders/bizzclick.md | 2 +- dev-docs/bidders/bmtm.md | 2 +- dev-docs/bidders/brave.md | 2 +- dev-docs/bidders/colossusssp.md | 1 + dev-docs/bidders/connectad.md | 2 +- dev-docs/bidders/contentexchange.md | 2 +- dev-docs/bidders/criteo.md | 3 ++- dev-docs/bidders/datablocks.md | 1 + dev-docs/bidders/districtmdmx.md | 2 +- dev-docs/bidders/epom.md | 2 +- dev-docs/bidders/etarget.md | 1 + dev-docs/bidders/getintent.md | 2 +- dev-docs/bidders/gothamads.md | 2 +- dev-docs/bidders/grid.md | 3 ++- dev-docs/bidders/gridNM.md | 1 + dev-docs/bidders/gumgum.md | 3 ++- dev-docs/bidders/huaweiads.md | 2 +- dev-docs/bidders/inmar.md | 3 ++- dev-docs/bidders/integr8.md | 2 +- dev-docs/bidders/iqm.md | 2 +- dev-docs/bidders/ix.md | 3 ++- dev-docs/bidders/jixie.md | 2 +- dev-docs/bidders/kobler.md | 4 ++-- dev-docs/bidders/logicad.md | 2 +- dev-docs/bidders/marsmedia.md | 2 +- dev-docs/bidders/mathildeads.md | 2 +- dev-docs/bidders/mediakeys.md | 4 ++-- dev-docs/bidders/medianet.md | 3 ++- dev-docs/bidders/nobid.md | 1 + dev-docs/bidders/ogury.md | 4 ++-- dev-docs/bidders/openx.md | 3 ++- dev-docs/bidders/operaads.md | 4 ++-- dev-docs/bidders/optout.md | 1 + dev-docs/bidders/ozone.md | 3 ++- dev-docs/bidders/pangle.md | 2 +- dev-docs/bidders/pixfuture.md | 1 + dev-docs/bidders/proxistore.md | 1 + dev-docs/bidders/pubgenius.md | 2 +- dev-docs/bidders/pubmatic.md | 3 ++- dev-docs/bidders/pwbid.md | 2 +- dev-docs/bidders/quantumdex.md | 4 ++-- dev-docs/bidders/rise.md | 3 ++- dev-docs/bidders/roundel.md | 2 +- dev-docs/bidders/rubicon.md | 5 +++-- dev-docs/bidders/sharethrough.md | 1 + dev-docs/bidders/smaato.md | 3 ++- dev-docs/bidders/smartadserver.md | 2 +- dev-docs/bidders/smartyads.md | 2 +- dev-docs/bidders/sonobi.md | 1 + dev-docs/bidders/sortable.md | 2 +- dev-docs/bidders/sovrn.md | 3 ++- dev-docs/bidders/spotx.md | 2 +- dev-docs/bidders/sspBC.md | 5 +++-- dev-docs/bidders/stroeerCore.md | 2 +- dev-docs/bidders/targetvideo.md | 2 +- dev-docs/bidders/teads.md | 2 +- dev-docs/bidders/triplelift.md | 5 +++-- dev-docs/bidders/triplelift_native.md | 4 ++-- dev-docs/bidders/trustx.md | 1 + dev-docs/bidders/ucfunnel.md | 2 +- dev-docs/bidders/unruly.md | 4 ++-- dev-docs/bidders/valueimpression.md | 4 ++-- dev-docs/bidders/visx.md | 2 +- dev-docs/bidders/winr.md | 3 ++- dev-docs/bidders/yieldmo.md | 1 + dev-docs/bidders/zeta_global.md | 2 +- dev-docs/bidders/zeta_global_ssp.md | 3 ++- dev-docs/pbs-bidders.md | 3 ++- prebid-server/developers/add-new-bidder-go.md | 8 ++++++-- prebid-server/developers/add-new-bidder-java.md | 8 ++++++-- 94 files changed, 151 insertions(+), 102 deletions(-) diff --git a/_layouts/bidder.html b/_layouts/bidder.html index 35f39c9de1..ef9165c1cd 100644 --- a/_layouts/bidder.html +++ b/_layouts/bidder.html @@ -76,7 +76,7 @@

    Features

    Supports Deals - {% if page.bidder_supports_deals == false %}no{% elsif page.bidder_supports_deals == true %}yes{% else %}check with bidder{% endif %} + {% if page.deals_supported == false %}no{% elsif page.deals_supported == true %}yes{% else %}check with bidder{% endif %} Prebid.js Adapter yes @@ -88,9 +88,9 @@

    Features

    Floors Module Support - {% if page.getFloor == true %}yes{% else %}no{% endif %} - - + {% if page.floors_supported == true %}yes{% else %}no{% endif %} + First Party Data Support + {% if page.fpd_supported == true %}yes{% elsif page.fpd_supported == false %}no{% else %}check with bidder{% endif %} diff --git a/dev-docs/bidder-adaptor.md b/dev-docs/bidder-adaptor.md index 6550c9f546..ba6b96ced5 100644 --- a/dev-docs/bidder-adaptor.md +++ b/dev-docs/bidder-adaptor.md @@ -1069,15 +1069,16 @@ registerBidder(spec); - Add `pbjs: true`. If you also have a [Prebid Server bid adapter](/prebid-server/developers/add-new-bidder-go.html), add `pbs: true`. Default is false for both. - If you're on the IAB Global Vendor List, add your ID number in `gvl_id`. - If you support the GDPR consentManagement module and have a GVL ID, you may add `gdpr_supported: true`. Default is false. - - If you have an IAB Global Vendor List ID, add `gvl_id: ID`. There's no default. - If you support the US Privacy consentManagementUsp module, add `usp_supported: true`. Default is false. - If you support one or more userId modules, add `userId: (list of supported vendors)`. No default value. - If you support video and/or native mediaTypes add `media_types: video, native`. Note that display is added by default. If you don't support display, add "no-display" as the first entry, e.g. `media_types: no-display, native`. No default value. - If you support COPPA, add `coppa_supported: true`. Default is false. - If you support the [supply chain](/dev-docs/modules/schain.html) feature, add `schain_supported: true`. Default is false. - - If you support passing a demadn chain on the response, add `dchain_supported: true`. Default is false. + - If you support passing a demand chain on the response, add `dchain_supported: true`. Default is false. - If your bidder doesn't work well with safeframed creatives, add `safeframes_ok: false`. This will alert publishers to not use safeframed creatives when creating the ad server entries for your bidder. No default value. - - If you support deals, set `bidder_supports_deals: true`. No default value.. + - If you support deals, set `deals_supported: true`. No default value.. + - If you support floors, set `floors_supported: true`. No default value.. + - If you support first party data, set `fpd_supported: true`. No default value.. - If you're a member of Prebid.org, add `prebid_member: true`. Default is false. - Submit both the code and docs pull requests @@ -1090,7 +1091,7 @@ description: Prebid example Bidder Adapter biddercode: example aliasCode: fileContainingPBJSAdapterCodeIfDifferentThenBidderCode gdpr_supported: true/false -gvl_id: 111 +gvl_id: none usp_supported: true/false coppa_supported: true/false schain_supported: true/false @@ -1098,11 +1099,12 @@ dchain_supported: true/false userId: (list of supported vendors) media_types: banner, video, native safeframes_ok: true/false -bidder_supports_deals: true/false +deals_supported: true/false +floors_supported: true/false +fpd_supported: true/false pbjs: true/false pbs: true/false prebid_member: true/false -gvl_id: none --- ### Note: diff --git a/dev-docs/bidder-data.csv b/dev-docs/bidder-data.csv index 0cbf9761ab..b633024b54 100644 --- a/dev-docs/bidder-data.csv +++ b/dev-docs/bidder-data.csv @@ -2,6 +2,6 @@ layout: none search: exclude --- -bidder-code,bidder-name,banner,video,native,gdpr,schain,coppa,usp,safeframes,deals,client-adapter,server-adapter,user-ids,usp,mobile-apps,floors,prebid-member -{% assign bidder_pages = site.pages | where: "layout", "bidder" %}{% for page in bidder_pages %}{{ page.biddercode }},{{ page.title }},{% if page.media_types contains 'banner' %}yes{% else %}no{% endif %},{% if page.media_types contains 'video' %}yes{% else %}no{% endif %},{% if page.media_types contains 'native' %}yes{% else %}no{% endif %},{% if page.gdpr_supported == true %}yes{% else %}no{% endif %},{% if page.schain_supported == true %}yes{% else %}no{% endif %},{% if page.coppa_supported == true %}yes{% else %}no{% endif %},{% if page.usp_supported == true %}yes{% else %}no{% endif %},{% if page.safeframes_ok and page.safeframes_ok == false %}no{% elsif page.safeframes_ok and page.safeframes_ok == true %}yes{% else %}check with bidder{% endif %},{% if page.bidder_supports_deals and page.bidder_supports_deals == false %}no{% else %}yes{% endif %},{% if page.pbjs == true %}yes{% else %}no{% endif %},{% if page.pbs == true %}yes{% else %}no{% endif %},{% if page.userIds and page.userIds != '' %}"{{page.userIds}}"{% else %}none{% endif %},{% if page.usp_supported == true %}yes{% else %}no{% endif %},{% if page.pbs_app_supported and page.pbs_app_supported == false %}no{% elsif page.pbs_app_supported and page.pbs_app_supported == true %}yes{% elsif page.pbs and page.pbs == false %}no{% elsif page.pbs==nil %}no{% else %}check with bidder{% endif %},{% if page.getFloor == true %}yes{% else %}no{% endif %},{% if page.prebid_member == true %}yes{% else %}no{% endif %} +bidder-code,bidder-name,banner,video,native,gdpr,schain,coppa,usp,safeframes,deals,client-adapter,server-adapter,user-ids,usp,mobile-apps,floors,fpd,prebid-member +{% assign bidder_pages = site.pages | where: "layout", "bidder" %}{% for page in bidder_pages %}{{ page.biddercode }},{{ page.title }},{% if page.media_types contains 'banner' %}yes{% else %}no{% endif %},{% if page.media_types contains 'video' %}yes{% else %}no{% endif %},{% if page.media_types contains 'native' %}yes{% else %}no{% endif %},{% if page.gdpr_supported == true %}yes{% else %}no{% endif %},{% if page.schain_supported == true %}yes{% else %}no{% endif %},{% if page.coppa_supported == true %}yes{% else %}no{% endif %},{% if page.usp_supported == true %}yes{% else %}no{% endif %},{% if page.safeframes_ok and page.safeframes_ok == false %}no{% elsif page.safeframes_ok and page.safeframes_ok == true %}yes{% else %}check with bidder{% endif %},{% if page.deals_supported and page.deals_supported == false %}no{% else %}yes{% endif %},{% if page.pbjs == true %}yes{% else %}no{% endif %},{% if page.pbs == true %}yes{% else %}no{% endif %},{% if page.userIds and page.userIds != '' %}"{{page.userIds}}"{% else %}none{% endif %},{% if page.usp_supported == true %}yes{% else %}no{% endif %},{% if page.pbs_app_supported and page.pbs_app_supported == false %}no{% elsif page.pbs_app_supported and page.pbs_app_supported == true %}yes{% elsif page.pbs and page.pbs == false %}no{% elsif page.pbs==nil %}no{% else %}check with bidder{% endif %},{% if page.floors_supported == true %}yes{% else %}no{% endif %},{% if page.fpd_supported == true %}yes{% elsif page.fpd_supported == false %}no{% else %}check with bidder{% endif %},{% if page.prebid_member == true %}yes{% else %}no{% endif %} {% endfor %} diff --git a/dev-docs/bidders/33across.md b/dev-docs/bidders/33across.md index 17d07de9f0..cc457b8713 100644 --- a/dev-docs/bidders/33across.md +++ b/dev-docs/bidders/33across.md @@ -7,7 +7,7 @@ pbs: true biddercode: 33across media_types: banner, video gdpr_supported: true -getFloor: true +floors_supported: true schain_supported: true usp_supported: true userIds: all diff --git a/dev-docs/bidders/aceex.md b/dev-docs/bidders/aceex.md index 23da889ad2..e380d3aa54 100644 --- a/dev-docs/bidders/aceex.md +++ b/dev-docs/bidders/aceex.md @@ -10,7 +10,7 @@ schain_supported: true userId: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId media_types: banner, video, native safeframes_ok: true -bidder_supports_deals: true +deals_supported: true pbjs: false pbs: true --- diff --git a/dev-docs/bidders/acuityads.md b/dev-docs/bidders/acuityads.md index a6f10c6e20..95d4784821 100644 --- a/dev-docs/bidders/acuityads.md +++ b/dev-docs/bidders/acuityads.md @@ -10,7 +10,7 @@ schain_supported: true userId: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId media_types: banner, video, native safeframes_ok: true -bidder_supports_deals: true +deals_supported: true pbjs: false pbs: true --- diff --git a/dev-docs/bidders/adagio.md b/dev-docs/bidders/adagio.md index 529051555c..8c311afc1a 100644 --- a/dev-docs/bidders/adagio.md +++ b/dev-docs/bidders/adagio.md @@ -6,7 +6,7 @@ pbjs: true biddercode: adagio media_types: banner, native, video userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, pubProvidedId, sharedId, unifiedId -getFloor: true +floors_supported: true gdpr_supported: true usp_supported: true coppa_supported: true @@ -14,6 +14,7 @@ schain_supported: true gvl_id: 617 prebid_member: true pbs: true +fpd_supported: true --- ### Note diff --git a/dev-docs/bidders/adf.md b/dev-docs/bidders/adf.md index 44045bed9f..128386ea0a 100644 --- a/dev-docs/bidders/adf.md +++ b/dev-docs/bidders/adf.md @@ -13,7 +13,8 @@ schain_supported: true userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, sharedId, unifiedId gvl_id: 50 prevBiddercode: adformOpenRTB -getFloor: true +floors_supported: true +fpd_supported: true --- ### Bid params diff --git a/dev-docs/bidders/admixer.md b/dev-docs/bidders/admixer.md index 564b39711d..67ebf06294 100644 --- a/dev-docs/bidders/admixer.md +++ b/dev-docs/bidders/admixer.md @@ -9,6 +9,7 @@ media_types: video gdpr_supported: true usp_supported: true schain_supported: true +fpd_supported: true gvl_id: 511 --- diff --git a/dev-docs/bidders/adnuntius.md b/dev-docs/bidders/adnuntius.md index cdb2766ccd..37b643c393 100644 --- a/dev-docs/bidders/adnuntius.md +++ b/dev-docs/bidders/adnuntius.md @@ -6,6 +6,7 @@ pbjs: true biddercode: adnuntius media_types: banner gdpr_supported: true +fpd_supported: true --- ### Bid Params diff --git a/dev-docs/bidders/adpone.md b/dev-docs/bidders/adpone.md index 608b228ff1..c2da708ebd 100644 --- a/dev-docs/bidders/adpone.md +++ b/dev-docs/bidders/adpone.md @@ -5,7 +5,7 @@ description: Prebid Adpone Bidder Adaptor pbjs: true pbs: true biddercode: adpone -bidder_supports_deals: false +deals_supported: false media_types: banner gvl_id: 799 --- diff --git a/dev-docs/bidders/adquery.md b/dev-docs/bidders/adquery.md index 6276c9650c..8ab327d42b 100644 --- a/dev-docs/bidders/adquery.md +++ b/dev-docs/bidders/adquery.md @@ -16,4 +16,4 @@ gvl_id: 902 | Name | Scope | Description | Example | Type | |---------------|----------|---------------|-------------------------------------------|-----------| | `placementId` | required | Placement ID | `6d93f2a0e5f0fe2cc3a6e9e3ade964b43b07f897`| `string` | -| `type` | required | Ad Type | `banner300x250` | `string` | \ No newline at end of file +| `type` | required | Ad Type | `banner300x250` | `string` | diff --git a/dev-docs/bidders/adrelevantis.md b/dev-docs/bidders/adrelevantis.md index 97ceab7c8a..1d132f2b03 100644 --- a/dev-docs/bidders/adrelevantis.md +++ b/dev-docs/bidders/adrelevantis.md @@ -4,6 +4,7 @@ title: Adrelevantis description: Prebid Adrelevantis (adrelevantis.xyz) Bidder Adaptor biddercode: adrelevantis media_types: banner, video, native +fpd_supported: true pbjs: true --- diff --git a/dev-docs/bidders/adriver.md b/dev-docs/bidders/adriver.md index 3461aceb2c..1a69fb4108 100644 --- a/dev-docs/bidders/adriver.md +++ b/dev-docs/bidders/adriver.md @@ -4,9 +4,9 @@ title: adriver description: Adriver adapter biddercode: adriver pbjs: true -bidder_supports_deals: true +deals_supported: true userIds: sharedId, id5Id, uid2Id -getFloor: true +floors_supported: true --- diff --git a/dev-docs/bidders/adxcg.md b/dev-docs/bidders/adxcg.md index 9f85e7170e..f7803f0ac5 100644 --- a/dev-docs/bidders/adxcg.md +++ b/dev-docs/bidders/adxcg.md @@ -2,7 +2,7 @@ layout: bidder title: adxcg description: Prebid adxcg bidder adaptor -bidder_supports_deals: true +deals_supported: true pbjs: true pbs: true pbs_app_supported: true diff --git a/dev-docs/bidders/adyoulike.md b/dev-docs/bidders/adyoulike.md index 75de6f1c3d..a8f6b5a454 100644 --- a/dev-docs/bidders/adyoulike.md +++ b/dev-docs/bidders/adyoulike.md @@ -8,7 +8,7 @@ media_types: banner, video, native biddercode: adyoulike gdpr_supported: true usp_supported: true -getFloor: true +floors_supported: true --- ### Note: diff --git a/dev-docs/bidders/amx.md b/dev-docs/bidders/amx.md index 44b91b61e0..f8f3ff6574 100644 --- a/dev-docs/bidders/amx.md +++ b/dev-docs/bidders/amx.md @@ -14,6 +14,7 @@ media_types: banner, video pbjs: true pbs: true pbs_app_supported: true +fpd_supported: true gvl_id: 737 --- diff --git a/dev-docs/bidders/apacdex.md b/dev-docs/bidders/apacdex.md index 73af7e1fab..9fd5058aa6 100644 --- a/dev-docs/bidders/apacdex.md +++ b/dev-docs/bidders/apacdex.md @@ -9,7 +9,7 @@ gdpr_supported: true schain_supported: true usp_supported: true userIds: all -getFloor: true +floors_supported: true --- ### Table of Contents @@ -171,4 +171,4 @@ var outstreamAdUnit = { }; ``` mediaTypes.video object reference to section 3.2.7 Object: Video in the OpenRTB 2.5 document -You must review all video parameters to ensure validity for your player and DSPs \ No newline at end of file +You must review all video parameters to ensure validity for your player and DSPs diff --git a/dev-docs/bidders/appnexus.md b/dev-docs/bidders/appnexus.md index 6e848d7215..0d9360bb28 100644 --- a/dev-docs/bidders/appnexus.md +++ b/dev-docs/bidders/appnexus.md @@ -10,7 +10,8 @@ userIds: criteo, unifiedId, netId, identityLink, flocId, uid2 schain_supported: true coppa_supported: true usp_supported: true -getFloor: true +floors_supported: true +fpd_supported: true pbjs: true pbs: true gvl_id: 32 diff --git a/dev-docs/bidders/aso.md b/dev-docs/bidders/aso.md index c1e59bccab..8e4fae6934 100644 --- a/dev-docs/bidders/aso.md +++ b/dev-docs/bidders/aso.md @@ -7,10 +7,10 @@ gdpr_supported: true usp_supported: true media_types: video safeframes_ok: true -bidder_supports_deals: false +deals_supported: false pbjs: true pbs: false -getFloor: true +floors_supported: true --- ### Note: @@ -55,4 +55,4 @@ pbjs.setConfig({ url: 'https://prebid.adnxs.com/pbc/v1/cache' } }); -``` \ No newline at end of file +``` diff --git a/dev-docs/bidders/automatad.md b/dev-docs/bidders/automatad.md index cd1c2045b4..27714c6d15 100644 --- a/dev-docs/bidders/automatad.md +++ b/dev-docs/bidders/automatad.md @@ -5,6 +5,7 @@ description: Automatad OpenRTB Bid Adapter biddercode: automatad pbjs: true media_types: banner +fpd_supported: true --- #### Bid Params diff --git a/dev-docs/bidders/beachfront.md b/dev-docs/bidders/beachfront.md index 439bd85d1e..aa28971a92 100644 --- a/dev-docs/bidders/beachfront.md +++ b/dev-docs/bidders/beachfront.md @@ -4,7 +4,7 @@ title: Beachfront description: Prebid Beachfront Bidder Adapter biddercode: beachfront media_types: video -getFloor: true +floors_supported: true gdpr_supported: true usp_supported: true userIds: unifiedId, identityLink, uid2, haloId diff --git a/dev-docs/bidders/beop.md b/dev-docs/bidders/beop.md index f1728716d5..3f7786d8b7 100644 --- a/dev-docs/bidders/beop.md +++ b/dev-docs/bidders/beop.md @@ -4,6 +4,7 @@ title: BeOp description: BeOp Bidder Adaptor pbjs: true biddercode: beop +fpd_supported: true --- ### Bid Params diff --git a/dev-docs/bidders/bidmachine.md b/dev-docs/bidders/bidmachine.md index c314667874..82f1dd997e 100644 --- a/dev-docs/bidders/bidmachine.md +++ b/dev-docs/bidders/bidmachine.md @@ -11,7 +11,7 @@ schain_supported: true dchain_supported: false media_types: banner, video safeframes_ok: true -bidder_supports_deals: false +deals_supported: false pbjs: false pbs: true pbs_app_supported: true diff --git a/dev-docs/bidders/bizzclick.md b/dev-docs/bidders/bizzclick.md index ca37393154..57846d529e 100644 --- a/dev-docs/bidders/bizzclick.md +++ b/dev-docs/bidders/bizzclick.md @@ -9,7 +9,7 @@ coppa_supported: true schain_supported: true media_types: banner, video, native safeframes_ok: true -bidder_supports_deals: true +deals_supported: true pbjs: true --- diff --git a/dev-docs/bidders/bmtm.md b/dev-docs/bidders/bmtm.md index df49410149..3d99a82779 100644 --- a/dev-docs/bidders/bmtm.md +++ b/dev-docs/bidders/bmtm.md @@ -4,7 +4,7 @@ title: Bright Mountain Media description: Prebid Bright Mountain Media Bidder Adapter biddercode: bmtm media_types: banner, video -getFloor: true +floors_supported: true schain_supported: true pbjs: true pbs: true diff --git a/dev-docs/bidders/brave.md b/dev-docs/bidders/brave.md index b9d9213a0b..e26f0f7249 100644 --- a/dev-docs/bidders/brave.md +++ b/dev-docs/bidders/brave.md @@ -9,7 +9,7 @@ coppa_supported: true schain_supported: true media_types: banner, video, native safeframes_ok: true -bidder_supports_deals: true +deals_supported: true pbjs: true pbs: false --- diff --git a/dev-docs/bidders/colossusssp.md b/dev-docs/bidders/colossusssp.md index 6a9aafeca4..50931a7c99 100644 --- a/dev-docs/bidders/colossusssp.md +++ b/dev-docs/bidders/colossusssp.md @@ -8,6 +8,7 @@ schain_supported: true media_types: banner, video, native userIds: britepoolid, identityLink, unifiedId, id5Id, uid2 gdpr: true +fpd_supported: true pbjs: true pbs: false --- diff --git a/dev-docs/bidders/connectad.md b/dev-docs/bidders/connectad.md index 2a8c0e1558..b5f67acab3 100644 --- a/dev-docs/bidders/connectad.md +++ b/dev-docs/bidders/connectad.md @@ -11,7 +11,7 @@ schain_supported: true userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId prebid_member: true safeframes_ok: true -getFloor: true +floors_supported: true pbjs: true pbs: true gvl_id: 138 diff --git a/dev-docs/bidders/contentexchange.md b/dev-docs/bidders/contentexchange.md index 10ea1669c4..364ee93d6f 100644 --- a/dev-docs/bidders/contentexchange.md +++ b/dev-docs/bidders/contentexchange.md @@ -18,4 +18,4 @@ pbs_app_supported: false | Name | Scope | Description | Example | Type | |----------------|----------|----------------------------------------------------------|------------|-----------| | `placementId` | required | Placement Id will be generated on ContentExchange Platform. | `'1234'` | `string` | -| `adFormat` | required | `[banner, video, native]` | `'banner'` | `string` | \ No newline at end of file +| `adFormat` | required | `[banner, video, native]` | `'banner'` | `string` | diff --git a/dev-docs/bidders/criteo.md b/dev-docs/bidders/criteo.md index fe5d109427..25221baaae 100644 --- a/dev-docs/bidders/criteo.md +++ b/dev-docs/bidders/criteo.md @@ -10,7 +10,8 @@ gdpr_supported: true usp_supported: true userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, pubProvidedId, sharedId, unifiedId prebid_member: true -getFloor: false* +floors_supported: false +fpd_supported: true gvl_id: 91 --- ### Notes diff --git a/dev-docs/bidders/datablocks.md b/dev-docs/bidders/datablocks.md index 761405f240..58aea81085 100644 --- a/dev-docs/bidders/datablocks.md +++ b/dev-docs/bidders/datablocks.md @@ -12,6 +12,7 @@ pbs_app_supported: true schain_supported: true usp_supported: true userIds: criteo,unifiedId,netId,pubcid +fpd_supported: true --- ### Bid Params diff --git a/dev-docs/bidders/districtmdmx.md b/dev-docs/bidders/districtmdmx.md index 5aa40aa58a..fef2443cc5 100644 --- a/dev-docs/bidders/districtmdmx.md +++ b/dev-docs/bidders/districtmdmx.md @@ -6,7 +6,7 @@ pbjs: true biddercode: districtmDMX gdpr_supported: true schain_supported: true -getFloor: true +floors_supported: true usp_supported: true coppa_supported: true userIds: britepoolId, criteo, id5Id, identityLink, intentiq, liveIntentId, netId, parrableId, pubCommonId, unifiedId diff --git a/dev-docs/bidders/epom.md b/dev-docs/bidders/epom.md index 228670bceb..d1d5897a28 100644 --- a/dev-docs/bidders/epom.md +++ b/dev-docs/bidders/epom.md @@ -10,7 +10,7 @@ coppa_supported: true schain_supported: false media_types: banner, video, native safeframes_ok: true -bidder_supports_deals: true +deals_supported: true pbjs: false pbs: true pbs_app_supported: true diff --git a/dev-docs/bidders/etarget.md b/dev-docs/bidders/etarget.md index 251697a776..41c3198529 100644 --- a/dev-docs/bidders/etarget.md +++ b/dev-docs/bidders/etarget.md @@ -6,6 +6,7 @@ pbjs: true biddercode: etarget media_types: banner, video gdpr_supported: true +fpd_supported: true --- diff --git a/dev-docs/bidders/getintent.md b/dev-docs/bidders/getintent.md index 30fffcabfd..671ec6fe1f 100644 --- a/dev-docs/bidders/getintent.md +++ b/dev-docs/bidders/getintent.md @@ -5,7 +5,7 @@ description: Prebid GetIntent Bidder Adaptor pbjs: true biddercode: getintent media_types: video, banner -getFloor: true +floors_supported: true --- diff --git a/dev-docs/bidders/gothamads.md b/dev-docs/bidders/gothamads.md index e3fabc29e7..d41aa86cbd 100644 --- a/dev-docs/bidders/gothamads.md +++ b/dev-docs/bidders/gothamads.md @@ -10,7 +10,7 @@ ccpa_supported: true schain_supported: true media_types: banner, video, native safeframes_ok: true -bidder_supports_deals: true +deals_supported: true pbjs: true --- diff --git a/dev-docs/bidders/grid.md b/dev-docs/bidders/grid.md index c6a619cc28..8ca173f0fd 100644 --- a/dev-docs/bidders/grid.md +++ b/dev-docs/bidders/grid.md @@ -9,10 +9,11 @@ media_types: banner, video gdpr_supported: true usp_supported: true schain_supported: true -getFloor: true +floors_supported: true userIds: all tcf2_supported: true coppa_supported: true +fpd_supported: true --- diff --git a/dev-docs/bidders/gridNM.md b/dev-docs/bidders/gridNM.md index 3524b8df87..fc92e91a17 100644 --- a/dev-docs/bidders/gridNM.md +++ b/dev-docs/bidders/gridNM.md @@ -7,6 +7,7 @@ biddercode: gridNM media_types: video gdpr_supported: true usp_supported: true +fpd_supported: true --- diff --git a/dev-docs/bidders/gumgum.md b/dev-docs/bidders/gumgum.md index b3427cf8b4..c655f75fd9 100644 --- a/dev-docs/bidders/gumgum.md +++ b/dev-docs/bidders/gumgum.md @@ -8,10 +8,11 @@ pbs_app_supported: true biddercode: gumgum media_types: banner, video schain_supported: true -getFloor: true +floors_supported: true userIds: unifiedId, identityLink gdpr_supported: true usp_supported: true +fpd_supported: true --- ### Note: diff --git a/dev-docs/bidders/huaweiads.md b/dev-docs/bidders/huaweiads.md index 913f164f37..1211990c2b 100644 --- a/dev-docs/bidders/huaweiads.md +++ b/dev-docs/bidders/huaweiads.md @@ -6,7 +6,7 @@ biddercode: huaweiads gvl_id: 856 media_types: banner, video, native safeframes_ok: false -bidder_supports_deals: true +deals_supported: true pbjs: false pbs: true pbs_app_supported: true diff --git a/dev-docs/bidders/inmar.md b/dev-docs/bidders/inmar.md index 23f028e296..f00dc47243 100644 --- a/dev-docs/bidders/inmar.md +++ b/dev-docs/bidders/inmar.md @@ -8,7 +8,8 @@ usp_supported: true userIds: identityLink, liveIntentId, unifiedId, pubCommonId, pubProvidedId, sharedId media_types: banner, video safeframes_ok: false -bidder_supports_deals: true +deals_supported: true +fpd_supported: true pbjs: true --- ### Note: diff --git a/dev-docs/bidders/integr8.md b/dev-docs/bidders/integr8.md index 6f1e4a71ab..27662ef942 100644 --- a/dev-docs/bidders/integr8.md +++ b/dev-docs/bidders/integr8.md @@ -14,4 +14,4 @@ media_types: banner, video |---------------|----------|------------------------------------------------------------------------|--------------------|-----------| | `propertyId` | required |Property id | `"12345"` | `string` | | `placementId` | required |Placement id | `"54321"` | `string` | -| `data` | optional |Catalog data (contents) and/or inventory data (custom key/value pairs) | `{catalogs: [{ catalogId: "699229", items: ["193", "4", "1"] }], inventory: { category: ["tech"], query: ["iphone 12"] }}` | `object` | \ No newline at end of file +| `data` | optional |Catalog data (contents) and/or inventory data (custom key/value pairs) | `{catalogs: [{ catalogId: "699229", items: ["193", "4", "1"] }], inventory: { category: ["tech"], query: ["iphone 12"] }}` | `object` | diff --git a/dev-docs/bidders/iqm.md b/dev-docs/bidders/iqm.md index f4159f0ec0..a3251a5a72 100644 --- a/dev-docs/bidders/iqm.md +++ b/dev-docs/bidders/iqm.md @@ -80,4 +80,4 @@ var adUnits = [{ }] }; -``` \ No newline at end of file +``` diff --git a/dev-docs/bidders/ix.md b/dev-docs/bidders/ix.md index 006fac2fc4..c19447d1ee 100644 --- a/dev-docs/bidders/ix.md +++ b/dev-docs/bidders/ix.md @@ -10,9 +10,10 @@ pbs_app_supported: true schain_supported: true coppa_supported: true gdpr_supported: true -getFloor: true +floors_supported: true usp_supported: true media_types: banner, video +fpd_supported: true gvl_id: 10 prebid_member: yes --- diff --git a/dev-docs/bidders/jixie.md b/dev-docs/bidders/jixie.md index b9241665de..e2945d6bc5 100644 --- a/dev-docs/bidders/jixie.md +++ b/dev-docs/bidders/jixie.md @@ -5,7 +5,7 @@ description: Prebid Jixie Bidder Adaptor pbjs: true pbs: true biddercode: jixie -bidder_supports_deals: false +deals_supported: false media_types: banner, video gdpr_supported: false --- diff --git a/dev-docs/bidders/kobler.md b/dev-docs/bidders/kobler.md index a93b1032b3..3a2951ce6d 100644 --- a/dev-docs/bidders/kobler.md +++ b/dev-docs/bidders/kobler.md @@ -5,8 +5,8 @@ description: Kobler Bidder Adapter biddercode: kobler pbjs: true media_types: banner -getFloor: true -bidder_supports_deals: true +floors_supported: true +deals_supported: true --- ### Note: diff --git a/dev-docs/bidders/logicad.md b/dev-docs/bidders/logicad.md index 57b554c012..f0c28c3825 100644 --- a/dev-docs/bidders/logicad.md +++ b/dev-docs/bidders/logicad.md @@ -6,7 +6,7 @@ pbjs: true pbs: true pbs_app_supported: true biddercode: logicad -bidder_supports_deals: false +deals_supported: false media_types: banner, native userIds: all gdpr_supported: false diff --git a/dev-docs/bidders/marsmedia.md b/dev-docs/bidders/marsmedia.md index a38b704088..8281cb732f 100644 --- a/dev-docs/bidders/marsmedia.md +++ b/dev-docs/bidders/marsmedia.md @@ -7,7 +7,7 @@ pbs: true biddercode: marsmedia media_types: video, banner gdpr_supported: true -getFloor: true +floors_supported: true schain_supported: true usp_supported: true coppa_supported: true diff --git a/dev-docs/bidders/mathildeads.md b/dev-docs/bidders/mathildeads.md index f4e21f84af..c7dbe99b03 100644 --- a/dev-docs/bidders/mathildeads.md +++ b/dev-docs/bidders/mathildeads.md @@ -17,4 +17,4 @@ pbs_app_supported: false {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |----------------|----------|----------------------------------------------------------|------------|-----------| -| `placementId` | required | Placement Id will be generated on MathildeAds Platform. | `'1234'` | `string` | \ No newline at end of file +| `placementId` | required | Placement Id will be generated on MathildeAds Platform. | `'1234'` | `string` | diff --git a/dev-docs/bidders/mediakeys.md b/dev-docs/bidders/mediakeys.md index 931809f02a..8c9a8d5c81 100644 --- a/dev-docs/bidders/mediakeys.md +++ b/dev-docs/bidders/mediakeys.md @@ -6,14 +6,14 @@ biddercode: mediakeys media_types: banner gvl_id: 498 pbjs: true -getFloor: true +floors_supported: true gdpr_supported: true usp_supported: true coppa_supported: true schain_supported: true safeframes_ok: true userIds: all - +fpd_supported: true --- ### Note: diff --git a/dev-docs/bidders/medianet.md b/dev-docs/bidders/medianet.md index 73de20eb45..594e349bc7 100644 --- a/dev-docs/bidders/medianet.md +++ b/dev-docs/bidders/medianet.md @@ -11,7 +11,8 @@ prebid_member: true pbjs: true gvl_id: 142 schain_supported: true -getFloor: true +floors_supported: true +fpd_supported: true --- ### Bid Params diff --git a/dev-docs/bidders/nobid.md b/dev-docs/bidders/nobid.md index 7f8cfd41dd..02d54e53c0 100644 --- a/dev-docs/bidders/nobid.md +++ b/dev-docs/bidders/nobid.md @@ -13,6 +13,7 @@ schain_supported: true coppa_supported: true userId: criteo, unifiedId, id5Id safeframes_ok: true +fpd_supported: true --- ### Bid Params diff --git a/dev-docs/bidders/ogury.md b/dev-docs/bidders/ogury.md index 8b9865d7ab..a1ae8c5f42 100644 --- a/dev-docs/bidders/ogury.md +++ b/dev-docs/bidders/ogury.md @@ -8,11 +8,11 @@ gvl_id: 31 usp_supported: false coppa_supported: false schain_supported: false -getFloor: true +floors_supported: true dchain_supported: false media_types: banner safeframes_ok: false -bidder_supports_deals: false +deals_supported: false pbjs: true pbs: false prebid_member: false diff --git a/dev-docs/bidders/openx.md b/dev-docs/bidders/openx.md index 318a44406b..3adddca5d9 100644 --- a/dev-docs/bidders/openx.md +++ b/dev-docs/bidders/openx.md @@ -10,9 +10,10 @@ schain_supported: true gdpr_supported: true usp_supported: true coppa_supported: true -getFloor: true +floors_supported: true userIds: admixerId, amxId, britepoolId, criteo, dapId, deepintentId, dmdId, fabrickId, flocId, haloId, id5Id, identityLink, idxId, intentIqId, liveIntentId, lotamePanoramaId, merkleId, mwOpenLinkId, netId, nextrollId, novatiq, parrableId, pubCommonId, quantcastId, sharedId, tapadId, uid2, unifiedId, verizonMediaId, zeotapIdPlus prebid_member: true +fpd_supported: true gvl_id: 69 --- diff --git a/dev-docs/bidders/operaads.md b/dev-docs/bidders/operaads.md index b10965607c..49393966e3 100644 --- a/dev-docs/bidders/operaads.md +++ b/dev-docs/bidders/operaads.md @@ -11,7 +11,7 @@ schain_supported: true dchain_supported: false media_types: banner, video, native safeframes_ok: false -bidder_supports_deals: false +deals_supported: false pbjs: true pbs: true prebid_member: false @@ -28,4 +28,4 @@ If you have any questions regarding set up, please reach out to your account man |-------------|----------|------------------------|------------------|----------| | `placementId`| required | Placement Id | `s12345678` | `string` | | `endpointId`| required | Endpoint ID | `ep1234566` | `string` | -| `publisherId`| required | Publisher ID | `pub123456` | `string` | \ No newline at end of file +| `publisherId`| required | Publisher ID | `pub123456` | `string` | diff --git a/dev-docs/bidders/optout.md b/dev-docs/bidders/optout.md index dc558f411a..a4a0ebb62c 100644 --- a/dev-docs/bidders/optout.md +++ b/dev-docs/bidders/optout.md @@ -6,6 +6,7 @@ pbjs: true pbs: true biddercode: optout gdpr_supported: true +fpd_supported: true gvl_id: 227 --- diff --git a/dev-docs/bidders/ozone.md b/dev-docs/bidders/ozone.md index 8b59183e35..d576a29689 100644 --- a/dev-docs/bidders/ozone.md +++ b/dev-docs/bidders/ozone.md @@ -8,7 +8,8 @@ media_types: banner gdpr_supported: true userIds: criteo, id5Id, tdid, identityLink, liveIntentId, parrableId, pubCommonId, lotamePanoramaId, sharedId, fabrickId gvl_id: 524 -bidder_supports_deals: true +deals_supported: true +fpd_supported: true --- diff --git a/dev-docs/bidders/pangle.md b/dev-docs/bidders/pangle.md index b7168ad589..6d4da22aea 100644 --- a/dev-docs/bidders/pangle.md +++ b/dev-docs/bidders/pangle.md @@ -8,7 +8,7 @@ coppa_supported: true schain_supported: false media_types: banner, video, native safeframes_ok: false -bidder_supports_deals: false +deals_supported: false pbjs: false pbs: true pbs_app_supported: true diff --git a/dev-docs/bidders/pixfuture.md b/dev-docs/bidders/pixfuture.md index c718b385dc..58159bb843 100644 --- a/dev-docs/bidders/pixfuture.md +++ b/dev-docs/bidders/pixfuture.md @@ -8,6 +8,7 @@ gdpr_supported: true prebid_member: false coppa_supported: true usp_supported: true +fpd_supported: true userIds: flocId, criteoId, unifiedId, id5Id, sharedId, identityLink, liveIntentId, fabrickId pbs: false pbjs: true diff --git a/dev-docs/bidders/proxistore.md b/dev-docs/bidders/proxistore.md index 172c18cc8b..1b111d30da 100644 --- a/dev-docs/bidders/proxistore.md +++ b/dev-docs/bidders/proxistore.md @@ -5,6 +5,7 @@ description: Prebid Proxistore Bidder Adapter pbjs: true biddercode: proxistore gdpr_supported: true +fpd_supported: true --- diff --git a/dev-docs/bidders/pubgenius.md b/dev-docs/bidders/pubgenius.md index 23cb4e5fab..3085968a32 100644 --- a/dev-docs/bidders/pubgenius.md +++ b/dev-docs/bidders/pubgenius.md @@ -5,7 +5,7 @@ description: Prebid pubGENIUS Bidder Adaptor pbjs: true biddercode: pubgenius media_types: banner -getFloor: true +floors_supported: true gdpr_supported: true usp_supported: true schain_supported: true diff --git a/dev-docs/bidders/pubmatic.md b/dev-docs/bidders/pubmatic.md index 0265738a9f..f8cbcd0a12 100644 --- a/dev-docs/bidders/pubmatic.md +++ b/dev-docs/bidders/pubmatic.md @@ -8,13 +8,14 @@ gdpr_supported: true usp_supported: true coppa_supported: true schain_supported: true -getFloor: true +floors_supported: true userIds: all prebid_member: true safeframes_ok: true pbjs: true pbs: true pbs_app_supported: true +fpd_supported: true gvl_id: 76 --- diff --git a/dev-docs/bidders/pwbid.md b/dev-docs/bidders/pwbid.md index 48c08c33b4..26715707a2 100644 --- a/dev-docs/bidders/pwbid.md +++ b/dev-docs/bidders/pwbid.md @@ -12,7 +12,7 @@ schain_supported: true prebid_member: true userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, pubProvidedId, sharedId, unifiedId tcf1_supported: true -getFloor: false +floors_supported: false gvl_id: 842 --- diff --git a/dev-docs/bidders/quantumdex.md b/dev-docs/bidders/quantumdex.md index 1119a035c4..bc03315282 100644 --- a/dev-docs/bidders/quantumdex.md +++ b/dev-docs/bidders/quantumdex.md @@ -10,8 +10,8 @@ gdpr_supported: true schain_supported: true usp_supported: true userIds: all -getFloor: true +floors_supported: true --- # Description -Quantumdex is an aliased bidder of Apacdex bid adapter. Please refer to [Apacdex documentation](https://docs.prebid.org/dev-docs/bidders/apacdex) for bid parameters and implementation guide. \ No newline at end of file +Quantumdex is an aliased bidder of Apacdex bid adapter. Please refer to [Apacdex documentation](https://docs.prebid.org/dev-docs/bidders/apacdex) for bid parameters and implementation guide. diff --git a/dev-docs/bidders/rise.md b/dev-docs/bidders/rise.md index b66676d156..01585fbb75 100644 --- a/dev-docs/bidders/rise.md +++ b/dev-docs/bidders/rise.md @@ -8,8 +8,9 @@ media_types: video schain_supported: true gdpr_supported: true usp_supported: true -getFloor: true +floors_supported: true userIds: all +fpd_supported: true gvl_id: 1043 --- diff --git a/dev-docs/bidders/roundel.md b/dev-docs/bidders/roundel.md index 61fa4d03b5..fed8e9a1f5 100644 --- a/dev-docs/bidders/roundel.md +++ b/dev-docs/bidders/roundel.md @@ -22,4 +22,4 @@ Roundel is an aliased bidder for Index Exchange and must be configured alongside ## Bid Params Bidder params for roundel follow the same structure as the Index Exchange bidder. Please reference configuration examples [here](/dev-docs/bidders/ix). - \ No newline at end of file + diff --git a/dev-docs/bidders/rubicon.md b/dev-docs/bidders/rubicon.md index bacf84b2f8..aa23cbfb44 100644 --- a/dev-docs/bidders/rubicon.md +++ b/dev-docs/bidders/rubicon.md @@ -7,15 +7,16 @@ gdpr_supported: true usp_supported: true coppa_supported: true schain_supported: true -getFloor: true +floors_supported: true media_types: video userIds: all prebid_member: true safeframes_ok: true -bidder_supports_deals: true +deals_supported: true pbjs: true pbs: true pbs_app_supported: true +fpd_supported: true gvl_id: 52 --- diff --git a/dev-docs/bidders/sharethrough.md b/dev-docs/bidders/sharethrough.md index f3f12448a7..9054f5e354 100644 --- a/dev-docs/bidders/sharethrough.md +++ b/dev-docs/bidders/sharethrough.md @@ -9,6 +9,7 @@ media_types: native schain_supported: true userIds: pubCommonId, unifiedId, identityLink, id5Id, sharedId, liveIntentId usp_supported: true +fpd_supported: true pbjs: true pbs: true --- diff --git a/dev-docs/bidders/smaato.md b/dev-docs/bidders/smaato.md index 1959707e16..e8eab58473 100644 --- a/dev-docs/bidders/smaato.md +++ b/dev-docs/bidders/smaato.md @@ -13,7 +13,8 @@ pbjs: true pbs: true pbs_app_supported: true prebid_member: true -getFloor: true +floors_supported: true +fpd_supported: true --- ### Table of Contents diff --git a/dev-docs/bidders/smartadserver.md b/dev-docs/bidders/smartadserver.md index 94b852f4f0..12db35618c 100644 --- a/dev-docs/bidders/smartadserver.md +++ b/dev-docs/bidders/smartadserver.md @@ -10,7 +10,7 @@ usp_supported: true userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId pbjs: true pbs: true -getFloor: true +floors_supported: true --- ### Registration diff --git a/dev-docs/bidders/smartyads.md b/dev-docs/bidders/smartyads.md index 3b0738bee3..671cf75ef0 100644 --- a/dev-docs/bidders/smartyads.md +++ b/dev-docs/bidders/smartyads.md @@ -9,7 +9,7 @@ coppa_supported: true schain_supported: true media_types: banner, video, native safeframes_ok: true -bidder_supports_deals: true +deals_supported: true pbjs: true pbs: true --- diff --git a/dev-docs/bidders/sonobi.md b/dev-docs/bidders/sonobi.md index a484ffb450..73d3b538ff 100644 --- a/dev-docs/bidders/sonobi.md +++ b/dev-docs/bidders/sonobi.md @@ -12,6 +12,7 @@ usp_supported: true coppa_supported: true schain_supported: true pbs_app_supported: true +fpd_supported: true --- ### Note: diff --git a/dev-docs/bidders/sortable.md b/dev-docs/bidders/sortable.md index 95621f2f67..2ac98e8707 100644 --- a/dev-docs/bidders/sortable.md +++ b/dev-docs/bidders/sortable.md @@ -10,7 +10,7 @@ usp_supported: true schain_supported: true prebid_member: true gvl_id: 145 -getFloor: true +floors_supported: true userIds: all --- diff --git a/dev-docs/bidders/sovrn.md b/dev-docs/bidders/sovrn.md index 3905d8c32e..98c383cbeb 100644 --- a/dev-docs/bidders/sovrn.md +++ b/dev-docs/bidders/sovrn.md @@ -11,7 +11,8 @@ userIds: all prebid_member: true schain_supported: true gvl_id: 13 -getFloor: true +floors_supported: true +fpd_supported: true --- ### Bid Params diff --git a/dev-docs/bidders/spotx.md b/dev-docs/bidders/spotx.md index b52eef3265..db387ff88f 100644 --- a/dev-docs/bidders/spotx.md +++ b/dev-docs/bidders/spotx.md @@ -12,7 +12,7 @@ usp_supported: true safeframes_ok: false pbjs: true gvl_id: 165 -getFloor: true +floors_supported: true pbjs_version_notes: avoid 4.31-4.35 --- diff --git a/dev-docs/bidders/sspBC.md b/dev-docs/bidders/sspBC.md index 48c9ffa1e0..18889255a4 100644 --- a/dev-docs/bidders/sspBC.md +++ b/dev-docs/bidders/sspBC.md @@ -5,8 +5,9 @@ description: Prebid sspBC Bidder Adaptor pbjs: true biddercode: sspBC media_types: banner, video, native -getFloor: true +floors_supported: true gdpr_supported: true +fpd_supported: true gvl_id: 676 --- @@ -21,4 +22,4 @@ gvl_id: 676 | `publisherId` | optional | publisher id | `'728'` | `string` | | `domain` | optional | site domain | `'somesite.com'` | `string` | | `page` | optional | page url | `'somesite.com/index.html'` | `string` | -| `tmax` | optional | tmax for server connection | `400` | `integer` | \ No newline at end of file +| `tmax` | optional | tmax for server connection | `400` | `integer` | diff --git a/dev-docs/bidders/stroeerCore.md b/dev-docs/bidders/stroeerCore.md index 9c0bae38c6..307ccd4b25 100644 --- a/dev-docs/bidders/stroeerCore.md +++ b/dev-docs/bidders/stroeerCore.md @@ -13,7 +13,7 @@ prebid_member: false pbjs: true pbs: false gvl_id: 136 -bidder_supports_deals: true +deals_supported: true --- ### Bid Params diff --git a/dev-docs/bidders/targetvideo.md b/dev-docs/bidders/targetvideo.md index 1254581744..945d941235 100644 --- a/dev-docs/bidders/targetvideo.md +++ b/dev-docs/bidders/targetvideo.md @@ -10,7 +10,7 @@ userIds: criteo, unifiedId, netId, identityLink, flocId, uid2 schain_supported: true coppa_supported: true usp_supported: true -getFloor: true +floors_supported: true pbjs: true pbs: true gvl_id: 32 diff --git a/dev-docs/bidders/teads.md b/dev-docs/bidders/teads.md index ffa3ca3629..905567f301 100644 --- a/dev-docs/bidders/teads.md +++ b/dev-docs/bidders/teads.md @@ -10,7 +10,7 @@ schain_supported: true userIds: flocId, uid2Id media_types: banner, video gvl_id: 132 -bidder_supports_deals: true +deals_supported: true --- ### Note: diff --git a/dev-docs/bidders/triplelift.md b/dev-docs/bidders/triplelift.md index dfc94cf0e9..24f4b522f3 100644 --- a/dev-docs/bidders/triplelift.md +++ b/dev-docs/bidders/triplelift.md @@ -7,15 +7,16 @@ gdpr_supported: true usp_supported: true coppa_supported: true schain_supported: true -getFloor: true +floors_supported: true media_types: banner, video userIds: criteo, identityLink, unifiedId, pubCommonId prebid_member: true safeframes_ok: true -bidder_supports_deals: true +deals_supported: true pbjs: true pbs: true pbs_app_supported: true +fpd_supported: true gvl_id: 28 --- diff --git a/dev-docs/bidders/triplelift_native.md b/dev-docs/bidders/triplelift_native.md index 09829e00cf..8a8c2e00af 100644 --- a/dev-docs/bidders/triplelift_native.md +++ b/dev-docs/bidders/triplelift_native.md @@ -8,12 +8,12 @@ tcf2_supported: true usp_supported: true coppa_supported: true schain_supported: true -getFloor: true +floors_supported: true media_types: banner, video, native userIds: criteo, identityLink, unifiedId prebid_member: true safeframes_ok: true -bidder_supports_deals: true +deals_supported: true pbjs: true pbs: true pbs_app_supported: true diff --git a/dev-docs/bidders/trustx.md b/dev-docs/bidders/trustx.md index 7f530c9f1a..d0d938c60d 100644 --- a/dev-docs/bidders/trustx.md +++ b/dev-docs/bidders/trustx.md @@ -8,6 +8,7 @@ biddercode: trustx media_types: banner, video gdpr_supported: true usp_supported: true +fpd_supported: true --- diff --git a/dev-docs/bidders/ucfunnel.md b/dev-docs/bidders/ucfunnel.md index ebdfcd4052..a825957ad8 100644 --- a/dev-docs/bidders/ucfunnel.md +++ b/dev-docs/bidders/ucfunnel.md @@ -60,4 +60,4 @@ Sizes set in the `adUnit` object will also apply to the ucfunnel bid requests. | `adunitid` | required | ID for ad unit | | `string` | | `partnerid` | required | ID for partner | | `string` | -``` \ No newline at end of file +``` diff --git a/dev-docs/bidders/unruly.md b/dev-docs/bidders/unruly.md index 855719bd4c..89bdd181cd 100644 --- a/dev-docs/bidders/unruly.md +++ b/dev-docs/bidders/unruly.md @@ -7,12 +7,12 @@ gdpr_supported: true usp_supported: true coppa_supported: false schain_supported: true -getFloor: true +floors_supported: true media_types: banner, video userIds: all prebid_member: false safeframes_ok: check with bidder -bidder_supports_deals: check with bidder +deals_supported: check with bidder pbjs: true pbs: true pbs_app_supported: true diff --git a/dev-docs/bidders/valueimpression.md b/dev-docs/bidders/valueimpression.md index 75e9352402..38b86c78ca 100644 --- a/dev-docs/bidders/valueimpression.md +++ b/dev-docs/bidders/valueimpression.md @@ -10,9 +10,9 @@ gdpr_supported: true schain_supported: true usp_supported: true userIds: all -getFloor: true +floors_supported: true pbs: true --- # Description -Valueimpression is an aliased bidder of Apacdex bid adapter. Please refer to [Apacdex documentation](https://docs.prebid.org/dev-docs/bidders/apacdex) for bid parameters and implementation guide. \ No newline at end of file +Valueimpression is an aliased bidder of Apacdex bid adapter. Please refer to [Apacdex documentation](https://docs.prebid.org/dev-docs/bidders/apacdex) for bid parameters and implementation guide. diff --git a/dev-docs/bidders/visx.md b/dev-docs/bidders/visx.md index 9fdb7cb190..f39b0db05d 100644 --- a/dev-docs/bidders/visx.md +++ b/dev-docs/bidders/visx.md @@ -9,7 +9,7 @@ gvl_id: 154 schain_supported: true userIds: id5Id, unifiedId media_types: banner, video -bidder_supports_deals: true +deals_supported: true pbjs: true pbs: true --- diff --git a/dev-docs/bidders/winr.md b/dev-docs/bidders/winr.md index ba15ca619d..38a0bc7a59 100644 --- a/dev-docs/bidders/winr.md +++ b/dev-docs/bidders/winr.md @@ -9,9 +9,10 @@ userIds: criteo, unifiedId, netId, identityLink, flocId, uid2 schain_supported: true coppa_supported: true usp_supported: true -getFloor: true +floors_supported: true pbjs: true safeframes_ok: false +fpd_supported: true --- ### Note: diff --git a/dev-docs/bidders/yieldmo.md b/dev-docs/bidders/yieldmo.md index 86998b1c85..9ec5b17793 100644 --- a/dev-docs/bidders/yieldmo.md +++ b/dev-docs/bidders/yieldmo.md @@ -9,6 +9,7 @@ gdpr_supported: true usp_supported: true schain_supported: true prebid_member: true +fpd_supported: true pbjs: true pbs: true --- diff --git a/dev-docs/bidders/zeta_global.md b/dev-docs/bidders/zeta_global.md index 1167b31a9c..08a51def28 100644 --- a/dev-docs/bidders/zeta_global.md +++ b/dev-docs/bidders/zeta_global.md @@ -4,7 +4,7 @@ title: Zeta Global description: Zeta Global Prebid Bidder Adapter pbjs: true biddercode: zeta_global -bidder_supports_deals: false +deals_supported: false media_types: banner gdpr_supported: true tcf2_supported: true diff --git a/dev-docs/bidders/zeta_global_ssp.md b/dev-docs/bidders/zeta_global_ssp.md index 74c092c0fb..1a375294cc 100644 --- a/dev-docs/bidders/zeta_global_ssp.md +++ b/dev-docs/bidders/zeta_global_ssp.md @@ -4,13 +4,14 @@ title: Zeta Global Ssp description: Zeta Global Ssp Prebid Bidder Adapter pbjs: true biddercode: zeta_global_ssp -bidder_supports_deals: false +deals_supported: false media_types: banner gdpr_supported: true usp_supported: true coppa_supported: true userIds: all prebid_member: true +fpd_supported: true gvl_id: 833 --- diff --git a/dev-docs/pbs-bidders.md b/dev-docs/pbs-bidders.md index 491c6d70a2..d9b5ccee80 100644 --- a/dev-docs/pbs-bidders.md +++ b/dev-docs/pbs-bidders.md @@ -49,8 +49,9 @@ You can also download the full CSV | **User IDs** | {% if page.userIds and page.userIds != '' %}{{page.userIds}}{% else %}none{% endif %} | **USP/CCPA Support** | {% if page.usp_supported == true %}yes{% else %}no{% endif %} | | **Supply Chain Support** | {% if page.schain_supported == true %}yes{% else %}no{% endif %} | **COPPA Support** | {% if page.coppa_supported == true %}yes{% else %}no{% endif %} | | **Demand Chain Support** | {% if page.dchain_supported == true %}yes{% else %}no{% endif %} | **Safeframes OK** | {% if page.safeframes_ok and page.safeframes_ok == false %}no{% elsif page.safeframes_ok and page.safeframes_ok == true %}yes{% else %}check with bidder{% endif %} | -| **Supports Deals** | {% if page.bidder_supports_deals and page.bidder_supports_deals == false %}no{% else %}yes{% endif %} | **Prebid.js Adapter** | {% if page.pbjs == true %}yes{% else %}no{% endif %} | +| **Supports Deals** | {% if page.deals_supported and page.deals_supported == false %}no{% else %}yes{% endif %} | **Prebid.js Adapter** | {% if page.pbjs == true %}yes{% else %}no{% endif %} | | **Mobile App Support** | {% if page.pbs_app_supported and page.pbs_app_supported == false %}no{% elsif page.pbs_app_supported and page.pbs_app_supported == true %}yes{% else %}check with bidder{% endif %} | **Prebid Server Adapter** | yes | +| **Floors Support** | {% if page.floors_supported == false %}no{% elsif page.floors_supported == true %}yes{% else %}check with bidder{% endif %} | **First Party Data Support** | {% if page.fpd_supported == true %}yes{% elsif page.fpd_supported == false %}no{% else %}check with bidder{% endif %} |

    "Send All Bids" Ad Server Keys

    diff --git a/prebid-server/developers/add-new-bidder-go.md b/prebid-server/developers/add-new-bidder-go.md index 3acc766ae2..83e4e47a06 100644 --- a/prebid-server/developers/add-new-bidder-go.md +++ b/prebid-server/developers/add-new-bidder-go.md @@ -1166,7 +1166,9 @@ dchain_supported: true/false userId: media_types: banner, video, audio, native safeframes_ok: true/false -bidder_supports_deals: true/false +deals_supported: true/false +floors_supported: true/false +fpd_supported: true/false pbjs: true/false pbs: true/false pbs_app_supported: true/false @@ -1196,7 +1198,9 @@ Notes on the metadata fields: - If you support adding a demand chain on the bid response, add `dchain_supported: true`. Default is false. - If your bidder doesn't work well with safeframed creatives, add `safeframes_ok: false`. This will alert publishers to not use safeframed creatives when creating the ad server entries for your bidder. No default. - If your bidder supports mobile apps, set `pbs_app_supported: true`. No default value. -- If your bidder supports deals, set `bidder_supports_deals: true`. No default value. +- If your bidder supports deals, set `deals_supported: true`. No default value. +- If your bidder supports floors, set `floors_supported: true`. No default value. +- If your bidder supports first party data, set `fpd_supported: true`. No default value. - If you're a member of Prebid.org, add `prebid_member: true`. Default is false. diff --git a/prebid-server/developers/add-new-bidder-java.md b/prebid-server/developers/add-new-bidder-java.md index 99c3d2a78f..61471a929d 100644 --- a/prebid-server/developers/add-new-bidder-java.md +++ b/prebid-server/developers/add-new-bidder-java.md @@ -1168,7 +1168,9 @@ dchain_supported: true/false userId: media_types: banner, video, audio, native safeframes_ok: true/false -bidder_supports_deals: true/false +deals_supported: true/false +floors_supported: true/false +fpd_supported: true/false pbjs: true/false pbs: true/false pbs_app_supported: true/false @@ -1198,7 +1200,9 @@ Notes on the metadata fields: - If you support adding a demand chain on the bid response, add `dchain_supported: true`. Default is false. - If your bidder doesn't work well with safeframed creatives, add `safeframes_ok: false`. This will alert publishers to not use safeframed creatives when creating the ad server entries for your bidder. No default. - If your bidder supports mobile apps, set `pbs_app_supported`: true. No default value. -- If your bidder supports deals, set `bidder_supports_deals: true`. No default value. +- If your bidder supports deals, set `deals_supported: true`. No default value. +- If your bidder supports floors, set `floors_supported: true`. No default value. +- If your bidder supports first party data, set `fpd_supported: true`. No default value. - If you're a member of Prebid.org, add `prebid_member: true`. Default is false. From 325c9f235b257d4db0af51cda1249e4926cf0d0e Mon Sep 17 00:00:00 2001 From: Mikael Lundin Date: Wed, 6 Oct 2021 22:00:05 +0200 Subject: [PATCH 63/71] Updated bidder: Adnuntius (#3312) * Adnuntius Bidder documentation added * Fixed targeting text. * Added documentation for passing segments in the bidder config. * changed the way to send user segments to bidder. * Moved string to type + examples. * Adnuntius update for prebid server. --- dev-docs/bidders/adnuntius.md | 57 ++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/dev-docs/bidders/adnuntius.md b/dev-docs/bidders/adnuntius.md index 37b643c393..08603cfcbe 100644 --- a/dev-docs/bidders/adnuntius.md +++ b/dev-docs/bidders/adnuntius.md @@ -3,10 +3,12 @@ layout: bidder title: Adnuntius description: Prebid Adnuntius Bidder Adaptor pbjs: true +pbs: true biddercode: adnuntius media_types: banner gdpr_supported: true fpd_supported: true +gvl_id: 855 --- ### Bid Params @@ -54,23 +56,44 @@ Here's an example of sending targeting information about categories to adnuntius There's an option to send segment id in the bidder config that will be picked up and sent to the ad server. Below is an example on how to do this: ``` +pbjs.setBidderConfig({ + bidders: ['adnuntius', 'bidderB'], + config: { + ortb2: { + user: { + data: [{ + name: "adnuntius", + segment: [ + { id: "1" }, + { id: "2" } + ] + }] + } + } + } +}); +``` + +### Prebid Server Test Request - pbjs.setBidderConfig({ - bidders: ['adnuntius', 'bidderB'], - config: { - ortb2: { - user: { - data: [{ - name: "adnuntius", - segment: [ - { id: "1" }, - { id: "2" } - ] - }] - } - } - } - }); +The following test parameters can be used to verify that Prebid Server is working properly with the server-side Adnuntius adapter. the `auId` below will not return a creative. Please substitute it with your own. -´´´ +``` +"imp": [{ + "id": "impression-id", + "banner": { + "format": [{ + "w": 980, + "h": 240 + }, { + "w": 980, + "h": 360 + }] + }, + "ext": { + "adnuntius": { + "auId": "abc123" + } + } +}] ``` From 1174621dbc456ba79a44d4d2de4055fcab547f33 Mon Sep 17 00:00:00 2001 From: Mike Chowla Date: Thu, 7 Oct 2021 07:36:26 -0700 Subject: [PATCH 64/71] Added info that custom price granularity is needed when using currrencies where the nominal CPM range is greatly differnt than USD (#3326) --- prebid-server/features/pbs-currency.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/prebid-server/features/pbs-currency.md b/prebid-server/features/pbs-currency.md index 67cc607f0b..347abf63e6 100644 --- a/prebid-server/features/pbs-currency.md +++ b/prebid-server/features/pbs-currency.md @@ -104,3 +104,9 @@ Note that the `usepbsrates` flag allows you to define which rates to use when PB A dedicated endpoint on the Admin port will allow you to see what's happening within the currency converter. See [currency rates endpoint](/prebid-server/endpoints/pbs-endpoint-admin.html) for more details. + +## Price Granularity + +When converting to a currency where the typical nominal CPMs are much different than USD such as JPY or INR, use a custom price granularity that reflects the typical range of CPMs in that currency. + +The predefined price granularities such as `medium` or `dense` will not be correctly scaled and thus almost every bid will end in the top bucket. Unlike Prebid.js, Prebid Server does not support `granularityMultiplier` to scale granularities so a custom price granularity needs to be used. \ No newline at end of file From b3fdabf310f99331fc0a99e4b68bb13849a7696c Mon Sep 17 00:00:00 2001 From: Tiago Peczenyj Date: Sat, 9 Oct 2021 05:01:36 +0200 Subject: [PATCH 65/71] fix weborama conf example as in Prebid.js/modules/weboramaRtdProvider.md (#3330) * fix weborama conf example as in Prebid.js/modules/weboramaRtdProvider.md * fix closing parentesis * fix ponctuation --- dev-docs/modules/weboramaRtdProvider.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/modules/weboramaRtdProvider.md b/dev-docs/modules/weboramaRtdProvider.md index b4b1e632c9..8a686b1708 100644 --- a/dev-docs/modules/weboramaRtdProvider.md +++ b/dev-docs/modules/weboramaRtdProvider.md @@ -43,7 +43,7 @@ pbjs.setConfig( auctionDelay: 1000, dataProviders: [ { - name: "WeboramaRTDModule", + name: "weborama", waitForIt: true, params: { token: "" @@ -52,7 +52,7 @@ pbjs.setConfig( ] } ... -} +); ``` ### Parameter Descriptions for the Weborama Configuration Section From eb5d9f67f2ac3ebd1e0678263f1d323d81a55bfe Mon Sep 17 00:00:00 2001 From: Chris Huie Date: Fri, 8 Oct 2021 20:02:29 -0700 Subject: [PATCH 66/71] Ad Generation Bid Adapter: update prebid 5 complia (#3329) per pr -> https://github.com/prebid/Prebid.js/pull/7150 (reference pr https://github.com/prebid/Prebid.js/pull/7533 as well) --- dev-docs/bidders/adgeneration.md | 1 - 1 file changed, 1 deletion(-) diff --git a/dev-docs/bidders/adgeneration.md b/dev-docs/bidders/adgeneration.md index 812cfbecd7..8ff03a0902 100644 --- a/dev-docs/bidders/adgeneration.md +++ b/dev-docs/bidders/adgeneration.md @@ -6,7 +6,6 @@ pbjs: true pbs: true biddercode: adgeneration media_types: native -pbjs_version_notes: not in 5.x --- From 38de32ffa2421bf5f867f87b89467c51ea4b2a8a Mon Sep 17 00:00:00 2001 From: thuyhq <61451682+thuyhq@users.noreply.github.com> Date: Tue, 12 Oct 2021 11:39:50 +0700 Subject: [PATCH 67/71] Update apacdex.md (#3332) I was missing a newline in the apacdex.md file. This causes it to display falsely on https://docs.prebid.org/dev-docs/bidders/apacdex#apacdex-bid-params --- dev-docs/bidders/apacdex.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/apacdex.md b/dev-docs/bidders/apacdex.md index 9fd5058aa6..a7a7da140b 100644 --- a/dev-docs/bidders/apacdex.md +++ b/dev-docs/bidders/apacdex.md @@ -32,6 +32,7 @@ floors_supported: true | `siteId`* | required | Publisher site ID from Apacdex | `'apacdex1234'` | `string` | | `floorPrice` | optional | CPM bidfloor in USD | `0.03` | `float` | | `geo` | optional | GEO data of device. See [Geo Object](#apacdex-geo-object) for details. | `{"lat":17.98928,"lon":99.7741712,"accuracy":20}` | `object` | + (*) Please do not use `placementId` and `siteId` at the same time.
    From d46c1ad481b72ac237442d906d41c64eb421e133 Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 12 Oct 2021 10:28:21 -0400 Subject: [PATCH 68/71] fixing PBJS adapter example (#3339) --- dev-docs/bidder-adaptor.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidder-adaptor.md b/dev-docs/bidder-adaptor.md index ba6b96ced5..b7a355ebb8 100644 --- a/dev-docs/bidder-adaptor.md +++ b/dev-docs/bidder-adaptor.md @@ -993,8 +993,8 @@ export const spec = { ad: CREATIVE_BODY }; bidResponses.push(bidResponse); + return bidResponses; }; - return bidResponses; }, /** From 46913c1d78db0ad37bfbfbf054a1c32518133fb2 Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 12 Oct 2021 10:50:54 -0400 Subject: [PATCH 69/71] added PBS config faq entries (#3340) --- faq/prebid-server-faq.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/faq/prebid-server-faq.md b/faq/prebid-server-faq.md index 897921131b..8ae4ce15de 100644 --- a/faq/prebid-server-faq.md +++ b/faq/prebid-server-faq.md @@ -168,3 +168,37 @@ Another way is to [register for our host company mailing list](/prebid-server/ho Prebid Server is not a full-fledged SSP. Any DSP bid adapters should keep this in mind when it comes to assuming SSP functionality like resolving OpenRTB macros. We debated building this functionality into PBS, but realized it would take precious milliseconds away from the overall header bidding auction to scan kilobytes of bidder creatives for the 9 different OpenRTB macros. Since so few bidders require this functionality, it makes sense to have those adapters do it themselves. If an adapter doesn't resolve its own macros, AUCTION_PRICE will eventually get resolved by the [Prebid Universal Creative](https://github.com/prebid/prebid-universal-creative), but by then the bid price will be in the ad server currency and quantized by the price granularity. This will likely cause reporting discrepancies. + +## Does Prebid Server support region-specific endpoints for bidders? + +Yes. This is handled by the PBS host company in their datacenter config. +Bidders that want to make use of region-specific endpoints will need to work +with each PBS host company: + +- determine which regions the host company supports +- map the regions to the bidder's endpoints +- the host company overrides the bidder's default auction endpoint when they deploy the configuration for each region. + +We recognize that it's inconvenient for bidders to be required to have this +conversation with each host company, but there's really not a better way +in an open source project. Any number of companies may choose to host +PBS and we cannot constrain them into a defined set of regions. + +## Can bidder endpoints differ by publisher? + +You may not use an endpoint domain as a bidder parameter. Prebid Server is not +an open proxy. If absolutely necessary, you may specify a portion of the +domain as a parameter to support geo regions or account specific servers. +However, this is discouraged and may degrade the performance of your adapter +since the server needs to maintain more outgoing connections. Host companies +may choose to disable your adapter if it uses a dynamically configured domain. + +e.g. this config is not allowed because the entire domain name is a variable: + +``` +endpoint: "https://{host}/path" +``` +but this would be ok: +``` +endpoint: "https://{host}.example.com/path" +``` From 84b238a2a2749f34e0451b1c9117c8d362ef1603 Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 19 Oct 2021 13:13:08 -0400 Subject: [PATCH 70/71] PBS modularity --- _data/sidebar.yml | 36 ++- prebid-server/developers/add-a-module-java.md | 215 ++++++++++++++++-- prebid-server/developers/add-a-module.md | 4 +- prebid-server/features/pbs-feature-idx.md | 1 + prebid-server/pbs-modules/index.md | 106 ++++++++- prebid-server/pbs-modules/ortb2-blocking.md | 164 ++++++++----- 6 files changed, 423 insertions(+), 103 deletions(-) diff --git a/_data/sidebar.yml b/_data/sidebar.yml index 1a09630df6..141805ef38 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -376,32 +376,24 @@ subgroup: 5 - sbSecId: 1 - title: General Modules - link: /dev-docs/modules/index.html#general-modules + title: Recommended Modules + link: /dev-docs/modules/index.html#recommended-modules isHeader: 0 isSectionHeader: 0 sectionTitle: subgroup: 5 - sbSecId: 1 - title: Real Time Data Providers - link: /dev-docs/modules/index.html#real-time-data-providers - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 5 - -- sbSecId: 1 - title: Video Modules - link: /dev-docs/modules/index.html#video-modules + title: General Modules + link: /dev-docs/modules/index.html#general-modules isHeader: 0 isSectionHeader: 0 sectionTitle: subgroup: 5 - sbSecId: 1 - title: Testing and Debug Modules - link: /dev-docs/modules/index.html#testing-and-debug-modules + title: Vendor-Specific Modules + link: /dev-docs/modules/index.html#vendor-specific-modules isHeader: 0 isSectionHeader: 0 sectionTitle: @@ -1673,14 +1665,6 @@ sectionTitle: subgroup: 3 -- sbSecId: 5 - title: Modules - link: /prebid-server/pbs-modules/ - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 3 - - sbSecId: 5 title: Interstitials link: /prebid-server/features/pbs-interstitials.html @@ -1721,6 +1705,14 @@ sectionTitle: subgroup: 3 +- sbSecId: 5 + title: Modules + link: /prebid-server/pbs-modules/ + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 3 + - sbSecId: 5 title: Developers link: diff --git a/prebid-server/developers/add-a-module-java.md b/prebid-server/developers/add-a-module-java.md index c6109a0705..b98ec414f4 100644 --- a/prebid-server/developers/add-a-module-java.md +++ b/prebid-server/developers/add-a-module-java.md @@ -8,34 +8,219 @@ title: Prebid Server | Developers | Adding a Java Module # Prebid Server - Adding a Java Module {: .no_toc} -This document details how to make a module for PBS-Java. Please see -the [module overview](/prebid-server/developers/add-a-module.html) for background information. - * TOC {:toc } ## Overview -Repo structure +This document details how to make a module for PBS-Java. + +You will want to be familiar with the following background information: + +- the [module overview](/prebid-server/developers/add-a-module.html) +- the [PBS-Java Modularity Tech Spec](https://docs.google.com/document/d/1VP_pi7L5Iy3ikHMbtC2_rD5RZTVSc3OkTWKvtRS5x5Y/edit#heading=h.oklyk2bogkx4) + +### Coding standards + +The module’s code style should correspond to the [PBS-Java project code style](https://github.com/prebid/prebid-server-java/blob/master/docs/code-style.md). + +## Module Directory Layout + +The Prebid Server repository contains a maven submodule called `all-modules` located in the `extra/modules` folder. It includes all available PBS modules. So, in order to add a new module, fork the repository and create a folder with the desired name inside the modules folder with the following structure: + +``` ++- prebid-server-java/ + +- extra/ + +- modules/ + +- YOUR_MODULE_NAME/ + +- pom.xml <- POM of your module + +- pom.xml <- POM of all included modules +``` + +A benefit of open sourcing your module in this way is that it can use the parent `all-modules` as a maven dependency. It simplifies management of the PBS-Core and other commonly used dependencies and you will be confident that it works well with the current version of Prebid Server. + +### Your module's build file + +Here's a partial example of your module-specific `pom.xml` file: + +``` + + + + org.prebid.server.hooks.modules + all-modules + PREBID_SERVER_VERSION + + + YOUR_MODULE_ARTIFACT_ID + + YOUR_MODULE_TEXTUAL_NAME + YOUR_MODULE_DESCRIPTION + +``` + +where: +- PREBID_SERVER_VERSION is the current version of Prebid Server. The release team will update this value for all modules with each release, but you need to set it to the version of PBS that you're developing with. +- YOUR_MODULE_ARTIFACT_ID is the name of your module JAR file without version and extension. e.g. ortb2-blocking +- YOUR_MODULE_TEXTUAL_NAME is unique within the space of all other modules. e.g. instead of naming a module "blocking", a better name would be "ortb2blocking". + +### Add your module to the add-modules build file + +Add your module within `extra/modules/pom.xml` in the "modules" section: + +``` + + ... + YOUR_MODULE_ARTIFACT_ID + +``` + +### Your directory layout + +The structure of your module source code inside the modules directory must have a standard maven-compatible structure: + +``` ++- src/ + +- main/ + +- java/ <- source code + +- resources/ <- required resources + +- test/ + +- java/ <- tests + +- resources/ <- required test resources ++- pom.xml <- POM of your module ++- README.md <- documentation +``` + +## Module Code + +The quick start is to take a look in two places: +- the [ortb2-blocking module](https://github.com/prebid/prebid-server-java/tree/master/extra/modules/ortb2-blocking) +- the [module test cases](https://github.com/prebid/prebid-server-java/tree/master/src/test/java/org/prebid/server/it/hooks) + +### Adding module documentation +It is required to add a "README.md" file to the root of your module folder. Recommended this file contains the description of what the implemented module does, links to external documentation and includes maintainer contact info (email, slack, etc). + +The documentation must also live on the docs.prebid.org site. Please add a markdown file to https://github.com/prebid/prebid.github.io/tree/master/prebid-server/pbs-modules + +### Hook Interfaces + +The Prebid server processing workflow is divided into serveal 'stages' where module authors can code agaist a specific function signature called a 'hook'. + +The Prebid Server host company will define which modules to run in which order by setting up a configuration defining which hooks run, and which can run in parallel. + +The supported stages are described in the [general module overview](/prebid-server/developers/add-a-module.html#2-understand-the-endpoints-and-stages) and in PBS-Core source code at the "org.prebid.server.hooks" package. + +These are the available hooks that can be implemented in a module: + +- org.prebid.server.hooks.v1.entrypoint.EntrypointHook +- org.prebid.server.hooks.v1.auction.RawAuctionRequestHook +- org.prebid.server.hooks.v1.auction.ProcessedAuctionRequestHook +- org.prebid.server.hooks.v1.bidder.BidderRequestHook +- org.prebid.server.hooks.v1.bidder.RawBidderResponseHook +- org.prebid.server.hooks.v1.bidder.ProcessedBidderResponseHook +- org.prebid.server.hooks.v1.auction.AuctionResponseHook + +In a module it is not necessary to implement all mentioned interfaces but only one (or several) required by your functionality. + +Each hook interface internally extends org.prebid.server.hooks.v1.Hook basic interface with methods should be implemented: +- `code()` - returns module code. +- `call(...)` - returns result of hook invocation. + +### Examples + +1) To **update** the request in the `RawAuctionRequestHook` you would return: +``` +Future.succeededFuture( + InvocationResultImpl.builder() + .status(InvocationStatus.success) + .action(InvocationAction.update) + .payloadUpdate(payload -> + AuctionRequestPayloadImpl.of(payload.bidRequest().toBuilder() + .id("updated request ID") + .build())) + .build() +); +``` + +2) To **reject** the request in the `RawAuctionRequestHook` you would return: +``` +Future.succeededFuture( + InvocationResultImpl.rejected(“The rejection reason”) +); +``` + +3) To supply [analytics tags](/prebid-server/developers/module-atags.html) in the `RawAuctionRequestHook` you would return: +``` +Future.succeededFuture( + InvocationResultImpl.builder() + ... + .analyticsTags(TagsImpl.of( + Collections.singletonList(ActivityImpl.of( + "device-id", + "success", + Collections.singletonList(ResultImpl.of( + "success", + mapper.mapper().createObjectNode() + .put("some-field", "some-value"), + AppliedToImpl.builder() + .impIds(Collections.singletonList("impId1")) + .request(true) + .build())))))) + ... + .build() +); +``` + +More test implementations for each hook can be found in unit-tests at https://github.com/prebid/prebid-server-java/tree/master/src/test/java/org/prebid/server/it/hooks folder. + +### Applying results asynchronously + +Please note method call() returns a Future object. This means it won’t apply changes immediately but rather when PBS-Core executes it in org.prebid.server.hooks.execution.GroupExecutor#executeHook method. + +### Do not block the main thread + +Prebid Server Java uses Vert.x in its core, so developers need to keep an eye on blocking the main thread. See the [Vert.x documentation](https://vertx.io/docs/vertx-core/java/#_dont_block_me). + +Thus, for any kind of blocking operations it is recommended to use a Vert.x built-in (for example, io.vertx.core.http.HttpClient) or even better - PBS wrapper components (for example, org.prebid.server.vertx.http.HttpClient). + +To see how to proceed with async operations, please see similar PBS-Core functionality, for example Currency Conversion Service implementation (class “org.prebid.server.currency.CurrencyConversionService”). + +### Configuration + +It's possible to define default module configuration which can be read by the module at PBS startup. Please see the [Configuration](https://docs.google.com/document/d/1VP_pi7L5Iy3ikHMbtC2_rD5RZTVSc3OkTWKvtRS5x5Y/edit#heading=h.mh3urph3k1mk) section of the technical specification. + +### Testing + +Unit tests are required. Each implemented hook must be at least 90% covered by unit tests. + +### How to build and install a module + +Read about the bunding of modules with PBS in the [bundling section](https://docs.google.com/document/d/1VP_pi7L5Iy3ikHMbtC2_rD5RZTVSc3OkTWKvtRS5x5Y/edit#heading=h.o8dv0neoq4xm) of the technical specification. + +## Analytics Adapters and Modules -How to build and install a bundle +Each module can inject analytics tags into the request as described in the analytics tags section. -## PBS-Java Hook Interfaces +Analytics adapters can receive these tags in a parameter that's been added to the Auction/AMP endpoints. The org.prebid.server.analytics.model.AuctionEvent event object which includes AuctionContext with HookExecutionContext inside. -Hook interfaces for each of the 7 stages +To get analytics tag you need to go into: -Include examples for: -- how to change a request, response -- how to reject a request, response -- how to supply an analytics tag +``` +AuctionEvent + -> AuctionContext + -> HookExecutionContext + -> stageOutcomes (select stage) + -> groups (iterate through groups) + -> hooks (go through hooks and find interested one) + -> analyticsTags +``` -Async example +The AnalyticsTags object has activities with collection of org.prebid.server.hooks.v1.analytics.Result objects inside. Each Result has the values() method which returns com.fasterxml.jackson.databind.node.ObjectNode. -Unit Tests +It depends on the particular module implementation how to parse their analytics tags, since the internal structure is custom and depends on the module. Therefore, analytics modules that want to report on specific behavior need to be coded to know about that module. See the ortb2blocking module for an example of what analytics tags may be available. -Functional Tests ## Further Reading - [PBS Module Overview](/prebid-server/developers/add-a-module.html) -- [PBS Module Analytics Tags Conventions() +- [PBS Module Analytics Tags Conventions](/prebid-server/developers/module-atags.html) diff --git a/prebid-server/developers/add-a-module.md b/prebid-server/developers/add-a-module.md index 2319b1dfb1..071781e955 100644 --- a/prebid-server/developers/add-a-module.md +++ b/prebid-server/developers/add-a-module.md @@ -55,7 +55,7 @@ If you have an idea for a module that's not feasible (e.g. a new endpoint), open There are a number of things modules are not allowed to do without disclosing prominently on their documentation. Please review -the [Module Rules](/dev-docs/module-rules.html) page. Here are some examples: +the [Module Rules](/dev-docs/module-rules.html) page. Here are some highlights: - a module can't add pixels to the creative without disclosure - every module must obey privacy regulations: GDPR, CCPA, COPPA @@ -166,7 +166,7 @@ The details of the implementation depend on the platform. Other rules for open source PBS pull request: -- Unit test coverage must exceed 80%. +- Unit test coverage must exceed 90%. - A maintainer email address must be provided and be a group, not an individual. e.g. "support@example.com rather than jsmith@example.com ### 9. Write the Module Documentation diff --git a/prebid-server/features/pbs-feature-idx.md b/prebid-server/features/pbs-feature-idx.md index a6c9655753..ae16e878e4 100644 --- a/prebid-server/features/pbs-feature-idx.md +++ b/prebid-server/features/pbs-feature-idx.md @@ -81,3 +81,4 @@ title: Prebid Server | Features | Operations | IPv6 | Support taking IPv6 addresses and forwarding them to bidders. | | | | Operations | [Request Logging Admin Endpoints](/troubleshooting/pbs-troubleshooting.html#request-logging) | Log a limited number of requests to understand the raw data clients are sending. | | | | Metadata | [x-prebid header](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#http-headers) | Put version information in outgoing HTTP headers. | | | +| Modules | [ortb2-blocking](/prebid-server/pbs-modules/ortb2-blocking.html) | Configure per-account OpenRTB blocking details. | | | diff --git a/prebid-server/pbs-modules/index.md b/prebid-server/pbs-modules/index.md index c5d1045285..746c4da817 100644 --- a/prebid-server/pbs-modules/index.md +++ b/prebid-server/pbs-modules/index.md @@ -18,20 +18,110 @@ Only the Java version of PBS currently supports the module infrastructure. * TOC {:toc} -## Installing a Module - -Currently, modules are only offered in PBS-Java. The Prebid Server host company decides which modules they want to use: - -1. Build Prebid Server using the ['bundle'](FIXME) approach. -1. Configure each module. - -## General Modules +## The Modules {: .table .table-bordered .table-striped } | Module | Description | PBS-Go | PBS-Java | |---------------------+--------------+--------+----------| | [**ORTB2 Blocking**](/prebid-server/pbs-modules/ortb2-blocking.html) | Support bidders that aren't full-service SSPs. | | | +## Installing a PBS Module + +Once a Prebid Server host company decides which modules they want to support, +here's how installation works: + +### 1. Build PBS with modules. + +Note that modules are currently an all-or-nothing nothing from a code perspective. +``` +mvn clean package --file extra/pom.xml +``` + +### 2. Define an 'execution plan' + +The execution plan details: +- which modules are used in your server +- what order they're invoked in +- how long modules have to run before timeout +- whether any modules depend on each other + +If you want the module to run on every request regardless of account, this is a +host-level config you should place in `application.yaml`. If the module should +be active only for certain accounts, you'll need to place the plan in the account-specific config. + +To define a plab, you'll need to know the following module details, which should be availble in the module documenation: +- urls: which PBS 'entry points' are relevant. e.g. /openrtb2/auction, /openrtb2/amp +- stages: one or more of the 7 workflow stages where the module should be called: entrypoint, raw-auction-request, processed-auction-request, bidder-request, raw-bidder-response, processed-bidder-response, and/or auction-response. +- hooks: for each stage where a module runs, its documentation will provide the hook function name. + +Here's an example application.yaml entry: +``` +hooks: + host-execution-plan: > # these hooks are always run for all accounts + { + "/openrtb2/auction": { # endpoint + "stages": { + "entrypoint": { # stage + "groups": [ + { + "timeout": 3000, # in nanoseconds + "hook-sequence": [ + { + "modulecode": "modulecode1", + "hookimplcode": "hook1" + }, + { + "modulecode": "modulecode2", + "hookimplcode": "hook2" + } + ] + },{ // this group depends on the results of the first group + "timeout": 5000, # in nanoseconds + "hook-sequence": [ + { + "modulecode": "modulecode3", + "hookimplcode": "hook3-depends-on-hook1" + } + ] + } + ] + } + } + } + } + # these hooks are run for all accounts unless overridden by DB config + default-account-execution-plan: > + { + "/openrtb2/amp": { # endpoint + "stages": { + "raw-auction-request": { # stage + "groups": [ + { + "timeout": 5000, + "hook-sequence": [ + { + "modulecode": "modulecodeA", + "hookimplcode": "hookA" + } + ] + } + ] + } + } + } + } +``` + +### 3. Supply the module with configuration + +Modules may require configuration at startup or during the request: + +- If the module requires config at initialization, its documentation will +describe where the config file lives and what format it should take. +- If the module requires runtime config, it should be passed via the account-conig mechanism. + + ## Further Reading + [Developing a Prebid Server Module](/prebid-server/developers/add-a-module.html) ++ [Prebid Server Features](/prebid-server/features/pbs-feature-idx.html) diff --git a/prebid-server/pbs-modules/ortb2-blocking.md b/prebid-server/pbs-modules/ortb2-blocking.md index ec0f57babf..74cfb12388 100644 --- a/prebid-server/pbs-modules/ortb2-blocking.md +++ b/prebid-server/pbs-modules/ortb2-blocking.md @@ -18,7 +18,7 @@ Currently only available for the Java version of Prebid Server ## Overview This module helps support bidders that aren't full-service SSPs by allowing -PBS host companies to configure per-account OpenRTB blocking configuration. +PBS host companies to configure per-account OpenRTB blocking details. [OpenRTB 2.5](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf) defines the following 6 attributes available for some kind of bid exclusion logic: @@ -62,47 +62,8 @@ This module supports running at two stages: - bidder-request: this is where outgoing auction requests to each bidder are enriched with the account-specific blocks. - raw-bidder-response: this is where incoming bid responses are verified and enforced. If a host-company or account don't want to do any enforcement activities, this part of the module doesn't need to be configured. -Here's an example PBS execution-plan: - -``` -hooks: - host-execution-plan: > - { - "/openrtb2/auction": { - "stages": { - "bidder-request": { - "groups": [ - { - "timeout": 5000, - "hook-sequence": [ - { - "modulecode": "ortb2-blocking", - "hookimplcode": "ortb2-blocking-bidder-request" - } - ] - } - ] - }, - "raw-bidder-response": { # assumes enforcement is turned on - "groups": [ - { - "timeout": 5000, - "hook-sequence": [ - { - "modulecode": "ortb2-blocking", - "hookimplcode": "ortb2-blocking-bidder-response" - } - ] - } - ] - } - } - }, - "/openrtb2/amp": { - ... same as above ... - } - } -``` +We recommend defining the execution plan right in the account config +so the module is only invoked for specific accounts. See below for an example. ### Global Config @@ -110,10 +71,9 @@ There is no host-company level config for this module. ### Account-Level Config -The basic form of the account config is: +Here's a general template for the account config: ``` { - "config": { "hooks": { "modules": { "ortb2-blocking": { // start of this module's config @@ -130,15 +90,117 @@ The basic form of the account config is: } } } + }, + "execution-plan": { + ... } } - } } ``` The 'ATTRIBUTE' above is one of the 5 blockable entities defined in OpenRTB. A 'SETTING' is a feature this module supports. The following sections detail each of the 5 blockable entities. +Here's a detailed example: +``` +{ + "hooks": { + "modules": { + "ortb2-blocking": { + "attributes": { + "badv": { + "enforce-blocks": false, + "blocked-adomain": [], + "action-overrides": { + "blocked-adomain": [ + { + "override": [ "example.com" ], + "conditions": { + "bidders": [ "bidderA" ] + } + } + ] + } + }, + "bcat": { + "enforce-blocks": false, + "blocked-adv-cat": [], + "action-overrides": { + "blocked-adv-cat": [ + { + "override": [ "IAB7" ], + "conditions": { + "bidders": [ "bidderA" ] + } + } + ] + } + }, + "battr": { + "enforce-blocks": false, + "action-overrides": { + "blocked-banner-attr": [ + { + "override": [1,3,8,9,10,13,14,17], + "conditions": { + "bidders": [ + "bidderA" + ] + } + } + ] + }, + "blocked-banner-attr": [] + } + } + } + }, + "execution-plan": { + "endpoints": { + "/openrtb2/amp": { + "stages": { + "bidder-request": { + "groups": [ + { + "timeout": 5, + "hook-sequence": [ + { + "module-code": "ortb2-blocking", + "hook-impl-code": "ortb2-blocking-bidder-request" + } + ] + } + ] + } + } + }, + "/openrtb2/auction": { + "stages": { + "bidder-request": { + "groups": [ + { + "timeout": 5, + "hook-sequence": [ + { + "module-code": "ortb2-blocking", + "hook-impl-code": "ortb2-blocking-bidder-request" + } + ] + } + ] + } + } + } + } + } + } +} +``` + +### Configuration Details + +The module supports flexibile definition of behavior surrounding the 5 blocked attributes. Here are the details. + #### Blocked Advertiser Config This attribute is related to the 'badv' of the request, and the 'adomain' of the response. @@ -154,7 +216,6 @@ This attribute is related to the 'badv' of the request, and the 'adomain' of the Here's an example account config with several scenarios: ``` { - "config": { "hooks": { "modules": { "ortb2-blocking": { // start of this module's config @@ -210,7 +271,6 @@ Here's an example account config with several scenarios: } } } - } } ``` @@ -229,7 +289,6 @@ This attribute is related to the 'bcat' of the request and 'cat' of the response Here's an example account config with several scenarios: ``` { - "config": { "hooks": { "modules": { "ortb2-blocking": { // start of this module's config @@ -285,7 +344,6 @@ Here's an example account config with several scenarios: } } } - } } ``` @@ -303,7 +361,6 @@ This attribute is related to the 'bapp' of the request and 'bundle' of the respo Here's an example account config: ``` { - "config": { "hooks": { "modules": { "ortb2-blocking": { // start of this module's config @@ -331,7 +388,6 @@ Here's an example account config: } } } - } } ``` @@ -353,7 +409,6 @@ parse creatives to derive the type. Here's an example account config: ``` { - "config": { "hooks": { "modules": { "ortb2-blocking": { // start of this module's config @@ -379,7 +434,6 @@ Here's an example account config: } } } - } } ``` @@ -399,7 +453,6 @@ See Table 5.3 in the [OpenRTB 2.5 spec](https://www.iab.com/wp-content/uploads/2 Here's an example account config: ``` { - "config": { "hooks": { "modules": { "ortb2-blocking": { // start of this module's config @@ -427,7 +480,6 @@ Here's an example account config: } } } - } } ``` ## Analytics Tags @@ -452,7 +504,7 @@ It's only applied to attributes where `enforce-blocks` is true, which means 'bty 1. **imp**: the seatbid.bid.impid of the blocked response 1. **bidder**: the biddercode of the blocked response -Here's an example analytics tag: +Here's an example analytics tag that might be produced for use in an analytics adapter: ``` [{ activities: [{ From 5191581b82766ed613e7579b752a0f3b06fde347 Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 19 Oct 2021 13:58:30 -0400 Subject: [PATCH 71/71] timeout is milliseconds --- prebid-server/pbs-modules/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/prebid-server/pbs-modules/index.md b/prebid-server/pbs-modules/index.md index 746c4da817..d618317c88 100644 --- a/prebid-server/pbs-modules/index.md +++ b/prebid-server/pbs-modules/index.md @@ -64,7 +64,7 @@ hooks: "entrypoint": { # stage "groups": [ { - "timeout": 3000, # in nanoseconds + "timeout": 3, # in milliseconds "hook-sequence": [ { "modulecode": "modulecode1", @@ -76,7 +76,7 @@ hooks: } ] },{ // this group depends on the results of the first group - "timeout": 5000, # in nanoseconds + "timeout": 5, # in milliseconds "hook-sequence": [ { "modulecode": "modulecode3", @@ -97,7 +97,7 @@ hooks: "raw-auction-request": { # stage "groups": [ { - "timeout": 5000, + "timeout": 5, "hook-sequence": [ { "modulecode": "modulecodeA",