From 508527ca3137086fa88d4997f3e08ce9baf8fc8f Mon Sep 17 00:00:00 2001 From: dnrstc Date: Tue, 3 Feb 2026 09:36:35 +0100 Subject: [PATCH 1/4] TargetVideo bid adapter: send price floor param --- modules/targetVideoBidAdapter.js | 7 +++ modules/targetVideoBidAdapter.md | 1 + .../modules/targetVideoBidAdapter_spec.js | 54 ++++++++++++++++--- 3 files changed, 55 insertions(+), 7 deletions(-) diff --git a/modules/targetVideoBidAdapter.js b/modules/targetVideoBidAdapter.js index 84730231543..ab226595338 100644 --- a/modules/targetVideoBidAdapter.js +++ b/modules/targetVideoBidAdapter.js @@ -45,6 +45,7 @@ export const spec = { const video = mediaTypes[VIDEO]; const placementId = params.placementId; const site = getSiteObj(); + const floor = params.floor; if (sizes && !Array.isArray(sizes[0])) sizes = [sizes]; @@ -71,6 +72,12 @@ export const spec = { video: getDefinedParams(video, VIDEO_PARAMS) } + const bidFloor = typeof floor === 'string' ? Number(floor.trim()) + : typeof floor === 'number' ? floor + : NaN; + + if (Number.isFinite(bidFloor) && bidFloor > 0) imp.bidfloor = bidFloor; + if (video.playerSize) { imp.video = Object.assign( imp.video, parseGPTSingleSizeArrayToRtbSize(video.playerSize[0]) || {} diff --git a/modules/targetVideoBidAdapter.md b/modules/targetVideoBidAdapter.md index a34ad0aff27..9a204a86991 100644 --- a/modules/targetVideoBidAdapter.md +++ b/modules/targetVideoBidAdapter.md @@ -43,6 +43,7 @@ var adUnits = [ bidder: 'targetVideo', params: { placementId: 12345, + floor: 2, reserve: 0, } }] diff --git a/test/spec/modules/targetVideoBidAdapter_spec.js b/test/spec/modules/targetVideoBidAdapter_spec.js index 838fd50f76d..9b91e71c7d8 100644 --- a/test/spec/modules/targetVideoBidAdapter_spec.js +++ b/test/spec/modules/targetVideoBidAdapter_spec.js @@ -7,6 +7,13 @@ describe('TargetVideo Bid Adapter', function() { const params = { placementId: 12345, }; + const videoMediaTypes = { + video: { + playerSize: [[640, 360]], + context: 'instream', + playbackmethod: [1, 2, 3, 4] + } + } const defaultBidderRequest = { bidderRequestId: 'mock-uuid', @@ -25,13 +32,7 @@ describe('TargetVideo Bid Adapter', function() { const videoRequest = [{ bidder, params, - mediaTypes: { - video: { - playerSize: [[640, 360]], - context: 'instream', - playbackmethod: [1, 2, 3, 4] - } - } + mediaTypes: videoMediaTypes, }]; it('Test the bid validation function', function() { @@ -353,4 +354,43 @@ describe('TargetVideo Bid Adapter', function() { const userSyncs = spec.getUserSyncs({iframeEnabled: false}); expect(userSyncs).to.have.lengthOf(0); }); + + it('Test the VIDEO request floor param', function() { + const requests = [ + { + bidder, + params: { + ...params, + floor: 2.12, + }, + mediaTypes: videoMediaTypes, + }, + { + bidder, + params: { + ...params, + floor: "1.55", + }, + mediaTypes: videoMediaTypes, + }, + { + bidder, + params: { + ...params, + floor: "abc", + }, + mediaTypes: videoMediaTypes, + } + ] + + const bids = spec.buildRequests(requests, defaultBidderRequest) + + const payload1 = JSON.parse(bids[0].data); + const payload2 = JSON.parse(bids[1].data); + const payload3 = JSON.parse(bids[2].data); + + expect(payload1.imp[0].bidfloor).to.exist.and.equal(2.12); + expect(payload2.imp[0].bidfloor).to.exist.and.equal(1.55); + expect(payload3.imp[0].bidfloor).to.not.exist; + }); }); From 074116fc90d9074b9a91ef942df5999b1adacc17 Mon Sep 17 00:00:00 2001 From: dnrstc Date: Thu, 12 Feb 2026 11:10:56 +0100 Subject: [PATCH 2/4] Add support for the price floors module --- modules/targetVideoBidAdapter.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/modules/targetVideoBidAdapter.js b/modules/targetVideoBidAdapter.js index ab226595338..55a18c0746e 100644 --- a/modules/targetVideoBidAdapter.js +++ b/modules/targetVideoBidAdapter.js @@ -9,6 +9,22 @@ import {SOURCE, GVLID, BIDDER_CODE, VIDEO_PARAMS, BANNER_ENDPOINT_URL, VIDEO_END * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid */ +function getBidFloor(bid) { + if (!isFn(bid.getFloor)) { + return (bid.params.reserve) ? bid.params.reserve : null; + } + + const floor = bid.getFloor({ + currency: 'EUR', + mediaType: '*', + size: '*' + }); + if (isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === 'EUR') { + return floor.floor; + } + return null; +} + export const spec = { code: BIDDER_CODE, @@ -45,7 +61,7 @@ export const spec = { const video = mediaTypes[VIDEO]; const placementId = params.placementId; const site = getSiteObj(); - const floor = params.floor; + const floor = getBidFloor(bid) || params.floor; if (sizes && !Array.isArray(sizes[0])) sizes = [sizes]; From c77ac2a6896a4a945f7e5ecd5bc72efc37346a7b Mon Sep 17 00:00:00 2001 From: dnrstc Date: Thu, 12 Feb 2026 11:14:20 +0100 Subject: [PATCH 3/4] Add imports --- modules/targetVideoBidAdapter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/targetVideoBidAdapter.js b/modules/targetVideoBidAdapter.js index 55a18c0746e..ddbe1b2a8b6 100644 --- a/modules/targetVideoBidAdapter.js +++ b/modules/targetVideoBidAdapter.js @@ -1,4 +1,4 @@ -import {_each, deepAccess, getDefinedParams, parseGPTSingleSizeArrayToRtbSize} from '../src/utils.js'; +import {_each, deepAccess, getDefinedParams, isFn, isPlainObject, parseGPTSingleSizeArrayToRtbSize} from '../src/utils.js'; import {BANNER, VIDEO} from '../src/mediaTypes.js'; import {registerBidder} from '../src/adapters/bidderFactory.js'; import {formatRequest, getRtbBid, getSiteObj, getSyncResponse, videoBid, bannerBid, createVideoTag} from '../libraries/targetVideoUtils/bidderUtils.js'; From df38f0cbc6e4af7a10da1aa08a62dc8baedb88ce Mon Sep 17 00:00:00 2001 From: dnrstc Date: Thu, 12 Feb 2026 13:07:35 +0100 Subject: [PATCH 4/4] Fix getBidFloor function floor params --- modules/targetVideoBidAdapter.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/targetVideoBidAdapter.js b/modules/targetVideoBidAdapter.js index ddbe1b2a8b6..723c9d77dbd 100644 --- a/modules/targetVideoBidAdapter.js +++ b/modules/targetVideoBidAdapter.js @@ -11,7 +11,7 @@ import {SOURCE, GVLID, BIDDER_CODE, VIDEO_PARAMS, BANNER_ENDPOINT_URL, VIDEO_END function getBidFloor(bid) { if (!isFn(bid.getFloor)) { - return (bid.params.reserve) ? bid.params.reserve : null; + return (bid.params.floor) ? bid.params.floor : null; } const floor = bid.getFloor({ @@ -54,14 +54,15 @@ export const spec = { version: '$prebid.version$' }; - for (let {params, bidId, sizes, mediaTypes, ...bid} of bidRequests) { + for (let {bidId, sizes, mediaTypes, ...bid} of bidRequests) { for (const mediaType in mediaTypes) { switch (mediaType) { case VIDEO: { + const params = bid.params; const video = mediaTypes[VIDEO]; const placementId = params.placementId; const site = getSiteObj(); - const floor = getBidFloor(bid) || params.floor; + const floor = getBidFloor(bid); if (sizes && !Array.isArray(sizes[0])) sizes = [sizes];