Skip to content

Commit 39dba15

Browse files
Fuska1gmiedlar-ox
andauthoredJan 24, 2025
OpenX: Native support (prebid#4144)
Co-authored-by: gmiedlar-ox <[email protected]>
1 parent a8ff354 commit 39dba15

File tree

5 files changed

+259
-9
lines changed

5 files changed

+259
-9
lines changed
 

‎adapters/openx/openx.go

+12-4
Original file line numberDiff line numberDiff line change
@@ -34,23 +34,26 @@ type openxRespExt struct {
3434

3535
func (a *OpenxAdapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) {
3636
var errs []error
37-
var bannerImps []openrtb2.Imp
37+
var bannerAndNativeImps []openrtb2.Imp
3838
var videoImps []openrtb2.Imp
3939

4040
for _, imp := range request.Imp {
41-
// OpenX doesn't allow multi-type imp. Banner takes priority over video.
41+
// OpenX doesn't allow multi-type imp. Banner takes priority over video and video takes priority over native
42+
// Openx also wants to send banner and native imps in one request
4243
if imp.Banner != nil {
43-
bannerImps = append(bannerImps, imp)
44+
bannerAndNativeImps = append(bannerAndNativeImps, imp)
4445
} else if imp.Video != nil {
4546
videoImps = append(videoImps, imp)
47+
} else if imp.Native != nil {
48+
bannerAndNativeImps = append(bannerAndNativeImps, imp)
4649
}
4750
}
4851

4952
var adapterRequests []*adapters.RequestData
5053
// Make a copy as we don't want to change the original request
5154
reqCopy := *request
5255

53-
reqCopy.Imp = bannerImps
56+
reqCopy.Imp = bannerAndNativeImps
5457
adapterReq, errors := a.makeRequest(&reqCopy)
5558
if adapterReq != nil {
5659
adapterRequests = append(adapterRequests, adapterReq)
@@ -256,12 +259,17 @@ func getBidVideo(bid *openrtb2.Bid) *openrtb_ext.ExtBidPrebidVideo {
256259
//
257260
// OpenX doesn't support multi-type impressions.
258261
// If both banner and video exist, take banner as we do not want in-banner video.
262+
// If both video and native exist and banner is nil, take video.
263+
// If both banner and native exist, take banner.
264+
// If all of the types (banner, video, native) exist, take banner.
259265
func getMediaTypeForImp(impId string, imps []openrtb2.Imp) openrtb_ext.BidType {
260266
mediaType := openrtb_ext.BidTypeBanner
261267
for _, imp := range imps {
262268
if imp.ID == impId {
263269
if imp.Banner == nil && imp.Video != nil {
264270
mediaType = openrtb_ext.BidTypeVideo
271+
} else if imp.Banner == nil && imp.Native != nil {
272+
mediaType = openrtb_ext.BidTypeNative
265273
}
266274
return mediaType
267275
}

‎adapters/openx/openxtest/exemplary/simple-banner.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
"id": "8ee514f1-b2b8-4abb-89fd-084437d1e800",
5151
"impid": "test-imp-id",
5252
"price": 0.500000,
53-
"adm": "some-test-ad",
53+
"adm": "{\"ver\": \"1.2\", \"assets\": [{\"id\": 1, \"required\": 1,\"title\": {\"text\": \"OpenX (Title)\"}}], \"link\": {\"url\": \"https://www.openx.com/\"}, \"eventtrackers\":[{\"event\":1,\"method\":1,\"url\":\"http://example.com/impression\"}]}",
5454
"crid": "crid_10",
5555
"h": 90,
5656
"w": 728
@@ -72,7 +72,7 @@
7272
"id": "8ee514f1-b2b8-4abb-89fd-084437d1e800",
7373
"impid": "test-imp-id",
7474
"price": 0.5,
75-
"adm": "some-test-ad",
75+
"adm": "{\"ver\": \"1.2\", \"assets\": [{\"id\": 1, \"required\": 1,\"title\": {\"text\": \"OpenX (Title)\"}}], \"link\": {\"url\": \"https://www.openx.com/\"}, \"eventtrackers\":[{\"event\":1,\"method\":1,\"url\":\"http://example.com/impression\"}]}",
7676
"crid": "crid_10",
7777
"w": 728,
7878
"h": 90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
{
2+
"mockBidRequest": {
3+
"id": "test-request-id",
4+
"imp": [
5+
{
6+
"id": "test-imp-id",
7+
"native": {
8+
"request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":1200,\"hmin\":627}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1,2]}]}",
9+
"ver": "1.2"
10+
},
11+
"ext": {
12+
"bidder": {
13+
"unit": "539439964",
14+
"delDomain": "se-demo-d.openx.net"
15+
}
16+
}
17+
}
18+
]
19+
},
20+
21+
"httpCalls": [
22+
{
23+
"expectedRequest": {
24+
"uri": "http://rtb.openx.net/prebid",
25+
"body": {
26+
"id": "test-request-id",
27+
"imp": [
28+
{
29+
"id": "test-imp-id",
30+
"native": {
31+
"request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":1200,\"hmin\":627}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1,2]}]}",
32+
"ver": "1.2"
33+
},
34+
"tagid": "539439964"
35+
}
36+
],
37+
"ext": {
38+
"bc": "hb_pbs_1.0.0",
39+
"delDomain": "se-demo-d.openx.net"
40+
}
41+
},
42+
"impIDs":["test-imp-id"]
43+
},
44+
"mockResponse": {
45+
"status": 200,
46+
"body": {
47+
"id": "test-request-id",
48+
"cur": "USD",
49+
"seatbid": [
50+
{
51+
"seat": "openx",
52+
"bid": [{
53+
"id": "8ee514f1-b2b8-4abb-89fd-084437d1e800",
54+
"impid": "test-imp-id",
55+
"price": 0.500000,
56+
"adm": "{\"ver\": \"1.2\", \"assets\": [{\"id\": 1, \"required\": 1,\"title\": {\"text\": \"OpenX (Title)\"}}], \"link\": {\"url\": \"https://www.openx.com/\"}, \"eventtrackers\":[{\"event\":1,\"method\":1,\"url\":\"http://example.com/impression\"}]}",
57+
"crid": "crid_10",
58+
"w": 300,
59+
"h": 200
60+
}]
61+
}
62+
]
63+
}
64+
}
65+
}
66+
],
67+
68+
"expectedBidResponses": [
69+
{
70+
"currency": "USD",
71+
"bids": [
72+
{
73+
"bid": {
74+
"id": "8ee514f1-b2b8-4abb-89fd-084437d1e800",
75+
"impid": "test-imp-id",
76+
"price": 0.5,
77+
"adm": "{\"ver\": \"1.2\", \"assets\": [{\"id\": 1, \"required\": 1,\"title\": {\"text\": \"OpenX (Title)\"}}], \"link\": {\"url\": \"https://www.openx.com/\"}, \"eventtrackers\":[{\"event\":1,\"method\":1,\"url\":\"http://example.com/impression\"}]}",
78+
"crid": "crid_10",
79+
"w": 300,
80+
"h": 200
81+
},
82+
"type": "native"
83+
}
84+
]
85+
}
86+
]
87+
}

‎adapters/openx/openxtest/supplemental/multi-imp.json

+156-3
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,19 @@
2222
}
2323
}
2424
},
25+
{
26+
"id": "native-imp-1",
27+
"native": {
28+
"request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":1200,\"hmin\":627}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1,2]}]}",
29+
"ver": "1.2"
30+
},
31+
"ext": {
32+
"bidder": {
33+
"unit": "666",
34+
"delDomain": "se-demo-d.openx.net"
35+
}
36+
}
37+
},
2538
{
2639
"id": "banner-imp-2",
2740
"banner": {},
@@ -42,10 +55,42 @@
4255
}
4356
}
4457
},
58+
{
59+
"id": "banner-native-imp-1",
60+
"banner": {},
61+
"native": {
62+
"request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":1200,\"hmin\":627}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1,2]}]}",
63+
"ver": "1.2"
64+
},
65+
"ext": {
66+
"bidder": {
67+
"unit": "777",
68+
"delDomain": "se-demo-d.openx.net"
69+
}
70+
}
71+
},
72+
{
73+
"id": "video-native-imp-1",
74+
"video": {"mimes": ["video/mp4"]},
75+
"native": {
76+
"request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":1200,\"hmin\":627}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1,2]}]}",
77+
"ver": "1.2"
78+
},
79+
"ext": {
80+
"bidder": {
81+
"unit": "888",
82+
"delDomain": "se-demo-d.openx.net"
83+
}
84+
}
85+
},
4586
{
4687
"id": "multi-type-imp",
4788
"banner": {},
4889
"video": {"mimes": ["video/mp4"]},
90+
"native": {
91+
"request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":1200,\"hmin\":627}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1,2]}]}",
92+
"ver": "1.2"
93+
},
4994
"ext": {
5095
"bidder": {
5196
"unit": "555",
@@ -68,15 +113,36 @@
68113
"banner": {},
69114
"tagid": "111"
70115
},
116+
{
117+
"id": "native-imp-1",
118+
"native": {
119+
"request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":1200,\"hmin\":627}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1,2]}]}",
120+
"ver": "1.2"
121+
},
122+
"tagid": "666"
123+
},
71124
{
72125
"id": "banner-imp-2",
73126
"banner": {},
74127
"tagid": "222"
75128
},
129+
{
130+
"id": "banner-native-imp-1",
131+
"banner": {},
132+
"native": {
133+
"request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":1200,\"hmin\":627}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1,2]}]}",
134+
"ver": "1.2"
135+
},
136+
"tagid": "777"
137+
},
76138
{
77139
"id": "multi-type-imp",
78140
"banner": {},
79141
"video": {"mimes": ["video/mp4"]},
142+
"native": {
143+
"request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":1200,\"hmin\":627}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1,2]}]}",
144+
"ver": "1.2"
145+
},
80146
"tagid": "555"
81147
}
82148
],
@@ -85,7 +151,7 @@
85151
"delDomain": "se-demo-d.openx.net"
86152
}
87153
},
88-
"impIDs":["banner-imp-1","banner-imp-2","multi-type-imp"]
154+
"impIDs":["banner-imp-1","native-imp-1","banner-imp-2","banner-native-imp-1","multi-type-imp"]
89155
},
90156
"mockResponse": {
91157
"status": 200,
@@ -100,11 +166,21 @@
100166
"impid": "banner-imp-1",
101167
"price": 0.1
102168
},
169+
{
170+
"id": "native-bid-1",
171+
"impid": "native-imp-1",
172+
"price": 0.1
173+
},
103174
{
104175
"id": "banner-bid-2",
105176
"impid": "banner-imp-2",
106177
"price": 0.2
107178
},
179+
{
180+
"id": "banner-native-bid-1",
181+
"impid": "banner-native-imp-1",
182+
"price": 0
183+
},
108184
{
109185
"id": "multi-type-bid",
110186
"impid": "multi-type-imp",
@@ -162,7 +238,11 @@
162238
"imp": [
163239
{
164240
"id": "video-imp-2",
165-
"video": {"mimes": ["video/mp4"]},
241+
"video": {
242+
"mimes": [
243+
"video/mp4"
244+
]
245+
},
166246
"tagid": "444"
167247
}
168248
],
@@ -171,7 +251,9 @@
171251
"delDomain": "se-demo-d.openx.net"
172252
}
173253
},
174-
"impIDs":["video-imp-2"]
254+
"impIDs": [
255+
"video-imp-2"
256+
]
175257
},
176258
"mockResponse": {
177259
"status": 200,
@@ -191,6 +273,48 @@
191273
]
192274
}
193275
}
276+
},
277+
{
278+
"expectedRequest": {
279+
"uri": "http://rtb.openx.net/prebid",
280+
"body": {
281+
"id": "test-request-id",
282+
"imp": [
283+
{
284+
"id": "video-native-imp-1",
285+
"video": {"mimes": ["video/mp4"]},
286+
"native": {
287+
"request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":1200,\"hmin\":627}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1,2]}]}",
288+
"ver": "1.2"
289+
},
290+
"tagid": "888"
291+
}
292+
],
293+
"ext": {
294+
"bc": "hb_pbs_1.0.0",
295+
"delDomain": "se-demo-d.openx.net"
296+
}
297+
},
298+
"impIDs":["video-native-imp-1"]
299+
},
300+
"mockResponse": {
301+
"status": 200,
302+
"body": {
303+
"id": "test-request-id",
304+
"seatbid": [
305+
{
306+
"seat": "openx",
307+
"bid": [
308+
{
309+
"id": "video-native-bid-1",
310+
"impid": "video-native-imp-1",
311+
"price": 0.0
312+
}
313+
]
314+
}
315+
]
316+
}
317+
}
194318
}
195319
],
196320

