diff --git a/adapters/adnuntius/adnuntius.go b/adapters/adnuntius/adnuntius.go
index 823c1783144..829b6e823e4 100644
--- a/adapters/adnuntius/adnuntius.go
+++ b/adapters/adnuntius/adnuntius.go
@@ -162,7 +162,7 @@ func makeEndpointUrl(ortbRequest openrtb2.BidRequest, a *adapter, noCookies bool
}
q.Set("tzo", fmt.Sprint(tzo))
- q.Set("format", "json")
+ q.Set("format", "prebid")
url := endpointUrl + "?" + q.Encode()
return url, nil
diff --git a/adapters/adnuntius/adnuntiustest/exemplary/simple-banner.json b/adapters/adnuntius/adnuntiustest/exemplary/simple-banner.json
index 881c02e340d..49c74ad6683 100644
--- a/adapters/adnuntius/adnuntiustest/exemplary/simple-banner.json
+++ b/adapters/adnuntius/adnuntiustest/exemplary/simple-banner.json
@@ -31,7 +31,7 @@
"httpCalls": [
{
"expectedRequest": {
- "uri": "http://whatever.url?format=json&tzo=0",
+ "uri": "http://whatever.url?format=prebid&tzo=0",
"body": {
"adUnits": [
{
diff --git a/adapters/adnuntius/adnuntiustest/supplemental/check-dealId.json b/adapters/adnuntius/adnuntiustest/supplemental/check-dealId.json
index 06dbeff4113..7869fa87f94 100644
--- a/adapters/adnuntius/adnuntiustest/supplemental/check-dealId.json
+++ b/adapters/adnuntius/adnuntiustest/supplemental/check-dealId.json
@@ -31,7 +31,7 @@
"httpCalls": [
{
"expectedRequest": {
- "uri": "http://whatever.url?format=json&tzo=0",
+ "uri": "http://whatever.url?format=prebid&tzo=0",
"body": {
"adUnits": [
{
diff --git a/adapters/adnuntius/adnuntiustest/supplemental/check-gdpr.json b/adapters/adnuntius/adnuntiustest/supplemental/check-gdpr.json
index 44e59316a7d..296aa4894a4 100644
--- a/adapters/adnuntius/adnuntiustest/supplemental/check-gdpr.json
+++ b/adapters/adnuntius/adnuntiustest/supplemental/check-gdpr.json
@@ -38,7 +38,7 @@
"httpCalls": [
{
"expectedRequest": {
- "uri": "http://gdpr.url?consentString=CONSENT_STRING&format=json&gdpr=1&tzo=0",
+ "uri": "http://gdpr.url?consentString=CONSENT_STRING&format=prebid&gdpr=1&tzo=0",
"body": {
"adUnits": [
{
diff --git a/adapters/adnuntius/adnuntiustest/supplemental/check-gross-bids.json b/adapters/adnuntius/adnuntiustest/supplemental/check-gross-bids.json
index 7e533098fb5..95c77e464a9 100644
--- a/adapters/adnuntius/adnuntiustest/supplemental/check-gross-bids.json
+++ b/adapters/adnuntius/adnuntiustest/supplemental/check-gross-bids.json
@@ -31,7 +31,7 @@
"httpCalls": [
{
"expectedRequest": {
- "uri": "http://whatever.url?format=json&tzo=0",
+ "uri": "http://whatever.url?format=prebid&tzo=0",
"body": {
"adUnits": [
{
diff --git a/adapters/adnuntius/adnuntiustest/supplemental/check-net-bids.json b/adapters/adnuntius/adnuntiustest/supplemental/check-net-bids.json
index 301a1f60fec..236d9f6d489 100644
--- a/adapters/adnuntius/adnuntiustest/supplemental/check-net-bids.json
+++ b/adapters/adnuntius/adnuntiustest/supplemental/check-net-bids.json
@@ -31,7 +31,7 @@
"httpCalls": [
{
"expectedRequest": {
- "uri": "http://whatever.url?format=json&tzo=0",
+ "uri": "http://whatever.url?format=prebid&tzo=0",
"body": {
"adUnits": [
{
diff --git a/adapters/adnuntius/adnuntiustest/supplemental/check-noCookies-parameter.json b/adapters/adnuntius/adnuntiustest/supplemental/check-noCookies-parameter.json
index 5ac10a86ce5..7104b6b0580 100644
--- a/adapters/adnuntius/adnuntiustest/supplemental/check-noCookies-parameter.json
+++ b/adapters/adnuntius/adnuntiustest/supplemental/check-noCookies-parameter.json
@@ -31,7 +31,7 @@
"httpCalls": [
{
"expectedRequest": {
- "uri": "http://whatever.url?format=json&noCookies=true&tzo=0",
+ "uri": "http://whatever.url?format=prebid&noCookies=true&tzo=0",
"body": {
"adUnits": [
{
diff --git a/adapters/adnuntius/adnuntiustest/supplemental/check-noCookies.json b/adapters/adnuntius/adnuntiustest/supplemental/check-noCookies.json
index 7080ef678d2..f60f7a636a9 100644
--- a/adapters/adnuntius/adnuntiustest/supplemental/check-noCookies.json
+++ b/adapters/adnuntius/adnuntiustest/supplemental/check-noCookies.json
@@ -35,7 +35,7 @@
"httpCalls": [
{
"expectedRequest": {
- "uri": "http://whatever.url?format=json&noCookies=true&tzo=0",
+ "uri": "http://whatever.url?format=prebid&noCookies=true&tzo=0",
"body": {
"adUnits": [
{
diff --git a/adapters/adnuntius/adnuntiustest/supplemental/check-order-multi-imp.json b/adapters/adnuntius/adnuntiustest/supplemental/check-order-multi-imp.json
index 75b08f73716..2269297d9cd 100644
--- a/adapters/adnuntius/adnuntiustest/supplemental/check-order-multi-imp.json
+++ b/adapters/adnuntius/adnuntiustest/supplemental/check-order-multi-imp.json
@@ -47,11 +47,11 @@
}
]
},
-
+
"httpCalls": [
{
"expectedRequest": {
- "uri": "http://whatever.url?format=json&tzo=0",
+ "uri": "http://whatever.url?format=prebid&tzo=0",
"body": {
"adUnits": [
{
@@ -159,6 +159,6 @@
],
"currency": "NOK"
}
-
+
]
}
diff --git a/adapters/adnuntius/adnuntiustest/supplemental/check-userId.json b/adapters/adnuntius/adnuntiustest/supplemental/check-userId.json
index eb2f71111a7..2263798d3e5 100644
--- a/adapters/adnuntius/adnuntiustest/supplemental/check-userId.json
+++ b/adapters/adnuntius/adnuntiustest/supplemental/check-userId.json
@@ -30,7 +30,7 @@
"httpCalls": [
{
"expectedRequest": {
- "uri": "http://whatever.url?format=json&tzo=0",
+ "uri": "http://whatever.url?format=prebid&tzo=0",
"body": {
"adUnits": [
{
diff --git a/adapters/adnuntius/adnuntiustest/supplemental/empty-regs-ext.json b/adapters/adnuntius/adnuntiustest/supplemental/empty-regs-ext.json
index d0b7b1450ea..211416294ce 100644
--- a/adapters/adnuntius/adnuntiustest/supplemental/empty-regs-ext.json
+++ b/adapters/adnuntius/adnuntiustest/supplemental/empty-regs-ext.json
@@ -33,7 +33,7 @@
"httpCalls": [
{
"expectedRequest": {
- "uri": "http://whatever.url?format=json&tzo=0",
+ "uri": "http://whatever.url?format=prebid&tzo=0",
"body": {
"adUnits": [
{
diff --git a/adapters/adnuntius/adnuntiustest/supplemental/empty-regs.json b/adapters/adnuntius/adnuntiustest/supplemental/empty-regs.json
index 79571562c7f..2d3d0c861d0 100644
--- a/adapters/adnuntius/adnuntiustest/supplemental/empty-regs.json
+++ b/adapters/adnuntius/adnuntiustest/supplemental/empty-regs.json
@@ -32,7 +32,7 @@
"httpCalls": [
{
"expectedRequest": {
- "uri": "http://whatever.url?format=json&tzo=0",
+ "uri": "http://whatever.url?format=prebid&tzo=0",
"body": {
"adUnits": [
{
diff --git a/adapters/adnuntius/adnuntiustest/supplemental/height-error.json b/adapters/adnuntius/adnuntiustest/supplemental/height-error.json
index c58d27eba3e..770f1db032f 100644
--- a/adapters/adnuntius/adnuntiustest/supplemental/height-error.json
+++ b/adapters/adnuntius/adnuntiustest/supplemental/height-error.json
@@ -30,7 +30,7 @@
"httpCalls": [
{
"expectedRequest": {
- "uri": "http://whatever.url?format=json&tzo=0",
+ "uri": "http://whatever.url?format=prebid&tzo=0",
"body": {
"adUnits": [
{
diff --git a/adapters/adnuntius/adnuntiustest/supplemental/max-deals-test.json b/adapters/adnuntius/adnuntiustest/supplemental/max-deals-test.json
index 7f480d8cd08..9a2f24bdc45 100644
--- a/adapters/adnuntius/adnuntiustest/supplemental/max-deals-test.json
+++ b/adapters/adnuntius/adnuntiustest/supplemental/max-deals-test.json
@@ -28,11 +28,11 @@
}
]
},
-
+
"httpCalls": [
{
"expectedRequest": {
- "uri": "http://whatever.url?format=json&tzo=0",
+ "uri": "http://whatever.url?format=prebid&tzo=0",
"body": {
"adUnits": [
{
diff --git a/adapters/adnuntius/adnuntiustest/supplemental/send-header-information.json b/adapters/adnuntius/adnuntiustest/supplemental/send-header-information.json
index 8d2b60da238..2383cd4e3e7 100644
--- a/adapters/adnuntius/adnuntiustest/supplemental/send-header-information.json
+++ b/adapters/adnuntius/adnuntiustest/supplemental/send-header-information.json
@@ -50,7 +50,7 @@
"Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Mobile Safari/537.36"
]
},
- "uri": "http://whatever.url?format=json&tzo=0",
+ "uri": "http://whatever.url?format=prebid&tzo=0",
"body": {
"adUnits": [
{
diff --git a/adapters/adnuntius/adnuntiustest/supplemental/site-ext.json b/adapters/adnuntius/adnuntiustest/supplemental/site-ext.json
index 8213ac1787f..ddf37962054 100644
--- a/adapters/adnuntius/adnuntiustest/supplemental/site-ext.json
+++ b/adapters/adnuntius/adnuntiustest/supplemental/site-ext.json
@@ -37,7 +37,7 @@
"httpCalls": [
{
"expectedRequest": {
- "uri": "http://whatever.url?format=json&tzo=0",
+ "uri": "http://whatever.url?format=prebid&tzo=0",
"body": {
"adUnits": [
{
@@ -111,4 +111,4 @@
"currency": "NOK"
}
]
-}
\ No newline at end of file
+}
diff --git a/adapters/adnuntius/adnuntiustest/supplemental/size-check.json b/adapters/adnuntius/adnuntiustest/supplemental/size-check.json
index da17af1497d..f39586d9b9f 100644
--- a/adapters/adnuntius/adnuntiustest/supplemental/size-check.json
+++ b/adapters/adnuntius/adnuntiustest/supplemental/size-check.json
@@ -28,7 +28,7 @@
"httpCalls": [
{
"expectedRequest": {
- "uri": "http://whatever.url?format=json&noCookies=true&tzo=0",
+ "uri": "http://whatever.url?format=prebid&noCookies=true&tzo=0",
"body": {
"adUnits": [
{
diff --git a/adapters/adnuntius/adnuntiustest/supplemental/status-400.json b/adapters/adnuntius/adnuntiustest/supplemental/status-400.json
index ca54a2057e8..695aeb36e0d 100644
--- a/adapters/adnuntius/adnuntiustest/supplemental/status-400.json
+++ b/adapters/adnuntius/adnuntiustest/supplemental/status-400.json
@@ -27,7 +27,7 @@
"httpCalls": [
{
"expectedRequest": {
- "uri": "http://whatever.url?format=json&tzo=0",
+ "uri": "http://whatever.url?format=prebid&tzo=0",
"body": {
"adUnits": [
{
diff --git a/adapters/adnuntius/adnuntiustest/supplemental/test-networks.json b/adapters/adnuntius/adnuntiustest/supplemental/test-networks.json
index 6e608b28a39..b81e51cd3d9 100644
--- a/adapters/adnuntius/adnuntiustest/supplemental/test-networks.json
+++ b/adapters/adnuntius/adnuntiustest/supplemental/test-networks.json
@@ -32,7 +32,7 @@
"httpCalls": [
{
"expectedRequest": {
- "uri": "http://whatever.url?format=json&tzo=0",
+ "uri": "http://whatever.url?format=prebid&tzo=0",
"body": {
"adUnits": [
{
diff --git a/adapters/adnuntius/adnuntiustest/supplemental/user-ext.json b/adapters/adnuntius/adnuntiustest/supplemental/user-ext.json
index 0d852386b9e..2c2dcac1575 100644
--- a/adapters/adnuntius/adnuntiustest/supplemental/user-ext.json
+++ b/adapters/adnuntius/adnuntiustest/supplemental/user-ext.json
@@ -4,11 +4,11 @@
"user": {
"ext":{
"eids" : [
- {
- "source": "idProvider",
+ {
+ "source": "idProvider",
"uids": [
{ "id": "userId", "atype": 1, "ext": { "stype": "ppuid" } }
- ]
+ ]
}
]
}
@@ -39,7 +39,7 @@
"httpCalls": [
{
"expectedRequest": {
- "uri": "http://whatever.url?format=json&tzo=0",
+ "uri": "http://whatever.url?format=prebid&tzo=0",
"body": {
"adUnits": [
{
@@ -110,4 +110,4 @@
"currency": "NOK"
}
]
-}
\ No newline at end of file
+}
diff --git a/adapters/adnuntius/adnuntiustest/supplemental/width-error.json b/adapters/adnuntius/adnuntiustest/supplemental/width-error.json
index 870cdbc3f87..63d52302376 100644
--- a/adapters/adnuntius/adnuntiustest/supplemental/width-error.json
+++ b/adapters/adnuntius/adnuntiustest/supplemental/width-error.json
@@ -30,7 +30,7 @@
"httpCalls": [
{
"expectedRequest": {
- "uri": "http://whatever.url?format=json&tzo=0",
+ "uri": "http://whatever.url?format=prebid&tzo=0",
"body": {
"adUnits": [
{
diff --git a/adapters/gumgum/gumgum.go b/adapters/gumgum/gumgum.go
index 9e25e291825..4e44aacb82e 100644
--- a/adapters/gumgum/gumgum.go
+++ b/adapters/gumgum/gumgum.go
@@ -161,12 +161,8 @@ func preprocess(imp *openrtb2.Imp) (*openrtb_ext.ExtImpGumGum, error) {
}
if imp.Video != nil {
- err := validateVideoParams(imp.Video)
- if err != nil {
- return nil, err
- }
-
if gumgumExt.IrisID != "" {
+ var err error
videoCopy := *imp.Video
videoExt := openrtb_ext.ExtImpGumGumVideo{IrisID: gumgumExt.IrisID}
videoCopy.Ext, err = json.Marshal(&videoExt)
@@ -221,15 +217,6 @@ func getMediaTypeForImpID(impID string, imps []openrtb2.Imp) openrtb_ext.BidType
return openrtb_ext.BidTypeVideo
}
-func validateVideoParams(video *openrtb2.Video) (err error) {
- if video.W == nil || *video.W == 0 || video.H == nil || *video.H == 0 || video.MinDuration == 0 || video.MaxDuration == 0 || video.Placement == 0 || video.Linearity == 0 {
- return &errortypes.BadInput{
- Message: "Invalid or missing video field(s)",
- }
- }
- return nil
-}
-
// Builder builds a new instance of the GumGum adapter for the given bidder with the given config.
func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) {
bidder := &adapter{
diff --git a/adapters/gumgum/gumgumtest/supplemental/missing-video-params.json b/adapters/gumgum/gumgumtest/supplemental/missing-video-params.json
deleted file mode 100644
index b2475cd7bb4..00000000000
--- a/adapters/gumgum/gumgumtest/supplemental/missing-video-params.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "mockBidRequest": {
- "id": "test-request-id",
- "imp": [
- {
- "id": "test-imp-id",
- "video": {
- "mimes": [
- "video/mp4"
- ],
- "protocols": [
- 1,
- 2
- ],
- "w": 640,
- "h": 480,
- "startdelay": 1,
- "placement": 1,
- "linearity": 1
- },
- "ext": {
- "bidder": {
- "zone": "ggumtest"
- }
- }
- }
- ]
- },
- "expectedMakeRequestsErrors": [
- {
- "value": "Invalid or missing video field(s)",
- "comparison": "literal"
- }
- ]
- }
-
\ No newline at end of file
diff --git a/adapters/gumgum/gumgumtest/supplemental/video-missing-size.json b/adapters/gumgum/gumgumtest/supplemental/video-missing-size.json
deleted file mode 100644
index 1e4afe167ea..00000000000
--- a/adapters/gumgum/gumgumtest/supplemental/video-missing-size.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "mockBidRequest": {
- "id": "test-request-id",
- "imp": [
- {
- "id": "test-imp-id",
- "video": {
- "mimes": [
- "video/mp4"
- ],
- "minduration": 1,
- "maxduration": 2,
- "protocols": [
- 1,
- 2
- ],
- "startdelay": 1,
- "placement": 1,
- "linearity": 1
- },
- "ext": {
- "bidder": {
- "zone": "ggumtest"
- }
- }
- }
- ]
- },
- "expectedMakeRequestsErrors": [
- {
- "value": "Invalid or missing video field(s)",
- "comparison": "literal"
- }
- ]
-}
\ No newline at end of file
diff --git a/adapters/gumgum/gumgumtest/supplemental/video-partial-size.json b/adapters/gumgum/gumgumtest/supplemental/video-partial-size.json
index 3c9727a1a9c..ce43a93b145 100644
--- a/adapters/gumgum/gumgumtest/supplemental/video-partial-size.json
+++ b/adapters/gumgum/gumgumtest/supplemental/video-partial-size.json
@@ -27,10 +27,79 @@
}
]
},
- "expectedMakeRequestsErrors": [
+ "httpCalls": [
{
- "value": "Invalid or missing video field(s)",
- "comparison": "literal"
+ "expectedRequest": {
+ "uri": "https://g2.gumgum.com/providers/prbds2s/bid",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "video": {
+ "mimes": [
+ "video/mp4"
+ ],
+ "minduration": 1,
+ "maxduration": 2,
+ "protocols": [
+ 1,
+ 2
+ ],
+ "w": 640,
+ "startdelay": 1,
+ "placement": 1,
+ "linearity": 1
+ },
+ "ext": {
+ "bidder": {
+ "zone": "ggumtest"
+ }
+ }
+ }
+ ]
+ },
+ "impIDs":["test-imp-id"]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "15da721e-940a-4db6-8621-a1f93140b21b",
+ "impid": "video1",
+ "price": 15,
+ "adid": "59082",
+ "adm": "\n \n \n GumGum Video\n \n \n \n \n \n \n \n \n \n 00:00:15\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n",
+ "cid": "3579",
+ "crid": "59082"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+],
+"expectedBidResponses": [
+ {
+ "currency": "USD",
+ "bids": [
+ {
+ "bid": {
+ "id": "15da721e-940a-4db6-8621-a1f93140b21b",
+ "impid": "video1",
+ "price": 15,
+ "adid": "59082",
+ "adm": "\n \n \n GumGum Video\n \n \n \n \n \n \n \n \n \n 00:00:15\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n",
+ "cid": "3579",
+ "crid": "59082"
+ },
+ "type": "video"
+ }
+ ]
}
- ]
+]
}
\ No newline at end of file
diff --git a/adapters/gumgum/gumgumtest/supplemental/video-zero-size.json b/adapters/gumgum/gumgumtest/supplemental/video-zero-size.json
index d3d4b427120..4fc7dc3ce77 100644
--- a/adapters/gumgum/gumgumtest/supplemental/video-zero-size.json
+++ b/adapters/gumgum/gumgumtest/supplemental/video-zero-size.json
@@ -28,10 +28,80 @@
}
]
},
- "expectedMakeRequestsErrors": [
+ "httpCalls": [
{
- "value": "Invalid or missing video field(s)",
- "comparison": "literal"
+ "expectedRequest": {
+ "uri": "https://g2.gumgum.com/providers/prbds2s/bid",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "video": {
+ "mimes": [
+ "video/mp4"
+ ],
+ "minduration": 1,
+ "maxduration": 2,
+ "protocols": [
+ 1,
+ 2
+ ],
+ "w": 0,
+ "h": 0,
+ "startdelay": 1,
+ "placement": 1,
+ "linearity": 1
+ },
+ "ext": {
+ "bidder": {
+ "zone": "ggumtest"
+ }
+ }
+ }
+ ]
+ },
+ "impIDs":["test-imp-id"]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "15da721e-940a-4db6-8621-a1f93140b21b",
+ "impid": "video1",
+ "price": 15,
+ "adid": "59082",
+ "adm": "\n \n \n GumGum Video\n \n \n \n \n \n \n \n \n \n 00:00:15\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n",
+ "cid": "3579",
+ "crid": "59082"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+],
+"expectedBidResponses": [
+ {
+ "currency": "USD",
+ "bids": [
+ {
+ "bid": {
+ "id": "15da721e-940a-4db6-8621-a1f93140b21b",
+ "impid": "video1",
+ "price": 15,
+ "adid": "59082",
+ "adm": "\n \n \n GumGum Video\n \n \n \n \n \n \n \n \n \n 00:00:15\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n",
+ "cid": "3579",
+ "crid": "59082"
+ },
+ "type": "video"
+ }
+ ]
}
- ]
+]
}
\ No newline at end of file
diff --git a/adapters/melozen/melozen.go b/adapters/melozen/melozen.go
new file mode 100644
index 00000000000..cb76274865b
--- /dev/null
+++ b/adapters/melozen/melozen.go
@@ -0,0 +1,185 @@
+package melozen
+
+import (
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "strings"
+ "text/template"
+
+ "github.com/prebid/openrtb/v20/openrtb2"
+ "github.com/prebid/prebid-server/v2/adapters"
+ "github.com/prebid/prebid-server/v2/config"
+ "github.com/prebid/prebid-server/v2/errortypes"
+ "github.com/prebid/prebid-server/v2/macros"
+ "github.com/prebid/prebid-server/v2/openrtb_ext"
+)
+
+type adapter struct {
+ endpointTemplate *template.Template
+}
+
+// Builder builds a new instance of the MeloZen adapter for the given bidder with the given config.
+func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) {
+ template, err := template.New("endpointTemplate").Parse(config.Endpoint)
+ if err != nil {
+ return nil, fmt.Errorf("unable to parse endpoint url template: %v", err)
+ }
+
+ bidder := &adapter{
+ endpointTemplate: template,
+ }
+
+ return bidder, nil
+}
+
+func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) {
+ var requests []*adapters.RequestData
+ var errors []error
+ headers := http.Header{}
+ headers.Add("Content-Type", "application/json;charset=utf-8")
+ headers.Add("Accept", "application/json")
+
+ requestCopy := *request
+ for _, imp := range request.Imp {
+ // Extract Melozen Params
+ var strImpExt adapters.ExtImpBidder
+ if err := json.Unmarshal(imp.Ext, &strImpExt); err != nil {
+ errors = append(errors, err)
+ continue
+ }
+ var strImpParams openrtb_ext.ImpExtMeloZen
+ if err := json.Unmarshal(strImpExt.Bidder, &strImpParams); err != nil {
+ errors = append(errors, err)
+ continue
+ }
+
+ url, err := macros.ResolveMacros(a.endpointTemplate, macros.EndpointTemplateParams{PublisherID: strImpParams.PubId})
+ if err != nil {
+ errors = append(errors, err)
+ continue
+ }
+ // Convert Floor into USD
+ if imp.BidFloor > 0 && imp.BidFloorCur != "" && !strings.EqualFold(imp.BidFloorCur, "USD") {
+ convertedValue, err := reqInfo.ConvertCurrency(imp.BidFloor, imp.BidFloorCur, "USD")
+ if err != nil {
+ errors = append(errors, err)
+ continue
+ }
+ imp.BidFloorCur = "USD"
+ imp.BidFloor = convertedValue
+ }
+
+ impressionsByMediaType, err := splitImpressionsByMediaType(&imp)
+ if err != nil {
+ errors = append(errors, err)
+ continue
+ }
+
+ for _, impression := range impressionsByMediaType {
+ requestCopy.Imp = []openrtb2.Imp{impression}
+
+ requestJSON, err := json.Marshal(requestCopy)
+ if err != nil {
+ errors = append(errors, err)
+ continue
+ }
+
+ requestData := &adapters.RequestData{
+ Method: "POST",
+ Uri: url,
+ Body: requestJSON,
+ Headers: headers,
+ ImpIDs: openrtb_ext.GetImpIDs(requestCopy.Imp),
+ }
+ requests = append(requests, requestData)
+ }
+ }
+
+ return requests, errors
+}
+
+func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *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 bidReq openrtb2.BidRequest
+ if err := json.Unmarshal(requestData.Body, &bidReq); err != nil {
+ return nil, []error{err}
+ }
+
+ var bidResp openrtb2.BidResponse
+ if err := json.Unmarshal(response.Body, &bidResp); err != nil {
+ return nil, []error{err}
+ }
+
+ bidderResponse := adapters.NewBidderResponse()
+ var errors []error
+ for _, seatBid := range bidResp.SeatBid {
+ for i := range seatBid.Bid {
+ bid := &seatBid.Bid[i]
+ bidType, err := getMediaTypeForBid(*bid)
+ if err != nil {
+ errors = append(errors, err)
+ continue
+ }
+
+ bidderResponse.Bids = append(bidderResponse.Bids, &adapters.TypedBid{
+ BidType: bidType,
+ Bid: bid,
+ })
+ }
+ }
+ return bidderResponse, errors
+}
+
+func splitImpressionsByMediaType(impression *openrtb2.Imp) ([]openrtb2.Imp, error) {
+ if impression.Banner == nil && impression.Native == nil && impression.Video == nil {
+ return nil, &errortypes.BadInput{Message: "Invalid MediaType. MeloZen only supports Banner, Video and Native."}
+ }
+
+ impressions := make([]openrtb2.Imp, 0, 2)
+
+ if impression.Banner != nil {
+ impCopy := *impression
+ impCopy.Video = nil
+ impCopy.Native = nil
+ impressions = append(impressions, impCopy)
+ }
+
+ if impression.Video != nil {
+ impCopy := *impression
+ impCopy.Banner = nil
+ impCopy.Native = nil
+ impressions = append(impressions, impCopy)
+ }
+
+ if impression.Native != nil {
+ impCopy := *impression
+ impCopy.Banner = nil
+ impCopy.Video = nil
+ impressions = append(impressions, impCopy)
+ }
+
+ return impressions, nil
+}
+
+func getMediaTypeForBid(bid openrtb2.Bid) (openrtb_ext.BidType, error) {
+
+ if bid.Ext != nil {
+ var bidExt openrtb_ext.ExtBid
+ err := json.Unmarshal(bid.Ext, &bidExt)
+ if err == nil && bidExt.Prebid != nil {
+ return openrtb_ext.ParseBidType(string(bidExt.Prebid.Type))
+ }
+ }
+
+ return "", &errortypes.BadServerResponse{
+ Message: fmt.Sprintf("Failed to parse bid mediatype for impression \"%s\"", bid.ImpID),
+ }
+}
diff --git a/adapters/melozen/melozen_test.go b/adapters/melozen/melozen_test.go
new file mode 100644
index 00000000000..0191ab73182
--- /dev/null
+++ b/adapters/melozen/melozen_test.go
@@ -0,0 +1,30 @@
+package melozen
+
+import (
+ "testing"
+
+ "github.com/prebid/prebid-server/v2/adapters/adapterstest"
+ "github.com/prebid/prebid-server/v2/config"
+ "github.com/prebid/prebid-server/v2/openrtb_ext"
+ "github.com/stretchr/testify/assert"
+)
+
+func TestJsonSamples(t *testing.T) {
+
+ bidder, buildErr := Builder(openrtb_ext.BidderMeloZen, config.Adapter{
+ Endpoint: "https://example.com/rtb/v2/bid?publisher_id={{.PublisherID}}",
+ }, config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"})
+
+ if buildErr != nil {
+ t.Fatalf("Builder returned unexpected error %v", buildErr)
+ }
+
+ adapterstest.RunJSONBidderTest(t, "melozentest", bidder)
+}
+
+func TestEndpointTemplateMalformed(t *testing.T) {
+ _, buildErr := Builder(openrtb_ext.BidderMeloZen, config.Adapter{
+ Endpoint: "{{Malformed}}"}, config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"})
+
+ assert.Error(t, buildErr)
+}
diff --git a/adapters/melozen/melozentest/exemplary/app-banner.json b/adapters/melozen/melozentest/exemplary/app-banner.json
new file mode 100644
index 00000000000..6cdb82bf5ad
--- /dev/null
+++ b/adapters/melozen/melozentest/exemplary/app-banner.json
@@ -0,0 +1,132 @@
+{
+ "mockBidRequest": {
+ "id": "web-banner",
+ "tmax": 3000,
+ "imp": [
+ {
+ "id": "banner-imp-id",
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ },
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ }
+ }
+ ],
+ "app": {
+ "bundle": "com.fake.app",
+ "publisher": {
+ "id": "42",
+ "name": "whatever.pub"
+ }
+ },
+ "device": {
+ "w": 1200,
+ "h": 900
+ }
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://example.com/rtb/v2/bid?publisher_id=386276e072",
+ "headers": {
+ "Content-Type": ["application/json;charset=utf-8"],
+ "Accept": ["application/json"]
+ },
+ "body": {
+ "id": "web-banner",
+ "tmax": 3000,
+ "imp": [
+ {
+ "id": "banner-imp-id",
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ },
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ }
+ }
+ ],
+ "device": {
+ "w": 1200,
+ "h": 900
+ },
+ "app": {
+ "bundle": "com.fake.app",
+ "publisher": {
+ "id": "42",
+ "name": "whatever.pub"
+ }
+ }
+ },
+ "impIDs":["banner-imp-id"]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "web-banner",
+ "cur": "USD",
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "web-banner",
+ "impid": "banner-imp-id",
+ "crid": "some-creative-id",
+ "adm": "
Ad
",
+ "price": 20,
+ "w": 300,
+ "h": 250,
+ "ext": {
+ "prebid": {
+ "type": "banner"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "currency": "USD",
+ "bids": [
+ {
+ "bid": {
+ "id": "web-banner",
+ "impid": "banner-imp-id",
+ "crid": "some-creative-id",
+ "adm": "Ad
",
+ "price": 20,
+ "w": 300,
+ "h": 250,
+ "ext": {
+ "prebid": {
+ "type": "banner"
+ }
+ }
+ },
+ "type": "banner"
+ }
+ ]
+ }
+ ]
+ }
+
\ No newline at end of file
diff --git a/adapters/melozen/melozentest/exemplary/app-native.json b/adapters/melozen/melozentest/exemplary/app-native.json
new file mode 100644
index 00000000000..f93abd44bea
--- /dev/null
+++ b/adapters/melozen/melozentest/exemplary/app-native.json
@@ -0,0 +1,100 @@
+{
+ "mockBidRequest": {
+ "id": "web-native",
+ "imp": [
+ {
+ "id": "native-imp-id",
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ },
+ "native": {
+ "ver": "1.2",
+ "request": "placeholder request"
+ }
+ }
+ ]
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://example.com/rtb/v2/bid?publisher_id=386276e072",
+ "headers": {
+ "Content-Type": ["application/json;charset=utf-8"],
+ "Accept": ["application/json"]
+ },
+ "body": {
+ "id": "web-native",
+ "imp": [
+ {
+ "id": "native-imp-id",
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ },
+ "native": {
+ "ver": "1.2",
+ "request": "placeholder request"
+ }
+ }
+ ]
+ },
+ "impIDs":["native-imp-id"]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "web-native",
+ "cur": "USD",
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "web-native",
+ "impid": "native-imp-id",
+ "crid": "some-creative-id",
+ "adm": "Ad
",
+ "price": 20,
+ "w": 300,
+ "h": 250,
+ "ext": {
+ "prebid": {
+ "type": "native"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "currency": "USD",
+ "bids": [
+ {
+ "bid": {
+ "id": "web-native",
+ "impid": "native-imp-id",
+ "crid": "some-creative-id",
+ "adm": "Ad
",
+ "price": 20,
+ "w": 300,
+ "h": 250,
+ "ext": {
+ "prebid": {
+ "type": "native"
+ }
+ }
+ },
+ "type": "native"
+ }
+ ]
+ }
+ ]
+ }
+
\ No newline at end of file
diff --git a/adapters/melozen/melozentest/exemplary/app-video.json b/adapters/melozen/melozentest/exemplary/app-video.json
new file mode 100644
index 00000000000..3d913c43e44
--- /dev/null
+++ b/adapters/melozen/melozentest/exemplary/app-video.json
@@ -0,0 +1,137 @@
+{
+ "mockBidRequest": {
+ "id": "app-video",
+ "tmax": 3000,
+ "imp": [
+ {
+ "id": "video-imp-id",
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ },
+ "video": {
+ "w": 640,
+ "h": 480,
+ "mimes": [
+ "video/mp4"
+ ],
+ "placement": 1
+ }
+ }
+ ],
+ "app": {
+ "bundle": "com.fake.app",
+ "publisher": {
+ "id": "42",
+ "name": "whatever.pub"
+ }
+ },
+ "device": {
+ "w": 1200,
+ "h": 900
+ }
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://example.com/rtb/v2/bid?publisher_id=386276e072",
+ "headers": {
+ "Content-Type": [
+ "application/json;charset=utf-8"
+ ],
+ "Accept": [
+ "application/json"
+ ]
+ },
+ "body": {
+ "id": "app-video",
+ "tmax": 3000,
+ "imp": [
+ {
+ "id": "video-imp-id",
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ },
+ "video": {
+ "w": 640,
+ "h": 480,
+ "mimes": [
+ "video/mp4"
+ ],
+ "placement": 1
+ }
+ }
+ ],
+ "app": {
+ "bundle": "com.fake.app",
+ "publisher": {
+ "id": "42",
+ "name": "whatever.pub"
+ }
+ },
+ "device": {
+ "w": 1200,
+ "h": 900
+ }
+ },
+ "impIDs": [
+ "video-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "app-video",
+ "cur": "USD",
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "app-video",
+ "impid": "video-imp-id",
+ "crid": "some-creative-id",
+ "adm": "TAG",
+ "price": 20,
+ "w": 640,
+ "h": 480,
+ "ext": {
+ "prebid": {
+ "type": "video"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "currency": "USD",
+ "bids": [
+ {
+ "bid": {
+ "id": "app-video",
+ "impid": "video-imp-id",
+ "crid": "some-creative-id",
+ "adm": "TAG",
+ "price": 20,
+ "w": 640,
+ "h": 480,
+ "ext": {
+ "prebid": {
+ "type": "video"
+ }
+ }
+ },
+ "type": "video"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/adapters/melozen/melozentest/exemplary/multi-imps.json b/adapters/melozen/melozentest/exemplary/multi-imps.json
new file mode 100644
index 00000000000..916c74cb685
--- /dev/null
+++ b/adapters/melozen/melozentest/exemplary/multi-imps.json
@@ -0,0 +1,239 @@
+{
+ "mockBidRequest": {
+ "id": "web-banner",
+ "tmax": 3000,
+ "imp": [
+ {
+ "id": "banner-imp-id-1",
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ },
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ }
+ },
+ {
+ "id": "banner-imp-id-2",
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ },
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ }
+ }
+ ],
+ "site": {
+ "publisher": {
+ "id": "1"
+ },
+ "page": "https://some-site.com",
+ "ref": "https://some-site.com"
+ },
+ "device": {
+ "w": 1200,
+ "h": 900
+ }
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://example.com/rtb/v2/bid?publisher_id=386276e072",
+ "headers": {
+ "Content-Type": ["application/json;charset=utf-8"],
+ "Accept": ["application/json"]
+ },
+ "body": {
+ "id": "web-banner",
+ "tmax": 3000,
+ "imp": [
+ {
+ "id": "banner-imp-id-1",
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ },
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ }
+ }
+ ],
+ "site": {
+ "publisher": {
+ "id": "1"
+ },
+ "page": "https://some-site.com",
+ "ref": "https://some-site.com"
+ },
+ "device": {
+ "w": 1200,
+ "h": 900
+ }
+ },
+ "impIDs":["banner-imp-id-1"]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "web-banner",
+ "cur": "USD",
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "web-banner",
+ "impid": "banner-imp-id-1",
+ "crid": "some-creative-id",
+ "adm": "Ad
",
+ "price": 20,
+ "w": 300,
+ "h": 250,
+ "ext": {
+ "prebid": {
+ "type": "banner"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+ {
+ "expectedRequest": {
+ "uri": "https://example.com/rtb/v2/bid?publisher_id=386276e072",
+ "headers": {
+ "Content-Type": ["application/json;charset=utf-8"],
+ "Accept": ["application/json"]
+ },
+ "body": {
+ "id": "web-banner",
+ "tmax": 3000,
+ "imp": [
+ {
+ "id": "banner-imp-id-2",
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ },
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ }
+ }
+ ],
+ "site": {
+ "publisher": {
+ "id": "1"
+ },
+ "page": "https://some-site.com",
+ "ref": "https://some-site.com"
+ },
+ "device": {
+ "w": 1200,
+ "h": 900
+ }
+ },
+ "impIDs":["banner-imp-id-2"]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "web-banner",
+ "cur": "USD",
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "web-banner",
+ "impid": "banner-imp-id-2",
+ "crid": "some-creative-id",
+ "adm": "Ad
",
+ "price": 20,
+ "w": 300,
+ "h": 600,
+ "ext": {
+ "prebid": {
+ "type": "banner"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "currency": "USD",
+ "bids": [
+ {
+ "bid": {
+ "id": "web-banner",
+ "impid": "banner-imp-id-1",
+ "crid": "some-creative-id",
+ "adm": "Ad
",
+ "price": 20,
+ "w": 300,
+ "h": 250,
+ "ext": {
+ "prebid": {
+ "type": "banner"
+ }
+ }
+ },
+ "type": "banner"
+ }
+ ]
+ },
+ {
+ "currency": "USD",
+ "bids": [
+ {
+ "bid": {
+ "id": "web-banner",
+ "impid": "banner-imp-id-2",
+ "crid": "some-creative-id",
+ "adm": "Ad
",
+ "price": 20,
+ "w": 300,
+ "h": 600,
+ "ext": {
+ "prebid": {
+ "type": "banner"
+ }
+ }
+ },
+ "type": "banner"
+ }
+ ]
+ }
+ ]
+}
diff --git a/adapters/melozen/melozentest/exemplary/web-banner.json b/adapters/melozen/melozentest/exemplary/web-banner.json
new file mode 100644
index 00000000000..0439baa1033
--- /dev/null
+++ b/adapters/melozen/melozentest/exemplary/web-banner.json
@@ -0,0 +1,138 @@
+{
+ "mockBidRequest": {
+ "id": "web-banner",
+ "tmax": 3000,
+ "imp": [
+ {
+ "id": "baner-imp-id",
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ },
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ }
+ }
+ ],
+ "test": 0,
+ "site": {
+ "publisher": {
+ "id": "1"
+ },
+ "page": "https://some-site.com",
+ "ref": "https://some-site.com"
+ },
+ "device": {
+ "w": 1200,
+ "h": 900
+ }
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://example.com/rtb/v2/bid?publisher_id=386276e072",
+ "headers": {
+ "Content-Type": [
+ "application/json;charset=utf-8"
+ ],
+ "Accept": [
+ "application/json"
+ ]
+ },
+ "body": {
+ "id": "web-banner",
+ "tmax": 3000,
+ "imp": [
+ {
+ "id": "baner-imp-id",
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ },
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ }
+ }
+ ],
+ "site": {
+ "publisher": {
+ "id": "1"
+ },
+ "page": "https://some-site.com",
+ "ref": "https://some-site.com"
+ },
+ "device": {
+ "w": 1200,
+ "h": 900
+ }
+ },
+ "impIDs": [
+ "baner-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "web-banner",
+ "cur": "USD",
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "web-banner",
+ "impid": "baner-imp-id",
+ "crid": "some-creative-id",
+ "adm": "Ad
",
+ "price": 20,
+ "w": 300,
+ "h": 250,
+ "ext": {
+ "prebid": {
+ "type": "banner"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "currency": "USD",
+ "bids": [
+ {
+ "bid": {
+ "id": "web-banner",
+ "impid": "baner-imp-id",
+ "crid": "some-creative-id",
+ "adm": "Ad
",
+ "price": 20,
+ "w": 300,
+ "h": 250,
+ "ext": {
+ "prebid": {
+ "type": "banner"
+ }
+ }
+ },
+ "type": "banner"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/adapters/melozen/melozentest/exemplary/web-video.json b/adapters/melozen/melozentest/exemplary/web-video.json
new file mode 100644
index 00000000000..b4f179bdc55
--- /dev/null
+++ b/adapters/melozen/melozentest/exemplary/web-video.json
@@ -0,0 +1,129 @@
+{
+ "mockBidRequest": {
+ "id": "web-video",
+ "tmax": 3000,
+ "imp": [
+ {
+ "id": "video-imp-id",
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ },
+ "video": {
+ "w": 640,
+ "h": 480,
+ "mimes": ["video/mp4"],
+ "placement": 1
+ }
+ }
+ ],
+ "test": 0,
+ "site": {
+ "publisher": {
+ "id": "1"
+ },
+ "page": "https://some-site.com",
+ "ref": "https://some-site.com"
+ },
+ "device": {
+ "w": 1200,
+ "h": 900
+ }
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://example.com/rtb/v2/bid?publisher_id=386276e072",
+ "headers": {
+ "Content-Type": ["application/json;charset=utf-8"],
+ "Accept": ["application/json"]
+ },
+ "body": {
+ "id": "web-video",
+ "tmax": 3000,
+ "imp": [
+ {
+ "id": "video-imp-id",
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ },
+ "video": {
+ "w": 640,
+ "h": 480,
+ "mimes": ["video/mp4"],
+ "placement": 1
+ }
+ }
+ ],
+ "site": {
+ "publisher": {
+ "id": "1"
+ },
+ "page": "https://some-site.com",
+ "ref": "https://some-site.com"
+ },
+ "device": {
+ "w": 1200,
+ "h": 900
+ }
+ },
+ "impIDs":["video-imp-id"]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "web-video",
+ "cur": "USD",
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "web-video",
+ "impid": "video-imp-id",
+ "crid": "some-creative-id",
+ "adm": "TAG",
+ "price": 20,
+ "w": 640,
+ "h": 480,
+ "ext": {
+ "prebid": {
+ "type": "video"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "currency": "USD",
+ "bids": [
+ {
+ "bid": {
+ "id": "web-video",
+ "impid": "video-imp-id",
+ "crid": "some-creative-id",
+ "adm": "TAG",
+ "price": 20,
+ "w": 640,
+ "h": 480,
+ "ext": {
+ "prebid": {
+ "type": "video"
+ }
+ }
+ },
+ "type": "video"
+ }
+ ]
+ }
+ ]
+ }
+
\ No newline at end of file
diff --git a/adapters/melozen/melozentest/supplemental/bad-media-type-request.json b/adapters/melozen/melozentest/supplemental/bad-media-type-request.json
new file mode 100644
index 00000000000..f6c17a70b8f
--- /dev/null
+++ b/adapters/melozen/melozentest/supplemental/bad-media-type-request.json
@@ -0,0 +1,28 @@
+{
+ "mockBidRequest": {
+ "id": "unsupported-request",
+ "imp": [
+ {
+ "id": "unsupported-imp",
+ "unupported": {
+ },
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ }
+ }
+ ],
+ "site": {
+ "id": "siteID"
+ }
+ },
+
+ "expectedMakeRequestsErrors": [
+ {
+ "value": "Invalid MediaType. MeloZen only supports Banner, Video and Native.",
+ "comparison": "literal"
+ }
+ ]
+ }
+
\ No newline at end of file
diff --git a/adapters/melozen/melozentest/supplemental/no-fill.json b/adapters/melozen/melozentest/supplemental/no-fill.json
new file mode 100644
index 00000000000..7dd600a72b6
--- /dev/null
+++ b/adapters/melozen/melozentest/supplemental/no-fill.json
@@ -0,0 +1,90 @@
+{
+ "mockBidRequest": {
+ "id": "web-banner",
+ "tmax": 3000,
+ "imp": [
+ {
+ "id": "banner-imp-id",
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ },
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ }
+ }
+ ],
+ "app": {
+ "bundle": "com.fake.app",
+ "publisher": {
+ "id": "42",
+ "name": "whatever.pub"
+ }
+ },
+ "device": {
+ "w": 1200,
+ "h": 900
+ }
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://example.com/rtb/v2/bid?publisher_id=386276e072",
+ "headers": {
+ "Content-Type": [
+ "application/json;charset=utf-8"
+ ],
+ "Accept": [
+ "application/json"
+ ]
+ },
+ "body": {
+ "id": "web-banner",
+ "tmax": 3000,
+ "imp": [
+ {
+ "id": "banner-imp-id",
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ },
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ }
+ }
+ ],
+ "device": {
+ "w": 1200,
+ "h": 900
+ },
+ "app": {
+ "bundle": "com.fake.app",
+ "publisher": {
+ "id": "42",
+ "name": "whatever.pub"
+ }
+ }
+ },
+ "impIDs": [
+ "banner-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 204
+ }
+ }
+ ],
+ "expectedMakeBidsErrors": []
+}
\ No newline at end of file
diff --git a/adapters/melozen/melozentest/supplemental/response-status-400.json b/adapters/melozen/melozentest/supplemental/response-status-400.json
new file mode 100644
index 00000000000..969875b86ec
--- /dev/null
+++ b/adapters/melozen/melozentest/supplemental/response-status-400.json
@@ -0,0 +1,95 @@
+{
+ "mockBidRequest": {
+ "id": "web-banner",
+ "tmax": 3000,
+ "imp": [
+ {
+ "id": "banner-imp-id",
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ },
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ }
+ }
+ ],
+ "app": {
+ "bundle": "com.fake.app",
+ "publisher": {
+ "id": "42",
+ "name": "whatever.pub"
+ }
+ },
+ "device": {
+ "w": 1200,
+ "h": 900
+ }
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://example.com/rtb/v2/bid?publisher_id=386276e072",
+ "headers": {
+ "Content-Type": [
+ "application/json;charset=utf-8"
+ ],
+ "Accept": [
+ "application/json"
+ ]
+ },
+ "body": {
+ "id": "web-banner",
+ "tmax": 3000,
+ "imp": [
+ {
+ "id": "banner-imp-id",
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ },
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ }
+ }
+ ],
+ "device": {
+ "w": 1200,
+ "h": 900
+ },
+ "app": {
+ "bundle": "com.fake.app",
+ "publisher": {
+ "id": "42",
+ "name": "whatever.pub"
+ }
+ }
+ },
+ "impIDs": [
+ "banner-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 400
+ }
+ }
+ ],
+ "expectedMakeBidsErrors": [
+ {
+ "value": "Unexpected status code: 400. Run with request.debug = 1 for more info",
+ "comparison": "literal"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/adapters/melozen/melozentest/supplemental/response-status-not-200.json b/adapters/melozen/melozentest/supplemental/response-status-not-200.json
new file mode 100644
index 00000000000..9b26ee58091
--- /dev/null
+++ b/adapters/melozen/melozentest/supplemental/response-status-not-200.json
@@ -0,0 +1,84 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ },
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ }
+ }
+ ],
+ "app": {
+ "id": "1",
+ "bundle": "com.test.testapplication"
+ },
+ "device": {
+ "ip": "123.123.123.123",
+ "ifa": "sdjfksdf-dfsds-dsdg-dsgg"
+ }
+ },
+ "httpCalls": [{
+ "expectedRequest": {
+ "uri": "https://example.com/rtb/v2/bid?publisher_id=386276e072",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ },
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ }
+ }
+ ],
+ "app": {
+ "id": "1",
+ "bundle": "com.test.testapplication"
+ },
+ "device": {
+ "ip": "123.123.123.123",
+ "ifa": "sdjfksdf-dfsds-dsdg-dsgg"
+ }
+ },
+ "impIDs":["test-imp-id"]
+ },
+ "mockResponse": {
+ "status": 404,
+ "body": {}
+ }
+ }],
+ "expectedMakeBidsErrors": [
+ {
+ "value": "Unexpected status code: 404. Run with request.debug = 1 for more info",
+ "comparison": "literal"
+ }
+ ]
+}
diff --git a/adapters/melozen/melozentest/supplemental/wrong-bid-ext.json b/adapters/melozen/melozentest/supplemental/wrong-bid-ext.json
new file mode 100644
index 00000000000..b6a1c1f7268
--- /dev/null
+++ b/adapters/melozen/melozentest/supplemental/wrong-bid-ext.json
@@ -0,0 +1,85 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "video": {
+ "w": 900,
+ "h": 250,
+ "mimes": [
+ "video/x-flv",
+ "video/mp4"
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ }
+ }
+ ]
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://example.com/rtb/v2/bid?publisher_id=386276e072",
+ "headers": {
+ "Content-Type": ["application/json;charset=utf-8"],
+ "Accept": ["application/json"]
+ },
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "video": {
+ "w": 900,
+ "h": 250,
+ "mimes": [
+ "video/x-flv",
+ "video/mp4"
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "pubId": "386276e072"
+ }
+ }
+ }
+ ]
+ },
+ "impIDs": [
+ "test-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "test-request-id",
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "test-bid-id",
+ "impid": "another-imp-id",
+ "price": 3.5,
+ "w": 900,
+ "h": 250,
+ "ext": {}
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [{"currency":"USD","bids":[]}],
+ "expectedMakeBidsErrors": [
+ {
+ "value": "Failed to parse bid mediatype for impression \"another-imp-id\"",
+ "comparison": "regex"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/adapters/melozen/params_test.go b/adapters/melozen/params_test.go
new file mode 100644
index 00000000000..7e1be7f0db0
--- /dev/null
+++ b/adapters/melozen/params_test.go
@@ -0,0 +1,50 @@
+package melozen
+
+import (
+ "encoding/json"
+ "testing"
+
+ "github.com/prebid/prebid-server/v2/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 schema. %v", err)
+ }
+
+ for _, p := range validParams {
+ if err := validator.Validate(openrtb_ext.BidderMeloZen, json.RawMessage(p)); err != nil {
+ t.Errorf("Schema rejected valid params: %s", p)
+ }
+ }
+}
+
+func TestInvalidParams(t *testing.T) {
+ validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params")
+ if err != nil {
+ t.Fatalf("Failed to fetch the JSON schema. %v", err)
+ }
+
+ for _, p := range invalidParams {
+ if err := validator.Validate(openrtb_ext.BidderMeloZen, json.RawMessage(p)); err == nil {
+ t.Errorf("Schema allowed invalid params: %s", p)
+ }
+ }
+}
+
+var validParams = []string{
+ `{"pubId": "12345"}`,
+}
+
+var invalidParams = []string{
+ ``,
+ `null`,
+ `true`,
+ `5`,
+ `4.2`,
+ `[]`,
+ `{}`,
+ `{"pubId": ""}`,
+ `{"pubId": 12345}`,
+}
diff --git a/adapters/ownadx/ownadx.go b/adapters/ownadx/ownadx.go
index 5c54b395ddc..59bc0b68fab 100644
--- a/adapters/ownadx/ownadx.go
+++ b/adapters/ownadx/ownadx.go
@@ -56,9 +56,9 @@ func createBidRequest(rtbBidRequest *openrtb2.BidRequest, imps []openrtb2.Imp) *
}
func (adapter *adapter) buildEndpointURL(params *openrtb_ext.ExtImpOwnAdx) (string, error) {
endpointParams := macros.EndpointTemplateParams{
- ZoneID: params.SspId,
- AccountID: params.SeatId,
- SourceId: params.TokenId,
+ SspID: params.SspId, // Macro
+ SeatID: params.SeatId,
+ TokenID: params.TokenId,
}
return macros.ResolveMacros(adapter.endpoint, endpointParams)
}
@@ -124,6 +124,7 @@ func groupImpsByExt(imps []openrtb2.Imp) (map[openrtb_ext.ExtImpOwnAdx][]openrtb
}
func (adapter *adapter) MakeBids(internalRequest *openrtb2.BidRequest, externalRequest *adapters.RequestData, response *adapters.ResponseData) (*adapters.BidderResponse, []error) {
+
if response.StatusCode == http.StatusNoContent {
return nil, nil
}
@@ -159,6 +160,7 @@ func (adapter *adapter) MakeBids(internalRequest *openrtb2.BidRequest, externalR
seatBid := bidResp.SeatBid[0]
bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(bidResp.SeatBid[0].Bid))
+
if len(seatBid.Bid) == 0 {
return nil, []error{
&errortypes.BadServerResponse{
@@ -169,7 +171,6 @@ func (adapter *adapter) MakeBids(internalRequest *openrtb2.BidRequest, externalR
for i := 0; i < len(seatBid.Bid); i++ {
var bidType openrtb_ext.BidType
bid := seatBid.Bid[i]
-
bidType, err := getMediaType(bid)
if err != nil {
return nil, []error{&errortypes.BadServerResponse{
diff --git a/adapters/ownadx/ownadx_test.go b/adapters/ownadx/ownadx_test.go
index 07dc928b9b0..5995cdd10a7 100644
--- a/adapters/ownadx/ownadx_test.go
+++ b/adapters/ownadx/ownadx_test.go
@@ -11,7 +11,7 @@ import (
func TestJsonSamples(t *testing.T) {
bidder, buildErr := Builder(openrtb_ext.BidderOwnAdx, config.Adapter{
- Endpoint: "https://pbs.prebid-ownadx.com/bidder/bid/{{.AccountID}}/{{.ZoneID}}?token={{.SourceId}}"}, config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"})
+ Endpoint: "https://pbs.prebid-ownadx.com/bidder/bid/{{.SeatID}}/{{.SspID}}?token={{.TokenID}}"}, config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"})
assert.NoError(t, buildErr)
adapterstest.RunJSONBidderTest(t, "ownadxtest", bidder)
diff --git a/adapters/pubrise/params_test.go b/adapters/pubrise/params_test.go
new file mode 100644
index 00000000000..df5d38fd02e
--- /dev/null
+++ b/adapters/pubrise/params_test.go
@@ -0,0 +1,47 @@
+package pubrise
+
+import (
+ "encoding/json"
+ "testing"
+
+ "github.com/prebid/prebid-server/v2/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 schema. %v", err)
+ }
+
+ for _, p := range validParams {
+ if err := validator.Validate(openrtb_ext.BidderPubrise, json.RawMessage(p)); err != nil {
+ t.Errorf("Schema rejected valid params: %s", p)
+ }
+ }
+}
+
+func TestInvalidParams(t *testing.T) {
+ validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params")
+ if err != nil {
+ t.Fatalf("Failed to fetch the json schema. %v", err)
+ }
+
+ for _, p := range invalidParams {
+ if err := validator.Validate(openrtb_ext.BidderPubrise, json.RawMessage(p)); err == nil {
+ t.Errorf("Schema allowed invalid params: %s", p)
+ }
+ }
+}
+
+var validParams = []string{
+ `{"placementId": "test"}`,
+ `{"placementId": "1"}`,
+ `{"endpointId": "test"}`,
+ `{"endpointId": "1"}`,
+}
+
+var invalidParams = []string{
+ `{"placementId": 42}`,
+ `{"endpointId": 42}`,
+ `{"placementId": "1", "endpointId": "1"}`,
+}
diff --git a/adapters/pubrise/pubrise.go b/adapters/pubrise/pubrise.go
new file mode 100644
index 00000000000..9d71f2e1439
--- /dev/null
+++ b/adapters/pubrise/pubrise.go
@@ -0,0 +1,159 @@
+package pubrise
+
+import (
+ "encoding/json"
+ "errors"
+ "fmt"
+ "net/http"
+
+ "github.com/prebid/openrtb/v20/openrtb2"
+ "github.com/prebid/prebid-server/v2/adapters"
+ "github.com/prebid/prebid-server/v2/config"
+ "github.com/prebid/prebid-server/v2/openrtb_ext"
+)
+
+type adapter struct {
+ endpoint string
+}
+
+type reqBodyExt struct {
+ PubriseBidderExt reqBodyExtBidder `json:"bidder"`
+}
+
+type reqBodyExtBidder struct {
+ Type string `json:"type"`
+ PlacementID string `json:"placementId,omitempty"`
+ EndpointID string `json:"endpointId,omitempty"`
+}
+
+func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) {
+ bidder := &adapter{
+ endpoint: config.Endpoint,
+ }
+ return bidder, nil
+}
+
+func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) {
+ var errs []error
+ var adapterRequests []*adapters.RequestData
+
+ reqCopy := *request
+ for _, imp := range request.Imp {
+ reqCopy.Imp = []openrtb2.Imp{imp}
+
+ var bidderExt adapters.ExtImpBidder
+ var pubriseExt openrtb_ext.ImpExtPubrise
+
+ if err := json.Unmarshal(imp.Ext, &bidderExt); err != nil {
+ errs = append(errs, err)
+ continue
+ }
+ if err := json.Unmarshal(bidderExt.Bidder, &pubriseExt); err != nil {
+ errs = append(errs, err)
+ continue
+ }
+
+ impExt := reqBodyExt{PubriseBidderExt: reqBodyExtBidder{}}
+
+ if pubriseExt.PlacementID != "" {
+ impExt.PubriseBidderExt.PlacementID = pubriseExt.PlacementID
+ impExt.PubriseBidderExt.Type = "publisher"
+ } else if pubriseExt.EndpointID != "" {
+ impExt.PubriseBidderExt.EndpointID = pubriseExt.EndpointID
+ impExt.PubriseBidderExt.Type = "network"
+ }
+
+ finalyImpExt, err := json.Marshal(impExt)
+ if err != nil {
+ errs = append(errs, err)
+ continue
+ }
+
+ reqCopy.Imp[0].Ext = finalyImpExt
+
+ adapterReq, err := a.makeRequest(&reqCopy)
+ if err != nil {
+ errs = append(errs, err)
+ continue
+ }
+
+ if adapterReq != nil {
+ adapterRequests = append(adapterRequests, adapterReq)
+ }
+ }
+
+ if len(adapterRequests) == 0 {
+ errs = append(errs, errors.New("found no valid impressions"))
+ return nil, errs
+ }
+
+ return adapterRequests, nil
+}
+
+func (a *adapter) makeRequest(request *openrtb2.BidRequest) (*adapters.RequestData, error) {
+ reqJSON, err := json.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")
+ return &adapters.RequestData{
+ Method: "POST",
+ Uri: a.endpoint,
+ Body: reqJSON,
+ Headers: headers,
+ ImpIDs: openrtb_ext.GetImpIDs(request.Imp),
+ }, nil
+}
+
+func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) {
+ if adapters.IsResponseStatusCodeNoContent(responseData) {
+ return nil, nil
+ }
+
+ if err := adapters.CheckResponseStatusCodeForErrors(responseData); err != nil {
+ return nil, []error{err}
+ }
+
+ var response openrtb2.BidResponse
+ if err := json.Unmarshal(responseData.Body, &response); err != nil {
+ return nil, []error{err}
+ }
+
+ bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp))
+ if len(response.Cur) != 0 {
+ bidResponse.Currency = response.Cur
+ }
+
+ for _, seatBid := range response.SeatBid {
+ for i := range seatBid.Bid {
+ bidType, err := getBidType(seatBid.Bid[i])
+ if err != nil {
+ return nil, []error{err}
+ }
+
+ b := &adapters.TypedBid{
+ Bid: &seatBid.Bid[i],
+ BidType: bidType,
+ }
+ bidResponse.Bids = append(bidResponse.Bids, b)
+ }
+ }
+ return bidResponse, nil
+}
+
+func getBidType(bid openrtb2.Bid) (openrtb_ext.BidType, error) {
+ // determinate media type by bid response field mtype
+ switch bid.MType {
+ case openrtb2.MarkupBanner:
+ return openrtb_ext.BidTypeBanner, nil
+ case openrtb2.MarkupVideo:
+ return openrtb_ext.BidTypeVideo, nil
+ case openrtb2.MarkupNative:
+ return openrtb_ext.BidTypeNative, nil
+ }
+
+ return "", fmt.Errorf("could not define media type for impression: %s", bid.ImpID)
+}
diff --git a/adapters/pubrise/pubrise_test.go b/adapters/pubrise/pubrise_test.go
new file mode 100644
index 00000000000..a50878c339e
--- /dev/null
+++ b/adapters/pubrise/pubrise_test.go
@@ -0,0 +1,20 @@
+package pubrise
+
+import (
+ "testing"
+
+ "github.com/prebid/prebid-server/v2/adapters/adapterstest"
+ "github.com/prebid/prebid-server/v2/config"
+ "github.com/prebid/prebid-server/v2/openrtb_ext"
+)
+
+func TestJsonSamples(t *testing.T) {
+ bidder, buildErr := Builder(openrtb_ext.BidderEmtv, config.Adapter{
+ Endpoint: "https://backend.pubrise.ai/pserver"}, config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"})
+
+ if buildErr != nil {
+ t.Fatalf("Builder returned unexpected error %v", buildErr)
+ }
+
+ adapterstest.RunJSONBidderTest(t, "pubrisetest", bidder)
+}
diff --git a/adapters/pubrise/pubrisetest/exemplary/endpointId.json b/adapters/pubrise/pubrisetest/exemplary/endpointId.json
new file mode 100644
index 00000000000..3766c7a3ef4
--- /dev/null
+++ b/adapters/pubrise/pubrisetest/exemplary/endpointId.json
@@ -0,0 +1,136 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "device": {
+ "ip": "123.123.123.123",
+ "ua": "iPad"
+ },
+ "app": {
+ "id": "1",
+ "bundle": "com.wls.testwlsapplication"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "tagid": "test",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ },
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "endpointId": "test"
+ }
+ }
+ }
+ ]
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://backend.pubrise.ai/pserver",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "tagid": "test",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ },
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "endpointId": "test",
+ "type": "network"
+ }
+ }
+ }
+ ],
+ "app": {
+ "id": "1",
+ "bundle": "com.wls.testwlsapplication"
+ },
+ "device": {
+ "ip": "123.123.123.123",
+ "ua": "iPad"
+ }
+ },
+ "impIDs":["test-imp-id"]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "test-request-id",
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "test_bid_id",
+ "impid": "test-imp-id",
+ "price": 0.27543,
+ "adm": "",
+ "cid": "test_cid",
+ "crid": "test_crid",
+ "dealid": "test_dealid",
+ "mtype": 1,
+ "w": 300,
+ "h": 250,
+ "ext": {
+ "prebid": {
+ "type": "banner"
+ }
+ }
+ }
+ ],
+ "seat": "pubrise"
+ }
+ ],
+ "cur": "USD"
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "bids": [
+ {
+ "bid": {
+ "id": "test_bid_id",
+ "impid": "test-imp-id",
+ "price": 0.27543,
+ "adm": "",
+ "cid": "test_cid",
+ "crid": "test_crid",
+ "dealid": "test_dealid",
+ "mtype": 1,
+ "w": 300,
+ "h": 250,
+ "ext": {
+ "prebid": {
+ "type": "banner"
+ }
+ }
+ },
+ "type": "banner"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/adapters/pubrise/pubrisetest/exemplary/multi-format.json b/adapters/pubrise/pubrisetest/exemplary/multi-format.json
new file mode 100644
index 00000000000..9e5c2ef2c57
--- /dev/null
+++ b/adapters/pubrise/pubrisetest/exemplary/multi-format.json
@@ -0,0 +1,105 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "device": {
+ "ip": "123.123.123.123",
+ "ua": "iPad"
+ },
+ "app": {
+ "id": "1",
+ "bundle": "com.wls.testwlsapplication"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "tagid": "test",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ },
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ },
+ "video": {
+ "mimes": [
+ "video/mp4"
+ ],
+ "protocols": [
+ 2,
+ 5
+ ],
+ "w": 1024,
+ "h": 576
+ },
+ "ext": {
+ "bidder": {
+ "endpointId": "test"
+ }
+ }
+ }
+ ]
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://backend.pubrise.ai/pserver",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "tagid": "test",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ },
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ },
+ "video": {
+ "mimes": [
+ "video/mp4"
+ ],
+ "protocols": [
+ 2,
+ 5
+ ],
+ "w": 1024,
+ "h": 576
+ },
+ "ext": {
+ "bidder": {
+ "endpointId": "test",
+ "type": "network"
+ }
+ }
+ }
+ ],
+ "app": {
+ "id": "1",
+ "bundle": "com.wls.testwlsapplication"
+ },
+ "device": {
+ "ip": "123.123.123.123",
+ "ua": "iPad"
+ }
+ },
+ "impIDs":["test-imp-id"]
+ },
+ "mockResponse": {
+ "status": 204
+ }
+ }
+ ],
+ "expectedBidResponses": []
+}
\ No newline at end of file
diff --git a/adapters/pubrise/pubrisetest/exemplary/multi-imp.json b/adapters/pubrise/pubrisetest/exemplary/multi-imp.json
new file mode 100644
index 00000000000..d922113a512
--- /dev/null
+++ b/adapters/pubrise/pubrisetest/exemplary/multi-imp.json
@@ -0,0 +1,253 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "device": {
+ "ip": "123.123.123.123",
+ "ua": "iPad"
+ },
+ "app": {
+ "id": "1",
+ "bundle": "com.wls.testwlsapplication"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "tagid": "test",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ },
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "endpointId": "test"
+ }
+ }
+ },
+ {
+ "id": "test-imp-id",
+ "tagid": "test",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ },
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "endpointId": "test"
+ }
+ }
+ }
+ ]
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://backend.pubrise.ai/pserver",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "tagid": "test",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ },
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "endpointId": "test",
+ "type": "network"
+ }
+ }
+ }
+ ],
+ "app": {
+ "id": "1",
+ "bundle": "com.wls.testwlsapplication"
+ },
+ "device": {
+ "ip": "123.123.123.123",
+ "ua": "iPad"
+ }
+ },
+ "impIDs":["test-imp-id"]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "test-request-id",
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "test_bid_id",
+ "impid": "test-imp-id",
+ "price": 0.27543,
+ "adm": "",
+ "cid": "test_cid",
+ "crid": "test_crid",
+ "dealid": "test_dealid",
+ "mtype": 1,
+ "w": 300,
+ "h": 250,
+ "ext": {
+ "prebid": {
+ "type": "banner"
+ }
+ }
+ }
+ ],
+ "seat": "pubrise"
+ }
+ ],
+ "cur": "USD"
+ }
+ }
+ },
+ {
+ "expectedRequest": {
+ "uri": "https://backend.pubrise.ai/pserver",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "tagid": "test",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ },
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "endpointId": "test",
+ "type": "network"
+ }
+ }
+ }
+ ],
+ "app": {
+ "id": "1",
+ "bundle": "com.wls.testwlsapplication"
+ },
+ "device": {
+ "ip": "123.123.123.123",
+ "ua": "iPad"
+ }
+ },
+ "impIDs":["test-imp-id"]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "test-request-id",
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "test_bid_id",
+ "impid": "test-imp-id",
+ "price": 0.27543,
+ "adm": "",
+ "cid": "test_cid",
+ "crid": "test_crid",
+ "dealid": "test_dealid",
+ "mtype": 1,
+ "w": 300,
+ "h": 250,
+ "ext": {
+ "prebid": {
+ "type": "banner"
+ }
+ }
+ }
+ ],
+ "seat": "pubrise"
+ }
+ ],
+ "cur": "USD"
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "bids": [
+ {
+ "bid": {
+ "id": "test_bid_id",
+ "impid": "test-imp-id",
+ "price": 0.27543,
+ "adm": "",
+ "cid": "test_cid",
+ "crid": "test_crid",
+ "dealid": "test_dealid",
+ "mtype": 1,
+ "w": 300,
+ "h": 250,
+ "ext": {
+ "prebid": {
+ "type": "banner"
+ }
+ }
+ },
+ "type": "banner"
+ }
+ ]
+ },
+ {
+ "bids": [
+ {
+ "bid": {
+ "id": "test_bid_id",
+ "impid": "test-imp-id",
+ "price": 0.27543,
+ "adm": "",
+ "cid": "test_cid",
+ "crid": "test_crid",
+ "dealid": "test_dealid",
+ "mtype": 1,
+ "w": 300,
+ "h": 250,
+ "ext": {
+ "prebid": {
+ "type": "banner"
+ }
+ }
+ },
+ "type": "banner"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/adapters/pubrise/pubrisetest/exemplary/simple-banner.json b/adapters/pubrise/pubrisetest/exemplary/simple-banner.json
new file mode 100644
index 00000000000..6669c460ea1
--- /dev/null
+++ b/adapters/pubrise/pubrisetest/exemplary/simple-banner.json
@@ -0,0 +1,136 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "device": {
+ "ip": "123.123.123.123",
+ "ua": "iPad"
+ },
+ "app": {
+ "id": "1",
+ "bundle": "com.wls.testwlsapplication"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "tagid": "test",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ },
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "placementId": "test"
+ }
+ }
+ }
+ ]
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://backend.pubrise.ai/pserver",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "tagid": "test",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ },
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "placementId": "test",
+ "type": "publisher"
+ }
+ }
+ }
+ ],
+ "app": {
+ "id": "1",
+ "bundle": "com.wls.testwlsapplication"
+ },
+ "device": {
+ "ip": "123.123.123.123",
+ "ua": "iPad"
+ }
+ },
+ "impIDs":["test-imp-id"]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "test-request-id",
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "test_bid_id",
+ "impid": "test-imp-id",
+ "price": 0.27543,
+ "adm": "",
+ "cid": "test_cid",
+ "crid": "test_crid",
+ "dealid": "test_dealid",
+ "mtype": 1,
+ "w": 300,
+ "h": 250,
+ "ext": {
+ "prebid": {
+ "type": "banner"
+ }
+ }
+ }
+ ],
+ "seat": "pubrise"
+ }
+ ],
+ "cur": "USD"
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "bids": [
+ {
+ "bid": {
+ "id": "test_bid_id",
+ "impid": "test-imp-id",
+ "price": 0.27543,
+ "adm": "",
+ "cid": "test_cid",
+ "crid": "test_crid",
+ "dealid": "test_dealid",
+ "mtype": 1,
+ "w": 300,
+ "h": 250,
+ "ext": {
+ "prebid": {
+ "type": "banner"
+ }
+ }
+ },
+ "type": "banner"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/adapters/pubrise/pubrisetest/exemplary/simple-native.json b/adapters/pubrise/pubrisetest/exemplary/simple-native.json
new file mode 100644
index 00000000000..e535c9ce5f9
--- /dev/null
+++ b/adapters/pubrise/pubrisetest/exemplary/simple-native.json
@@ -0,0 +1,120 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "device": {
+ "ip": "123.123.123.123",
+ "ua": "iPad"
+ },
+ "app": {
+ "id": "1",
+ "bundle": "com.wls.testwlsapplication"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "tagid": "test",
+ "native": {
+ "request": "{\"ver\":\"1.1\",\"layout\":1,\"adunit\":2,\"plcmtcnt\":6,\"plcmttype\":4,\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":75}},{\"id\":2,\"required\":1,\"img\":{\"wmin\":492,\"hmin\":328,\"type\":3,\"mimes\":[\"image/jpeg\",\"image/jpg\",\"image/png\"]}},{\"id\":4,\"required\":0,\"data\":{\"type\":6}},{\"id\":5,\"required\":0,\"data\":{\"type\":7}},{\"id\":6,\"required\":0,\"data\":{\"type\":1,\"len\":20}}]}",
+ "ver": "1.1"
+ },
+ "ext": {
+ "bidder": {
+ "placementId": "test"
+ }
+ }
+ }
+ ]
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://backend.pubrise.ai/pserver",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "tagid": "test",
+ "native": {
+ "request": "{\"ver\":\"1.1\",\"layout\":1,\"adunit\":2,\"plcmtcnt\":6,\"plcmttype\":4,\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":75}},{\"id\":2,\"required\":1,\"img\":{\"wmin\":492,\"hmin\":328,\"type\":3,\"mimes\":[\"image/jpeg\",\"image/jpg\",\"image/png\"]}},{\"id\":4,\"required\":0,\"data\":{\"type\":6}},{\"id\":5,\"required\":0,\"data\":{\"type\":7}},{\"id\":6,\"required\":0,\"data\":{\"type\":1,\"len\":20}}]}",
+ "ver": "1.1"
+ },
+ "ext": {
+ "bidder": {
+ "placementId": "test",
+ "type": "publisher"
+ }
+ }
+ }
+ ],
+ "app": {
+ "id": "1",
+ "bundle": "com.wls.testwlsapplication"
+ },
+ "device": {
+ "ip": "123.123.123.123",
+ "ua": "iPad"
+ }
+ },
+ "impIDs":["test-imp-id"]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "test-request-id",
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "test_bid_id",
+ "impid": "test-imp-id",
+ "price": 0.27543,
+ "adm": "",
+ "cid": "test_cid",
+ "crid": "test_crid",
+ "dealid": "test_dealid",
+ "mtype": 4,
+ "w": 300,
+ "h": 250,
+ "ext": {
+ "prebid": {
+ "type": "native"
+ }
+ }
+ }
+ ],
+ "seat": "pubrise"
+ }
+ ],
+ "cur": "USD"
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "bids": [
+ {
+ "bid": {
+ "id": "test_bid_id",
+ "impid": "test-imp-id",
+ "price": 0.27543,
+ "adm": "",
+ "cid": "test_cid",
+ "crid": "test_crid",
+ "dealid": "test_dealid",
+ "mtype": 4,
+ "w": 300,
+ "h": 250,
+ "ext": {
+ "prebid": {
+ "type": "native"
+ }
+ }
+ },
+ "type": "native"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/adapters/pubrise/pubrisetest/exemplary/simple-video.json b/adapters/pubrise/pubrisetest/exemplary/simple-video.json
new file mode 100644
index 00000000000..047b2bc7d99
--- /dev/null
+++ b/adapters/pubrise/pubrisetest/exemplary/simple-video.json
@@ -0,0 +1,131 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "device": {
+ "ip": "123.123.123.123",
+ "ua": "iPad"
+ },
+ "app": {
+ "id": "1",
+ "bundle": "com.wls.testwlsapplication"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "tagid": "test",
+ "video": {
+ "mimes": [
+ "video/mp4"
+ ],
+ "protocols": [
+ 2,
+ 5
+ ],
+ "w": 1024,
+ "h": 576
+ },
+ "ext": {
+ "bidder": {
+ "placementId": "test"
+ }
+ }
+ }
+ ]
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://backend.pubrise.ai/pserver",
+ "body": {
+ "id": "test-request-id",
+ "device": {
+ "ip": "123.123.123.123",
+ "ua": "iPad"
+ },
+ "app": {
+ "id": "1",
+ "bundle": "com.wls.testwlsapplication"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "tagid": "test",
+ "video": {
+ "mimes": [
+ "video/mp4"
+ ],
+ "protocols": [
+ 2,
+ 5
+ ],
+ "w": 1024,
+ "h": 576
+ },
+ "ext": {
+ "bidder": {
+ "placementId": "test",
+ "type": "publisher"
+ }
+ }
+ }
+ ]
+ },
+ "impIDs":["test-imp-id"]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "test-request-id",
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "test_bid_id",
+ "impid": "test-imp-id",
+ "price": 0.27543,
+ "adm": "00:01:00",
+ "cid": "test_cid",
+ "crid": "test_crid",
+ "dealid": "test_dealid",
+ "mtype": 2,
+ "ext": {
+ "prebid": {
+ "type": "video"
+ }
+ }
+ }
+ ],
+ "seat": "pubrise"
+ }
+ ],
+ "cur": "USD"
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "currency": "USD",
+ "bids": [
+ {
+ "bid": {
+ "id": "test_bid_id",
+ "impid": "test-imp-id",
+ "price": 0.27543,
+ "adm": "00:01:00",
+ "cid": "test_cid",
+ "crid": "test_crid",
+ "dealid": "test_dealid",
+ "mtype": 2,
+ "ext": {
+ "prebid": {
+ "type": "video"
+ }
+ }
+ },
+ "type": "video"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/adapters/pubrise/pubrisetest/exemplary/simple-web-banner.json b/adapters/pubrise/pubrisetest/exemplary/simple-web-banner.json
new file mode 100644
index 00000000000..ef9b8080ae7
--- /dev/null
+++ b/adapters/pubrise/pubrisetest/exemplary/simple-web-banner.json
@@ -0,0 +1,136 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "tagid": "test",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ },
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "placementId": "test"
+ }
+ }
+ }
+ ],
+ "site": {
+ "id": "1",
+ "domain": "test.com"
+ },
+ "device": {
+ "ip": "123.123.123.123",
+ "ua": "Ubuntu"
+ }
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://backend.pubrise.ai/pserver",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "tagid": "test",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ },
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "placementId": "test",
+ "type": "publisher"
+ }
+ }
+ }
+ ],
+ "site": {
+ "id": "1",
+ "domain": "test.com"
+ },
+ "device": {
+ "ip": "123.123.123.123",
+ "ua": "Ubuntu"
+ }
+ },
+ "impIDs":["test-imp-id"]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "test-request-id",
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "test_bid_id",
+ "impid": "test-imp-id",
+ "price": 0.27543,
+ "adm": "",
+ "cid": "test_cid",
+ "crid": "test_crid",
+ "dealid": "test_dealid",
+ "mtype": 1,
+ "w": 468,
+ "h": 60,
+ "ext": {
+ "prebid": {
+ "type": "banner"
+ }
+ }
+ }
+ ],
+ "seat": "pubrise"
+ }
+ ],
+ "cur": "USD"
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "bids": [
+ {
+ "bid": {
+ "id": "test_bid_id",
+ "impid": "test-imp-id",
+ "price": 0.27543,
+ "adm": "",
+ "cid": "test_cid",
+ "crid": "test_crid",
+ "dealid": "test_dealid",
+ "mtype": 1,
+ "w": 468,
+ "h": 60,
+ "ext": {
+ "prebid": {
+ "type": "banner"
+ }
+ }
+ },
+ "type": "banner"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/adapters/pubrise/pubrisetest/supplemental/bad_media_type.json b/adapters/pubrise/pubrisetest/supplemental/bad_media_type.json
new file mode 100644
index 00000000000..2b6165345ac
--- /dev/null
+++ b/adapters/pubrise/pubrisetest/supplemental/bad_media_type.json
@@ -0,0 +1,83 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "ext": {
+ "bidder": {
+ "placementId": "test"
+ }
+ }
+ }
+ ],
+ "app": {
+ "id": "1",
+ "bundle": "com.wls.testwlsapplication"
+ },
+ "device": {
+ "ip": "123.123.123.123",
+ "ifa": "sdjfksdf-dfsds-dsdg-dsgg"
+ }
+ },
+ "httpCalls": [{
+ "expectedRequest": {
+ "uri": "https://backend.pubrise.ai/pserver",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "ext": {
+ "bidder": {
+ "placementId": "test",
+ "type": "publisher"
+ }
+ }
+ }
+ ],
+ "app": {
+ "id": "1",
+ "bundle": "com.wls.testwlsapplication"
+ },
+ "device": {
+ "ip": "123.123.123.123",
+ "ifa": "sdjfksdf-dfsds-dsdg-dsgg"
+ }
+ },
+ "impIDs":["test-imp-id"]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "test-request-id",
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "test_bid_id",
+ "impid": "test-imp-id",
+ "price": 0.27543,
+ "adm": "",
+ "cid": "test_cid",
+ "crid": "test_crid",
+ "dealid": "test_dealid",
+ "w": 300,
+ "h": 250,
+ "ext": {}
+ }
+ ],
+ "seat": "pubrise"
+ }
+ ],
+ "cur": "USD"
+ }
+ }
+ }],
+ "expectedMakeBidsErrors": [
+ {
+ "value": "could not define media type for impression: test-imp-id",
+ "comparison": "literal"
+ }
+ ]
+}
diff --git a/adapters/pubrise/pubrisetest/supplemental/bad_response.json b/adapters/pubrise/pubrisetest/supplemental/bad_response.json
new file mode 100644
index 00000000000..08b58d888ed
--- /dev/null
+++ b/adapters/pubrise/pubrisetest/supplemental/bad_response.json
@@ -0,0 +1,85 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ },
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "placementId": "test"
+ }
+ }
+ }
+ ],
+ "app": {
+ "id": "1",
+ "bundle": "com.wls.testwlsapplication"
+ },
+ "device": {
+ "ip": "123.123.123.123",
+ "ifa": "sdjfksdf-dfsds-dsdg-dsgg"
+ }
+ },
+ "httpCalls": [{
+ "expectedRequest": {
+ "uri": "https://backend.pubrise.ai/pserver",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ },
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "placementId": "test",
+ "type": "publisher"
+ }
+ }
+ }
+ ],
+ "app": {
+ "id": "1",
+ "bundle": "com.wls.testwlsapplication"
+ },
+ "device": {
+ "ip": "123.123.123.123",
+ "ifa": "sdjfksdf-dfsds-dsdg-dsgg"
+ }
+ },
+ "impIDs":["test-imp-id"]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": ""
+ }
+ }],
+ "expectedMakeBidsErrors": [
+ {
+ "value": "json: cannot unmarshal string into Go value of type openrtb2.BidResponse",
+ "comparison": "literal"
+ }
+ ]
+}
diff --git a/adapters/pubrise/pubrisetest/supplemental/no-valid-impressions.json b/adapters/pubrise/pubrisetest/supplemental/no-valid-impressions.json
new file mode 100644
index 00000000000..cc1edd685f9
--- /dev/null
+++ b/adapters/pubrise/pubrisetest/supplemental/no-valid-impressions.json
@@ -0,0 +1,20 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [],
+ "app": {
+ "id": "1",
+ "bundle": "com.wls.testwlsapplication"
+ },
+ "device": {
+ "ip": "123.123.123.123",
+ "ifa": "sdjfksdf-dfsds-dsdg-dsgg"
+ }
+ },
+ "expectedMakeRequestsErrors": [
+ {
+ "value": "found no valid impressions",
+ "comparison": "literal"
+ }
+ ]
+}
diff --git a/adapters/pubrise/pubrisetest/supplemental/status-204.json b/adapters/pubrise/pubrisetest/supplemental/status-204.json
new file mode 100644
index 00000000000..1ed98ff0c72
--- /dev/null
+++ b/adapters/pubrise/pubrisetest/supplemental/status-204.json
@@ -0,0 +1,80 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ },
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "placementId": "test"
+ }
+ }
+ }
+ ],
+ "app": {
+ "id": "1",
+ "bundle": "com.wls.testwlsapplication"
+ },
+ "device": {
+ "ip": "123.123.123.123",
+ "ifa": "sdjfksdf-dfsds-dsdg-dsgg"
+ }
+ },
+ "httpCalls": [{
+ "expectedRequest": {
+ "uri": "https://backend.pubrise.ai/pserver",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ },
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "placementId": "test",
+ "type": "publisher"
+ }
+ }
+ }
+ ],
+ "app": {
+ "id": "1",
+ "bundle": "com.wls.testwlsapplication"
+ },
+ "device": {
+ "ip": "123.123.123.123",
+ "ifa": "sdjfksdf-dfsds-dsdg-dsgg"
+ }
+ },
+ "impIDs":["test-imp-id"]
+ },
+ "mockResponse": {
+ "status": 204,
+ "body": {}
+ }
+ }],
+ "expectedBidResponses": []
+}
diff --git a/adapters/pubrise/pubrisetest/supplemental/status-not-200.json b/adapters/pubrise/pubrisetest/supplemental/status-not-200.json
new file mode 100644
index 00000000000..c4b3cdc6f57
--- /dev/null
+++ b/adapters/pubrise/pubrisetest/supplemental/status-not-200.json
@@ -0,0 +1,85 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ },
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "placementId": "test"
+ }
+ }
+ }
+ ],
+ "app": {
+ "id": "1",
+ "bundle": "com.wls.testwlsapplication"
+ },
+ "device": {
+ "ip": "123.123.123.123",
+ "ifa": "sdjfksdf-dfsds-dsdg-dsgg"
+ }
+ },
+ "httpCalls": [{
+ "expectedRequest": {
+ "uri": "https://backend.pubrise.ai/pserver",
+ "body": {
+ "id": "test-request-id",
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ },
+ {
+ "w": 300,
+ "h": 600
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "placementId": "test",
+ "type": "publisher"
+ }
+ }
+ }
+ ],
+ "app": {
+ "id": "1",
+ "bundle": "com.wls.testwlsapplication"
+ },
+ "device": {
+ "ip": "123.123.123.123",
+ "ifa": "sdjfksdf-dfsds-dsdg-dsgg"
+ }
+ },
+ "impIDs":["test-imp-id"]
+ },
+ "mockResponse": {
+ "status": 404,
+ "body": {}
+ }
+ }],
+ "expectedMakeBidsErrors": [
+ {
+ "value": "Unexpected status code: 404. Run with request.debug = 1 for more info",
+ "comparison": "literal"
+ }
+ ]
+}
diff --git a/adapters/rubicon/rubicon.go b/adapters/rubicon/rubicon.go
index 52a354cda16..c9338e29376 100644
--- a/adapters/rubicon/rubicon.go
+++ b/adapters/rubicon/rubicon.go
@@ -321,9 +321,11 @@ func (a *RubiconAdapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *ada
continue
}
- if resolvedBidFloor > 0 {
- imp.BidFloorCur = "USD"
+ if resolvedBidFloor >= 0 {
imp.BidFloor = resolvedBidFloor
+ if imp.BidFloorCur != "" {
+ imp.BidFloorCur = "USD"
+ }
}
if request.User != nil {
diff --git a/adapters/rubicon/rubicon_test.go b/adapters/rubicon/rubicon_test.go
index 3ffb6e79f72..5fa863dfab5 100644
--- a/adapters/rubicon/rubicon_test.go
+++ b/adapters/rubicon/rubicon_test.go
@@ -234,6 +234,14 @@ func TestOpenRTBRequestWithDifferentBidFloorAttributes(t *testing.T) {
expectedBidCur: "",
expectedErrors: nil,
},
+ {
+ bidFloor: 0,
+ bidFloorCur: "EUR",
+ setMock: func(m *mock.Mock) {},
+ expectedBidFloor: 0,
+ expectedBidCur: "USD",
+ expectedErrors: nil,
+ },
{
bidFloor: -1,
bidFloorCur: "CZK",
diff --git a/adapters/taboola/taboola.go b/adapters/taboola/taboola.go
index 9d950bef2cb..6621c78f6eb 100644
--- a/adapters/taboola/taboola.go
+++ b/adapters/taboola/taboola.go
@@ -131,7 +131,14 @@ func (a *adapter) buildRequest(request *openrtb2.BidRequest) (*adapters.RequestD
return nil, fmt.Errorf("unsupported media type for imp: %v", request.Imp[0])
}
- url, err := a.buildEndpointURL(request.Site.ID, mediaType)
+ var taboolaPublisherId string
+ if request.Site != nil && request.Site.ID != "" {
+ taboolaPublisherId = request.Site.ID
+ } else if request.App != nil && request.App.ID != "" {
+ taboolaPublisherId = request.App.ID
+ }
+
+ url, err := a.buildEndpointURL(taboolaPublisherId, mediaType)
if err != nil {
return nil, err
}
@@ -207,22 +214,20 @@ func createTaboolaRequests(request *openrtb2.BidRequest) (taboolaRequests []*ope
ID: taboolaExt.PublisherId,
}
- if modifiedRequest.Site == nil {
- newSite := &openrtb2.Site{
- ID: taboolaExt.PublisherId,
- Name: taboolaExt.PublisherId,
- Domain: evaluateDomain(taboolaExt.PublisherDomain, request),
- Publisher: publisher,
- }
- modifiedRequest.Site = newSite
- } else {
+ if modifiedRequest.Site != nil {
modifiedSite := *modifiedRequest.Site
- modifiedSite.Publisher = publisher
modifiedSite.ID = taboolaExt.PublisherId
modifiedSite.Name = taboolaExt.PublisherId
modifiedSite.Domain = evaluateDomain(taboolaExt.PublisherDomain, request)
+ modifiedSite.Publisher = publisher
modifiedRequest.Site = &modifiedSite
}
+ if modifiedRequest.App != nil {
+ modifiedApp := *modifiedRequest.App
+ modifiedApp.ID = taboolaExt.PublisherId
+ modifiedApp.Publisher = publisher
+ modifiedRequest.App = &modifiedApp
+ }
if taboolaExt.BCat != nil {
modifiedRequest.BCat = taboolaExt.BCat
diff --git a/adapters/taboola/taboolatest/supplemental/emptySiteInRequest.json b/adapters/taboola/taboolatest/exemplary/bannerAppRequest.json
similarity index 93%
rename from adapters/taboola/taboolatest/supplemental/emptySiteInRequest.json
rename to adapters/taboola/taboolatest/exemplary/bannerAppRequest.json
index 3245290f756..34322399a00 100644
--- a/adapters/taboola/taboolatest/supplemental/emptySiteInRequest.json
+++ b/adapters/taboola/taboolatest/exemplary/bannerAppRequest.json
@@ -23,13 +23,14 @@
"ext": {
"bidder": {
"publisherId": "publisher-id",
- "tagid": "tag-id"
+ "tagid": "tag-id",
+ "tagId": "tag-Id"
}
}
}
],
"app": {
- "domain": "http://domain.com"
+ "bundle": "com.app.my"
},
"device": {
"ua": "Mozilla/5.0 (Linux; Android 12; Pixel 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.62 Mobile Safari/537.36",
@@ -62,21 +63,19 @@
}
]
},
- "tagid" : "tag-id",
+ "tagid" : "tag-Id",
"ext": {
"bidder": {
"publisherId": "publisher-id",
- "tagid": "tag-id"
+ "tagid": "tag-id",
+ "tagId": "tag-Id"
}
}
}
],
"app": {
- "domain": "http://domain.com"
- },
- "site": {
"id": "publisher-id",
- "name": "publisher-id",
+ "bundle": "com.app.my",
"publisher": {
"id": "publisher-id"
}
diff --git a/exchange/adapter_builders.go b/exchange/adapter_builders.go
index b79d03a8afd..d6b7ddd092c 100755
--- a/exchange/adapter_builders.go
+++ b/exchange/adapter_builders.go
@@ -129,6 +129,7 @@ import (
"github.com/prebid/prebid-server/v2/adapters/marsmedia"
"github.com/prebid/prebid-server/v2/adapters/mediago"
"github.com/prebid/prebid-server/v2/adapters/medianet"
+ "github.com/prebid/prebid-server/v2/adapters/melozen"
"github.com/prebid/prebid-server/v2/adapters/metax"
"github.com/prebid/prebid-server/v2/adapters/mgid"
"github.com/prebid/prebid-server/v2/adapters/mgidX"
@@ -151,6 +152,7 @@ import (
"github.com/prebid/prebid-server/v2/adapters/playdigo"
"github.com/prebid/prebid-server/v2/adapters/pubmatic"
"github.com/prebid/prebid-server/v2/adapters/pubnative"
+ "github.com/prebid/prebid-server/v2/adapters/pubrise"
"github.com/prebid/prebid-server/v2/adapters/pulsepoint"
"github.com/prebid/prebid-server/v2/adapters/pwbid"
"github.com/prebid/prebid-server/v2/adapters/qt"
@@ -353,6 +355,7 @@ func newAdapterBuilders() map[openrtb_ext.BidderName]adapters.Builder {
openrtb_ext.BidderMediafuse: appnexus.Builder,
openrtb_ext.BidderMediaGo: mediago.Builder,
openrtb_ext.BidderMedianet: medianet.Builder,
+ openrtb_ext.BidderMeloZen: melozen.Builder,
openrtb_ext.BidderMetaX: metax.Builder,
openrtb_ext.BidderMgid: mgid.Builder,
openrtb_ext.BidderMgidX: mgidX.Builder,
@@ -375,6 +378,7 @@ func newAdapterBuilders() map[openrtb_ext.BidderName]adapters.Builder {
openrtb_ext.BidderPlaydigo: playdigo.Builder,
openrtb_ext.BidderPubmatic: pubmatic.Builder,
openrtb_ext.BidderPubnative: pubnative.Builder,
+ openrtb_ext.BidderPubrise: pubrise.Builder,
openrtb_ext.BidderPulsepoint: pulsepoint.Builder,
openrtb_ext.BidderPWBid: pwbid.Builder,
openrtb_ext.BidderQT: qt.Builder,
diff --git a/macros/macros.go b/macros/macros.go
index 0c8d1428c67..2b0e29d6238 100644
--- a/macros/macros.go
+++ b/macros/macros.go
@@ -18,6 +18,9 @@ type EndpointTemplateParams struct {
PageID string
SupplyId string
SspId string
+ SspID string
+ SeatID string
+ TokenID string
}
// UserSyncPrivacy specifies privacy policy macros, represented as strings, for user sync urls.
diff --git a/openrtb_ext/bidders.go b/openrtb_ext/bidders.go
index 98bbf825d6a..706d81116b3 100644
--- a/openrtb_ext/bidders.go
+++ b/openrtb_ext/bidders.go
@@ -147,6 +147,7 @@ var coreBidderNames []BidderName = []BidderName{
BidderMediafuse,
BidderMediaGo,
BidderMedianet,
+ BidderMeloZen,
BidderMetaX,
BidderMgid,
BidderMgidX,
@@ -168,6 +169,7 @@ var coreBidderNames []BidderName = []BidderName{
BidderPGAMSsp,
BidderPlaydigo,
BidderPubmatic,
+ BidderPubrise,
BidderPubnative,
BidderPulsepoint,
BidderPWBid,
@@ -477,6 +479,7 @@ const (
BidderMediafuse BidderName = "mediafuse"
BidderMediaGo BidderName = "mediago"
BidderMedianet BidderName = "medianet"
+ BidderMeloZen BidderName = "melozen"
BidderMetaX BidderName = "metax"
BidderMgid BidderName = "mgid"
BidderMgidX BidderName = "mgidX"
@@ -498,6 +501,7 @@ const (
BidderPGAMSsp BidderName = "pgamssp"
BidderPlaydigo BidderName = "playdigo"
BidderPubmatic BidderName = "pubmatic"
+ BidderPubrise BidderName = "pubrise"
BidderPubnative BidderName = "pubnative"
BidderPulsepoint BidderName = "pulsepoint"
BidderPWBid BidderName = "pwbid"
diff --git a/openrtb_ext/imp_melozen.go b/openrtb_ext/imp_melozen.go
new file mode 100644
index 00000000000..598df6a28e9
--- /dev/null
+++ b/openrtb_ext/imp_melozen.go
@@ -0,0 +1,5 @@
+package openrtb_ext
+
+type ImpExtMeloZen struct {
+ PubId string `json:"pubId"`
+}
diff --git a/openrtb_ext/imp_pubrise.go b/openrtb_ext/imp_pubrise.go
new file mode 100644
index 00000000000..c2b30391748
--- /dev/null
+++ b/openrtb_ext/imp_pubrise.go
@@ -0,0 +1,6 @@
+package openrtb_ext
+
+type ImpExtPubrise struct {
+ PlacementID string `json:"placementId"`
+ EndpointID string `json:"endpointId"`
+}
diff --git a/static/bidder-info/freewheelssp.yaml b/static/bidder-info/freewheelssp.yaml
index 0c0a11edfce..cd18c2d8172 100644
--- a/static/bidder-info/freewheelssp.yaml
+++ b/static/bidder-info/freewheelssp.yaml
@@ -14,3 +14,6 @@ userSync:
iframe:
url: "https://ads.stickyadstv.com/pbs-user-sync?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&gpp={{.GPP}}&gpp_sid={{.GPPSID}}&r={{.RedirectURL}}"
userMacro: "{viewerid}"
+openrtb:
+ version: 2.6
+ gpp-supported: true
\ No newline at end of file
diff --git a/static/bidder-info/kargo.yaml b/static/bidder-info/kargo.yaml
index 1a7a77eb8bb..6acd679ebc0 100644
--- a/static/bidder-info/kargo.yaml
+++ b/static/bidder-info/kargo.yaml
@@ -15,4 +15,5 @@ userSync:
userMacro: "$UID"
endpointCompression: "GZIP"
openrtb:
+ version: 2.6
gpp-supported: true
diff --git a/static/bidder-info/melozen.yaml b/static/bidder-info/melozen.yaml
new file mode 100644
index 00000000000..391e0a8d43b
--- /dev/null
+++ b/static/bidder-info/melozen.yaml
@@ -0,0 +1,19 @@
+# We have the following regional endpoint domains: us-east and us-west
+# Please deploy this config in each of your datacenters with the appropriate regional subdomain
+endpoint: "https://prebid.melozen.com/rtb/v2/bid?publisher_id={{.PublisherID}}"
+endpointCompression: gzip
+geoscope:
+ - global
+maintainer:
+ email: DSP@melodong.com
+capabilities:
+ site:
+ mediaTypes:
+ - banner
+ - video
+ - native
+ app:
+ mediaTypes:
+ - banner
+ - video
+ - native
\ No newline at end of file
diff --git a/static/bidder-info/mobilefuse.yaml b/static/bidder-info/mobilefuse.yaml
index 1d6b323c3a6..62714f15124 100644
--- a/static/bidder-info/mobilefuse.yaml
+++ b/static/bidder-info/mobilefuse.yaml
@@ -13,3 +13,6 @@ capabilities:
- video
- native
endpointCompression: "GZIP"
+openrtb:
+ version: 2.6
+ gpp-supported: true
diff --git a/static/bidder-info/ownadx.yaml b/static/bidder-info/ownadx.yaml
index ee98a6c9517..073d75f0278 100644
--- a/static/bidder-info/ownadx.yaml
+++ b/static/bidder-info/ownadx.yaml
@@ -1,4 +1,4 @@
-endpoint: "https://pbs.prebid-ownadx.com/bidder/bid/{{.AccountID}}/{{.ZoneID}}?token={{.SourceId}}"
+endpoint: "https://pbs.prebid-ownadx.com/bidder/bid/{{.SeatID}}/{{.SspID}}?token={{.TokenID}}"
maintainer:
email: prebid-team@techbravo.com
capabilities:
diff --git a/static/bidder-info/pubrise.yaml b/static/bidder-info/pubrise.yaml
new file mode 100644
index 00000000000..fe5e6cd6d40
--- /dev/null
+++ b/static/bidder-info/pubrise.yaml
@@ -0,0 +1,21 @@
+endpoint: "https://backend.pubrise.ai/"
+maintainer:
+ email: "prebid@pubrise.ai"
+capabilities:
+ site:
+ mediaTypes:
+ - banner
+ - video
+ - native
+ app:
+ mediaTypes:
+ - banner
+ - video
+ - native
+userSync:
+ redirect:
+ url: "https://sync.pubrise.ai/pbserver?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&ccpa={{.USPrivacy}}&gpp={{.GPP}}&gpp_sid={{.GPPSID}}&redir={{.RedirectURL}}"
+ userMacro: "[UID]"
+ iframe:
+ url: "https://sync.pubrise.ai/pbserverIframe?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&ccpa={{.USPrivacy}}&gpp={{.GPP}}&gpp_sid={{.GPPSID}}&pbserverUrl={{.RedirectURL}}"
+ userMacro: "[UID]"
diff --git a/static/bidder-info/pulsepoint.yaml b/static/bidder-info/pulsepoint.yaml
index 762dbbb0c73..87aff0b5f04 100644
--- a/static/bidder-info/pulsepoint.yaml
+++ b/static/bidder-info/pulsepoint.yaml
@@ -19,3 +19,6 @@ userSync:
redirect:
url: "https://bh.contextweb.com/rtset?pid=561205&ev=1&rurl={{.RedirectURL}}"
userMacro: "%%VGUID%%"
+openrtb:
+ version: 2.6
+ gpp-supported: true
diff --git a/static/bidder-info/rubicon.yaml b/static/bidder-info/rubicon.yaml
index c3943058511..b4c2cfce6d2 100644
--- a/static/bidder-info/rubicon.yaml
+++ b/static/bidder-info/rubicon.yaml
@@ -13,6 +13,9 @@ xapi:
maintainer:
email: "header-bidding@rubiconproject.com"
gvlVendorID: 52
+openrtb:
+ version: 2.6
+ gpp-supported: true
capabilities:
app:
mediaTypes:
diff --git a/static/bidder-info/vidazoo.yaml b/static/bidder-info/vidazoo.yaml
index 7abef2e3518..a58f6849501 100644
--- a/static/bidder-info/vidazoo.yaml
+++ b/static/bidder-info/vidazoo.yaml
@@ -14,5 +14,7 @@ capabilities:
- video
userSync:
iframe:
- url: https://sync.cootlogix.com/api/user/html/pbs_sync?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&redirect={{.RedirectURL}}
- userMacro: ${userId}
\ No newline at end of file
+ url: https://sync.cootlogix.com/api/user/html/pbs_sync?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&redirect={{.RedirectURL}}&gpp={{.GPP}}&gpp_sid={{.GPPSID}}
+ userMacro: ${userId}
+openrtb:
+ gpp_supported: true
\ No newline at end of file
diff --git a/static/bidder-params/melozen.json b/static/bidder-params/melozen.json
new file mode 100644
index 00000000000..6b5cef5b3fd
--- /dev/null
+++ b/static/bidder-params/melozen.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "MeloZen Adapter Params",
+ "description": "A schema which validates params accepted by the MeloZen adapter",
+ "type": "object",
+ "properties": {
+ "pubId": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The unique identifier for the publisher."
+ }
+ },
+ "required": ["pubId"]
+}
diff --git a/static/bidder-params/ownadx.json b/static/bidder-params/ownadx.json
index f529e74cb01..e0e09a7e9f7 100644
--- a/static/bidder-params/ownadx.json
+++ b/static/bidder-params/ownadx.json
@@ -18,10 +18,5 @@
"description": "Token ID"
}
},
-
- "oneOf": [
- { "required": ["sspId"] },
- { "required": ["feedId"] },
- { "required": ["token"] }
- ]
+ "required": ["sspId","seatId","tokenId"]
}
diff --git a/static/bidder-params/pubrise.json b/static/bidder-params/pubrise.json
new file mode 100644
index 00000000000..0d972da45e9
--- /dev/null
+++ b/static/bidder-params/pubrise.json
@@ -0,0 +1,22 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Pubrise Adapter Params",
+ "description": "A schema which validates params accepted by the Pubrise adapter",
+ "type": "object",
+ "properties": {
+ "placementId": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Placement ID"
+ },
+ "endpointId": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Endpoint ID"
+ }
+ },
+ "oneOf": [
+ { "required": ["placementId"] },
+ { "required": ["endpointId"] }
+ ]
+}
\ No newline at end of file