diff --git a/adapters/aps/aps.go b/adapters/aps/aps.go
new file mode 100644
index 000000000..6c9b88a87
--- /dev/null
+++ b/adapters/aps/aps.go
@@ -0,0 +1,297 @@
+package aps
+
+import (
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "strings"
+ "text/template"
+
+ "github.com/prebid/openrtb/v20/openrtb2"
+ "github.com/prebid/prebid-server/v4/adapters"
+ "github.com/prebid/prebid-server/v4/config"
+ "github.com/prebid/prebid-server/v4/errortypes"
+ "github.com/prebid/prebid-server/v4/macros"
+ "github.com/prebid/prebid-server/v4/openrtb_ext"
+ "github.com/prebid/prebid-server/v4/util/jsonutil"
+)
+
+const adapterVersion = "1.0.0"
+
+const defaultRegion = "na"
+
+var validRegions = map[string]struct{}{"na": {}, "eu": {}, "fe": {}}
+
+type adapter struct {
+ endpoint *template.Template
+}
+
+type apsSDKExt struct {
+ Version string `json:"version"`
+ Source string `json:"source"`
+}
+
+// Builder builds a new instance of the Aps adapter for the given bidder with the given config.
+func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) {
+ endpoint, err := template.New("apsEndpoint").Parse(config.Endpoint)
+ if err != nil {
+ return nil, fmt.Errorf("failed to parse APS endpoint template: %v", err)
+ }
+ return &adapter{endpoint: endpoint}, nil
+}
+
+// MakeRequests builds the APS request. Sample OpenRTB request this adapter accepts (dummy values):
+//
+// {
+// "id": "req-1",
+// "test": 1,
+// "site": {"page": "https://example.com"},
+// "imp": [
+// {"id": "imp-1", "banner": {"format": [{"w": 300, "h": 250}]},
+// "ext": {"prebid": {"bidder": {"aps": {"accountID": "1234", "region": "na"}}}}},
+// {"id": "imp-2", "video": {"mimes": ["video/mp4"], "w": 640, "h": 480, "protocols": [2, 3, 5, 6]},
+// "ext": {"prebid": {"bidder": {"aps": {"accountID": "1234"}}}}}
+// ]
+// }
+//
+// accountID is a per-imp bidder param (or set once via ext.prebid.bidderparams.aps.accountID); all imps
+// must resolve to the same account. region is an optional per-imp param (default na); it fills the
+// endpoint macro and is validated against a fixed set of valid regions (na, eu, fe); others are rejected.
+// test:1 appends amzn_debug_mode=1 to the endpoint.
+func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) {
+ var errors []error
+ validImps := make([]openrtb2.Imp, 0, len(request.Imp))
+ accountID := ""
+ region := defaultRegion
+
+ for _, imp := range request.Imp {
+ impAccountID, impRegion, err := parseImpParams(imp)
+ if err != nil {
+ errors = append(errors, err)
+ continue
+ }
+ if accountID == "" {
+ accountID = impAccountID
+ } else if accountID != impAccountID {
+ errors = append(errors, &errortypes.BadInput{
+ Message: fmt.Sprintf("imp %q: all imps in a request must use the same APS accountID (got %q and %q)",
+ imp.ID, accountID, impAccountID),
+ })
+ return nil, errors
+ }
+ region = impRegion
+
+ if imp.Banner != nil {
+ imp = backfillBannerSize(imp)
+ }
+ validImps = append(validImps, imp)
+ }
+
+ if len(validImps) == 0 {
+ return nil, errors
+ }
+
+ data, err := a.makeRequest(*request, validImps, accountID, region)
+ if err != nil {
+ errors = append(errors, err)
+ return nil, errors
+ }
+
+ return []*adapters.RequestData{data}, errors
+}
+
+func parseImpParams(imp openrtb2.Imp) (accountID string, region string, err error) {
+ var bidderExt adapters.ExtImpBidder
+ if err := jsonutil.Unmarshal(imp.Ext, &bidderExt); err != nil {
+ return "", "", &errortypes.BadInput{Message: fmt.Sprintf("imp %q: invalid imp.ext: %s", imp.ID, err)}
+ }
+
+ var apsExt openrtb_ext.ExtImpAps
+ if err := jsonutil.Unmarshal(bidderExt.Bidder, &apsExt); err != nil {
+ return "", "", &errortypes.BadInput{Message: fmt.Sprintf("imp %q: invalid aps bidder params: %s", imp.ID, err)}
+ }
+
+ accountID = strings.TrimSpace(apsExt.AccountID)
+ if accountID == "" {
+ return "", "", &errortypes.BadInput{Message: fmt.Sprintf("imp %q: the APS bidder param \"accountID\" is required", imp.ID)}
+ }
+
+ region = strings.TrimSpace(apsExt.Region)
+ if region == "" {
+ region = defaultRegion
+ }
+ if _, ok := validRegions[region]; !ok {
+ return "", "", &errortypes.BadInput{Message: fmt.Sprintf("imp %q: invalid APS region %q", imp.ID, region)}
+ }
+ return accountID, region, nil
+}
+
+func (a *adapter) makeRequest(request openrtb2.BidRequest, imps []openrtb2.Imp, accountID string, region string) (*adapters.RequestData, error) {
+ request.Imp = imps
+
+ sanitizeUserObject(&request)
+ sanitizeDeviceObject(&request)
+
+ if len(request.Cur) == 0 {
+ request.Cur = []string{"USD"}
+ }
+
+ if err := applyRequestExt(&request, accountID); err != nil {
+ return nil, err
+ }
+
+ requestJSON, err := jsonutil.Marshal(&request)
+ if err != nil {
+ return nil, err
+ }
+
+ uri, err := macros.ResolveMacros(a.endpoint, macros.EndpointTemplateParams{Region: region})
+ if err != nil {
+ return nil, err
+ }
+ if request.Test == 1 {
+ uri = appendDebugMode(uri)
+ }
+
+ return &adapters.RequestData{
+ Method: http.MethodPost,
+ Uri: uri,
+ Body: requestJSON,
+ ImpIDs: openrtb_ext.GetImpIDs(request.Imp),
+ }, nil
+}
+
+// appendDebugMode appends the amzn_debug_mode=1 query param for test requests (bidRequest.test == 1).
+func appendDebugMode(endpoint string) string {
+ separator := "?"
+ if strings.Contains(endpoint, "?") {
+ separator = "&"
+ }
+ return endpoint + separator + "amzn_debug_mode=1"
+}
+
+func backfillBannerSize(imp openrtb2.Imp) openrtb2.Imp {
+ banner := imp.Banner
+ if len(banner.Format) == 0 {
+ return imp
+ }
+ if banner.W != nil && banner.H != nil {
+ return imp
+ }
+
+ format := banner.Format[0]
+ w := format.W
+ h := format.H
+ modifiedBanner := *banner
+ modifiedBanner.W = &w
+ modifiedBanner.H = &h
+ imp.Banner = &modifiedBanner
+ return imp
+}
+
+func sanitizeUserObject(request *openrtb2.BidRequest) {
+ if request.User != nil {
+ modifiedUser := *request.User
+ modifiedUser.Gender = ""
+ modifiedUser.Yob = 0
+ modifiedUser.CustomData = ""
+ modifiedUser.Geo = nil
+ request.User = &modifiedUser
+ }
+}
+
+func sanitizeDeviceObject(request *openrtb2.BidRequest) {
+ if request.Device != nil && request.Device.Geo != nil {
+ modifiedGeo := *request.Device.Geo
+ modifiedGeo.Lat = nil
+ modifiedGeo.Lon = nil
+ modifiedDevice := *request.Device
+ modifiedDevice.Geo = &modifiedGeo
+ request.Device = &modifiedDevice
+ }
+}
+
+func applyRequestExt(request *openrtb2.BidRequest, accountID string) error {
+ extMap := map[string]json.RawMessage{}
+ if len(request.Ext) > 0 {
+ if err := jsonutil.Unmarshal(request.Ext, &extMap); err != nil {
+ return &errortypes.BadInput{Message: err.Error()}
+ }
+ }
+
+ account, err := jsonutil.Marshal(accountID)
+ if err != nil {
+ return err
+ }
+ extMap["account"] = account
+
+ sdk, err := jsonutil.Marshal(apsSDKExt{Version: adapterVersion, Source: "prebid-server"})
+ if err != nil {
+ return err
+ }
+ extMap["sdk"] = sdk
+
+ ext, err := jsonutil.Marshal(extMap)
+ if err != nil {
+ return err
+ }
+ request.Ext = ext
+ return nil
+}
+
+func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) {
+ if responseData.StatusCode == http.StatusNoContent {
+ return nil, nil
+ }
+
+ if responseData.StatusCode == http.StatusBadRequest {
+ return nil, []error{&errortypes.BadInput{
+ Message: "Unexpected status code: 400. Bad request from publisher.",
+ }}
+ }
+
+ if responseData.StatusCode != http.StatusOK {
+ return nil, []error{&errortypes.BadServerResponse{
+ Message: fmt.Sprintf("Unexpected status code: %d.", responseData.StatusCode),
+ }}
+ }
+
+ var response openrtb2.BidResponse
+ if err := jsonutil.Unmarshal(responseData.Body, &response); err != nil {
+ return nil, []error{err}
+ }
+
+ bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp))
+ if response.Cur != "" {
+ bidResponse.Currency = response.Cur
+ }
+ var errors []error
+ for _, seatBid := range response.SeatBid {
+ for i := range seatBid.Bid {
+ bidType, err := getMediaTypeForBid(seatBid.Bid[i])
+ if err != nil {
+ errors = append(errors, err)
+ continue
+ }
+ bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{
+ Bid: &seatBid.Bid[i],
+ BidType: bidType,
+ })
+ }
+ }
+
+ return bidResponse, errors
+}
+
+func getMediaTypeForBid(bid openrtb2.Bid) (openrtb_ext.BidType, error) {
+ switch bid.MType {
+ case openrtb2.MarkupBanner:
+ return openrtb_ext.BidTypeBanner, nil
+ case openrtb2.MarkupVideo:
+ return openrtb_ext.BidTypeVideo, nil
+ default:
+ return "", &errortypes.BadServerResponse{
+ Message: fmt.Sprintf("Unsupported MType %d for impression %q", bid.MType, bid.ImpID),
+ }
+ }
+}
diff --git a/adapters/aps/aps_test.go b/adapters/aps/aps_test.go
new file mode 100644
index 000000000..80f92f752
--- /dev/null
+++ b/adapters/aps/aps_test.go
@@ -0,0 +1,25 @@
+package aps
+
+import (
+ "testing"
+
+ "github.com/prebid/prebid-server/v4/adapters/adapterstest"
+ "github.com/prebid/prebid-server/v4/config"
+ "github.com/prebid/prebid-server/v4/openrtb_ext"
+)
+
+func TestJsonSamples(t *testing.T) {
+ bidder, buildErr := Builder(
+ openrtb_ext.BidderAps,
+ config.Adapter{
+ Endpoint: "https://s2s.prebid.bid-{{.Region}}.ads.aps.amazon-adsystem.com/e/pb/bid",
+ },
+ config.Server{ExternalUrl: "http://hosturl.com", GvlID: 793, DataCenter: "2"},
+ )
+
+ if buildErr != nil {
+ t.Fatalf("Builder returned unexpected error %v", buildErr)
+ }
+
+ adapterstest.RunJSONBidderTest(t, "apstest", bidder)
+}
diff --git a/adapters/aps/apstest/exemplary/multi-slot.json b/adapters/aps/apstest/exemplary/multi-slot.json
new file mode 100644
index 000000000..a0cfb7674
--- /dev/null
+++ b/adapters/aps/apstest/exemplary/multi-slot.json
@@ -0,0 +1,158 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "slot-banner",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ },
+ {
+ "id": "slot-video",
+ "video": {
+ "mimes": [
+ "video/mp4"
+ ],
+ "w": 640,
+ "h": 480
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ }
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://s2s.prebid.bid-na.ads.aps.amazon-adsystem.com/e/pb/bid",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "slot-banner",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ],
+ "w": 300,
+ "h": 250
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ },
+ {
+ "id": "slot-video",
+ "video": {
+ "mimes": [
+ "video/mp4"
+ ],
+ "w": 640,
+ "h": 480
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ },
+ "cur": [
+ "USD"
+ ],
+ "ext": {
+ "account": "test-account",
+ "sdk": {
+ "version": "1.0.0",
+ "source": "prebid-server"
+ }
+ }
+ },
+ "impIDs": [
+ "slot-banner",
+ "slot-video"
+ ]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "test-request-id",
+ "cur": "USD",
+ "seatbid": [
+ {
+ "seat": "aps",
+ "bid": [
+ {
+ "id": "1",
+ "impid": "slot-banner",
+ "price": 1.5,
+ "adm": "
banner ad
",
+ "crid": "creative-1",
+ "mtype": 1,
+ "w": 300,
+ "h": 250
+ },
+ {
+ "id": "2",
+ "impid": "slot-video",
+ "price": 2.5,
+ "nurl": "https://vast.aps.amazon-adsystem.com/vast?id=2",
+ "crid": "creative-2",
+ "mtype": 2
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "currency": "USD",
+ "bids": [
+ {
+ "bid": {
+ "id": "1",
+ "impid": "slot-banner",
+ "price": 1.5,
+ "adm": "banner ad
",
+ "crid": "creative-1",
+ "mtype": 1,
+ "w": 300,
+ "h": 250
+ },
+ "type": "banner"
+ },
+ {
+ "bid": {
+ "id": "2",
+ "impid": "slot-video",
+ "price": 2.5,
+ "nurl": "https://vast.aps.amazon-adsystem.com/vast?id=2",
+ "crid": "creative-2",
+ "mtype": 2
+ },
+ "type": "video"
+ }
+ ]
+ }
+ ]
+}
diff --git a/adapters/aps/apstest/exemplary/multiformat-imp.json b/adapters/aps/apstest/exemplary/multiformat-imp.json
new file mode 100644
index 000000000..5f8fb67d0
--- /dev/null
+++ b/adapters/aps/apstest/exemplary/multiformat-imp.json
@@ -0,0 +1,116 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "w": 300,
+ "h": 250
+ },
+ "video": {
+ "mimes": [
+ "video/mp4"
+ ],
+ "w": 640,
+ "h": 480
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ }
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://s2s.prebid.bid-na.ads.aps.amazon-adsystem.com/e/pb/bid",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "w": 300,
+ "h": 250
+ },
+ "video": {
+ "mimes": [
+ "video/mp4"
+ ],
+ "w": 640,
+ "h": 480
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ },
+ "cur": [
+ "USD"
+ ],
+ "ext": {
+ "account": "test-account",
+ "sdk": {
+ "version": "1.0.0",
+ "source": "prebid-server"
+ }
+ }
+ },
+ "impIDs": [
+ "test-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "test-request-id",
+ "cur": "USD",
+ "seatbid": [
+ {
+ "seat": "aps",
+ "bid": [
+ {
+ "id": "1",
+ "impid": "test-imp-id",
+ "price": 1.5,
+ "adm": "banner ad
",
+ "crid": "creative-1",
+ "mtype": 1,
+ "w": 300,
+ "h": 250
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "currency": "USD",
+ "bids": [
+ {
+ "bid": {
+ "id": "1",
+ "impid": "test-imp-id",
+ "price": 1.5,
+ "adm": "banner ad
",
+ "crid": "creative-1",
+ "mtype": 1,
+ "w": 300,
+ "h": 250
+ },
+ "type": "banner"
+ }
+ ]
+ }
+ ]
+}
diff --git a/adapters/aps/apstest/exemplary/single-banner.json b/adapters/aps/apstest/exemplary/single-banner.json
new file mode 100644
index 000000000..80cebec75
--- /dev/null
+++ b/adapters/aps/apstest/exemplary/single-banner.json
@@ -0,0 +1,112 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ }
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://s2s.prebid.bid-na.ads.aps.amazon-adsystem.com/e/pb/bid",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ],
+ "w": 300,
+ "h": 250
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ },
+ "cur": [
+ "USD"
+ ],
+ "ext": {
+ "account": "test-account",
+ "sdk": {
+ "version": "1.0.0",
+ "source": "prebid-server"
+ }
+ }
+ },
+ "impIDs": [
+ "test-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "test-request-id",
+ "cur": "USD",
+ "seatbid": [
+ {
+ "seat": "aps",
+ "bid": [
+ {
+ "id": "1",
+ "impid": "test-imp-id",
+ "price": 1.5,
+ "adm": "banner ad
",
+ "crid": "creative-1",
+ "mtype": 1,
+ "w": 300,
+ "h": 250
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "currency": "USD",
+ "bids": [
+ {
+ "bid": {
+ "id": "1",
+ "impid": "test-imp-id",
+ "price": 1.5,
+ "adm": "banner ad
",
+ "crid": "creative-1",
+ "mtype": 1,
+ "w": 300,
+ "h": 250
+ },
+ "type": "banner"
+ }
+ ]
+ }
+ ]
+}
diff --git a/adapters/aps/apstest/exemplary/single-video.json b/adapters/aps/apstest/exemplary/single-video.json
new file mode 100644
index 000000000..63309a87a
--- /dev/null
+++ b/adapters/aps/apstest/exemplary/single-video.json
@@ -0,0 +1,104 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "video": {
+ "mimes": [
+ "video/mp4"
+ ],
+ "w": 640,
+ "h": 480
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ }
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://s2s.prebid.bid-na.ads.aps.amazon-adsystem.com/e/pb/bid",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "video": {
+ "mimes": [
+ "video/mp4"
+ ],
+ "w": 640,
+ "h": 480
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ },
+ "cur": [
+ "USD"
+ ],
+ "ext": {
+ "account": "test-account",
+ "sdk": {
+ "version": "1.0.0",
+ "source": "prebid-server"
+ }
+ }
+ },
+ "impIDs": [
+ "test-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "test-request-id",
+ "cur": "USD",
+ "seatbid": [
+ {
+ "seat": "aps",
+ "bid": [
+ {
+ "id": "1",
+ "impid": "test-imp-id",
+ "price": 2.5,
+ "nurl": "https://vast.aps.amazon-adsystem.com/vast?id=1",
+ "crid": "creative-2",
+ "mtype": 2
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "currency": "USD",
+ "bids": [
+ {
+ "bid": {
+ "id": "1",
+ "impid": "test-imp-id",
+ "price": 2.5,
+ "nurl": "https://vast.aps.amazon-adsystem.com/vast?id=1",
+ "crid": "creative-2",
+ "mtype": 2
+ },
+ "type": "video"
+ }
+ ]
+ }
+ ]
+}
diff --git a/adapters/aps/apstest/supplemental/banner-partial-size-overwrite.json b/adapters/aps/apstest/supplemental/banner-partial-size-overwrite.json
new file mode 100644
index 000000000..7225423f2
--- /dev/null
+++ b/adapters/aps/apstest/supplemental/banner-partial-size-overwrite.json
@@ -0,0 +1,74 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "w": 300,
+ "format": [
+ {
+ "w": 728,
+ "h": 90
+ }
+ ]
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ }
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://s2s.prebid.bid-na.ads.aps.amazon-adsystem.com/e/pb/bid",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "w": 728,
+ "h": 90,
+ "format": [
+ {
+ "w": 728,
+ "h": 90
+ }
+ ]
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ },
+ "cur": [
+ "USD"
+ ],
+ "ext": {
+ "account": "test-account",
+ "sdk": {
+ "version": "1.0.0",
+ "source": "prebid-server"
+ }
+ }
+ },
+ "impIDs": [
+ "test-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 204,
+ "body": {}
+ }
+ }
+ ],
+ "expectedBidResponses": []
+}
diff --git a/adapters/aps/apstest/supplemental/defaults-currency-to-usd.json b/adapters/aps/apstest/supplemental/defaults-currency-to-usd.json
new file mode 100644
index 000000000..265f05598
--- /dev/null
+++ b/adapters/aps/apstest/supplemental/defaults-currency-to-usd.json
@@ -0,0 +1,111 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ }
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://s2s.prebid.bid-na.ads.aps.amazon-adsystem.com/e/pb/bid",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ],
+ "w": 300,
+ "h": 250
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ },
+ "cur": [
+ "USD"
+ ],
+ "ext": {
+ "account": "test-account",
+ "sdk": {
+ "version": "1.0.0",
+ "source": "prebid-server"
+ }
+ }
+ },
+ "impIDs": [
+ "test-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "test-request-id",
+ "seatbid": [
+ {
+ "seat": "aps",
+ "bid": [
+ {
+ "id": "1",
+ "impid": "test-imp-id",
+ "price": 1.5,
+ "adm": "banner ad
",
+ "crid": "creative-1",
+ "mtype": 1,
+ "w": 300,
+ "h": 250
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "currency": "USD",
+ "bids": [
+ {
+ "bid": {
+ "id": "1",
+ "impid": "test-imp-id",
+ "price": 1.5,
+ "adm": "banner ad
",
+ "crid": "creative-1",
+ "mtype": 1,
+ "w": 300,
+ "h": 250
+ },
+ "type": "banner"
+ }
+ ]
+ }
+ ]
+}
diff --git a/adapters/aps/apstest/supplemental/region-na-explicit.json b/adapters/aps/apstest/supplemental/region-na-explicit.json
new file mode 100644
index 000000000..3d76aede9
--- /dev/null
+++ b/adapters/aps/apstest/supplemental/region-na-explicit.json
@@ -0,0 +1,73 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account", "region": "na" }
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ }
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://s2s.prebid.bid-na.ads.aps.amazon-adsystem.com/e/pb/bid",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ],
+ "w": 300,
+ "h": 250
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account", "region": "na" }
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ },
+ "cur": [
+ "USD"
+ ],
+ "ext": {
+ "account": "test-account",
+ "sdk": {
+ "version": "1.0.0",
+ "source": "prebid-server"
+ }
+ }
+ },
+ "impIDs": [
+ "test-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 204,
+ "body": {}
+ }
+ }
+ ],
+ "expectedBidResponses": []
+}
diff --git a/adapters/aps/apstest/supplemental/rejects-mismatched-account.json b/adapters/aps/apstest/supplemental/rejects-mismatched-account.json
new file mode 100644
index 000000000..2a9b110e3
--- /dev/null
+++ b/adapters/aps/apstest/supplemental/rejects-mismatched-account.json
@@ -0,0 +1,38 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "imp-1",
+ "banner": {
+ "w": 300,
+ "h": 250
+ },
+ "ext": {
+ "bidder": { "accountID": "acct-1" }
+ }
+ },
+ {
+ "id": "imp-2",
+ "banner": {
+ "w": 300,
+ "h": 250
+ },
+ "ext": {
+ "bidder": { "accountID": "acct-2" }
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ }
+ },
+ "httpCalls": [],
+ "expectedMakeRequestsErrors": [
+ {
+ "value": "imp \"imp-2\": all imps in a request must use the same APS accountID (got \"acct-1\" and \"acct-2\")",
+ "comparison": "literal"
+ }
+ ],
+ "expectedBidResponses": []
+}
diff --git a/adapters/aps/apstest/supplemental/rejects-unsupported-region.json b/adapters/aps/apstest/supplemental/rejects-unsupported-region.json
new file mode 100644
index 000000000..9b1253fd9
--- /dev/null
+++ b/adapters/aps/apstest/supplemental/rejects-unsupported-region.json
@@ -0,0 +1,34 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "accountID": "test-account",
+ "region": "na.evil.com/"
+ }
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ }
+ },
+ "httpCalls": [],
+ "expectedMakeRequestsErrors": [
+ {
+ "value": "imp \"test-imp-id\": invalid APS region \"na.evil.com/\"",
+ "comparison": "literal"
+ }
+ ]
+}
diff --git a/adapters/aps/apstest/supplemental/requires-account.json b/adapters/aps/apstest/supplemental/requires-account.json
new file mode 100644
index 000000000..da968534b
--- /dev/null
+++ b/adapters/aps/apstest/supplemental/requires-account.json
@@ -0,0 +1,31 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {}
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ }
+ },
+ "httpCalls": [],
+ "expectedMakeRequestsErrors": [
+ {
+ "value": "imp \"test-imp-id\": the APS bidder param \"accountID\" is required",
+ "comparison": "literal"
+ }
+ ]
+}
diff --git a/adapters/aps/apstest/supplemental/resolves-eu-region.json b/adapters/aps/apstest/supplemental/resolves-eu-region.json
new file mode 100644
index 000000000..ecc3df1db
--- /dev/null
+++ b/adapters/aps/apstest/supplemental/resolves-eu-region.json
@@ -0,0 +1,79 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "accountID": "test-account",
+ "region": "eu"
+ }
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ }
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://s2s.prebid.bid-eu.ads.aps.amazon-adsystem.com/e/pb/bid",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ],
+ "w": 300,
+ "h": 250
+ },
+ "ext": {
+ "bidder": {
+ "accountID": "test-account",
+ "region": "eu"
+ }
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ },
+ "cur": [
+ "USD"
+ ],
+ "ext": {
+ "account": "test-account",
+ "sdk": {
+ "version": "1.0.0",
+ "source": "prebid-server"
+ }
+ }
+ },
+ "impIDs": [
+ "test-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 204,
+ "body": {}
+ }
+ }
+ ],
+ "expectedBidResponses": []
+}
diff --git a/adapters/aps/apstest/supplemental/status-204.json b/adapters/aps/apstest/supplemental/status-204.json
new file mode 100644
index 000000000..0655d294f
--- /dev/null
+++ b/adapters/aps/apstest/supplemental/status-204.json
@@ -0,0 +1,56 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "w": 300,
+ "h": 250
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ }
+ ]
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://s2s.prebid.bid-na.ads.aps.amazon-adsystem.com/e/pb/bid",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "w": 300,
+ "h": 250
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ }
+ ],
+ "cur": [
+ "USD"
+ ],
+ "ext": {
+ "account": "test-account",
+ "sdk": {
+ "version": "1.0.0",
+ "source": "prebid-server"
+ }
+ }
+ },
+ "impIDs": [
+ "test-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 204
+ }
+ }
+ ],
+ "expectedBidResponses": []
+}
diff --git a/adapters/aps/apstest/supplemental/status-400.json b/adapters/aps/apstest/supplemental/status-400.json
new file mode 100644
index 000000000..05db0f758
--- /dev/null
+++ b/adapters/aps/apstest/supplemental/status-400.json
@@ -0,0 +1,62 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "w": 300,
+ "h": 250
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ }
+ ]
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://s2s.prebid.bid-na.ads.aps.amazon-adsystem.com/e/pb/bid",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "w": 300,
+ "h": 250
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ }
+ ],
+ "cur": [
+ "USD"
+ ],
+ "ext": {
+ "account": "test-account",
+ "sdk": {
+ "version": "1.0.0",
+ "source": "prebid-server"
+ }
+ }
+ },
+ "impIDs": [
+ "test-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 400
+ }
+ }
+ ],
+ "expectedBidResponses": [],
+ "expectedMakeBidsErrors": [
+ {
+ "value": "Unexpected status code: 400. Bad request from publisher.",
+ "comparison": "literal"
+ }
+ ]
+}
diff --git a/adapters/aps/apstest/supplemental/status-500.json b/adapters/aps/apstest/supplemental/status-500.json
new file mode 100644
index 000000000..b120922e6
--- /dev/null
+++ b/adapters/aps/apstest/supplemental/status-500.json
@@ -0,0 +1,63 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "w": 300,
+ "h": 250
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ }
+ ]
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://s2s.prebid.bid-na.ads.aps.amazon-adsystem.com/e/pb/bid",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "w": 300,
+ "h": 250
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ }
+ ],
+ "cur": [
+ "USD"
+ ],
+ "ext": {
+ "account": "test-account",
+ "sdk": {
+ "version": "1.0.0",
+ "source": "prebid-server"
+ }
+ }
+ },
+ "impIDs": [
+ "test-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 500,
+ "body": "Server error"
+ }
+ }
+ ],
+ "expectedBidResponses": [],
+ "expectedMakeBidsErrors": [
+ {
+ "value": "Unexpected status code: 500.",
+ "comparison": "literal"
+ }
+ ]
+}
diff --git a/adapters/aps/apstest/supplemental/strips-sensitive-data.json b/adapters/aps/apstest/supplemental/strips-sensitive-data.json
new file mode 100644
index 000000000..8e5a3cebf
--- /dev/null
+++ b/adapters/aps/apstest/supplemental/strips-sensitive-data.json
@@ -0,0 +1,129 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "w": 300,
+ "h": 250
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ },
+ "device": {
+ "ua": "Mozilla/5.0",
+ "geo": {
+ "country": "USA",
+ "lat": 37.7749,
+ "lon": -122.4194
+ }
+ },
+ "user": {
+ "id": "user-1",
+ "gender": "M",
+ "yob": 1990,
+ "customdata": "secret",
+ "geo": {
+ "lat": 37.7749,
+ "lon": -122.4194
+ }
+ }
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://s2s.prebid.bid-na.ads.aps.amazon-adsystem.com/e/pb/bid",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "w": 300,
+ "h": 250
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ },
+ "device": {
+ "ua": "Mozilla/5.0",
+ "geo": {
+ "country": "USA"
+ }
+ },
+ "user": {
+ "id": "user-1"
+ },
+ "cur": [
+ "USD"
+ ],
+ "ext": {
+ "account": "test-account",
+ "sdk": {
+ "version": "1.0.0",
+ "source": "prebid-server"
+ }
+ }
+ },
+ "impIDs": [
+ "test-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "test-request-id",
+ "cur": "USD",
+ "seatbid": [
+ {
+ "seat": "aps",
+ "bid": [
+ {
+ "id": "1",
+ "impid": "test-imp-id",
+ "price": 1.5,
+ "adm": "banner ad
",
+ "crid": "creative-1",
+ "mtype": 1,
+ "w": 300,
+ "h": 250
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "currency": "USD",
+ "bids": [
+ {
+ "bid": {
+ "id": "1",
+ "impid": "test-imp-id",
+ "price": 1.5,
+ "adm": "banner ad
",
+ "crid": "creative-1",
+ "mtype": 1,
+ "w": 300,
+ "h": 250
+ },
+ "type": "banner"
+ }
+ ]
+ }
+ ]
+}
diff --git a/adapters/aps/apstest/supplemental/test-mode-appends-debug.json b/adapters/aps/apstest/supplemental/test-mode-appends-debug.json
new file mode 100644
index 000000000..7fdf139c1
--- /dev/null
+++ b/adapters/aps/apstest/supplemental/test-mode-appends-debug.json
@@ -0,0 +1,64 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "test": 1,
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "w": 300,
+ "h": 250
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ }
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://s2s.prebid.bid-na.ads.aps.amazon-adsystem.com/e/pb/bid?amzn_debug_mode=1",
+ "body": {
+ "id": "test-request-id",
+ "test": 1,
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "w": 300,
+ "h": 250
+ },
+ "ext": {
+ "bidder": { "accountID": "test-account" }
+ }
+ }
+ ],
+ "site": {
+ "page": "https://example.com"
+ },
+ "cur": [
+ "USD"
+ ],
+ "ext": {
+ "account": "test-account",
+ "sdk": {
+ "version": "1.0.0",
+ "source": "prebid-server"
+ }
+ }
+ },
+ "impIDs": [
+ "test-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 204
+ }
+ }
+ ],
+ "expectedBidResponses": []
+}
diff --git a/adapters/aps/params_test.go b/adapters/aps/params_test.go
new file mode 100644
index 000000000..74e035885
--- /dev/null
+++ b/adapters/aps/params_test.go
@@ -0,0 +1,54 @@
+package aps
+
+import (
+ "encoding/json"
+ "testing"
+
+ "github.com/prebid/prebid-server/v4/openrtb_ext"
+)
+
+func TestValidParams(t *testing.T) {
+ validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params")
+ if err != nil {
+ t.Fatalf("Failed to fetch json-schemas. %v", err)
+ }
+
+ for _, param := range validParams {
+ if err := validator.Validate(openrtb_ext.BidderAps, json.RawMessage(param)); err != nil {
+ t.Errorf("Schema rejected valid params: %s", param)
+ }
+ }
+}
+
+func TestInvalidParams(t *testing.T) {
+ validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params")
+ if err != nil {
+ t.Fatalf("Failed to fetch json-schemas. %v", err)
+ }
+
+ for _, param := range invalidParams {
+ if err := validator.Validate(openrtb_ext.BidderAps, json.RawMessage(param)); err == nil {
+ t.Errorf("Schema allowed invalid params: %s", param)
+ }
+ }
+}
+
+var validParams = []string{
+ `{"accountID":"test-account"}`,
+ `{"accountID":"3703"}`,
+ `{"accountID":"test-account","region":"na"}`,
+ `{"accountID":"test-account","region":"eu"}`,
+ `{"accountID":"test-account","region":"fe"}`,
+}
+
+var invalidParams = []string{
+ `{}`,
+ `{"accountID":123}`,
+ `{"accountID":"test-account","region":"xx"}`,
+ `{"accountID":"test-account","region":""}`,
+ `[]`,
+ `"aps"`,
+ `1`,
+ `true`,
+ `null`,
+}
diff --git a/exchange/adapter_builders.go b/exchange/adapter_builders.go
index fa1ea996f..ff389818b 100755
--- a/exchange/adapter_builders.go
+++ b/exchange/adapter_builders.go
@@ -1,263 +1,281 @@
package exchange
import (
- "github.com/prebid/prebid-server/v3/adapters"
- ttx "github.com/prebid/prebid-server/v3/adapters/33across"
- "github.com/prebid/prebid-server/v3/adapters/aax"
- "github.com/prebid/prebid-server/v3/adapters/aceex"
- "github.com/prebid/prebid-server/v3/adapters/acuityads"
- "github.com/prebid/prebid-server/v3/adapters/adagio"
- "github.com/prebid/prebid-server/v3/adapters/adelement"
- "github.com/prebid/prebid-server/v3/adapters/adf"
- "github.com/prebid/prebid-server/v3/adapters/adgeneration"
- "github.com/prebid/prebid-server/v3/adapters/adhese"
- "github.com/prebid/prebid-server/v3/adapters/adkernel"
- "github.com/prebid/prebid-server/v3/adapters/adkernelAdn"
- "github.com/prebid/prebid-server/v3/adapters/adman"
- "github.com/prebid/prebid-server/v3/adapters/admatic"
- "github.com/prebid/prebid-server/v3/adapters/admixer"
- "github.com/prebid/prebid-server/v3/adapters/adnuntius"
- "github.com/prebid/prebid-server/v3/adapters/adocean"
- "github.com/prebid/prebid-server/v3/adapters/adoppler"
- "github.com/prebid/prebid-server/v3/adapters/adot"
- "github.com/prebid/prebid-server/v3/adapters/adpone"
- "github.com/prebid/prebid-server/v3/adapters/adprime"
- "github.com/prebid/prebid-server/v3/adapters/adquery"
- "github.com/prebid/prebid-server/v3/adapters/adrino"
- "github.com/prebid/prebid-server/v3/adapters/ads_interactive"
- "github.com/prebid/prebid-server/v3/adapters/adsinteractive"
- "github.com/prebid/prebid-server/v3/adapters/adtarget"
- "github.com/prebid/prebid-server/v3/adapters/adtelligent"
- "github.com/prebid/prebid-server/v3/adapters/adtonos"
- "github.com/prebid/prebid-server/v3/adapters/adtrgtme"
- "github.com/prebid/prebid-server/v3/adapters/aduptech"
- "github.com/prebid/prebid-server/v3/adapters/advangelists"
- "github.com/prebid/prebid-server/v3/adapters/adverxo"
- "github.com/prebid/prebid-server/v3/adapters/adview"
- "github.com/prebid/prebid-server/v3/adapters/adxcg"
- "github.com/prebid/prebid-server/v3/adapters/adyoulike"
- "github.com/prebid/prebid-server/v3/adapters/afront"
- "github.com/prebid/prebid-server/v3/adapters/aidem"
- "github.com/prebid/prebid-server/v3/adapters/aja"
- "github.com/prebid/prebid-server/v3/adapters/akcelo"
- "github.com/prebid/prebid-server/v3/adapters/algorix"
- "github.com/prebid/prebid-server/v3/adapters/alkimi"
- "github.com/prebid/prebid-server/v3/adapters/amx"
- "github.com/prebid/prebid-server/v3/adapters/apacdex"
- "github.com/prebid/prebid-server/v3/adapters/appnexus"
- "github.com/prebid/prebid-server/v3/adapters/appush"
- "github.com/prebid/prebid-server/v3/adapters/aso"
- "github.com/prebid/prebid-server/v3/adapters/audienceNetwork"
- "github.com/prebid/prebid-server/v3/adapters/automatad"
- "github.com/prebid/prebid-server/v3/adapters/avocet"
- "github.com/prebid/prebid-server/v3/adapters/axis"
- "github.com/prebid/prebid-server/v3/adapters/axonix"
- "github.com/prebid/prebid-server/v3/adapters/beachfront"
- "github.com/prebid/prebid-server/v3/adapters/beintoo"
- "github.com/prebid/prebid-server/v3/adapters/bematterfull"
- "github.com/prebid/prebid-server/v3/adapters/between"
- "github.com/prebid/prebid-server/v3/adapters/beyondmedia"
- "github.com/prebid/prebid-server/v3/adapters/bidmachine"
- "github.com/prebid/prebid-server/v3/adapters/bidmatic"
- "github.com/prebid/prebid-server/v3/adapters/bidmyadz"
- "github.com/prebid/prebid-server/v3/adapters/bidscube"
- "github.com/prebid/prebid-server/v3/adapters/bidstack"
- "github.com/prebid/prebid-server/v3/adapters/bidtheatre"
- "github.com/prebid/prebid-server/v3/adapters/bigoad"
- "github.com/prebid/prebid-server/v3/adapters/blasto"
- "github.com/prebid/prebid-server/v3/adapters/bliink"
- "github.com/prebid/prebid-server/v3/adapters/blis"
- "github.com/prebid/prebid-server/v3/adapters/blue"
- "github.com/prebid/prebid-server/v3/adapters/bluesea"
- "github.com/prebid/prebid-server/v3/adapters/bmtm"
- "github.com/prebid/prebid-server/v3/adapters/boldwin"
- "github.com/prebid/prebid-server/v3/adapters/brave"
- "github.com/prebid/prebid-server/v3/adapters/bwx"
- cadentaperturemx "github.com/prebid/prebid-server/v3/adapters/cadent_aperture_mx"
- "github.com/prebid/prebid-server/v3/adapters/ccx"
- "github.com/prebid/prebid-server/v3/adapters/cointraffic"
- "github.com/prebid/prebid-server/v3/adapters/coinzilla"
- "github.com/prebid/prebid-server/v3/adapters/colossus"
- "github.com/prebid/prebid-server/v3/adapters/compass"
- "github.com/prebid/prebid-server/v3/adapters/concert"
- "github.com/prebid/prebid-server/v3/adapters/connatix"
- "github.com/prebid/prebid-server/v3/adapters/connectad"
- "github.com/prebid/prebid-server/v3/adapters/consumable"
- "github.com/prebid/prebid-server/v3/adapters/conversant"
- "github.com/prebid/prebid-server/v3/adapters/copper6ssp"
- "github.com/prebid/prebid-server/v3/adapters/cpmstar"
- "github.com/prebid/prebid-server/v3/adapters/criteo"
- "github.com/prebid/prebid-server/v3/adapters/cwire"
- "github.com/prebid/prebid-server/v3/adapters/datablocks"
- "github.com/prebid/prebid-server/v3/adapters/decenterads"
- "github.com/prebid/prebid-server/v3/adapters/deepintent"
- "github.com/prebid/prebid-server/v3/adapters/definemedia"
- "github.com/prebid/prebid-server/v3/adapters/dianomi"
- "github.com/prebid/prebid-server/v3/adapters/displayio"
- "github.com/prebid/prebid-server/v3/adapters/dmx"
- "github.com/prebid/prebid-server/v3/adapters/driftpixel"
- "github.com/prebid/prebid-server/v3/adapters/dxkulture"
- evolution "github.com/prebid/prebid-server/v3/adapters/e_volution"
- "github.com/prebid/prebid-server/v3/adapters/edge226"
- "github.com/prebid/prebid-server/v3/adapters/emtv"
- "github.com/prebid/prebid-server/v3/adapters/eplanning"
- "github.com/prebid/prebid-server/v3/adapters/epom"
- "github.com/prebid/prebid-server/v3/adapters/escalax"
- "github.com/prebid/prebid-server/v3/adapters/exco"
- "github.com/prebid/prebid-server/v3/adapters/feedad"
- "github.com/prebid/prebid-server/v3/adapters/flatads"
- "github.com/prebid/prebid-server/v3/adapters/flipp"
- "github.com/prebid/prebid-server/v3/adapters/freewheelssp"
- "github.com/prebid/prebid-server/v3/adapters/frvradn"
- "github.com/prebid/prebid-server/v3/adapters/fwssp"
- "github.com/prebid/prebid-server/v3/adapters/gamma"
- "github.com/prebid/prebid-server/v3/adapters/gamoshi"
- "github.com/prebid/prebid-server/v3/adapters/globalsun"
- "github.com/prebid/prebid-server/v3/adapters/gothamads"
- "github.com/prebid/prebid-server/v3/adapters/grid"
- "github.com/prebid/prebid-server/v3/adapters/gumgum"
- "github.com/prebid/prebid-server/v3/adapters/huaweiads"
- "github.com/prebid/prebid-server/v3/adapters/imds"
- "github.com/prebid/prebid-server/v3/adapters/impactify"
- "github.com/prebid/prebid-server/v3/adapters/improvedigital"
- "github.com/prebid/prebid-server/v3/adapters/infytv"
- "github.com/prebid/prebid-server/v3/adapters/inmobi"
- "github.com/prebid/prebid-server/v3/adapters/insticator"
- "github.com/prebid/prebid-server/v3/adapters/interactiveoffers"
- "github.com/prebid/prebid-server/v3/adapters/intertech"
- "github.com/prebid/prebid-server/v3/adapters/invibes"
- "github.com/prebid/prebid-server/v3/adapters/iqx"
- "github.com/prebid/prebid-server/v3/adapters/iqzone"
- "github.com/prebid/prebid-server/v3/adapters/ix"
- "github.com/prebid/prebid-server/v3/adapters/jixie"
- "github.com/prebid/prebid-server/v3/adapters/kargo"
- "github.com/prebid/prebid-server/v3/adapters/kayzen"
- "github.com/prebid/prebid-server/v3/adapters/kidoz"
- "github.com/prebid/prebid-server/v3/adapters/kiviads"
- "github.com/prebid/prebid-server/v3/adapters/kobler"
- "github.com/prebid/prebid-server/v3/adapters/krushmedia"
- "github.com/prebid/prebid-server/v3/adapters/kueezrtb"
- "github.com/prebid/prebid-server/v3/adapters/lemmadigital"
- "github.com/prebid/prebid-server/v3/adapters/limelightDigital"
- lmkiviads "github.com/prebid/prebid-server/v3/adapters/lm_kiviads"
- "github.com/prebid/prebid-server/v3/adapters/lockerdome"
- "github.com/prebid/prebid-server/v3/adapters/logan"
- "github.com/prebid/prebid-server/v3/adapters/logicad"
- "github.com/prebid/prebid-server/v3/adapters/loopme"
- "github.com/prebid/prebid-server/v3/adapters/loyal"
- "github.com/prebid/prebid-server/v3/adapters/lunamedia"
- "github.com/prebid/prebid-server/v3/adapters/mabidder"
- "github.com/prebid/prebid-server/v3/adapters/madsense"
- "github.com/prebid/prebid-server/v3/adapters/madvertise"
- "github.com/prebid/prebid-server/v3/adapters/marsmedia"
- "github.com/prebid/prebid-server/v3/adapters/mediago"
- "github.com/prebid/prebid-server/v3/adapters/medianet"
- "github.com/prebid/prebid-server/v3/adapters/mediasquare"
- "github.com/prebid/prebid-server/v3/adapters/melozen"
- "github.com/prebid/prebid-server/v3/adapters/metax"
- "github.com/prebid/prebid-server/v3/adapters/mgid"
- "github.com/prebid/prebid-server/v3/adapters/mgidX"
- "github.com/prebid/prebid-server/v3/adapters/minutemedia"
- "github.com/prebid/prebid-server/v3/adapters/missena"
- "github.com/prebid/prebid-server/v3/adapters/mobfoxpb"
- "github.com/prebid/prebid-server/v3/adapters/mobilefuse"
- "github.com/prebid/prebid-server/v3/adapters/mobkoi"
- "github.com/prebid/prebid-server/v3/adapters/motorik"
- "github.com/prebid/prebid-server/v3/adapters/nativo"
- "github.com/prebid/prebid-server/v3/adapters/nextmillennium"
- "github.com/prebid/prebid-server/v3/adapters/nexx360"
- "github.com/prebid/prebid-server/v3/adapters/nobid"
- "github.com/prebid/prebid-server/v3/adapters/ogury"
- "github.com/prebid/prebid-server/v3/adapters/oms"
- "github.com/prebid/prebid-server/v3/adapters/onetag"
- "github.com/prebid/prebid-server/v3/adapters/openweb"
- "github.com/prebid/prebid-server/v3/adapters/openx"
- "github.com/prebid/prebid-server/v3/adapters/operaads"
- "github.com/prebid/prebid-server/v3/adapters/optidigital"
- "github.com/prebid/prebid-server/v3/adapters/oraki"
- "github.com/prebid/prebid-server/v3/adapters/orbidder"
- "github.com/prebid/prebid-server/v3/adapters/outbrain"
- "github.com/prebid/prebid-server/v3/adapters/ownadx"
- "github.com/prebid/prebid-server/v3/adapters/pangle"
- "github.com/prebid/prebid-server/v3/adapters/pgamssp"
- "github.com/prebid/prebid-server/v3/adapters/playdigo"
- "github.com/prebid/prebid-server/v3/adapters/pubmatic"
- "github.com/prebid/prebid-server/v3/adapters/pubnative"
- "github.com/prebid/prebid-server/v3/adapters/pubrise"
- "github.com/prebid/prebid-server/v3/adapters/pulsepoint"
- "github.com/prebid/prebid-server/v3/adapters/pwbid"
- "github.com/prebid/prebid-server/v3/adapters/qt"
- "github.com/prebid/prebid-server/v3/adapters/readpeak"
- "github.com/prebid/prebid-server/v3/adapters/rediads"
- "github.com/prebid/prebid-server/v3/adapters/relevantdigital"
- "github.com/prebid/prebid-server/v3/adapters/resetdigital"
- "github.com/prebid/prebid-server/v3/adapters/revcontent"
- "github.com/prebid/prebid-server/v3/adapters/richaudience"
- "github.com/prebid/prebid-server/v3/adapters/rise"
- "github.com/prebid/prebid-server/v3/adapters/roulax"
- "github.com/prebid/prebid-server/v3/adapters/rtbhouse"
- "github.com/prebid/prebid-server/v3/adapters/rubicon"
- salunamedia "github.com/prebid/prebid-server/v3/adapters/sa_lunamedia"
- "github.com/prebid/prebid-server/v3/adapters/screencore"
- "github.com/prebid/prebid-server/v3/adapters/seedingAlliance"
- "github.com/prebid/prebid-server/v3/adapters/seedtag"
- "github.com/prebid/prebid-server/v3/adapters/sharethrough"
- "github.com/prebid/prebid-server/v3/adapters/silvermob"
- "github.com/prebid/prebid-server/v3/adapters/silverpush"
- "github.com/prebid/prebid-server/v3/adapters/smaato"
- "github.com/prebid/prebid-server/v3/adapters/smartadserver"
- "github.com/prebid/prebid-server/v3/adapters/smarthub"
- "github.com/prebid/prebid-server/v3/adapters/smartrtb"
- "github.com/prebid/prebid-server/v3/adapters/smartx"
- "github.com/prebid/prebid-server/v3/adapters/smartyads"
- "github.com/prebid/prebid-server/v3/adapters/smilewanted"
- "github.com/prebid/prebid-server/v3/adapters/smoot"
- "github.com/prebid/prebid-server/v3/adapters/smrtconnect"
- "github.com/prebid/prebid-server/v3/adapters/sonobi"
- "github.com/prebid/prebid-server/v3/adapters/sovrn"
- "github.com/prebid/prebid-server/v3/adapters/sovrnXsp"
- "github.com/prebid/prebid-server/v3/adapters/sparteo"
- "github.com/prebid/prebid-server/v3/adapters/sspBC"
- "github.com/prebid/prebid-server/v3/adapters/startio"
- "github.com/prebid/prebid-server/v3/adapters/stroeerCore"
- "github.com/prebid/prebid-server/v3/adapters/taboola"
- "github.com/prebid/prebid-server/v3/adapters/tappx"
- "github.com/prebid/prebid-server/v3/adapters/teads"
- "github.com/prebid/prebid-server/v3/adapters/telaria"
- "github.com/prebid/prebid-server/v3/adapters/teqblaze"
- "github.com/prebid/prebid-server/v3/adapters/theadx"
- "github.com/prebid/prebid-server/v3/adapters/thetradedesk"
- "github.com/prebid/prebid-server/v3/adapters/tpmn"
- "github.com/prebid/prebid-server/v3/adapters/tradplus"
- "github.com/prebid/prebid-server/v3/adapters/trafficgate"
- "github.com/prebid/prebid-server/v3/adapters/triplelift"
- "github.com/prebid/prebid-server/v3/adapters/triplelift_native"
- "github.com/prebid/prebid-server/v3/adapters/trustedstack"
- "github.com/prebid/prebid-server/v3/adapters/ucfunnel"
- "github.com/prebid/prebid-server/v3/adapters/undertone"
- "github.com/prebid/prebid-server/v3/adapters/unicorn"
- "github.com/prebid/prebid-server/v3/adapters/unruly"
- "github.com/prebid/prebid-server/v3/adapters/vidazoo"
- "github.com/prebid/prebid-server/v3/adapters/videobyte"
- "github.com/prebid/prebid-server/v3/adapters/videoheroes"
- "github.com/prebid/prebid-server/v3/adapters/vidoomy"
- "github.com/prebid/prebid-server/v3/adapters/visiblemeasures"
- "github.com/prebid/prebid-server/v3/adapters/visx"
- "github.com/prebid/prebid-server/v3/adapters/vox"
- "github.com/prebid/prebid-server/v3/adapters/vrtcal"
- "github.com/prebid/prebid-server/v3/adapters/vungle"
- "github.com/prebid/prebid-server/v3/adapters/xeworks"
- "github.com/prebid/prebid-server/v3/adapters/yahooAds"
- "github.com/prebid/prebid-server/v3/adapters/yandex"
- "github.com/prebid/prebid-server/v3/adapters/yeahmobi"
- "github.com/prebid/prebid-server/v3/adapters/yieldlab"
- "github.com/prebid/prebid-server/v3/adapters/yieldmo"
- "github.com/prebid/prebid-server/v3/adapters/yieldone"
- "github.com/prebid/prebid-server/v3/adapters/zentotem"
- "github.com/prebid/prebid-server/v3/adapters/zeroclickfraud"
- "github.com/prebid/prebid-server/v3/adapters/zeta_global_ssp"
- "github.com/prebid/prebid-server/v3/adapters/zmaticoo"
- "github.com/prebid/prebid-server/v3/openrtb_ext"
+ "github.com/prebid/prebid-server/v4/adapters"
+ ttx "github.com/prebid/prebid-server/v4/adapters/33across"
+ "github.com/prebid/prebid-server/v4/adapters/aax"
+ "github.com/prebid/prebid-server/v4/adapters/aceex"
+ "github.com/prebid/prebid-server/v4/adapters/acuityads"
+ "github.com/prebid/prebid-server/v4/adapters/adagio"
+ "github.com/prebid/prebid-server/v4/adapters/adelement"
+ "github.com/prebid/prebid-server/v4/adapters/adf"
+ "github.com/prebid/prebid-server/v4/adapters/adgeneration"
+ "github.com/prebid/prebid-server/v4/adapters/adhese"
+ "github.com/prebid/prebid-server/v4/adapters/adkernel"
+ "github.com/prebid/prebid-server/v4/adapters/adkernelAdn"
+ "github.com/prebid/prebid-server/v4/adapters/adman"
+ "github.com/prebid/prebid-server/v4/adapters/admatic"
+ "github.com/prebid/prebid-server/v4/adapters/admixer"
+ "github.com/prebid/prebid-server/v4/adapters/adnuntius"
+ "github.com/prebid/prebid-server/v4/adapters/adot"
+ "github.com/prebid/prebid-server/v4/adapters/adpone"
+ "github.com/prebid/prebid-server/v4/adapters/adprime"
+ "github.com/prebid/prebid-server/v4/adapters/adquery"
+ "github.com/prebid/prebid-server/v4/adapters/adrino"
+ "github.com/prebid/prebid-server/v4/adapters/adtarget"
+ "github.com/prebid/prebid-server/v4/adapters/adtelligent"
+ "github.com/prebid/prebid-server/v4/adapters/adtonos"
+ "github.com/prebid/prebid-server/v4/adapters/adtrgtme"
+ "github.com/prebid/prebid-server/v4/adapters/aduptech"
+ "github.com/prebid/prebid-server/v4/adapters/advangelists"
+ "github.com/prebid/prebid-server/v4/adapters/adverxo"
+ "github.com/prebid/prebid-server/v4/adapters/adview"
+ "github.com/prebid/prebid-server/v4/adapters/adxcg"
+ "github.com/prebid/prebid-server/v4/adapters/adyoulike"
+ "github.com/prebid/prebid-server/v4/adapters/afront"
+ "github.com/prebid/prebid-server/v4/adapters/aidem"
+ "github.com/prebid/prebid-server/v4/adapters/aja"
+ "github.com/prebid/prebid-server/v4/adapters/akcelo"
+ "github.com/prebid/prebid-server/v4/adapters/algorix"
+ "github.com/prebid/prebid-server/v4/adapters/alkimi"
+ alliance_gravity "github.com/prebid/prebid-server/v4/adapters/alliance_gravity"
+ "github.com/prebid/prebid-server/v4/adapters/amx"
+ "github.com/prebid/prebid-server/v4/adapters/apacdex"
+ "github.com/prebid/prebid-server/v4/adapters/appnexus"
+ "github.com/prebid/prebid-server/v4/adapters/appush"
+ "github.com/prebid/prebid-server/v4/adapters/aps"
+ "github.com/prebid/prebid-server/v4/adapters/aso"
+ "github.com/prebid/prebid-server/v4/adapters/audienceNetwork"
+ "github.com/prebid/prebid-server/v4/adapters/automatad"
+ "github.com/prebid/prebid-server/v4/adapters/avocet"
+ "github.com/prebid/prebid-server/v4/adapters/axis"
+ "github.com/prebid/prebid-server/v4/adapters/axonix"
+ "github.com/prebid/prebid-server/v4/adapters/beachfront"
+ "github.com/prebid/prebid-server/v4/adapters/beintoo"
+ "github.com/prebid/prebid-server/v4/adapters/bematterfull"
+ "github.com/prebid/prebid-server/v4/adapters/beop"
+ "github.com/prebid/prebid-server/v4/adapters/between"
+ "github.com/prebid/prebid-server/v4/adapters/beyondmedia"
+ "github.com/prebid/prebid-server/v4/adapters/bidmachine"
+ "github.com/prebid/prebid-server/v4/adapters/bidmatic"
+ "github.com/prebid/prebid-server/v4/adapters/bidmyadz"
+ "github.com/prebid/prebid-server/v4/adapters/bidscube"
+ "github.com/prebid/prebid-server/v4/adapters/bidstack"
+ "github.com/prebid/prebid-server/v4/adapters/bidtheatre"
+ "github.com/prebid/prebid-server/v4/adapters/bigoad"
+ "github.com/prebid/prebid-server/v4/adapters/blasto"
+ "github.com/prebid/prebid-server/v4/adapters/bliink"
+ "github.com/prebid/prebid-server/v4/adapters/blis"
+ "github.com/prebid/prebid-server/v4/adapters/blue"
+ "github.com/prebid/prebid-server/v4/adapters/bluesea"
+ "github.com/prebid/prebid-server/v4/adapters/bmtm"
+ "github.com/prebid/prebid-server/v4/adapters/boldwin"
+ "github.com/prebid/prebid-server/v4/adapters/boldwin_rapid"
+ "github.com/prebid/prebid-server/v4/adapters/brave"
+ "github.com/prebid/prebid-server/v4/adapters/bwx"
+ cadentaperturemx "github.com/prebid/prebid-server/v4/adapters/cadent_aperture_mx"
+ "github.com/prebid/prebid-server/v4/adapters/ccx"
+ "github.com/prebid/prebid-server/v4/adapters/clydo"
+ "github.com/prebid/prebid-server/v4/adapters/cointraffic"
+ "github.com/prebid/prebid-server/v4/adapters/coinzilla"
+ "github.com/prebid/prebid-server/v4/adapters/colossus"
+ "github.com/prebid/prebid-server/v4/adapters/compass"
+ "github.com/prebid/prebid-server/v4/adapters/concert"
+ "github.com/prebid/prebid-server/v4/adapters/connatix"
+ "github.com/prebid/prebid-server/v4/adapters/connectad"
+ "github.com/prebid/prebid-server/v4/adapters/consumable"
+ "github.com/prebid/prebid-server/v4/adapters/contxtful"
+ "github.com/prebid/prebid-server/v4/adapters/conversant"
+ "github.com/prebid/prebid-server/v4/adapters/copper6ssp"
+ "github.com/prebid/prebid-server/v4/adapters/cpmstar"
+ "github.com/prebid/prebid-server/v4/adapters/criteo"
+ "github.com/prebid/prebid-server/v4/adapters/cwire"
+ "github.com/prebid/prebid-server/v4/adapters/datablocks"
+ "github.com/prebid/prebid-server/v4/adapters/decenterads"
+ "github.com/prebid/prebid-server/v4/adapters/deepintent"
+ "github.com/prebid/prebid-server/v4/adapters/definemedia"
+ "github.com/prebid/prebid-server/v4/adapters/dianomi"
+ "github.com/prebid/prebid-server/v4/adapters/displayio"
+ "github.com/prebid/prebid-server/v4/adapters/dmx"
+ "github.com/prebid/prebid-server/v4/adapters/driftpixel"
+ evolution "github.com/prebid/prebid-server/v4/adapters/e_volution"
+ "github.com/prebid/prebid-server/v4/adapters/edge226"
+ "github.com/prebid/prebid-server/v4/adapters/elementaltv"
+ "github.com/prebid/prebid-server/v4/adapters/emtv"
+ "github.com/prebid/prebid-server/v4/adapters/eplanning"
+ "github.com/prebid/prebid-server/v4/adapters/epom"
+ "github.com/prebid/prebid-server/v4/adapters/escalax"
+ "github.com/prebid/prebid-server/v4/adapters/eskimi"
+ "github.com/prebid/prebid-server/v4/adapters/exco"
+ "github.com/prebid/prebid-server/v4/adapters/ezoic"
+ "github.com/prebid/prebid-server/v4/adapters/feedad"
+ "github.com/prebid/prebid-server/v4/adapters/ferio"
+ "github.com/prebid/prebid-server/v4/adapters/flatads"
+ "github.com/prebid/prebid-server/v4/adapters/flipp"
+ "github.com/prebid/prebid-server/v4/adapters/freewheelssp"
+ "github.com/prebid/prebid-server/v4/adapters/frvradn"
+ "github.com/prebid/prebid-server/v4/adapters/fwssp"
+ "github.com/prebid/prebid-server/v4/adapters/gamma"
+ "github.com/prebid/prebid-server/v4/adapters/gamoshi"
+ "github.com/prebid/prebid-server/v4/adapters/globalsun"
+ "github.com/prebid/prebid-server/v4/adapters/goldbach"
+ "github.com/prebid/prebid-server/v4/adapters/grid"
+ "github.com/prebid/prebid-server/v4/adapters/gumgum"
+ "github.com/prebid/prebid-server/v4/adapters/huaweiads"
+ "github.com/prebid/prebid-server/v4/adapters/imds"
+ "github.com/prebid/prebid-server/v4/adapters/impactify"
+ "github.com/prebid/prebid-server/v4/adapters/improvedigital"
+ "github.com/prebid/prebid-server/v4/adapters/infytv"
+ "github.com/prebid/prebid-server/v4/adapters/inmobi"
+ "github.com/prebid/prebid-server/v4/adapters/insticator"
+ "github.com/prebid/prebid-server/v4/adapters/intenze"
+ "github.com/prebid/prebid-server/v4/adapters/interactiveoffers"
+ "github.com/prebid/prebid-server/v4/adapters/invibes"
+ "github.com/prebid/prebid-server/v4/adapters/iqx"
+ "github.com/prebid/prebid-server/v4/adapters/iqzone"
+ "github.com/prebid/prebid-server/v4/adapters/ix"
+ "github.com/prebid/prebid-server/v4/adapters/jixie"
+ "github.com/prebid/prebid-server/v4/adapters/kargo"
+ "github.com/prebid/prebid-server/v4/adapters/kayzen"
+ "github.com/prebid/prebid-server/v4/adapters/kidoz"
+ "github.com/prebid/prebid-server/v4/adapters/kiviads"
+ "github.com/prebid/prebid-server/v4/adapters/kobler"
+ "github.com/prebid/prebid-server/v4/adapters/krushmedia"
+ "github.com/prebid/prebid-server/v4/adapters/kueezrtb"
+ "github.com/prebid/prebid-server/v4/adapters/lemmadigital"
+ "github.com/prebid/prebid-server/v4/adapters/limelightDigital"
+ lmkiviads "github.com/prebid/prebid-server/v4/adapters/lm_kiviads"
+ "github.com/prebid/prebid-server/v4/adapters/lockerdome"
+ "github.com/prebid/prebid-server/v4/adapters/logan"
+ "github.com/prebid/prebid-server/v4/adapters/logicad"
+ "github.com/prebid/prebid-server/v4/adapters/loopme"
+ "github.com/prebid/prebid-server/v4/adapters/loyal"
+ "github.com/prebid/prebid-server/v4/adapters/lunamedia"
+ "github.com/prebid/prebid-server/v4/adapters/mabidder"
+ "github.com/prebid/prebid-server/v4/adapters/madsense"
+ "github.com/prebid/prebid-server/v4/adapters/madvertise"
+ "github.com/prebid/prebid-server/v4/adapters/marsmedia"
+ "github.com/prebid/prebid-server/v4/adapters/matterfullrtb"
+ "github.com/prebid/prebid-server/v4/adapters/mediago"
+ "github.com/prebid/prebid-server/v4/adapters/medianet"
+ "github.com/prebid/prebid-server/v4/adapters/mediasquare"
+ "github.com/prebid/prebid-server/v4/adapters/melozen"
+ "github.com/prebid/prebid-server/v4/adapters/metax"
+ "github.com/prebid/prebid-server/v4/adapters/mgid"
+ "github.com/prebid/prebid-server/v4/adapters/mgidX"
+ "github.com/prebid/prebid-server/v4/adapters/minutemedia"
+ "github.com/prebid/prebid-server/v4/adapters/missena"
+ "github.com/prebid/prebid-server/v4/adapters/mobfoxpb"
+ "github.com/prebid/prebid-server/v4/adapters/mobilefuse"
+ "github.com/prebid/prebid-server/v4/adapters/mobkoi"
+ "github.com/prebid/prebid-server/v4/adapters/motorik"
+ "github.com/prebid/prebid-server/v4/adapters/msft"
+ "github.com/prebid/prebid-server/v4/adapters/nativery"
+ "github.com/prebid/prebid-server/v4/adapters/nativo"
+ "github.com/prebid/prebid-server/v4/adapters/nextmillennium"
+ "github.com/prebid/prebid-server/v4/adapters/nexx360"
+ "github.com/prebid/prebid-server/v4/adapters/nobid"
+ "github.com/prebid/prebid-server/v4/adapters/ogury"
+ "github.com/prebid/prebid-server/v4/adapters/oms"
+ "github.com/prebid/prebid-server/v4/adapters/onetag"
+ "github.com/prebid/prebid-server/v4/adapters/openweb"
+ "github.com/prebid/prebid-server/v4/adapters/openx"
+ "github.com/prebid/prebid-server/v4/adapters/operaads"
+ "github.com/prebid/prebid-server/v4/adapters/optidigital"
+ "github.com/prebid/prebid-server/v4/adapters/oraki"
+ "github.com/prebid/prebid-server/v4/adapters/orbidder"
+ "github.com/prebid/prebid-server/v4/adapters/outbrain"
+ "github.com/prebid/prebid-server/v4/adapters/ownadx"
+ "github.com/prebid/prebid-server/v4/adapters/pangle"
+ "github.com/prebid/prebid-server/v4/adapters/pgamssp"
+ "github.com/prebid/prebid-server/v4/adapters/pixfuture"
+ "github.com/prebid/prebid-server/v4/adapters/playdigo"
+ "github.com/prebid/prebid-server/v4/adapters/proxistore"
+ "github.com/prebid/prebid-server/v4/adapters/pubmatic"
+ "github.com/prebid/prebid-server/v4/adapters/pubnative"
+ "github.com/prebid/prebid-server/v4/adapters/pubrise"
+ "github.com/prebid/prebid-server/v4/adapters/pulsepoint"
+ "github.com/prebid/prebid-server/v4/adapters/pwbid"
+ "github.com/prebid/prebid-server/v4/adapters/qt"
+ "github.com/prebid/prebid-server/v4/adapters/readpeak"
+ "github.com/prebid/prebid-server/v4/adapters/rediads"
+ "github.com/prebid/prebid-server/v4/adapters/relevantdigital"
+ "github.com/prebid/prebid-server/v4/adapters/resetdigital"
+ "github.com/prebid/prebid-server/v4/adapters/revcontent"
+ "github.com/prebid/prebid-server/v4/adapters/richaudience"
+ "github.com/prebid/prebid-server/v4/adapters/rise"
+ "github.com/prebid/prebid-server/v4/adapters/roulax"
+ "github.com/prebid/prebid-server/v4/adapters/rtbhouse"
+ "github.com/prebid/prebid-server/v4/adapters/rtbstack"
+ "github.com/prebid/prebid-server/v4/adapters/rubicon"
+ salunamedia "github.com/prebid/prebid-server/v4/adapters/sa_lunamedia"
+ "github.com/prebid/prebid-server/v4/adapters/scalibur"
+ "github.com/prebid/prebid-server/v4/adapters/seedingAlliance"
+ "github.com/prebid/prebid-server/v4/adapters/seedtag"
+ "github.com/prebid/prebid-server/v4/adapters/sharethrough"
+ "github.com/prebid/prebid-server/v4/adapters/showheroes"
+ "github.com/prebid/prebid-server/v4/adapters/silvermob"
+ "github.com/prebid/prebid-server/v4/adapters/silverpush"
+ "github.com/prebid/prebid-server/v4/adapters/smaato"
+ "github.com/prebid/prebid-server/v4/adapters/smartadserver"
+ "github.com/prebid/prebid-server/v4/adapters/smarthub"
+ "github.com/prebid/prebid-server/v4/adapters/smartrtb"
+ "github.com/prebid/prebid-server/v4/adapters/smartx"
+ "github.com/prebid/prebid-server/v4/adapters/smartyads"
+ "github.com/prebid/prebid-server/v4/adapters/smilewanted"
+ "github.com/prebid/prebid-server/v4/adapters/smoot"
+ "github.com/prebid/prebid-server/v4/adapters/smrtconnect"
+ "github.com/prebid/prebid-server/v4/adapters/sonobi"
+ "github.com/prebid/prebid-server/v4/adapters/sovrn"
+ "github.com/prebid/prebid-server/v4/adapters/sovrnXsp"
+ "github.com/prebid/prebid-server/v4/adapters/sparteo"
+ "github.com/prebid/prebid-server/v4/adapters/sspBC"
+ "github.com/prebid/prebid-server/v4/adapters/stackadapt"
+ "github.com/prebid/prebid-server/v4/adapters/startio"
+ "github.com/prebid/prebid-server/v4/adapters/stroeerCore"
+ "github.com/prebid/prebid-server/v4/adapters/synapseHX"
+ "github.com/prebid/prebid-server/v4/adapters/taboola"
+ "github.com/prebid/prebid-server/v4/adapters/tadvertising_blis"
+ "github.com/prebid/prebid-server/v4/adapters/tappx"
+ "github.com/prebid/prebid-server/v4/adapters/targetVideo"
+ "github.com/prebid/prebid-server/v4/adapters/teads"
+ "github.com/prebid/prebid-server/v4/adapters/teal"
+ "github.com/prebid/prebid-server/v4/adapters/telaria"
+ "github.com/prebid/prebid-server/v4/adapters/teqblaze"
+ "github.com/prebid/prebid-server/v4/adapters/theadx"
+ "github.com/prebid/prebid-server/v4/adapters/thetradedesk"
+ "github.com/prebid/prebid-server/v4/adapters/tpmn"
+ "github.com/prebid/prebid-server/v4/adapters/tradplus"
+ "github.com/prebid/prebid-server/v4/adapters/trafficgate"
+ "github.com/prebid/prebid-server/v4/adapters/triplelift"
+ "github.com/prebid/prebid-server/v4/adapters/triplelift_native"
+ "github.com/prebid/prebid-server/v4/adapters/trustedstack"
+ "github.com/prebid/prebid-server/v4/adapters/trustx"
+ "github.com/prebid/prebid-server/v4/adapters/ucfunnel"
+ "github.com/prebid/prebid-server/v4/adapters/undertone"
+ "github.com/prebid/prebid-server/v4/adapters/unicorn"
+ "github.com/prebid/prebid-server/v4/adapters/unruly"
+ "github.com/prebid/prebid-server/v4/adapters/vidazoo"
+ "github.com/prebid/prebid-server/v4/adapters/videobyte"
+ "github.com/prebid/prebid-server/v4/adapters/videoheroes"
+ "github.com/prebid/prebid-server/v4/adapters/vidoomy"
+ "github.com/prebid/prebid-server/v4/adapters/visiblemeasures"
+ "github.com/prebid/prebid-server/v4/adapters/visx"
+ "github.com/prebid/prebid-server/v4/adapters/vox"
+ "github.com/prebid/prebid-server/v4/adapters/vrtcal"
+ "github.com/prebid/prebid-server/v4/adapters/vungle"
+ "github.com/prebid/prebid-server/v4/adapters/xeworks"
+ "github.com/prebid/prebid-server/v4/adapters/yahooAds"
+ "github.com/prebid/prebid-server/v4/adapters/yandex"
+ "github.com/prebid/prebid-server/v4/adapters/yeahmobi"
+ "github.com/prebid/prebid-server/v4/adapters/yieldlab"
+ "github.com/prebid/prebid-server/v4/adapters/yieldmo"
+ "github.com/prebid/prebid-server/v4/adapters/yieldone"
+ "github.com/prebid/prebid-server/v4/adapters/zentotem"
+ "github.com/prebid/prebid-server/v4/adapters/zeroclickfraud"
+ "github.com/prebid/prebid-server/v4/adapters/zeta_global_ssp"
+ "github.com/prebid/prebid-server/v4/adapters/zmaticoo"
+ "github.com/prebid/prebid-server/v4/openrtb_ext"
)
// Adapter registration is kept in this separate file for ease of use and to aid
@@ -309,6 +327,7 @@ func newAdapterBuilders() map[openrtb_ext.BidderName]adapters.Builder {
openrtb_ext.BidderApacdex: apacdex.Builder,
openrtb_ext.BidderAppnexus: appnexus.Builder,
openrtb_ext.BidderAppush: appush.Builder,
+ openrtb_ext.BidderAps: aps.Builder,
openrtb_ext.BidderAso: aso.Builder,
openrtb_ext.BidderAudienceNetwork: audienceNetwork.Builder,
openrtb_ext.BidderAutomatad: automatad.Builder,
diff --git a/openrtb_ext/bidders.go b/openrtb_ext/bidders.go
index c9f3fa601..93c6bc93f 100644
--- a/openrtb_ext/bidders.go
+++ b/openrtb_ext/bidders.go
@@ -62,6 +62,7 @@ var coreBidderNames []BidderName = []BidderName{
BidderApacdex,
BidderAppnexus,
BidderAppush,
+ BidderAps,
BidderAso,
BidderAudienceNetwork,
BidderAutomatad,
@@ -432,6 +433,7 @@ const (
BidderApacdex BidderName = "apacdex"
BidderAppnexus BidderName = "appnexus"
BidderAppush BidderName = "appush"
+ BidderAps BidderName = "aps"
BidderAso BidderName = "aso"
BidderAudienceNetwork BidderName = "audienceNetwork"
BidderAutomatad BidderName = "automatad"
diff --git a/openrtb_ext/imp_aps.go b/openrtb_ext/imp_aps.go
new file mode 100644
index 000000000..f84a3e9a8
--- /dev/null
+++ b/openrtb_ext/imp_aps.go
@@ -0,0 +1,7 @@
+package openrtb_ext
+
+// ExtImpAps defines bidrequest.imp[i].ext.prebid.bidder.aps.
+type ExtImpAps struct {
+ AccountID string `json:"accountID"`
+ Region string `json:"region,omitempty"`
+}
diff --git a/static/bidder-info/aps.yaml b/static/bidder-info/aps.yaml
new file mode 100644
index 000000000..dded94f05
--- /dev/null
+++ b/static/bidder-info/aps.yaml
@@ -0,0 +1,13 @@
+# {{.Region}} comes from the aps.region imp param (default na).
+endpoint: "https://s2s.prebid.bid-{{.Region}}.ads.aps.amazon-adsystem.com/e/pb/bid"
+endpointCompression: gzip
+geoscope:
+ - USA
+maintainer:
+ email: "aps-prebid@amazon.com"
+gvlVendorID: 793
+capabilities:
+ site:
+ mediaTypes:
+ - banner
+ - video
diff --git a/static/bidder-params/aps.json b/static/bidder-params/aps.json
new file mode 100644
index 000000000..48f5de753
--- /dev/null
+++ b/static/bidder-params/aps.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "APS Adapter Params",
+ "description": "A schema which validates params accepted by the APS adapter",
+ "type": "object",
+ "properties": {
+ "accountID": {
+ "type": "string",
+ "description": "The APS publisher account id."
+ },
+ "region": {
+ "type": "string",
+ "enum": ["na", "eu", "fe"],
+ "description": "APS regional S2S origin to route to. Optional; defaults to na."
+ }
+ },
+ "required": ["accountID"]
+}