prebid.js 7.25.0 → 7.27.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 (353) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/33acrossIdSystem.js +1 -1
  3. package/dist/adWMGAnalyticsAdapter.js +1 -1
  4. package/dist/adagioAnalyticsAdapter.js +1 -1
  5. package/dist/adagioBidAdapter.js +1 -1
  6. package/dist/adbookpspBidAdapter.js +1 -1
  7. package/dist/adgenerationBidAdapter.js +1 -1
  8. package/dist/adkernelAdnAnalyticsAdapter.js +1 -1
  9. package/dist/adlooxAdServerVideo.js +1 -1
  10. package/dist/adlooxAnalyticsAdapter.js +1 -1
  11. package/dist/adlooxRtdProvider.js +1 -1
  12. package/dist/admaticBidAdapter.js +1 -1
  13. package/dist/admixerBidAdapter.js +1 -1
  14. package/dist/adomikAnalyticsAdapter.js +1 -1
  15. package/dist/adrelevantisBidAdapter.js +1 -1
  16. package/dist/adtrgtmeBidAdapter.js +1 -1
  17. package/dist/adxcgAnalyticsAdapter.js +1 -1
  18. package/dist/adxcgBidAdapter.js +1 -1
  19. package/dist/adxpremiumAnalyticsAdapter.js +1 -1
  20. package/dist/aidemBidAdapter.js +1 -0
  21. package/dist/ajaBidAdapter.js +1 -1
  22. package/dist/amxBidAdapter.js +1 -1
  23. package/dist/amxIdSystem.js +1 -1
  24. package/dist/analyticsAdapter.js +1 -1
  25. package/dist/appierAnalyticsAdapter.js +1 -1
  26. package/dist/appnexusBidAdapter.js +1 -1
  27. package/dist/asoBidAdapter.js +1 -1
  28. package/dist/atsAnalyticsAdapter.js +1 -1
  29. package/dist/axonixBidAdapter.js +1 -1
  30. package/dist/beopBidAdapter.js +1 -1
  31. package/dist/bidViewability.js +1 -1
  32. package/dist/bidglassBidAdapter.js +1 -1
  33. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  34. package/dist/big-richmediaBidAdapter.js +1 -1
  35. package/dist/bridgewellBidAdapter.js +1 -1
  36. package/dist/brightMountainMediaBidAdapter.js +1 -1
  37. package/dist/browsiRtdProvider.js +1 -1
  38. package/dist/bucksenseBidAdapter.js +1 -1
  39. package/dist/byDataAnalyticsAdapter.js +1 -1
  40. package/dist/captifyRtdProvider.js +1 -0
  41. package/dist/carodaBidAdapter.js +1 -1
  42. package/dist/chtnwBidAdapter.js +1 -1
  43. package/dist/concertAnalyticsAdapter.js +1 -1
  44. package/dist/concertBidAdapter.js +1 -1
  45. package/dist/connectadBidAdapter.js +1 -1
  46. package/dist/consentManagement.js +1 -1
  47. package/dist/consentManagementUsp.js +1 -1
  48. package/dist/consumableBidAdapter.js +1 -1
  49. package/dist/conversantAnalyticsAdapter.js +1 -1
  50. package/dist/conversantBidAdapter.js +1 -1
  51. package/dist/craftBidAdapter.js +1 -1
  52. package/dist/criteoBidAdapter.js +1 -1
  53. package/dist/datablocksAnalyticsAdapter.js +1 -1
  54. package/dist/dependencies.json +6 -0
  55. package/dist/dfpAdServerVideo.js +1 -1
  56. package/dist/discoveryBidAdapter.js +1 -1
  57. package/dist/dspxBidAdapter.js +1 -1
  58. package/dist/eplanningAnalyticsAdapter.js +1 -1
  59. package/dist/eplanningBidAdapter.js +1 -1
  60. package/dist/finativeBidAdapter.js +1 -1
  61. package/dist/fintezaAnalyticsAdapter.js +1 -1
  62. package/dist/fluctBidAdapter.js +1 -1
  63. package/dist/ftrackIdSystem.js +1 -1
  64. package/dist/gdprEnforcement.js +1 -1
  65. package/dist/genericAnalyticsAdapter.js +1 -0
  66. package/dist/geoedgeRtdProvider.js +1 -1
  67. package/dist/glimpseBidAdapter.js +1 -1
  68. package/dist/glomexBidAdapter.js +1 -1
  69. package/dist/gmosspBidAdapter.js +1 -1
  70. package/dist/goldbachBidAdapter.js +1 -1
  71. package/dist/googleAnalyticsAdapter.js +1 -1
  72. package/dist/gravitoIdSystem.js +1 -1
  73. package/dist/gridBidAdapter.js +1 -1
  74. package/dist/gridNMBidAdapter.js +1 -1
  75. package/dist/growthCodeAnalyticsAdapter.js +1 -0
  76. package/dist/gumgumBidAdapter.js +1 -1
  77. package/dist/h12mediaBidAdapter.js +1 -1
  78. package/dist/hadronAnalyticsAdapter.js +1 -1
  79. package/dist/id5AnalyticsAdapter.js +1 -1
  80. package/dist/id5IdSystem.js +1 -1
  81. package/dist/impactifyBidAdapter.js +1 -1
  82. package/dist/improvedigitalBidAdapter.js +1 -1
  83. package/dist/inmarBidAdapter.js +1 -1
  84. package/dist/insticatorBidAdapter.js +1 -1
  85. package/dist/invisiblyAnalyticsAdapter.js +1 -1
  86. package/dist/ixBidAdapter.js +1 -1
  87. package/dist/justpremiumBidAdapter.js +1 -1
  88. package/dist/jwplayerRtdProvider.js +1 -1
  89. package/dist/kargoAnalyticsAdapter.js +1 -1
  90. package/dist/kinessoIdSystem.js +1 -1
  91. package/dist/konduitAnalyticsAdapter.js +1 -1
  92. package/dist/kueezBidAdapter.js +1 -1
  93. package/dist/kueezRtbBidAdapter.js +1 -1
  94. package/dist/lassoBidAdapter.js +1 -1
  95. package/dist/lifestreetBidAdapter.js +1 -1
  96. package/dist/limelightDigitalBidAdapter.js +1 -1
  97. package/dist/liveIntentAnalyticsAdapter.js +1 -1
  98. package/dist/liveIntentIdSystem.js +1 -1
  99. package/dist/livewrappedAnalyticsAdapter.js +1 -1
  100. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  101. package/dist/logicadBidAdapter.js +1 -1
  102. package/dist/loglyliftBidAdapter.js +1 -1
  103. package/dist/lotamePanoramaIdSystem.js +1 -1
  104. package/dist/magniteAnalyticsAdapter.js +1 -1
  105. package/dist/malltvAnalyticsAdapter.js +1 -1
  106. package/dist/marsmediaAnalyticsAdapter.js +1 -1
  107. package/dist/marsmediaBidAdapter.js +1 -1
  108. package/dist/mediafuseBidAdapter.js +1 -1
  109. package/dist/medianetAnalyticsAdapter.js +1 -1
  110. package/dist/mediasquareBidAdapter.js +1 -1
  111. package/dist/mgidBidAdapter.js +1 -1
  112. package/dist/minutemediaBidAdapter.js +1 -1
  113. package/dist/nextMillenniumBidAdapter.js +1 -1
  114. package/dist/nexx360BidAdapter.js +1 -1
  115. package/dist/not-for-prod/prebid.js +240 -202
  116. package/dist/oguryBidAdapter.js +1 -1
  117. package/dist/onetagBidAdapter.js +1 -1
  118. package/dist/ooloAnalyticsAdapter.js +1 -1
  119. package/dist/openxAnalyticsAdapter.js +1 -1
  120. package/dist/optimonAnalyticsAdapter.js +1 -1
  121. package/dist/outbrainBidAdapter.js +1 -1
  122. package/dist/parrableIdSystem.js +1 -1
  123. package/dist/pbsExtensions.js +1 -1
  124. package/dist/pianoDmpAnalyticsAdapter.js +1 -1
  125. package/dist/pixfutureBidAdapter.js +1 -1
  126. package/dist/prebid-core.js +1 -1
  127. package/dist/prebidServerBidAdapter.js +1 -1
  128. package/dist/prebidmanagerAnalyticsAdapter.js +1 -1
  129. package/dist/pubCommonId.js +1 -1
  130. package/dist/pubProvidedIdSystem.js +1 -1
  131. package/dist/publinkIdSystem.js +1 -1
  132. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  133. package/dist/pubmaticBidAdapter.js +1 -1
  134. package/dist/pubperfAnalyticsAdapter.js +1 -1
  135. package/dist/pubstackAnalyticsAdapter.js +1 -1
  136. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  137. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  138. package/dist/pulsepointAnalyticsAdapter.js +1 -1
  139. package/dist/pxyzBidAdapter.js +1 -1
  140. package/dist/quantcastBidAdapter.js +1 -1
  141. package/dist/quantcastIdSystem.js +1 -1
  142. package/dist/rasBidAdapter.js +1 -1
  143. package/dist/readpeakBidAdapter.js +1 -1
  144. package/dist/realvuAnalyticsAdapter.js +1 -1
  145. package/dist/redtramBidAdapter.js +1 -0
  146. package/dist/relaidoBidAdapter.js +1 -1
  147. package/dist/relevantAnalyticsAdapter.js +1 -1
  148. package/dist/rhythmoneBidAdapter.js +1 -1
  149. package/dist/riseBidAdapter.js +1 -1
  150. package/dist/rivrAnalyticsAdapter.js +1 -1
  151. package/dist/roxotAnalyticsAdapter.js +1 -1
  152. package/dist/rtbhouseBidAdapter.js +1 -1
  153. package/dist/rtdModule.js +1 -1
  154. package/dist/rubiconAnalyticsAdapter.js +1 -1
  155. package/dist/rubiconBidAdapter.js +1 -1
  156. package/dist/s2sTesting.js +1 -1
  157. package/dist/scaleableAnalyticsAdapter.js +1 -1
  158. package/dist/schain.js +1 -1
  159. package/dist/seedingAllianceBidAdapter.js +1 -1
  160. package/dist/seedtagBidAdapter.js +1 -1
  161. package/dist/sharedIdSystem.js +1 -1
  162. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  163. package/dist/sharethroughBidAdapter.js +1 -1
  164. package/dist/shinezBidAdapter.js +1 -1
  165. package/dist/sigmoidAnalyticsAdapter.js +1 -1
  166. package/dist/smaatoBidAdapter.js +1 -1
  167. package/dist/smartadserverBidAdapter.js +1 -1
  168. package/dist/smartxBidAdapter.js +1 -1
  169. package/dist/smartytechBidAdapter.js +1 -0
  170. package/dist/smilewantedBidAdapter.js +1 -1
  171. package/dist/sonobiAnalyticsAdapter.js +1 -1
  172. package/dist/sonobiBidAdapter.js +1 -1
  173. package/dist/sovrnAnalyticsAdapter.js +1 -1
  174. package/dist/sovrnBidAdapter.js +1 -1
  175. package/dist/sspBCBidAdapter.js +1 -1
  176. package/dist/staqAnalyticsAdapter.js +1 -1
  177. package/dist/sublimeBidAdapter.js +1 -1
  178. package/dist/synacormediaBidAdapter.js +1 -1
  179. package/dist/taboolaBidAdapter.js +1 -1
  180. package/dist/tapadIdSystem.js +1 -1
  181. package/dist/tappxBidAdapter.js +1 -1
  182. package/dist/targetVideoBidAdapter.js +1 -1
  183. package/dist/teadsBidAdapter.js +1 -1
  184. package/dist/teadsIdSystem.js +1 -1
  185. package/dist/terceptAnalyticsAdapter.js +1 -1
  186. package/dist/trionBidAdapter.js +1 -1
  187. package/dist/tripleliftBidAdapter.js +1 -1
  188. package/dist/ttdBidAdapter.js +1 -1
  189. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  190. package/dist/underdogmediaBidAdapter.js +1 -1
  191. package/dist/undertoneBidAdapter.js +1 -1
  192. package/dist/userId.js +1 -1
  193. package/dist/vidazooBidAdapter.js +1 -1
  194. package/dist/videobyteBidAdapter.js +1 -1
  195. package/dist/viqeoBidAdapter.js +1 -0
  196. package/dist/visxBidAdapter.js +1 -1
  197. package/dist/vuukleBidAdapter.js +1 -1
  198. package/dist/weboramaRtdProvider.js +1 -1
  199. package/dist/widespaceBidAdapter.js +1 -1
  200. package/dist/winrBidAdapter.js +1 -1
  201. package/dist/yahoosspBidAdapter.js +1 -1
  202. package/dist/yandexBidAdapter.js +1 -1
  203. package/dist/yieldlabBidAdapter.js +1 -1
  204. package/dist/yieldliftBidAdapter.js +1 -1
  205. package/dist/yieldmoBidAdapter.js +1 -1
  206. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  207. package/dist/yuktamediaAnalyticsAdapter.js +1 -1
  208. package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
  209. package/dist/zeta_global_sspBidAdapter.js +1 -1
  210. package/dist/zeusPrimeRtdProvider.js +31 -0
  211. package/integrationExamples/gpt/captifyRtdProvider_example.html +167 -0
  212. package/integrationExamples/gpt/growthcode.html +134 -0
  213. package/libraries/analyticsAdapter/AnalyticsAdapter.js +95 -102
  214. package/modules/.submodules.json +3 -1
  215. package/modules/admaticBidAdapter.js +116 -58
  216. package/modules/admaticBidAdapter.md +2 -2
  217. package/modules/admixerBidAdapter.js +1 -1
  218. package/modules/aidemBidAdapter.js +492 -0
  219. package/modules/aidemBidAdapter.md +187 -0
  220. package/modules/beopBidAdapter.js +17 -2
  221. package/modules/browsiRtdProvider.js +6 -4
  222. package/modules/bucksenseBidAdapter.js +1 -1
  223. package/modules/captifyRtdProvider.js +146 -0
  224. package/modules/captifyRtdProvider.md +68 -0
  225. package/modules/criteoBidAdapter.js +3 -3
  226. package/modules/discoveryBidAdapter.js +38 -17
  227. package/modules/discoveryBidAdapter.md +7 -6
  228. package/modules/eplanningBidAdapter.js +2 -6
  229. package/modules/fluctBidAdapter.js +5 -0
  230. package/modules/gdprEnforcement.js +26 -24
  231. package/modules/genericAnalyticsAdapter.js +157 -0
  232. package/modules/geoedgeRtdProvider.js +22 -0
  233. package/modules/glomexBidAdapter.js +2 -0
  234. package/modules/gravitoIdSystem.js +3 -4
  235. package/modules/gridBidAdapter.js +441 -23
  236. package/modules/gridNMBidAdapter.js +1 -1
  237. package/modules/growthCodeAnalyticsAdapter.js +176 -0
  238. package/modules/growthCodeAnalyticsAdapter.md +41 -0
  239. package/modules/impactifyBidAdapter.js +19 -1
  240. package/modules/jwplayerRtdProvider.js +1 -2
  241. package/modules/limelightDigitalBidAdapter.js +1 -1
  242. package/modules/minutemediaBidAdapter.md +3 -3
  243. package/modules/nextMillenniumBidAdapter.js +19 -23
  244. package/modules/nexx360BidAdapter.js +264 -138
  245. package/modules/pubCommonId.js +2 -1
  246. package/modules/pubProvidedIdSystem.js +2 -0
  247. package/modules/rasBidAdapter.js +8 -3
  248. package/modules/rasBidAdapter.md +16 -15
  249. package/modules/redtramBidAdapter.js +155 -0
  250. package/modules/redtramBidAdapter.md +33 -0
  251. package/modules/riseBidAdapter.js +15 -0
  252. package/modules/riseBidAdapter.md +3 -3
  253. package/modules/rtbhouseBidAdapter.js +90 -29
  254. package/modules/rubiconBidAdapter.js +2 -1
  255. package/modules/seedtagBidAdapter.js +67 -56
  256. package/modules/seedtagBidAdapter.md +60 -0
  257. package/modules/sharedIdSystem.js +3 -1
  258. package/modules/smartadserverBidAdapter.js +6 -2
  259. package/modules/smartxBidAdapter.js +11 -8
  260. package/modules/smartytechBidAdapter.js +78 -0
  261. package/modules/smartytechBidAdapter.md +44 -0
  262. package/modules/smnBidAdapter.md +52 -0
  263. package/modules/taboolaBidAdapter.js +3 -3
  264. package/modules/taboolaBidAdapter.md +0 -2
  265. package/modules/tappxBidAdapter.js +21 -6
  266. package/modules/tripleliftBidAdapter.js +1 -1
  267. package/modules/ttdBidAdapter.js +8 -3
  268. package/modules/userId/index.js +1 -1
  269. package/modules/vidazooBidAdapter.js +26 -3
  270. package/modules/viqeoBidAdapter.js +180 -0
  271. package/modules/viqeoBidAdapter.md +56 -0
  272. package/modules/yandexBidAdapter.js +85 -19
  273. package/modules/yandexBidAdapter.md +7 -7
  274. package/modules/yieldlabBidAdapter.js +29 -12
  275. package/modules/yieldliftBidAdapter.js +3 -3
  276. package/modules/yieldoneBidAdapter.js +60 -8
  277. package/modules/yieldoneBidAdapter.md +109 -9
  278. package/modules/zeta_global_sspBidAdapter.js +4 -0
  279. package/modules/zeusPrimeRtdProvider.js +357 -0
  280. package/modules/zeusPrimeRtdProvider.md +60 -0
  281. package/package.json +1 -1
  282. package/src/adloader.js +0 -1
  283. package/src/auction.js +19 -3
  284. package/src/consentHandler.js +8 -0
  285. package/src/events.js +4 -0
  286. package/src/native.js +31 -20
  287. package/src/refererDetection.js +6 -1
  288. package/src/storageManager.js +6 -3
  289. package/test/helpers/analytics.js +34 -0
  290. package/test/mocks/analyticsStub.js +3 -1
  291. package/test/spec/AnalyticsAdapter_spec.js +119 -116
  292. package/test/spec/auctionmanager_spec.js +86 -0
  293. package/test/spec/modules/adWMGAnalyticsAdapter_spec.js +10 -8
  294. package/test/spec/modules/adagioAnalyticsAdapter_spec.js +18 -25
  295. package/test/spec/modules/admaticBidAdapter_spec.js +262 -3
  296. package/test/spec/modules/aidemBidAdapter_spec.js +664 -0
  297. package/test/spec/modules/beopBidAdapter_spec.js +52 -0
  298. package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +0 -2
  299. package/test/spec/modules/browsiRtdProvider_spec.js +2 -1
  300. package/test/spec/modules/captifyRtdProvider_spec.js +253 -0
  301. package/test/spec/modules/concertAnalyticsAdapter_spec.js +2 -4
  302. package/test/spec/modules/discoveryBidAdapter_spec.js +9 -8
  303. package/test/spec/modules/enrichmentFpdModule_spec.js +3 -2
  304. package/test/spec/modules/eplanningAnalyticsAdapter_spec.js +0 -3
  305. package/test/spec/modules/eplanningBidAdapter_spec.js +4 -4
  306. package/test/spec/modules/fluctBidAdapter_spec.js +37 -1
  307. package/test/spec/modules/fpdModule_spec.js +1 -1
  308. package/test/spec/modules/gdprEnforcement_spec.js +115 -68
  309. package/test/spec/modules/genericAnalyticsAdapter_spec.js +284 -0
  310. package/test/spec/modules/geoedgeRtdProvider_spec.js +15 -0
  311. package/test/spec/modules/glomexBidAdapter_spec.js +4 -0
  312. package/test/spec/modules/gravitoIdSystem_spec.js +1 -1
  313. package/test/spec/modules/gridBidAdapter_spec.js +289 -1
  314. package/test/spec/modules/growthCodeAnalyticsAdapter_spec.js +70 -0
  315. package/test/spec/modules/impactifyBidAdapter_spec.js +13 -0
  316. package/test/spec/modules/invisiblyAnalyticsAdapter_spec.js +17 -27
  317. package/test/spec/modules/jwplayerRtdProvider_spec.js +3 -3
  318. package/test/spec/modules/konduitAnalyticsAdapter_spec.js +0 -2
  319. package/test/spec/modules/liveIntentAnalyticsAdapter_spec.js +3 -6
  320. package/test/spec/modules/medianetAnalyticsAdapter_spec.js +7 -1
  321. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +4 -3
  322. package/test/spec/modules/nexx360BidAdapter_spec.js +441 -221
  323. package/test/spec/modules/optimonAnalyticsAdapter_spec.js +3 -11
  324. package/test/spec/modules/pianoDmpAnalyticsAdapter_spec.js +4 -11
  325. package/test/spec/modules/prebidmanagerAnalyticsAdapter_spec.js +3 -12
  326. package/test/spec/modules/pubperfAnalyticsAdapter_spec.js +6 -19
  327. package/test/spec/modules/pubstackAnalyticsAdapter_spec.js +3 -17
  328. package/test/spec/modules/pubwiseAnalyticsAdapter_spec.js +13 -19
  329. package/test/spec/modules/rasBidAdapter_spec.js +5 -1
  330. package/test/spec/modules/redtramBidAdapter_spec.js +256 -0
  331. package/test/spec/modules/riseBidAdapter_spec.js +24 -0
  332. package/test/spec/modules/rtbhouseBidAdapter_spec.js +79 -0
  333. package/test/spec/modules/seedtagBidAdapter_spec.js +65 -92
  334. package/test/spec/modules/sigmoidAnalyticsAdapter_spec.js +4 -8
  335. package/test/spec/modules/smartadserverBidAdapter_spec.js +80 -0
  336. package/test/spec/modules/smartxBidAdapter_spec.js +32 -0
  337. package/test/spec/modules/smartytechBidAdapter_spec.js +162 -0
  338. package/test/spec/modules/sovrnAnalyticsAdapter_spec.js +6 -18
  339. package/test/spec/modules/taboolaBidAdapter_spec.js +0 -77
  340. package/test/spec/modules/tripleliftBidAdapter_spec.js +3 -10
  341. package/test/spec/modules/ttdBidAdapter_spec.js +27 -0
  342. package/test/spec/modules/vidazooBidAdapter_spec.js +39 -24
  343. package/test/spec/modules/viqeoBidAdapter_spec.js +124 -0
  344. package/test/spec/modules/yandexBidAdapter_spec.js +22 -13
  345. package/test/spec/modules/yieldlabBidAdapter_spec.js +174 -20
  346. package/test/spec/modules/yieldliftBidAdapter_spec.js +1 -1
  347. package/test/spec/modules/yieldoneAnalyticsAdapter_spec.js +5 -2
  348. package/test/spec/modules/yieldoneBidAdapter_spec.js +30 -6
  349. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +16 -1
  350. package/test/spec/modules/zeusPrimeRtdProvider_spec.js +410 -0
  351. package/test/spec/native_spec.js +68 -56
  352. package/test/spec/refererDetection_spec.js +45 -7
  353. package/test/spec/unit/core/storageManager_spec.js +2 -1
