prebid.js 7.45.0 → 7.47.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 (204) 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/admaticBidAdapter.js +1 -1
  7. package/dist/adnuntiusBidAdapter.js +1 -1
  8. package/dist/adrelevantisBidAdapter.js +1 -1
  9. package/dist/adtrgtmeBidAdapter.js +1 -1
  10. package/dist/adxcgBidAdapter.js +1 -1
  11. package/dist/adyoulikeBidAdapter.js +1 -1
  12. package/dist/ajaBidAdapter.js +1 -1
  13. package/dist/amxBidAdapter.js +1 -1
  14. package/dist/amxIdSystem.js +1 -1
  15. package/dist/appierAnalyticsAdapter.js +1 -1
  16. package/dist/appnexusBidAdapter.js +1 -1
  17. package/dist/asoBidAdapter.js +1 -1
  18. package/dist/axonixBidAdapter.js +1 -1
  19. package/dist/bidglassBidAdapter.js +1 -1
  20. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  21. package/dist/big-richmediaBidAdapter.js +1 -1
  22. package/dist/bridgewellBidAdapter.js +1 -1
  23. package/dist/brightMountainMediaBidAdapter.js +1 -1
  24. package/dist/carodaBidAdapter.js +1 -1
  25. package/dist/chtnwBidAdapter.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/criteoIdSystem.js +1 -1
  34. package/dist/cwireBidAdapter.js +1 -1
  35. package/dist/debugging-standalone.js +1 -1
  36. package/dist/dependencies.json +3 -0
  37. package/dist/dspxBidAdapter.js +1 -1
  38. package/dist/emtvBidAdapter.js +1 -0
  39. package/dist/eplanningBidAdapter.js +1 -1
  40. package/dist/eskimiBidAdapter.js +1 -0
  41. package/dist/feedadBidAdapter.js +1 -1
  42. package/dist/finativeBidAdapter.js +1 -1
  43. package/dist/freewheel-sspBidAdapter.js +1 -1
  44. package/dist/glimpseBidAdapter.js +1 -1
  45. package/dist/gmosspBidAdapter.js +1 -1
  46. package/dist/goldbachBidAdapter.js +1 -1
  47. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  48. package/dist/gridBidAdapter.js +1 -1
  49. package/dist/gumgumBidAdapter.js +1 -1
  50. package/dist/h12mediaBidAdapter.js +1 -1
  51. package/dist/id5IdSystem.js +1 -1
  52. package/dist/improvedigitalBidAdapter.js +1 -1
  53. package/dist/inmarBidAdapter.js +1 -1
  54. package/dist/insticatorBidAdapter.js +1 -1
  55. package/dist/ixBidAdapter.js +1 -1
  56. package/dist/justpremiumBidAdapter.js +1 -1
  57. package/dist/kargoBidAdapter.js +1 -1
  58. package/dist/konduitAnalyticsAdapter.js +1 -1
  59. package/dist/kueezBidAdapter.js +1 -1
  60. package/dist/kueezRtbBidAdapter.js +1 -1
  61. package/dist/kulturemediaBidAdapter.js +1 -1
  62. package/dist/lassoBidAdapter.js +1 -1
  63. package/dist/lifestreetBidAdapter.js +1 -1
  64. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  65. package/dist/logicadBidAdapter.js +1 -1
  66. package/dist/loglyliftBidAdapter.js +1 -1
  67. package/dist/magniteAnalyticsAdapter.js +1 -1
  68. package/dist/malltvAnalyticsAdapter.js +1 -1
  69. package/dist/marsmediaBidAdapter.js +1 -1
  70. package/dist/mediafuseBidAdapter.js +1 -1
  71. package/dist/mediasquareBidAdapter.js +1 -1
  72. package/dist/mgidBidAdapter.js +1 -1
  73. package/dist/minutemediaBidAdapter.js +1 -1
  74. package/dist/minutemediaplusBidAdapter.js +1 -1
  75. package/dist/missenaBidAdapter.js +1 -1
  76. package/dist/nativoBidAdapter.js +1 -1
  77. package/dist/neuwoRtdProvider.js +1 -1
  78. package/dist/nextMillenniumBidAdapter.js +1 -1
  79. package/dist/nexx360BidAdapter.js +1 -1
  80. package/dist/not-for-prod/prebid.js +137 -135
  81. package/dist/oguryBidAdapter.js +1 -1
  82. package/dist/onetagBidAdapter.js +1 -1
  83. package/dist/ooloAnalyticsAdapter.js +1 -1
  84. package/dist/optidigitalBidAdapter.js +1 -1
  85. package/dist/ortbConverter.js +1 -1
  86. package/dist/outbrainBidAdapter.js +1 -1
  87. package/dist/pairIdSystem.js +1 -0
  88. package/dist/parrableIdSystem.js +1 -1
  89. package/dist/pixfutureBidAdapter.js +1 -1
  90. package/dist/prebid-core.js +1 -1
  91. package/dist/publinkIdSystem.js +1 -1
  92. package/dist/pubmaticBidAdapter.js +1 -1
  93. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  94. package/dist/pxyzBidAdapter.js +1 -1
  95. package/dist/quantcastBidAdapter.js +1 -1
  96. package/dist/readpeakBidAdapter.js +1 -1
  97. package/dist/relaidoBidAdapter.js +1 -1
  98. package/dist/rhythmoneBidAdapter.js +1 -1
  99. package/dist/riseBidAdapter.js +1 -1
  100. package/dist/rtbhouseBidAdapter.js +1 -1
  101. package/dist/rubiconAnalyticsAdapter.js +1 -1
  102. package/dist/rubiconBidAdapter.js +1 -1
  103. package/dist/seedingAllianceBidAdapter.js +1 -1
  104. package/dist/seedtagBidAdapter.js +1 -1
  105. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  106. package/dist/sharethroughBidAdapter.js +1 -1
  107. package/dist/shinezBidAdapter.js +1 -1
  108. package/dist/smaatoBidAdapter.js +1 -1
  109. package/dist/smartadserverBidAdapter.js +1 -1
  110. package/dist/smartxBidAdapter.js +1 -1
  111. package/dist/smilewantedBidAdapter.js +1 -1
  112. package/dist/sonobiBidAdapter.js +1 -1
  113. package/dist/sovrnAnalyticsAdapter.js +1 -1
  114. package/dist/sovrnBidAdapter.js +1 -1
  115. package/dist/sspBCBidAdapter.js +1 -1
  116. package/dist/stvBidAdapter.js +1 -1
  117. package/dist/sublimeBidAdapter.js +1 -1
  118. package/dist/synacormediaBidAdapter.js +1 -1
  119. package/dist/targetVideoBidAdapter.js +1 -1
  120. package/dist/teadsBidAdapter.js +1 -1
  121. package/dist/trionBidAdapter.js +1 -1
  122. package/dist/tripleliftBidAdapter.js +1 -1
  123. package/dist/ttdBidAdapter.js +1 -1
  124. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  125. package/dist/uid2IdSystem.js +1 -1
  126. package/dist/underdogmediaBidAdapter.js +1 -1
  127. package/dist/undertoneBidAdapter.js +1 -1
  128. package/dist/userId.js +1 -1
  129. package/dist/vidazooBidAdapter.js +1 -1
  130. package/dist/videobyteBidAdapter.js +1 -1
  131. package/dist/vidoomyBidAdapter.js +1 -1
  132. package/dist/visxBidAdapter.js +1 -1
  133. package/dist/vuukleBidAdapter.js +1 -1
  134. package/dist/widespaceBidAdapter.js +1 -1
  135. package/dist/winrBidAdapter.js +1 -1
  136. package/dist/yahoosspBidAdapter.js +1 -1
  137. package/dist/yieldmoBidAdapter.js +1 -1
  138. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  139. package/integrationExamples/gpt/fledge_example.html +103 -0
  140. package/integrationExamples/gpt/prebidServer_fledge_example.html +111 -0
  141. package/libraries/ortbConverter/processors/video.js +1 -0
  142. package/modules/admaticBidAdapter.js +7 -2
  143. package/modules/adnuntiusBidAdapter.js +3 -1
  144. package/modules/appnexusBidAdapter.js +108 -102
  145. package/modules/bidwatchAnalyticsAdapter.js +2 -0
  146. package/modules/conversantBidAdapter.js +3 -0
  147. package/modules/criteoBidAdapter.js +5 -1
  148. package/modules/criteoIdSystem.js +27 -14
  149. package/modules/emtvBidAdapter.js +211 -0
  150. package/modules/emtvBidAdapter.md +79 -0
  151. package/modules/eskimiBidAdapter.js +72 -0
  152. package/modules/eskimiBidAdapter.md +34 -0
  153. package/modules/gridBidAdapter.js +42 -19
  154. package/modules/ixBidAdapter.js +30 -0
  155. package/modules/kargoBidAdapter.js +473 -246
  156. package/modules/kueezRtbBidAdapter.js +16 -4
  157. package/modules/mediasquareBidAdapter.js +2 -1
  158. package/modules/minutemediaplusBidAdapter.js +16 -4
  159. package/modules/missenaBidAdapter.js +1 -1
  160. package/modules/nativoBidAdapter.js +110 -21
  161. package/modules/neuwoRtdProvider.js +0 -2
  162. package/modules/nextMillenniumBidAdapter.js +2 -0
  163. package/modules/pairIdSystem.js +79 -0
  164. package/modules/pubmaticBidAdapter.js +12 -9
  165. package/modules/rtbhouseBidAdapter.js +3 -3
  166. package/modules/userId/eids.js +6 -0
  167. package/modules/vidoomyBidAdapter.js +30 -9
  168. package/modules/vidoomyBidAdapter.md +12 -2
  169. package/modules/yieldmoBidAdapter.js +15 -5
  170. package/package.json +1 -1
  171. package/src/config.js +78 -127
  172. package/test/spec/modules/1plusXRtdProvider_spec.js +8 -7
  173. package/test/spec/modules/adagioBidAdapter_spec.js +0 -25
  174. package/test/spec/modules/admaticBidAdapter_spec.js +1 -1
  175. package/test/spec/modules/adnuntiusBidAdapter_spec.js +2 -1
  176. package/test/spec/modules/appnexusBidAdapter_spec.js +464 -448
  177. package/test/spec/modules/axonixBidAdapter_spec.js +0 -27
  178. package/test/spec/modules/big-richmediaBidAdapter_spec.js +68 -64
  179. package/test/spec/modules/conversantBidAdapter_spec.js +1 -0
  180. package/test/spec/modules/criteoBidAdapter_spec.js +33 -1
  181. package/test/spec/modules/criteoIdSystem_spec.js +99 -9
  182. package/test/spec/modules/emtvBidAdapter_spec.js +400 -0
  183. package/test/spec/modules/eskimiBidAdapter_spec.js +155 -0
  184. package/test/spec/modules/gridBidAdapter_spec.js +8 -0
  185. package/test/spec/modules/ixBidAdapter_spec.js +57 -0
  186. package/test/spec/modules/kargoBidAdapter_spec.js +297 -140
  187. package/test/spec/modules/kueezRtbBidAdapter_spec.js +22 -2
  188. package/test/spec/modules/minutemediaplusBidAdapter_spec.js +22 -2
  189. package/test/spec/modules/nativoBidAdapter_spec.js +101 -0
  190. package/test/spec/modules/neuwoRtdProvider_spec.js +0 -1
  191. package/test/spec/modules/ooloAnalyticsAdapter_spec.js +1 -1
  192. package/test/spec/modules/pairIdSystem_spec.js +68 -0
  193. package/test/spec/modules/pubCommonId_spec.js +0 -17
  194. package/test/spec/modules/pubmaticBidAdapter_spec.js +868 -867
  195. package/test/spec/modules/realvuAnalyticsAdapter_spec.js +0 -5
  196. package/test/spec/modules/rtbhouseBidAdapter_spec.js +2 -2
  197. package/test/spec/modules/vidoomyBidAdapter_spec.js +72 -0
  198. package/test/spec/modules/yieldmoBidAdapter_spec.js +19 -1
  199. package/test/spec/unit/pbjs_api_spec.js +19 -3
  200. package/test/test_index.js +13 -3
  201. package/dist/gridNMBidAdapter.js +0 -1
  202. package/modules/gridNMBidAdapter.js +0 -422
  203. package/modules/gridNMBidAdapter.md +0 -39
  204. package/test/spec/modules/gridNMBidAdapter_spec.js +0 -636
