diff --git a/.sass-cache/a8ae1fbf8fe3cf0ae44282e4f927a25624204c54/main.scssc b/.sass-cache/a8ae1fbf8fe3cf0ae44282e4f927a25624204c54/main.scssc new file mode 100644 index 0000000000..6db4f74c3a Binary files /dev/null and b/.sass-cache/a8ae1fbf8fe3cf0ae44282e4f927a25624204c54/main.scssc differ diff --git a/_data/partners.yml b/_data/partners.yml index 03e58b850f..75c9d275a9 100644 --- a/_data/partners.yml +++ b/_data/partners.yml @@ -63,6 +63,11 @@ imgURL: /assets/images/partners/tech/Pubnative-RGB-Logo.png type: technology +- company: Rakuten Advertising + link: https://rakutenadvertising.com/ + imgURL: /assets/images/partners/tech/rakuten_logo.png + type: technology + - company: StreamAMP link: https://streamamp.com/ imgURL: /assets/images/partners/tech/StreamAMP_logo.png @@ -118,6 +123,11 @@ imgURL: /assets/images/partners/publisher/News_Corp_logo.png type: publisher +- company: Orange Click Media + link: https://orangeclickmedia.com/ + imgURL: /assets/images/partners/publisher/orangeclickmedia_logo.png + type: publisher + - company: Publishers Clearing House link: https://pch.com/ imgURL: /assets/images/partners/publisher/PCH-logo_v3.jpg @@ -133,6 +143,11 @@ imgURL: /assets/images/partners/publisher/sortable.png type: publisher +- company: AdForm + link: https://site.adform.com/ + imgURL: /assets/images/partners/community/Adform-Logo.png + type: community + - company: Adomik link: https://adomik.com/ imgURL: /assets/images/partners/community/Adomik-logo.png diff --git a/_data/sidebar.yml b/_data/sidebar.yml index d34fbd32a7..fe4b2f4c11 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -431,6 +431,14 @@ sectionTitle: subgroup: 5 +- sbSecId: 1 + title: GDPR Enforcement + link: /dev-docs/modules/gdprEnforcement.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 5 + - sbSecId: 1 title: Consent Management - US Privacy (CCPA) link: /dev-docs/modules/consentManagementUsp.html @@ -439,6 +447,14 @@ sectionTitle: subgroup: 5 +- sbSecId: 1 + title: Floors Module + link: /dev-docs/modules/floors.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 5 + - sbSecId: 1 title: Supply Chain Object link: /dev-docs/modules/schain.html @@ -737,7 +753,6 @@ isSectionHeader: 0 sectionTitle: subgroup: 1 - - sbSecId: 2 title: Video interstitial Ad Unit link: /prebid-mobile/pbm-api/ios/pbm-videointerstitialadunit-ios.html @@ -746,6 +761,14 @@ sectionTitle: subgroup: 1 +- sbSecId: 2 + title: Video Rewarded Ad Unit + link: /prebid-mobile/pbm-api/ios/pbm-video-rewarded-adunit-ios.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 1 + - sbSecId: 2 title: Targeting Parameters link: /prebid-mobile/pbm-api/ios/pbm-targeting-ios.html @@ -851,6 +874,15 @@ sectionTitle: subgroup: 2 +- sbSecId: 2 + title: Video Rewarded Ad Unit + link: /prebid-mobile/pbm-api/android/pbm-video-rewarded-adunit-android.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 2 + + - sbSecId: 2 title: Targeting Parameters link: /prebid-mobile/pbm-api/android/pbm-targeting-params-android.html @@ -883,64 +915,6 @@ sectionTitle: subgroup: 2 -- sbSecId: 2 - title: For Ad Ops - link: - isHeader: 1 - headerId: foradops - isSectionHeader: 0 - sectionTitle: - subgroup: 3 - -- sbSecId: 2 - title: Setup Line items For Google Ad Manager - link: /prebid-mobile/adops-line-item-setup-dfp.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 3 - -- sbSecId: 2 - title: Setup Line items For Video - link: /prebid-mobile/adops-video-setup-dfp.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 3 - -- sbSecId: 2 - title: Setup Line Items For MoPub - link: /prebid-mobile/adops-line-item-setup-mopub.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 3 - -- sbSecId: 2 - title: Setup Native Ads - link: /prebid-mobile/adops-native-setup.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 3 - -- sbSecId: 2 - title: Price Granularity - link: /prebid-mobile/adops-price-granularity.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 3 - -- sbSecId: 2 - title: Dr. Prebid Validation App - link: /prebid-mobile/dr-prebid.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 3 - - - sbSecId: 2 title: For Contributors link: @@ -1136,6 +1110,47 @@ sectionTitle: subgroup: 0 +- sbSecId: 3 + title: "Mobile" + link: + isHeader: 0 + isSectionHeader: 0 + isCatHeader: 1 + sectionTitle: + subgroup: 0 + +- sbSecId: 3 + title: Setup Line Items For MoPub + link: /prebid-mobile/adops-line-item-setup-mopub.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 0 + +- sbSecId: 3 + title: Setup Native Ads + link: /prebid-mobile/adops-native-setup.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 0 + +- sbSecId: 3 + title: Price Granularity + link: /prebid-mobile/adops-price-granularity.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 0 + +- sbSecId: 3 + title: Dr. Prebid Validation App + link: /prebid-mobile/dr-prebid.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 0 + - sbSecId: 3 title: "Freewheel" link: diff --git a/_includes/adops/adops-gam-video-setup.html b/_includes/adops/adops-gam-video-setup.html index d8c04b4b25..5aa6714df9 100644 --- a/_includes/adops/adops-gam-video-setup.html +++ b/_includes/adops/adops-gam-video-setup.html @@ -1,5 +1,5 @@
- +

Setting up Prebid Video in Google Ad Manager

This page describes how to set up video creatives in Google Ad Manager for use with Prebid.js.

@@ -12,40 +12,40 @@

Setting up Prebid Video in

Line Item Setup

- +
    +
  1. In the New line item dialog, choose "Video".
  2. +
  3. Select the appropriate Line Item Type, etc.
  4. +
  5. In the Expected creatives section, choose your video size, e.g., 640x480v.
  6. +
  7. Set the dates, rate, limit, and targeting as desired. For example, for SendAllBids include targeting for "hb_bidder_rubicon=rubicon" as well as the hb_pb_rubicon targeting. This isn't needed if only creating one set of orders for all bidders.
  8. +
  9. Remember to set the hb_pb=BUCKET targeting for each line item, or hb_pb_BIDDER=BUCKET if using separate line items for each bidder.
  10. +
  11. Save the line item.
  12. +
+

Be sure to duplicate your line item and video creative for each Prebid price bucket you intend to create.

+

By default, Prebid.js caps all CPMs at $20. As a video seller, you may expect to see CPMs higher than $20. In order to receive those bids, you’ll need to make sure your dev team implements custom price buckets as described in the engineering setup instructions. Once those changes are made on the engineering side, there should be no changes required from the ad ops side to support CPMs over $20.

-

Google Ad Manager New Line Item

+

Multiple Cache Services
You might need separate video line items for each cache service being used. For example, if both AppNexus and Rubicon Project are bidders, you’ll either need to create separate line items to support the different cache URLs required or provide separately-targeted creatives, as described below.

-

Other line item settings and key/value targeting are the same as those recommended for Prebid display, with one exception:

+

Creative Setup

+When setting up video creatives, it's important to understand where the VAST XML is stored for each of your bidders. The most common place to store VAST XML is AppNexus' cache, but some bidders (such as RubiconProject and SpotX) use their own cache services. To support such +bidders, you will need to have either: -

Be sure to duplicate your line item and video creative for each Prebid price bucket you intend to create. You may also need separate video line items for each cache service being used. For example, if both AppNexus and Rubicon Project are bidders, you’ll need separate line items to support the different cache URLs required.

+

Single Cache Location

-

Creative Setup

+

1. For each line item you create, click on the Creatives tab, click the ADD CREATIVE button, and choose the size you're entering.

-

1. For each line item you created above, select new creative set.

+

2. In the dialog that appears, choose Redirect.

-

2. In the dialog that appears, set the creative set type to “Redirect”

- -

3. Set the VAST tag URL to the cache location. Note that each bidder, e.g. Rubicon Project, may have a different cache location URL.

+

3. Set the VAST tag URL to the cache location.

If you’re using a single order for all bidders, then the VAST URL will be the same for each bidder:

@@ -53,29 +53,59 @@

Creative Setup

or [other bidder cache location] -

If you’re using different orders for each bidder, the VAST URL for each will need to be different:

+

If you’re using different orders for each bidder, the VAST URL for each will include the bidder-specific targeting variable:

   https://prebid.adnxs.com/pbc/v1/cache?uuid=%%PATTERN:hb_uuid_BIDDERCODE%%
 or
    [other bidder cache location]
-

This VAST tag URL is required in order to show video ads. It points to - a server-side cache hosted by your Prebid Server provider.

+

This VAST tag URL is required in order to show video ads. It points to a server-side cache hosted by your Prebid Server provider.

Prebid Cache and the VAST creative URL warning
- Google Ad Manager will show you a warning that fetching VAST from the creative + Google Ad Manager will show you a warning stating that fetching VAST from the creative URL failed. This is expected, since the creative URL above points to a server-side asset cache hosted by Prebid Server.

-

4. Set the duration to 1

+

4. Set the Duration to 1.

The resulting creative should look something like the following:

-

Google Ad Manager Video Creative Setup

+

Google Ad Manager Video Creative Setup

+ +

Multiple Cache Locations

+ +To set up multiple video creatives in the same line item (i.e., to run AppNexus, Rubicon, and SpotX all together in the same video line item), you can utilize creative targeting. +
+
+

+1. In the line item's Expected creatives box, choose Creative Targeting and "Add New Targeting". + +

+2. Give the targeting set a name like "Prebid Default Video Cache URL" and set Custom Targeting as appropriate, e.g., "hb_bidder is none of rubicon, spotx". Save the targeting. -

That’s it as far as Prebid setup is concerned. At this point you can add any other options you would normally use, e.g., labels or tracking URLs.

+

+3. For each bidder that uses their own cache, click ADD SIZE in the "Expected creatives" section. Again, choose Creative Targeting and "Add New Targeting". -

Additional Setup for Long-Form (ad pods)

+

+4. Give the targeting a name like "Prebid Rubicon Video Cache URL". Set Custom Targeting appropriately, e.g., "hb_bidder is any of rubicon". Save the targeting. + +

+5. Save the line item. + +

Now that the targeting is defined, we're going to add the creatives.

+ +

+6. Go to the line item's Creatives tab. + +

+7. Make one creative for each of the targets. There are a couple of ways to do this on the GAM UI, but each approach will result in a creative entry screen similar to the screenshot above for the "Single Cache Location" process. Enter a name (e.g. "AppNexus VAST tag") and the VAST URL as described above. + +

+8. The end result should look something like this: + +

Google Ad Manager Video Creative Setup

+ +

That’s it as far as Prebid setup is concerned. At this point you can add any other options you would normally use, such as labels or tracking URLs.

Further Reading

@@ -85,5 +115,3 @@