@@ -1,176 +1,302 @@
1
- import {ajax} from '../src/ajax.js';
2
1
  import {config} from '../src/config.js';
3
- import { transformBidderParamKeywords } from '../src/utils.js';
2
+ import * as utils from '../src/utils.js';
4
3
  import {registerBidder} from '../src/adapters/bidderFactory.js';
5
4
  import {BANNER, VIDEO} from '../src/mediaTypes.js';
5
+ import {getGlobal} from '../src/prebidGlobal.js';
6
6
 
7
+ const VIDEO_TARGETING = ['startdelay', 'mimes', 'minduration', 'maxduration', 'delivery',
8
+ 'startdelay', 'skip', 'playbackmethod', 'api', 'protocol', 'boxingallowed', 'maxextended',
9
+ 'linearity', 'delivery', 'protocols', 'placement', 'minbitrate', 'maxbitrate', 'battr', 'ext'];
7
10
  const BIDDER_CODE = 'nexx360';
8
- const BIDDER_URL = 'https://fast.nexx360.io/prebid';
9
- const CACHE_URL = 'https://fast.nexx360.io/cache';
10
- const METRICS_TRACKER_URL = 'https://fast.nexx360.io/track-imp';
11
+ const REQUEST_URL = 'https://fast.nexx360.io/booster';
12
+
13
+ const PAGE_VIEW_ID = utils.generateUUID();
14
+
15
+ const BIDDER_VERSION = '1.0';
11
16
 
