Header Bidding Specifications

  • Updated

There are many different SSPs and all of them use their own prebid adapters, with their own possibilities and functionalities.

However, there are some important specifications that apply to all SSPs and that should be set identically: currency, 1st price auction, size, and gross vs net price.


In order to have a fair auction, each SSP should be able to specify the currency in which they respond, and whether there is a way to modify it manually.

Different responses can lead to discrepancies in revenue between the SSP and the ad server.

The currency for the bid response depends on the integration or the adapter that you set up:

  • OpenRTB: With this integration, you can set the currency using cur parameter. If no value is added, the default currency is USD.

  • adform: This adapter uses the default currency for the UI and displays the gross amount.

  • adf: This adapter uses USD as the default currency and displays the net amount.


    { bidder: 'adform', params: { mid: 123456 , rcur: 'USD' } } 

This image shows the currency flow within the header bidding chain:


Adform supports the adServerCurrency parameter as well. You can set the parameter in the prebid configuration for all bidders.


pbjs.setConfig({ currency: { adServerCurrency: 'EUR' } });

Most of the adapters support such prebid.js proposed configuration.

First-Price Auction

Header bidding success relies on its ability to allow publishers to have winning bids from multiple SSPs compared in parallel, and to decide on the overall best price across all of them.

But even with different floor prices, soft floor prices, and methods applied to pick the clearing price, the value of the bids passed from the SSP to header bidding for the final decision isn't necessarily the value that the advertiser was willing to pay. This potentially means less revenue for the publisher and less ability to win the desired impressions for the advertiser.

Let’s look at two scenarios:

  • Header bidding with second-price auction: An advertiser using an SSP connected to header bidding bids $10. Within the second-price auction, the second-price bid in SSP number 1 is $5. The winning bid that gets passed from SSP1 as the final bid to header bidding is $5.

    However, if the winning bid that comes from another advertiser using SSP number 2 is $8, that bid beats the $5 bid from SSP number 1. This happens despite the first advertiser wanting to pay $10 in order to secure those high-value impressions. In this case, even if the first advertiser bids $15, the advertiser would still lose the auction due to the second-price dynamics operating between the SSP and header bidding.

    This image shows how header bidding works with second-price auction:

  • HB with first-price auction: In this scenario, header bidding sends bid requests in parallel through all the connected SSPs. However, the DSPs no longer connect exclusively to one single SSP. As a result, the DSPs will often bid for the same impression through multiple SSPs. This means that the advertiser with the highest bid will win through the SSP having the highest clearing price on the specific impression in the header bidding decision. In other words, the SSP that somehow yields the highest clearing price on the same bid, from the same DSP, will win and earn their fee.

    This image shows how header bidding works with first-price auction:


Good to know:


- Adform will automatically detect and set a first-price auction for header bidding requests.

- Non-header bidding requests will still run in a second-price auction.

- The publisher will be able to sell inventory through header bidding and standard auctions at the same time.

- The soft floor price won't work in the first-price auction.

- The floor price will still be active, and buying below the floor price won't be allowed.


Websites have their own structure and layout, and publishers use many placements with unique characteristics. This allows specifying beforehand what type of ads should be displayed live on the website, and their dimensions. You should set up that same information in the header bidding container.

In this image, you can see that ad unit ID-429398 will only show ads with size 300 × 250.



Setting the correct size is important not to display ads of random sizes, which can lead to a poor user experience for visitors. Also, header bidding adapters validate the bid information and check if the size matches the size defined for that particular ad slot. If the size doesn't match, the bid won't go through validation, and the banner won't show on the website. In that case, SSPs will count requests and responses, but impressions will count as 0.

Validation works this way:

  1. The website loads.

  2. The prebid is initiated.

  3. Header bidding calls out different SSPs.

  4. Each SSP returns possible bids from their DSPs.

  5. The highest bids from each SSP compete in a web auction.

  6. The winning bid is decided.

  7. Size validation happens.



Gross Price versus Net Price

To receive a net winning price from the Adform SSP in a header bidding auction, add the parameter priceType: 'net' to the prebid configuration. You can add it to each mid parameter, or just to one mid parameter on the website. Example:

var adUnits = [
            code: 'xxxxxx',
            sizes: [[980, 200], [300, 600], [663, 50], [211, 347], [300, 250]],
            bids: [
                { bidder: 'criteo', params: { zoneId: "xxxxx" } } , 
                { bidder: 'adform', params: {
                    mid: 'xxxxxx',
                    priceType: 'net'
                  } },
                { bidder: 'adform', params: { 
                    mid: xxxxxx
                 } },

When the prebid calls the SSPs at times, it responds with a default CPM value of 0. Use the script below to configure a fixed price for such responses before the web auction starts:

pbjs.bidderSettings = {xhb: {bidCpmAdjustment : function(bidCpm){// adjust the bid in real time before the auction takes placereturn bidCpm + 2;}}};
  • xhb is the name of a bidder (change to the name you need).

  • 2 is the fixed CPM value that will be set for a specific bidder.

  • The fee can be added to the bid that will change the response from gross to net. Example: (bidCpm + price_value) × fee.

Header Bidding and Video

Adform prebid adapter supports both outstream and in-stream videos for header bidding.

We have our own renderer for outstreams in prebid, so there's no need for external players. For more information, see Set Up Header Bidding for Publisher Ad Server.

Request Header Bidding Placements Separately

All placements are requested together as per prebid.js auction. The easiest way to control auctions is by using c pbjs.requestBids(requestObj) Publisher API Reference for header bidding passing required ad units.


pbjs.requestBids({ bidsBackHandler: callback });
// or
  adUnits: {...},
  bidsBackHandler: callback

Two Adform Bidders in the Same Header Bidding Solution

If you want to add Adform as a second bidder, and the bidders should be sent in separate requests, use pbjs.aliasBidder("adform","x").

In this example, x is a custom alias for Adform bidder:


Learn more about Prebid and AdformOpenRTB.


Note, that before setting up header bidding, you must first set up your inventory.

Was this article helpful?

How we can make it better?

Thank you for your feedback!