diff --git a/prebid-server/developers/add-new-bidder-go.md b/prebid-server/developers/add-new-bidder-go.md index 86c9f74c89..e2bcf0c114 100644 --- a/prebid-server/developers/add-new-bidder-go.md +++ b/prebid-server/developers/add-new-bidder-go.md @@ -20,7 +20,7 @@ There are two implementations of Prebid Server: [PBS-Go](https://github.com/preb ## Overview -Bid adapters are responsible for translating a 'Prebid-flavored' OpenRTB Bid Request to your bidding server's protocol and mapping your server's response to a Prebid-flavored reponse. +Bid adapters are responsible for translating a 'Prebid-flavored' OpenRTB Bid Request to your bidding server's protocol and mapping your server's response to a Prebid-flavored response. "Prebid-flavored OpenRTB" means: @@ -43,7 +43,7 @@ Throughout the rest of this document, substitute `{bidder}` with the name you've ### Consider Your Geography -Most bidders run their auction endpoints in multiple datacenters because their +Most bidders run their auction endpoints in multiple data centers because their business is continental or global. Prebid Server is open source software that is run by many host companies that may be calling @@ -146,7 +146,7 @@ userSync: Modify this template for your bid adapter: -* The endpoint can be static if you only have one datacenter or use a Global Load Balancer as described in 'Planning Your Adapter' above. +* The endpoint can be static if you only have one data center or use a Global Load Balancer as described in 'Planning Your Adapter' above. * Remove the `endpointCompression` value if your bidding server does not accept gzip compressed bid requests. Setting this value to `gzip` will save on network bandwidth at the expense of slightly increased cpu and memory usage for the host. * The `geoscope` parameter is not currently read programmatically. Instead, it's intended to be used by PBS host companies to disable your adapter in geographic regions where you don't do business. However, we may make a module for this someday, so we ask that you follow this syntax for `geoscope`: * YAML array @@ -345,9 +345,9 @@ userSync: Your bid adapter might require extra information from the publisher to form a request to your bidding server. The bidder parameters JSON Schema codifies this information to allow Prebid Server to verify requests and to provide an API for configuration systems. -Publishers will provide extra information using an OpenRTB 2.5 Bid Request Extension, preferably at `request.imp[].ext.prebid.bidder.{bidder}` but also supported at `request.imp[].ext.{bidder}`. Prebid Server will validate the publisher information based on your schema and relocate the data to `request.imp[].ext.bidder`, regardless of your bidder name or the publisher's chosen location. +Publishers will provide extra information using an OpenRTB 2.x Bid Request Extension, preferably at `request.imp[].ext.prebid.bidder.{bidder}` but also supported at `request.imp[].ext.{bidder}`. Prebid Server will validate the publisher information based on your schema and relocate the data to `request.imp[].ext.bidder`, regardless of your bidder name or the publisher's chosen location. -We request you do not duplicate information already present in the [OpenRTB 2.5 Bid Request specification](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf#page=13) or already part of an established Prebid convention. For example, your bidder parameters should not include first party data, bid floors, schain, video parameters, referrer information, or privacy consent including COPPA, CCPA, and GDPR TCF. For video parameters in particular, you must prefer the OpenRTB 2.5 Bid Request standard of `request.imp[].video`. +We request you do not duplicate information already present in the [OpenRTB 2.x Bid Request specification](https://github.com/InteractiveAdvertisingBureau/openrtb2.x) or already part of an established Prebid convention. For example, your bidder parameters should not include first party data, bid floors, schain, video parameters, referrer information, or privacy consent including COPPA, CCPA, and GDPR TCF. For video parameters in particular, you must prefer the OpenRTB 2.x Bid Request standard of `request.imp[].video`. {: .alert.alert-warning :} You may not try so set the full endpoint domain from a publisher-specified bidder parameter. Prebid Server is not an open proxy. If absolutely necessary, you may specify a *portion* of the domain as a parameter to support geo regions or account specific servers. However, this is discouraged and may degrade the performance of your adapter since the server needs to maintain more outgoing connections. Host companies may choose to disable your adapter if it uses a dynamically configured domain. @@ -376,7 +376,7 @@ Let's start with this example which defines one required `placementId` string pa We encourage you to utilize the full features of [JSON Schema](https://spacetelescope.github.io/understanding-json-schema/) to narrowly define your bidder parameter data types. If you copy and paste these examples, please remember to change the `title` and `description` to refer to your bidder name instead of our fictional Foo example. -When choosing your parameter names, please consider aligning with the OpenRTB 2.5 standard by using lower case letters without camel casing or special characters. +When choosing your parameter names, please consider aligning with the OpenRTB 2.x standard by using lower case letters without camel casing or special characters. Properties in [JSON Schema](https://spacetelescope.github.io/understanding-json-schema/) are case sensitive. If you choose to specify multiple properties differing only by case for compatibility, we ask that you include the word 'preferred' in one of the descriptions to give a hint to third party configuration systems. @@ -534,9 +534,9 @@ Please follow [Go's standard naming convention](https://golang.org/doc/effective ### Adapter Code -Now it's time to write the bulk of your bid adapter code. +Now it's time to write your bid adapter code. -Each adapter has its own directory (a 'package' in Go parlance) for all code and tests associated with translating an OpenRTB 2.5 Bid Request to your bidding server's protocol and mapping your server's response to an OpenRTB 2.5 Bid Response. The use of separate packages provide each adapter with its own naming scope to avoid conflicts and gives the freedom to organize files as you best see fit (although we make suggestions in this guide). +Each adapter has its own directory (a 'package' in Go parlance) for all code and tests associated with translating an OpenRTB 2.x Bid Request to your bidding server's protocol and mapping your server's response to an OpenRTB 2.x Bid Response. The use of separate packages provide each adapter with its own naming scope to avoid conflicts and gives the freedom to organize files as you best see fit (although we make suggestions in this guide). Create a file with the path `adapters/{bidder}/{bidder}.go`. Your bid adapter code will need to implement and export: @@ -546,7 +546,7 @@ Create a file with the path `adapters/{bidder}/{bidder}.go`. Your bid adapter co {: .alert.alert-info :} **ACCESS MODIFIERS:** Go has only two kinds of access modifiers, exported and private, which are scoped at the package level. The access modifier is encoded into the name of the type or method. Names starting with an upper case letter are exported whereas names starting with a lower case letter are private. Please only export the three required methods and keep everything else private. -Here is a reference implementation for a bidding server which uses the OpenRTB 2.5 protocol: +Here is a reference implementation for a bidding server which uses the OpenRTB 2.x protocol: ```go package foo @@ -556,7 +556,7 @@ import ( "fmt" "net/http" - "github.com/prebid/openrtb/v19/openrtb2" + "github.com/prebid/openrtb/v20/openrtb2" "github.com/prebid/prebid-server/adapters" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/errortypes" @@ -567,7 +567,7 @@ type adapter struct { endpoint string } -// Builder builds a new instance of the Foo adapter for the given bidder with the given config. +// Builder builds a new instance of the {bidder} adapter for the given bidder with the given config. func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { bidder := &adapter{ endpoint: config.Endpoint, @@ -585,6 +585,7 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapte Method: "POST", Uri: a.endpoint, Body: requestJSON, + ImpIDs: openrtb_ext.GetImpIDs(request.Imp), } return []*adapters.RequestData{requestData}, nil @@ -673,7 +674,7 @@ type adapter struct { endpointTemplate *template.Template } -// Builder builds a new instance of the Foo adapter for the given bidder with the given config. +// Builder builds a new instance of the {bidder} adapter for the given bidder with the given config. func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { template, err := template.New("endpointTemplate").Parse(config.Endpoint) if err != nil { @@ -697,7 +698,7 @@ type extraInfo struct { token string } -// Builder builds a new instance of the Foo adapter for the given bidder with the given config. +// Builder builds a new instance of the {bidder} adapter for the given bidder with the given config. func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { info, err := parseExtraInfo(config.ExtraAdapterInfo) if err != nil { @@ -736,11 +737,11 @@ func buildDefaultExtraInfo() extraInfo { #### MakeRequests -The `MakeRequests` method is responsible for returning none, one, or many HTTP requests to be sent to your bidding server. Bid adapters are forbidden from directly initiating any form of network communication and must entirely rely upon the core framework. This allows the core framework to optimize outgoing connections using a managed pool and record networking metrics. The return type `adapters.RequestData` allows your adapter to specify the HTTP method, url, body, and headers. +The `MakeRequests` method is responsible for returning none, one, or many HTTP requests to be sent to your bidding server. Bid adapters are forbidden from directly initiating any form of network communication and must entirely rely upon the core framework. This allows the core framework to optimize outgoing connections using a managed pool and record networking metrics. The return type `adapters.RequestData` allows your adapter to specify the HTTP method, url, body, headers, and ids of the impressions in the request. This method is called once by the core framework for bid requests which have at least one valid Impression for your adapter. Impressions not configured for your adapter are not accessible. -The first argument, `request`, is the OpenRTB 2.5 Bid Request object. Extension information is stored as `json.RawMessage` byte arrays and must be unmarshalled and/or marshalled to be read and/or mutated. It is *critical* to understand that the `request` object contains pointers to shared memory. If your adapter needs to alter any data referenced by a pointer then you *must* first make a shallow copy. The only exception is for `request.Imp` and its elements, as these are already shallow copies. The exact same instance of the `request` object is also passed to the `MakeBids` method, so please be careful when mutating. It's safe to assume that `request.Imp[]` always contains at least one element and that the `request.Imp[].ext.bidder` was successfully validated per your bidder parameter JSON Schema. +The first argument, `request`, is the OpenRTB 2.x Bid Request object. Extension information is stored as `json.RawMessage` byte arrays and must be unmarshalled and/or marshalled to be read and/or mutated. It is *critical* to understand that the `request` object contains pointers to shared memory. If your adapter needs to alter any data referenced by a pointer then you *must* first make a shallow copy. The only exception is for `request.Imp` and its elements, as these are already shallow copies. The exact same instance of the `request` object is also passed to the `MakeBids` method, so please be careful when mutating. It's safe to assume that `request.Imp[]` always contains at least one element and that the `request.Imp[].ext.bidder` was successfully validated per your bidder parameter JSON Schema.
Example: Mutating banner shared memory (make a copy). @@ -793,6 +794,7 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapte Method: "POST", Uri: a.endpoint, Body: requestJSON, + ImpIDs: []string{imp.ID}, } requests = append(requests, requestData) } @@ -842,6 +844,7 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapte Method: "POST", Uri: a.endpoint, Body: requestJSON, + ImpIDs: openrtb_ext.GetImpIDs(request.Imp), } return []*adapters.RequestData{requestData}, nil @@ -853,7 +856,7 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapte ##### Common Data -There are a several values of a bid that publishers expect to be populated. Some are defined by the OpenRTB 2.5 specification and some are defined by Prebid conventions. +There are a several values of a bid that publishers expect to be populated. Some are defined by the OpenRTB 2.x specification and some are defined by Prebid conventions. {: .table .table-bordered .table-striped } | Parameter | Definer | Path & Description @@ -875,24 +878,24 @@ For simplicity, adapters are expected to make net-price bids (e.g. "If this ad w #### Response -The `MakeBids` method is responsible for parsing the bidding server's response and mapping it to the [OpenRTB 2.5 Bid Response object model](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf#page=32). +The `MakeBids` method is responsible for parsing the bidding server's response and mapping it to the [OpenRTB 2.x Bid Response object model](https://github.com/InteractiveAdvertisingBureau/openrtb2.x/blob/main/2.6.md#objectbidresponse). This method is called for each response received from your bidding server within the bidding time window (`request.tmax`). If there are no requests or if all requests time out, the `MakeBids` method will not be called. {: .alert.alert-warning :} It's *imperative* to include all required information in the response for your bid to be accepted. Please avoid common mistakes, such as not specifying the bid currency and not properly detecting the media type from the bidding server response. -The first argument, `request`, is the exact same OpenRTB 2.5 Bid Request object provided to (and potentially mutated by) the `MakeRequests` method. The information in the `request` may be useful when detecting the media type. +The first argument, `request`, is the exact same OpenRTB 2.x Bid Request object provided to (and potentially mutated by) the `MakeRequests` method. The information in the `request` may be useful when detecting the media type. The second argument, `requestData`, is the exact same `adapters.RequestData` object returned by the `MakeRequests` method. It's rare for adapters to make use of this information, but it's provided for potential edge cases. The third argument, `responseData`, is the HTTP response received from your bidding server and contains the status code, body, and headers. If your bidding server replies with a GZIP encoded body, it will be automatically decompressed. -The `MakeBids` method is expected to return an `adapters.BidderResponse` object with one or more bids mapped from your bidding server's response. This may be as simple as decorating an OpenRTB 2.5 Bid Response with some Prebid Server metadata (such as the media type) or more complicated mapping logic depending on your server's response format. +The `MakeBids` method is expected to return an `adapters.BidderResponse` object with one or more bids mapped from your bidding server's response. This may be as simple as decorating an OpenRTB 2.x Bid Response with some Prebid Server metadata (such as the media type) or more complicated mapping logic depending on your server's response format. ##### Object Model -Please review the entire [OpenRTB 2.5 Bid Response](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf#page=32) documentation to fully understand the response object model and expectations. We've summarized some common fields below. Data which is listed as required is enforced by the core framework and cannot be omitted. +Please review the entire [OpenRTB 2.x Bid Response](https://github.com/InteractiveAdvertisingBureau/openrtb2.x/blob/main/2.6.md#objectbidresponse) documentation to fully understand the response object model and expectations. We've summarized some common fields below. Data which is listed as required is enforced by the core framework and cannot be omitted. {: .table .table-bordered .table-striped } | BidderResponse Path | Scope | Description @@ -1125,7 +1128,7 @@ The format of a JSON test is as follows: ```json { "mockBidRequest": { - «OpenRTB 2.5 Bid Request» + «OpenRTB 2.x Bid Request» }, "httpCalls": [{ "expectedRequest": { @@ -1275,7 +1278,7 @@ We'll verify your adapter works correctly on a technical level during the code r ./prebid-server ``` -1. POST an OpenRTB 2.5 Bid Request with at least one Impression defined for your bid adapter with a supported media type. This is an example template for a banner ad. +1. POST an OpenRTB 2.x Bid Request with at least one Impression defined for your bid adapter with a supported media type. This is an example template for a banner ad. ```bash curl --request POST \ diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md index 2cc17d6501..be831ef08d 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -422,7 +422,7 @@ If you find that some bidders use Gross bids, publishers can adjust for it with This may also be useful for publishers who want to account for different discrepancies with different bidders. -It's also possible to define different bid adjustment factors by mediatype, which can be helpful to adjust discrepancies that differ across mediatypes (PBS-Java only): +It's also possible to define different bid adjustment factors by mediatype, which can be helpful to adjust discrepancies that differ across mediatypes: ```json { @@ -476,7 +476,7 @@ to set these params on the response at `response.seatbid[i].bid[j].ext.prebid.ta | includebidderkeys | no | Whether to include targeting for the best bid from each bidder in response.seatbid[].bid[]. ext.prebid.targeting. Defaults to false. | true | boolean | | includeformat | no | Whether to include the "hb_format" targeting key. Defaults to false. | false | boolean | | preferdeals | no | If targeting is returned and this is true, PBS will choose the highest value deal before choosing the highest value non-deal. Defaults to false. | true | boolean | -| alwaysincludedeals | no | (PBS-Java only) If true, generate hb_ATTR_BIDDER values for all bids that have a dealid | true | boolean | +| alwaysincludedeals | no | If true, generate hb_ATTR_BIDDER values for all bids that have a dealid | true | boolean | | prefix | no | (PBS-Java only) Instead of emitting all targeting values with the default prefix `hb`, use this value. Note that long prefixes are discouraged because GAM has a 20-char limit on key value pairs and some Prebid targeting values (e.g. hb_cache_host_bidderA) are already more than 20 chars. | "hb2" | string | **Request format** (optional param `request.ext.prebid.targeting`) @@ -1478,9 +1478,6 @@ The initial use is for the SDK to define render-time parameters, but this mechan ##### Floors -{: .alert.alert-info :} -PBS-Java only - See the [Prebid Server Floors Feature](/prebid-server/features/pbs-floors.html) for more info. ##### Server Metadata @@ -1646,30 +1643,28 @@ The value in seatbid[].bid[].price may be converted for currency and adjusted wi ##### Seat Non-Bid -{: .alert.alert-info :} -PBS-Java only - -Prebid Server supports an ORTB extension that allows callers to get more information about bidders that may have had a chance to bid but did not. Eventually the system will support a fine-grained set of codes describing why a given bidder didn't bid on a particular impression, but for now we're phasing in the necessary internal infrastructure. +Prebid Server supports the [Seat Non-Bid OpenRTB Extension](https://github.com/InteractiveAdvertisingBureau/openrtb/blob/master/extensions/community_extensions/seat-non-bid.md) that allows callers to get more information about bidders that had a chance to bid but did not. Eventually the system will support a fine-grained set of codes describing why a given bidder didn't bid on a particular impression, but for now we're phasing in the necessary internal infrastructure. To enable the additional output, set `ext.prebid.returnallbidstatus: true`. Here's a sample response: ```json -{ - ... - "ext": { - "seatnonbid": [ - { - "seat": "rubiconAlias", - "nonbid": [ - { - "impid": "test-div", - "statuscode": 0 - } - ] - } - } +{ + ... + "ext": { + "seatnonbid": [ + { + "seat": "someBidder", + "nonbid": [ + { + "impid": "test-div", + "statuscode": 0 + } + ] + } + ] + } } ``` @@ -1683,10 +1678,13 @@ The codes currently returned: | 101 | Timeout | Java | The bid adapter timed out. | | 200 | Request Blocked - General | Java | This impression not sent to the bid adapter for an unspecified reason. | | 202 | Request Blocked due to mediatype | Java | This impression not sent to the bid adapter because it doesn't support the requested mediatype. | -| 300 | Response Rejected - General | Java | The bid response was rejected for an unspecified reason. See warnings in debug mode. (Mostly caused by DSA validation rules) | +| 300 | Response Rejected - General | Go + Java | The bid response was rejected for an unspecified reason. See warnings in debug mode. (Mostly caused by DSA validation rules) | | 301 | Response Rejected - Below Floor | Java | The bid response did not meet the floor for this impression. | +| 303 | Response Rejected - Category Mapping Invalid | Go | The bid response did not include a category to map. | +| 351 | Response Rejected - Invalid Creative (Size Not Allowed) | Go | The bid response banner size exceeds the max size, when creative validation is enabled. | +| 352 | Response Rejected - Invalid Creative (Not Secure) | Go | The bid response adm does not use https, when secure markup validation is enabled. | -See the [IAB's community extension](https://github.com/InteractiveAdvertisingBureau/openrtb/blob/main/extensions/community_extensions/seat-non-bid.md) for the full list of status codes that may be supported in the future. +See the [IAB's Seat Non-Bid OpenRTB Extension](https://github.com/InteractiveAdvertisingBureau/openrtb/blob/main/extensions/community_extensions/seat-non-bid.md) for the full list of status codes that may be supported in the future. ### OpenRTB Ambiguities diff --git a/prebid-server/features/pbs-feature-idx.md b/prebid-server/features/pbs-feature-idx.md index 2b10e6c532..18c6a51ae5 100644 --- a/prebid-server/features/pbs-feature-idx.md +++ b/prebid-server/features/pbs-feature-idx.md @@ -22,9 +22,9 @@ title: Prebid Server | Features | Targeting | [Custom Targeting](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#custom-targeting) | Request can specify `ext.prebid.adservertargeting`, which causes PBS to emit custom targeting values. | check | check | | Request Params | Global Params | Publishers can specify [adapter-specific cross-impression attributes](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#global-bid-adapter-parameters). | check | check | | [Price Granularity](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#targeting) | Core | Request can define quantization rules. Bids are quantized before being added to ad server targeting. | check | check | -| Price Granularity | Mediatype pricegranularity | Request can define different quantization rules for different mediatypes. Bids are quantized before being added to ad server targeting. | | check | +| Price Granularity | Mediatype pricegranularity | Request can define different quantization rules for different mediatypes. Bids are quantized before being added to ad server targeting. | check | check | | [Bid Adjustments](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#bid-adjustments) | Core | Allows publishers to adjust bid prices to account for gross/net or consistent discrepancies. | check | check | -| [Bid Adjustments](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#bid-adjustments) | By mediatype | Allows for different bid adjustments by mediatype banner, video, native, audio. | | check | +| [Bid Adjustments](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#bid-adjustments) | By mediatype | Allows for different bid adjustments by mediatype banner, video, native, audio. | check | check | | Price Floors | Core | Support for the [price floors feature](/prebid-server/features/pbs-floors.html). | check | check | | GDPR | TCF 2 core | Able to: read the TCF2 global vendor list, parse incoming TCF2 consent strings, and [take appropriate enforcement action](https://docs.google.com/document/d/1fBRaodKifv1pYsWY3ia-9K96VHUjd8kKvxZlOsozm8E/edit). | check | check | | GDPR | TCF 2 Account Config | Able to turn on and off TCF2 enforcement per account. | check | check | @@ -33,7 +33,7 @@ title: Prebid Server | Features | GDPR | TCF 2 Geo-Lookup | Can use a geographic lookup service to help determine whether the incoming request is in-scope for GDPR. | | check | | GDPR | TCF 2 channel exception | Can be configured to turn off GDPR checks for a specific account and a specific channel. e.g. Account 123 has a different legal basis for AMP. | check | check | | DSA | DSA passthrough | Process ORTB DSA fields. | check | check | -| DSA | DSA initialization | [Inject account-specific ORTB DSA fields.](/prebid-server/features/pbs-privacy#dsa) | | check | +| DSA | DSA initialization | [Inject account-specific ORTB DSA fields.](/prebid-server/features/pbs-privacy#dsa) | check | check | | [US Privacy](/prebid-server/features/pbs-privacy.html#ccpa--us-privacy) | USP core | Able to: read the US Privacy consent string (CCPA) and [take appropriate enforcement action](https://github.com/prebid/prebid-server/issues/1129). | check | check | | US Privacy | USP AMP support | Able to: read the US Privacy consent string from AMP requests and [take appropriate enforcement action](https://github.com/prebid/prebid-server/issues/1176). | check | check | | [GPP](/prebid-server/features/pbs-privacy.html#gpp) | GPP Passthrough | Global Privacy Platform parameters are passed through auction and usersync requests. | check | check | @@ -99,8 +99,8 @@ title: Prebid Server | Features | Anti-Fraud | Ads.Cert 2.0 Authenticated Connections | Includes authenticated connection signing header on outgoing bid requests to supported adapters. * | check | | | Request Enrichment | Enhanced tid and request IDs | Fills out id, imp.id, source.tid, and imp.ext.tid | check | check | | Privacy Sandbox | Passthrough | "auction enabled" flags are passed through to bidders and auctionconfig is forwarded from bidders. | check | check | -| Privacy Sandbox | Topics headers | PBS reads the Chrome topics header and copies to user.data segments. | | check | -| Privacy Sandbox | Testing labels | PBS reads the Chrome labels header and copies to device.ext.cdep | | check | +| Privacy Sandbox | Topics headers | PBS reads the Chrome topics header and copies to user.data segments. | check | check | +| Privacy Sandbox | Testing labels | PBS reads the Chrome labels header and copies to device.ext.cdep | check | check | | Auction Response | Bidders can supply [Fledge](https://github.com/google/ads-privacy/tree/master/proposals/fledge-multiple-seller-testing) auction config | If the request contains imp.ext.ae, bid adapters can return ext.prebid.fledge.auctionconfigs | check | check | \* Experimental feature not yet recommended for production.