diff --git a/adapters/sonobi/sonobi.go b/adapters/sonobi/sonobi.go
index 65ea0d33e7c..afc1e5793d9 100644
--- a/adapters/sonobi/sonobi.go
+++ b/adapters/sonobi/sonobi.go
@@ -4,6 +4,7 @@ import (
"encoding/json"
"fmt"
"net/http"
+ "strings"
"github.com/prebid/openrtb/v20/openrtb2"
"github.com/prebid/prebid-server/v2/adapters"
@@ -53,6 +54,25 @@ func (a *SonobiAdapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adap
reqCopy.Imp[0].TagID = sonobiExt.TagID
+ // If the bid floor currency is not USD, do the conversion to USD
+ if reqCopy.Imp[0].BidFloor > 0 && reqCopy.Imp[0].BidFloorCur != "" && strings.ToUpper(reqCopy.Imp[0].BidFloorCur) != "USD" {
+
+ // Convert to US dollars
+ convertedValue, err := reqInfo.ConvertCurrency(reqCopy.Imp[0].BidFloor, reqCopy.Imp[0].BidFloorCur, "USD")
+ if err != nil {
+ errs = append(errs, err)
+ continue
+ }
+
+ // Update after conversion. All imp elements inside request.Imp are shallow copies
+ // therefore, their non-pointer values are not shared memory and are safe to modify.
+ reqCopy.Imp[0].BidFloorCur = "USD"
+ reqCopy.Imp[0].BidFloor = convertedValue
+ }
+
+ // Sonobi only bids in USD
+ reqCopy.Cur = append(make([]string, 0, 1), "USD")
+
adapterReq, errors := a.makeRequest(&reqCopy)
if adapterReq != nil {
adapterRequests = append(adapterRequests, adapterReq)
@@ -115,19 +135,19 @@ func (a *SonobiAdapter) MakeBids(internalRequest *openrtb2.BidRequest, externalR
}
bidResponse := adapters.NewBidderResponseWithBidsCapacity(5)
+ bidResponse.Currency = "USD" // Sonobi only bids in USD
for _, sb := range bidResp.SeatBid {
for i := range sb.Bid {
- bidType, err := getMediaTypeForImp(sb.Bid[i].ImpID, internalRequest.Imp)
+ bid := sb.Bid[i]
+ bidType, err := getMediaTypeForImp(bid.ImpID, internalRequest.Imp)
if err != nil {
- errs = append(errs, err)
- } else {
- b := &adapters.TypedBid{
- Bid: &sb.Bid[i],
- BidType: bidType,
- }
- bidResponse.Bids = append(bidResponse.Bids, b)
+ return nil, []error{err}
}
+ bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{
+ Bid: &bid,
+ BidType: bidType,
+ })
}
}
return bidResponse, errs
@@ -140,6 +160,9 @@ func getMediaTypeForImp(impID string, imps []openrtb2.Imp) (openrtb_ext.BidType,
if imp.Banner == nil && imp.Video != nil {
mediaType = openrtb_ext.BidTypeVideo
}
+ if imp.Banner == nil && imp.Video == nil && imp.Native != nil {
+ mediaType = openrtb_ext.BidTypeNative
+ }
return mediaType, nil
}
}
diff --git a/adapters/sonobi/sonobitest/exemplary/banner.json b/adapters/sonobi/sonobitest/exemplary/banner.json
index d60ddb44a8b..f3a39f74a27 100644
--- a/adapters/sonobi/sonobitest/exemplary/banner.json
+++ b/adapters/sonobi/sonobitest/exemplary/banner.json
@@ -1,5 +1,6 @@
{
"mockBidRequest": {
+ "cur": ["GBP"],
"id": "some-request-id",
"site": {
"page": "http://tester.go.sonobi.com",
@@ -48,6 +49,7 @@
},
"uri": "https://apex.go.sonobi.com/prebid?partnerid=71d9d3d8af",
"body": {
+ "cur": ["USD"],
"id": "some-request-id",
"imp": [
{
diff --git a/adapters/sonobi/sonobitest/exemplary/native.json b/adapters/sonobi/sonobitest/exemplary/native.json
new file mode 100644
index 00000000000..ff9eb4c4693
--- /dev/null
+++ b/adapters/sonobi/sonobitest/exemplary/native.json
@@ -0,0 +1,143 @@
+{
+ "mockBidRequest": {
+ "cur": ["USD"],
+ "id": "some-request-id",
+ "site": {
+ "page": "http://tester.go.sonobi.com",
+ "domain": "sonobi.com"
+ },
+ "device": {
+ "ip": "123.123.123.123"
+ },
+ "imp": [
+ {
+ "id": "some-impression-id",
+ "native": {
+ "request": "{\"ver\":\"1.2\",\"context\":1,\"contextsubtype\":11,\"plcmttype\":2,\"plcmtcnt\":3,\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":1000}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":600,\"hmin\":600}},{\"id\":3,\"required\":0,\"data\":{\"type\":1,\"len\":200}},{\"id\":4,\"required\":0,\"data\":{\"type\":2,\"len\":3000}},{\"id\":5,\"required\":0,\"data\":{\"type\":6,\"len\":60}},{\"id\":6,\"required\":0,\"data\":{\"type\":500}},{\"id\":10,\"required\":0,\"data\":{\"type\":12,\"len\":15}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1,2]},{\"event\":2,\"methods\":[1]}],\"privacy\":1}",
+ "ver": "1.2",
+ "battr": [
+ 1,
+ 2,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 14
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "TagID": "/7780971/apex_3pdm_integration"
+ }
+ }
+ }
+ ],
+ "test": 1,
+ "tmax": 500
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "headers": {
+ "Accept": [
+ "application/json"
+ ],
+ "Content-Type": [
+ "application/json;charset=utf-8"
+ ]
+ },
+ "uri": "https://apex.go.sonobi.com/prebid?partnerid=71d9d3d8af",
+ "body": {
+ "cur": ["USD"],
+ "id": "some-request-id",
+ "imp": [
+ {
+ "id": "some-impression-id",
+ "native": {
+ "request": "{\"ver\":\"1.2\",\"context\":1,\"contextsubtype\":11,\"plcmttype\":2,\"plcmtcnt\":3,\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":1000}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":600,\"hmin\":600}},{\"id\":3,\"required\":0,\"data\":{\"type\":1,\"len\":200}},{\"id\":4,\"required\":0,\"data\":{\"type\":2,\"len\":3000}},{\"id\":5,\"required\":0,\"data\":{\"type\":6,\"len\":60}},{\"id\":6,\"required\":0,\"data\":{\"type\":500}},{\"id\":10,\"required\":0,\"data\":{\"type\":12,\"len\":15}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1,2]},{\"event\":2,\"methods\":[1]}],\"privacy\":1}",
+ "ver": "1.2",
+ "battr": [
+ 1,
+ 2,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 14
+ ]
+ },
+ "tagid": "/7780971/apex_3pdm_integration",
+ "ext": {
+ "bidder": {
+ "TagID": "/7780971/apex_3pdm_integration"
+ }
+ }
+ }
+ ],
+ "site": {
+ "domain": "sonobi.com",
+ "page": "http://tester.go.sonobi.com"
+ },
+ "device": {
+ "ip": "123.123.123.123"
+ },
+ "test": 1,
+ "tmax": 500
+ },
+ "impIDs": [
+ "some-impression-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "some-request-id",
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "1",
+ "impid": "some-impression-id",
+ "price": 2.8649999999999998,
+ "adm": "test-markup",
+ "adomain": [
+ "sonobi.com"
+ ],
+ "cid": "house",
+ "crid": "sandbox"
+
+ }
+ ],
+ "seat": "sonobi"
+ }
+ ],
+ "bidid": "sandbox_642305097",
+ "cur": "USD"
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "currency": "USD",
+ "bids": [
+ {
+ "bid": {
+ "id": "1",
+ "impid": "some-impression-id",
+ "price": 2.8649999999999998,
+ "adm": "test-markup",
+ "adomain": [
+ "sonobi.com"
+ ],
+ "cid": "house",
+ "crid": "sandbox"
+ },
+ "type": "native"
+ }
+ ]
+ }
+ ]
+}
diff --git a/adapters/sonobi/sonobitest/exemplary/no-bid.json b/adapters/sonobi/sonobitest/exemplary/no-bid.json
index ef31c9f2ba4..a43d1f670a0 100644
--- a/adapters/sonobi/sonobitest/exemplary/no-bid.json
+++ b/adapters/sonobi/sonobitest/exemplary/no-bid.json
@@ -1,5 +1,6 @@
{
"mockBidRequest": {
+ "cur": ["USD"],
"id": "some-request-id",
"site": {
"page": "http://tester.go.sonobi.com",
@@ -48,6 +49,7 @@
},
"uri": "https://apex.go.sonobi.com/prebid?partnerid=71d9d3d8af",
"body": {
+ "cur": ["USD"],
"id": "some-request-id",
"imp": [
{
diff --git a/adapters/sonobi/sonobitest/supplemental/currency-conversion.json b/adapters/sonobi/sonobitest/supplemental/currency-conversion.json
new file mode 100644
index 00000000000..522e1bd7326
--- /dev/null
+++ b/adapters/sonobi/sonobitest/supplemental/currency-conversion.json
@@ -0,0 +1,172 @@
+{
+ "mockBidRequest": {
+ "cur": ["GBP"],
+ "id": "some-request-id",
+ "site": {
+ "page": "http://tester.go.sonobi.com",
+ "domain": "sonobi.com"
+ },
+ "device": {
+ "ip": "123.123.123.123"
+ },
+ "imp": [
+ {
+ "id": "some-impression-id",
+ "banner": {
+ "w": 300,
+ "h": 250,
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ },
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ },
+ "bidfloor": 1.00,
+ "bidfloorcur": "GBP",
+ "ext": {
+ "bidder": {
+ "TagID": "/7780971/apex_3pdm_integration"
+ }
+ }
+ }
+ ],
+ "ext": {
+ "prebid": {
+ "currency": {
+ "rates": {
+ "GBP": {
+ "USD": 0.05
+ }
+ },
+ "usepbsrates": false
+ }
+ }
+ },
+ "test": 1,
+ "tmax": 500
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "headers": {
+ "Accept": [
+ "application/json"
+ ],
+ "Content-Type": [
+ "application/json;charset=utf-8"
+ ]
+ },
+ "uri": "https://apex.go.sonobi.com/prebid?partnerid=71d9d3d8af",
+ "body": {
+ "cur": ["USD"],
+ "id": "some-request-id",
+ "imp": [
+ {
+ "id": "some-impression-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ },
+ {
+ "w": 300,
+ "h": 600
+ }
+ ],
+ "w": 300,
+ "h": 250
+ },
+ "bidfloor": 0.05,
+ "bidfloorcur": "USD",
+ "tagid": "/7780971/apex_3pdm_integration",
+ "ext": {
+ "bidder": {
+ "TagID": "/7780971/apex_3pdm_integration"
+ }
+ }
+ }
+ ],
+ "ext": {
+ "prebid": {
+ "currency": {
+ "rates": {
+ "GBP": {
+ "USD": 0.05
+ }
+ },
+ "usepbsrates": false
+ }
+ }
+ },
+ "site": {
+ "domain": "sonobi.com",
+ "page": "http://tester.go.sonobi.com"
+ },
+ "device": {
+ "ip": "123.123.123.123"
+ },
+ "test": 1,
+ "tmax": 500
+ },
+ "impIDs":["some-impression-id"]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "some-request-id",
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "1",
+ "impid": "some-impression-id",
+ "price": 2.8649999999999998,
+ "adm": "",
+ "adomain": [
+ "sonobi.com"
+ ],
+ "cid": "house",
+ "crid": "sandbox",
+ "h": 1,
+ "w": 1
+ }
+ ],
+ "seat": "sonobi"
+ }
+ ],
+ "bidid": "sandbox_642305097",
+ "cur": "USD"
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "currency": "USD",
+ "bids": [
+ {
+ "bid": {
+ "id": "1",
+ "impid": "some-impression-id",
+ "price": 2.8649999999999998,
+ "adm": "",
+ "adomain": [
+ "sonobi.com"
+ ],
+ "cid": "house",
+ "crid": "sandbox",
+ "h": 1,
+ "w": 1
+ },
+ "type": "banner"
+ }
+ ]
+ }
+ ]
+}
diff --git a/static/bidder-info/sonobi.yaml b/static/bidder-info/sonobi.yaml
index 135bdacfe93..422ba610a6f 100644
--- a/static/bidder-info/sonobi.yaml
+++ b/static/bidder-info/sonobi.yaml
@@ -7,11 +7,16 @@ capabilities:
mediaTypes:
- banner
- video
+ - native
app:
mediaTypes:
- banner
- video
+ - native
userSync:
+ iframe:
+ url: "https://sync.go.sonobi.com/uc.html?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&loc={{.RedirectURL}}"
+ userMacro: "[UID]"
redirect:
url: "https://sync.go.sonobi.com/us.gif?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&loc={{.RedirectURL}}"
userMacro: "[UID]"