@@ -0,0 +1,72 @@
1
+ import {registerBidder} from '../src/adapters/bidderFactory.js';
2
+ import {BANNER} from '../src/mediaTypes.js';
3
+ import * as utils from '../src/utils.js';
4
+ import {ortbConverter} from '../libraries/ortbConverter/converter.js'
5
+
6
+ const BIDDER_CODE = 'eskimi';
7
+ // const ENDPOINT = 'https://hb.eskimi.com/bids'
8
+ const ENDPOINT = 'https://sspback.eskimi.com/bid-request'
9
+
10
+ const DEFAULT_BID_TTL = 30;
11
+ const DEFAULT_CURRENCY = 'USD';
12
+ const DEFAULT_NET_REVENUE = true;
13
+ const GVLID = 814;
14
+
15
+ export const spec = {
16
+ code: BIDDER_CODE,
17
+ gvlid: GVLID,
18
+ supportedMediaTypes: [BANNER],
19
+
20
+ isBidRequestValid: function (bid) {
21
+ return !!bid.params.placementId;
22
+ },
23
+
24
+ buildRequests(bidRequests, bidderRequest) {
25
+ const data = converter.toORTB({bidRequests, bidderRequest})
26
+
27
+ let bid = bidRequests.find((b) => b.params.placementId)
28
+ if (!data.site) data.site = {}
29
+ data.site.ext = {placementId: bid.params.placementId}
30
+
31
+ if (bidderRequest.gdprConsent) {
32
+ if (!data.user) data.user = {};
33
+ if (!data.user.ext) data.user.ext = {};
34
+ if (!data.regs) data.regs = {};
35
+ if (!data.regs.ext) data.regs.ext = {};
36
+ data.user.ext.consent = bidderRequest.gdprConsent.consentString;
37
+ data.regs.ext.gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0;
38
+ }
39
+
40
+ return [{
41
+ method: 'POST',
42
+ url: ENDPOINT,
43
+ data,
44
+ options: {contentType: 'application/json;charset=UTF-8', withCredentials: false}
45
+ }]
46
+ },
47
+
48
+ interpretResponse(response, request) {
49
+ return converter.fromORTB({response: response.body, request: request.data}).bids;
50
+ },
51
+
52
+ /**
53
+ * Register bidder specific code, which will execute if a bid from this bidder won the auction
54
+ * @param {Bid} bid The bid that won the auction
55
+ */
56
+ onBidWon: function (bid) {
57
+ if (bid.burl) {
58
+ utils.triggerPixel(bid.burl);
59
+ }
60
+ }
61
+ }
62
+
63
+ const converter = ortbConverter({
64
+ context: {
65
+ netRevenue: DEFAULT_NET_REVENUE,
66
+ ttl: DEFAULT_BID_TTL,
67
+ currency: DEFAULT_CURRENCY,
68
+ mediaType: BANNER // TODO: support more types, we should set mtype on the winning bid
69
+ }
70
+ });
71
+
72
+ registerBidder(spec);
@@ -0,0 +1,34 @@
1
+ # Overview
2
+
3
+ Module Name: ESKIMI Bidder Adapter
4
+ Module Type: Bidder Adapter
5
+ Maintainer: tech@eskimi.com
6
+
7
+ # Description
8
+
9
+ An adapter to get a bid from Eskimi DSP.
10
+
11
+ # Test Parameters
12
+ ```javascript
13
+ var adUnits = [{
14
+ code: 'div-gpt-ad-1460505748561-0',
15
+ mediaTypes: {
16
+ banner: {
17
+ sizes: [[300, 250], [300, 600]]
18
+ }
19
+ },
20
+
21
+ bids: [{
22
+ bidder: 'eskimi',
23
+ params: {
24
+ placementId: 612
25
+ }
26
+ }]
27
+
28
+ }];
29
+ ```
30
+
31
+ Where:
32
+
33
+ * placementId - Placement ID of the ad unit (required)
34
+
@@ -6,7 +6,10 @@ import {
6
6
  generateUUID,
7
7
  mergeDeep,
8
8
  logWarn,
9
- parseUrl, isArray, isNumber
9
+ parseUrl,
10
+ isArray,
11
+ isNumber,
12
+ isStr
10
13
  } from '../src/utils.js';
