prebid.js 7.40.0 → 7.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/33acrossIdSystem.js +1 -1
  3. package/dist/adagioBidAdapter.js +1 -1
  4. package/dist/adbookpspBidAdapter.js +1 -1
  5. package/dist/adgenerationBidAdapter.js +1 -1
  6. package/dist/adrelevantisBidAdapter.js +1 -1
  7. package/dist/adtrgtmeBidAdapter.js +1 -1
  8. package/dist/aduptechBidAdapter.js +1 -1
  9. package/dist/adxcgBidAdapter.js +1 -1
  10. package/dist/adyoulikeBidAdapter.js +1 -1
  11. package/dist/ajaBidAdapter.js +1 -1
  12. package/dist/amxBidAdapter.js +1 -1
  13. package/dist/amxIdSystem.js +1 -1
  14. package/dist/appierAnalyticsAdapter.js +1 -1
  15. package/dist/appnexusBidAdapter.js +1 -1
  16. package/dist/asoBidAdapter.js +1 -1
  17. package/dist/axonixBidAdapter.js +1 -1
  18. package/dist/bidglassBidAdapter.js +1 -1
  19. package/dist/big-richmediaBidAdapter.js +1 -1
  20. package/dist/bridgewellBidAdapter.js +1 -1
  21. package/dist/brightMountainMediaBidAdapter.js +1 -1
  22. package/dist/browsiBidAdapter.js +1 -0
  23. package/dist/carodaBidAdapter.js +1 -1
  24. package/dist/chtnwBidAdapter.js +1 -1
  25. package/dist/cleanmedianetBidAdapter.js +1 -1
  26. package/dist/concertBidAdapter.js +1 -1
  27. package/dist/connectadBidAdapter.js +1 -1
  28. package/dist/consumableBidAdapter.js +1 -1
  29. package/dist/conversantAnalyticsAdapter.js +1 -1
  30. package/dist/conversantBidAdapter.js +1 -1
  31. package/dist/craftBidAdapter.js +1 -1
  32. package/dist/criteoBidAdapter.js +1 -1
  33. package/dist/cwireBidAdapter.js +1 -1
  34. package/dist/dfpAdServerVideo.js +1 -1
  35. package/dist/dspxBidAdapter.js +1 -1
  36. package/dist/eplanningBidAdapter.js +1 -1
  37. package/dist/feedadBidAdapter.js +1 -1
  38. package/dist/finativeBidAdapter.js +1 -1
  39. package/dist/freewheel-sspBidAdapter.js +1 -1
  40. package/dist/glimpseBidAdapter.js +1 -1
  41. package/dist/gmosspBidAdapter.js +1 -1
  42. package/dist/goldbachBidAdapter.js +1 -1
  43. package/dist/gridBidAdapter.js +1 -1
  44. package/dist/gridNMBidAdapter.js +1 -1
  45. package/dist/gumgumBidAdapter.js +1 -1
  46. package/dist/h12mediaBidAdapter.js +1 -1
  47. package/dist/id5IdSystem.js +1 -1
  48. package/dist/improvedigitalBidAdapter.js +1 -1
  49. package/dist/inmarBidAdapter.js +1 -1
  50. package/dist/insticatorBidAdapter.js +1 -1
  51. package/dist/ixBidAdapter.js +1 -1
  52. package/dist/justpremiumBidAdapter.js +1 -1
  53. package/dist/kargoBidAdapter.js +1 -1
  54. package/dist/konduitAnalyticsAdapter.js +1 -1
  55. package/dist/kueezBidAdapter.js +1 -1
  56. package/dist/kueezRtbBidAdapter.js +1 -1
  57. package/dist/lassoBidAdapter.js +1 -1
  58. package/dist/lifestreetBidAdapter.js +1 -1
  59. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  60. package/dist/logicadBidAdapter.js +1 -1
  61. package/dist/loglyliftBidAdapter.js +1 -1
  62. package/dist/magniteAnalyticsAdapter.js +1 -1
  63. package/dist/malltvAnalyticsAdapter.js +1 -1
  64. package/dist/marsmediaBidAdapter.js +1 -1
  65. package/dist/mediafuseBidAdapter.js +1 -1
  66. package/dist/mediasquareBidAdapter.js +1 -1
  67. package/dist/mgidBidAdapter.js +1 -1
  68. package/dist/minutemediaBidAdapter.js +1 -1
  69. package/dist/minutemediaplusBidAdapter.js +1 -1
  70. package/dist/missenaBidAdapter.js +1 -1
  71. package/dist/nexx360BidAdapter.js +1 -1
  72. package/dist/nobidBidAdapter.js +1 -1
  73. package/dist/not-for-prod/prebid.js +130 -129
  74. package/dist/oguryBidAdapter.js +1 -1
  75. package/dist/onetagBidAdapter.js +1 -1
  76. package/dist/ooloAnalyticsAdapter.js +1 -1
  77. package/dist/optidigitalBidAdapter.js +1 -1
  78. package/dist/outbrainBidAdapter.js +1 -1
  79. package/dist/parrableIdSystem.js +1 -1
  80. package/dist/permutiveRtdProvider.js +1 -1
  81. package/dist/pixfutureBidAdapter.js +1 -1
  82. package/dist/prebid-core.js +1 -1
  83. package/dist/publinkIdSystem.js +1 -1
  84. package/dist/pubmaticBidAdapter.js +1 -1
  85. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  86. package/dist/pubwiseBidAdapter.js +1 -1
  87. package/dist/pxyzBidAdapter.js +1 -1
  88. package/dist/quantcastBidAdapter.js +1 -1
  89. package/dist/readpeakBidAdapter.js +1 -1
  90. package/dist/relaidoBidAdapter.js +1 -1
  91. package/dist/rhythmoneBidAdapter.js +1 -1
  92. package/dist/riseBidAdapter.js +1 -1
  93. package/dist/rubiconAnalyticsAdapter.js +1 -1
  94. package/dist/rubiconBidAdapter.js +1 -1
  95. package/dist/seedingAllianceBidAdapter.js +1 -1
  96. package/dist/seedtagBidAdapter.js +1 -1
  97. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  98. package/dist/sharethroughBidAdapter.js +1 -1
  99. package/dist/shinezBidAdapter.js +1 -1
  100. package/dist/smaatoBidAdapter.js +1 -1
  101. package/dist/smartadserverBidAdapter.js +1 -1
  102. package/dist/smartxBidAdapter.js +1 -1
  103. package/dist/smilewantedBidAdapter.js +1 -1
  104. package/dist/sonobiBidAdapter.js +1 -1
  105. package/dist/sovrnAnalyticsAdapter.js +1 -1
  106. package/dist/sovrnBidAdapter.js +1 -1
  107. package/dist/sspBCBidAdapter.js +1 -1
  108. package/dist/stvBidAdapter.js +1 -0
  109. package/dist/sublimeBidAdapter.js +1 -1
  110. package/dist/synacormediaBidAdapter.js +1 -1
  111. package/dist/targetVideoBidAdapter.js +1 -1
  112. package/dist/teadsBidAdapter.js +1 -1
  113. package/dist/trionBidAdapter.js +1 -1
  114. package/dist/tripleliftBidAdapter.js +1 -1
  115. package/dist/ttdBidAdapter.js +1 -1
  116. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  117. package/dist/uid2IdSystem.js +1 -1
  118. package/dist/underdogmediaBidAdapter.js +1 -1
  119. package/dist/undertoneBidAdapter.js +1 -1
  120. package/dist/vidazooBidAdapter.js +1 -1
  121. package/dist/videobyteBidAdapter.js +1 -1
  122. package/dist/visxBidAdapter.js +1 -1
  123. package/dist/vuukleBidAdapter.js +1 -1
  124. package/dist/widespaceBidAdapter.js +1 -1
  125. package/dist/winrBidAdapter.js +1 -1
  126. package/dist/yahoosspBidAdapter.js +1 -1
  127. package/dist/yandexBidAdapter.js +1 -1
  128. package/dist/yieldmoBidAdapter.js +1 -1
  129. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  130. package/integrationExamples/gpt/x-domain/creative.html +1 -1
  131. package/modules/aduptechBidAdapter.js +43 -37
  132. package/modules/browsiBidAdapter.js +171 -0
  133. package/modules/browsiBidAdapter.md +38 -0
  134. package/modules/cleanmedianetBidAdapter.js +191 -126
  135. package/modules/cleanmedianetBidAdapter.md +64 -18
  136. package/modules/conversantBidAdapter.js +4 -0
  137. package/modules/dfpAdServerVideo.js +8 -8
  138. package/modules/freewheel-sspBidAdapter.js +9 -0
  139. package/modules/gridBidAdapter.js +12 -1
  140. package/modules/ixBidAdapter.js +1 -1
  141. package/modules/missenaBidAdapter.js +2 -1
  142. package/modules/neuwoRtdProvider.js +1 -1
  143. package/modules/nobidBidAdapter.js +13 -2
  144. package/modules/nobidBidAdapter.md +2 -2
  145. package/modules/permutiveRtdProvider.js +8 -2
  146. package/modules/pubwiseBidAdapter.js +265 -33
  147. package/modules/stvBidAdapter.js +330 -0
  148. package/modules/stvBidAdapter.md +62 -0
  149. package/modules/yandexBidAdapter.js +259 -71
  150. package/modules/yandexBidAdapter.md +52 -15
  151. package/package.json +1 -1
  152. package/src/videoCache.js +4 -4
  153. package/test/spec/modules/browsiBidAdapter_spec.js +209 -0
  154. package/test/spec/modules/cleanmedianetBidAdapter_spec.js +462 -407
  155. package/test/spec/modules/conversantBidAdapter_spec.js +8 -0
  156. package/test/spec/modules/dfpAdServerVideo_spec.js +36 -4
  157. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +19 -0
  158. package/test/spec/modules/gridBidAdapter_spec.js +24 -0
  159. package/test/spec/modules/ixBidAdapter_spec.js +4 -4
  160. package/test/spec/modules/nobidBidAdapter_spec.js +32 -0
  161. package/test/spec/modules/permutiveRtdProvider_spec.js +61 -4
  162. package/test/spec/modules/pubwiseBidAdapter_spec.js +313 -3
  163. package/test/spec/modules/stvBidAdapter_spec.js +402 -0
  164. package/test/spec/modules/yandexBidAdapter_spec.js +315 -45
  165. package/test/spec/videoCache_spec.js +23 -0
  166. package/dist/flocIdSystem.js +0 -1
  167. package/modules/flocIdSystem.js +0 -0