12
17
  const GVLID = 965;
13
18
 
14
19
  export const spec = {
15
20
  code: BIDDER_CODE,
16
21
  gvlid: GVLID,
17
- aliases: ['revenuemaker'], // short code
22
+ aliases: [
23
+ { code: 'revenuemaker' },
24
+ { code: 'firstid-ssp' },
25
+ ],
18
26
  supportedMediaTypes: [BANNER, VIDEO],
19
- /**
27
+ isBidRequestValid,
28
+ buildRequests,
29
+ interpretResponse,
30
+ getUserSyncs,
31
+ // onBidWon,
32
+ };
33
+
34
+ registerBidder(spec);
35
+
36
+ /**
20
37
  * Determines whether or not the given bid request is valid.
21
38
  *
22
39
  * @param {BidRequest} bid The bid params to validate.
23
40
  * @return boolean True if this is a valid bid, and false otherwise.
24
41
  */
25
- isBidRequestValid: function(bid) {
26
- if (!!bid.params.bidfloorCurrency && !['EUR', 'USD'].includes(bid.params.bidfloorCurrency)) return false;
27
- if (!!bid.params.bidfloor && typeof bid.params.bidfloor !== 'number') return false;
28
- if (!!bid.params.keywords && typeof bid.params.keywords !== 'object') return false;
29
- return !!(bid.params.account && bid.params.tagId);
30
- },
31
- /**
42
+ function isBidRequestValid(bid) {
43
+ return !!bid.params.tagId || !!bid.params.videoTagId;
44
+ };
45
+
46
+ /**
32
47
  * Make a server request from the list of BidRequests.
33
48
  *
34
49
  * @param {validBidRequests[]} - an array of bids
35
50
  * @return ServerRequest Info describing the request to the server.
36
51
  */
37
- buildRequests: function(validBidRequests, bidderRequest) {
38
- const adUnits = [];
39
- const test = config.getConfig('debug') ? 1 : 0;
40
- let adunitValue = null;
41
- let userEids = null;
42
- Object.keys(validBidRequests).forEach(key => {
43
- adunitValue = validBidRequests[key];
44
- const foo = {
45
- account: adunitValue.params.account,
46
- tagId: adunitValue.params.tagId,
47
- videoExt: adunitValue.params.videoExt,
48
- label: adunitValue.adUnitCode,
49
- bidId: adunitValue.bidId,
50
- auctionId: adunitValue.auctionId,
51
- transactionId: adunitValue.transactionId,
52
- mediatypes: adunitValue.mediaTypes,
53
- bidfloor: adunitValue.params.bidfloor || 0,
54
- bidfloorCurrency: adunitValue.params.bidfloorCurrency || 'USD',
55
- keywords: adunitValue.params.keywords ? transformBidderParamKeywords(adunitValue.params.keywords) : [],
52
+
53
+ function buildRequests(bids, bidderRequest) {
54
+ const data = getBaseRequest(bids[0], bidderRequest);
55
+ bids.forEach((bid) => {
56
+ const impObject = createImpObject(bid);
57
+ if (isBannerBid(bid)) impObject.banner = getBannerObject(bid);
58
+ if (isVideoBid(bid)) impObject.video = getVideoObject(bid);
59
+ data.imp.push(impObject);
60
+ });
61
+ return {
62
+ method: 'POST',
63
+ url: REQUEST_URL,
64
+ data,
65
+ }
66
+ }
67
+
68
+ function createImpObject(bid) {
69
+ const floor = getFloor(bid, BANNER);
70
+ const imp = {
71
+ id: bid.bidId,
72
+ tagid: bid.adUnitCode,
73
+ ext: {
74
+ divId: bid.adUnitCode,
75
+ nexx360: {
76
+ videoTagId: bid.params.videoTagId,
77
+ tagId: bid.params.tagId,
78
+ allBids: bid.params.allBids === true,
56
79
  }
57
- adUnits.push(foo);
58
- if (adunitValue.userIdAsEids) userEids = adunitValue.userIdAsEids;
80
+ }
81
+ };
82
+ if (bid.params.customParams) {
83
+ utils.deepSetValue(imp, 'ext.customParams', bid.params.customParams);
84
+ }
85
+ enrichImp(imp, bid, floor);
86
+ return imp;
87
+ }
88
+
89
+ function getBannerObject(bid) {
90
+ return {
91
+ format: toFormat(bid.mediaTypes.banner.sizes),
92
+ topframe: utils.inIframe() ? 0 : 1
93
+ };
94
+ }
95
+
96
+ function getVideoObject(bid) {
97
+ let width, height;
98
+ const videoParams = utils.deepAccess(bid, `mediaTypes.video`);
99
+ const playerSize = utils.deepAccess(bid, 'mediaTypes.video.playerSize');
100
+ const context = utils.deepAccess(bid, 'mediaTypes.video.context');
101
+ // normalize config for video size
102
+ if (utils.isArray(bid.sizes) && bid.sizes.length === 2 && !utils.isArray(bid.sizes[0])) {
103
+ width = parseInt(bid.sizes[0], 10);
104
+ height = parseInt(bid.sizes[1], 10);
105
+ } else if (utils.isArray(bid.sizes) && utils.isArray(bid.sizes[0]) && bid.sizes[0].length === 2) {
106
+ width = parseInt(bid.sizes[0][0], 10);
107
+ height = parseInt(bid.sizes[0][1], 10);
108
+ } else if (utils.isArray(playerSize) && playerSize.length === 2) {
109
+ width = parseInt(playerSize[0], 10);
110
+ height = parseInt(playerSize[1], 10);
111
+ }
112
+ const video = {
113
+ playerSize: [height, width],
114
+ context,
115
+ };
116
+
117
+ Object.keys(videoParams)
118
+ .filter(param => VIDEO_TARGETING.includes(param))
119
+ .forEach(param => video[param] = videoParams[param]);
120
+ return video;
121
+ }
122
+
123
+ function isVideoBid(bid) {
124
+ return utils.deepAccess(bid, 'mediaTypes.video');
125
+ }
126
+
127
+ function isBannerBid(bid) {
128
+ return utils.deepAccess(bid, 'mediaTypes.banner') || !isVideoBid(bid);
129
+ }
130
+
131
+ function toFormat(sizes) {
132
+ return sizes.map((s) => {
133
+ return { w: s[0], h: s[1] };
134
+ });
135
+ }
136
+
137
+ function getFloor(bid, mediaType) {
138
+ let floor = 0;
139
+ if (typeof bid.getFloor === 'function') {
140
+ const floorInfo = bid.getFloor({
141
+ currency: 'USD',
142
+ mediaType: mediaType,
143
+ size: '*'
59
144
  });
60
- const payload = {
61
- adUnits,
62
- // TODO: does the fallback make sense here?
63
- href: encodeURIComponent(bidderRequest.refererInfo.page || bidderRequest.refererInfo.topmostLocation)
64
- };
65
- if (bidderRequest) { // modules informations (gdpr, ccpa, schain, userId)
66
- if (bidderRequest.gdprConsent) {
67
- payload.gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0;
68
- payload.gdprConsent = bidderRequest.gdprConsent.consentString;
69
- } else {
70
- payload.gdpr = 0;
71
- payload.gdprConsent = '';
72
- }
73
- if (bidderRequest.uspConsent) { payload.uspConsent = bidderRequest.uspConsent; }
74
- if (bidderRequest.schain) { payload.schain = bidderRequest.schain; }
75
- if (userEids !== null) payload.userEids = userEids;
76
- };
77
- if (test) payload.test = 1;
78
- const payloadString = JSON.stringify(payload);
79
- return {
80
- method: 'POST',
81
- url: BIDDER_URL,
82
- data: payloadString,
83
- };
84
- },
85
- /**
145
+
146
+ if (typeof floorInfo === 'object' &&
147
+ floorInfo.currency === 'USD' &&
148
+ !isNaN(parseFloat(floorInfo.floor))) {
149
+ floor = Math.max(floor, parseFloat(floorInfo.floor));
150
+ }
151
+ }
152
+
153
+ return floor;
154
+ }
155
+
156
+ function enrichImp(imp, bid, floor) {
157
+ if (bid.params.customParams) {
158
+ utils.deepSetValue(imp, 'ext.customParams', bid.params.customParams);
159
+ }
160
+ if (floor > 0) {
161
+ imp.bidfloor = floor;
162
+ imp.bidfloorcur = 'USD';
163
+ } else if (bid.params.customFloor) {
164
+ imp.bidfloor = bid.params.customFloor;
165
+ }
166
+ if (bid.ortb2Imp && bid.ortb2Imp.ext && bid.ortb2Imp.ext.data) {
167
+ imp.ext.data = bid.ortb2Imp.ext.data;
168
+ }
169
+ }
170
+
171
+ function getBaseRequest(bid, bidderRequest) {
172
+ let req = {
173
+ id: bidderRequest.auctionId,
174
+ imp: [],
175
+ cur: [config.getConfig('currency.adServerCurrency') || 'USD'],
176
+ at: 1,
177
+ tmax: config.getConfig('bidderTimeout'),
178
+ site: {
179
+ page: bidderRequest.refererInfo.topmostLocation || bidderRequest.refererInfo.page,
180
+ domain: bidderRequest.refererInfo.domain,
181
+ },
182
+ regs: {
183
+ coppa: (config.getConfig('coppa') === true || bid.params.coppa) ? 1 : 0,
184
+ },
185
+ device: {
186
+ dnt: (utils.getDNT() || bid.params.doNotTrack) ? 1 : 0,
187
+ h: screen.height,
188
+ w: screen.width,
189
+ ua: window.navigator.userAgent,
190
+ language: window.navigator.language.split('-').shift()
191
+ },
192
+ user: {},
193
+ ext: {
194
+ source: 'prebid.js',
195
+ version: '$prebid.version$',
196
+ pageViewId: PAGE_VIEW_ID,
197
+ bidderVersion: BIDDER_VERSION,
198
+ }
199
+ };
200
+
201
+ if (bid.params.platform) {
202
+ utils.deepSetValue(req, 'ext.platform', bid.params.platform);
203
+ }
204
+ if (bid.params.response_template_name) {
205
+ utils.deepSetValue(req, 'ext.response_template_name', bid.params.response_template_name);
206
+ }
207
+ req.test = config.getConfig('debug') ? 1 : 0;
208
+ if (bidderRequest.gdprConsent) {
209
+ if (bidderRequest.gdprConsent.gdprApplies !== undefined) {
210
+ utils.deepSetValue(req, 'regs.ext.gdpr', bidderRequest.gdprConsent.gdprApplies === true ? 1 : 0);
211
+ }
212
+ if (bidderRequest.gdprConsent.consentString !== undefined) {
213
+ utils.deepSetValue(req, 'user.ext.consent', bidderRequest.gdprConsent.consentString);
214
+ }
215
+ if (bidderRequest.gdprConsent.addtlConsent !== undefined) {
216
+ utils.deepSetValue(req, 'user.ext.ConsentedProvidersSettings.consented_providers', bidderRequest.gdprConsent.addtlConsent);
217
+ }
218
+ }
219
+ if (bidderRequest.uspConsent) {
220
+ utils.deepSetValue(req, 'regs.ext.us_privacy', bidderRequest.uspConsent);
221
+ }
222
+ if (bid.schain) {
223
+ utils.deepSetValue(req, 'source.ext.schain', bid.schain);
224
+ }
225
+ if (bid.userIdAsEids) {
226
+ utils.deepSetValue(req, 'user.ext.eids', bid.userIdAsEids);
227
+ }
228
+ const commonFpd = bidderRequest.ortb2 || {};
229
+ if (commonFpd.site) {
230
+ utils.mergeDeep(req, {site: commonFpd.site});
231
+ }
232
+ if (commonFpd.user) {
233
+ utils.mergeDeep(req, {user: commonFpd.user});
234
+ }
235
+ return req;
236
+ }
237
+
238
+ /**
86
239
  * Unpack the response from the server into a list of bids.
87
240
  *
88
241
  * @param {ServerResponse} serverResponse A successful response from the server.
89
242
  * @return {Bid[]} An array of bids which were nested inside the server.
90
243
  */
91
- interpretResponse: function(serverResponse, bidRequest) {
92
- const serverBody = serverResponse.body;
93
- const bidResponses = [];
94
- let bidResponse = null;
95
- let value = null;
96
- if (serverBody.hasOwnProperty('responses')) {
97
- Object.keys(serverBody['responses']).forEach(key => {
98
- value = serverBody['responses'][key];
99
- const url = `${CACHE_URL}?uuid=${value['uuid']}`;
100
- bidResponse = {
101
- requestId: value['bidId'],
102
- cpm: value['cpm'],
103
- currency: value['currency'],
104
- width: value['width'],
105
- height: value['height'],
106
- ttl: value['ttl'],
107
- creativeId: value['creativeId'],
108
- netRevenue: true,
109
- nexx360: {
110
- 'ssp': value['bidder'],
111
- 'consent': value['consent'],
112
- 'tagId': value['tagId']
113
- },
114
- /*
115
- meta: {
116
- 'advertiserDomains': value['adomain']
117
- }
118
- */
119
- };
120
- if (value.type === 'banner') bidResponse.adUrl = url;
121
- if (value.type === 'video') {
122
- const params = {
123
- type: 'prebid',
124
- mediatype: 'video',
125
- ssp: value.bidder,
126
- tag_id: value.tagId,
127
- consent: value.consent,
128
- price: value.cpm,
129
- };
130
- bidResponse.cpm = value.cpm;
131
- bidResponse.mediaType = 'video';
132
- bidResponse.vastUrl = url;
133
- bidResponse.vastImpUrl = `${METRICS_TRACKER_URL}?${new URLSearchParams(params).toString()}`;
134
- }
135
- bidResponses.push(bidResponse);
136
- });
137
- }
138
- return bidResponses;
139
- },
244
+ function interpretResponse(response, req) {
245
+ const { bidderSettings } = getGlobal();
246
+ const allowAlternateBidderCodes = bidderSettings && bidderSettings.standard ? bidderSettings.standard.allowAlternateBidderCodes : false;
247
+ const respBody = response.body;
248
+ if (!respBody || !Array.isArray(respBody.seatbid)) {
249
+ return [];
250
+ }
251
+
252
+ let bids = [];
253
+ respBody.seatbid.forEach(seatbid => {
254
+ bids = [...bids, ...seatbid.bid.map(bid => {
255
+ const response = {
256
+ requestId: bid.impid,
257
+ cpm: bid.price,
258
+ width: bid.w,
259
+ height: bid.h,
260
+ creativeId: bid.crid,
261
+ dealId: bid.dealid,
262
+ currency: respBody.cur || 'USD',
263
+ netRevenue: true,
264
+ ttl: 120,
265
+ bidderCode: allowAlternateBidderCodes ? `n360-${bid.ssp}` : 'nexx360',
266
+ mediaType: bid.type === 'banner' ? 'banner' : 'video',
267
+ meta: { advertiserDomains: bid.adomain },
268
+ };
269
+ // if (bid.dealid) response.dealid = bid.dealid;
140
270
 
141
- /**
271
+ if (response.mediaType === 'banner') {
272
+ response.adUrl = bid.adUrl;
273
+ }
274
+
275
+ if (['instream', 'outstream'].includes(bid.type)) response.vastXml = bid.vastXml;
276
+
277
+ if (bid.ext) {
278
+ response.meta.networkId = bid.ext.dsp_id;
279
+ response.meta.advertiserId = bid.ext.buyer_id;
280
+ response.meta.brandId = bid.ext.brand_id;
281
+ }
282
+ return response;
283
+ })];
284
+ });
285
+ return bids;
286
+ }
287
+
288
+ /**
142
289
  * Register the user sync pixels which should be dropped after the auction.
143
290
  *
144
291
  * @param {SyncOptions} syncOptions Which user syncs are allowed?
145
292
  * @param {ServerResponse[]} serverResponses List of server's responses.
146
293
  * @return {UserSync[]} The user syncs which should be dropped.
147
294
  */
148
- getUserSyncs: function(syncOptions, serverResponses, gdprConsent, uspConsent) {
149
- if (typeof serverResponses === 'object' && serverResponses != null && serverResponses.length > 0 && serverResponses[0].hasOwnProperty('body') &&
295
+ function getUserSyncs(syncOptions, serverResponses, gdprConsent, uspConsent) {
296
+ if (typeof serverResponses === 'object' && serverResponses != null && serverResponses.length > 0 && serverResponses[0].hasOwnProperty('body') &&
150
297
  serverResponses[0].body.hasOwnProperty('cookies') && typeof serverResponses[0].body.cookies === 'object') {
151
- return serverResponses[0].body.cookies.slice(0, 5);
152
- } else {
153
- return [];
154
- }
155
- },
156
-
157
- /**
158
- * Register bidder specific code, which will execute if a bid from this bidder won the auction
159
- * @param {Bid} The bid that won the auction
160
- */
161
- onBidWon: function(bid) {
162
- // fires a pixel to confirm a winning bid
163
- const params = { type: 'prebid', mediatype: 'banner' };
164
- if (bid.hasOwnProperty('nexx360')) {
165
- if (bid.nexx360.hasOwnProperty('ssp')) params.ssp = bid.nexx360.ssp;
166
- if (bid.nexx360.hasOwnProperty('tagId')) params.tag_id = bid.nexx360.tagId;
167
- if (bid.nexx360.hasOwnProperty('consent')) params.consent = bid.nexx360.consent;
168
- };
169
- params.price = bid.cpm;
170
- const url = `${METRICS_TRACKER_URL}?${new URLSearchParams(params).toString()}`;
171
- ajax(url, null, undefined, {method: 'GET', withCredentials: true});
172
- return true;
298
+ return serverResponses[0].body.cookies.slice(0, 5);
299
+ } else {
300
+ return [];
173
301
  }
174
-
175
- }
176
- registerBidder(spec);
302
+ };
@@ -9,8 +9,9 @@ import * as events from '../src/events.js';
9
9
  import CONSTANTS from '../src/constants.json';
10
10
  import { getStorageManager } from '../src/storageManager.js';
11
11
  import {timedAuctionHook} from '../src/utils/perfMetrics.js';
12
+ import {VENDORLESS_GVLID} from '../src/consentHandler.js';
12
13
 
13
- const storage = getStorageManager({moduleName: 'pubCommonId'});
14
+ const storage = getStorageManager({moduleName: 'pubCommonId', gvlid: VENDORLESS_GVLID});
14
15
 
15
16
  const ID_NAME = '_pubcid';
16
17
  const OPTOUT_NAME = '_pubcid_optout';
@@ -7,6 +7,7 @@
7
7
 
8
8
  import {submodule} from '../src/hook.js';
9
9
  import { logInfo, isArray } from '../src/utils.js';
10
+ import {VENDORLESS_GVLID} from '../src/consentHandler.js';
10
11
 
11
12
  const MODULE_NAME = 'pubProvidedId';
12
13
 
@@ -18,6 +19,7 @@ export const pubProvidedIdSubmodule = {
18
19
  * @type {string}
19
20
  */
20
21
  name: MODULE_NAME,
22
+ gvlid: VENDORLESS_GVLID,
21
23
 
22
24
  /**
23
25
  * decode the stored id value for passing to bid request
@@ -1,4 +1,3 @@
1
- import * as utils from '../src/utils.js';
2
1
  import { registerBidder } from '../src/adapters/bidderFactory.js';
3
2
  import { BANNER } from '../src/mediaTypes.js';
4
3
  import { isEmpty, getAdUnitSizes, parseSizesInput, deepAccess } from '../src/utils.js';
@@ -12,9 +11,15 @@ const getEndpoint = (network) => {
12
11
 
13
12
  function parseParams(params, bidderRequest) {
14
13
  const newParams = {};
14
+ if (params.customParams && typeof params.customParams === 'object') {
15
+ for (const param in params.customParams) {
16
+ if (params.customParams.hasOwnProperty(param)) {
17
+ newParams[param] = params.customParams[param];
18
+ }
19
+ }
20
+ }
15
21
  const du = deepAccess(bidderRequest, 'refererInfo.page');
16
22
  const dr = deepAccess(bidderRequest, 'refererInfo.ref');
17
-
18
23
  if (du) {
19
24
  newParams.du = du;
20
25
  }
@@ -93,7 +98,7 @@ const getSlots = (bidRequests) => {
93
98
  const batchSize = bidRequests.length;
94
99
  for (let i = 0; i < batchSize; i++) {
95
100
  const adunit = bidRequests[i];
96
- const slotSequence = utils.deepAccess(adunit, 'params.slotSequence');
101
+ const slotSequence = deepAccess(adunit, 'params.slotSequence');
97
102
 
98
103
  const sizes = parseSizesInput(getAdUnitSizes(adunit)).join(',');
99
104
 
@@ -34,18 +34,19 @@ var adUnits = [{
34
34
 
35
35
  # Parameters
36
36
 
37
- | Name | Scope | Type | Description | Example
38
- | --- | --- | --- |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ---
39
- | network | required | String | Specific identifier provided by RAS | `"4178463"`
40
- | site | required | String | Specific identifier name (case-insensitive) that is associated with this ad unit and provided by RAS | `"example_com"`
41
- | area | required | String | Ad unit category name; only case-insensitive alphanumeric with underscores and hyphens are allowed | `"sport"`
42
- | slot | required | String | Ad unit placement name (case-insensitive) provided by RAS | `"slot"`
43
- | slotSequence | optional | Number | Ad unit sequence position provided by RAS | `1`
44
- | pageContext | optional | Object | Web page context data | `{}`
45
- | pageContext.dr | optional | String | Document referrer URL address | `"https://example.com/"`
46
- | pageContext.du | optional | String | Document URL address | `"https://example.com/sport/football/article.html?id=932016a5-02fc-4d5c-b643-fafc2f270f06"`
47
- | pageContext.dv | optional | String | Document virtual address as slash-separated path that may consist of any number of parts (case-insensitive alphanumeric with underscores and hyphens); first part should be the same as `site` value and second as `area` value; next parts may reflect website navigation | `"example_com/sport/football"`
48
- | pageContext.keyWords | optional | String[] | List of keywords associated with this ad unit; only case-insensitive alphanumeric with underscores and hyphens are allowed | `["euro", "lewandowski"]`
49
- | pageContext.keyValues | optional | Object | Key-values associated with this ad unit (case-insensitive); following characters are not allowed in the values: `" ' = ! + # * ~ ; ^ ( ) < > [ ] & @` | `{}`
50
- | pageContext.keyValues.ci | optional | String | Content unique identifier | `"932016a5-02fc-4d5c-b643-fafc2f270f06"`
51
- | pageContext.keyValues.adunit | optional | String | Ad unit name | `"example_com/sport"`
37
+ | Name | Scope | Type | Description | Example |
38
+ |------------------------------|----------|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------|
39
+ | network | required | String | Specific identifier provided by RAS | `"4178463"` |
40
+ | site | required | String | Specific identifier name (case-insensitive) that is associated with this ad unit and provided by RAS | `"example_com"` |
41
+ | area | required | String | Ad unit category name; only case-insensitive alphanumeric with underscores and hyphens are allowed | `"sport"` |
42
+ | slot | required | String | Ad unit placement name (case-insensitive) provided by RAS | `"slot"` |
43
+ | slotSequence | optional | Number | Ad unit sequence position provided by RAS | `1` |
44
+ | pageContext | optional | Object | Web page context data | `{}` |
45
+ | pageContext.dr | optional | String | Document referrer URL address | `"https://example.com/"` |
46
+ | pageContext.du | optional | String | Document URL address | `"https://example.com/sport/football/article.html?id=932016a5-02fc-4d5c-b643-fafc2f270f06"` |
47
+ | pageContext.dv | optional | String | Document virtual address as slash-separated path that may consist of any number of parts (case-insensitive alphanumeric with underscores and hyphens); first part should be the same as `site` value and second as `area` value; next parts may reflect website navigation | `"example_com/sport/football"` |
48
+ | pageContext.keyWords | optional | String[] | List of keywords associated with this ad unit; only case-insensitive alphanumeric with underscores and hyphens are allowed | `["euro", "lewandowski"]` |
49
+ | pageContext.keyValues | optional | Object | Key-values associated with this ad unit (case-insensitive); following characters are not allowed in the values: `" ' = ! + # * ~ ; ^ ( ) < > [ ] & @` | `{}` |
50
+ | pageContext.keyValues.ci | optional | String | Content unique identifier | `"932016a5-02fc-4d5c-b643-fafc2f270f06"` |
51
+ | pageContext.keyValues.adunit | optional | String | Ad unit name | `"example_com/sport"` |
52
+ | customParams | optional | Object | Custom request params | `{}` |