From ed5fee086bcc235163de3d8b5f63f055fd0af5dd Mon Sep 17 00:00:00 2001 From: zayn <546973743@qq.com> Date: Fri, 3 Jul 2026 12:01:41 +0800 Subject: [PATCH 1/5] feat: add SuperEdge --- adapters/superedge/params_test.go | 50 +++++ adapters/superedge/superedge.go | 175 ++++++++++++++++++ adapters/superedge/superedge_test.go | 28 +++ .../exemplary/sample-banner-apac.json | 122 ++++++++++++ .../exemplary/sample-banner-euc.json | 122 ++++++++++++ ...anner-fallback-to-first-imp-to-get-ep.json | 104 +++++++++++ .../exemplary/sample-banner-use.json | 118 ++++++++++++ .../exemplary/sample-banner.json | 120 ++++++++++++ .../exemplary/sample-native.json | 90 +++++++++ .../superedgetest/exemplary/sample-nobid.json | 71 +++++++ .../exemplary/sample-with-mtype.json | 162 ++++++++++++++++ .../supplemental/bad_400_reponse.json | 74 ++++++++ .../supplemental/bad_500_reponse.json | 74 ++++++++ .../supplemental/bad_imp_ext.json | 29 +++ .../supplemental/bad_impext_bidder.json | 31 ++++ .../supplemental/bad_request_no_token.json | 33 ++++ .../supplemental/bad_response.json | 74 ++++++++ .../bad_response_error_mtype.json | 147 +++++++++++++++ exchange/adapter_builders.go | 2 + openrtb_ext/bidders.go | 2 + openrtb_ext/imp_superedge.go | 6 + static/bidder-info/superEdge.yaml | 11 ++ static/bidder-params/superEdge.json | 16 ++ 23 files changed, 1661 insertions(+) create mode 100644 adapters/superedge/params_test.go create mode 100644 adapters/superedge/superedge.go create mode 100644 adapters/superedge/superedge_test.go create mode 100644 adapters/superedge/superedgetest/exemplary/sample-banner-apac.json create mode 100644 adapters/superedge/superedgetest/exemplary/sample-banner-euc.json create mode 100644 adapters/superedge/superedgetest/exemplary/sample-banner-fallback-to-first-imp-to-get-ep.json create mode 100644 adapters/superedge/superedgetest/exemplary/sample-banner-use.json create mode 100644 adapters/superedge/superedgetest/exemplary/sample-banner.json create mode 100644 adapters/superedge/superedgetest/exemplary/sample-native.json create mode 100644 adapters/superedge/superedgetest/exemplary/sample-nobid.json create mode 100644 adapters/superedge/superedgetest/exemplary/sample-with-mtype.json create mode 100644 adapters/superedge/superedgetest/supplemental/bad_400_reponse.json create mode 100644 adapters/superedge/superedgetest/supplemental/bad_500_reponse.json create mode 100644 adapters/superedge/superedgetest/supplemental/bad_imp_ext.json create mode 100644 adapters/superedge/superedgetest/supplemental/bad_impext_bidder.json create mode 100644 adapters/superedge/superedgetest/supplemental/bad_request_no_token.json create mode 100644 adapters/superedge/superedgetest/supplemental/bad_response.json create mode 100644 adapters/superedge/superedgetest/supplemental/bad_response_error_mtype.json create mode 100644 openrtb_ext/imp_superedge.go create mode 100644 static/bidder-info/superEdge.yaml create mode 100644 static/bidder-params/superEdge.json diff --git a/adapters/superedge/params_test.go b/adapters/superedge/params_test.go new file mode 100644 index 00000000000..a2f08438374 --- /dev/null +++ b/adapters/superedge/params_test.go @@ -0,0 +1,50 @@ +package superedge + +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 the json-schemas. %v", err) + } + + for _, validParam := range validParams { + if err := validator.Validate(openrtb_ext.BidderSuperEdge, json.RawMessage(validParam)); err != nil { + t.Errorf("Schema rejected superEdge params: %s with err: %v", validParam, err) + } + } +} + +// TestInvalidParams makes sure that the superEdge schema rejects all the imp.ext fields we don't support. +func TestInvalidParams(t *testing.T) { + validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params") + if err != nil { + t.Fatalf("Failed to fetch the json-schemas. %v", err) + } + + for _, invalidParam := range invalidParams { + if err := validator.Validate(openrtb_ext.BidderSuperEdge, json.RawMessage(invalidParam)); err == nil { + t.Errorf("Schema allowed unexpected params: %s", invalidParam) + } + } +} + +var validParams = []string{ + `{"sk": "7f096f84f44f4adfa7602f037179c98b"}`, + `{"sk": "1e9ead5397ae44d78c6792bc7cddc050"}`, + `{"sk": "27bb74d57068406ebcbb29ab9bfeb9b9"}`, + `{"sk": "0c3356713c184ca186779eecdd5aff5d"}`, +} + +var invalidParams = []string{ + `{}`, + `{"tn": "0c3356713c184ca186779eecdd5aff5d"}`, + `{"region": "APAC"}`, + `{"region": "US"}`, + `{"tn": "27bb74d57068406ebcbb29ab9bfeb9b9"}`, +} diff --git a/adapters/superedge/superedge.go b/adapters/superedge/superedge.go new file mode 100644 index 00000000000..664413edb2e --- /dev/null +++ b/adapters/superedge/superedge.go @@ -0,0 +1,175 @@ +package superedge + +import ( + "errors" + "fmt" + "net/http" + "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" +) + +type adapter struct { + EndpointTemplate *template.Template +} + +// Builder builds a new instance of the SuperEdge adapter for the given bidder with the given config. +func Builder(_ openrtb_ext.BidderName, config config.Adapter, _ config.Server) (adapters.Bidder, error) { + endpoint, err := template.New("").Parse(config.Endpoint) + if err != nil { + return nil, fmt.Errorf("unable to parse endpoint url template: %v", err) + } + bidder := &adapter{EndpointTemplate: endpoint} + return bidder, nil +} + +func (a *adapter) MakeRequests(request *openrtb2.BidRequest, _ *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { + var adapterRequests []*adapters.RequestData + var errs []error + adapterRequest, err := a.makeRequest(request) + if err == nil { + adapterRequests = append(adapterRequests, adapterRequest) + } else { + errs = append(errs, err) + } + return adapterRequests, errs +} + +func (a *adapter) makeRequest(request *openrtb2.BidRequest) (*adapters.RequestData, error) { + superEdgeExt, err := getSuperEdgeExt(request) + if err != nil { + return nil, err + } + endPoint, err := a.getEndPoint(superEdgeExt) + if err != nil { + return nil, err + } + preProcess(request) + reqBody, err := jsonutil.Marshal(request) + if err != nil { + return nil, err + } + headers := http.Header{} + headers.Add("Content-Type", "application/json;charset=utf-8") + headers.Add("Accept", "application/json") + headers.Add("x-openrtb-version", "2.5") + return &adapters.RequestData{ + Method: "POST", + Uri: endPoint, + Body: reqBody, + Headers: headers, + ImpIDs: openrtb_ext.GetImpIDs(request.Imp), + }, nil +} + +// getSuperEdgeExt extracts ExtSuperEdge from the first imp's ext.bidder or request.ext.prebid.bidderparams. +func getSuperEdgeExt(request *openrtb2.BidRequest) (*openrtb_ext.ExtSuperEdge, error) { + var extSuperEdge openrtb_ext.ExtSuperEdge + + // Try to get sk from request.ext.prebid.bidderparams first + if request.Ext != nil { + reqExt := &openrtb_ext.ExtRequest{} + if err := jsonutil.Unmarshal(request.Ext, reqExt); err == nil { + if len(reqExt.Prebid.BidderParams) > 0 { + if err := jsonutil.Unmarshal(reqExt.Prebid.BidderParams, &extSuperEdge); err == nil && extSuperEdge.Sk != "" { + return &extSuperEdge, nil + } + } + } + } + + // Fallback to first imp's ext.bidder + if len(request.Imp) == 0 { + return nil, errors.New("superEdge sk not found") + } + + var extBidder adapters.ExtImpBidder + if err := jsonutil.Unmarshal(request.Imp[0].Ext, &extBidder); err != nil { + return nil, err + } + + if err := jsonutil.Unmarshal(extBidder.Bidder, &extSuperEdge); err != nil { + return nil, err + } + + if extSuperEdge.Sk != "" { + return &extSuperEdge, nil + } + return nil, errors.New("superEdge sk not found") +} + +func (a *adapter) getEndPoint(ext *openrtb_ext.ExtSuperEdge) (string, error) { + return macros.ResolveMacros(a.EndpointTemplate, map[string]string{"sk": ext.Sk}) +} + +func preProcess(request *openrtb2.BidRequest) { + for i := range request.Imp { + if request.Imp[i].Banner != nil { + banner := *request.Imp[i].Banner + if (banner.W == nil || banner.H == nil || *banner.W == 0 || *banner.H == 0) && len(banner.Format) > 0 { + firstFormat := banner.Format[0] + banner.W = &firstFormat.W + banner.H = &firstFormat.H + request.Imp[i].Banner = &banner + } + } + } +} + +func (a *adapter) MakeBids(internalRequest *openrtb2.BidRequest, _ *adapters.RequestData, response *adapters.ResponseData) (*adapters.BidderResponse, []error) { + if adapters.IsResponseStatusCodeNoContent(response) { + return nil, nil + } + if err := adapters.CheckResponseStatusCodeForErrors(response); err != nil { + return nil, []error{err} + } + var bidResp openrtb2.BidResponse + if err := jsonutil.Unmarshal(response.Body, &bidResp); err != nil { + return nil, []error{err} + } + bidResponse := adapters.NewBidderResponseWithBidsCapacity(1) + var errs []error + for _, seatBid := range bidResp.SeatBid { + for idx := range seatBid.Bid { + bidType, err := getBidType(seatBid.Bid[idx], internalRequest.Imp) + if err != nil { + errs = append(errs, err) + } else { + bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{ + Bid: &seatBid.Bid[idx], + BidType: bidType, + }) + } + } + } + return bidResponse, errs +} + +func getBidType(bid openrtb2.Bid, imps []openrtb2.Imp) (openrtb_ext.BidType, error) { + switch bid.MType { + case openrtb2.MarkupBanner: + return openrtb_ext.BidTypeBanner, nil + case openrtb2.MarkupNative: + return openrtb_ext.BidTypeNative, nil + default: + for _, imp := range imps { + if imp.ID == bid.ImpID { + if imp.Banner != nil { + return openrtb_ext.BidTypeBanner, nil + } + if imp.Native != nil { + return openrtb_ext.BidTypeNative, nil + } + } + } + return "", &errortypes.BadServerResponse{ + Message: fmt.Sprintf("Unsupported MType %d", bid.MType), + } + } +} diff --git a/adapters/superedge/superedge_test.go b/adapters/superedge/superedge_test.go new file mode 100644 index 00000000000..6c6e600958e --- /dev/null +++ b/adapters/superedge/superedge_test.go @@ -0,0 +1,28 @@ +package superedge + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "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.BidderSuperEdge, config.Adapter{ + Endpoint: "https://rtb-us.superedge.co.jp/bid?sk={{.sk}}"}, config.Server{ExternalUrl: "http://hosturl.com"}) + + if buildErr != nil { + t.Fatalf("Builder returned unexpected error %v", buildErr) + } + + adapterstest.RunJSONBidderTest(t, "superedgetest", bidder) +} + +func TestEndpointTemplateMalformed(t *testing.T) { + _, buildErr := Builder(openrtb_ext.BidderSuperEdge, config.Adapter{Endpoint: "{{Malformed}}"}, config.Server{ExternalUrl: "http://hosturl.com"}) + + assert.Error(t, buildErr) +} diff --git a/adapters/superedge/superedgetest/exemplary/sample-banner-apac.json b/adapters/superedge/superedgetest/exemplary/sample-banner-apac.json new file mode 100644 index 00000000000..3a3c53391f3 --- /dev/null +++ b/adapters/superedge/superedgetest/exemplary/sample-banner-apac.json @@ -0,0 +1,122 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ] + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b", + "placementId": "testPlacementId", + "region": "APAC" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + }, + "ext": { + "prebid": { + "bidderparams": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b", + "region": "APAC" + } + } + } + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://rtb-us.superedge.co.jp/bid?sk=f9f2b1ef23fe2759c2cad0953029a94b", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ], + "w": 320, + "h": 50 + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b", + "region": "APAC", + "placementId": "testPlacementId" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + }, + "ext": { + "prebid": { + "bidderparams": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b", + "region": "APAC" + } + } + } + }, + "impIDs": [ + "test-imp-id" + ] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "seat": "superedge", + "bid": [ + { + "id": "test-imp-id", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-ads", + "crid": "crid_testid" + } + ] + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "test-imp-id", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-ads", + "crid": "crid_testid" + }, + "type": "banner" + } + ] + } + ] +} diff --git a/adapters/superedge/superedgetest/exemplary/sample-banner-euc.json b/adapters/superedge/superedgetest/exemplary/sample-banner-euc.json new file mode 100644 index 00000000000..6337bdfc697 --- /dev/null +++ b/adapters/superedge/superedgetest/exemplary/sample-banner-euc.json @@ -0,0 +1,122 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ] + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b", + "placementId": "testPlacementId", + "region": "EU" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + }, + "ext": { + "prebid": { + "bidderparams": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b", + "region": "EU" + } + } + } + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://rtb-us.superedge.co.jp/bid?sk=f9f2b1ef23fe2759c2cad0953029a94b", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ], + "w": 320, + "h": 50 + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b", + "region": "EU", + "placementId": "testPlacementId" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + }, + "ext": { + "prebid": { + "bidderparams": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b", + "region": "EU" + } + } + } + }, + "impIDs": [ + "test-imp-id" + ] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "seat": "superedge", + "bid": [ + { + "id": "test-imp-id", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-ads", + "crid": "crid_testid" + } + ] + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "test-imp-id", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-ads", + "crid": "crid_testid" + }, + "type": "banner" + } + ] + } + ] +} diff --git a/adapters/superedge/superedgetest/exemplary/sample-banner-fallback-to-first-imp-to-get-ep.json b/adapters/superedge/superedgetest/exemplary/sample-banner-fallback-to-first-imp-to-get-ep.json new file mode 100644 index 00000000000..61e0036310d --- /dev/null +++ b/adapters/superedge/superedgetest/exemplary/sample-banner-fallback-to-first-imp-to-get-ep.json @@ -0,0 +1,104 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ] + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b", + "placementId": "testPlacementId" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + } + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://rtb-us.superedge.co.jp/bid?sk=f9f2b1ef23fe2759c2cad0953029a94b", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ], + "w": 320, + "h": 50 + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b", + "placementId": "testPlacementId" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + } + }, + "impIDs": [ + "test-imp-id" + ] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "seat": "superedge", + "bid": [ + { + "id": "test-imp-id", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-ads", + "crid": "crid_testid" + } + ] + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "test-imp-id", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-ads", + "crid": "crid_testid" + }, + "type": "banner" + } + ] + } + ] +} diff --git a/adapters/superedge/superedgetest/exemplary/sample-banner-use.json b/adapters/superedge/superedgetest/exemplary/sample-banner-use.json new file mode 100644 index 00000000000..78da96667b3 --- /dev/null +++ b/adapters/superedge/superedgetest/exemplary/sample-banner-use.json @@ -0,0 +1,118 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ] + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + }, + "ext": { + "prebid": { + "bidderparams": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b", + "region": "US" + } + } + } + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://rtb-us.superedge.co.jp/bid?sk=f9f2b1ef23fe2759c2cad0953029a94b", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ], + "w": 320, + "h": 50 + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + }, + "ext": { + "prebid": { + "bidderparams": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b", + "region": "US" + } + } + } + }, + "impIDs": [ + "test-imp-id" + ] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "seat": "superedge", + "bid": [ + { + "id": "test-imp-id", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-ads", + "crid": "crid_testid" + } + ] + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "test-imp-id", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-ads", + "crid": "crid_testid" + }, + "type": "banner" + } + ] + } + ] +} diff --git a/adapters/superedge/superedgetest/exemplary/sample-banner.json b/adapters/superedge/superedgetest/exemplary/sample-banner.json new file mode 100644 index 00000000000..93f96aa44d9 --- /dev/null +++ b/adapters/superedge/superedgetest/exemplary/sample-banner.json @@ -0,0 +1,120 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ] + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b", + "placementId": "testPlacementId" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + }, + "ext": { + "prebid": { + "bidderparams": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b", + "region": "US" + } + } + } + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://rtb-us.superedge.co.jp/bid?sk=f9f2b1ef23fe2759c2cad0953029a94b", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ], + "w": 320, + "h": 50 + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b", + "placementId": "testPlacementId" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + }, + "ext": { + "prebid": { + "bidderparams": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b", + "region": "US" + } + } + } + }, + "impIDs": [ + "test-imp-id" + ] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "seat": "superedge", + "bid": [ + { + "id": "test-imp-id", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-ads", + "crid": "crid_testid" + } + ] + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "test-imp-id", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-ads", + "crid": "crid_testid" + }, + "type": "banner" + } + ] + } + ] +} diff --git a/adapters/superedge/superedgetest/exemplary/sample-native.json b/adapters/superedge/superedgetest/exemplary/sample-native.json new file mode 100644 index 00000000000..25a5782bc3f --- /dev/null +++ b/adapters/superedge/superedgetest/exemplary/sample-native.json @@ -0,0 +1,90 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "native": { + "request": "{\"ver\":\"1.2\",\"context\":1,\"plcmttype\":4,\"plcmtcnt\":1,\"assets\":[{\"id\":2,\"required\":1,\"title\":{\"len\":90}},{\"id\":6,\"required\":1,\"img\":{\"type\":3,\"wmin\":128,\"hmin\":128,\"mimes\":[\"image/jpg\",\"image/jpeg\",\"image/png\"]}},{\"id\":7,\"required\":1,\"data\":{\"type\":2,\"len\":120}}]}", + "ver": "1.2" + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + } + }, + "httpcalls": [ + { + "expectedRequest": { + "uri": "https://rtb-us.superedge.co.jp/bid?sk=f9f2b1ef23fe2759c2cad0953029a94b", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "native": { + "request": "{\"ver\":\"1.2\",\"context\":1,\"plcmttype\":4,\"plcmtcnt\":1,\"assets\":[{\"id\":2,\"required\":1,\"title\":{\"len\":90}},{\"id\":6,\"required\":1,\"img\":{\"type\":3,\"wmin\":128,\"hmin\":128,\"mimes\":[\"image/jpg\",\"image/jpeg\",\"image/png\"]}},{\"id\":7,\"required\":1,\"data\":{\"type\":2,\"len\":120}}]}", + "ver": "1.2" + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + } + }, + "impIDs": [ + "test-imp-id" + ] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "bid": [ + { + "id": "test-imp-id", + "impid": "test-imp-id", + "price": 1.2, + "adm": "some ads", + "crid": "crid_testid" + } + ] + } + ] + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "test-imp-id", + "impid": "test-imp-id", + "price": 1.2, + "adm": "some ads", + "crid": "crid_testid" + }, + "type": "native" + } + ] + } + ] +} diff --git a/adapters/superedge/superedgetest/exemplary/sample-nobid.json b/adapters/superedge/superedgetest/exemplary/sample-nobid.json new file mode 100644 index 00000000000..05e3601d027 --- /dev/null +++ b/adapters/superedge/superedgetest/exemplary/sample-nobid.json @@ -0,0 +1,71 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ] + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b", + "placementId": "testPlacementId" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + } + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://rtb-us.superedge.co.jp/bid?sk=f9f2b1ef23fe2759c2cad0953029a94b", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ], + "w": 320, + "h": 50 + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b", + "placementId": "testPlacementId" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + } + }, + "impIDs": [ + "test-imp-id" + ] + }, + "mockResponse": { + "status": 204, + "body": {} + } + } + ], + "expectedBidResponses": [] +} diff --git a/adapters/superedge/superedgetest/exemplary/sample-with-mtype.json b/adapters/superedge/superedgetest/exemplary/sample-with-mtype.json new file mode 100644 index 00000000000..f3f3e3b2105 --- /dev/null +++ b/adapters/superedge/superedgetest/exemplary/sample-with-mtype.json @@ -0,0 +1,162 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ] + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } + }, + { + "id": "test-imp-id2", + "native": { + "request": "{\"ver\":\"1.2\",\"context\":1,\"plcmttype\":4,\"plcmtcnt\":1,\"assets\":[{\"id\":2,\"required\":1,\"title\":{\"len\":90}},{\"id\":6,\"required\":1,\"img\":{\"type\":3,\"wmin\":128,\"hmin\":128,\"mimes\":[\"image/jpg\",\"image/jpeg\",\"image/png\"]}},{\"id\":7,\"required\":1,\"data\":{\"type\":2,\"len\":120}}]}", + "ver": "1.2" + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + }, + "ext": { + "prebid": { + "bidderparams": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } + } + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://rtb-us.superedge.co.jp/bid?sk=f9f2b1ef23fe2759c2cad0953029a94b", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ], + "w": 320, + "h": 50 + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } + }, + { + "id": "test-imp-id2", + "native": { + "request": "{\"ver\":\"1.2\",\"context\":1,\"plcmttype\":4,\"plcmtcnt\":1,\"assets\":[{\"id\":2,\"required\":1,\"title\":{\"len\":90}},{\"id\":6,\"required\":1,\"img\":{\"type\":3,\"wmin\":128,\"hmin\":128,\"mimes\":[\"image/jpg\",\"image/jpeg\",\"image/png\"]}},{\"id\":7,\"required\":1,\"data\":{\"type\":2,\"len\":120}}]}", + "ver": "1.2" + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + }, + "ext": { + "prebid": { + "bidderparams": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } + } + }, + "impIDs": [ + "test-imp-id", + "test-imp-id2" + ] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "seat": "superedge", + "bid": [ + { + "id": "test-imp-id", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-ads", + "crid": "crid_testid", + "mtype": 1 + }, + { + "id": "test-imp-id2", + "impid": "test-imp-id2", + "price": 1.2, + "adm": "some ads", + "crid": "crid_testid", + "mtype": 4 + } + ] + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "test-imp-id", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-ads", + "crid": "crid_testid", + "mtype": 1 + }, + "type": "banner" + }, + { + "bid": { + "id": "test-imp-id2", + "impid": "test-imp-id2", + "price": 1.2, + "adm": "some ads", + "crid": "crid_testid", + "mtype": 4 + }, + "type": "native" + } + ] + } + ] +} diff --git a/adapters/superedge/superedgetest/supplemental/bad_400_reponse.json b/adapters/superedge/superedgetest/supplemental/bad_400_reponse.json new file mode 100644 index 00000000000..c25cef7ff1e --- /dev/null +++ b/adapters/superedge/superedgetest/supplemental/bad_400_reponse.json @@ -0,0 +1,74 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ] + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + } + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://rtb-us.superedge.co.jp/bid?sk=f9f2b1ef23fe2759c2cad0953029a94b", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ], + "w": 320, + "h": 50 + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + } + }, + "impIDs": [ + "test-imp-id" + ] + }, + "mockResponse": { + "status": 400 + } + } + ], + "expectedBidResponses": [], + "expectedMakeBidsErrors": [ + { + "value": "Unexpected status code: 400. Run with request.debug = 1 for more info", + "comparison": "literal" + } + ] +} diff --git a/adapters/superedge/superedgetest/supplemental/bad_500_reponse.json b/adapters/superedge/superedgetest/supplemental/bad_500_reponse.json new file mode 100644 index 00000000000..1f1f7819433 --- /dev/null +++ b/adapters/superedge/superedgetest/supplemental/bad_500_reponse.json @@ -0,0 +1,74 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ] + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + } + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://rtb-us.superedge.co.jp/bid?sk=f9f2b1ef23fe2759c2cad0953029a94b", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ], + "w": 320, + "h": 50 + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + } + }, + "impIDs": [ + "test-imp-id" + ] + }, + "mockResponse": { + "status": 500 + } + } + ], + "expectedBidResponses": [], + "expectedMakeBidsErrors": [ + { + "value": "Unexpected status code: 500. Run with request.debug = 1 for more info", + "comparison": "literal" + } + ] +} diff --git a/adapters/superedge/superedgetest/supplemental/bad_imp_ext.json b/adapters/superedge/superedgetest/supplemental/bad_imp_ext.json new file mode 100644 index 00000000000..283d9650f47 --- /dev/null +++ b/adapters/superedge/superedgetest/supplemental/bad_imp_ext.json @@ -0,0 +1,29 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ] + }, + "ext": "badExt" + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + } + }, + "expectedMakeRequestsErrors": [ + { + "value": "expect { or n, but found \"", + "comparison": "literal" + } + ] +} diff --git a/adapters/superedge/superedgetest/supplemental/bad_impext_bidder.json b/adapters/superedge/superedgetest/supplemental/bad_impext_bidder.json new file mode 100644 index 00000000000..5384aaaa9d5 --- /dev/null +++ b/adapters/superedge/superedgetest/supplemental/bad_impext_bidder.json @@ -0,0 +1,31 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ] + }, + "ext": { + "bidder": "badBidder" + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + } + }, + "expectedMakeRequestsErrors": [ + { + "value": "expect { or n, but found \"", + "comparison": "literal" + } + ] +} diff --git a/adapters/superedge/superedgetest/supplemental/bad_request_no_token.json b/adapters/superedge/superedgetest/supplemental/bad_request_no_token.json new file mode 100644 index 00000000000..16d17e4b060 --- /dev/null +++ b/adapters/superedge/superedgetest/supplemental/bad_request_no_token.json @@ -0,0 +1,33 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ] + }, + "ext": { + "bidder": { + "placementId": "testPlacementId" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + } + }, + "expectedMakeRequestsErrors": [ + { + "value": "superEdge sk not found", + "comparison": "literal" + } + ] +} diff --git a/adapters/superedge/superedgetest/supplemental/bad_response.json b/adapters/superedge/superedgetest/supplemental/bad_response.json new file mode 100644 index 00000000000..957f8bd36a3 --- /dev/null +++ b/adapters/superedge/superedgetest/supplemental/bad_response.json @@ -0,0 +1,74 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ] + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + } + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://rtb-us.superedge.co.jp/bid?sk=f9f2b1ef23fe2759c2cad0953029a94b", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ], + "w": 320, + "h": 50 + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + } + }, + "impIDs": [ + "test-imp-id" + ] + }, + "mockResponse": { + "status": 200, + "body": "{\"id\":test-request-id" + } + } + ], + "expectedMakeBidsErrors": [ + { + "comparison": "literal", + "value": "expect { or n, but found \"" + } + ] +} diff --git a/adapters/superedge/superedgetest/supplemental/bad_response_error_mtype.json b/adapters/superedge/superedgetest/supplemental/bad_response_error_mtype.json new file mode 100644 index 00000000000..7e01ba83653 --- /dev/null +++ b/adapters/superedge/superedgetest/supplemental/bad_response_error_mtype.json @@ -0,0 +1,147 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ] + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } + }, + { + "id": "test-imp-id2", + "native": { + "request": "{\"ver\":\"1.2\",\"context\":1,\"plcmttype\":4,\"plcmtcnt\":1,\"assets\":[{\"id\":2,\"required\":1,\"title\":{\"len\":90}},{\"id\":6,\"required\":1,\"img\":{\"type\":3,\"wmin\":128,\"hmin\":128,\"mimes\":[\"image/jpg\",\"image/jpeg\",\"image/png\"]}},{\"id\":7,\"required\":1,\"data\":{\"type\":2,\"len\":120}}]}", + "ver": "1.2" + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + }, + "ext": { + "prebid": { + "bidderparams": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } + } + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://rtb-us.superedge.co.jp/bid?sk=f9f2b1ef23fe2759c2cad0953029a94b", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + } + ], + "w": 320, + "h": 50 + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } + }, + { + "id": "test-imp-id2", + "native": { + "request": "{\"ver\":\"1.2\",\"context\":1,\"plcmttype\":4,\"plcmtcnt\":1,\"assets\":[{\"id\":2,\"required\":1,\"title\":{\"len\":90}},{\"id\":6,\"required\":1,\"img\":{\"type\":3,\"wmin\":128,\"hmin\":128,\"mimes\":[\"image/jpg\",\"image/jpeg\",\"image/png\"]}},{\"id\":7,\"required\":1,\"data\":{\"type\":2,\"len\":120}}]}", + "ver": "1.2" + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } + } + ], + "site": { + "id": "test-site-id", + "page": "https://www.example.com/" + }, + "ext": { + "prebid": { + "bidderparams": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } + } + }, + "impIDs": [ + "test-imp-id", + "test-imp-id2" + ] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "seat": "superedge", + "bid": [ + { + "id": "test-imp-id", + "price": 0.5, + "adm": "some-ads", + "crid": "crid_testid", + "mtype": 2 + }, + { + "id": "test-imp-id2", + "price": 1.2, + "adm": "some ads", + "crid": "crid_testid", + "mtype": 5 + } + ] + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [] + } + ], + "expectedMakeBidsErrors": [ + { + "value": "Unsupported MType 2", + "comparison": "literal" + }, + { + "value": "Unsupported MType 5", + "comparison": "literal" + } + ] +} diff --git a/exchange/adapter_builders.go b/exchange/adapter_builders.go index 75a848b7596..928ce0327e3 100755 --- a/exchange/adapter_builders.go +++ b/exchange/adapter_builders.go @@ -225,6 +225,7 @@ import ( "github.com/prebid/prebid-server/v4/adapters/sspBC" "github.com/prebid/prebid-server/v4/adapters/startio" "github.com/prebid/prebid-server/v4/adapters/stroeerCore" + "github.com/prebid/prebid-server/v4/adapters/superedge" "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" @@ -500,6 +501,7 @@ func newAdapterBuilders() map[openrtb_ext.BidderName]adapters.Builder { openrtb_ext.BidderSspBC: sspBC.Builder, openrtb_ext.BidderStartIO: startio.Builder, openrtb_ext.BidderStroeerCore: stroeerCore.Builder, + openrtb_ext.BidderSuperEdge: superedge.Builder, openrtb_ext.BidderSynapseHX: synapseHX.Builder, openrtb_ext.BidderTaboola: taboola.Builder, openrtb_ext.BidderTAdvertisingBlis: tadvertising_blis.Builder, diff --git a/openrtb_ext/bidders.go b/openrtb_ext/bidders.go index aa725e7d1bd..c6905d3cced 100644 --- a/openrtb_ext/bidders.go +++ b/openrtb_ext/bidders.go @@ -243,6 +243,7 @@ var coreBidderNames []BidderName = []BidderName{ BidderSspBC, BidderStartIO, BidderStroeerCore, + BidderSuperEdge, BidderSynapseHX, BidderTaboola, BidderTAdvertisingBlis, @@ -622,6 +623,7 @@ const ( BidderSspBC BidderName = "sspBC" BidderStartIO BidderName = "startio" BidderStroeerCore BidderName = "stroeerCore" + BidderSuperEdge BidderName = "superEdge" BidderSynapseHX BidderName = "synapseHX" BidderTaboola BidderName = "taboola" BidderTAdvertisingBlis BidderName = "tadvertising_blis" diff --git a/openrtb_ext/imp_superedge.go b/openrtb_ext/imp_superedge.go new file mode 100644 index 00000000000..1d1e81ac5ff --- /dev/null +++ b/openrtb_ext/imp_superedge.go @@ -0,0 +1,6 @@ +package openrtb_ext + +// ExtSuperEdge defines the contract for bidrequest.imp[i].ext.prebid.bidder.superEdge +type ExtSuperEdge struct { + Sk string `json:"sk"` +} diff --git a/static/bidder-info/superEdge.yaml b/static/bidder-info/superEdge.yaml new file mode 100644 index 00000000000..6a417939c23 --- /dev/null +++ b/static/bidder-info/superEdge.yaml @@ -0,0 +1,11 @@ +endpoint: "https://rtb-us.superedge.co.jp/bid?sk={{.sk}}" +endpointCompression: gzip +geoscope: + - USA +maintainer: + email: aq@superedge.co.jp +capabilities: + site: + mediaTypes: + - banner + - native diff --git a/static/bidder-params/superEdge.json b/static/bidder-params/superEdge.json new file mode 100644 index 00000000000..47bd708a69f --- /dev/null +++ b/static/bidder-params/superEdge.json @@ -0,0 +1,16 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "SuperEdge Adapter Params", + "description": "A schema which validates params accepted by the SuperEdge adapter", + "type": "object", + "properties": { + "sk": { + "type": "string", + "description": "Different Publisher has different sk,communicate with SuperEdge to obtain it.", + "minLength": 1 + } + }, + "required": [ + "sk" + ] +} \ No newline at end of file From d3c7ce8e420efd79cb489d833f493036e91a359d Mon Sep 17 00:00:00 2001 From: zayn <546973743@qq.com> Date: Fri, 3 Jul 2026 12:47:49 +0800 Subject: [PATCH 2/5] feat: add SuperEdge --- static/bidder-info/superEdge.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/bidder-info/superEdge.yaml b/static/bidder-info/superEdge.yaml index 6a417939c23..39963b48a4f 100644 --- a/static/bidder-info/superEdge.yaml +++ b/static/bidder-info/superEdge.yaml @@ -3,7 +3,7 @@ endpointCompression: gzip geoscope: - USA maintainer: - email: aq@superedge.co.jp + email: op@superedge.co.jp capabilities: site: mediaTypes: From f568cee79c2b502a0b2b61ad066514b402d2269a Mon Sep 17 00:00:00 2001 From: zayn <546973743@qq.com> Date: Tue, 14 Jul 2026 10:39:39 +0800 Subject: [PATCH 3/5] feat: add SuperEdge --- openrtb_ext/bidders.go | 2 +- static/bidder-info/{superEdge.yaml => superedge.yaml} | 0 static/bidder-params/{superEdge.json => superedge.json} | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename static/bidder-info/{superEdge.yaml => superedge.yaml} (100%) rename static/bidder-params/{superEdge.json => superedge.json} (100%) diff --git a/openrtb_ext/bidders.go b/openrtb_ext/bidders.go index c6905d3cced..6f609b99f65 100644 --- a/openrtb_ext/bidders.go +++ b/openrtb_ext/bidders.go @@ -623,7 +623,7 @@ const ( BidderSspBC BidderName = "sspBC" BidderStartIO BidderName = "startio" BidderStroeerCore BidderName = "stroeerCore" - BidderSuperEdge BidderName = "superEdge" + BidderSuperEdge BidderName = "superedge" BidderSynapseHX BidderName = "synapseHX" BidderTaboola BidderName = "taboola" BidderTAdvertisingBlis BidderName = "tadvertising_blis" diff --git a/static/bidder-info/superEdge.yaml b/static/bidder-info/superedge.yaml similarity index 100% rename from static/bidder-info/superEdge.yaml rename to static/bidder-info/superedge.yaml diff --git a/static/bidder-params/superEdge.json b/static/bidder-params/superedge.json similarity index 100% rename from static/bidder-params/superEdge.json rename to static/bidder-params/superedge.json From 02b20196ab202b184179a9fdf3868482a371c2be Mon Sep 17 00:00:00 2001 From: zayn <546973743@qq.com> Date: Thu, 16 Jul 2026 10:48:41 +0800 Subject: [PATCH 4/5] =?UTF-8?q?fix:=20SuperEdge=20adapter=20PR=20review=20?= =?UTF-8?q?fixes=20=E2=80=94=20copy-on-write,=20bid-type,=20multi-imp=20te?= =?UTF-8?q?sts=20&=20schema?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- adapters/superedge/superedge.go | 11 ++-- adapters/superedge/superedge_test.go | 59 +++++++++++++++++++ .../exemplary/sample-banner-apac.json | 58 +++++++++++++++++- .../exemplary/sample-banner.json | 56 +++++++++++++++++- .../exemplary/sample-native.json | 46 ++++++++++++++- static/bidder-info/superedge.yaml | 1 + static/bidder-params/superedge.json | 3 +- 7 files changed, 225 insertions(+), 9 deletions(-) diff --git a/adapters/superedge/superedge.go b/adapters/superedge/superedge.go index 664413edb2e..6023241920a 100644 --- a/adapters/superedge/superedge.go +++ b/adapters/superedge/superedge.go @@ -50,8 +50,11 @@ func (a *adapter) makeRequest(request *openrtb2.BidRequest) (*adapters.RequestDa if err != nil { return nil, err } - preProcess(request) - reqBody, err := jsonutil.Marshal(request) + requestCopy := *request + requestCopy.Imp = make([]openrtb2.Imp, len(request.Imp)) + copy(requestCopy.Imp, request.Imp) + preProcess(&requestCopy) + reqBody, err := jsonutil.Marshal(&requestCopy) if err != nil { return nil, err } @@ -160,10 +163,10 @@ func getBidType(bid openrtb2.Bid, imps []openrtb2.Imp) (openrtb_ext.BidType, err default: for _, imp := range imps { if imp.ID == bid.ImpID { - if imp.Banner != nil { + if imp.Banner != nil && imp.Native == nil { return openrtb_ext.BidTypeBanner, nil } - if imp.Native != nil { + if imp.Native != nil && imp.Banner == nil { return openrtb_ext.BidTypeNative, nil } } diff --git a/adapters/superedge/superedge_test.go b/adapters/superedge/superedge_test.go index 6c6e600958e..16139a0a38d 100644 --- a/adapters/superedge/superedge_test.go +++ b/adapters/superedge/superedge_test.go @@ -1,8 +1,11 @@ package superedge import ( + "encoding/json" "testing" + "text/template" + "github.com/prebid/openrtb/v20/openrtb2" "github.com/stretchr/testify/assert" "github.com/prebid/prebid-server/v4/adapters/adapterstest" @@ -26,3 +29,59 @@ func TestEndpointTemplateMalformed(t *testing.T) { assert.Error(t, buildErr) } + +func TestGetSuperEdgeExtEmptyImp(t *testing.T) { + request := &openrtb2.BidRequest{} + _, err := getSuperEdgeExt(request) + assert.Error(t, err) + assert.Contains(t, err.Error(), "sk not found") +} + +func TestMakeRequestGetEndPointError(t *testing.T) { + badTmpl, _ := template.New("").Parse("http://example.com/bid?sk={{.sk}}{{template \"nonexistent\" .}}") + a := &adapter{EndpointTemplate: badTmpl} + + request := &openrtb2.BidRequest{ + Imp: []openrtb2.Imp{ + { + ID: "test-imp-id", + Ext: json.RawMessage(`{"bidder":{"sk":"test-sk"}}`), + }, + }, + } + + _, err := a.makeRequest(request) + assert.Error(t, err) +} + +func TestGetBidTypeAmbiguous(t *testing.T) { + bid := openrtb2.Bid{ImpID: "imp-1"} + imps := []openrtb2.Imp{ + { + ID: "imp-1", + Banner: &openrtb2.Banner{}, + Native: &openrtb2.Native{}, + }, + } + _, err := getBidType(bid, imps) + assert.Error(t, err) + assert.Contains(t, err.Error(), "Unsupported MType") +} + +func TestGetBidTypeNoMatchingImp(t *testing.T) { + bid := openrtb2.Bid{ImpID: "imp-1"} + imps := []openrtb2.Imp{ + {ID: "imp-2", Banner: &openrtb2.Banner{}}, + } + _, err := getBidType(bid, imps) + assert.Error(t, err) +} + +func TestGetBidTypeNoMediaType(t *testing.T) { + bid := openrtb2.Bid{ImpID: "imp-1"} + imps := []openrtb2.Imp{ + {ID: "imp-1"}, + } + _, err := getBidType(bid, imps) + assert.Error(t, err) +} diff --git a/adapters/superedge/superedgetest/exemplary/sample-banner-apac.json b/adapters/superedge/superedgetest/exemplary/sample-banner-apac.json index 3a3c53391f3..2ff710e970d 100644 --- a/adapters/superedge/superedgetest/exemplary/sample-banner-apac.json +++ b/adapters/superedge/superedgetest/exemplary/sample-banner-apac.json @@ -19,6 +19,24 @@ "region": "APAC" } } + }, + { + "id": "test-imp-id-2", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + } + ] + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b", + "placementId": "testPlacementId2", + "region": "APAC" + } + } } ], "site": { @@ -60,6 +78,26 @@ "placementId": "testPlacementId" } } + }, + { + "id": "test-imp-id-2", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + } + ], + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b", + "region": "APAC", + "placementId": "testPlacementId2" + } + } } ], "site": { @@ -76,7 +114,8 @@ } }, "impIDs": [ - "test-imp-id" + "test-imp-id", + "test-imp-id-2" ] }, "mockResponse": { @@ -93,6 +132,13 @@ "price": 0.5, "adm": "some-ads", "crid": "crid_testid" + }, + { + "id": "test-imp-id-2", + "impid": "test-imp-id-2", + "price": 1.0, + "adm": "some-ads-2", + "crid": "crid_testid2" } ] } @@ -115,6 +161,16 @@ "crid": "crid_testid" }, "type": "banner" + }, + { + "bid": { + "id": "test-imp-id-2", + "impid": "test-imp-id-2", + "price": 1.0, + "adm": "some-ads-2", + "crid": "crid_testid2" + }, + "type": "banner" } ] } diff --git a/adapters/superedge/superedgetest/exemplary/sample-banner.json b/adapters/superedge/superedgetest/exemplary/sample-banner.json index 93f96aa44d9..cebd559d592 100644 --- a/adapters/superedge/superedgetest/exemplary/sample-banner.json +++ b/adapters/superedge/superedgetest/exemplary/sample-banner.json @@ -18,6 +18,23 @@ "placementId": "testPlacementId" } } + }, + { + "id": "test-imp-id-2", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + } + ] + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b", + "placementId": "testPlacementId2" + } + } } ], "site": { @@ -58,6 +75,25 @@ "placementId": "testPlacementId" } } + }, + { + "id": "test-imp-id-2", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + } + ], + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b", + "placementId": "testPlacementId2" + } + } } ], "site": { @@ -74,7 +110,8 @@ } }, "impIDs": [ - "test-imp-id" + "test-imp-id", + "test-imp-id-2" ] }, "mockResponse": { @@ -91,6 +128,13 @@ "price": 0.5, "adm": "some-ads", "crid": "crid_testid" + }, + { + "id": "test-imp-id-2", + "impid": "test-imp-id-2", + "price": 1.0, + "adm": "some-ads-2", + "crid": "crid_testid2" } ] } @@ -113,6 +157,16 @@ "crid": "crid_testid" }, "type": "banner" + }, + { + "bid": { + "id": "test-imp-id-2", + "impid": "test-imp-id-2", + "price": 1.0, + "adm": "some-ads-2", + "crid": "crid_testid2" + }, + "type": "banner" } ] } diff --git a/adapters/superedge/superedgetest/exemplary/sample-native.json b/adapters/superedge/superedgetest/exemplary/sample-native.json index 25a5782bc3f..c3b5cc68c09 100644 --- a/adapters/superedge/superedgetest/exemplary/sample-native.json +++ b/adapters/superedge/superedgetest/exemplary/sample-native.json @@ -13,6 +13,18 @@ "sk": "f9f2b1ef23fe2759c2cad0953029a94b" } } + }, + { + "id": "test-imp-id-2", + "native": { + "request": "{\"ver\":\"1.2\",\"context\":2,\"plcmttype\":1,\"plcmtcnt\":1,\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":50}},{\"id\":3,\"required\":1,\"img\":{\"type\":1,\"wmin\":300,\"hmin\":250,\"mimes\":[\"image/jpg\",\"image/png\"]}}]}", + "ver": "1.2" + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } } ], "site": { @@ -20,7 +32,7 @@ "page": "https://www.example.com/" } }, - "httpcalls": [ + "httpCalls": [ { "expectedRequest": { "uri": "https://rtb-us.superedge.co.jp/bid?sk=f9f2b1ef23fe2759c2cad0953029a94b", @@ -38,6 +50,18 @@ "sk": "f9f2b1ef23fe2759c2cad0953029a94b" } } + }, + { + "id": "test-imp-id-2", + "native": { + "request": "{\"ver\":\"1.2\",\"context\":2,\"plcmttype\":1,\"plcmtcnt\":1,\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":50}},{\"id\":3,\"required\":1,\"img\":{\"type\":1,\"wmin\":300,\"hmin\":250,\"mimes\":[\"image/jpg\",\"image/png\"]}}]}", + "ver": "1.2" + }, + "ext": { + "bidder": { + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" + } + } } ], "site": { @@ -46,7 +70,8 @@ } }, "impIDs": [ - "test-imp-id" + "test-imp-id", + "test-imp-id-2" ] }, "mockResponse": { @@ -62,6 +87,13 @@ "price": 1.2, "adm": "some ads", "crid": "crid_testid" + }, + { + "id": "test-imp-id-2", + "impid": "test-imp-id-2", + "price": 0.8, + "adm": "some native ads 2", + "crid": "crid_testid2" } ] } @@ -83,6 +115,16 @@ "crid": "crid_testid" }, "type": "native" + }, + { + "bid": { + "id": "test-imp-id-2", + "impid": "test-imp-id-2", + "price": 0.8, + "adm": "some native ads 2", + "crid": "crid_testid2" + }, + "type": "native" } ] } diff --git a/static/bidder-info/superedge.yaml b/static/bidder-info/superedge.yaml index 39963b48a4f..904dd180aa4 100644 --- a/static/bidder-info/superedge.yaml +++ b/static/bidder-info/superedge.yaml @@ -4,6 +4,7 @@ geoscope: - USA maintainer: email: op@superedge.co.jp +gvlVendorID: 1554 capabilities: site: mediaTypes: diff --git a/static/bidder-params/superedge.json b/static/bidder-params/superedge.json index 47bd708a69f..ae057525d1a 100644 --- a/static/bidder-params/superedge.json +++ b/static/bidder-params/superedge.json @@ -12,5 +12,6 @@ }, "required": [ "sk" - ] + ], + "additionalProperties": false } \ No newline at end of file From 07e45238ac33ad3cb15539dd4efe7198111802c8 Mon Sep 17 00:00:00 2001 From: zayn <546973743@qq.com> Date: Wed, 22 Jul 2026 22:42:39 +0800 Subject: [PATCH 5/5] fix: PR #4846 review fixes & multi-region support for SuperEdge --- adapters/superedge/params_test.go | 6 + adapters/superedge/superedge.go | 44 ++++--- adapters/superedge/superedge_test.go | 2 +- .../exemplary/sample-banner-apac.json | 80 +----------- ...p-to-get-ep.json => sample-banner-eu.json} | 6 +- .../exemplary/sample-banner-euc.json | 122 ------------------ ...r-use.json => sample-banner-imp-only.json} | 16 --- .../exemplary/sample-banner.json | 18 +-- .../superedgetest/exemplary/sample-nobid.json | 6 +- .../supplemental/bad_request_no_token.json | 4 +- openrtb_ext/imp_superedge.go | 3 +- static/bidder-info/superedge.yaml | 4 +- static/bidder-params/superedge.json | 11 +- 13 files changed, 59 insertions(+), 263 deletions(-) rename adapters/superedge/superedgetest/exemplary/{sample-banner-fallback-to-first-imp-to-get-ep.json => sample-banner-eu.json} (92%) delete mode 100644 adapters/superedge/superedgetest/exemplary/sample-banner-euc.json rename adapters/superedge/superedgetest/exemplary/{sample-banner-use.json => sample-banner-imp-only.json} (85%) diff --git a/adapters/superedge/params_test.go b/adapters/superedge/params_test.go index a2f08438374..a6fc290b694 100644 --- a/adapters/superedge/params_test.go +++ b/adapters/superedge/params_test.go @@ -39,6 +39,9 @@ var validParams = []string{ `{"sk": "1e9ead5397ae44d78c6792bc7cddc050"}`, `{"sk": "27bb74d57068406ebcbb29ab9bfeb9b9"}`, `{"sk": "0c3356713c184ca186779eecdd5aff5d"}`, + `{"sk": "f9f2b1ef23fe2759c2cad0953029a94b", "region": "US"}`, + `{"sk": "f9f2b1ef23fe2759c2cad0953029a94b", "region": "EU"}`, + `{"sk": "f9f2b1ef23fe2759c2cad0953029a94b", "region": "APAC"}`, } var invalidParams = []string{ @@ -47,4 +50,7 @@ var invalidParams = []string{ `{"region": "APAC"}`, `{"region": "US"}`, `{"tn": "27bb74d57068406ebcbb29ab9bfeb9b9"}`, + `{"sk": 123}`, + `{"sk": ""}`, + `{"sk": "f9f2b1ef23fe2759c2cad0953029a94b", "region": "JP"}`, } diff --git a/adapters/superedge/superedge.go b/adapters/superedge/superedge.go index 6023241920a..1a070456bd8 100644 --- a/adapters/superedge/superedge.go +++ b/adapters/superedge/superedge.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "net/http" + "net/url" "text/template" "github.com/prebid/openrtb/v20/openrtb2" @@ -61,7 +62,7 @@ func (a *adapter) makeRequest(request *openrtb2.BidRequest) (*adapters.RequestDa headers := http.Header{} headers.Add("Content-Type", "application/json;charset=utf-8") headers.Add("Accept", "application/json") - headers.Add("x-openrtb-version", "2.5") + headers.Add("x-openrtb-version", "2.6") return &adapters.RequestData{ Method: "POST", Uri: endPoint, @@ -71,23 +72,10 @@ func (a *adapter) makeRequest(request *openrtb2.BidRequest) (*adapters.RequestDa }, nil } -// getSuperEdgeExt extracts ExtSuperEdge from the first imp's ext.bidder or request.ext.prebid.bidderparams. +// getSuperEdgeExt extracts ExtSuperEdge from the first imp's ext.bidder. func getSuperEdgeExt(request *openrtb2.BidRequest) (*openrtb_ext.ExtSuperEdge, error) { var extSuperEdge openrtb_ext.ExtSuperEdge - // Try to get sk from request.ext.prebid.bidderparams first - if request.Ext != nil { - reqExt := &openrtb_ext.ExtRequest{} - if err := jsonutil.Unmarshal(request.Ext, reqExt); err == nil { - if len(reqExt.Prebid.BidderParams) > 0 { - if err := jsonutil.Unmarshal(reqExt.Prebid.BidderParams, &extSuperEdge); err == nil && extSuperEdge.Sk != "" { - return &extSuperEdge, nil - } - } - } - } - - // Fallback to first imp's ext.bidder if len(request.Imp) == 0 { return nil, errors.New("superEdge sk not found") } @@ -101,14 +89,29 @@ func getSuperEdgeExt(request *openrtb2.BidRequest) (*openrtb_ext.ExtSuperEdge, e return nil, err } - if extSuperEdge.Sk != "" { - return &extSuperEdge, nil + if extSuperEdge.Sk == "" { + return nil, errors.New("superEdge sk not found") } - return nil, errors.New("superEdge sk not found") + return &extSuperEdge, nil } func (a *adapter) getEndPoint(ext *openrtb_ext.ExtSuperEdge) (string, error) { - return macros.ResolveMacros(a.EndpointTemplate, map[string]string{"sk": ext.Sk}) + endPointParams := macros.EndpointTemplateParams{ + Host: url.PathEscape(getRegionHost(ext.Region)), + AccountID: url.PathEscape(ext.Sk), + } + return macros.ResolveMacros(a.EndpointTemplate, endPointParams) +} + +func getRegionHost(region string) string { + switch region { + case "EU": + return "rtb-eu" + case "APAC": + return "rtb-sg" + default: + return "rtb-us" + } } func preProcess(request *openrtb2.BidRequest) { @@ -137,6 +140,9 @@ func (a *adapter) MakeBids(internalRequest *openrtb2.BidRequest, _ *adapters.Req return nil, []error{err} } bidResponse := adapters.NewBidderResponseWithBidsCapacity(1) + if bidResp.Cur != "" { + bidResponse.Currency = bidResp.Cur + } var errs []error for _, seatBid := range bidResp.SeatBid { for idx := range seatBid.Bid { diff --git a/adapters/superedge/superedge_test.go b/adapters/superedge/superedge_test.go index 16139a0a38d..281aec27ffb 100644 --- a/adapters/superedge/superedge_test.go +++ b/adapters/superedge/superedge_test.go @@ -15,7 +15,7 @@ import ( func TestJsonSamples(t *testing.T) { bidder, buildErr := Builder(openrtb_ext.BidderSuperEdge, config.Adapter{ - Endpoint: "https://rtb-us.superedge.co.jp/bid?sk={{.sk}}"}, config.Server{ExternalUrl: "http://hosturl.com"}) + Endpoint: "https://{{.Host}}.superedge.co.jp/bid?sk={{.AccountID}}"}, config.Server{ExternalUrl: "http://hosturl.com"}) if buildErr != nil { t.Fatalf("Builder returned unexpected error %v", buildErr) diff --git a/adapters/superedge/superedgetest/exemplary/sample-banner-apac.json b/adapters/superedge/superedgetest/exemplary/sample-banner-apac.json index 2ff710e970d..c154efe0958 100644 --- a/adapters/superedge/superedgetest/exemplary/sample-banner-apac.json +++ b/adapters/superedge/superedgetest/exemplary/sample-banner-apac.json @@ -15,25 +15,6 @@ "ext": { "bidder": { "sk": "f9f2b1ef23fe2759c2cad0953029a94b", - "placementId": "testPlacementId", - "region": "APAC" - } - } - }, - { - "id": "test-imp-id-2", - "banner": { - "format": [ - { - "w": 300, - "h": 250 - } - ] - }, - "ext": { - "bidder": { - "sk": "f9f2b1ef23fe2759c2cad0953029a94b", - "placementId": "testPlacementId2", "region": "APAC" } } @@ -42,20 +23,12 @@ "site": { "id": "test-site-id", "page": "https://www.example.com/" - }, - "ext": { - "prebid": { - "bidderparams": { - "sk": "f9f2b1ef23fe2759c2cad0953029a94b", - "region": "APAC" - } - } } }, "httpCalls": [ { "expectedRequest": { - "uri": "https://rtb-us.superedge.co.jp/bid?sk=f9f2b1ef23fe2759c2cad0953029a94b", + "uri": "https://rtb-sg.superedge.co.jp/bid?sk=f9f2b1ef23fe2759c2cad0953029a94b", "body": { "id": "test-request-id", "imp": [ @@ -74,28 +47,7 @@ "ext": { "bidder": { "sk": "f9f2b1ef23fe2759c2cad0953029a94b", - "region": "APAC", - "placementId": "testPlacementId" - } - } - }, - { - "id": "test-imp-id-2", - "banner": { - "format": [ - { - "w": 300, - "h": 250 - } - ], - "w": 300, - "h": 250 - }, - "ext": { - "bidder": { - "sk": "f9f2b1ef23fe2759c2cad0953029a94b", - "region": "APAC", - "placementId": "testPlacementId2" + "region": "APAC" } } } @@ -103,19 +55,10 @@ "site": { "id": "test-site-id", "page": "https://www.example.com/" - }, - "ext": { - "prebid": { - "bidderparams": { - "sk": "f9f2b1ef23fe2759c2cad0953029a94b", - "region": "APAC" - } - } } }, "impIDs": [ - "test-imp-id", - "test-imp-id-2" + "test-imp-id" ] }, "mockResponse": { @@ -132,13 +75,6 @@ "price": 0.5, "adm": "some-ads", "crid": "crid_testid" - }, - { - "id": "test-imp-id-2", - "impid": "test-imp-id-2", - "price": 1.0, - "adm": "some-ads-2", - "crid": "crid_testid2" } ] } @@ -161,16 +97,6 @@ "crid": "crid_testid" }, "type": "banner" - }, - { - "bid": { - "id": "test-imp-id-2", - "impid": "test-imp-id-2", - "price": 1.0, - "adm": "some-ads-2", - "crid": "crid_testid2" - }, - "type": "banner" } ] } diff --git a/adapters/superedge/superedgetest/exemplary/sample-banner-fallback-to-first-imp-to-get-ep.json b/adapters/superedge/superedgetest/exemplary/sample-banner-eu.json similarity index 92% rename from adapters/superedge/superedgetest/exemplary/sample-banner-fallback-to-first-imp-to-get-ep.json rename to adapters/superedge/superedgetest/exemplary/sample-banner-eu.json index 61e0036310d..3ba7d32e12b 100644 --- a/adapters/superedge/superedgetest/exemplary/sample-banner-fallback-to-first-imp-to-get-ep.json +++ b/adapters/superedge/superedgetest/exemplary/sample-banner-eu.json @@ -15,7 +15,7 @@ "ext": { "bidder": { "sk": "f9f2b1ef23fe2759c2cad0953029a94b", - "placementId": "testPlacementId" + "region": "EU" } } } @@ -28,7 +28,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "https://rtb-us.superedge.co.jp/bid?sk=f9f2b1ef23fe2759c2cad0953029a94b", + "uri": "https://rtb-eu.superedge.co.jp/bid?sk=f9f2b1ef23fe2759c2cad0953029a94b", "body": { "id": "test-request-id", "imp": [ @@ -47,7 +47,7 @@ "ext": { "bidder": { "sk": "f9f2b1ef23fe2759c2cad0953029a94b", - "placementId": "testPlacementId" + "region": "EU" } } } diff --git a/adapters/superedge/superedgetest/exemplary/sample-banner-euc.json b/adapters/superedge/superedgetest/exemplary/sample-banner-euc.json deleted file mode 100644 index 6337bdfc697..00000000000 --- a/adapters/superedge/superedgetest/exemplary/sample-banner-euc.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "mockBidRequest": { - "id": "test-request-id", - "imp": [ - { - "id": "test-imp-id", - "banner": { - "format": [ - { - "w": 320, - "h": 50 - } - ] - }, - "ext": { - "bidder": { - "sk": "f9f2b1ef23fe2759c2cad0953029a94b", - "placementId": "testPlacementId", - "region": "EU" - } - } - } - ], - "site": { - "id": "test-site-id", - "page": "https://www.example.com/" - }, - "ext": { - "prebid": { - "bidderparams": { - "sk": "f9f2b1ef23fe2759c2cad0953029a94b", - "region": "EU" - } - } - } - }, - "httpCalls": [ - { - "expectedRequest": { - "uri": "https://rtb-us.superedge.co.jp/bid?sk=f9f2b1ef23fe2759c2cad0953029a94b", - "body": { - "id": "test-request-id", - "imp": [ - { - "id": "test-imp-id", - "banner": { - "format": [ - { - "w": 320, - "h": 50 - } - ], - "w": 320, - "h": 50 - }, - "ext": { - "bidder": { - "sk": "f9f2b1ef23fe2759c2cad0953029a94b", - "region": "EU", - "placementId": "testPlacementId" - } - } - } - ], - "site": { - "id": "test-site-id", - "page": "https://www.example.com/" - }, - "ext": { - "prebid": { - "bidderparams": { - "sk": "f9f2b1ef23fe2759c2cad0953029a94b", - "region": "EU" - } - } - } - }, - "impIDs": [ - "test-imp-id" - ] - }, - "mockResponse": { - "status": 200, - "body": { - "id": "test-request-id", - "seatbid": [ - { - "seat": "superedge", - "bid": [ - { - "id": "test-imp-id", - "impid": "test-imp-id", - "price": 0.5, - "adm": "some-ads", - "crid": "crid_testid" - } - ] - } - ], - "cur": "USD" - } - } - } - ], - "expectedBidResponses": [ - { - "currency": "USD", - "bids": [ - { - "bid": { - "id": "test-imp-id", - "impid": "test-imp-id", - "price": 0.5, - "adm": "some-ads", - "crid": "crid_testid" - }, - "type": "banner" - } - ] - } - ] -} diff --git a/adapters/superedge/superedgetest/exemplary/sample-banner-use.json b/adapters/superedge/superedgetest/exemplary/sample-banner-imp-only.json similarity index 85% rename from adapters/superedge/superedgetest/exemplary/sample-banner-use.json rename to adapters/superedge/superedgetest/exemplary/sample-banner-imp-only.json index 78da96667b3..c2073ffeda0 100644 --- a/adapters/superedge/superedgetest/exemplary/sample-banner-use.json +++ b/adapters/superedge/superedgetest/exemplary/sample-banner-imp-only.json @@ -22,14 +22,6 @@ "site": { "id": "test-site-id", "page": "https://www.example.com/" - }, - "ext": { - "prebid": { - "bidderparams": { - "sk": "f9f2b1ef23fe2759c2cad0953029a94b", - "region": "US" - } - } } }, "httpCalls": [ @@ -61,14 +53,6 @@ "site": { "id": "test-site-id", "page": "https://www.example.com/" - }, - "ext": { - "prebid": { - "bidderparams": { - "sk": "f9f2b1ef23fe2759c2cad0953029a94b", - "region": "US" - } - } } }, "impIDs": [ diff --git a/adapters/superedge/superedgetest/exemplary/sample-banner.json b/adapters/superedge/superedgetest/exemplary/sample-banner.json index cebd559d592..f4ef726fc60 100644 --- a/adapters/superedge/superedgetest/exemplary/sample-banner.json +++ b/adapters/superedge/superedgetest/exemplary/sample-banner.json @@ -14,8 +14,7 @@ }, "ext": { "bidder": { - "sk": "f9f2b1ef23fe2759c2cad0953029a94b", - "placementId": "testPlacementId" + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" } } }, @@ -31,8 +30,7 @@ }, "ext": { "bidder": { - "sk": "f9f2b1ef23fe2759c2cad0953029a94b", - "placementId": "testPlacementId2" + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" } } } @@ -44,8 +42,7 @@ "ext": { "prebid": { "bidderparams": { - "sk": "f9f2b1ef23fe2759c2cad0953029a94b", - "region": "US" + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" } } } @@ -71,8 +68,7 @@ }, "ext": { "bidder": { - "sk": "f9f2b1ef23fe2759c2cad0953029a94b", - "placementId": "testPlacementId" + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" } } }, @@ -90,8 +86,7 @@ }, "ext": { "bidder": { - "sk": "f9f2b1ef23fe2759c2cad0953029a94b", - "placementId": "testPlacementId2" + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" } } } @@ -103,8 +98,7 @@ "ext": { "prebid": { "bidderparams": { - "sk": "f9f2b1ef23fe2759c2cad0953029a94b", - "region": "US" + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" } } } diff --git a/adapters/superedge/superedgetest/exemplary/sample-nobid.json b/adapters/superedge/superedgetest/exemplary/sample-nobid.json index 05e3601d027..59ed34c9b87 100644 --- a/adapters/superedge/superedgetest/exemplary/sample-nobid.json +++ b/adapters/superedge/superedgetest/exemplary/sample-nobid.json @@ -14,8 +14,7 @@ }, "ext": { "bidder": { - "sk": "f9f2b1ef23fe2759c2cad0953029a94b", - "placementId": "testPlacementId" + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" } } } @@ -46,8 +45,7 @@ }, "ext": { "bidder": { - "sk": "f9f2b1ef23fe2759c2cad0953029a94b", - "placementId": "testPlacementId" + "sk": "f9f2b1ef23fe2759c2cad0953029a94b" } } } diff --git a/adapters/superedge/superedgetest/supplemental/bad_request_no_token.json b/adapters/superedge/superedgetest/supplemental/bad_request_no_token.json index 16d17e4b060..02cff064fde 100644 --- a/adapters/superedge/superedgetest/supplemental/bad_request_no_token.json +++ b/adapters/superedge/superedgetest/supplemental/bad_request_no_token.json @@ -13,9 +13,7 @@ ] }, "ext": { - "bidder": { - "placementId": "testPlacementId" - } + "bidder": {} } } ], diff --git a/openrtb_ext/imp_superedge.go b/openrtb_ext/imp_superedge.go index 1d1e81ac5ff..0663ca8d88f 100644 --- a/openrtb_ext/imp_superedge.go +++ b/openrtb_ext/imp_superedge.go @@ -2,5 +2,6 @@ package openrtb_ext // ExtSuperEdge defines the contract for bidrequest.imp[i].ext.prebid.bidder.superEdge type ExtSuperEdge struct { - Sk string `json:"sk"` + Sk string `json:"sk"` + Region string `json:"region"` } diff --git a/static/bidder-info/superedge.yaml b/static/bidder-info/superedge.yaml index 904dd180aa4..7dde4e994ed 100644 --- a/static/bidder-info/superedge.yaml +++ b/static/bidder-info/superedge.yaml @@ -1,7 +1,9 @@ -endpoint: "https://rtb-us.superedge.co.jp/bid?sk={{.sk}}" +endpoint: "https://{{.Host}}.superedge.co.jp/bid?sk={{.AccountID}}" endpointCompression: gzip geoscope: - USA + - EEA + - APAC maintainer: email: op@superedge.co.jp gvlVendorID: 1554 diff --git a/static/bidder-params/superedge.json b/static/bidder-params/superedge.json index ae057525d1a..59d1331412f 100644 --- a/static/bidder-params/superedge.json +++ b/static/bidder-params/superedge.json @@ -6,12 +6,15 @@ "properties": { "sk": { "type": "string", - "description": "Different Publisher has different sk,communicate with SuperEdge to obtain it.", + "description": "Publisher token, communicated by SuperEdge.", "minLength": 1 + }, + "region": { + "type": "string", + "description": "Server region: US for US Region, EU for EU Region, SG for Singapore Region. Default is US.", + "enum": ["US", "EU", "APAC"] } }, - "required": [ - "sk" - ], + "required": ["sk"], "additionalProperties": false } \ No newline at end of file