@@ -0,0 +1,330 @@
1
+ import { deepAccess } from '../src/utils.js';
2
+ import { config } from '../src/config.js';
3
+ import { registerBidder } from '../src/adapters/bidderFactory.js';
4
+ import { BANNER, VIDEO } from '../src/mediaTypes.js';
5
+ import {includes} from '../src/polyfill.js';
6
+
7
+ const BIDDER_CODE = 'stv';
8
+ const ENDPOINT_URL = 'https://ads.smartstream.tv/r/';
9
+ const ENDPOINT_URL_DEV = 'https://ads.smartstream.tv/r/';
10
+ const GVLID = 134;
11
+ const VIDEO_ORTB_PARAMS = {
12
+ 'minduration': 'min_duration',
13
+ 'maxduration': 'max_duration',
14
+ 'maxbitrate': 'max_bitrate',
15
+ 'api': 'api',
16
+ };
17
+
18
+ export const spec = {
19
+ code: BIDDER_CODE,
20
+ gvlid: GVLID,
21
+ aliases: [],
22
+ supportedMediaTypes: [BANNER, VIDEO],
23
+ isBidRequestValid: function(bid) {
24
+ return !!(bid.params.placement);
25
+ },
26
+ buildRequests: function(validBidRequests, bidderRequest) {
27
+ return validBidRequests.map(bidRequest => {
28
+ const params = bidRequest.params;
29
+
30
+ const placementId = params.placement;
31
+ const rnd = Math.floor(Math.random() * 99999999999);
32
+ const referrer = bidderRequest.refererInfo.page;
33
+ const bidId = bidRequest.bidId;
34
+ const isDev = params.devMode || false;
35
+ const pbcode = bidRequest.adUnitCode || false; // div id
36
+
37
+ let endpoint = isDev ? ENDPOINT_URL_DEV : ENDPOINT_URL;
38
+
39
+ let mediaTypesInfo = getMediaTypesInfo(bidRequest);
40
+ let type = isBannerRequest(bidRequest) ? BANNER : VIDEO;
41
+ let sizes = mediaTypesInfo[type];
42
+
43
+ let payload = {
44
+ _f: 'vast2',
45
+ alternative: 'prebid_js',
46
+ _ps: placementId,
47
+ srw: sizes ? sizes[0].width : 0,
48
+ srh: sizes ? sizes[0].height : 0,
49
+ idt: 100,
50
+ rnd: rnd,
51
+ ref: referrer,
52
+ bid_id: bidId,
53
+ pbver: '$prebid.version$',
54
+ };
55
+ if (!isVideoRequest(bidRequest)) {
56
+ payload._f = 'html';
57
+ }
58
+
59
+ payload.pfilter = { ...params };
60
+ delete payload.pfilter.placement;
61
+ if (params.bcat !== undefined) { delete payload.pfilter.bcat; }
62
+ if (params.dvt !== undefined) { delete payload.pfilter.dvt; }
63
+ if (params.devMode !== undefined) { delete payload.pfilter.devMode; }
64
+
65
+ if (payload.pfilter === undefined || !payload.pfilter.floorprice) {
66
+ let bidFloor = getBidFloor(bidRequest);
67
+ if (bidFloor > 0) {
68
+ if (payload.pfilter !== undefined) {
69
+ payload.pfilter.floorprice = bidFloor;
70
+ } else {
71
+ payload.pfilter = { 'floorprice': bidFloor };
72
+ }
73
+ // payload.bidFloor = bidFloor;
74
+ }
75
+ }
76
+
77
+ if (mediaTypesInfo[VIDEO] !== undefined) {
78
+ let videoParams = deepAccess(bidRequest, 'mediaTypes.video');
79
+ Object.keys(videoParams)
80
+ .filter(key => includes(Object.keys(VIDEO_ORTB_PARAMS), key) && params[VIDEO_ORTB_PARAMS[key]] === undefined)
81
+ .forEach(key => payload.pfilter[VIDEO_ORTB_PARAMS[key]] = videoParams[key]);
82
+ }
83
+ if (Object.keys(payload.pfilter).length == 0) { delete payload.pfilter }
84
+
85
+ if (bidderRequest && bidderRequest.gdprConsent) {
86
+ payload.gdpr_consent = bidderRequest.gdprConsent.consentString;
87
+ payload.gdpr = bidderRequest.gdprConsent.gdprApplies;
88
+ }
89
+
90
+ if (params.bcat !== undefined) {
91
+ payload.bcat = deepAccess(bidderRequest.ortb2Imp, 'bcat') || params.bcat;
92
+ }
93
+ if (params.dvt !== undefined) {
94
+ payload.dvt = params.dvt;
95
+ }
96
+ if (isDev) {
97
+ payload.prebidDevMode = 1;
98
+ }
99
+
100
+ if (pbcode) {
101
+ payload.pbcode = pbcode;
102
+ }
103
+
104
+ payload.media_types = convertMediaInfoForRequest(mediaTypesInfo);
105
+
106
+ return {
107
+ method: 'GET',
108
+ url: endpoint,
109
+ data: objectToQueryString(payload),
110
+ };
111
+ });
112
+ },
113
+ interpretResponse: function(serverResponse, bidRequest) {
114
+ const bidResponses = [];
115
+ const response = serverResponse.body;
116
+ const crid = response.crid || 0;
117
+ const cpm = response.cpm / 1000000 || 0;
118
+ if (cpm !== 0 && crid !== 0) {
119
+ const dealId = response.dealid || '';
120
+ const currency = response.currency || 'EUR';
121
+ const netRevenue = (response.netRevenue === undefined) ? true : response.netRevenue;
122
+ const bidResponse = {
123
+ requestId: response.bid_id,
124
+ cpm: cpm,
125
+ width: response.width,
126
+ height: response.height,
127
+ creativeId: crid,
128
+ dealId: dealId,
129
+ currency: currency,
130
+ netRevenue: netRevenue,
131
+ ttl: config.getConfig('_bidderTimeout'),
132
+ meta: {
133
+ advertiserDomains: response.adomain || []
134
+ }
135
+ };
136
+ if (response.vastXml) {
137
+ bidResponse.vastXml = response.vastXml;
138
+ bidResponse.mediaType = 'video';
139
+ } else {
140
+ bidResponse.ad = response.adTag;
141
+ }
142
+
143
+ bidResponses.push(bidResponse);
144
+ }
145
+ return bidResponses;
146
+ },
147
+ getUserSyncs: function(syncOptions, serverResponses, gdprConsent, uspConsent) {
148
+ if (!serverResponses || serverResponses.length === 0) {
149
+ return [];
150
+ }
151
+
152
+ const syncs = []
153
+
154
+ let gdprParams = '';
155
+ if (gdprConsent) {
156
+ if ('gdprApplies' in gdprConsent && typeof gdprConsent.gdprApplies === 'boolean') {
157
+ gdprParams = `gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`;
158
+ } else {
159
+ gdprParams = `gdpr_consent=${gdprConsent.consentString}`;
160
+ }
161
+ }
162
+
163
+ if (serverResponses.length > 0 && serverResponses[0].body !== undefined &&
164
+ serverResponses[0].body.userSync !== undefined && serverResponses[0].body.userSync.iframeUrl !== undefined &&
165
+ serverResponses[0].body.userSync.iframeUrl.length > 0) {
166
+ if (syncOptions.iframeEnabled) {
167
+ serverResponses[0].body.userSync.iframeUrl.forEach((url) => syncs.push({
168
+ type: 'iframe',
169
+ url: appendToUrl(url, gdprParams)
170
+ }));
171
+ }
172
+ if (syncOptions.pixelEnabled) {
173
+ serverResponses[0].body.userSync.imageUrl.forEach((url) => syncs.push({
174
+ type: 'image',
175
+ url: appendToUrl(url, gdprParams)
176
+ }));
177
+ }
178
+ }
179
+ return syncs;
180
+ }
181
+ }
182
+
183
+ function appendToUrl(url, what) {
184
+ if (!what) {
185
+ return url;
186
+ }
187
+ return url + (url.indexOf('?') !== -1 ? '&' : '?') + what;
188
+ }
189
+
190
+ function objectToQueryString(obj, prefix) {
191
+ let str = [];
192
+ let p;
193
+ for (p in obj) {
194
+ if (obj.hasOwnProperty(p)) {
195
+ let k = prefix ? prefix + '[' + p + ']' : p;
196
+ let v = obj[p];
197
+ str.push((v !== null && typeof v === 'object')
198
+ ? objectToQueryString(v, k)
199
+ : encodeURIComponent(k) + '=' + encodeURIComponent(v));
200
+ }
201
+ }
202
+ return str.join('&');
203
+ }
204
+
205
+ /**
206
+ * Check if it's a banner bid request
207
+ *
208
+ * @param {BidRequest} bid - Bid request generated from ad slots
209
+ * @returns {boolean} True if it's a banner bid
210
+ */
211
+ function isBannerRequest(bid) {
212
+ return bid.mediaType === 'banner' || !!deepAccess(bid, 'mediaTypes.banner') || !isVideoRequest(bid);
213
+ }
214
+
215
+ /**
216
+ * Check if it's a video bid request
217
+ *
218
+ * @param {BidRequest} bid - Bid request generated from ad slots
219
+ * @returns {boolean} True if it's a video bid
220
+ */
221
+ function isVideoRequest(bid) {
222
+ return bid.mediaType === 'video' || !!deepAccess(bid, 'mediaTypes.video');
223
+ }
224
+
225
+ /**
226
+ * Get video sizes
227
+ *
228
+ * @param {BidRequest} bid - Bid request generated from ad slots
229
+ * @returns {object} True if it's a video bid
230
+ */
231
+ function getVideoSizes(bid) {
232
+ return parseSizes(deepAccess(bid, 'mediaTypes.video.playerSize') || bid.sizes);
233
+ }
234
+
235
+ /**
236
+ * Get banner sizes
237
+ *
238
+ * @param {BidRequest} bid - Bid request generated from ad slots
239
+ * @returns {object} True if it's a video bid
240
+ */
241
+ function getBannerSizes(bid) {
242
+ return parseSizes(deepAccess(bid, 'mediaTypes.banner.sizes') || bid.sizes);
243
+ }
244
+
245
+ /**
246
+ * Parse size
247
+ * @param sizes
248
+ * @returns {width: number, h: height}
249
+ */
250
+ function parseSize(size) {
251
+ let sizeObj = {}
252
+ sizeObj.width = parseInt(size[0], 10);
253
+ sizeObj.height = parseInt(size[1], 10);
254
+ return sizeObj;
255
+ }
256
+
257
+ /**
258
+ * Parse sizes
259
+ * @param sizes
260
+ * @returns {{width: number , height: number }[]}
261
+ */
262
+ function parseSizes(sizes) {
263
+ if (Array.isArray(sizes[0])) { // is there several sizes ? (ie. [[728,90],[200,300]])
264
+ return sizes.map(size => parseSize(size));
265
+ }
266
+ return [parseSize(sizes)]; // or a single one ? (ie. [728,90])
267
+ }
268
+
269
+ /**
270
+ * Get MediaInfo object for server request
271
+ *
272
+ * @param mediaTypesInfo
273
+ * @returns {*}
274
+ */
275
+ function convertMediaInfoForRequest(mediaTypesInfo) {
276
+ let requestData = {};
277
+ Object.keys(mediaTypesInfo).forEach(mediaType => {
278
+ requestData[mediaType] = mediaTypesInfo[mediaType].map(size => {
279
+ return size.width + 'x' + size.height;
280
+ }).join(',');
281
+ });
282
+ return requestData;
283
+ }
284
+
285
+ /**
286
+ * Get Bid Floor
287
+ * @param bid
288
+ * @returns {number|*}
289
+ */
290
+ function getBidFloor(bid) {
291
+ if (typeof bid.getFloor !== 'function') {
292
+ return deepAccess(bid, 'params.bidfloor', 0);
293
+ }
294
+
295
+ try {
296
+ const bidFloor = bid.getFloor({
297
+ currency: 'EUR',
298
+ mediaType: '*',
299
+ size: '*',
300
+ });
301
+ return bidFloor.floor;
302
+ } catch (_) {
303
+ return 0
304
+ }
305
+ }
306
+
307
+ /**
308
+ * Get media types info
309
+ *
310
+ * @param bid
311
+ */
312
+ function getMediaTypesInfo(bid) {
313
+ let mediaTypesInfo = {};
314
+
315
+ if (bid.mediaTypes) {
316
+ Object.keys(bid.mediaTypes).forEach(mediaType => {
317
+ if (mediaType === BANNER) {
318
+ mediaTypesInfo[mediaType] = getBannerSizes(bid);
319
+ }
320
+ if (mediaType === VIDEO) {
321
+ mediaTypesInfo[mediaType] = getVideoSizes(bid);
322
+ }
323
+ });
324
+ } else {
325
+ mediaTypesInfo[BANNER] = getBannerSizes(bid);
326
+ }
327
+ return mediaTypesInfo;
328
+ }
329
+
330
+ registerBidder(spec);
@@ -0,0 +1,62 @@
1
+ # Overview
2
+
3
+ ```
4
+ Module Name: STV/Smartstream Bidder Adapter
5
+ Module Type: Bidder Adapter
6
+ Maintainer: prebid@smartstream.tv
7
+ ```
8
+
9
+ # Description
10
+
11
+ STV/Smartstream adapter for Prebid.
12
+
13
+ # Test Parameters
14
+ ```
15
+ var adUnits = [
16
+ {
17
+ code: 'test-div',
18
+ mediaTypes: {
19
+ banner: {
20
+ sizes: [
21
+ [300, 250],
22
+ [300, 600],
23
+ ]
24
+ }
25
+ },
26
+ bids: [
27
+ {
28
+ bidder: "stv",
29
+ params: {
30
+ placement: '101', // [required] info available from your contact with Smartstream team
31
+ /* // [optional params]
32
+ bcat: "IAB2,IAB4", // [optional] list of blocked advertiser categories (IAB), comma separated
33
+ */
34
+ }
35
+ }
36
+ ]
37
+ },
38
+ {
39
+ code: 'video1',
40
+ mediaTypes: {
41
+ video: {
42
+ playerSize: [640, 480],
43
+ context: 'instream'
44
+ }
45
+ },
46
+ bids: [{
47
+ bidder: 'stv',
48
+ params: {
49
+ placement: '106',
50
+ /* // [optional params]
51
+ bcat: "IAB2,IAB4", // [optional] list of blocked advertiser categories (IAB), comma separated
52
+ floorprice: 1000000, // input min_cpm_micros, CPM in EUR * 1000000
53
+ max_duration: 60, // in seconds
54
+ min_duration: 5, // in seconds
55
+ max_bitrate: 600,
56
+ api: [1,2], // https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/master/AdCOM%20v1.0%20FINAL.md#list--api-frameworks-
57
+ */
58
+ }
59
+ }]
60
+ }
61
+ ];
62
+ ```