From 20acb2c9b0696746f00dc5a4d760cd423c9066a5 Mon Sep 17 00:00:00 2001 From: sreddyba-amzn Date: Mon, 12 Oct 2026 10:32:15 -0700 Subject: [PATCH] New Adapter: APS (#4999) --- adapters/aps/aps.go | 297 ++++++++++ adapters/aps/aps_test.go | 25 + .../aps/apstest/exemplary/multi-slot.json | 158 ++++++ .../apstest/exemplary/multiformat-imp.json | 116 ++++ .../aps/apstest/exemplary/single-banner.json | 112 ++++ .../aps/apstest/exemplary/single-video.json | 104 ++++ .../banner-partial-size-overwrite.json | 74 +++ .../defaults-currency-to-usd.json | 111 ++++ .../supplemental/region-na-explicit.json | 73 +++ .../rejects-mismatched-account.json | 38 ++ .../rejects-unsupported-region.json | 34 ++ .../supplemental/requires-account.json | 31 + .../supplemental/resolves-eu-region.json | 79 +++ .../aps/apstest/supplemental/status-204.json | 56 ++ .../aps/apstest/supplemental/status-400.json | 62 ++ .../aps/apstest/supplemental/status-500.json | 63 +++ .../supplemental/strips-sensitive-data.json | 129 +++++ .../supplemental/test-mode-appends-debug.json | 64 +++ adapters/aps/params_test.go | 54 ++ exchange/adapter_builders.go | 533 +++++++++--------- openrtb_ext/bidders.go | 2 + openrtb_ext/imp_aps.go | 7 + static/bidder-info/aps.yaml | 13 + static/bidder-params/aps.json | 18 + 24 files changed, 1996 insertions(+), 257 deletions(-) create mode 100644 adapters/aps/aps.go create mode 100644 adapters/aps/aps_test.go create mode 100644 adapters/aps/apstest/exemplary/multi-slot.json create mode 100644 adapters/aps/apstest/exemplary/multiformat-imp.json create mode 100644 adapters/aps/apstest/exemplary/single-banner.json create mode 100644 adapters/aps/apstest/exemplary/single-video.json create mode 100644 adapters/aps/apstest/supplemental/banner-partial-size-overwrite.json create mode 100644 adapters/aps/apstest/supplemental/defaults-currency-to-usd.json create mode 100644 adapters/aps/apstest/supplemental/region-na-explicit.json create mode 100644 adapters/aps/apstest/supplemental/rejects-mismatched-account.json create mode 100644 adapters/aps/apstest/supplemental/rejects-unsupported-region.json create mode 100644 adapters/aps/apstest/supplemental/requires-account.json create mode 100644 adapters/aps/apstest/supplemental/resolves-eu-region.json create mode 100644 adapters/aps/apstest/supplemental/status-204.json create mode 100644 adapters/aps/apstest/supplemental/status-400.json create mode 100644 adapters/aps/apstest/supplemental/status-500.json create mode 100644 adapters/aps/apstest/supplemental/strips-sensitive-data.json create mode 100644 adapters/aps/apstest/supplemental/test-mode-appends-debug.json create mode 100644 adapters/aps/params_test.go create mode 100644 openrtb_ext/imp_aps.go create mode 100644 static/bidder-info/aps.yaml create mode 100644 static/bidder-params/aps.json 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"] +}