Further Reading

  • Add Key-Values to a Master Video Ad Tag (Google Ad Manager)
  • Google Ad Manager Macros (Google Ad Manager)
  • - -
    diff --git a/_includes/video/pb-is-br.html b/_includes/video/pb-is-br.html index b2aeed9a9a..573f3a337d 100644 --- a/_includes/video/pb-is-br.html +++ b/_includes/video/pb-is-br.html @@ -109,7 +109,10 @@ pbjs.addAdUnits(videoAdUnit); // add your ad units to the bid request pbjs.setConfig({ - usePrebidCache: true + usePrebidCache: true, + cache: { + url: 'https://prebid.adnxs.com/pbc/v1/cache' + } }); pbjs.requestBids({ diff --git a/_posts/2020-03-12-tcf2.md b/_posts/2020-03-12-tcf2.md index 89ff754139..14987e30da 100644 --- a/_posts/2020-03-12-tcf2.md +++ b/_posts/2020-03-12-tcf2.md @@ -33,10 +33,10 @@ Support for TCF2 is broken into several phases: {: .table .table-bordered .table-striped } | Phase | Description | Est. Availability | | ----- | ----------- | ----------------- | -| 1 | DONE - Support a ['deviceAccess' flag](/dev-docs/publisher-api-reference.html#setConfig-deviceAccess). Publishers can parse the TCF string on their own and configure Prebid.js appropriately. | Mar 18, 2020 | -| 2 | DONE - Update the [GDPR ConsentManagement module(/dev-docs/modules/consentManagement.html) to [read TCF v2.0 strings](https://github.com/prebid/Prebid.js/issues/4801) and forward to bid adapters. | Mar 18, 2020 | -| 3 | Support a 'default GDPR scope' flag to allow control over scenarios where the CMP doesn't respond in time. | Mar 25, 2020 | -| 4 | Update the GDPR ConsentManagement module to support parsing TCF v2.0 strings and enforcing Device Access. | Apr 1, 2020 | +| 1 | DONE - Support a ['deviceAccess' flag](/dev-docs/publisher-api-reference.html#setConfig-deviceAccess). Publishers can parse the TCF string on their own and configure Prebid.js appropriately. | Released with v3.12 | +| 2 | DONE - Update the [GDPR ConsentManagement module(/dev-docs/modules/consentManagement.html) to [read TCF v2.0 strings](https://github.com/prebid/Prebid.js/issues/4801) and forward to bid adapters. | Released with v3.12 | +| 3 | DONE - Support a ['default GDPR scope'](/dev-docs/modules/consentManagement.html) flag to allow control over scenarios where the CMP doesn't respond in time. | Released with v3.13 | +| 4 | DONE - Add a new ['GDPR Enforcement Module'](/dev-docs/modules/gdprEnforcement.html) to support parsing TCF v2.0 strings and enforcing Device Access. | Released with v3.14 | | 5 | Update the GDPR ConsentManagement module to support parsing TCF v2.0 strings and enforcing Purposes 2 and 4 | Apr 30, 2020 | ## Prebid Server @@ -44,7 +44,7 @@ Support for TCF2 is broken into several phases: {: .table .table-bordered .table-striped } | Phase | Description | Est. Availability | | ----- | ----------- | ----------------- | -| 1 | Support parsing the TCF v2.0 string and enforcing Device Access. | Apr 1, 2020 | +| 1 | DONE - Support parsing the TCF v2.0 string and enforcing Device Access. | PBS-Go v0.105.0, PBS-Java v1.32 | | 2 | Support parsing TCF v2.0 strings and enforcing Purposes 2, 4, 7 and Special Feature 1 | Apr 30, 2020 | ## Prebid SDK @@ -52,4 +52,4 @@ Support for TCF2 is broken into several phases: {: .table .table-bordered .table-striped } | Phase | Description | Est. Availability | | ----- | ----------- | ----------------- | -| 1 | Support the 'deviceAccessConsent' flag and passing TCF v2.0 strings to Prebid Server. | Apr 1, 2020 | +| 1 | DONE - Support the 'deviceAccessConsent' flag and passing TCF v2.0 strings to Prebid Server. | SDK v1.5 | diff --git a/adops/before-you-start.md b/adops/before-you-start.md index 0077b101d2..29e41b13c2 100644 --- a/adops/before-you-start.md +++ b/adops/before-you-start.md @@ -11,7 +11,7 @@ sbUUID: 3.2 # Ad Ops and Prebid {: .no_toc } -Prebid products are designed to integrate with the ad ops line item configuration on the publisher's selected ad server. Whether using Prebid.js, Prebid Server or Prebid Mobile, bid targeting parameters are passed to the ad server. The ad server then attempts to match the targeting parameters to a preset line item. If successful, that line item is compared to other line items and if the Prebid bid wins the auction, the creative is returned to the web page or app for display. +Prebid products are designed to integrate with the ad ops line item configuration on the publisher's selected ad server. Whether using Prebid.js, Prebid Server or Prebid Mobile, bid targeting parameters are passed to the ad server. The ad server then attempts to match the targeting parameters to a preset line item. If successful, that line item is compared to other line items and if the Prebid bid wins the auction, the creative is returned to the web page or app for display. {% capture importantNote %} This page assumes you have read [Getting Started with Prebid.js]({{site.baseurl}}/overview/getting-started.html), though it applies to Prebid SDK and Server as well. @@ -19,12 +19,24 @@ This page assumes you have read [Getting Started with Prebid.js]({{site.baseurl} {% include alerts/alert_important.html content=importantNote %} +{% capture tip-choosing %} + +Including this module in your Prebid.js build adds about 12KB to the package size. It's +meant for publishers that have complex site designs: + + - if the site needs to alter different AdUnits at different screen widths. e.g. the left-nav changes sizes-supported at 600 pixels, but the footer's size behavior changes at 620 pixels. + - if the site needs to alter different mediaTypes at different screen widths + - if some bidders or mediaTypes should be included (or removed) at overlapping size ranges. + +{% endcapture %} +{% include alerts/alert_tip.html content=tip-choosing %} + * TOC {: toc } ## Supported ad servers -The table below lists ad servers supported by Prebid and provides links to step by step documentation for the configurations those ad servers support. +The table below lists ad servers supported by Prebid and provides links to step by step documentation for the configurations those ad servers support. {: .table .table-bordered .table-striped } | Server | Page | @@ -40,7 +52,7 @@ The table below lists ad servers supported by Prebid and provides links to step ## Decide on price bucket granularity -On a publisher's selected server the ad ops team will need to setup line items. These line items provide targeting information for the ad server, to include the CPM per impression. Prebid will pass in a bid's targeting parameters via key-values. The ad server will read these incoming targeting parameters and search through the line items for a match. +On a publisher's selected server the ad ops team will need to setup line items. These line items provide targeting information for the ad server, to include the CPM per impression. Prebid will pass in a bid's targeting parameters via key-values. The ad server will read these incoming targeting parameters and search through the line items for a match. Example: @@ -70,7 +82,7 @@ One set of line items for all bidders is the recommended way of setting up your - It's easier to maintain because adding more bidders requires no change to your line item setup. - It's less error-prone because you only need to maintain 3 keywords: -{% include default-keyword-targeting.md %} +{% include default-keyword-targeting.md %} {% capture successNote %} @@ -92,7 +104,7 @@ Choose one set of line items for each bidder if you: - Requires setting more keyword targeting within your ad server. The table below lists the required and optional keys for targeting with each of your header bidder partners. -{% include send-all-bids-keyword-targeting.md %} +{% include send-all-bids-keyword-targeting.md %} {% capture successNote %} For instructions on setting up pre-bid with one set of line items for each bidder, see [Send all bids to the ad server - Ad Ops setup](/adops/send-all-bids-adops.html). diff --git a/assets/images/ad-ops/dfp-creative-setup/appnexus_vast_tag.png b/assets/images/ad-ops/dfp-creative-setup/appnexus_vast_tag.png new file mode 100644 index 0000000000..851fbabf76 Binary files /dev/null and b/assets/images/ad-ops/dfp-creative-setup/appnexus_vast_tag.png differ diff --git a/assets/images/ad-ops/dfp-creative-setup/video_creatives_final.png b/assets/images/ad-ops/dfp-creative-setup/video_creatives_final.png new file mode 100644 index 0000000000..9ac8a77ace Binary files /dev/null and b/assets/images/ad-ops/dfp-creative-setup/video_creatives_final.png differ diff --git a/assets/images/floors/floors_flow.png b/assets/images/floors/floors_flow.png new file mode 100644 index 0000000000..5f0bf16833 Binary files /dev/null and b/assets/images/floors/floors_flow.png differ diff --git a/assets/images/partners/community/Adform-Logo.png b/assets/images/partners/community/Adform-Logo.png new file mode 100644 index 0000000000..78ceef9244 Binary files /dev/null and b/assets/images/partners/community/Adform-Logo.png differ diff --git a/assets/images/partners/publisher/orangeclickmedia_logo.png b/assets/images/partners/publisher/orangeclickmedia_logo.png new file mode 100644 index 0000000000..8092503313 Binary files /dev/null and b/assets/images/partners/publisher/orangeclickmedia_logo.png differ diff --git a/assets/images/partners/tech/rakuten_logo.png b/assets/images/partners/tech/rakuten_logo.png new file mode 100644 index 0000000000..f3e63e071e Binary files /dev/null and b/assets/images/partners/tech/rakuten_logo.png differ diff --git a/dev-docs/adunit-reference.md b/dev-docs/adunit-reference.md index d7f79954d3..a51097482b 100644 --- a/dev-docs/adunit-reference.md +++ b/dev-docs/adunit-reference.md @@ -2,9 +2,6 @@ layout: page_v2 title: Ad Unit Reference description: Ad Unit Reference -top_nav_section: dev_docs -nav_section: reference -pid: 10 sidebarType: 1 --- @@ -34,7 +31,7 @@ See the table below for the list of properties on the ad unit. For example ad u {: .table .table-bordered .table-striped } | Name | Scope | Type | Description | |--------------+----------+---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `code` | Required | String | Unique identifier you create and assign to this ad unit. Generally this is set to the ad slot name or the div element ID. Used by [setTargetingForGPTAsync()](/dev-docs/publisher-api-reference.html#module_pbjs.setTargetingForGPTAsync) to match which auction is for which ad slot. | +| `code` | Required | String | An identifier you create and assign to this ad unit. Generally this is set to the ad slot name or the div element ID. Used by [setTargetingForGPTAsync()](/dev-docs/publisher-api-reference.html#module_pbjs.setTargetingForGPTAsync) to match which auction is for which ad slot. | | `sizes` | Required | Array[Number] or Array[Array[Number]] | All sizes this ad unit can accept. Examples: `[400, 600]`, `[[300, 250], [300, 600]]`. For 1.0 and later, define sizes within the appropriate `mediaTypes.{banner,native,video}` object. | | `bids` | Required | Array[Object] | Array of bid objects representing demand partners and associated parameters for a given ad unit. See [Bids](#adUnit.bids) below. | | `mediaTypes` | Optional | Object | Defines one or more media types that can serve into the ad unit. For a list of properties, see [`adUnit.mediaTypes`](#adUnit.mediaTypes) below. | @@ -221,6 +218,7 @@ If `'video.context'` is set to `'adpod'` then the following parameters are also - [Adpod (Long-Form)](#adUnit-video-example-adpod) + [Native](#adUnit-native-example) + [Multi-Format](#adUnit-multi-format-example) ++ [Twin Codes](#adUnit-twin-codes-example) + [First Party Data](#adUnit-fpd-example) @@ -462,6 +460,63 @@ pbjs.addAdUnits([{ {% endhighlight %} + + +### Twin AdUnit Codes + +It's ok to have multiple AdUnits with the same `code`. This can be useful in scenarios +where bidders have different capabilities for the same spot on the page. e.g. + +- BidderA should receive both media types, while BidderB gets only one +- BidderA gets one size while BidderB gets another + +In this example, bidderA gets both banner and outstream, while bidderB gets only banner. +{% highlight js %} + var adUnits = [ + { + code: 'test-div', + mediaTypes: { + video: { + context: "outstream", + playerSize: [[300,250]] + } + }, + bids: [ + { + bidder: 'bidderA', + params: { + ... + } + } + ] + }, + { + code: 'test-div', + mediaTypes: { + banner: { + sizes: [[300,250],[300,600],[728,90]] + } + }, + bids: [ + { + bidder: 'bidderB', + params: { + ... + } + },{ + bidder: 'bidderA', + params: { + ... + } + } + ] + } + ]; +{% endhighlight %} + +In this example, bidderA receives 2 bidRequest objects while bidderB receives one. If a bidder provides more than one bid for the same AdUnit.code, Prebid.js will use the highest bid when it's +time to set targeting. + ### First Party Data diff --git a/dev-docs/bidder-adaptor.md b/dev-docs/bidder-adaptor.md index 58eae34c6f..d072fd1ded 100644 --- a/dev-docs/bidder-adaptor.md +++ b/dev-docs/bidder-adaptor.md @@ -196,7 +196,7 @@ export const spec = { isBidRequestValid: function(bid) {}, buildRequests: function(validBidRequests[], bidderRequest) {}, interpretResponse: function(serverResponse, request) {}, - getUserSyncs: function(syncOptions, serverResponses) {}, + getUserSyncs: function(syncOptions, serverResponses, gdprConsent, uspConsent) {}, onTimeout: function(timeoutData) {}, onBidWon: function(bid) {}, onSetTargeting: function(bid) {} @@ -356,38 +356,69 @@ The `interpretResponse` function will be called when the browser has received th const bidResponse = { requestId: BID_ID, cpm: CPM, + currency: CURRENCY, width: WIDTH, height: HEIGHT, creativeId: CREATIVE_ID, dealId: DEAL_ID, - currency: CURRENCY, netRevenue: true, ttl: TIME_TO_LIVE, - ad: CREATIVE_BODY + ad: CREATIVE_BODY, + dealId: DEAL_ID, + meta: { + networkId: NETWORK_ID, + networkName: NETWORK_NAME + agencyId: AGENCY_ID, + agencyName: AGENCY_NAME, + advertiserId: ADVERTISER_ID, + advertiserName: ADVERTISER_NAME, + advertiserDomains: [ARRAY_OF_ADVERTISER_DOMAINS] + brandId: BRAND_ID, + brandName: BRAND_NAME, + primaryCatId: IAB_CATEGORY, + secondaryCatIds: [ARRAY_OF_IAB_CATEGORIES], + } }; bidResponses.push(bidResponse); return bidResponses; {% endhighlight %} -The parameters of the `bidObject` are: +{: .alert.alert-info :} +Please provide as much information as possible in the `meta` object. Publishers use this +data for tracking down bad creatives and ad blocking. The advertiserDomains field is +particularly useful. Some of these fields may become required in a future release. + +The parameters of the `bidResponse` object are: {: .table .table-bordered .table-striped } | Key | Scope | Description | Example | |--------------+---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------| | `requestId` | Required | The bid ID that was sent to `spec.buildRequests` as `bidRequests[].bidId`. Used to tie this bid back to the request. | 12345 | | `cpm` | Required | The bid price. We recommend the most granular price a bidder can provide | 3.5764 | +| `currency` | Required | 3-letter ISO 4217 code defining the currency of the bid. | `"EUR"` | | `width` | Required | The width of the returned creative. For video, this is the player width. | 300 | | `height` | Required | The height of the returned creative. For video, this is the player height. | 250 | | `ad` | Required | The creative payload of the returned bid. | `"

    I am an ad

    "` | | `ttl` | Required | Time-to-Live - how long (in seconds) Prebid can use this bid. See the [FAQ entry](/dev-docs/faq.html#does-prebidjs-cache-bids) for more info. | 360 | | `creativeId` | Required | A bidder-specific unique code that supports tracing the ad creative back to the source. | `"123abc"` | | `netRevenue` | Required | Boolean defining whether the bid is Net or Gross. The value `true` is Net. Bidders responding with Gross-price bids should set this to false. | `false` | -| `currency` | Required | 3-letter ISO 4217 code defining the currency of the bid. | `"EUR"` | | `vastUrl` | Either this or `vastXml` required for video | URL where the VAST document can be retrieved when ready for display. | `"https://vid.example.com/9876` | | `vastImpUrl` | Optional; only usable with `vastUrl` and requires prebid cache to be enabled | An impression tracking URL to serve with video Ad | `"https://vid.exmpale.com/imp/134"` | | `vastXml` | Either this or `vastUrl` required for video | XML for VAST document to be cached for later retrieval. | `...` | | `dealId` | Optional | Deal ID | `"123abc"` | +| `meta` | Optional | Object containing metadata about the bid | | +| `meta.networkId` | Optional | Bidder-specific Network/DSP Id | 1111 | +| `meta.networkName` | Optional | Network/DSP Name | `"NetworkN"` | +| `meta.agencyId` | Optional | Bidder-specific Agency ID | 2222 | +| `meta.agencyName` | Optional | Agency Name | `"Agency, Inc."` | +| `meta.advertiserId` | Optional | Bidder-specific Advertiser ID | 3333 | +| `meta.advertiserName` | Optional | Advertiser Name | `"AdvertiserA"` | +| `meta.advertiserDomains` | Optional | Array of Advertiser Domains for the landing page(s). This is an array to align with the OpenRTB 'adomain' field. | `["advertisera.com"]` | +| `meta.brandId` | Optional | Bidder-specific Brand ID (some advertisers may have many brands) | 4444 | +| `meta.brandName` | Optional | Brand Name | `"BrandB"` | +| `meta.primaryCatId` | Optional | Primary [IAB category ID](https://www.iab.com/guidelines/iab-quality-assurance-guidelines-qag-taxonomy/) | `"IAB-111"` | +| `meta.secondaryCatIds` | Optional | Array of secondary IAB category IDs | `["IAB-222","IAB-333"]` |
    @@ -402,18 +433,26 @@ See below for an example implementation. For more examples, search for `getUser {% highlight js %} { - getUserSyncs: function(syncOptions, serverResponses) { - const syncs = [] + getUserSyncs: function(syncOptions, serverResponses, gdprConsent, uspConsent) { + const syncs = [] + + var gdpr_params; + if (typeof gdprConsent.gdprApplies === 'boolean') { + gdpr_params = `gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`; + } else { + gdpr_params = `gdpr_consent=${gdprConsent.consentString}`; + } + if (syncOptions.iframeEnabled) { syncs.push({ type: 'iframe', - url: '//acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html' + url: '//acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html?' + gdpr_params }); } if (syncOptions.pixelEnabled && serverResponses.length > 0) { syncs.push({ type: 'image', - url: serverResponses[0].body.userSync.url + url: serverResponses[0].body.userSync.url + gdpr_params }); } return syncs; @@ -886,18 +925,26 @@ export const spec = { * @param {ServerResponse[]} serverResponses List of server's responses. * @return {UserSync[]} The user syncs which should be dropped. */ - getUserSyncs: function(syncOptions, serverResponses) { - const syncs = [] + getUserSyncs: function(syncOptions, serverResponses, gdprConsent, uspConsent) { + const syncs = [] + + var gdpr_params; + if (typeof gdprConsent.gdprApplies === 'boolean') { + gdpr_params = `gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`; + } else { + gdpr_params = `gdpr_consent=${gdprConsent.consentString}`; + } + if (syncOptions.iframeEnabled) { syncs.push({ type: 'iframe', - url: '//acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html' + url: '//acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html?' + gdpr_params }); } if (syncOptions.pixelEnabled && serverResponses.length > 0) { syncs.push({ type: 'image', - url: serverResponses[0].body.userSync.url + url: serverResponses[0].body.userSync.url + gdpr_params }); } return syncs; diff --git a/dev-docs/bidders/9MediaOnline.md b/dev-docs/bidders/9MediaOnline.md index e5c7584c2a..e29dedbfd1 100644 --- a/dev-docs/bidders/9MediaOnline.md +++ b/dev-docs/bidders/9MediaOnline.md @@ -8,7 +8,7 @@ media_types: banner, video gdpr_supported: true schain_supported: true usp_supported: true -userIds: unifiedId/tradedesk, id5Id +userIds: id5Id, unifiedId aliasCode: gamoshi --- diff --git a/dev-docs/bidders/aardvark.md b/dev-docs/bidders/aardvark.md index 8d502b1e9e..bdc41c6f33 100644 --- a/dev-docs/bidders/aardvark.md +++ b/dev-docs/bidders/aardvark.md @@ -5,9 +5,10 @@ description: Prebid Aardvark Bidder Adaptor hide: true biddercode: aardvark gdpr_supported: true +tcf2_supported: true usp_supported: true schain_supported: true -userIds: unifiedId/tradedesk +userIds: unifiedId --- ### Bid Params diff --git a/dev-docs/bidders/adagio.md b/dev-docs/bidders/adagio.md index d2fe9fe13d..564313bfd0 100644 --- a/dev-docs/bidders/adagio.md +++ b/dev-docs/bidders/adagio.md @@ -6,6 +6,8 @@ hide: true biddercode: adagio media_types: banner gdpr_supported: true +schain_supported: true +tcf2_supported: true --- ### Note @@ -14,7 +16,7 @@ The Adagio bidder adaptor requires setup and approval from the Adagio team. Plea ### Bid Params -**Important**: Adagio needs to collect attention data about the ads displayed on a page and must listen to some specifics ad-server events. Please refer to the [Adagio user guide](https://support.adagio.io/hc/en-us/articles/360019849112-Adagio-PreBid-Installation-guide-for-publishers) for details. +**Important**: Adagio needs to collect attention data about the ads displayed on a page and must listen to some specifics ad-server events. Please refer to the [Adagio user guide](https://adagio-team.atlassian.net/wiki/spaces/AH/pages/67272705/EN+Adagio+Prebid.js+installation+guide+for+publishers) for details. {: .table .table-bordered .table-striped } @@ -23,8 +25,8 @@ The Adagio bidder adaptor requires setup and approval from the Adagio team. Plea | `organizationId` | required | Id of the Organization. Handed out by Adagio. | `'1010'` | `string` | | `site` | required | Name of the site. Handed out by Adagio.
    - max length: 50 | `'mysite-com'` | `string` | | `adUnitElementId` | required | Refers to the adunit html attribute id in a page. | `'gpt-ban-atf'` | `string` | -| `environment`* | highly recommended | Environment where the page is displayed.
    - max length: 30
    - max distinctives values: 10 | `'desktop'` | `string` | -| `placement`* | highly recommended | Refers to the placement of an adunit in a page.
    Must not contain any information about the type of device.
    - max length: 30
    - max distinctives values: 10 | `'ban_atf'` | `string` | +| `environment`* | required | Environment where the page is displayed.
    - max length: 30
    - max distinctives values: 10 | `'desktop'` | `string` | +| `placement`* | required | Refers to the placement of an adunit in a page.
    Must not contain any information about the type of device.
    - max length: 30
    - max distinctives values: 10 | `'ban_atf'` | `string` | | `pagetype`* | recommended | Describes what kind of content will be present in the page.
    - max length: 30
    - max distinctives values: 50 | `'article'` | `string` | | `category`* | recommended | Category of the content displayed in the page.
    - max length: 30
    - max distinctives values: 50 | `'sport'` | `string` | | `subcategory`* | optional | Subcategory of the content displayed in the page.
    - max length: 30
    - max distinctives values: 50 | `'handball'` | `string` | diff --git a/dev-docs/bidders/adfinity.md b/dev-docs/bidders/adfinity.md index 8192ccfbbb..162f005d20 100644 --- a/dev-docs/bidders/adfinity.md +++ b/dev-docs/bidders/adfinity.md @@ -5,6 +5,7 @@ description: Prebid Adfinity Bidder Adaptor hide: true biddercode: adfinity media_types: banner, video, native +gdpr_supported: true --- ### Bid Params diff --git a/dev-docs/bidders/adkernel.md b/dev-docs/bidders/adkernel.md index 9f6764a07d..da75aa8ec2 100644 --- a/dev-docs/bidders/adkernel.md +++ b/dev-docs/bidders/adkernel.md @@ -4,7 +4,7 @@ title: AdKernel description: Prebid AdKernel Bidder Adaptor hide: true biddercode: adkernel -media_types: banner, video +media_types: banner, native, video gdpr_supported: true usp_supported: true --- diff --git a/dev-docs/bidders/adnuntius.md b/dev-docs/bidders/adnuntius.md new file mode 100644 index 0000000000..fc68317fa1 --- /dev/null +++ b/dev-docs/bidders/adnuntius.md @@ -0,0 +1,52 @@ +--- +layout: bidder +title: Adnuntius +description: Prebid Adnuntius Bidder Adaptor +hide: true +biddercode: adnuntius +media_types: banner +gdpr_supported: false +--- + + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------------|----------|----------------------------------------------------------------------|----------|----------| +| `auId` | required | The ad unit ID `'0000000000072345'` leading zeros can be omitted. | `string` | | +| `network` | optional | Used if you want to make requests to multiple networks in adnuntius. | `string` | | +| `targeting` | optional | Targeting to be sent through to adnuntius with the request. | `string` | | + + + +#### Targeting + +The [Adnuntius Documentation](https://docs.adnuntius.com/adnuntius-advertising/requesting-ads/intro) provides detailed information on sending targeting data to the Adnuntius adserver. + + +#### Example + +Here's an example of sending targeting information about categories to adnuntius via the bid request: +``` +{ + code: "0000000000072345", + mediaTypes: { + banner: { + sizes: [[980, 360], [980, 300], [980, 240], [980, 120]] + } + }, + bids: [ + { + bidder: "adnuntius", + params: { + auId: "8b6bc", + network: "adnuntius", + targeting: { + c: ['prebids'] + } + } + } + ] +} +``` \ No newline at end of file diff --git a/dev-docs/bidders/adot.md b/dev-docs/bidders/adot.md new file mode 100644 index 0000000000..d995d14f0e --- /dev/null +++ b/dev-docs/bidders/adot.md @@ -0,0 +1,34 @@ +--- +layout: bidder +title: Adot +description: Prebid Adot Bidder Adapter +biddercode: adot +hide: true +media_types: banner, video, native +gdpr_supported: true +--- + +### Table of Contents + +- [Bid Params](#bid-params) +- [Video Object](#video-object) + +#### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------------|----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------|------------------| +| `placementId` | optional | The placement ID from Adot. | `'adot_placement_224521'` | `string` | +| `position` | optional | Specify the position of the ad as a relative measure of visibility or prominence. Allowed values: Unknown: `0` (default); Above the fold: `1` ; Below the fold: `3`. | `0` | `integer-` | +| `video` | optional | Object containing video targeting parameters. See [Video Object](#video-object) for details. | `video: { mimes: ['video/mp4'] }` | `object` | + +#### Video Object + +{: .table .table-bordered .table-striped } +| Name | Description | Type | +|-------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------| +| `mimes` | Array of strings listing the content MIME types supported, e.g., `['video/mp4']`. | `Array` | +| `minduration` | Integer that defines the minimum video ad duration in seconds. | `integer` | +| `maxduration` | Integer that defines the maximum video ad duration in seconds. | `integer` | +| `protocols` | Array of supported video protocols, e.g., `[2, 3]` | `Array` | +| `container` | Selector used for finding the element in which the video player will be displayed, e.g., `#div-1`. The `ad unit code` will be used if no `container` is provided. | `string` | \ No newline at end of file diff --git a/dev-docs/bidders/adtarget.md b/dev-docs/bidders/adtarget.md deleted file mode 100644 index ec2ed9fd00..0000000000 --- a/dev-docs/bidders/adtarget.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -layout: bidder -title: adtarget -description: Prebid adtarget Bidder Adaptor -biddercode: adtarget -hide: true -media_types: banner, video -gdpr_supported: true -schain_supported: true -usp_supported: true -userIds: unifiedId/tradedesk, id5Id -aliasCode: gamoshi ---- - -### Bid params - -{: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|-------------------|----------|---------------------------------------------------------------|----------------------|----------| -| `supplyPartnerId` | required | ID of the supply partner you created in the adtarget dashboard. | `'12345'` | `string` | diff --git a/dev-docs/bidders/adxcg.md b/dev-docs/bidders/adxcg.md index 37b1edfd1f..3879d9cb42 100644 --- a/dev-docs/bidders/adxcg.md +++ b/dev-docs/bidders/adxcg.md @@ -6,7 +6,7 @@ hide: true biddercode: adxcg media_types: native, video gdpr_supported: true -userIds: pubCommon, unifiedId/tradedesk +userIds: id5Id, identityLink, pubCommonId, unifiedId --- ### Bid Params diff --git a/dev-docs/bidders/appnexus.md b/dev-docs/bidders/appnexus.md index 5fde36757b..395e2fa413 100644 --- a/dev-docs/bidders/appnexus.md +++ b/dev-docs/bidders/appnexus.md @@ -11,6 +11,7 @@ userIds: criteo schain_supported: true coppa_supported: true usp_supported: true +tcf2_supported: true --- ### Table of Contents diff --git a/dev-docs/bidders/automatadBidAdapter.md b/dev-docs/bidders/automatadBidAdapter.md new file mode 100644 index 0000000000..dc2d5a631b --- /dev/null +++ b/dev-docs/bidders/automatadBidAdapter.md @@ -0,0 +1,17 @@ +--- +layout: bidder +title: Automatad OpenRTB Bid Adapter +description: Automatad OpenRTB Bid Adapter +biddercode: automatad +hide: true +media_types: banner +--- + +#### Bid Params + +{: .table .table-bordered .table-striped } + +| Name | Scope | Description | Example | Type | +|-----------|----------|---------------------------|------------|----------| +| `siteId` | required | The site ID from automatad. | `"12adf45c"` | `string` | +| `placementId` | required | The placement ID from automatad. | `"a34gh6d"` | `string` | diff --git a/dev-docs/bidders/beachfront.md b/dev-docs/bidders/beachfront.md index a4e02261d4..02538b9b56 100644 --- a/dev-docs/bidders/beachfront.md +++ b/dev-docs/bidders/beachfront.md @@ -7,7 +7,7 @@ biddercode: beachfront media_types: video gdpr_supported: true usp_supported: true -userIds: unifiedId/tradedesk +userIds: unifiedId --- ### Bid Params diff --git a/dev-docs/bidders/bidlab.md b/dev-docs/bidders/bidlab.md new file mode 100644 index 0000000000..96bb86b0ad --- /dev/null +++ b/dev-docs/bidders/bidlab.md @@ -0,0 +1,21 @@ +--- +layout: bidder +title: Bidlab +description: Prebid Bidlab Bidder Adapter +hide: true +biddercode: bidlab +gdpr_supported: true +media_types: banner, video +--- + +### Note: + +The Bidlab Bidding adapter requires setup before beginning. Please contact us at hello@bidlab.ai + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|-----------------------|-----------|-----------| +| `id` | required | Bidlab placement id | `1234asdf` | `string` | + diff --git a/dev-docs/bidders/cleanmedia.md b/dev-docs/bidders/cleanmedia.md index d681cc3e96..6dce7f3995 100644 --- a/dev-docs/bidders/cleanmedia.md +++ b/dev-docs/bidders/cleanmedia.md @@ -8,7 +8,7 @@ media_types: banner, video gdpr_supported: true schain_supported: true usp_supported: true -userIds: unifiedId/tradedesk, id5Id +userIds: id5Id, unifiedId aliasCode: gamoshi --- diff --git a/dev-docs/bidders/clicktripz.md b/dev-docs/bidders/clicktripz.md new file mode 100644 index 0000000000..819a9772e4 --- /dev/null +++ b/dev-docs/bidders/clicktripz.md @@ -0,0 +1,16 @@ +--- +layout: bidder +title: Clicktripz +description: Prebid Clicktripz Bidder Adaptor +hide: true +biddercode: clicktripz +media_types: banner +--- + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|-------------|---------|----------| +| `placementId` | required | The Placement ID from Clicktripz | `'4312c63f'` | `string` | +| `siteId` | required | The site ID from Clicktripz | `'prebid'` | `string` | \ No newline at end of file diff --git a/dev-docs/bidders/colossusssp.md b/dev-docs/bidders/colossusssp.md index 854dec42e7..62ffd30fd6 100644 --- a/dev-docs/bidders/colossusssp.md +++ b/dev-docs/bidders/colossusssp.md @@ -7,6 +7,8 @@ biddercode: colossusssp usp_supported: true schain_supported: true media_types: banner, video, native +userIds: britepoolid, identityLink, unifiedId, id5Id +gdpr: true --- ### Bid Params diff --git a/dev-docs/bidders/connectad.md b/dev-docs/bidders/connectad.md index f642ea0239..f12474e478 100644 --- a/dev-docs/bidders/connectad.md +++ b/dev-docs/bidders/connectad.md @@ -1,10 +1,15 @@ --- layout: bidder title: ConnectAd -description: Prebid Serverbid Bidder Adaptor +description: ConnectAd Prebid Adaptor hide: true biddercode: connectad -aliasCode: serverbid +media_types: banner +gdpr_supported: true +usp_supported: true +coppa_supported: true +schain_supported: true +userIds: digitrust, id5Id, liveIntentId, parrableId, pubCommonId, unifiedId --- @@ -13,5 +18,6 @@ aliasCode: serverbid {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |-------------|----------|--------------------------------|---------|-----------| -| `siteId` | required | The site ID from ConnectAd. | `12345` | `integer` | -| `networkId` | required | The network ID from ConnectAd. | `10047` | `integer` | +| `siteId` | required | The site ID from ConnectAd. | 12345 | integer | +| `networkId` | required | The network ID from ConnectAd. | 10047 | integer | +| `floorprice`| optional | Requested Floorprice | 0.15 | integer | diff --git a/dev-docs/bidders/converge.md b/dev-docs/bidders/converge.md new file mode 100755 index 0000000000..cf6a3e9b2a --- /dev/null +++ b/dev-docs/bidders/converge.md @@ -0,0 +1,20 @@ +--- +layout: bidder +title: Converge +description: Prebid Converge Bidder Adaptor +hide: true +biddercode: converge +media_types: banner, video +gdpr_supported: true +usp_supported: true +--- + + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------------|----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------|-----------| +| `uid` | required | Represents the Converge bidder system Ad Slot ID associated with the respective div id from the site page. | `59` | `integer` | +| `priceType` | optional | Can take the values `gross` or `net`, default value is `net`. Net represents the header bid price with the Converge header bidder margin already extracted. Gross price does contain the Converge bidder margin within. | `'gross'` | `string` | +| `keywords` | optional | A set of key-value pairs applied to all ad slots on the page. Values can be empty. | `keywords: { topic: ['stress', 'fear'] }` | `object` | diff --git a/dev-docs/bidders/conversant.md b/dev-docs/bidders/conversant.md index 5caa13e052..59c95106ed 100644 --- a/dev-docs/bidders/conversant.md +++ b/dev-docs/bidders/conversant.md @@ -6,7 +6,7 @@ hide: true biddercode: conversant media_types: video gdpr_supported: true -userIds: pubCommon +userIds: criteo, digitrust, id5Id, identityLink, liveIntentId, parrableId, pubCommonId, unifiedId --- diff --git a/dev-docs/bidders/emoteev.md b/dev-docs/bidders/emoteev.md index a2d37ae14c..42e68fabd3 100644 --- a/dev-docs/bidders/emoteev.md +++ b/dev-docs/bidders/emoteev.md @@ -5,7 +5,7 @@ description: Prebid Emoteev Bidder Adaptor hide: true biddercode: emoteev gdpr_supported: true -userIds: pubCommon +userIds: pubCommonId --- ### Bid Params diff --git a/dev-docs/bidders/evolution_tech.md b/dev-docs/bidders/evolution_tech.md new file mode 100644 index 0000000000..a6f6de689c --- /dev/null +++ b/dev-docs/bidders/evolution_tech.md @@ -0,0 +1,21 @@ +--- +layout: bidder +title: E-volution tech +description: Prebid E-volution tech Bidder Adapter +hide: true +biddercode: e_volution +gdpr_supported: true +media_types: banner, video +--- + +### Note: + +The E-volution Bidding adapter requires setup before beginning. Please contact us at admin@e-volution.ai + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|-----------------------|-----------|-----------| +| `id` | required | E-volution tech placement id | `1234asdf` | `string` | + diff --git a/dev-docs/bidders/fidelity.md b/dev-docs/bidders/fidelity.md index 114554980a..acf4cd7840 100644 --- a/dev-docs/bidders/fidelity.md +++ b/dev-docs/bidders/fidelity.md @@ -3,6 +3,7 @@ layout: bidder title: Fidelity Media description: Prebid Fidelity Media Bidder Adapter hide: true +schain_supported: true biddercode: fidelity media_types: banner gdpr_supported: true diff --git a/dev-docs/bidders/gambid.md b/dev-docs/bidders/gambid.md index afbf08f298..3b41b81ffd 100644 --- a/dev-docs/bidders/gambid.md +++ b/dev-docs/bidders/gambid.md @@ -10,7 +10,7 @@ hide: true media_types: banner, video biddercode: gambid aliasCode: gamoshi - +userIds: id5Id, unifiedId --- ### Bid params diff --git a/dev-docs/bidders/gamoshi.md b/dev-docs/bidders/gamoshi.md index 3066fae21a..d1e8736181 100644 --- a/dev-docs/bidders/gamoshi.md +++ b/dev-docs/bidders/gamoshi.md @@ -8,7 +8,7 @@ media_types: banner, video gdpr_supported: true schain_supported: true usp_supported: true -userIds: unifiedId/tradedesk, id5Id +userIds: id5Id, unifiedId --- ### Bid params diff --git a/dev-docs/bidders/gridNM.md b/dev-docs/bidders/gridNM.md new file mode 100755 index 0000000000..8d0d63c955 --- /dev/null +++ b/dev-docs/bidders/gridNM.md @@ -0,0 +1,36 @@ +--- +layout: bidder +title: TheMediaGridNM +description: Prebid TheMediaGridNM Bidder Adapter +hide: true +biddercode: gridNM +media_types: video +gdpr_supported: true +usp_supported: true +--- + + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|------------------------|----------|------------------------------------------------------------------------------------------------------------------------|-----------------------------------|-----------------| +| `secid` | required | section id, will be used by JW Player to pass their info | `'11'` | `string` | +| `pubid` | required | publisher id, will be used by JW Player to pass their info | `'22'` | `string` | +| `source` | required | source of traffic, in JW Player case should be 'jwp' | `'jw_player'` | `string` | +| `pubdata` | optional | publisher data, will be used by JW Player to pass their info | `{"jwpseg" : ["1111", "2222"]})` | `object` | +| `floorcpm` | optional | floor cpm | `0.56` | `float` | +| `video` | required | video parameters which should be passed for no-mapping approach | | `object` | +| `video.mimes` | required | Content MIME types supported | `['video/mp4', 'video/x-ms-wmv']` | `string array` | +| `video.mind` | optional | Minimum video ad duration in seconds. | `1` | `integer` | +| `video.maxd` | optional | Maximum video ad duration in seconds | `60` | `int` | +| `video.protocols` | required | Array of supported video protocols | `[1,2,3,4,5,6]` | `integer array` | +| `video.size` | optional | player size wxh | `'300x250'` | `string` | +| `video.linearity` | optional | Indicates if the impression must be linear, nonlinear, etc. | `1` | `int` | +| `video.skip` | optional | Indicates if the player will allow the video to be skipped, where 0 = no, 1 = yes. | `0` | `int` | +| `video.skipmin` | optional | Videos of total duration greater than this number of seconds can be skippable; only applicable if the ad is skippable. | `0` | `int` | +| `video.skipafter` | optional | Number of seconds a video must play before skipping is enabled; only applicable if the ad is skippable. | `0` | `int` | +| `video.api` | optional | List of supported API frameworks for this impression | `[1,2,3,4,5,6]` | `integer array` | +| `video.startdelay` | optional | Indicates the start delay in seconds | `0` | `int` | +| `video.placement` | optional | Placement type for the impression. | `1` | `int` | +| `video.playbackmethod` | optional | Playback methods that may be in use | `[1]` | `integer array` | \ No newline at end of file diff --git a/dev-docs/bidders/gumgum.md b/dev-docs/bidders/gumgum.md index 273c732589..9f37bb50b2 100644 --- a/dev-docs/bidders/gumgum.md +++ b/dev-docs/bidders/gumgum.md @@ -6,9 +6,10 @@ hide: true biddercode: gumgum media_types: banner, video schain_supported: true -userIds: unifiedId/tradedesk, digitrustId +userIds: digitrust, unifiedId gdpr_supported: true usp_supported: true +tcf2_supported: true --- ### Note: diff --git a/dev-docs/bidders/hybrid.md b/dev-docs/bidders/hybrid.md new file mode 100644 index 0000000000..bed1b8892a --- /dev/null +++ b/dev-docs/bidders/hybrid.md @@ -0,0 +1,66 @@ +--- +layout: bidder +title: Hybrid.ai +description: Prebid Hybrid.ai Bidder Adapter +hide: true +media_types: banner, video +biddercode: hybrid +gdpr_supported: true +--- + +### Note + +You can use this adapter to get a bid from Hybrid.ai +Please reach out to your Hybrid.ai account team before using this plugin to get placeId. +The code below returns a demo ad. + + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------------|---------------------|-------------------------------------------------------------------|-------------------------------------|----------| +| `placeId` | required | The place id. | '5af45ad34d506ee7acad0c26' | `string` | +| `placement` | required | Adunit placement, possible values: banner, video | 'banner' | `string` | + + +### Sample Banner Ad Unit + +```js +var adUnits = [{ + code: 'banner_ad_unit', + mediaTypes: { + banner: { + sizes: [[728, 90]] + } + }, + bids: [{ + bidder: "hybrid", + params: { + placement: "banner", // required + placeId: "5af45ad34d506ee7acad0c26" // required + } + }] +}]; +``` + +### Sample Video Ad Unit + +```js +var adUnits = [{ + code: 'video_ad_unit', + mediaTypes: { + video: { + context: 'outstream', // required, possible values: instream, outstream + playerSize: [640, 480] // required + } + }, + bids: [{ + bidder: 'hybrid', + params: { + placement: "video", // required + placeId: "5af45ad34d506ee7acad0c26" // required + } + }] +}]; +``` diff --git a/dev-docs/bidders/indexExchange.md b/dev-docs/bidders/indexExchange.md index 9d4145ace6..64aad5e038 100644 --- a/dev-docs/bidders/indexExchange.md +++ b/dev-docs/bidders/indexExchange.md @@ -7,6 +7,7 @@ hide: true schain_supported: true gdpr_supported: true usp_supported: true +tcf2_supported: true media_types: banner, video --- @@ -273,6 +274,23 @@ pbjs.setConfig({ }); ``` +#### User Sync +Add the following code to enable user sync. IX strongly recommends enabling user syncing through iFrames. This functionality improves DSP user match rates and increases the IX bid rate and bid price. Be sure to call `pbjs.setConfig()` only once. + +``` +pbjs.setConfig({ + userSync: { + iframeEnabled: true, + filterSettings: { + iframe: { + bidders: ['ix'], + filter: 'include' + } + } + } +}); +``` + ### 2. Include `ixBidAdapter` in your build process When running the build command, include `ixBidAdapter` as a module, as well as `dfpAdServerVideo` if you require video support. diff --git a/dev-docs/bidders/justpremium.md b/dev-docs/bidders/justpremium.md index 8c3a2303b2..e97901d5ab 100644 --- a/dev-docs/bidders/justpremium.md +++ b/dev-docs/bidders/justpremium.md @@ -6,6 +6,7 @@ hide: true biddercode: justpremium gdpr_supported: true usp_supported: true +userIds: britepoolId, criteo, digitrust, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId --- diff --git a/dev-docs/bidders/kargo.md b/dev-docs/bidders/kargo.md index f35cddaa20..b785fc6ed9 100644 --- a/dev-docs/bidders/kargo.md +++ b/dev-docs/bidders/kargo.md @@ -4,7 +4,7 @@ title: Kargo description: Prebid Kargo Bidder Adaptor hide: true biddercode: kargo -userIds: unifiedId/tradedesk +userIds: unifiedId usp_supported: true --- diff --git a/dev-docs/bidders/livewrapped.md b/dev-docs/bidders/livewrapped.md index e43914b819..690c8d80d6 100644 --- a/dev-docs/bidders/livewrapped.md +++ b/dev-docs/bidders/livewrapped.md @@ -6,7 +6,7 @@ biddercode: livewrapped hide: true media_types: banner gdpr_supported: true -userIds: pubcommon +userIds: id5Id, pubCommonId --- ### Note: diff --git a/dev-docs/bidders/medianet.md b/dev-docs/bidders/medianet.md index 80adc8e487..fcc8293e15 100644 --- a/dev-docs/bidders/medianet.md +++ b/dev-docs/bidders/medianet.md @@ -7,6 +7,7 @@ hide: true gdpr_supported: true media_types: banner,native usp_supported: true +userIds: britepoolId, criteo, digitrust, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId --- ### Bid Params diff --git a/dev-docs/bidders/mobsmart.md b/dev-docs/bidders/mobsmart.md index a0c4ea1d5d..fc12ffd1f9 100644 --- a/dev-docs/bidders/mobsmart.md +++ b/dev-docs/bidders/mobsmart.md @@ -5,7 +5,7 @@ description: Prebid Mobsmart SSP Bidder Adaptor hide: true biddercode: mobsmart media_types: banner -userIds: pubCommon +userIds: pubCommonId --- ### Note: diff --git a/dev-docs/bidders/nobidBidAdapter.md b/dev-docs/bidders/nobidBidAdapter.md index e7c85ac0a1..9d0a48b517 100644 --- a/dev-docs/bidders/nobidBidAdapter.md +++ b/dev-docs/bidders/nobidBidAdapter.md @@ -9,13 +9,15 @@ gdpr_supported: true usp_supported: true schain_supported: true coppa_supported: true +--- ### Bid Params {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |---------------|----------|-------------|---------|----------| -| `siteId` | required | siteId is provided by your Nobid account manager | | `integer` | +| `siteId` | required | siteId is provided by your NoBid account manager(s) | | `integer` | +| `placementId` | optional | placementId is provided by your NoBid account manager(s). This parameter allows to report on a specific ad unit | | `integer` | # Test Parameters ``` @@ -31,7 +33,8 @@ coppa_supported: true { bidder: "nobid", params: { - siteId: 2 + siteId: 2, + placementId: 3 } } ] diff --git a/dev-docs/bidders/oneVideo.md b/dev-docs/bidders/oneVideo.md index 8fff0bb293..bca090e9c7 100644 --- a/dev-docs/bidders/oneVideo.md +++ b/dev-docs/bidders/oneVideo.md @@ -6,6 +6,7 @@ hide: true biddercode: oneVideo media_types: video gdpr_supported: true +tcf2_supported: true usp_supported: true --- diff --git a/dev-docs/bidders/onetag.md b/dev-docs/bidders/onetag.md index 3761f23760..23bada9d2d 100644 --- a/dev-docs/bidders/onetag.md +++ b/dev-docs/bidders/onetag.md @@ -4,9 +4,10 @@ title: OneTag description: Prebid OneTag Bidder Adaptor hide: true biddercode: onetag -media_types: banner +media_types: banner, video gdpr_supported: true usp_supported: true +userIds: britepoolId, criteo, digitrust, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId --- @@ -17,4 +18,7 @@ usp_supported: true | Name | Scope | Description | Example | Type | |---------|----------|-----------------------------------|--------------|----------| | `pubId` | required | | `'386276e072'` | `string` | -| `type` | optional | The media type, default is banner | `'banner'` | `string` | + +### Video Additional Information + +Note that right now video support is only provided when the context is "instream" or "outstream". Also a renderer should be included when defining an outstream adUnit. diff --git a/dev-docs/bidders/openx.md b/dev-docs/bidders/openx.md index f88d716f1f..845f6fd74f 100644 --- a/dev-docs/bidders/openx.md +++ b/dev-docs/bidders/openx.md @@ -9,8 +9,9 @@ schain_supported: true gdpr_supported: true usp_supported: true coppa_supported: true -userIds: pubCommon, unifiedId, identityLink +userIds: britepoolId, criteo, digitrust, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId prebid_member: true +tcf2_supported: true --- ### Bid Parameters diff --git a/dev-docs/bidders/ozone.md b/dev-docs/bidders/ozone.md index c2f2b86e27..bf9a458861 100644 --- a/dev-docs/bidders/ozone.md +++ b/dev-docs/bidders/ozone.md @@ -6,6 +6,7 @@ biddercode: ozone hide: true media_types: banner gdpr_supported: true +userIds: criteo, id5Id, identityLink, liveIntentId, parrableId, pubCommonId --- #### Bid Params diff --git a/dev-docs/bidders/platformio.md b/dev-docs/bidders/platformio.md index 9ef208f358..df6f1f7f25 100644 --- a/dev-docs/bidders/platformio.md +++ b/dev-docs/bidders/platformio.md @@ -15,7 +15,6 @@ gdpr_supported: true |---------------|----------|----------------------------------|----------------|----------| | `pubId` | required | The publisher account ID | `'28082'` | `string` | | `siteId` | required | The publisher site ID | `'26047'` | `string` | -| `size` | required | Ad size identifier | `'300X250'` | `string` | | `placementId` | required | Identifies specific ad placement | `'17394'` | `string` | | `bidFloor` | optional | The bid floor | `'0.001'` | `string` | | `ifa` | optional | IFA ID | `'XXX-XXX'` | `string` | @@ -25,9 +24,8 @@ gdpr_supported: true ### test params ``` - var adUnits = [{ + var adUnits = [{ code: 'dfp-native-div', - mediaType: 'native', mediaTypes: { native: { title: { @@ -48,9 +46,13 @@ gdpr_supported: true bids: [{ bidder: 'platformio', params: { - pubId: '29521', + pubId: '29521', siteId: '26048', placementId: '123', + bidFloor: '0.001', // optional + ifa: 'XXX-XXX', // optional + latitude: '40.712775', // optional + longitude: '-74.005973', // optional } }] }, @@ -59,7 +61,7 @@ gdpr_supported: true mediaTypes: { banner: { sizes: [ - [300, 250] + [300, 250],[300,600] ], } }, @@ -68,16 +70,15 @@ gdpr_supported: true params: { pubId: '29521', siteId: '26049', - size: '300X250', placementId: '123', } }] }, { code: 'dfp-video-div', - sizes: [640, 480], mediaTypes: { video: { + playerSize: [[640, 480]], context: "instream" } }, @@ -86,7 +87,6 @@ gdpr_supported: true params: { pubId: '29521', siteId: '26049', - size: '640X480', placementId: '123', video: { skippable: true, diff --git a/dev-docs/bidders/pubmatic.md b/dev-docs/bidders/pubmatic.md index f2bb87c1b8..18342b6068 100644 --- a/dev-docs/bidders/pubmatic.md +++ b/dev-docs/bidders/pubmatic.md @@ -9,7 +9,7 @@ gdpr_supported: true usp_supported: true coppa_supported: true schain_supported: true -userIds: pubcommonId, unifiedId/tradedesk, digitrustId, id5Id, criteo, identityLink, liveIntent, parrable, britepoolId +userIds: britepoolId, criteo, digitrust, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId prebid_member: true --- diff --git a/dev-docs/bidders/pulsepoint.md b/dev-docs/bidders/pulsepoint.md index 34b94e6f01..b9a45d4d59 100644 --- a/dev-docs/bidders/pulsepoint.md +++ b/dev-docs/bidders/pulsepoint.md @@ -8,7 +8,7 @@ gdpr_supported: true usp_supported: true schain_supported: true media_types: banner, video, native -userIds: pubcommonId, unifiedId, digitrustId, id5Id, britepoolId, criteo, identityLink, parrable, liveIntent +userIds: britepoolId, criteo, digitrust, id5Id, identityLink, liveIntentId, parrableId, pubCommonId, unifiedId --- diff --git a/dev-docs/bidders/quantcast.md b/dev-docs/bidders/quantcast.md index 1829efd51f..042c83b62e 100644 --- a/dev-docs/bidders/quantcast.md +++ b/dev-docs/bidders/quantcast.md @@ -7,6 +7,8 @@ biddercode: quantcast media_types: video gdpr_supported: true usp_supported: true +tcf2_supported: true +coppa_supported: true --- ### Bid Params diff --git a/dev-docs/bidders/readpeak.md b/dev-docs/bidders/readpeak.md index e0846db0c9..e114bb3b00 100644 --- a/dev-docs/bidders/readpeak.md +++ b/dev-docs/bidders/readpeak.md @@ -1,7 +1,7 @@ --- layout: bidder -title: ReadPeak -description: ReadPeak Bidder Adaptor +title: Readpeak +description: Readpeak Bidder Adaptor hide: true biddercode: readpeak media_types: native @@ -10,7 +10,8 @@ media_types: native ### Bid Params {: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|---------------|----------|-----------------------------------|------------------------------------------|----------| -| `publisherId` | required | Publisher ID provided by ReadPeak | `'11bc5dd5-7421-4dd8-c926-40fa653bec76'` | `string` | -| `bidfloor` | optional | CPM Bid Floor | `0.5` | `float` | +| Name | Scope | Description | Example | Type | +|---------------|-------------|------------------------------------|----------------------|----------| +| `publisherId` | required | Publisher ID provided by Readpeak | `'c2aca92893d1b989'` | `string` | +| `siteId` | recommended | Site/Media ID provided by Readpeak | `'5d1aef6a9088ced0'` | `string` | +| `bidfloor` | optional | CPM Bid Floor | `0.5` | `float` | diff --git a/dev-docs/bidders/relaido.md b/dev-docs/bidders/relaido.md new file mode 100644 index 0000000000..f66ea77b64 --- /dev/null +++ b/dev-docs/bidders/relaido.md @@ -0,0 +1,15 @@ +--- +layout: bidder +title: Relaido +description: Prebid Relaido Bidder Adapter +biddercode: relaido +hide: true +media_types: banner, video +--- + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|-----------------------|-----------|-----------| +| `placementId` | required | Relaido placement id | `1234567` | `string` | diff --git a/dev-docs/bidders/richaudience.md b/dev-docs/bidders/richaudience.md index 8424679615..a765162bb5 100644 --- a/dev-docs/bidders/richaudience.md +++ b/dev-docs/bidders/richaudience.md @@ -4,7 +4,7 @@ title: Rich Audience description: Prebid Rich Audience Bidder Adapter hide: true biddercode: richaudience -userIds: pubcommonId, unifiedId/tradedesk, id5Id, criteo, identityLink, liveIntent +userIds: criteo, id5Id, identityLink, liveIntentId, pubCommonId, unifiedId media_types: banner, video gdpr_supported: true --- diff --git a/dev-docs/bidders/rubicon.md b/dev-docs/bidders/rubicon.md index 11ec8071e5..dfab7df5e1 100644 --- a/dev-docs/bidders/rubicon.md +++ b/dev-docs/bidders/rubicon.md @@ -5,11 +5,12 @@ description: Rubicon Project Prebid Bidder Adaptor hide: true biddercode: rubicon gdpr_supported: true +tcf2_supported: true usp_supported: true coppa_supported: true schain_supported: true media_types: video -userIds: unifiedId/tradedesk, digitrust, liveIntent +userIds: digitrust, identityLink, liveIntentId, pubCommonId, unifiedId prebid_member: true --- diff --git a/dev-docs/bidders/sharethrough.md b/dev-docs/bidders/sharethrough.md index 9da90a29e3..4bab3d9c00 100644 --- a/dev-docs/bidders/sharethrough.md +++ b/dev-docs/bidders/sharethrough.md @@ -7,7 +7,7 @@ biddercode: sharethrough media_types: native gdpr_supported: true usp_supported: true -userIds: unifiedId/tradedesk +userIds: unifiedId schain_supported: true --- diff --git a/dev-docs/bidders/smartadserver.md b/dev-docs/bidders/smartadserver.md index f1e2cda773..bd95585686 100644 --- a/dev-docs/bidders/smartadserver.md +++ b/dev-docs/bidders/smartadserver.md @@ -6,6 +6,9 @@ hide: true biddercode: smartadserver media_types: display, video gdpr_supported: true +schain_supported: true +tcf2_supported: true +usp_supported: true --- ### Note: @@ -14,19 +17,20 @@ The Smart AdServer bidder adaptor requires setup and approval from the Smart AdS ### Bid params {: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|------------|----------|----------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------|-----------| -| `siteId` | required | The placement site ID | `1234` | `integer` | -| `pageId` | required | The placement page ID | `1234` | `integer` | -| `formatId` | required | The placement format ID | `1234` | `integer` | -| `domain` | optional | The network domain (default see example) | `'http://prg.smartadserver.com', 'https://prg.smartadserver.com'` | `string` | -| `target` | optional | The keyword targeting | `'sport=tennis'` | `string` | -| `currency` | optional | Override the default currency code (ISO 4217) of the ad request. (Default: `'USD'`) | `'EUR'` | `string` | -| `bidfloor` | optional | Bid floor for this placement in USD or in the currency specified by the `currency` parameter. (Default: `0.0`) | `0.42` | `float` | -| `appName` | optional | Mobile application name | `'Smart AdServer Preview'` | `string` | -| `buId` | optional | Mobile application bundle ID | `'com.smartadserver.android.dashboard'` | `string` | -| `ckId` | optional | Unique Smart AdServer user ID | `1234567890123456789` | `integer` | -| `video` | optional | Parameter object for instream video. See [video Object](#smartadserver-video-object) | `{}` | `object` | +| Name | Scope | Description | Example | Type | +|------------|----------|----------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------|-----------| +| `siteId` | required | The placement site ID | `1234` | `integer` | +| `pageId` | required | The placement page ID | `1234` | `integer` | +| `formatId` | required | The placement format ID | `1234` | `integer` | +| `domain` | optional | The network domain (default see example) | `'http://prg.smartadserver.com', 'https://prg.smartadserver.com'` | `string` | +| `target` | optional | The keyword targeting | `'sport=tennis'` | `string` | +| `currency` | optional | Override the default currency code (ISO 4217) of the ad request. (Default: `'USD'`) | `'EUR'` | `string` | +| `bidfloor` | optional | Bid floor for this placement in USD or in the currency specified by the `currency` parameter. (Default: `0.0`) | `0.42` | `float` | +| `appName` | optional | Mobile application name | `'Smart AdServer Preview'` | `string` | +| `buId` | optional | Mobile application bundle ID | `'com.smartadserver.android.dashboard'` | `string` | +| `ckId` | optional | Unique Smart AdServer user ID | `1234567890123456789` | `integer` | +| `video` | optional | Parameter object for instream video. See [video Object](#smartadserver-video-object) | `{}` | `object` | +| `schain` | optional | Supply Chain | `'1.0,1!exchange1.com,1234,1,bid-request-1,publisher,publisher.com'` | `string` |
    diff --git a/dev-docs/bidders/smartrtb.md b/dev-docs/bidders/smartrtb.md index 0de6c48dba..d8d5a7c6a5 100644 --- a/dev-docs/bidders/smartrtb.md +++ b/dev-docs/bidders/smartrtb.md @@ -6,7 +6,7 @@ hide: true biddercode: smartrtb gdpr_supported: true media_types: banner, video -userIds: unifiedId,pubCommonId,id5id,digitrust +userIds: britepoolId, criteo, digitrust, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId --- ### bid params diff --git a/dev-docs/bidders/sonobi.md b/dev-docs/bidders/sonobi.md index f0f1f63fba..630603eea9 100644 --- a/dev-docs/bidders/sonobi.md +++ b/dev-docs/bidders/sonobi.md @@ -6,7 +6,7 @@ hide: true biddercode: sonobi media_types: video gdpr_supported: true -userIds: pubCommon, unifiedId/tradedesk +userIds: britepoolId, criteo, digitrust, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId --- ### Note: @@ -25,6 +25,7 @@ implementing our adapter please don't hesitate to contact us at apex.prebid@sono | `hfa` | optional | Publisher Unique Identifier | `'123985'` | `string` | | `referrer` | optional | Overrides the default value for the ref param in a bid request | `'prebid.org'` | `string` | | `keywords` | optional | Comma separated list of keywords about the site | `'sports,news,food'` | `string` | +| `bid_request_url`| optional | String representing the url the Sonobi adapter should make to request bids | `'https://iad-2-apex.go.sonobi.com/trinity.json'` | `string` | ### Configuration *You *must* only include one ID field - either `placement_id` or `ad_unit`, not both. If you have questions on which parameter to use, please reach out to your Account Manager. diff --git a/dev-docs/bidders/sovrn.md b/dev-docs/bidders/sovrn.md index 6f47b10cc6..c40c01993b 100644 --- a/dev-docs/bidders/sovrn.md +++ b/dev-docs/bidders/sovrn.md @@ -6,6 +6,7 @@ hide: true biddercode: sovrn gdpr_supported: true usp_supported: true +userIds: digitrust --- diff --git a/dev-docs/bidders/spotx.md b/dev-docs/bidders/spotx.md index deaed6dafe..7df17cd654 100644 --- a/dev-docs/bidders/spotx.md +++ b/dev-docs/bidders/spotx.md @@ -6,7 +6,7 @@ hide: true biddercode: spotx media_types: video gdpr_supported: true -userIds: unifiedId/tradedesk, id5Id +userIds: id5Id, pubCommonId, unifiedId prebid_member: true schain_supported: true usp_supported: true diff --git a/dev-docs/bidders/teads.md b/dev-docs/bidders/teads.md index 011291784d..269a147d0e 100644 --- a/dev-docs/bidders/teads.md +++ b/dev-docs/bidders/teads.md @@ -5,6 +5,7 @@ description: Prebid Teads Bidder Adapter hide: true biddercode: teads gdpr_supported: true +tcf2_supported: true usp_supported: true schain_supported: true media_types: banner, video diff --git a/dev-docs/bidders/triplelift.md b/dev-docs/bidders/triplelift.md index 8ba3a46d69..fbfff42004 100644 --- a/dev-docs/bidders/triplelift.md +++ b/dev-docs/bidders/triplelift.md @@ -8,7 +8,7 @@ usp_supported: true schain_supported: true coppa_supported: true biddercode: triplelift -userIds: unifiedId/tradedesk, identityLink +userIds: criteo, identityLink, unifiedId --- ### Bid Params diff --git a/dev-docs/bidders/ucfunnel.md b/dev-docs/bidders/ucfunnel.md index 27bf593873..f8a02e8687 100644 --- a/dev-docs/bidders/ucfunnel.md +++ b/dev-docs/bidders/ucfunnel.md @@ -7,6 +7,7 @@ biddercode: ucfunnel media_types: video, native gdpr_supported: true usp_supported: true +userIds: unifiedId --- ### Bid params diff --git a/dev-docs/bidders/undertone.md b/dev-docs/bidders/undertone.md index 35206b0e08..f3b237beb1 100644 --- a/dev-docs/bidders/undertone.md +++ b/dev-docs/bidders/undertone.md @@ -6,6 +6,7 @@ hide: true biddercode: undertone gdpr_supported: true usp_supported: true +userIds: britepoolId, criteo, digitrust, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId --- diff --git a/dev-docs/bidders/unicorn.md b/dev-docs/bidders/unicorn.md new file mode 100644 index 0000000000..6bad86489a --- /dev/null +++ b/dev-docs/bidders/unicorn.md @@ -0,0 +1,18 @@ +--- +layout: bidder +title: UNICORN +description: Prebid UNICORN Bidder Adaptor +hide: true +media_types: banner +biddercode: unicorn +--- + +### bid params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|-------------------------------------------|------------|-----------| +| `placementId` | optional | Your placement ID | `'rectangle-ad-1'` | `string` | +| `accountId` | required | Account ID for charge request (provided by UNICORN) | `12345` | `integer` | +| `bidfloorCpm` | optional | Floor CPM (JPY); defaults to 0. | `0.2` | `float` | +| `bcat` | optional | Blocked IAB categories | `['IAB-1', 'IAB-2']` | `[string]` | diff --git a/dev-docs/bidders/valueimpression.md b/dev-docs/bidders/valueimpression.md new file mode 100644 index 0000000000..019df8aeec --- /dev/null +++ b/dev-docs/bidders/valueimpression.md @@ -0,0 +1,19 @@ +--- +layout: bidder +title: Valueimpression +description: Prebid Valueimpression Bidder Adapter +hide: true +biddercode: valueimpression +media_types: banner, video +gdpr_supported: true +schain_supported: true +usp_supported: true +--- + + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------------|----------|--------------------------------------------------------------------------------------------------------------------------------|------------|----------| +| `siteId` | required | Publisher site ID from Valueimpression | `'vi-site-id'` | `string` | diff --git a/dev-docs/bidders/visx.md b/dev-docs/bidders/visx.md index ff59f381bf..63823bfafa 100644 --- a/dev-docs/bidders/visx.md +++ b/dev-docs/bidders/visx.md @@ -5,6 +5,8 @@ description: Prebid VIS.X Bidder Adaptor hide: true biddercode: visx gdpr_supported: true +schain_supported: true +userIds: digitrust, id5Id, unifiedId --- ### Note diff --git a/dev-docs/bidders/windtalker.md b/dev-docs/bidders/windtalker.md new file mode 100644 index 0000000000..f2dbbe9e23 --- /dev/null +++ b/dev-docs/bidders/windtalker.md @@ -0,0 +1,98 @@ +--- +layout: bidder +title: Windtalker +description: Prebid Windtalker Bidder Adapter +hide: true +biddercode: windtalker +media_types: native, video +gdpr_supported: true +--- + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|----------------------------------|----------------|----------| +| `pubId` | required | The publisher account ID | `'28082'` | `string` | +| `siteId` | required | The publisher site ID | `'26047'` | `string` | +| `size` | required | Ad size identifier | `'300X250'` | `string` | +| `placementId` | required | Identifies specific ad placement | `'17394'` | `string` | +| `bidFloor` | optional | The bid floor | `'0.001'` | `string` | +| `ifa` | optional | IFA ID | `'XXX-XXX'` | `string` | +| `latitude` | optional | Latitude | `'40.712775'` | `string` | +| `longitude` | optional | Longitude | `'-74.005973'` | `string` | + +### test params + +``` + var adUnits = [{ + code: 'dfp-native-div', + mediaType: 'native', + mediaTypes: { + native: { + title: { + required: true, + len: 75 + }, + image: { + required: true + }, + body: { + len: 200 + }, + icon: { + required: false + } + } + }, + bids: [{ + bidder: 'windtalker', + params: { + pubId: '29521', + siteId: '26048', + placementId: '123', + } + }] + }, + { + code: 'dfp-banner-div', + mediaTypes: { + banner: { + sizes: [ + [300, 250] + ], + } + }, + bids: [{ + bidder: 'windtalker', + params: { + pubId: '29521', + siteId: '26049', + size: '300X250', + placementId: '123', + } + }] + }, + { + code: 'dfp-video-div', + sizes: [640, 480], + mediaTypes: { + video: { + context: "instream" + } + }, + bids: [{ + bidder: 'windtalker', + params: { + pubId: '29521', + siteId: '26049', + size: '640X480', + placementId: '123', + video: { + skippable: true, + } + } + }] + } + ]; +``` diff --git a/dev-docs/bidders/wipes.md b/dev-docs/bidders/wipes.md new file mode 100644 index 0000000000..c8b9f59291 --- /dev/null +++ b/dev-docs/bidders/wipes.md @@ -0,0 +1,19 @@ +--- +layout: bidder +title: WIPES +description: Prebid WIPES Bidder Adaptor +hide: true +biddercode: wipes +media_types: video +--- + +### Note: +Publishers needs to be set up and approved by WIPES team to enable this adapter. +Please contact support@wipestream.com for further information. + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|------------------|--------------------------------------------------------|----------| +| `asid` | required | The AD Slot ID | `'bX9mYMAi3ckOrv04tmHjPHUemnwrvZlCvDygJgHMHWhmUuMEPZI'`| `string` | diff --git a/dev-docs/bidders/yieldlab.md b/dev-docs/bidders/yieldlab.md index e18abbe8c6..28e56868f5 100644 --- a/dev-docs/bidders/yieldlab.md +++ b/dev-docs/bidders/yieldlab.md @@ -6,6 +6,7 @@ hide: true biddercode: yieldlab media_types: video gdpr_supported: true +userIds: britepoolId, criteo, digitrust, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId --- diff --git a/dev-docs/bidders/yieldlift.md b/dev-docs/bidders/yieldlift.md new file mode 100644 index 0000000000..18ea489e40 --- /dev/null +++ b/dev-docs/bidders/yieldlift.md @@ -0,0 +1,26 @@ +--- +layout: bidder +title: YieldLift +description: Prebid YieldLift Bidder Adaptor +hide: true +biddercode: yieldlift +media_types: banner +gdpr_supported: true +usp_supported: true +schain_supported: true + +--- + +### Integration Note: + +The YieldLift Header Bidding adapter requires approval from the YieldLift team. Please reach out to for more information. + + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|------|----------|--------------------|-------------|-----------| +| `unitId` | optional | Unit Id | `'13000'` | `string` | +| `networkId` | optional | Network Id | `'2300000'` | `string` | +| `publisherId` | optional | Publisher Id | `'8ba96b13-540d-4f8a-9f1b-2a7e804769cc'` | `string` | diff --git a/dev-docs/bidders/yieldmo.md b/dev-docs/bidders/yieldmo.md index bd3d8e9c8f..3d3048c52a 100644 --- a/dev-docs/bidders/yieldmo.md +++ b/dev-docs/bidders/yieldmo.md @@ -5,7 +5,7 @@ description: Prebid Yieldmo Bidder Adaptor hide: true biddercode: yieldmo media_types: native -userIds: pubCommon +userIds: pubCommonId, unifiedId --- diff --git a/dev-docs/get-started-with-prebid-server.md b/dev-docs/get-started-with-prebid-server.md index 91f3e1956e..e5fdc258c6 100644 --- a/dev-docs/get-started-with-prebid-server.md +++ b/dev-docs/get-started-with-prebid-server.md @@ -37,7 +37,7 @@ Prebid Server is an open source project. [The source code is hosted under the P - When approved, you will receive an email with your assigned `accountId`. You will need this for configuring Prebid.js to use Prebid Server. - **Rubicon Project** - - Reach out to your Rubicon Project account manager and proceed to **Step 2** below. You do not have to wait for a verification email to get started. + - [Learn more](https://rubiconproject.com/demand-manager-hosted-prebid-server/) about Rubicon Project's Hosted Prebid Server offering. ## Step 2. Download Prebid.js with Prebid Server enabled diff --git a/dev-docs/modules/consentManagement.md b/dev-docs/modules/consentManagement.md index 3d18f40a0e..b7b82630d8 100644 --- a/dev-docs/modules/consentManagement.md +++ b/dev-docs/modules/consentManagement.md @@ -24,18 +24,19 @@ This consent management module is designed to support the EU General Data Protec This module works with supported [Consent Management Platforms](https://www.cmswire.com/information-management/what-is-a-consent-management-platform/) (CMPs) to fetch an encoded string representing the user's consent choices and make it available for adapters to consume and process. -{: .alert.alert-info :} -See also the [Prebid Consent Management - US Privacy Module](/dev-docs/modules/consentManagementUsp.html) for supporting the California Consumer Protection Act (CCPA) - {: .alert.alert-warning :} Prebid functionality created to address regulatory requirements does not replace each party's responsibility to determine its own legal obligations and comply with all applicable laws. **We recommend consulting with your legal counsel before determining how to utilize these features in support of your overall privacy approach.** -Here's a summary of the interaction process: +This base EU GDPR consent management module performs these actions: 1. Fetch the user's GDPR consent data from the CMP. 2. Incorporate this data into the auction objects for adapters to collect. -3. Proceed with the auction. + +The optional [GDPR enforcement module](/dev-docs/modules/gdprEnforcement.html) adds on these actions: + +3. Allows the page to define which activities should be enforced at the Prebid.js level. +4. Actively enforces those activities based on user consent data. In the case of a new user, CMPs will generally respond only after there is consent information available (i.e., the user has made their consent choices). Making these selections can take some time for the average user, so the module provides timeout settings. @@ -65,6 +66,7 @@ but we recommend migrating to the new config structure as soon as possible. | gdpr | `Object` | | | | gdpr.cmpApi | `string` | The CMP interface that is in use. Supported values are **'iab'** or **'static'**. Static allows integrations where IAB-formatted consent strings are provided in a non-standard way. Default is `'iab'`. | `'iab'` | | gdpr.timeout | `integer` | Length of time (in milliseconds) to allow the CMP to obtain the GDPR consent string. Default is `10000`. | `10000` | +| gdpr.defaultGdprScope | `boolean` | (TCF v2.0 only) Defines what the `gdprApplies` flag should be when the CMP doesn't respond in time. | `true` | | gdpr.allowAuctionWithoutConsent | `boolean` | (TCF v1.1 only) Determines what will happen if obtaining consent information from the CMP fails; either allow the auction to proceed (`true`) or cancel the auction (`false`). Default is `true` | `true` | | gdpr.consentData | `Object` | An object representing the GDPR consent data being passed directly; only used when cmpApi is 'static'. Default is `undefined`. | | | gdpr.consentData.getTCData.tcString | `string` | (TCF v2.0 only) Base64url-encoded TCF v2.0 string with segments. | | @@ -87,7 +89,7 @@ A related parameter is `deviceAccess`, which is at the global level of Prebid.js ### TCF v2.0 Examples -Example 1: IAB CMP using custom timeout +Example 1: IAB CMP using custom timeout and setting GDPR in-scope by default {% highlight js %} var pbjs = pbjs || {}; @@ -97,7 +99,8 @@ Example 1: IAB CMP using custom timeout consentManagement: { gdpr: { cmpApi: 'iab', - timeout: 8000 + timeout: 8000, + defaultGdprScope: true } } }); @@ -182,10 +185,12 @@ Follow the basic build instructions in the GitHub Prebid.js repo's main [README] gulp build --modules=consentManagement,bidAdapter1,bidAdapter2 {% endhighlight %} +You can also use the [Prebid.js Download](/download.html) page. + ## Adapter Integration {: .alert.alert-info :} -Prebid.js adapters don't need to change to support TCF v2.0 if they already support TCF 1.1 -- the consent string is passed through the same bidrequest location. The bidder's endpoint, however, will need to change to support TCF v2.0. Once the endpoint supports TCF2, you can update the documentation.md file as described below above the table showing the list of TCF2-compliant bidders. +Prebid.js adapters don't need to change to support TCF v2.0 if they already support TCF 1.1 -- the consent string is passed through the same bidrequest location. The bidder's endpoint, however, will need to change to support TCF v2.0. Once the endpoint supports TCF2, you can update the documentation.md file as described below above the table showing the list of TCF2-compliant bidders. If you are submitting changes to an adapter to support this approach, please also submit a PR to the [docs repo](https://github.com/prebid/prebid.github.io) to add the `gdpr_supported: true` variable to your respective page in the [bidders directory](https://github.com/prebid/prebid.github.io/tree/master/dev-docs/bidders). **This will ensure that your adapter's name will automatically appear on the list of adapters supporting GDPR.** @@ -271,12 +276,13 @@ Page JavaScript can prevent Prebid.js from performing various activities that co Here are some things that publishers can do to control various activities: -1. If the user hasn't consented to Purpose 1: +1. If the current page view is known to be in GDPR scope, make sure the adapters are aware of it even on the first page where CMP hasn't been activated by setting the defaultGdprScope: `consentManagement.gdpr.defaultGdprScope: true` +2. If the user hasn't consented to Purpose 1: - Set [deviceAccess: false](/dev-docs/publisher-api-reference.html#setConfig-deviceAccess) - Don't enable [userSync](/dev-docs/publisher-api-reference.html#setConfig-Configure-User-Syncing) - Don't enable [userId](/dev-docs/modules/userId.html) modules -2. If you're working with bidders that don't support GDPR, consider dynamically populating adunits as needed. See the list below for bidders supporting GDPR. +3. If you're working with bidders that don't support GDPR, consider dynamically populating adunits as needed. See the list below for bidders supporting GDPR. ### Publishers Not Using an IAB-Compliant CMP @@ -376,7 +382,7 @@ This should be be set to true once the parameters listed above are processed. ## Adapters Supporting TCF v1.1 -Bidders on this list have self-declared their TCF 1.1 support in their https://github.com/prebid/prebid.github.io/tree/master/dev-docs/bidders md file by adding "gdpr_supported: true". +Bidders on this list have self-declared their TCF 1.1 support in their https://github.com/prebid/prebid.github.io/tree/master/dev-docs/bidders md file by adding "gdpr_supported: true". @@ -402,7 +408,7 @@ var idx_gdpr=0; ## Adapters Supporting TCF v2.0 -Bidders on this list have self-declared their TCF 2.0 support in their https://github.com/prebid/prebid.github.io/tree/master/dev-docs/bidders md file by adding "tcf2_supported: true". +Bidders on this list have self-declared their TCF 2.0 support in their https://github.com/prebid/prebid.github.io/tree/master/dev-docs/bidders md file by adding "tcf2_supported: true". + +## Further Reading + +- [GDPR Enforcement Module](/dev-docs/modules/gdprEnforcement.html) +- [IAB Transparancy and Consent Framework Policies](https://iabeurope.eu/iab-europe-transparency-consent-framework-policies/) +- [Prebid Consent Management - US Privacy Module](/dev-docs/modules/consentManagementUsp.html) diff --git a/dev-docs/modules/floors.md b/dev-docs/modules/floors.md index 3c1e70a288..1f2c6cfab4 100644 --- a/dev-docs/modules/floors.md +++ b/dev-docs/modules/floors.md @@ -12,9 +12,6 @@ sidebarType : 1 # Price Floors Module {:.no_toc} -{: .alert.alert-warning :} -DRAFT - * TOC {:toc} @@ -22,447 +19,896 @@ DRAFT The Floors module provides an open source framework in Prebid for Publishers to configure price floors on their own or to work with a vendor who can provide floors. -A 'floor' is defined as the lowest price that a publisher will accept for a -bid on a Prebid AdUnit. It's a way for publishers to protect the value of -their inventory by requiring buyers to keep bids at a minimum level. +A ‘floor’ is defined as the lowest CPM price a bid will need to meet for each Prebid auction. It’s a way for publishers to signal to bidders the price to beat, thereby protecting the value of their inventory. -The module provides several ways for floors to be defined, passes them to -bidders and enforces that bid responses meet the floor in any supported currency. The floors utilized by Prebid.js are fairly simple, spanning only three dimensions: +The module provides several ways for floors to be defined, that are used by bidder adapters to read floors and enforced on bid responses in any supported currency. The floors utilized by the Prebid.js floors module are defined by one or more set of rules containing any or all of the following dimensions: -- AdUnit or AdSlot + +- AdUnit +- GPT Slot Name - MediaType - Ad Size +- Domain -The entire set of floors defined for a given page view are called 'Page Floors'. They may be defined in several ways: +{: .alert.alert-warning :} +When using GPT Slot name, the gpt library is required to load first. Failing to do so may yield unexpected results and could impact revenue performance. -1. Right in the AdUnit -1. With `setConfig` -1. Retrieved from a real-time data service +The entire set of floors selected by the Floors Module for a given auction is called a “Rule Location”. A Rule Location can be any one of: +1. Within the AdUnit (AdUnit) +2. Within setConfig (Package) +3. Retrieved from a real-time data service (Dynamic) -Examples for each of these scenarios follows. {: .alert.alert-info :} -Even though Page Floors are defined with only three attributes, -it's possible to utilize other attributes of the page or user to define the -Page Floors. For example, of floor values could be dynamically created -based on device type, country, page category, etc. +Even though floors are defined with five pre-configured dimensions, it’s possible to extend the list of dimensions to attributes of the page, user, auction or other data by supplying a dimension matching function. For example, a publisher can provide a matching function that returns the device type to allow the price floor module to use device type as an attribute within a prebid floor rules file. + + +## How it Works +There are several places where the Floor module changes the behavior of the Prebid.js auction process. Below is a diagram describing the general flow of the Floors Module: + +![Floors Module Flow](/assets/images/floors/floors_flow.png) + +1. When building the Prebid.js package, the Floors module (and any analytics adapters) needs to be included with 'gulp build --modules=floors,...' +2. As soon as the setConfig({floors}) call is initiated, the Floors Module will build an internal hash table for each auction derived from a Rule Location (one of Dynamic, setConfig or adUnit) + - a. If an endpoint URL (a Dynamic Floor) is defined, the Floors Module will attempt to fetch floor data from the Floor Provider's endpoint. When requestBids is called, the Floors Module will delay the auction up to the supplied amount of time in floors.auctionDelay or as soon as the dynamic endpoint returns data, whichever is first. +3. Bid Adapters are responsible for utilizing the getFloors() from the bidRequest object for each ad slot media type, size combination. The Floors Module will perform currency conversion if the bid adapter requests floors in a different currency from the defined floor data currency. +4. Bid Adapters will pass the floor values to their bidding endpoints, to request bids, responding with any bids that meet or exceed the provided floor +5. Bid adapters will submit bids to back to Prebid core, where the Floors Module will perform enforcement on each bid +6. The Floors Module will mark all bids below the floor as bids rejected. Prebid core will submit all eligible bids to the publisher ad server + - a. The Floors module emits floor event / bid data to Analytics adapters to allow Floor Providers a feedback loop on floor performance for model training + ## Defining Floors -How price floors are defined in the page environment will depend on how you're -obtaining the floors and how Prebid.js is integrated into the pages. We strongly recommend an automated analytical process rather than sporadic manual updates. +How price floors are used in the page will depend on how you’re obtaining the floors and how Prebid.js is integrated into the pages. For optimal revenue performance, we strongly recommend an automated flooring method compared to manual, sporadic updates. ### Floors Defined in the AdUnit -In this approach, the Publisher configures the floors directly into the Prebid.js -AdUnits. This method can be used on simple pages or as part of a content -management system that dynamically creates AdUnits. - -{% highlight js %} - var adUnits = [ - { - code: 'test-div', - mediaTypes: { - banner: { sizes: [[300,250],[300,600]] }, - video: { - context: 'outstream', - playerSize: [300,250], - ... - } - }, - floors: { - currency: 'USD', - schema: { - delimiter: '|', - fields: [ 'mediaType', 'size' ] - }, - values: [ - {key: 'banner|300x250', floor: 1.10}, - {key: 'banner|300x600', floor: 1.35}, - {key: 'video|300x250', floor: 2.00} - ] - }, - bids: [ - ... - ] +In this approach, the Publisher configures the floors directly into the Prebid.js AdUnits. This method can be used on simple pages or as part of a content management system that dynamically creates AdUnits. + +Below are some basic principles of ad unit floor definitions: + +- Ad unit defined rules only apply to the ad unit they are created in +- Setting a rule with a value that does not match the context of that given ad unit will never be used +- If multiple ad units have configured floor objects, the first ad unit’s schema would apply to all subsequent ad unit floor definitions + - Values can differ between ad units + + +{% highlight js %} + var adUnits = [ + { + code: 'test-div', + mediaTypes: { + banner: { sizes: [[300,250],[300,600]] }, + video: { + context: 'outstream', + playerSize: [300,250], + ... + } + }, + floors: { + currency: 'USD', + schema: { + delimiter: '|', + fields: [ 'mediaType', 'size' ] + }, + values: { + 'banner|300x250': 1.10, + 'banner|300x600': 1.35, + 'video|300x250': 2.00 + } + }, + bids: [ + ... + ] + } + ]; +{% endhighlight %} + +Floor definitions are set in the “values” object containing one or more rules, where the rule is the criteria that needs to be met for that given ad unit, with an associated CPM floor. In the above example, the floors are enforced when the bid from a bidder matches the “mediaType” and “size” combination. Since many bid adapters are not able to ingest floors per size, a simpler setup can be: + +{% highlight js %} +floors: { + currency: 'USD', + skipRate: 5, + modelVersion: 'Sports Ad Unit Floors', + schema: { + fields: [ 'mediaType'] + }, + values: { + 'banner': 0.8, + 'video': 2.01 } - ]; + } {% endhighlight %} -Note that the `values` object is what contains the actual floors, and in this -example they're based on a combination of the mediaType and size. Since many -adapters don't currently support defining a floor for each size, a simpler -definition would be: +For more advanced publisher setups, values can accept a “\*” to denote a catch all when a bid comes back that the floors module does not have an exact match and for bid adapters who are not able to use a floor per size, the bid adapter will automatically receive the “\*” rule’s floor if available. Example setup can be: {% highlight js %} - ... - floors: { - currency: 'USD', - schema: { - fields: [ 'mediaType' ] - }, - values: [ - {key: 'banner', floor: 1.10}, - {key: 'video', floor: 2.00} - ] - }, - ... +floors: { + currency: 'USD', + skipRate: 5, + modelVersion: 'Sports Ad Unit Floors', + schema: { + fields: [ 'mediaType', 'size'] + }, + values: { + 'banner|300x250': 0.8, + 'banner|300x600': 1.8, + 'banner|728x90': 0.90, + 'banner|*': 1.00, + 'video|300x250': 2.01, + 'video|*': 2.01 + } +} {% endhighlight %} -Or if there's only one mediaType in the AdUnit and a single global floor, the syntax gets easier: +Alternatively, if there’s only one mediaType in the AdUnit and a single global floor, the syntax gets easier: {% highlight js %} - ... - floors: { - default: 1.00 // default currency is USD - }, - ... +... + floors: { + default: 1.00 // default currency is USD + }, + ... {% endhighlight %} ### Package-Level Floors -This approach is intended for scenarios where the Publisher or their Prebid managed -service provider periodically appends updated floor data to the Prebid.js package. -In this model, there could be a more floor data present to -cover AdUnits across many pages. +This approach is intended for scenarios where the Publisher or their Prebid managed service provider periodically appends updated floor data to the Prebid.js package. In this model, there could be more floor data present to cover AdUnits across many pages. {% highlight js %} pbjs.setConfig({ floors: { - auctionDelay: 0, // this is the default - data: { + enforcement: { + floorDeals: false, //default to false + bidAdjustment: true + }, + data: { // default if endpoint doesn't return in time currency: 'USD', + skipRate: 5, + modelVersion: 'some setconfig model version', schema: { - fields: [ 'gptSlot' ] + fields: [ 'gptSlot', 'mediaType' ] }, - values: [ - {key: '/1111/homepage/top-rect', floor: 0.80}, - {key: '/1111/homepage/left-nav', floor: 0.90}, + values: { + '/1111/homepage/top-rect|banner': 0.80, + '/1111/homepage/top-rect|video': 2.20, + '/1111/homepage/top-rect|*': 1.50, + '/1111/homepage/left-nav|banner': 1.20, + '/1111/homepage/left-nav|video': 2.20, + '/1111/homepage/left-nav|*': 1.50, ... there could be hundreds of these ... - {key: '/1111/tech/left-nav', floor: 1.50} - ], - default: 0.75 + '*|banner': 0.98, + '*|video': 1.74 + } } } }); {% endhighlight %} -By defining floor data with setConfig, the Floors module will map GPT ad slots to AdUnits as needed. It does this in the same way as the setTargetingForGPTAsync() function -- first looking for an AdUnit.code that matches the slot name, then looking for an AdUnit.code that matches the div id of the named GPT slot. +By defining floor data with setConfig, the Floors module will map GPT ad slots to AdUnits as needed. It does this in the same way as the setTargetingForGPTAsync() function – first looking for an AdUnit.code that matches the slot name, then looking for an AdUnit.code that matches the div id of the named GPT slot. -Here's another example that includes more fields: +Here’s another example that includes more fields: {% highlight js %} pbjs.setConfig({ floors: { - data: { + data: { // default if endpoint doesn't return in time currency: 'USD', + skipRate: 5, + modelVersion: 'some setconfig model version', schema: { - fields: [ 'gptSlot', 'mediaType' ] + fields: [ 'domain', 'gptSlot', 'mediaType', 'size'] }, - values: [ - {key: '/1111/homepage/top-rect|banner', floor: 0.80}, - {key: '/1111/homepage/top-rect|video', floor: 1.20}, - {key: '/1111/homepage/left-nav|banner', floor: 0.90}, + values: { + 'www.plublisher.com|/1111/homepage/top-rect|banner|300x250': 0.80, + 'www.publisher.com|/1111/homepage/top-rect|video|300x250': 2.20, + 'www.plublisher.com|/1111/homepage/left-nav|banner|300x250': 1.77, + 'www.publisher.com|/1111/homepage/left-nav|video|300x250': 2.88 ... - {key: '/1111/tech/left-nav|banner', floor: 1.50} - ], - default: 0.75 + } } } }); {% endhighlight %} ### Dynamic Floors -The final method of obtaining floor data allows the publisher to delay the auction for a certain time period to obtain up-to-date floor data tailored to this specific pageview. The assumed workflow is: - +The final method of obtaining floor data allows the publisher to delay the auction for a certain time period to obtain up-to-date floor data tailored to each page or auction context. The assumed workflow is: + 1. The Publisher signs up with a floor data provider -1. The Publisher configures Prebid.js to resolve and enforce the price floor -1. The Floor provider makes a JSON file available with floor data +2. The Publisher configures Prebid.js to resolve and enforce the price floor +3. The Floor provider makes a JSON file available with floor data + +Here’s an example defining a simple GET endpoint: + +{% highlight js %} +pbjs.setConfig({ + floors: { + enforcement: { + floorDeals: true, //default to false + }, + auctionDelay: 100, // in milliseconds + endpoint: { + url: 'https://floorprovider.com/a1001-mysite.json' + } + } +}); +{% endhighlight %} + +The floors module is flexible to handle floors set in multiple locations. Like in the below example a publisher can configure Dynamic floors in addition to Package floors (in setConfig). While the floors module is only able to use one set of rules (either Package, adUnit or Dynamic) defined as a Floor Location, setting floors in the Package will be utilized when the Dynamic floors fail to return data or another error condition occurs with the Dynamic fetch. -Here's an example defining a simple GET endpoint: {% highlight js %} pbjs.setConfig({ floors: { + enforcement: { + floorDeals: false, //default to false + }, auctionDelay: 100, // in milliseconds endpoint: { - url: 'https://floorprovider.com/a1001-mysite.json', - method: 'GET' + url: 'https://floorprovider.com/a1001-mysite.json' }, data: { // default if endpoint doesn't return in time currency: 'USD', + skipRate: 5, + modelVersion: ‘new model 1.0’ schema: { fields: [ 'mediaType' ] }, - values: [ - {key: 'banner', floor: 0.80}, - {key: 'video', floor: 1.20} - ] + values: { + 'banner': 0.80, + 'video': 1.20 + } } } }); {% endhighlight %} -If the dynamic data doesn't come back from the endpoint in time, the floors defined in the data object will be utilized. -### SetConfig Syntax +### Floors Syntax The examples above covered several different scenarios. Here are all the options supported by the Floors module. {: .table .table-bordered .table-striped } -| Param | Required? | Type | Description | Default | +| Param | Type | Description | Default | |---+---+---+---+---| -| auctionDelay | no | integer | number of milliseconds to delay the auction. Will always be 0 if there's no endpoint param. Must be > 0 if endpoint is defined. | 100 if the 'endpoint' param is defined. 0 otherwise.| -| endpoint | no | object | defines how PBJS should call out to a floor provider to obtain dynamic floor data | none | -| endpoint.url | no | string | URL of the endpoint | none | -| endpoint.method | no | string | Only GET is currently supported. | "GET" | -| data | object | yes | floor data that may be used by the module to send to bidders and enforce floors. Used as a fallback if a dynamic floor service doesn't respond within the auctionDelay period. | none | -| data.currency | no | floor data will expressed in a given currency, which will be converted as needed to pass to adapters or enforce. | 'USD' | -| data.schema | no | allows for flexible definition of how floor data is formatted. | none | -| data.schema.delimiter | no | which character separates the floor keys | '\|' | -| data.schema.fields | no | array of strings | supported values are: gptSlot, adUnitCode, mediaType, size | none | -| data.values | no | array of objects | a series of attributes representing a hash of floor data in a format defined by the schema object. | none | -| data.values.key | no | string | delimited field of attribute values that define a floor | none | -| data.values.floor | no | float | the floor value for this key | none | -| data.default | no | float | floor to use if there aren't any values or if none of them match | none | +| enforcement | object | Controls the enforcement behavior within the Floors Module.| - | +| enforcement.enforceJS | boolean | If set to true, the floor module will provide floors to bid adapters for bid request matched rules and suppress any bids not exceeding a matching floor. If set to false, the prebid floors module will still provide floors for bid adapters, there will be no floor enforcement.| true | +| enforcement.enforcePBS | boolean | If set to true, the prebid js floors module will signal to PBS to pass floors to it’s bid adapters and enforce floors. If set to false, the pbjs should still pass matched bid request floor data to PBS, however no enforcement will take place. | false | +| enforcement.floorDeals | boolean | Enforce floors for deal bid requests | false | +| enforcement.bidAdjustment | boolean | Adjust floors passed to Bid Aapters. If bid adjustment is passed to PBS and flag set is not set to false | true | +| endpoint | object | Controls behavior for dynamically retrieving floors | - | +| endpoint.url | string | URL of endpoint to retrieve dynamic floor data | - | +| data | object (required) | Floor data used by the Floors Module to pass floor data to bidders and floor enforcement | - | +| data.currency | string |Currency of floor data. Floor Module will convert currency where necessary. See Currency section for more details. | 'USD' | +| data.skipRate | integer | skipRate is a random function whose input value is any integer 0 through 100 to determine when to skip all floor logic, where 0 is always use floor data and 100 is always skip floor data. The use case is for publishers or floor providers to learn bid behavior when floors are applied or skipped. Analytics adapters will have access to model version (if defined) when skipped is true to signal the Floors Module is in floors mode. | 0 | +| data.modelVersion | string | Used by floor providers to train on model version performance. The expectation is a floor provider’s analytics adapter will pass the model verson back for algorithm training. | - | +| data.schema | object |allows for flexible definition of how floor data is formatted. | - | +| data.schema.delimiter | string | Character separating the floor keys | '\|' | +| data.schema.fields | array of strings | supported values are: gptSlot, adUnitCode, mediaType, size | - | +| data.values | key / values | a series of attributes representing a hash of floor data in a format defined by the schema object. | - | +| data.values."rule key" | string | delimited field of attribute values that define a floor | - | +| data.values."floor" | float | the floor value for this key | - | +| data.default | float | Floor used if no matching rules are found | - | -## How it Works -There are several places where the Floor module changes the behavior of the Prebid.js auction process. +## Rule Handling + +### Rule Location Priority + +As defined in the overview, a Rule Location is where a particular rule is located, either defined in the Ad Unit, within setConfig or via a fetch from the browser (named Dynamic) for fresh rules. It may be possible (rather more than likely) that floor rules can be set in one or more locations for a given Prebid auction (i.e. on requestBids). At auction, the Floors Module will only ever use rules from one Rule Location, decided at run-time. Each auction will be assigned an immutable set of rules from one Rule Location, even if the rules change prior to auction complete. + +The Floors Module will use the below prioritization scheme on determining which Rule Location is selected at run-time: + +- Dynamic +- setConfig +- adUnit + + +### Rule Selection Process + +The job of the Prebid floors module is to select a matching Prebid floor rule for enforcement \(when a bid adapter bids in the auction\) given the context of each Ad Unit. With the usage of “\*” values in rules definitions \(where “\*” applies when no specific value matches\) multiple Prebid floor rules can match for a given ad unit auction. + +The Prebid Floors module algorithm will produce a list of every possible permutation for each ad unit auction based on the defined schema types. The best matching rule for each enforced bid request and getFloor is based on specificity of values \(meaning match an exact value\) weighted from left to right, where the specificity of a value in the left most column would match over a rule with it’s “\*” equivalent if “\*” is supplied. + +Priority order behavior where “\_” is a specific value, and the “\*” is a catch all + +Priority order for one column rule sets: + + \_ + \* + +Priority order for two column rule set: + + \_ \| \_ + \_ \| \* + \* \|\_ + \* \| \* + +Priority order for three column rule sets: + + \_ \| \_ \| \_ + \_ \| \_ \| \* + \_ \| \* \| \_ + \* \| \_ \| \_ + \* \| \_ \| \* + \_ \| \* \| \* + \* \| \_ \| \* + \* \| \* \| \_ + \* \| \* \| \* + + + +Below are some real example behaviors. + +#### Example 1 + +Domain = www.website.com + +Floor provider rule definition + +{% highlight js %} +{ + "modelVersion": "Fancy Model", + "currency": "USD", + "schema": { + "fields": [ "mediaType", "size", "domain"], + }, + "values": { + "banner|300x250|www.website.com": 1.01, + "banner|300x250|*": 2.01, + "banner|300x600|www.website.com": 3.01, + "banner|300x600|*": 4.01, + "banner|728x90|www.website.com": 5.01, + "banner|728x90|*": 6.01, + "banner|*|www.website.com": 7.01, + "banner|*|*": 8.01, + "*|300x250|www.website.com": 9.01, + "*|300x250|*": 10.01, + "*|300x600|www.website.com": 11.01, + "*|300x600|*": 12.01, + "*|728x90|www.website.com": 13.01, + "*|728x90|*": 14.01, + "*|*|www.website.com": 15.01, + "*|*|*": 16.01 + }, + "default": 0.01 +} +{% endhighlight %} + +**Bidder A Bid** + +mediaType = banner +Size = 300x600 +Domain context = www.website.com + +The Price Floor Module produces an internal hash table of all possible permutations of “banner”, “300x600”, “www.website.com” and “\*” with the most specific hash values up top, weighting rules priority from left column specific values to right. Each left value will weigh more than the subsequent column’s specific values. The Floors Module attempt to find the matching rule by cycling through each below possible rule (from top to bottom) against the above rule provider data set. + +{% highlight js %} +{ + "banner|300x600|www.website.com", //Most specific possible rule match against floor provider rule set + "banner|300x600|*", + "banner|*|www.website.com", + "*|300x600|www.website.com”, + "banner|*|*", + "*|300x600|*", + "*|300x600|*", + "*|*|www.website.com", + "*|*|*" + } +{% endhighlight %} + +Matching rule: "banner|300x600|www.website.com" +Floor enforced: 3.01 + + +**Bidder B Bid** + +mediaType = video +Size = 640x480 +Domain context = www.website.com + +Price Floor internal possible permutations sorted by priority: +{% highlight js %} +{ + "video|640x480|www.website.com", //Fails to match due to no video specific rule + "video|640x480|*", //Fails to match due to no video specific rule + "video|*|www.website.com", //Fails match due to no video specific rule + "*|640x480|www.website.com", //Fails match due to no size 480 specific rule + "video|*|*", //Fails match due to no size video specific rule + "*|640x480|*", //Fails match due to no size 480 specific rule + "*|*|www.website.com", //Matching rule + "*|*|*" + } +{% endhighlight %} + +Matching rule: "\*|\*|www.website.com" +Enforced Floor: 15.01 + + +**Bidder C Bid** + +mediaType = video +Size = 300x250 +Domain context = www.website.com + +Price Floor internal possible permutations sorted by priority: +{% highlight js %} +{ + "video|300x250|www.website.com", //Fails to match due to no video specific rule + "video|300x250|*", //Fails to match due to no video specific rule + "video|*|www.website.com", //Fails to match due to no video specific rule + "*|300x250|www.website.com", //Matching rule + "video|*|*", + "*|300x250|*", + "*|*|www.website.com", + "*|*|*" + } +{% endhighlight %} + +Matching Rule "\*|300x250|www.website.com” +Enforced floor: 10.01 + +#### Example 2 + +Similar data set with slightly different rules and same bids from each bidder. Matching rules will differ from example 1. + +Domain = www.website.com + +Floor provider rule definition + +{% highlight js %} +{ + "modelVersion": "Fancy Model", + "currency": "USD", + "schema": { + "fields": [ "mediaType", "size", "domain"], + }, + "values": { + "banner|300x250|www.publisher.com": 1.01, + "banner|300x250|*": 2.01, + "banner|300x600|www.publisher.com": 3.01, + "banner|300x600|*": 4.01, + "banner|728x90|www.website.com": 5.01, + "banner|728x90|*": 6.01, + "banner|*|www.website.com": 7.01, + "banner|*|*": 8.01, + "video|*|*": 9.01, + "*|300x250|www.website.com": 9.01, + "*|300x250|*": 10.01, + "*|300x600|www.website.com": 11.01, + "*|300x600|*": 12.01, + "*|728x90|www.website.com": 13.01, + "*|728x90|*": 14.01, + "*|*|www.website.com": 15.01, + "*|*|*": 16.01 + }, + "defaultValue": 0.01 +} +{% endhighlight %} + +**Bidder A Bid** + +mediaType = banner +Size = 300x600 +Domain context = www.website.com + +{% highlight js %} +{ + "banner|300x600|www.website.com", // Fails due to website.com does not match with banner and 300x600 + "banner|300x600|*", // Banner, 300x600 * matches first + "banner|*|www.website.com", + "*|300x600|www.website.com”, + "banner|*|*", + "*|300x600|*", + "*|300x600|*", + "*|*|www.website.com", + "*|*|*" + } +{% endhighlight %} + +Matching rule: "banner|300x600|\*" +Floor enforced: 4.01 + +**Bidder B Bid** + +mediaType = video +Size = 640x480 +Domain context = www.website.com. + +Price Floor internal possible permutations sorted by priority: + +{% highlight js %} +{ + "video|640x480|www.website.com", //Fails to match due to no video specific rule + "video|640x480|*", //Fails to match due to no video specific rule + "video|*|www.website.com", //Fails match due to no video specific rule + "*|640x480|www.website.com", //Fails match due to no size 480 specific rule + "video|*|*", //Matches existing rule + "*|640x480|*", + "*|*|www.website.com", + "*|*|*" + } +{% endhighlight %} + +Matching rule: "video\|\*\|\*" +Enforced Floor: 9.01 + + +**Bidder C Bid** + +mediaType = video +Size = 300x250 +Domain context = www.website.com + +Price Floor internal possible permutations sorted by priority: + +{% highlight js %} +{ + "video|300x250|www.website.com", //Fails to match due to no video specific rule + "video|300x250|*", //Fails to match due to no video specific rule + "video|*|www.website.com", //Fails to match due to no video specific rule + "*|300x250|www.website.com", //Matching existing rule + "video|*|*", + "*|300x250|*", + "*|*|www.website.com", + "*|*|*" + } +{% endhighlight %} + +Matching Rule "\*|300x250|www.website.com” +Enforced floor: 10.01 -1. When building the Prebid.js package, the Floors module needs to be included with 'gulp build --modules=floors,...' -1. As soon as the setConfig({'floors'}) call is made, the Floors module will immediately initiate any calls to a dynamic floor endpoint. -1. When an auction is initiated with requestBids(), the Floors module will request to delay the auction if the auctionDelay option is set. -1. If it hasn't converted floor currencies already, the Floors module will look for the existence of a configured Ad Server Currency, converting floor prices as needed. -1. Bid Adapters are responsible for utilizing the getFloors() function and passing the floor values to their bidding endpoints. -1. Prebid.js core gives the Floors module a chance to review each bid response, which will be invalidated if they exceed the floor value. -1. Analytics adapters have access to the floor data and any invalidated bid statuses. ## Interfaces ### Floor Data Provider Interface -Dynamic endpoints must return JSON data that's formatted like the data object -in the floor `setConfig` call. Floor data should be returned quickly because -the auction may be waiting on it. This implies that it should either be -stored on a CDN or be provided by a distributed tier of high performance servers. +Floor data providers can supply data to publishers either within the setConfig as part of a Prebid.js Package if the provider is also a host provider of the Prebid library, or via a real-time Dynamic fetch, prior to the auction. + +Data providers can optionally build Analytics Adapters to ingest bid data within Prebid for algorithm learning and review floor performance. Please refer to the Analytics Interface section for more details. + + + +{% capture warning_note %} +As a floor provider, your goal is to provide effective floors, with minimal page impact. If you are performing a Dynamic fetch to retrieve data prior to auctions, the following recommendations are advised to reduce page performance issues: + +- Return results to the page quickly. This implies data should be stored on a CDN or be provided by a distributed tier of high performance services +- Work with publishers on setting appropriate auction delays to retrieve dynamic data +- Implement client-side caching (such as max-age headers) whenever possible +- Evaluate data freshness vs frequency of new fetches to the CDN to reduce unnecessary calls +- Be aware of file sizes returned to the browser, implementing trimmiming algorithms for extremely large data sets +{% endcapture %} +{% include /alerts/alert_important.html content=warning_note %} + +For Dynamic fetches, the floors module will perform a GET request to the supplied endpoint, that must return valid JSON, formatted like the data object in the “setConfig” Package configuration. + + +On rule creation, we recommend supplying various rules with catch all \(“\*”\) values with associated floors. This is to accommodate bid adapters who cannot retrieving floors on a per size basis, as well as using various permutations of rules with “\*” values to match auctions that do not have an exact match on a specific rule. Please refer to the Rule Selection Process when determining floors as attribute order and number of “\*”s may have an impact on which rule is selected. + +#### Example Dynamic fetch -Example Response 1 - floor determined by GPT Ad Slot and mediatype {% highlight js %} -{ - data: { - currency: 'USD', - schema: { - fields: [ 'gptSlot', 'mediaType' ] - }, - values: [ - {key: '/1111/homepage/top-rect|banner', floor: 0.80}, - {key: '/1111/homepage/top-rect|video', floor: 1.20}, - {key: '/1111/homepage/left-nav|banner', floor: 0.90}, - ... - {key: '/1111/tech/left-nav|banner', floor: 1.50} - ], - default: 0.75 +pbjs.setConfig({ + floors: { + enforcement: { + floorDeals: true + }, + auctionDelay: 100, + endpoint: { + url: 'https://floorprovider.com/a1001-mysite.json' } + } +}); +{% endhighlight %} + +#### Example Response 1 + +floor determined by AdUnit code and Media Type: + +{% highlight js %} +{ + currency: 'USD', + skipRate: 5, + modelVersion: ‘new model 1.0’ + schema: { + fields: [ 'gptSlot', 'mediaType' ] + }, + values: { + '/1111/homepage/top-rect|banner': 0.80, + '/1111/homepage/top-rect|video': 1.20, + '/1111/homepage/left-nav|banner': 0.90, + ... + '/1111/tech/left-nav|banner': 1.50 + }, + default: 0.75 } + {% endhighlight %} -Example Response 2 - floor determined by AdUnit code and size: +#### Example Response 2 + +floor determined by Domain, GPT Slot, Media Type and Size: + {% highlight js %} { - data: { - currency: 'EUR', - schema: { - fields: [ 'adUnitCode', 'size' ] - }, - values: [ - {key: 'div-1|300x250', floor: 0.80}, - {key: 'div-2|300x600', floor: 1.20}, - {key: 'div-2|300x250', floor: 0.90}, - ... - {key: 'div-3|640x480', floor: 1.50} - ], - default: 0.75 - } + currency: 'EU', + skipRate: 20, + modelVersion: ‘High_skip_rate’ + schema: { + fields: [ 'domain', 'gptSlot', 'mediaType', 'size' ] + }, + values: { + 'www.publisher.com|/1111/homepage/top-banner|banner|728x90': 1.00, + 'www.publisher.com|/1111/homepage/top-rect|banner|300x250': 1.20, + 'www.publisher.com|/1111/homepage/top-rect|banner|300x600': 1.80, + ... + 'www.domain.com|/1111/homepage/top-banner|banner|728x90': 2.11 + ... + 'www.publisher.com|*|*|*': 0.80, + }, + default: 0.75 } {% endhighlight %} -The format of the request for dynamic floor data has been left open - -each floor provider can determine the URL structure, working -with the publisher to integrate their service into the page. -### Prebid.js Bid Adapter Interface +### Bid Adapter Interface + +The Prebid Floors Module is capable of handling an arbitrarily large set of floor rules of any combination of supported dimensions. To reduce the need for each bid adapter to process each and every rule in the selected rule data set, an encapsulated function (getFloor) was created to allow bid adapters to query the Floors Module for a floor for each mediaType, size and currency the bid adapter needs. -Many Prebid.js bid adapters already allow the publisher to define a floor in -their bidder-specific params. This module establishes a new and more powerful -convention, but requires each adapter look for the floor data in the -appropriate place. Rather than forcing adapters to look in the AdUnit and -the global config and parse complicated floor data, we've thoughtfully -provided a utility function called 'getFloors()'. To use it: +If the price floors module is enabled for a given auction, the Floors Module will add to the bidRequest object the getFloor function. All bid adapters are recommended to call getFloor to retrieve a desired floor. The job of the getFloor function will be to return the floor CPM of a matched rule based on the rule selection process (written out above), using the getFloor inputs. -1. import getFloor function -1. call getFloors() with the desired parameters -1. parse the results -1. pass floor value(s) to the bid endpoint +Intended changes for bid adapters: + + +1. Check for presence of getFloor within the bidRequest obect +1. If getFloors exists, call getFloor with desired parameters +1. Parse floor and currency response +1. Pass floor and / or currency to bid adapter endpoint + +getFloor takes in a single object with the following params: {% highlight js %} -getFloors(paramsObj); +getFloor({ + currency: string, + mediaType: string //Required + size : [ w, h] OR "*" +}); {% endhighlight %} {: .table .table-bordered .table-striped } -| Param | Required? | Type | Description | Default | -|---+---+---+---+---| -| bidRequest | yes | object | bidRequest object passed to buildRequests function | none | -| currency | no | string | preferred floor currency | adServerCurrency | -| mediaType | no | string | some adapters don't support all media types, so this constrains results to just the type needed by the current ad unit. e.g. 'banner' | none | -| supportMultipleSizes | no | boolean | supporting different floors per size isn't yet a common feature, but we default it to true. By supplying 'false' to this argument, a single floor value will be returned | true | +| Param | Type | Description | Default | +|---+---+---+---| +| bidRequest | object | bidRequest object passed to buildRequests function | none | +| mediaType | string | The media type within the current bidRequest context to receive a floor from the Floors Module. Floors Module will return best matching floor. Possible values are one of “banner”, “video”, “Native” or "\*" | "banner" | +| size | Size array or ‘\*’ (required) | The size within the current bidRequest context to receive a floor from the Floors Module. Defaults to ‘\*’Array of size [w, h] for a specific size. If your bid adapter cannot handle size specific floors, use ‘\*’ to retrieve catch all size floor if defined by the publisher or floor provider | "\*" | +| currency | String | The desired currency to return the floor in. Please refer to the currency section to understand how currency conversion is applied. If no currency is supplied, the floor module will assume USD. If the Floor Module cannot convert a floor to the supplied currency, bid adapters will be required to handle the supplied floor. | "USD" | + +#### getFloor Response + +{% highlight js %} +{ + currency: string, + floor: float +} +{% endhighlight %} + +Or empty object if a floor was not found for a given input -The JSON object returned by the function looks similar to the floors object in the adunit. +{% highlight js %} +{ } +{% endhighlight %} -For example, a bidder adapter that can only handle one floor value could make this call: +#### Example getFloor scenarios + +Example rules file used for getFloor {% highlight js %} -getFloors({ - bidRequest: bidRequestObj, +{ + "data": { + "currency": "USD", + "schema": { + "fields": [ "gptSlot", "mediaType", "size"] + }, + "values": { + "/1111/homepage/top-rect|banner|300x250": 0.60, + "/1111/homepage/top-rect|banner|300x600": 1.78, + "/1111/homepage/top-rect|banner|*": 1.10, + "/1111/homepage/top-rect|video|480x600": 3.20, + "/1111/homepage/top-leaderboard|banner|728x90": 1.50 + }, + "default": 0.75 + } +} +{% endhighlight %} + +**Example getFloor 1** + +getFloor for media type Banner for a bid request in the context of the gpt slot “/1111/homepage/top-rect” where the bid adapter does not support floors per size. + +{% highlight js %} +getFloor({ currency: 'USD', - mediaType: 'banner', - supportMultipleSizes: false + mediatype: ‘banner’, + Size: ‘*’ }); {% endhighlight %} -The response in this case would quite easy to parse: +**Response** {% highlight js %} { currency: 'USD', - default: 1.80 + floor: 1.10 } {% endhighlight %} -But if the `mediaType` field isn't passed in the params object, the response would provide different floor values for each mediaType: +To aid in the accuracy of floor selection when using size ”\*” in getFloor, the Floors Module has built-in smart rule selection when an ad unit in the internal bidRequest to the bid adapters interface has one ad unit type and one size. In the above example, if the ad unit within the bidRequest object has an ad unit type of “banner” with only one size, say “300x250”, the Floors Module will intelligently select the rule with "banner\|300x250" in it, as opposed to the "banner\|\*" rule producing the following response: {% highlight js %} { currency: 'USD', - schema: { - fields: [ 'mediaType' ] - }, - data: [ - {key: 'banner', floor: 1.60}, - {key: 'video', floor: 1.80} - ] + floor: 0.60 } {% endhighlight %} -And adapters that support full floor flexibility could receive something they need to parse: + +**Example getFloor 2** + +getFloor for media type Banner for a bid requests in the context of the gpt slot “/1111/homepage/top-rect” with size of 300x600 where bid adapter does support floors per size. + +{% highlight js %} +getFloor({ + currency: 'USD', + size: [300,600], + mediatype: ‘banner’ +}); +{% endhighlight %} + +**Response** {% highlight js %} { currency: 'USD', - schema: { - fields: [ 'mediaType', 'size' ] - }, - data: [ - {key: 'banner|300x250', floor: 1.50}, - {key: 'banner|300x600', floor: 1.60}, - {key: 'video|300x250', floor: 1.80}, - ] + floor: 1.78 } {% endhighlight %} -{: .alert.alert-info :} -Note that whenever the `getFloors` function combines multiple underlying floors -into one, it always chooses the highest floor in order to avoid any scenario -where a bid is later discarded due to more granular flooring rules. Yes, -this will affect bid density. +Here are some examples of how a bid adapter may wish to configure their adapter to handle getFloor function: + +For a bid adapter who does not wish to handle making a request for each size in a given bid request they can leverage the \* attribute which is meant to be a skewed average for a floor. + +{% highlight js %} + if (typeof bidRequest.getFloor === 'function') { + let floorInfo = bidRequest.getFloor({ + currency: 'USD', + mediaType: 'banner', + size: '\*' + }); + data['adapter_floor'] = floorInfo.currency === 'USD' ? floorInfo.floor : undefined; + } +{% endhighlight %} + +### Analytics Adapter Interface -### Prebid.js Analytics Adapter Interface +Price Floors providers will most likely rely heavily on their associated (or their partner’s) prebid analytics adapter in order to make the most informed and optimal price floor rule sets. Because of this, the price floors module needs to relay important information about the flooring and decisions made in the lifecycle of an auction. -Analytics adapters may want to report on floor-related events: +The price floors module will do this by leveraging the already existing implementation for prebid analytics adapters by exposing floorData information onto the bidRequest and bidResponse objects. Thus, when an analytics adapter hooks into these prebid events, it will be able to pick out the price floors data and pass it along to their servers. -- which floors were sent to the bidders on each AdUnit -- whether any bids were discarded because the bidder did not respect the floor +**bidRequest**: Bid Requests objects are updated to contain some basic top level information which a floor provider may need: -Like bid adapters, analytics adapters can call the 'getFloors()' utility -function with each bidrequest object to obtain the floor data. They can -check the status of the bid, which would be NO_BID_FLOOR if the bid was -discarded because it was below the floor. +{: .table .table-bordered .table-striped } +| bidRequest.floorData. | Type | Description | example | +|---+---+---+---+---| +| skipped | Boolean | Whether the skipRate resolved to be true or false| true | +| modelVersion | String | The name of the model| ‘floor-model-4.3’ | +| location | String | Where the floor rules came from adUnit, setConfig, fetch | ‘floor-model-4.3’ | + +**bidResponse**: When a bid response is being processed it is important for analytics adapters to know the decision which was made and the context of the rule selection. Here is the data which is attached to each bidResponse: + +{: .table .table-bordered .table-striped } +| bidResponse.floorData. | Type | Description | example | +|---+---+---+---+---| +| floorValue | number | The value of the floor chosen | 2.33 | +| modelVersion | String | The name of the model| ‘floor-model-4.3’ | +| floorRule | String | The matching rule for the given bidResponse | ‘div-1\|300x250\|\*’ | +| floorCurrency | string | Currency of the matched floor | ‘USD’ | +| cpmAfterAdjustments | number | The bidder response CPM after any applicable adjustments (currency and / or bidCpmAdjustments) | 2.20 | +| enforcements | object | The input floor enforcements object. Keys are enforceJS, enforcePBS, floorDeald, bidAdjustment | { enforceJS: true, enforcePBS: false, floorDeals: false, bidAdjustment: true } | +| matchedFields | object | Fields of the prebid auction used to match against the floorData.schema.fields. | { mediaType: ‘banner’, Size: ‘300x250, Domain: ‘www.prebid.org’, gptSlot: ‘/12345/prebid/sports’ } | ### Prebid Server Interface -The Prebid Server Bid Adapter copies floor configuration to the OpenRTB2 protocol: +Not supported in initial build. S2S config support will be coming in the subsequent release. + + +## Currency -- It copies AdUnit-specific floor values directly to the relevant imp object -- It copies floors data coming from setConfig to ext.prebid.floors -- It does not copy any endpoint information -- it is assumed that if dynamic floor data is used, that transaction is being handled by Prebid.js and should not be done again on the server side. -- It always sets ext.prebid.options.enforcefloors to false because there's no way in OpenRTB to return no-bid status per-impression. +The floors module will default the floor CPM currency with any associated rule to USD if none is supplied in the data object of the floors configuration. For any non-USD currency support, a publisher is required to specify the desired currency. If you are working with a floor provider, please speak to them about supplying the desired currency for your integration. -AdUnit-specific Floors in OpenRTB: +{% capture warning_note %} +For publishers seeking to perform currency conversions within the floors module (for example if the floors data currency is not the same as a bid adapter’s supported currency), failure to include the currency module may result in unexpected behavior and / or may impact revenue performance. +{% endcapture %} +{% include /alerts/alert_warning.html content=warning_note %} + +Currency conversion can occur in two areas of the Floor Module code: +- On the **getFloor** call when Bid Adapters request a floor +- On the **enforcement** side when each bidder submits a bidResponse + + +**getFloor** + +The job of the getFloor method is to retrieve an appropriate floor for the requesting Bid Adapter, for a given auction context. If a Bid Adapter performs a getFloor call with a currency different than the currency of the floor data, the Floors Module will attempt to perform a currency conversion, utilizing the convertCurrency function in the global Prebid object. + +If a currency conversion is successful in getFloor, the resulting floor will be returned to the requesting Bid Adapter. If the conversion failed, the Floors Module will return the original floor currency defined within the selected rule location data set. + +Example Rule: +currency = ‘USD’, +‘banner|300x250’: 1.00 + +{% highlight js %} +getFloor({ + currency: ‘EUR’, + mediaType: ‘banner’, + size: [300, 250] +}); +{% endhighlight %} + +If successfully returned the requested currency: {% highlight js %} { - "cur": "USD", - "imp": [{ - ... - "ext": { - "prebid": { - "floors": { - "data": { - "currency": "USD", - "schema": { - "delimiter": "|", - "fields": [ "mediaType", "size" ] - }, - "values": [ - {"key": "banner|300x250", "floor": 0.90}, - {"key": "banner|300x360", "floor": 1.07}, - {"key": "banner|*", "floor": 0.56}, - ] - } - } - } - } - }], - "ext": { - "prebid": { - "options": { - "enforcefloors": false, - } - } - } + floor: 0.85, + currency: ‘EUR’ } {% endhighlight %} -Floors defined in `setConfig` are placed in the top-level `ext` object: +If unsuccessfully returned the requested currency: {% highlight js %} { - "cur": "USD", - "imp": [{ - ... - }], - "ext": { - "prebid": { - "options": { - "enforcefloors": false, - }, - "floors": { - "data": { - "currency": "USD", - "schema": { - "delimiter": "|", - "fields": [ "mediaType", "size" ] - }, - "values": [ - {"key": "banner|300x250", "floor": 0.90}, - {"key": "banner|300x360", "floor": 1.07}, - {"key": "banner|*", "floor": 0.56}, - ] - } - } - } - } + floor:1.0, + currency: ‘USD’ } {% endhighlight %} -When called from Prebid.js, the convention is that Prebid Server will pass floors provided by Prebid.js to the adapters, but will not enforce floors. +Currency conversion can fail for the following reasons: +- Currency module is not included in the prebid bundle. +- Currency module is included but not enabled +- Currency module is included and enabled but: + - No default rates were set + - Currency rates fetch failed + - Data has not returned yet +- Bidder passes in a currency code which does not have a conversion rate +- Floors was set with a currency which does not have a conversion rate + +**Enforcement** + +Enforcement in the Floors module occurs when bidders respond (i.e. bid) with a bidResponse object into the Prebid auction. The Floors Module will read the bid submitted within each valid bidResponse and its associated currency, performing currency conversion where necessary. -A separate document will describe how Prebid Server handles floors for SDK and AMP. +There exist three locations where currencies can differ within enforcement: + +- adServerCurrency: The currency the publisher set in their currency module setConfig call +- Price Floor Currency: Currency set in the price floors data object +- bidResponse Currency: The currency the bidder returned with their bidResponse back to Prebid + +When a bid adapter submits a bid into the auction, the currency module will first determine if any conversion logic is necessary, afterwhich the bid is passed to the Floors Module. If currency conversion occurs at this stage, the bidResponse object will have the following attributes: + +- Cpm: The adServerCurrency converted CPM currency +- Currency: The currency the adServerCurrency was set in +- originalCpm: The original CPM the bidder responded with +- originalCurrency: The original currency the bidder responded with + +Below is a chart explaining the behavior of currency conversion, if necessary, within the Floors Module when comparing bid CPM to floor CPM for enforcement: + +{: .table .table-bordered .table-striped } +| bid.currency | bid.originalCurrency | floor.currency | result | +|---+---+---+---+---| +| USD | USD | USD | Bid.cpm is compared to floor. If bid meets or exceeds the floor, bid.originalCpm is sent to the ad server. | +| USD | USD | EUR | Bid.cpm is converted to EUR then compared with floor. If bid meets or exceeds the floor, bid.originaCpm is sent to the ad server. | +| USD | EUR | EUR | bid.originalCpm is compared to floor. If bid meets or exceeds the floor, bid.Cpm is sent to the ad server. | +| USD | JPY | EUR | Bid.cpm is converted to EUR then compared with floor. If bid meets or exceeds the floor, bid.Cpm is sent to the ad server. | +| EUR | USD | EUR | Bid.cpm is compared to floor. If bid meets or exceeds the floor, bid.Cpm is sent to the ad server. | +| USD | Undefined (currency module possibly not included) | USD | Bid.cpm is compared to floor. If bid meets or exceeds the floor, bid.originalCpm is sent to the ad server. | +| USD | Undefined (currency module possibly not included) | EUR | Bid.cpm is converted to EUR then compared with floor. Bid.cpm is compared to floor. If bid meets or exceeds the floor, bid.originalCpm is sent to the ad server. | + +If the currency function is unable to derive the correct cpm in any of the scenarios above where a conversion is needed, then the associated bidResponse will just pass through into the auction as if a matching floor was not found. diff --git a/dev-docs/modules/gdprEnforcement.md b/dev-docs/modules/gdprEnforcement.md new file mode 100644 index 0000000000..eb0caf12bc --- /dev/null +++ b/dev-docs/modules/gdprEnforcement.md @@ -0,0 +1,201 @@ +--- +layout: page_v2 +page_type: module +title: GDPR Enforcement Module +description: Module to enforce GDPR consent +module_code : gdprEnforcement +display_name : GDPR Enforcement +enable_download : true +sidebarType : 1 +--- + +# GDPR Enforcement Module +{: .no_toc } + +* TOC +{: toc } + +{: .alert.alert-warning :} +This module requires the [EU GDPR consent management module](/dev-docs/modules/consentManagement.html), which reads consent values from the Consent Management Platform (CMP). The GDPR enforcement module +will then enforce the results. See the base module page for general background, usage, and legal disclaimers. + +## Overview + +The base [EU GDPR consent management module](/dev-docs/modules/consentManagement.html) performs the following actions: + +1. Fetch the user's GDPR consent data from the CMP. +2. Incorporate this data into the auction objects for adapters to collect. + +This GDPR enforcement module adds the following: + +3. Allows the page to define which activities should be enforced at the Prebid.js level. +4. Actively enforces those activities based on user consent data. + +The following table details the Prebid.js activities that fall under the [Transparency and Consent Framework (TCF)](https://iabeurope.eu/iab-europe-transparency-consent-framework-policies/) scope: + +{: .table .table-bordered .table-striped } +| TCF Purpose | In-Scope Activity | Enforcement Activity | Optional Controls | +| --- | --- | --- | --- | +| Purpose 1 - Store and/or access information on a device | usersync pixels | May prevent one or more vendor usersyncs. | Do not enforce Purpose 1. Do not enforce Purpose 1 vendor signals. Do not enforce Purpose 1 for vendor V. | +| Purpose 1 - Store and/or access information on a device | user ID modules | May prevent one or more UserID modules from activating. | Do not enforce Purpose 1. Do not enforce Purpose 1 vendor signals. Do not enforce Purpose 1 for vendor V. | +| Purpose 1 - Store and/or access information on a device | device storage | May prevent one or more adapters or modules from being able to read or write cookies or localstorage in the user's browser. | Do not enforce Purpose 1. Do not enforce Purpose 1 vendor signals. Do not enforce Purpose 1 for vendor V. | + +There are plans to add more TCF Purposes and activities in future releases. + +## Page Integration + +A page needs to define configuration rules about how Prebid.js should enforce each in-scope activity. + +{: .alert.alert-warning :} +**Important Legal Note:** Prebid.org cannot provide legal advice about GDPR or any other governmental regulation. Our aim is to provide a toolkit of functionality that will let publishers configure header bidding as defined by their legal counsel. We will consider feature suggestions, and review any code offered by the community. + +These are the fields related to GDPR enforcment that are supported in the [`consentManagement.gdpr`](/dev-docs/modules/consentManagement.html) object: + +{: .table .table-bordered .table-striped } +| Param | Type | Description | Example | +| --- | --- | --- | --- | +| gdpr.rules | `Array of Objects` | Lets the publisher override the default behavior. | | +| gdpr.rules[].purpose | `String` | The only currently supported value is "storage", corresponding to TCF Purpose 1. | "storage" | +| gdpr.rules[].enforcePurpose | `Boolean` | Determines whether to enforce the purpose consent or not. The default in Prebid.js 3.x is not to enforce purposes. The plan for Prebid.js 4.0 is to enforce consent for Purpose 1 and no others. | true | +| gdpr.rules[].enforceVendor | `Boolean` | Determines whether to enforce vendor signals for this purpose or not. The default in Prebid.js 3.x is not to enforce vendor signals. The plan for Prebid.js 4.0 to enforce signals for Purpose 1 and no others. | true | +| gdpr.rules[].vendorExceptions | `Array of Strings` | Defines a list of biddercodes or module names that are exempt from the enforcement of this Purpose. | true | + +Note: + +- The vendorExceptions list is based on Prebid.js biddercodes instead of Global Vendor List (GVL) IDs, i.e. "rubicon" instead of "52". This was done to accomodate Prebid.js modules and adapters that don't have GVL IDs. + +### Examples + +The following examples cover a range of use cases and how Prebid.js supports +configuration of different business rules. + +1) Enforce that the user consents to DeviceAccess as an activity and consider their per-vendor selection. + +``` +pbjs.setConfig({ + consentManagement: { + gdpr: { + ... + rules: [{ + purpose: "storage", + enforcePurpose: true, + enforceVendor: true + } + } + } +}); +``` + +2) Enforce that the user consents to DeviceAccess as an activity and consider their per-vendor selection. However, BidderA is a special case - the publisher has entrusted BidderA for this activity regardless of what the user says. + + ... + rules: [{ + purpose: "storage", + enforcePurpose: true, + enforceVendor: true, + vendorExceptions: ["bidderA"] + } + +3) Enforce that the user consents to DeviceAccess as an activity, but don't consider their per-vendor selection. + + ... + rules: [{ + purpose: "storage", + enforcePurpose: true, + enforceVendor: false, + } + +4) Enforce that the user consents to DeviceAccess as an activity, but don't consider their per-vendor selection for any bidders except BidderA. BidderA is entrusted to enforce the rules on their own. + + ... + rules: [{ + purpose: "storage", + enforcePurpose: true, + enforceVendor: false, + vendorExceptions: ["bidderA"] + } + +5) Turn off enforcement of Purpose 1: don't enforce either the user's DeviceAccess consent or their per-vendor selection. + + ... + rules: [{ + purpose: "storage", + enforcePurpose: false, + enforceVendor: false + } + +6) Don't enforce the user's DeviceAccess consent, but do consider their per-vendor selection. + + ... + rules: [{ + purpose: "storage", + enforcePurpose: false, + enforceVendor: true + } + +7) Don't enforce the user's DeviceAccess consent, but do consider their per-vendor selection; don't enforce vendor selection for BidderA. + + ... + rules: [{ + purpose: "storage", + enforcePurpose: false, + enforceVendor: true, + vendorExceptions: ["bidderA"] + } + +## Basic Enforcement + +Prebid.js does not have access to the Global Vendor List (GVL), so it implements +a "basic" form of TCF validation using the supplied consent string. + +A goal of basic enforcement is to confirm that there's enough evidence of consent to pass data on to vendors who do have access to the GVL and can fully parse and enforce. + +Before allowing an activity tied to a TCF-protected Purpose for a given vendor, one of these scenarios must be true: + +- Configuration rules enforce both consent and vendor signals and either: + - we have the user’s purpose consent and the user’s vendor consent, or + - we confirmed the user’s LI (Legitimate Interest) Transparency is established for this purpose and the user’s Vendor LI field didn’t reject this vendor. +- Configuration rules enforce only purpose consent and either: + - we have the user’s purpose consent, or + - we confirmed the user’s LI Transparency is established for this purpose. +- Configuration rules enforce only vendor signals and either: + - we have the user’s vendor consent, or + - we confirmed the user’s Vendor LI field didn’t reject this vendor +- Configuration rules enforce neither purpose consent nor vendor signal. + +Technically these rules are defined as follows: + +1. enforcePurpose[P]==true AND PurposesConsent[P]==1 AND enforceVendor[P,V]==true AND VendorConsentBitfield[V]==1 +1. enforcePurpose[P]==true AND PurposesConsent[P]==1 AND enforceVendor[P,V]==false +1. enforcePurpose[P]==false AND enforceVendor[P,V]==true AND VendorConsentBitfield[V]==1 +1. enforcePurpose[P]==true AND PurposesLITransparency[P]==1 AND enforceVendor[P,V]==true AND VendorLegitimateInterestBitfield[V]==1 +1. enforcePurpose[P]==true AND PurposesLITransparency[P]==1 AND enforceVendor[P,V]==false +1. enforcePurpose[P]==false AND enforceVendor[P,V]==true AND VendorLegitimateInterestBitfield[V]==1 +1. enforcePurpose[P]==false AND enforceVendor[P,V]==false + +Where: + +- P is the Purpose number +- V is the vendor ID +- 'enforcePurpose' and 'enforceVendor' are Prebid.js config rules +- 'PurposesConsent' is the consent string field of the same name +- 'VendorConsentBitfield' is the consent string 'Vendor Consent Section' +- 'PurposesLITransparency' is the consent string field of the same name +- 'VendorLegitimateInterestBitfield' is the consent string 'Vendor Legitimate Interest Section' + +See the [IAB TCF Consent String Format](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20Consent%20string%20and%20vendor%20list%20formats%20v2.md) for details. + +## Build the Package + +Follow the basic build instructions in the GitHub Prebid.js repo's main [README](https://github.com/prebid/Prebid.js/blob/master/README.md). Include the base consent management module and this enforcement module as additional options on the **gulp build** command: + +{% highlight bash %} +gulp build --modules=consentManagement,gdprEnforcement,bidAdapter1,bidAdapter2 +{% endhighlight %} + +You can also use the [Prebid.js Download](/download.html) page. + +## Further Reading + +- [EU GDPR Consent Management Module](/dev-docs/modules/consentManagement.html) +- [IAB TCF Consent String Format](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20Consent%20string%20and%20vendor%20list%20formats%20v2.md) diff --git a/dev-docs/modules/index.md b/dev-docs/modules/index.md index 1db7e6a8e9..41806bdfab 100644 --- a/dev-docs/modules/index.md +++ b/dev-docs/modules/index.md @@ -31,7 +31,7 @@ If you are looking for bidder adapter parameters, see [Bidders' Params]({{site.b | 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** | Facilitates collecting and passing consent information in support of privacy regulations: [EU GDPR](/dev-docs/modules/consentManagement.html) and [US Privacy](/dev-docs/modules/consentManagementUsp.html) (CCPA). | +| **ConsentManagement** | Collecting and passing consent information in support of privacy regulations:{::nomarkdown}{:/} | | [**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: Criteo RTUS, DigiTrust, ID5 Universal ID, IdentityLink, PubCommon ID, and Unified ID. | diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md index a7dbd3873b..73b172f321 100644 --- a/dev-docs/modules/userId.md +++ b/dev-docs/modules/userId.md @@ -36,8 +36,9 @@ The User ID module supports multiple ways of establishing pseudonymous IDs for u 1. The publisher builds Prebid.js by specifying one or more ID sub-modules they would like to include. e.g. "gulp build --modules=____IdSystem" 1. The page defines User ID configuration in `pbjs.setConfig()` 1. When `setConfig()` is called, and if the user has consented to storing IDs locally, the module is invoked to call the URL if needed - 1. If the relevant local storage is present, the module doesn't call the URL and instead parses the scheme-dependent format, injecting the resulting ID into bidRequest.userIds. -1. An object containing one or more IDs (bidRequest.userIds) is made available to Prebid.js adapters and Prebid Server S2S adapters. + 1. If the relevant local storage is present, the module doesn't call the URL and instead parses the scheme-dependent format, injecting the resulting ID into bidRequest.userId. +1. An object containing one or more IDs (bidRequest.userId) is made available to Prebid.js adapters and Prebid Server S2S adapters. +1. In addition to bidRequest.userId, bidRequest.userIdAsEids is made available to Prebid.js adapters and Prebid Server S2S adapters. bidRequest.userIdAsEids has userIds in ORTB EIDS format. Note that User IDs aren't needed in the mobile app world because device ID is available in those ad serving scenarios. @@ -95,7 +96,7 @@ The BritePool privacy policy is at [https://britepool.com/services-privacy-notic #### BritePool Configuration {: .table .table-bordered .table-striped } -| Param under usersync.userIds[] | Scope | Type | Description | Example | +| Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | `"britepoolId"` | `"britepoolId"` | | params | Required | Object | Details for britepool initialization. | | @@ -109,7 +110,7 @@ The BritePool privacy policy is at [https://britepool.com/services-privacy-notic {% highlight javascript %} pbjs.setConfig({ - usersync: { + userSync: { userIds: [{ name: "britepoolId", storage: { @@ -377,14 +378,14 @@ pbjs.setConfig({ ### LiveIntent ID -LiveIntent offers audience resolution by leveraging our next-generation identity solutions. The LiveIntent identity graph is built around a people-based set of data that is authenticated daily through active engagements with email newsletters and media across the web. The LiveIntent ID is a user identifier tied to an active, anonymized email hash in our graph that functions in cookie-challenged environments like mobile browsers. +LiveIntent offers audience resolution by leveraging our next-generation identity solutions. The LiveIntent identity graph is built around a people-based set of data that is authenticated daily through active engagements with email newsletters and media across the web. The LiveIntent ID is a user identifier tied to an active, encrypted email in our graph and functions in cookie-challenged environments and browsers. Add LiveIntent ID to your Prebid.js package with: {: .alert.alert-info :} -gulp build --modules=liveIntentIdSystem +gulp build --modules=userId,liveIntentIdSystem -The `request.userId.lipb` object would then look like +The `request.userId.lipb` object would look like: ``` { "lipbid": "T7JiRRvsRAmh88", @@ -392,13 +393,29 @@ The `request.userId.lipb` object would then look like } ``` -The adapters can be implemented to use the lipibid as the identifier, and segments to which that identifier is associated with. +The adapters can be implemented to use the lipibid as the identifier and segments to which that identifier is associated with. To enable identity resolution for a specific publisher, LiveIntent builds a model on the backend with data collected via an additional call issued on each page load. -#### LiveIntent ID Registration +#### How does LiveIntent ID work + +The LiveIntent ID sub-module resolves the identity of audiences by connecting impression opportunities to a stable identifier (LIID). In order to provide resolution one or more first-party cookies are used to create a stable identifier. + +How does LiveIntent ID sub-module decide, which first-cookies to use: +1. By default LiveIntent ID sub-module generates its own first-party identifier on the publisher’s domain. Publishers have the option to disable the cookie generation when configuring the LiveIntent ID sub-module. +2. A publisher can also define in the configuration which additional first-party cookies should be used. These can be used in a combination with the LiveIntent first-party cookie. + +The LiveIntent ID sub-module sends the defined identifiers to the identity graph, which processes them and creates a stable identifier (LIID). The detailed description of the parameters being sent is described here: https://github.com/liveintent-berlin/live-connect/blob/HEAD/COLLECTOR_PARAMS.md + +For the identity resolution the LiveIntent ID sub-module makes a request to the LiveIntent’s identity resolution API, which returns a stable identifier and the audience segment(s) a user belongs to. The identifier and the segment are then exposed by the Prebid User ID Module to Prebid adapters to be sent out in a bid request. An SSP can then make the impression opportunity available to any buyers targeting the segment via a deal. -To leverage the LiveIntent ID, you need to first set up a first-party cookie sync with LiveIntent. Please reach out to peoplebased@liveintent.com for more information. +The first-party cookie generation and identity resolution functionality is provided by the LiveConnect JS library, included within the LiveIntent ID sub-module. LiveIntent has created a shared library that is open source, available at https://www.npmjs.com/package/live-connect-js. -The LiveIntent privacy policy is at [https://www.liveintent.com/services-privacy-policy/](https://www.liveintent.com/services-privacy-policy/). +The LiveIntent ID sub-module follows the standard Prebid.js initialization based on the GDPR consumer opt-out choices. With regard to CCPA, the LiveConnect JS receives a us_privacy string from the Prebid US Privacy Consent Management Module and respects opt-outs. + +#### LiveIntent ID Registration + +You are not required to register with LiveIntent to start using the LiveIntent ID sub-module. However, we do recommend reaching out to us at peoplebased@liveintent.com so that we can guide you through the optimal setup and the ways you can benefit from LiveIntent identity solutions: +1. Providing buyers a stable identifier, which can solve cross-browser and cross-channel frequency capping challenges. +2. Leveraging your first-party audiences to increase the value of your inventory. #### LiveIntent ID configuration @@ -406,10 +423,17 @@ The LiveIntent privacy policy is at [https://www.liveintent.com/services-privacy |---|:---:|:---:|---:|---:| |`name`|Required | `String`|The name of this module.|`'liveIntentId'`| |`params`| Required|`Object`|Container of all module params.|| -|`params.publisherId`| Required|`String`| The unique identifier for each publisher.|`'12432415'`| +|`params.publisherId`|Required|`String`| The unique identifier for each publisher.|`'12432415'`| +|`params.ajaxTimeout`|Optional|`Number`|This configuration parameter defines the maximum duration of a call to the IdentityResolution endpoint. By default, 1000 milliseconds.|`1000`| |`params.partner`| Optional|`String`|The name of the partner whose data will be returned in the response.|`'prebid'`| |`params.identifiersToResolve`|Optional|`Array[String]`|Used to send additional identifiers in the request for LiveIntent to resolve against the LiveIntent ID.|`['my-id']`| -|`params.url`| Optional|`String`|Use this to change the default endpoint URL if you can call the LiveIntent Identity Exchange within your own domain.|`'//idx.my-domain.com'`| +|`params.url`| Optional|`String`|Use this to change the default endpoint URL if you can call the LiveIntent Identity Exchange within your own domain.|`'https://idx.my-domain.com'`| +|`params.providedIdentifierName`| Optional|`String`|This parameter should be used whenever a customer is able to provide the most stable identifier possible, e.g. a cookie which is set via HttpHeaders on the first party domain.|`'my-best-id'`| +|`params.liCollectConfig`|Optional|`Object`|Container of all collector params.|| +|`params.liCollectConfig.fpiStorageStrategy`|Optional|`String`|This parameter defines whether the first party identifiers that LiveConnect creates and updates are stored in a cookie jar, or in local storage. If nothing is set, default behaviour would be `cookie`. Allowed values: [`cookie`, `ls`, `none`]|`'cookie'`| +|`params.liCollectConfig.fpiExpirationDays`|Optional|`Number`|The expiration time of an identifier created and updated by LiveConnect.By default, 730 days.|`729`| +|`params.liCollectConfig.collectorUrl`|Optional|`String`|The parameter defines where the signal pixels are pointing to. The params and paths will be defined subsequently. If the parameter is not set, LiveConnect will by default emit the signal towards `https://rp.liadm.com`.|`'https://rp.liadm.com'`| +|`params.liCollectConfig.appId`|Optional|`String`|LiveIntent's media business entity application id.|`'a-0012'`| #### LiveIntent ID examples @@ -442,6 +466,34 @@ pbjs.setConfig({ }) ``` +3. If lll the supported configuration params are passed, then the setup looks like this. +``` +pbjs.setConfig({ + userSync: { + userIds: [{ + name: "liveIntentId", + params: { + publisherId: "9896876", + identifiersToResolve: ["my-own-cookie"], + providedIdentifierName: "my-best-cookie", + url: "https://publisher.liveintent.com/idex", + partner: "prebid", + ajaxTimeout: 1000, + storage: { + expires: 3 + }, + liCollectConfig: { + fpiStorageStrategy: "cookie", + fpiExpirationDays: 730, + collectorUrl: "https://rp.liadm.com", + appId: "a-0012" + } + } + }] + } +}) +``` + ### Parrable ID The Parrable ID is a Full Device Identifier that can be used to identify a device across different browsers and webviews on a single device including browsers that have third party cookie restrictions. @@ -654,7 +706,7 @@ The EnID is a non-profit organization which is open to any contributing party on {% highlight javascript %} pbjs.setConfig({ - usersync: { + userSync: { userIds: [{ name: "netId", value: { diff --git a/dev-docs/publisher-api-reference.md b/dev-docs/publisher-api-reference.md index 6b95474c97..d60981602c 100644 --- a/dev-docs/publisher-api-reference.md +++ b/dev-docs/publisher-api-reference.md @@ -1248,6 +1248,10 @@ If you define an alias and are using `pbjs.sendAllBids`, you must also set up ad + `hb_size_newalias` + `hb_deal_newalias` +{: .alert.alert-info :} +Creating an alias for a Prebid Server adapter is done differently. See 'extPrebid' +config in the [`s2sConfig`](#setConfig-Server-to-Server) object. +
    @@ -1650,7 +1654,7 @@ Example config for [server-to-server]({{site.baseurl}}/dev-docs/get-started-with pbjs.setConfig({ s2sConfig: { accountId: '1', - bidders: ['appnexus', 'pubmatic'], + bidders: ['appnexus', 'openx', 'tripleliftVideo'], defaultVendor: 'appnexus', timeout: 1000, adapterOptions: { @@ -1661,9 +1665,13 @@ pbjs.setConfig({ 'openx': function(type, url, bidder) { const publisherId = '00000123231231' url += `&ri=${publisherId}`; - return url } + }, + extPrebid: { + aliases: { + tripleliftVideo: tripleLift + } } } }) @@ -1684,7 +1692,7 @@ Additional information of `s2sConfig` properties: | `syncEndpoint` | Required | URL | Defines the cookie_sync endpoint for the Prebid Server cluster | | `userSyncLimit` | Optional | Integer | Max number of userSync URLs that can be executed by Prebid Server cookie_sync per request. If not defined, PBS will execute all userSync URLs included in the request. | | `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 video-related example below. | +| `extPrebid` | Optional | Object | Arguments will be added to resulting OpenRTB payload to Prebid Server in request.ext.prebid. See the examples below. | | `syncUrlModifier` | Optional | Object | Function to modify a bidder's sync url before the actual call to the sync endpoint. Bidder must be enabled for s2sConfig. | **Notes on s2sConfig properties** @@ -1725,7 +1733,17 @@ pbjs.setConfig({ Additional options for `s2sConfig` may be enabled by including the [Server-to-Server testing module]({{site.baseurl}}/dev-docs/modules/s2sTesting.html). -**ExtPrebid Convention** +**Server-Side Aliases** + +You may want to run a particular bidder on the client for banner, but that same bidder on the +server for video. You would do this by setting a **server-side** alias. The +[example](#setConfig-Server-to-Server) at the start of this section provides an example. Here's how it works: + +1. Video ad units are coded with the dynamic alias. e.g. tripleliftVideo +1. The s2sConfig.bidders array contains 'tripleliftVideo' telling Prebid.js to direct bids for that code to the server +1. Finally, the extPrebid.aliases line tells Prebid Server to route the 'tripleliftVideo' biddercode to the 'triplelift' server-side adapter. + +**Passing the Referrer to Server Side Adapters** * Setting `extPrebid.origreferrer` will be recognized by some server-side adapters as the referring URL for the current page. @@ -1783,6 +1801,7 @@ For descriptions of all the properties that control user syncs, see the table be | `syncDelay` | Integer | Delay in milliseconds for user syncing (both bid adapter user sync pixels and [userId module]({{site.baseurl}}/dev-docs/modules/userId.html) ID providers) after the auction ends. Default: `3000`. Ignored if auctionDelay > 0. | | `auctionDelay` | Integer | Delay in milliseconds of the auction to retrieve user ids via the [userId module]({{site.baseurl}}/dev-docs/modules/userId.html) before the auction starts. Continues auction once all IDs are retrieved or delay times out. Does not apply to bid adapter user sync pixels. Default: `0`. | | `enableOverride` | Boolean | Enable/disable publisher to trigger user syncs by calling `pbjs.triggerUserSyncs()`. Default: `false`. | +| `aliasSyncEnabled` | Boolean | Enable/disable registered syncs for aliased adapters. Default: `false`. | diff --git a/download.md b/download.md index 104001eb4c..3b1afa19e5 100644 --- a/download.md +++ b/download.md @@ -313,6 +313,14 @@ Note: If you receive an error during download you most likely selected a configu +
    +
    + +
    +
    +
    Contact vendor| [Website](https://media.net) | | PrebidAnalytics by Roxot | [Paid]( http://prebidanalytics.roxot.com/) | [Website](http://prebidanalytics.roxot.com/) | | [Prebid Manager](https://prebidmanager.com/) | Free trial and free up to a certain volume. See [pricing](http://prebidmanager.com/#pricing) | [Website](http://prebidmanager.com/) | | PubWise | Free & Paid, see [pricing](https://pubwise.io/pricing/) | [Website](https://www.pubwise.io/) | diff --git a/overview/getting-started.md b/overview/getting-started.md index bf1efce976..6a1ebd92b2 100644 --- a/overview/getting-started.md +++ b/overview/getting-started.md @@ -51,6 +51,6 @@ To see how it works, follow the instructions in [Send all bids to the ad server For more information, check out the following: -+ [Before You Start](/overview/getting-started.html): Learn about considerations of your Prebid.js setup such as price granularity, line item configuration, and more. ++ [Before You Start](/adops/before-you-start.html): Learn about considerations of your Prebid.js setup such as price granularity, line item configuration, and more. + [Supported Ad Servers](/adops/before-you-start.html#supported-ad-servers): Ad ops docs arranged by ad server. + [Docs by Format](/dev-docs/docs-by-format.html): Engineering and ad ops docs arranged by ad format (video, native, etc.). diff --git a/prebid-mobile/adops-line-item-setup-mopub.md b/prebid-mobile/adops-line-item-setup-mopub.md index 58b35bc05e..b8923eb326 100644 --- a/prebid-mobile/adops-line-item-setup-mopub.md +++ b/prebid-mobile/adops-line-item-setup-mopub.md @@ -5,7 +5,7 @@ description: Setup line items for MoPub pid: 1 top_nav_section: prebid-mobile nav_section: prebid-mobile-adops -sidebarType: 2 +sidebarType: 3 --- @@ -68,5 +68,3 @@ You can always get the latest version of the creative code below from [the Mobil ## Step 3. Duplicate line items Duplicate your line items according to your [price granularity]({{site.github.url}}/prebid-mobile/adops-price-granularity.html) setting. - - diff --git a/prebid-mobile/adops-native-setup.md b/prebid-mobile/adops-native-setup.md index c995696d12..b7f969488a 100644 --- a/prebid-mobile/adops-native-setup.md +++ b/prebid-mobile/adops-native-setup.md @@ -3,7 +3,7 @@ layout: page_v2 title: Setup Native Ads head_title: Step by step guide for Native Ad Setup description: Setting up Native ads in both Google Ad Manager and MoPub. -sidebarType: 2 +sidebarType: 3 --- # Set Up Native @@ -32,7 +32,7 @@ Follow these instructions to set up a Native ad with HTML and CSS. For more deta At a high level, Prebid Mobile's support for native ads works by requesting native demand from bidder adapters. The native ad responses get placed on specific keys that are sent into your ad server. The `native-trk.js` linked in the code example below will find `hb_native_keys` and replace them with native assets. For more detailed information and a list of available keys see our documentation that explains [how Native ads work](/dev-docs/show-native-ads.html#how-native-ads-work). - + d. Set the targeting to default and save. 5. [Create a line item](/prebid-mobile/adops-line-item-setup-dfp.html) targeting this ad unit and an `hb_pb price`; for expected creatives, put in the ad format you specified in step 4.b. diff --git a/prebid-mobile/adops-price-granularity.md b/prebid-mobile/adops-price-granularity.md index db81347958..1358b82b25 100644 --- a/prebid-mobile/adops-price-granularity.md +++ b/prebid-mobile/adops-price-granularity.md @@ -5,11 +5,9 @@ description: Price granularity pid: 2 top_nav_section: prebid-mobile nav_section: prebid-mobile-adops -sidebarType: 2 +sidebarType: 3 --- - - # Price Granularity With Prebid Mobile, you’ll need to setup line items to tell your ad server how much money the “bidder” demand is worth to you. This process is done via key-values. @@ -63,4 +61,3 @@ Example: The below screenshot is taken from the Prebid Server account page where you can choose your price granularity setting from the options. ![Key-values]({{ site.github.url }}/assets/images/prebid-mobile/adops-price-granularity/pg-setting.png){: .pb-md-img :} - diff --git a/prebid-mobile/dr-prebid-tou.md b/prebid-mobile/dr-prebid-tou.md index 75a1fec936..6b4bd37284 100644 --- a/prebid-mobile/dr-prebid-tou.md +++ b/prebid-mobile/dr-prebid-tou.md @@ -5,7 +5,7 @@ description: Dr. Prebid Terms of Use pid: 5 top_nav_section: prebid-mobile nav_section: prebid-mobile-ios -sidebarType: 2 +sidebarType: 3 ---
    diff --git a/prebid-mobile/dr-prebid.md b/prebid-mobile/dr-prebid.md index de477fbd5c..d672e5b846 100644 --- a/prebid-mobile/dr-prebid.md +++ b/prebid-mobile/dr-prebid.md @@ -5,7 +5,7 @@ description: How to Use the Dr. Prebid App pid: 4 top_nav_section: prebid-mobile nav_section: prebid-mobile-ios -sidebarType: 2 +sidebarType: 3 --- # Dr. Prebid diff --git a/prebid-mobile/pbm-api/android/pbm-targeting-params-android.md b/prebid-mobile/pbm-api/android/pbm-targeting-params-android.md index 003d1435d5..57bd5862e7 100755 --- a/prebid-mobile/pbm-api/android/pbm-targeting-params-android.md +++ b/prebid-mobile/pbm-api/android/pbm-targeting-params-android.md @@ -248,22 +248,47 @@ TargetingParams.addBidderToAccessControlList(TargetingParams.BIDDER_NAME_RUBICON Prebid Mobile supports the [IAB GDPR recommendations](https://www.iab.com/topics/consumer-privacy/gdpr/). For a general overview of Prebid Mobile support for GDPR, see [Prebid Mobile Guide to European Ad Inventory and Providing Notice, Transparency and Choice](/prebid-mobile/privacy-regulation.html) +### Subject To GPDR + Enable (true) or disable (false) the ability to provide consent. +#### Retrieve subjectToGDPR + +``` +TargetingParams.isSubjectToGDPR(); +``` +#### Set subjectToGDPR + ``` TargetingParams.setSubjectToGDPR(context, true); ``` -Retrieve the consent string. +### GDPR Consent String + +#### Retrieve gdprConsentString ``` context = TargetingParams.getGDPRConsentString(); ``` -Enable publishers to set the consent string. +#### Set gdprConsentString + +``` +TargetingParams.setGDPRConsentString(string); +``` + +### Purpose Consent + +#### Retrieve purposeConsent + +``` +TargetingParams.getPurposeConsents(); +``` + +#### Set purposeConsent ``` -TargetingParams.setGDPRConsentString(context, "consent_string"); +TargetingParams.setPurposeConsents(string); ``` Prebid mobile also checks if the values are present in the [SharedPreferences](https://developer.android.com/training/data-storage/shared-preferences) keys specified by the IAB. If the values are also set in these objects they will be passed in the OpenRTB request object. diff --git a/prebid-mobile/pbm-api/android/pbm-video-rewarded-adunit-android.md b/prebid-mobile/pbm-api/android/pbm-video-rewarded-adunit-android.md new file mode 100755 index 0000000000..aa1452d242 --- /dev/null +++ b/prebid-mobile/pbm-api/android/pbm-video-rewarded-adunit-android.md @@ -0,0 +1,149 @@ +--- +layout: page_v2 +title: RewardedVideoAdUnit - Android +description: RewardedVideoAdUnit - Android +top_nav_section: prebid-mobile +nav_section: prebid-mobile +sidebarType: 2 +--- + +# RewardedVideoAdUnit Object +{:.no_toc} + +Use the `RewardedVideoAdUnit` object to create and configure a rewarded video ad unit in your app. + + + +* TOC +{:toc} + +## Object + +### RewardedVideoAdUnit + +Create a new Video Rewarded Ad Unit associated with a Prebid Server configuration ID. + + +```java +RewardedVideoAdUnit("configId"); +``` + +**Parameters** + +`configId`: String; Prebid Server configuration ID. + + + +## Methods + +`RewardedVideoAdUnit` inherits all methods from the [AdUnit](/prebid-mobile/pbm-api/android/pbm-adunit-android.html) object. + + + +## Example + +**Google Ad Manager** + +```java +//setup PB RewardedVideo +RewardedVideoAdUnit adUnit = new RewardedVideoAdUnit("configId"); +//setup AM RewardedVideo +RewardedAd amRewardedAd = new RewardedAd(this, "adUnitId"); +//load AM RewardedVideo +PublisherAdRequest.Builder builder = new PublisherAdRequest.Builder(); +PublisherAdRequest request = builder.build(); +adUnit.fetchDemand(request, new OnCompleteListener() { + @Override + public void onComplete(ResultCode resultCode) { + amRewardedAd.loadAd(request, new RewardedAdLoadCallback() { + @Override + public void onRewardedAdLoaded() { + // Ad successfully loaded. + if (amRewardedAd.isLoaded()) { + amRewardedAd.show(DemoActivity.this, new RewardedAdCallback() { + @Override + public void onRewardedAdOpened() { + // Ad opened. + } + @Override + public void onRewardedAdClosed() { + // Ad closed. + } + @Override + public void onUserEarnedReward(@NonNull RewardItem reward) { + // User earned reward. + } + @Override + public void onRewardedAdFailedToShow(int errorCode) { + // Ad failed to display. + } + }); + } + } + @Override + public void onRewardedAdFailedToLoad(int errorCode) { + // Ad failed to load. + } + }); +} +}); + +``` + + +**Mopub** + +```java +//setup PB RewardedVideo +RewardedVideoAdUnit adUnit = new RewardedVideoAdUnit("configId"); +//setup MP RewardedVideo +SdkConfiguration sdkConfiguration = new SdkConfiguration.Builder("adUnitId").build(); +MoPub.initializeSdk(this, sdkConfiguration, null); +MoPubRewardedVideos.setRewardedVideoListener(this); +//loadMPRewardedVideo +final Map keywordsMap = new HashMap<>(); +adUnit.fetchDemand(keywordsMap, new OnCompleteListener() { + @Override + public void onComplete(ResultCode resultCode) { + MoPubRewardedVideoManager.RequestParameters parameters = new MoPubRewardedVideoManager.RequestParameters(Util.convertMapToMoPubKeywords(keywordsMap)); + MoPubRewardedVideos.loadRewardedVideo("adUnitId", parameters, (MediationSettings) null); + } +}); +//MoPub Rewarded Video Listener + @Override + public void onRewardedVideoLoadSuccess(@NonNull String adUnitId) { + if (MoPubRewardedVideos.hasRewardedVideo(MP_ADUNITID_REWARDED)) { + MoPubRewardedVideos.showRewardedVideo(MP_ADUNITID_REWARDED); + } + } + @Override + public void onRewardedVideoLoadFailure(@NonNull String adUnitId, @NonNull MoPubErrorCode errorCode) { + LogUtil.d("onRewardedVideoLoadFailure:" + errorCode); + } + @Override + public void onRewardedVideoStarted(@NonNull String adUnitId) { + } + @Override + public void onRewardedVideoPlaybackError(@NonNull String adUnitId, @NonNull MoPubErrorCode errorCode) { + } + @Override + public void onRewardedVideoClicked(@NonNull String adUnitId) { + } + @Override + public void onRewardedVideoClosed(@NonNull String adUnitId) { + } + @Override + public void onRewardedVideoCompleted(@NonNull Set adUnitIds, @NonNull MoPubReward reward) { + } + +``` + +## Related Topics + +- [Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-adunit-android.html) +- [Prebid Mobile API - Android]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-api-android.html) +- [Banner Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-banneradunit-android.html) +- [Result Codes]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-api-result-codes-android.html) +- [Targeting Parameters]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-targeting-params-android.html) +- [Prebid Mobile Object]({{site.baseurl}}/prebid-mobile/pbm-api/android/prebidmobile-object-android.html) +- [Prebid Mobile API - iOS]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-api-ios.html) diff --git a/prebid-mobile/pbm-api/android/pbm-videointerstitialadunit-android.md b/prebid-mobile/pbm-api/android/pbm-videointerstitialadunit-android.md index f6e9ae4042..299dd3edfa 100755 --- a/prebid-mobile/pbm-api/android/pbm-videointerstitialadunit-android.md +++ b/prebid-mobile/pbm-api/android/pbm-videointerstitialadunit-android.md @@ -13,7 +13,7 @@ sidebarType: 2 Use the `VideoInterstitialAdUnit` object to create and configure an interstitial ad unit in your app. -Currently Google Ad Manager is the only supported ad server. We plan to provide support for additional ad servers in subsequent releases. +Video Interstital is only supported with Google Ad Manager. {: .alert .alert-info} * TOC diff --git a/prebid-mobile/pbm-api/android/pbm-videooutstreamadunit-android.md b/prebid-mobile/pbm-api/android/pbm-videooutstreamadunit-android.md index cae1b44088..0cc2fea7da 100755 --- a/prebid-mobile/pbm-api/android/pbm-videooutstreamadunit-android.md +++ b/prebid-mobile/pbm-api/android/pbm-videooutstreamadunit-android.md @@ -12,7 +12,7 @@ sidebarType: 2 Use the `VideoAdUnit` object to create and configure an outstream video ad unit in your app. -Currently Google Ad Manager is the only supported ad server. We plan to provide support for additional ad servers in subsequent releases. +Video Outstream is only supported with Google Ad Manager. {: .alert .alert-info} * TOC diff --git a/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md b/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md index 24a001a87c..1b4f547984 100644 --- a/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md +++ b/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md @@ -379,6 +379,29 @@ guard let gdprConsentString = Targeting.shared.gdprConsentString else { Targeting.shared.gdprConsentString = "A String" ``` +### Purpose Consent + +``` +public var purposeConsents: String? +``` + +You can retrieve and set the purposeConsents for targeting: + +``` +//given + +Targeting.shared.purposeConsents = "100000000000000000000000" + +defer { + + Targeting.shared.purposeConsents = nil + +} + +//when + +let deviceAccessConsent = Targeting.shared.getDeviceAccessConsent() +``` ### Subject to COPPA Prebid supports passing of the Child Online Privacy Prection (COPPA) signal to Prebid Server (PBS) for all COPPA traffic. When PBS receives the COPPA flag we strip out all personal data from the requeset. For a general overview of COPPA, see the [FTC's guidlines](https://www.ftc.gov/enforcement/rules/rulemaking-regulatory-reform-proceedings/childrens-online-privacy-protection-rule). diff --git a/prebid-mobile/pbm-api/ios/pbm-video-rewarded-adunit-ios.md b/prebid-mobile/pbm-api/ios/pbm-video-rewarded-adunit-ios.md new file mode 100755 index 0000000000..e2b3ded75a --- /dev/null +++ b/prebid-mobile/pbm-api/ios/pbm-video-rewarded-adunit-ios.md @@ -0,0 +1,86 @@ +--- +layout: page_v2 +title: VideoRewardedAdUnit - iOS +description: VideoRewardedAdUnit - iOS +top_nav_section: prebid-mobile +nav_section: prebid-mobile +sidebarType: 2 +--- +# RewardedVideoAdUnit + +Create a new Video Rewarded Ad Unit associated with a Prebid Server configuration ID and a video size. + + + +`RewardedVideoAdUnit(configId: String)` + + +**Parameters** + +`configId(String)`: Prebid Server configuration ID. + + +See [AdUnit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-adunit-ios.html) for additional parameters and methods. + +--- + +## Example + + +**Google Mobile Ads** +Import the GoogleMobileAds from [google-mobile-sdk](https://developers.google.com/admob/ios/download). + +**Swift** +``` +//setup PB RewardedVideo +let adUnit = RewardedVideoAdUnit(configId: "1001-1") +//setup AM RewardedVideo +let amRewardedAd = GADRewardedAd(adUnitID: "adUnitId") +//load AM RewardedVideo +let amRequest = GADRequest() +let adUnit.fetchDemand(adObject: amRequest) { (resultCode: ResultCode) in + amRewardedAd.load(amRequest) { error in + if let error = error { + print("loadAMRewardedVideo failed:\(error)") + } else { + if amRewardedAd?.isReady == true { + amRewardedAd?.present(fromRootViewController: self, delegate:self) + } + } + } + } + +``` + +**Mopub** +Import the Mopub SDK from [Mopub](https://developers.mopub.com/publishers/ios/integrate/). + +**Swift** +``` +//setup PB RewardedVideo +let adUnit = RewardedVideoAdUnit(configId: "1001-1") +//setup MP RewardedVideo +MPRewardedVideo.setDelegate(self, forAdUnitId: "adUnitId") +//load MP RewardedVideo +let targetingDict = NSMutableDictionary() +adUnit.fetchDemand(adObject: targetingDict) { (resultCode: ResultCode) in + print("Prebid demand fetch for mopub \(resultCode.name())") + if let targetingDict = targetingDict as? Dictionary { + let keywords = Utils.shared.convertDictToMoPubKeywords(dict: targetingDict) + MPRewardedVideo.loadAd(withAdUnitID: "adUnitId", keywords: keywords, userDataKeywords: nil, location: nil, mediationSettings: nil) + } +} + + +``` + + +## Related Topics + +- [Prebid Mobile API - iOS]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-api-ios.html) +- [Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-adunit-ios.html) +- [Banner Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-banneradunit-ios.html) +- [Result Codes]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-api-result-codes-ios.html) +- [Targeting Parameters]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-targeting-ios.html) +- [Prebid Mobile Object]({{site.baseurl}}/prebid-mobile/pbm-api/ios/prebidmobile-object-ios.html) +- [Prebid Mobile API - Android]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-api-android.html) diff --git a/prebid-mobile/pbm-api/ios/pbm-videointerstitialadunit-ios.md b/prebid-mobile/pbm-api/ios/pbm-videointerstitialadunit-ios.md index 6950cd8c72..29bec1a7aa 100755 --- a/prebid-mobile/pbm-api/ios/pbm-videointerstitialadunit-ios.md +++ b/prebid-mobile/pbm-api/ios/pbm-videointerstitialadunit-ios.md @@ -10,61 +10,14 @@ sidebarType: 2 Create a new Video Outstream Ad Unit associated with a Prebid Server configuration ID and a video size. -Currently Google Ad Manager is the only supported ad server. We plan to provide support for additional ad servers in subsequent releases. +Video Insterstital is only supported with Google Ad Manager. {: .alert .alert-info} -See [AdUnit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-adunit-ios.html) for additional parameters and methods. - -`VideoInterstitialAdUnit(configId: String, size: CGSize(width: Int, height: Int), type:Enum)` - -**Parameters** - -`configId(String)`: Prebid Server configuration ID - -`size(CGSize)`: Width and height of the video ad unit - -`type:Enum`: OpenRTB Placement Type - - -#### CGSize - -Size of video ad unit. - -**Parameters** - -`width`: Width of video ad unit in DIPs. - -`height`: Height of video ad unit in DIPs. - - -#### type - -OpenRTB Placement Type represented as an enumeration of values: - -* `inBanner` is transformed into OpenRTB value 2 to bid adapters -* `inArticle` is transformed into OpenRTB value 3 to bid adapters -* `inFeed` is transformed into OpenRTB value 4 to bid adapters - - - -## videoAd: Video Events - -### videoAd - -* Video event listeners - -`videoAd (event: PBVideoAdEvent)`: Event to listen to. +`VideoInterstitialAdUnit(configId: String)` **Parameters** -Events - one of these event types: - -* AdLoadSuccess -* AdLoadFail -* AdClicked -* AdStarted -* AdDidReachEnd - +`configId(String)`: Prebid Server configuration ID. See [AdUnit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-adunit-ios.html) for additional parameters and methods. @@ -74,7 +27,7 @@ See [AdUnit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-adunit-ios.html) for **Google Mobile Ads** -Import the GoogleMobileAds from [google-mobile-sdk](https://developers.google.com/admob/ios/download) into the UIViewController displaying the VideoAdUnit. +Import the GoogleMobileAds from [google-mobile-sdk](https://developers.google.com/admob/ios/download) into the UIViewController displaying the VideoInterstitialAdUnit. **Swift** ``` @@ -92,7 +45,7 @@ Import the GoogleMobileAds from [google-mobile-sdk](https://developers.google.co func setupPBInterstitialVAST() { Prebid.shared.prebidServerHost = .Rubicon Prebid.shared.prebidServerAccountId = "accountId" - adUnit = VideoInterstitialAdUnit(configId: "configId", size: CGSize(width: 300, height: 250), type: .inBanner) + adUnit = VideoInterstitialAdUnit(configId: "configId") } func setupAMInterstitialVAST() { diff --git a/prebid-mobile/pbm-api/ios/pbm-videooutstreamadunit-ios.md b/prebid-mobile/pbm-api/ios/pbm-videooutstreamadunit-ios.md index e19862f9eb..981afc7b00 100755 --- a/prebid-mobile/pbm-api/ios/pbm-videooutstreamadunit-ios.md +++ b/prebid-mobile/pbm-api/ios/pbm-videooutstreamadunit-ios.md @@ -12,7 +12,7 @@ sidebarType: 2 The VideoAdUnit is a subclass of the [AdUnit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-adunit-ios.html) class. Use the VideoAdUnit object to create and configure a video outstream ad unit in your app. -Currently Google Ad Manager is the only supported ad server. We plan to provide support for additional ad servers in subsequent releases. +Video Outstream is only supported with Google Ad Manager. {: .alert .alert-info} - TOC @@ -24,6 +24,7 @@ Currently Google Ad Manager is the only supported ad server. We plan to provide Create a new Video Outstream Ad Unit associated with a Prebid Server configuration ID and a video size. + See [AdUnit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-adunit-ios.html) for additional parameters and methods. `VideoAdUnit(configId: String, size: CGSize(width: Int, height: Int), type:Enum)` @@ -56,23 +57,6 @@ OpenRTB Placement Type represented as an enumeration of values: * `inArticle` is transformed into OpenRTB value 3 to bid adapters * `inFeed` is transformed into OpenRTB value 4 to bid adapters -## videoAd: Video Events - -### videoAd - -* Video event listeners - -`videoAd (event: PBVideoAdEvent)`: Event to listen to. - -**Parameters** - -Events - one of the below event types: - -* AdLoadSuccess -* AdLoadFail -* AdClicked -* AdStarted -* AdDidReachEnd diff --git a/prebid-server/hosted-servers.md b/prebid-server/hosted-servers.md index 34533db107..eda6c448f6 100644 --- a/prebid-server/hosted-servers.md +++ b/prebid-server/hosted-servers.md @@ -16,7 +16,7 @@ Several Prebid.org members host Prebid Server clusters for use by publishers. Fill out the AppNexus Prebid Server sign-up page. If approved, you will receive an email with your assigned accountId. -Send email to prebidserver@rubiconproject.com +Learn more about Rubicon Project's Hosted Prebid Server offering. diff --git a/prebid-video/video-getting-started.md b/prebid-video/video-getting-started.md index 933bdb024b..ec5e60eb93 100644 --- a/prebid-video/video-getting-started.md +++ b/prebid-video/video-getting-started.md @@ -3,9 +3,6 @@ layout: page_v2 title: Getting Started with Video for Prebid.js description: Prebid Video Getting Started pid: 1 -is_top_nav: yeah -top_nav_section: pbjs-video -nav_section: pbjs-video-get-started sidebarType: 4 --- @@ -117,10 +114,32 @@ For full details on creating outstream video ad units, see [Show Outstream Video ### Configuration -After you’ve defined your ad units, you can continue with the rest of your configuration. This is where setups for instream and outstream more drastically diverge. For complete configuration details, see the following: +After you’ve defined your ad units, you can continue with the rest of your configuration. In +most cases for video, the first step will be to define where the VAST XML coming back in the bids +will be stored. Some bidders have you covered here -- the VAST is stored on their servers. But +many bidders don't have their own server-side cache. -Instream: [Show Video Ads with Google Ad Manager]({{site.github.url}}/dev-docs/show-video-with-a-dfp-video-tag.html) -Outstream: [Show Outstream Video Ads]({{site.github.url}}/dev-docs/show-outstream-video-ads.html) +{: .alert.alert-success :} +Video players expect that the response from the ad server will be a URL that points to somewhere +on the internet that stores the video ad creative. This URL can't point to the browser, +so Prebid.js will send bid VAST XML out to a cache so it can be displayed if it wins in the ad server. + +Configuring the video cache is done with [`setConfig`](/dev-docs/publisher-api-reference.html#setConfig-vast-cache): + +``` + pbjs.setConfig({ + cache: { + url: 'https://prebid.adnxs.com/pbc/v1/cache' + /* Or whatever your preferred video cache URL is */ + } + }); +``` + + +And this is where setups for instream and outstream diverge. Please follow one of these links: + +- Instream: [Show Video Ads with Google Ad Manager]({{site.github.url}}/dev-docs/show-video-with-a-dfp-video-tag.html) +- Outstream: [Show Outstream Video Ads]({{site.github.url}}/dev-docs/show-outstream-video-ads.html) 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]({{site.github.url}}/dev-docs/publisher-api-reference.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]({{site.github.url}}/dev-docs/publisher-api-reference.html#setConfig-MediaType-Price-Granularity). @@ -129,7 +148,7 @@ Be sure to note the setting for price granularity. You might need to set up a c ### Examples -See our working examples of instream and outstream video ads. +This section contains working examples of instream and outstream video ads for various players. ### Using client-side adapters diff --git a/sandbox/demo/basicPrebid.html b/sandbox/demo/basicPrebid.html new file mode 100644 index 0000000000..c3f8c5c034 --- /dev/null +++ b/sandbox/demo/basicPrebid.html @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    +
    +
      +
    • Link 1
    • +
    • Link 2
    • +
    • Link 3
    • +
    +
    + +
    +
    +
    +
    +
    +

    Whiskey Springs

    Because of its location on the Appalachian Trail and because of a lack of publicity regarding the climbing, it's more likely that you'll run into hikers and backpackers rather than climbers at this boulder field. But for in-the-know climbers, it doesn't get much better than Whiskey Springs. The rock is a high quality, rough quartzite, and outcroppings are scattered throughout the area. Purchasing the guidebook or finding a local familiar with the area is wise, as it is not heavily trafficked and the area is somewhat difficult to navigate. Some noteworthy climbs include, "The Cranking" V9 and "Webber Seam" V4. +

    +
    + +
    +
    +
    +
    +
    + +
    + +