11
14
  import { registerBidder } from '../src/adapters/bidderFactory.js';
12
15
  import { Renderer } from '../src/Renderer.js';
@@ -52,7 +55,12 @@ const ALIAS_CONFIG = {
52
55
  bidResponseExternal: {
53
56
  netRevenue: false
54
57
  }
55
- }
58
+ },
59
+ 'gridNM': {
60
+ defaultParams: {
61
+ multiRequest: true
62
+ }
63
+ },
56
64
  };
57
65
 
58
66
  let hasSynced = false;
@@ -60,7 +68,7 @@ let hasSynced = false;
60
68
  export const spec = {
61
69
  code: BIDDER_CODE,
62
70
  gvlid: GVLID,
63
- aliases: ['playwire', 'adlivetech', { code: 'trustx', skipPbsAliasing: true }],
71
+ aliases: ['playwire', 'adlivetech', 'gridNM', { code: 'trustx', skipPbsAliasing: true }],
64
72
  supportedMediaTypes: [ BANNER, VIDEO ],
65
73
  /**
66
74
  * Determines whether or not the given bid request is valid.
@@ -126,8 +134,9 @@ export const spec = {
126
134
  if (!endpoint) {
127
135
  endpoint = ALIAS_CONFIG[bid.bidder] && ALIAS_CONFIG[bid.bidder].endpoint;
128
136
  }
129
- const { params: { uid, keywords, forceBidder, multiRequest }, mediaTypes, bidId, adUnitCode, rtd, ortb2Imp } = bid;
130
- const { secid, pubid, source, content: bidParamsContent } = bid.params;
137
+ const { params, mediaTypes, bidId, adUnitCode, rtd, ortb2Imp } = bid;
138
+ const { defaultParams } = ALIAS_CONFIG[bid.bidder] || {};
139
+ const { secid, pubid, source, uid, keywords, forceBidder, multiRequest, content: bidParamsContent, video: videoParams } = { ...defaultParams, ...params };
131
140
  const bidFloor = _getFloor(mediaTypes || {}, bid);
132
141
  const jwTargeting = rtd && rtd.jwplayer && rtd.jwplayer.targeting;
133
142
  if (jwTargeting && !content && jwTargeting.content) {
@@ -178,7 +187,7 @@ export const spec = {
178
187
  }
179
188
  }
180
189
  if (mediaTypes && mediaTypes[VIDEO]) {
181
- const video = createVideoRequest(bid, mediaTypes[VIDEO]);
190
+ const video = createVideoRequest(videoParams, mediaTypes[VIDEO], bid.sizes);
182
191
  if (video) {
183
192
  impObj.video = video;
184
193
  }
@@ -588,27 +597,41 @@ function _addBidResponse(serverBid, bidRequest, bidResponses, RendererConst, bid
588
597
  }
589
598
  }
590
599
 
591
- function createVideoRequest(bid, mediaType) {
592
- const { playerSize, mimes, durationRangeSec, protocols } = mediaType;
593
- const size = (playerSize || bid.sizes || [])[0];
594
- if (!size) return;
600
+ function createVideoRequest(videoParams, mediaType, bidSizes) {
601
+ const { mind, maxd, size, playerSize, protocols, durationRangeSec = [], ...videoData } = { ...mediaType, ...videoParams };
602
+ if (size && isStr(size)) {
603
+ const sizeArray = size.split('x');
604
+ if (sizeArray.length === 2 && parseInt(sizeArray[0]) && parseInt(sizeArray[1])) {
605
+ videoData.w = parseInt(sizeArray[0]);
606
+ videoData.h = parseInt(sizeArray[1]);
607
+ }
608
+ }
609
+ if (!videoData.w || !videoData.h) {
610
+ const pSizesString = (playerSize || bidSizes || []).toString();
611
+ const pSizeString = (pSizesString.match(/^\d+,\d+/) || [])[0];
612
+ const pSize = pSizeString && pSizeString.split(',').map((d) => parseInt(d));
613
+ if (pSize && pSize.length === 2) {
614
+ Object.assign(videoData, parseGPTSingleSizeArrayToRtbSize(pSize));
615
+ }
616
+ }
595
617
 
596
- let result = parseGPTSingleSizeArrayToRtbSize(size);
618
+ if (!videoData.w || !videoData.h) return;
597
619
 
598
- if (mimes) {
599
- result.mimes = mimes;
600
- }
620
+ const minDur = mind || durationRangeSec[0] || videoData.minduration;
621
+ const maxDur = maxd || durationRangeSec[1] || videoData.maxduration;
601
622
 
602
- if (durationRangeSec && durationRangeSec.length === 2) {
603
- result.minduration = durationRangeSec[0];
604
- result.maxduration = durationRangeSec[1];
623
+ if (minDur) {
624
+ videoData.minduration = minDur;
625
+ }
626
+ if (maxDur) {
627
+ videoData.maxduration = maxDur;
605
628
  }
606
629
 
607
630
  if (protocols && protocols.length) {
608
- result.protocols = protocols;
631
+ videoData.protocols = protocols;
609
632
  }
610
633
 
611
- return result;
634
+ return videoData;
612
635
  }
613
636
 
614
637
  function createBannerRequest(bid, mediaType) {
@@ -195,6 +195,9 @@ function bidToVideoImp(bid) {
195
195
  // populate imp level transactionId
196
196
  imp.ext.tid = deepAccess(bid, 'ortb2Imp.ext.tid');
197
197
 
198
+ // AdUnit-Specific First Party Data
199
+ addAdUnitFPD(imp, bid)
200
+
198
201
  // copy all video properties to imp object
199
202
  for (const adUnitProperty in videoAdUnitRef) {
200
203
  if (VIDEO_PARAMS_ALLOW_LIST.indexOf(adUnitProperty) !== -1 && !imp.video.hasOwnProperty(adUnitProperty)) {
@@ -268,6 +271,9 @@ function bidToNativeImp(bid) {
268
271
  // populate imp level transactionId
269
272
  imp.ext.tid = deepAccess(bid, 'ortb2Imp.ext.tid');
270
273
 
274
+ // AdUnit-Specific First Party Data
275
+ addAdUnitFPD(imp, bid)
276
+
271
277
  _applyFloor(bid, imp, NATIVE);
272
278
 
273
279
  return imp;
@@ -956,6 +962,11 @@ function addImpressions(impressions, transactionIds, r, adUnitIndex) {
956
962
  _bannerImpression.bidfloorcur = impressionObjects[0].bidfloorcur;
957
963
  }
958
964
 
965
+ const adUnitFPD = impressions[transactionIds[adUnitIndex]].adUnitFPD
966
+ if (adUnitFPD) {
967
+ _bannerImpression.ext.data = adUnitFPD;
968
+ }
969
+
959
970
  r.imp.push(_bannerImpression);
960
971
  } else {
961
972
  // set imp.ext.gpid to resolved gpid for each imp
@@ -1011,6 +1022,19 @@ function addFPD(bidderRequest, r, fpd, site, user) {
1011
1022
  return r;
1012
1023
  }
1013
1024
 
1025
+ /**
1026
+ * Adds First-Party Data (FPD) from the bid object to the imp object.
1027
+ *
1028
+ * @param {Object} imp - The imp object, representing an impression in the OpenRTB format.
1029
+ * @param {Object} bid - The bid object, containing information about the bid request.
1030
+ */
1031
+ function addAdUnitFPD(imp, bid) {
1032
+ const adUnitFPD = deepAccess(bid, 'ortb2Imp.ext.data');
1033
+ if (adUnitFPD) {
1034
+ deepSetValue(imp, 'ext.data', adUnitFPD)
1035
+ }
1036
+ }
1037
+
1014
1038
  /**
1015
1039
  * addIdentifiersInfo adds indentifier info to ixDaig.
1016
1040
  *
@@ -1196,6 +1220,12 @@ function createBannerImps(validBidRequest, missingBannerSizes, bannerImps) {
1196
1220
  bannerImps[validBidRequest.transactionId].tagId = deepAccess(validBidRequest, 'params.tagId');
1197
1221
  bannerImps[validBidRequest.transactionId].pos = deepAccess(validBidRequest, 'mediaTypes.banner.pos');
1198
1222
 
1223
+ // AdUnit-Specific First Party Data
1224
+ const adUnitFPD = deepAccess(validBidRequest, 'ortb2Imp.ext.data');
1225
+ if (adUnitFPD) {
1226
+ bannerImps[validBidRequest.transactionId].adUnitFPD = adUnitFPD;
1227
+ }
1228
+
1199
1229
  const sid = deepAccess(validBidRequest, 'params.id');
1200
1230
  if (sid && (typeof sid === 'string' || typeof sid === 'number')) {
1201
1231
  bannerImps[validBidRequest.transactionId].sid = String(sid);