@@ -206,6 +330,14 @@
206330
},
207331
"type": "banner"
208332
},
333+
{
334+
"bid": {
335+
"id": "native-bid-1",
336+
"impid": "native-imp-1",
337+
"price": 0.1
338+
},
339+
"type": "native"
340+
},
209341
{
210342
"bid": {
211343
"id": "banner-bid-2",
@@ -214,6 +346,14 @@
214346
},
215347
"type": "banner"
216348
},
349+
{
350+
"bid": {
351+
"id": "banner-native-bid-1",
352+
"impid": "banner-native-imp-1",
353+
"price": 0
354+
},
355+
"type": "banner"
356+
},
217357
{
218358
"bid": {
219359
"id": "multi-type-bid",
@@ -249,6 +389,19 @@
249389
"type": "video"
250390
}
251391
]
392+
},
393+
{
394+
"currency": "USD",
395+
"bids": [
396+
{
397+
"bid": {
398+
"id": "video-native-bid-1",
399+
"impid": "video-native-imp-1",
400+
"price": 0.0
401+
},
402+
"type": "video"
403+
}
404+
]
252405
}
253406
]
254407
}

‎static/bidder-info/openx.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@ capabilities:
88
mediaTypes:
99
- banner
1010
- video
11+
- native
1112
site:
1213
mediaTypes:
1314
- banner
1415
- video
16+
- native
1517
modifyingVastXmlAllowed: true
1618
userSync:
1719
iframe:

0 commit comments

Comments
 (0)
Please sign in to comment.