Repository: prebid/prebid-server
Pull request #2316 (2022-07-21 16:26:31)

Triplelift: Expand Video Formats
Created on behalf of Triplelift.

nllerandi3lift: Thanks looks good. 

Patch:
diff --git a/adapters/blue/blue.go b/adapters/blue/blue.go
new file mode 100644
index 00000000..1001e769
--- /dev/null
+++ b/adapters/blue/blue.go
@@ -0,0 +1,86 @@
+package blue
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/http"
+
+	"github.com/mxmCherry/openrtb/v16/openrtb2"
+	"github.com/prebid/prebid-server/adapters"
+	"github.com/prebid/prebid-server/config"
+	"github.com/prebid/prebid-server/errortypes"
+	"github.com/prebid/prebid-server/openrtb_ext"
+)
+
+type adapter struct {
+	endpoint string
+}
+
+func Builder(bidderName openrtb_ext.BidderName, config config.Adapter) (adapters.Bidder, error) {
+	bidder := &adapter{
+		endpoint: config.Endpoint,
+	}
+
+	return bidder, nil
+}
+
+func (a *adapter) MakeRequests(request *openrtb2.BidRequest, _ *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) {
+	requestJSON, err := json.Marshal(request)
+
+	if err != nil {
+		return nil, []error{err}
+	}
+
+	headers := http.Header{}
+	headers.Add("Content-Type", "application/json;charset=utf-8")
+
+	requestData := &adapters.RequestData{
+		Method:  "POST",
+		Uri:     a.endpoint,
+		Body:    requestJSON,
+		Headers: headers,
+	}
+
+	return []*adapters.RequestData{requestData}, nil
+}
+
+func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) {
+	if responseData.StatusCode != http.StatusOK {
+		switch responseData.StatusCode {
+		case http.StatusNoContent:
+			return nil, nil
+		case http.StatusBadRequest:
+			return nil, []error{
+				&errortypes.BadInput{
+					Message: fmt.Sprintf("Unexpected status code: %d.", responseData.StatusCode),
+				},
+			}
+		default:
+			return nil, []error{
+				&errortypes.BadServerResponse{
+					Message: fmt.Sprintf("Unexpected status code: %d.", responseData.StatusCode),
+				},
+			}
+		}
+	}
+
+	var response openrtb2.BidResponse
+	if err := json.Unmarshal(responseData.Body, &response); err != nil {
+		return nil, []error{err}
+	}
+
+	bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp))
+	bidResponse.Currency = response.Cur
+
+	for _, seatBid := range response.SeatBid {
+		for i := range seatBid.Bid {
+			b := &adapters.TypedBid{
+				Bid:     &seatBid.Bid[i],
+				BidType: openrtb_ext.BidTypeBanner,
+			}
+			bidResponse.Bids = append(bidResponse.Bids, b)
+		}
+	}
+
+	return bidResponse, nil
+}
diff --git a/adapters/sspBC/sspbc.go b/adapters/sspBC/sspbc.go
new file mode 100644
index 00000000..4fe8a2eb
--- /dev/null
+++ b/adapters/sspBC/sspbc.go
@@ -0,0 +1,401 @@
+package sspBC
+
+import (
+	"bytes"
+	"encoding/base64"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"html/template"
+	"net/http"
+	"net/url"
+	"strings"
+
+	"github.com/mxmCherry/openrtb/v16/openrtb2"
+	"github.com/prebid/prebid-server/adapters"
+	"github.com/prebid/prebid-server/config"
+	"github.com/prebid/prebid-server/errortypes"
+	"github.com/prebid/prebid-server/openrtb_ext"
+)
+
+const (
+	adapterVersion              = "5.6"
+	impFallbackSize             = "1x1"
+	requestTypeStandard         = 1
+	requestTypeOneCode          = 2
+	requestTypeTest             = 3
+	prebidServerIntegrationType = "4"
+)
+
+var (
+	errSiteNill           = errors.New("site cannot be nill")
+	errImpNotFound        = errors.New("imp not found")
+	errNotSupportedFormat = errors.New("bid format is not supported")
+)
+
+// mcAd defines the MC payload for banner ads.
+type mcAd struct {
+	Id      string             `json:"id"`
+	Seat    string             `json:"seat"`
+	SeatBid []openrtb2.SeatBid `json:"seatbid"`
+}
+
+// adSlotData defines struct used for the oneCode detection.
+type adSlotData struct {
+	PbSlot string `json:"pbslot"`
+	PbSize string `json:"pbsize"`
+}
+
+// templatePayload represents the banner template payload.
+type templatePayload struct {
+	SiteId  string `json:"siteid"`
+	SlotId  string `json:"slotid"`
+	AdLabel string `json:"adlabel"`
+	PubId   string `json:"pubid"`
+	Page    string `json:"page"`
+	Referer string `json:"referer"`
+	McAd    string `json:"mcad"`
+}
+
+// requestImpExt represents the ext field of the request imp field.
+type requestImpExt struct {
+	Data adSlotData `json:"data"`
+}
+
+// responseExt represents ext data added by proxy.
+type responseExt struct {
+	AdLabel     string `json:"adlabel"`
+	PublisherId string `json:"pubid"`
+	SiteId      string `json:"siteid"`
+	SlotId      string `json:"slotid"`
+}
+
+type adapter struct {
+	endpoint       string
+	bannerTemplate *template.Template
+}
+
+// ---------------ADAPTER INTERFACE------------------
+// Builder builds a new instance of the sspBC adapter
+func Builder(_ openrtb_ext.BidderName, config config.Adapter) (adapters.Bidder, error) {
+	// HTML template used to create banner ads
+	const bannerHTML = `<html><head><title></title><meta charset="UTF-8"><meta name="viewport" content="` +
+		`width=device-width, initial-scale=1.0"><style> body { background-color: transparent; margin: 0;` +
+		` padding: 0; }</style><script> window.rekid = {{.SiteId}}; window.slot = {{.SlotId}}; window.ad` +
+		`label = '{{.AdLabel}}'; window.pubid = '{{.PubId}}'; window.wp_sn = 'sspbc_go'; window.page = '` +
+		`{{.Page}}'; window.ref = '{{.Referer}}'; window.mcad = JSON.parse(atob('{{.McAd}}'));</script><` +
+		`/head><body><div id="c"></div><script async crossorigin nomodule src="//std.wpcdn.pl/wpjslib/wp` +
+		`jslib-inline.js" id="wpjslib"></script><script async crossorigin type="module" src="//std.wpcdn` +
+		`.pl/wpjslib6/wpjslib-inline.js" id="wpjslib6"></script></body></html>`
+
+	bannerTemplate, err := template.New("banner").Parse(bannerHTML)
+	if err != nil {
+		return nil, err
+	}
+
+	bidder := &adapter{
+		endpoint:       config.Endpoint,
+		bannerTemplate: bannerTemplate,
+	}
+
+	return bidder, nil
+}
+
+func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) {
+	formattedRequest, err := formatSspBcRequest(request)
+	if err != nil {
+		return nil, []error{err}
+	}
+
+	requestJSON, err := json.Marshal(formattedRequest)
+	if err != nil {
+		return nil, []error{err}
+	}
+
+	requestURL, err := url.Parse(a.endpoint)
+	if err != nil {
+		return nil, []error{err}
+	}
+
+	// add query parameters to request
+	queryParams := requestURL.Query()
+	queryParams.Add("bdver", adapterVersion)
+	queryParams.Add("inver", prebidServerIntegrationType)
+	requestURL.RawQuery = queryParams.Encode()
+
+	requestData := &adapters.RequestData{
+		Method: http.MethodPost,
+		Uri:    requestURL.String(),
+		Body:   requestJSON,
+	}
+
+	return []*adapters.RequestData{requestData}, nil
+}
+
+func (a *adapter) MakeBids(internalRequest *openrtb2.BidRequest, externalRequest *adapters.RequestData, externalResponse *adapters.ResponseData) (*adapters.BidderResponse, []error) {
+	if externalResponse.StatusCode == http.StatusNoContent {
+		return nil, nil
+	}
+
+	if externalResponse.StatusCode != http.StatusOK {
+		err := &errortypes.BadServerResponse{
+			Message: fmt.Sprintf("Unexpected status code: %d.", externalResponse.StatusCode),
+		}
+		return nil, []error{err}
+	}
+
+	var response openrtb2.BidResponse
+	if err := json.Unmarshal(externalResponse.Body, &response); err != nil {
+		return nil, []error{err}
+	}
+
+	bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(internalRequest.Imp))
+	bidResponse.Currency = response.Cur
+
+	var errors []error
+	for _, seatBid := range response.SeatBid {
+		for _, bid := range seatBid.Bid {
+			if err := a.impToBid(internalRequest, seatBid, bid, bidResponse); err != nil {
+				errors = append(errors, err)
+			}
+		}
+	}
+
+	return bidResponse, errors
+}
+
+func (a *adapter) impToBid(internalRequest *openrtb2.BidRequest, seatBid openrtb2.SeatBid, bid openrtb2.Bid,
+	bidResponse *adapters.BidderResponse) error {
+	var bidType openrtb_ext.BidType
+
+	/*
+	  Determine bid type
+	  At this moment we only check if bid contains Adm property
+
+	  Later updates will check for video & native data
+	*/
+	if bid.AdM != "" {
+		bidType = openrtb_ext.BidTypeBanner
+	}
+
+	/*
+	  Recover original ImpID
+	  (stored on request in TagID)
+	*/
+	impID, err := getOriginalImpID(bid.ImpID, internalRequest.Imp)
+	if err != nil {
+		return err
+	}
+	bid.ImpID = impID
+
+	// read additional data from proxy
+	var bidDataExt responseExt
+	if err := json.Unmarshal(bid.Ext, &bidDataExt); err != nil {
+		return err
+	}
+	/*
+		use correct ad creation method for a detected bid type
+		right now, we are only creating banner ads
+		if type is not detected / supported, throw error
+	*/
+	if bidType != openrtb_ext.BidTypeBanner {
+		return errNotSupportedFormat
+	}
+
+	var adCreationError error
+	bid.AdM, adCreationError = a.createBannerAd(bid, bidDataExt, internalRequest, seatBid.Seat)
+	if adCreationError != nil {
+		return adCreationError
+	}
+	// append bid to responses
+	bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{
+		Bid:     &bid,
+		BidType: bidType,
+	})
+
+	return nil
+}
+
+func getOriginalImpID(impID string, imps []openrtb2.Imp) (string, error) {
+	for _, imp := range imps {
+		if imp.ID == impID {
+			return imp.TagID, nil
+		}
+	}
+
+	return "", errImpNotFound
+}
+
+func (a *adapter) createBannerAd(bid openrtb2.Bid, ext responseExt, request *openrtb2.BidRequest, seat string) (string, error) {
+	var mcad mcAd
+
+	if strings.Contains(bid.AdM, "<!--preformatted-->") {
+		// Banner ad is already formatted
+		return bid.AdM, nil
+	}
+
+	// create McAd payload
+	mcad.Id = request.ID
+	mcad.Seat = seat
+	mcad.SeatBid = []openrtb2.SeatBid{
+		{Bid: []openrtb2.Bid{bid}},
+	}
+
+	mcMarshalled, err := json.Marshal(mcad)
+	if err != nil {
+		return "", err
+	}
+
+	bannerData := &templatePayload{
+		SiteId:  ext.SiteId,
+		SlotId:  ext.SlotId,
+		AdLabel: ext.AdLabel,
+		PubId:   ext.PublisherId,
+		Page:    request.Site.Page,
+		Referer: request.Site.Ref,
+		McAd:    base64.URLEncoding.EncodeToString(mcMarshalled),
+	}
+
+	var filledTemplate bytes.Buffer
+	if err := a.bannerTemplate.Execute(&filledTemplate, bannerData); err != nil {
+		return "", err
+	}
+
+	return filledTemplate.String(), nil
+}
+
+func getImpSize(imp openrtb2.Imp) string {
+	if imp.Banner == nil || len(imp.Banner.Format) == 0 {
+		return impFallbackSize
+	}
+
+	var (
+		areaMax int64
+		impSize = impFallbackSize
+	)
+
+	for _, size := range imp.Banner.Format {
+		area := size.W * size.H
+		if area > areaMax {
+			areaMax = area
+			impSize = fmt.Sprintf("%dx%d", size.W, size.H)
+		}
+	}
+
+	return impSize
+}
+
+// getBidParameters reads additional data for this imp (site id , placement id, test)
+// Errors in parameters do not break imp flow, and thus are not returned
+func getBidParameters(imp openrtb2.Imp) openrtb_ext.ExtImpSspbc {
+	var extBidder adapters.ExtImpBidder
+	var extSSP openrtb_ext.ExtImpSspbc
+
+	if err := json.Unmarshal(imp.Ext, &extBidder); err == nil {
+		_ = json.Unmarshal(extBidder.Bidder, &extSSP)
+	}
+
+	return extSSP
+}
+
+// getRequestType checks what kind of request we have. It can either be:
+// - a standard request, where all Imps have complete site / placement data
+// - a oneCodeRequest, where site / placement data has to be determined by server
+// - a test request, where server returns fixed example ads
+func getRequestType(request *openrtb2.BidRequest) int {
+	incompleteImps := 0
+
+	for _, imp := range request.Imp {
+		// Read data for this imp
+		extSSP := getBidParameters(imp)
+
+		if extSSP.IsTest != 0 {
+			return requestTypeTest
+		}
+
+		if extSSP.SiteId == "" || extSSP.Id == "" {
+			incompleteImps += 1
+		}
+	}
+
+	if incompleteImps > 0 {
+		return requestTypeOneCode
+	}
+
+	return requestTypeStandard
+}
+
+func formatSspBcRequest(request *openrtb2.BidRequest) (*openrtb2.BidRequest, error) {
+	if request.Site == nil {
+		return nil, errSiteNill
+	}
+
+	var siteID string
+
+	// determine what kind of request we are dealing with
+	requestType := getRequestType(request)
+
+	for i, imp := range request.Imp {
+		// read ext data for the impression
+		extSSP := getBidParameters(imp)
+
+		// store SiteID
+		if extSSP.SiteId != "" {
+			siteID = extSSP.SiteId
+		}
+
+		// save current imp.id (adUnit name) as imp.tagid
+		// we will recover it in makeBids
+		imp.TagID = imp.ID
+
+		// if there is a placement id, and this is not a oneCodeRequest, use it in imp.id
+		if extSSP.Id != "" && requestType != requestTypeOneCode {
+			imp.ID = extSSP.Id
+		}
+
+		// check imp size and update e.ext - send pbslot, pbsize
+		// inability to set bid.ext will cause request to be invalid
+		impSize := getImpSize(imp)
+		impExt := requestImpExt{
+			Data: adSlotData{
+				PbSlot: imp.TagID,
+				PbSize: impSize,
+			},
+		}
+
+		impExtJSON, err := json.Marshal(impExt)
+		if err != nil {
+			return nil, err
+		}
+		imp.Ext = impExtJSON
+		// save updated imp
+		request.Imp[i] = imp
+	}
+
+	siteCopy := *request.Site
+	request.Site = &siteCopy
+
+	/*
+		update site ID
+		for oneCode request it has to be blank
+		for other requests it should be equal to
+		SiteId from one of the bids
+	*/
+	if requestType == requestTypeOneCode || siteID == "" {
+		request.Site.ID = ""
+	} else {
+		request.Site.ID = siteID
+	}
+
+	// add domain info
+	if siteURL, err := url.Parse(request.Site.Page); err == nil {
+		request.Site.Domain = siteURL.Hostname()
+	}
+
+	// set TEST Flag
+	if requestType == requestTypeTest {
+		request.Test = 1
+	}
+
+	return request, nil
+}
diff --git a/adapters/triplelift/triplelift.go b/adapters/triplelift/triplelift.go
index 1d93527c..71e2a95a 100644
--- a/adapters/triplelift/triplelift.go
+++ b/adapters/triplelift/triplelift.go
@@ -26,7 +26,7 @@ type TripleliftRespExt struct {
 
 func getBidType(ext TripleliftRespExt) openrtb_ext.BidType {
 	t := ext.Triplelift.Format
-	if t == 11 {
+	if t == 11 || t == 12 || t == 17 {
 		return openrtb_ext.BidTypeVideo
 	}
 	return openrtb_ext.BidTypeBanner
diff --git a/adapters/unicorn/unicorn.go b/adapters/unicorn/unicorn.go
index 834d9122..76a9d5da 100644
--- a/adapters/unicorn/unicorn.go
+++ b/adapters/unicorn/unicorn.go
@@ -2,6 +2,7 @@ package unicorn
 
 import (
 	"encoding/json"
+	"errors"
 	"fmt"
 	"net/http"
 
@@ -69,6 +70,10 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapte
 		return nil, []error{err}
 	}
 
+	if err := modifyApp(request); err != nil {
+		return nil, []error{err}
+	}
+
 	var modifiableSource openrtb2.Source
 	if request.Source != nil {
 		modifiableSource = *request.Source
@@ -171,6 +176,36 @@ func setSourceExt() json.RawMessage {
 	return json.RawMessage(`{"stype": "prebid_server_uncn", "bidder": "unicorn"}`)
 }
 
+func modifyApp(request *openrtb2.BidRequest) error {
+	if request.App == nil {
+		return errors.New("request app is required")
+	}
+
+	modifiableApp := *request.App
+
+	mediaId, err := jsonparser.GetString(request.Imp[0].Ext, "bidder", "mediaId")
+	if err == nil {
+		modifiableApp.ID = mediaId
+	}
+
+	publisherId, err := jsonparser.GetString(request.Imp[0].Ext, "bidder", "publisherId")
+	if err == nil {
+		var publisher openrtb2.Publisher
+		if modifiableApp.Publisher != nil {
+			publisher = *modifiableApp.Publisher
+		} else {
+			publisher = openrtb2.Publisher{}
+		}
+
+		publisher.ID = publisherId
+
+		modifiableApp.Publisher = &publisher
+	}
+
+	request.App = &modifiableApp
+	return nil
+}
+
 func setExt(request *openrtb2.BidRequest) (json.RawMessage, error) {
 	accountID, err := jsonparser.GetInt(request.Imp[0].Ext, "bidder", "accountId")
 	if err != nil {
diff --git a/config/accounts.go b/config/accounts.go
index 8b9c0222..7d954c0c 100644
--- a/config/accounts.go
+++ b/config/accounts.go
@@ -227,8 +227,8 @@ func (a *AccountIntegration) GetByIntegrationType(integrationType IntegrationTyp
 }
 
 type AlternateBidderCodes struct {
-	Enabled  bool                                   `mapstructure:"enabled" json:"enabled"`
-	Adapters map[string]AdapterAlternateBidderCodes `mapstructure:"adapters" json:"adapters"`
+	Enabled bool                                   `mapstructure:"enabled" json:"enabled"`
+	Bidders map[string]AdapterAlternateBidderCodes `mapstructure:"bidders" json:"bidders"`
 }
 
 type AdapterAlternateBidderCodes struct {
@@ -246,11 +246,11 @@ func (bidderCodes *AlternateBidderCodes) IsValidBidderCode(bidder, alternateBidd
 		return false, nil
 	}
 
-	if bidderCodes.Adapters == nil {
+	if bidderCodes.Bidders == nil {
 		return false, fmt.Errorf(ErrAlternateBidderNotDefined, bidder, alternateBidder)
 	}
 
-	adapterCfg, ok := bidderCodes.Adapters[bidder]
+	adapterCfg, ok := bidderCodes.Bidders[bidder]
 	if !ok {
 		return false, fmt.Errorf(ErrAlternateBidderNotDefined, bidder, alternateBidder)
 	}
diff --git a/config/config.go b/config/config.go
index 0733e6c9..e49d8426 100644
--- a/config/config.go
+++ b/config/config.go
@@ -493,6 +493,9 @@ type DisabledMetrics struct {
 	// True if we want to stop collecting account debug request metrics
 	AccountDebug bool `mapstructure:"account_debug"`
 
+	// True if we want to stop collecting account stored respponses metrics
+	AccountStoredResponses bool `mapstructure:"account_stored_responses"`
+
 	// True if we don't want to collect metrics about the connections prebid
 	// server establishes with bidder servers such as the number of connections
 	// that were created or reused.
@@ -788,6 +791,7 @@ func SetupViper(v *viper.Viper, filename string) {
 	// no metrics configured by default (metrics{host|database|username|password})
 	v.SetDefault("metrics.disabled_metrics.account_adapter_details", false)
 	v.SetDefault("metrics.disabled_metrics.account_debug", true)
+	v.SetDefault("metrics.disabled_metrics.account_stored_responses", true)
 	v.SetDefault("metrics.disabled_metrics.adapter_connections_metrics", true)
 	v.SetDefault("metrics.disabled_metrics.adapter_gdpr_request_blocked", false)
 	v.SetDefault("metrics.influxdb.host", "")
@@ -955,6 +959,7 @@ func SetupViper(v *viper.Viper, filename string) {
 	v.SetDefault("adapters.bidscube.endpoint", "http://supply.bidscube.com/?c=o&m=rtb")
 	v.SetDefault("adapters.bizzclick.endpoint", "http://us-e-node1.bizzclick.com/bid?rtb_seat_id={{.SourceId}}&secret_key={{.AccountID}}")
 	v.SetDefault("adapters.bliink.endpoint", "http://engine.bliink.io/bid")
+	v.SetDefault("adapters.blue.endpoint", "https://prebid-us-east-1.getblue.io/?src=prebid")
 	v.SetDefault("adapters.bmtm.endpoint", "https://one.elitebidder.com/api/pbs")
 	v.SetDefault("adapters.brightroll.endpoint", "http://east-bid.ybp.yahoo.com/bid/appnexuspbs")
 	v.SetDefault("adapters.coinzilla.endpoint", "http://request-global.czilladx.com/serve/prebid-server.php")
@@ -1042,6 +1047,7 @@ func SetupViper(v *viper.Viper, filename string) {
 	v.SetDefault("adapters.smilewanted.endpoint", "http://prebid-server.smilewanted.com")
 	v.SetDefault("adapters.sonobi.endpoint", "https://apex.go.sonobi.com/prebid?partnerid=71d9d3d8af")
 	v.SetDefault("adapters.sovrn.endpoint", "http://pbs.lijit.com/rtb/bid?src=prebid_server")
+	v.SetDefault("adapters.sspbc.endpoint", "https://ssp.wp.pl/bidder/")
 	v.SetDefault("adapters.streamkey.endpoint", "http://ghb.hb.streamkey.net/pbs/ortb")
 	v.SetDefault("adapters.stroeercore.disabled", true)
 	v.SetDefault("adapters.stroeercore.endpoint", "http://mhb.adscale.de/s2sdsh")
diff --git a/config/stored_requests.go b/config/stored_requests.go
index 9ff66149..c8fa5c28 100644
--- a/config/stored_requests.go
+++ b/config/stored_requests.go
@@ -19,6 +19,7 @@ const (
 	VideoDataType      DataType = "Video"
 	AMPRequestDataType DataType = "AMP Request"
 	AccountDataType    DataType = "Account"
+	ResponseDataType   DataType = "Response"
 )
 
 // Section returns the config section this type is defined in
@@ -29,6 +30,7 @@ func (dataType DataType) Section() string {
 		VideoDataType:      "stored_video_req",
 		AMPRequestDataType: "stored_amp_req",
 		AccountDataType:    "accounts",
+		ResponseDataType:   "stored_responses",
 	}[dataType]
 }
 
@@ -133,6 +135,7 @@ func resolvedStoredRequestsConfig(cfg *Configuration) {
 	cfg.StoredVideo.dataType = VideoDataType
 	cfg.CategoryMapping.dataType = CategoryDataType
 	cfg.Accounts.dataType = AccountDataType
+	cfg.StoredResponses.dataType = ResponseDataType
 }
 
 func (cfg *StoredRequests) validate(errs []error) []error {
diff --git a/exchange/adapter_builders.go b/exchange/adapter_builders.go
index ed1ac43e..05c4fe63 100755
--- a/exchange/adapter_builders.go
+++ b/exchange/adapter_builders.go
@@ -43,6 +43,7 @@ import (
 	"github.com/prebid/prebid-server/adapters/bidscube"
 	"github.com/prebid/prebid-server/adapters/bizzclick"
 	"github.com/prebid/prebid-server/adapters/bliink"
+	"github.com/prebid/prebid-server/adapters/blue"
 	"github.com/prebid/prebid-server/adapters/bmtm"
 	"github.com/prebid/prebid-server/adapters/brightroll"
 	"github.com/prebid/prebid-server/adapters/coinzilla"
@@ -120,6 +121,7 @@ import (
 	"github.com/prebid/prebid-server/adapters/smilewanted"
 	"github.com/prebid/prebid-server/adapters/sonobi"
 	"github.com/prebid/prebid-server/adapters/sovrn"
+	"github.com/prebid/prebid-server/adapters/sspBC"
 	"github.com/prebid/prebid-server/adapters/stroeerCore"
 	"github.com/prebid/prebid-server/adapters/synacormedia"
 	"github.com/prebid/prebid-server/adapters/tappx"
@@ -190,6 +192,7 @@ func newAdapterBuilders() map[openrtb_ext.BidderName]adapters.Builder {
 		openrtb_ext.BidderBidsCube:          bidscube.Builder,
 		openrtb_ext.BidderBizzclick:         bizzclick.Builder,
 		openrtb_ext.BidderBliink:            bliink.Builder,
+		openrtb_ext.BidderBlue:              blue.Builder,
 		openrtb_ext.BidderBmtm:              bmtm.Builder,
 		openrtb_ext.BidderBrightroll:        brightroll.Builder,
 		openrtb_ext.BidderCoinzilla:         coinzilla.Builder,
@@ -272,6 +275,7 @@ func newAdapterBuilders() map[openrtb_ext.BidderName]adapters.Builder {
 		openrtb_ext.BidderSmileWanted:       smilewanted.Builder,
 		openrtb_ext.BidderSonobi:            sonobi.Builder,
 		openrtb_ext.BidderSovrn:             sovrn.Builder,
+		openrtb_ext.BidderSspBC:             sspBC.Builder,
 		openrtb_ext.BidderStreamkey:         adtelligent.Builder,
 		openrtb_ext.BidderStroeerCore:       stroeerCore.Builder,
 		openrtb_ext.BidderSynacormedia:      synacormedia.Builder,
diff --git a/exchange/exchange.go b/exchange/exchange.go
index 07e8aa11..5fc11d4e 100644
--- a/exchange/exchange.go
+++ b/exchange/exchange.go
@@ -251,6 +251,10 @@ func (e *exchange) HoldAuction(ctx context.Context, r AuctionRequest, debugLog *
 
 	e.me.RecordRequestPrivacy(privacyLabels)
 
+	if len(r.StoredAuctionResponses) > 0 || len(r.StoredBidResponses) > 0 {
+		e.me.RecordStoredResponse(r.PubID)
+	}
+
 	// If we need to cache bids, then it will take some time to call prebid cache.
 	// We should reduce the amount of time the bidders have, to compensate.
 	auctionCtx, cancel := e.makeAuctionContext(ctx, cacheInstructions.cacheBids)
diff --git a/go.mod b/go.mod
index 67578244..eef1e244 100644
--- a/go.mod
+++ b/go.mod
@@ -6,7 +6,7 @@ require (
 	github.com/DATA-DOG/go-sqlmock v1.5.0
 	github.com/NYTimes/gziphandler v1.1.1
 	github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d
-	github.com/benbjohnson/clock v1.3.0 // indirect
+	github.com/benbjohnson/clock v1.3.0
 	github.com/buger/jsonparser v1.1.1
 	github.com/chasex/glog v0.0.0-20160217080310-c62392af379c
 	github.com/coocood/freecache v1.2.1
@@ -16,7 +16,6 @@ require (
 	github.com/julienschmidt/httprouter v1.3.0
 	github.com/lib/pq v1.10.4
 	github.com/mitchellh/copystructure v1.2.0
-	github.com/mxmCherry/openrtb v13.0.0+incompatible
 	github.com/mxmCherry/openrtb/v16 v16.0.0-alpha.2
 	github.com/prebid/go-gdpr v1.11.0
 	github.com/prometheus/client_golang v1.12.1
diff --git a/go.sum b/go.sum
index a4e68c54..73a65c62 100644
--- a/go.sum
+++ b/go.sum
@@ -337,8 +337,6 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb
 github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/mxmCherry/openrtb v13.0.0+incompatible h1:KEnUHAJFovM54lcicyjiJgZZ4mWKNw+h0GOJXWOoJ4A=
-github.com/mxmCherry/openrtb v13.0.0+incompatible/go.mod h1:zpnz6Au3bzTGplpRU0kvFPNT6g4ROAKx/GkrslFDwZk=
 github.com/mxmCherry/openrtb/v16 v16.0.0-alpha.2 h1:Iwp8+KHfzDIhaKFynJ4xVstU1LTVLzG+Unur5d0CeWo=
 github.com/mxmCherry/openrtb/v16 v16.0.0-alpha.2/go.mod h1:k+21QiTXLLjjXCroputuQNIDJC2GtrzFcHbJbDz4RcE=
 github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
diff --git a/metrics/config/metrics.go b/metrics/config/metrics.go
index c94557a1..127363f2 100644
--- a/metrics/config/metrics.go
+++ b/metrics/config/metrics.go
@@ -261,6 +261,12 @@ func (me *MultiMetricsEngine) RecordDebugRequest(debugEnabled bool, pubId string
 	}
 }
 
+func (me *MultiMetricsEngine) RecordStoredResponse(pubId string) {
+	for _, thisME := range *me {
+		thisME.RecordStoredResponse(pubId)
+	}
+}
+
 // NilMetricsEngine implements the MetricsEngine interface where no metrics are actually captured. This is
 // used if no metric backend is configured and also for tests.
 type NilMetricsEngine struct{}
@@ -376,3 +382,6 @@ func (me *NilMetricsEngine) RecordAdapterGDPRRequestBlocked(adapter openrtb_ext.
 // RecordDebugRequest as a noop
 func (me *NilMetricsEngine) RecordDebugRequest(debugEnabled bool, pubId string) {
 }
+
+func (me *NilMetricsEngine) RecordStoredResponse(pubId string) {
+}
diff --git a/metrics/go_metrics.go b/metrics/go_metrics.go
index 30752321..4d6e9bf6 100644
--- a/metrics/go_metrics.go
+++ b/metrics/go_metrics.go
@@ -32,6 +32,7 @@ type Metrics struct {
 	AccountCacheMeter              map[CacheResult]metrics.Meter
 	DNSLookupTimer                 metrics.Timer
 	TLSHandshakeTimer              metrics.Timer
+	StoredResponsesMeter           metrics.Meter
 
 	// Metrics for OpenRTB requests specifically. So we can track what % of RequestsMeter are OpenRTB
 	// and know when legacy requests have been abandoned.
@@ -99,7 +100,8 @@ type accountMetrics struct {
 	bidsReceivedMeter metrics.Meter
 	priceHistogram    metrics.Histogram
 	// store account by adapter metrics. Type is map[PBSBidder.BidderCode]
-	adapterMetrics map[openrtb_ext.BidderName]*AdapterMetrics
+	adapterMetrics       map[openrtb_ext.BidderName]*AdapterMetrics
+	storedResponsesMeter metrics.Meter
 }
 
 // NewBlankMetrics creates a new Metrics object with all blank metrics object. This may also be useful for
@@ -141,6 +143,7 @@ func NewBlankMetrics(registry metrics.Registry, exchanges []openrtb_ext.BidderNa
 		SetUidMeter:                    blankMeter,
 		SetUidStatusMeter:              make(map[SetUidStatus]metrics.Meter),
 		SyncerSetsMeter:                make(map[string]map[SyncerSetUidStatus]metrics.Meter),
+		StoredResponsesMeter:           blankMeter,
 
 		ImpsTypeBanner: blankMeter,
 		ImpsTypeVideo:  blankMeter,
@@ -228,6 +231,7 @@ func NewMetrics(registry metrics.Registry, exchanges []openrtb_ext.BidderName, d
 	newMetrics.TLSHandshakeTimer = metrics.GetOrRegisterTimer("tls_handshake_time", registry)
 	newMetrics.PrebidCacheRequestTimerSuccess = metrics.GetOrRegisterTimer("prebid_cache_request_time.ok", registry)
 	newMetrics.PrebidCacheRequestTimerError = metrics.GetOrRegisterTimer("prebid_cache_request_time.err", registry)
+	newMetrics.StoredResponsesMeter = metrics.GetOrRegisterMeter("stored_responses", registry)
 
 	for _, dt := range StoredDataTypes() {
 		for _, ft := range StoredDataFetchTypes() {
@@ -402,6 +406,7 @@ func (me *Metrics) getAccountMetrics(id string) *accountMetrics {
 	am.bidsReceivedMeter = metrics.GetOrRegisterMeter(fmt.Sprintf("account.%s.bids_received", id), me.MetricsRegistry)
 	am.priceHistogram = metrics.GetOrRegisterHistogram(fmt.Sprintf("account.%s.prices", id), me.MetricsRegistry, metrics.NewExpDecaySample(1028, 0.015))
 	am.adapterMetrics = make(map[openrtb_ext.BidderName]*AdapterMetrics, len(me.exchanges))
+	am.storedResponsesMeter = metrics.GetOrRegisterMeter(fmt.Sprintf("account.%s.stored_responses", id), me.MetricsRegistry)
 	if !me.MetricsDisabled.AccountAdapterDetails {
 		for _, a := range me.exchanges {
 			am.adapterMetrics[a] = makeBlankAdapterMetrics(me.MetricsDisabled)
@@ -447,6 +452,13 @@ func (me *Metrics) RecordDebugRequest(debugEnabled bool, pubID string) {
 	}
 }
 
+func (me *Metrics) RecordStoredResponse(pubId string) {
+	me.StoredResponsesMeter.Mark(1)
+	if pubId != PublisherUnknown && !me.MetricsDisabled.AccountStoredResponses {
+		me.getAccountMetrics(pubId).storedResponsesMeter.Mark(1)
+	}
+}
+
 func (me *Metrics) RecordImps(labels ImpLabels) {
 	me.ImpMeter.Mark(int64(1))
 	if labels.BannerImps {
diff --git a/metrics/metrics.go b/metrics/metrics.go
index aff134ab..5c6493cb 100644
--- a/metrics/metrics.go
+++ b/metrics/metrics.go
@@ -57,6 +57,7 @@ const (
 	CategoryDataType StoredDataType = "category"
 	RequestDataType  StoredDataType = "request"
 	VideoDataType    StoredDataType = "video"
+	ResponseDataType StoredDataType = "response"
 )
 
 func StoredDataTypes() []StoredDataType {
@@ -66,6 +67,7 @@ func StoredDataTypes() []StoredDataType {
 		CategoryDataType,
 		RequestDataType,
 		VideoDataType,
+		ResponseDataType,
 	}
 }
 
@@ -412,4 +414,5 @@ type MetricsEngine interface {
 	RecordRequestPrivacy(privacy PrivacyLabels)
 	RecordAdapterGDPRRequestBlocked(adapterName openrtb_ext.BidderName)
 	RecordDebugRequest(debugEnabled bool, pubId string)
+	RecordStoredResponse(pubId string)
 }
diff --git a/metrics/metrics_mock.go b/metrics/metrics_mock.go
index 84f75491..1ad7a5cc 100644
--- a/metrics/metrics_mock.go
+++ b/metrics/metrics_mock.go
@@ -150,3 +150,7 @@ func (me *MetricsEngineMock) RecordAdapterGDPRRequestBlocked(adapterName openrtb
 func (me *MetricsEngineMock) RecordDebugRequest(debugEnabled bool, pubId string) {
 	me.Called(debugEnabled, pubId)
 }
+
+func (me *MetricsEngineMock) RecordStoredResponse(pubId string) {
+	me.Called(pubId)
+}
diff --git a/metrics/prometheus/preload.go b/metrics/prometheus/preload.go
index 338b1e8b..bf98a820 100644
--- a/metrics/prometheus/preload.go
+++ b/metrics/prometheus/preload.go
@@ -77,6 +77,10 @@ func preloadLabelValues(m *Metrics, syncerKeys []string) {
 		storedDataFetchTypeLabel: storedDataFetchTypeValues,
 	})
 
+	preloadLabelValuesForHistogram(m.storedResponsesFetchTimer, map[string][]string{
+		storedDataFetchTypeLabel: storedDataFetchTypeValues,
+	})
+
 	preloadLabelValuesForCounter(m.storedAccountErrors, map[string][]string{
 		storedDataErrorLabel: storedDataErrorValues,
 	})
@@ -97,6 +101,10 @@ func preloadLabelValues(m *Metrics, syncerKeys []string) {
 		storedDataErrorLabel: storedDataErrorValues,
 	})
 
+	preloadLabelValuesForCounter(m.storedResponsesErrors, map[string][]string{
+		storedDataErrorLabel: storedDataErrorValues,
+	})
+
 	preloadLabelValuesForCounter(m.requestsWithoutCookie, map[string][]string{
 		requestTypeLabel: requestTypeValues,
 	})
diff --git a/metrics/prometheus/prometheus.go b/metrics/prometheus/prometheus.go
index 87c4d1c2..e1b8d4a4 100644
--- a/metrics/prometheus/prometheus.go
+++ b/metrics/prometheus/prometheus.go
@@ -51,6 +51,9 @@ type Metrics struct {
 	privacyCOPPA                 *prometheus.CounterVec
 	privacyLMT                   *prometheus.CounterVec
 	privacyTCF                   *prometheus.CounterVec
+	storedResponses              prometheus.Counter
+	storedResponsesFetchTimer    *prometheus.HistogramVec
+	storedResponsesErrors        *prometheus.CounterVec
 
 	// Adapter Metrics
 	adapterBids                *prometheus.CounterVec
@@ -69,8 +72,9 @@ type Metrics struct {
 	syncerSets     *prometheus.CounterVec
 
 	// Account Metrics
-	accountRequests      *prometheus.CounterVec
-	accountDebugRequests *prometheus.CounterVec
+	accountRequests        *prometheus.CounterVec
+	accountDebugRequests   *prometheus.CounterVec
+	accountStoredResponses *prometheus.CounterVec
 
 	metricsDisabled config.DisabledMetrics
 }
@@ -311,6 +315,21 @@ func NewMetrics(cfg config.PrometheusMetrics, disabledMetrics config.DisabledMet
 			[]string{adapterLabel})
 	}
 
+	metrics.storedResponsesFetchTimer = newHistogramVec(cfg, reg,
+		"stored_response_fetch_time_seconds",
+		"Seconds to fetch stored responses labeled by fetch type",
+		[]string{storedDataFetchTypeLabel},
+		standardTimeBuckets)
+
+	metrics.storedResponsesErrors = newCounter(cfg, reg,
+		"stored_response_errors",
+		"Count of stored video errors by error type",
+		[]string{storedDataErrorLabel})
+
+	metrics.storedResponses = newCounterWithoutLabels(cfg, reg,
+		"stored_responses",
+		"Count of total requests to Prebid Server that have stored responses")
+
 	metrics.adapterBids = newCounter(cfg, reg,
 		"adapter_bids",
 		"Count of bids labeled by adapter and markup delivery type (adm or nurl).",
@@ -387,6 +406,11 @@ func NewMetrics(cfg config.PrometheusMetrics, disabledMetrics config.DisabledMet
 		[]string{requestTypeLabel, requestStatusLabel},
 		queuedRequestTimeBuckets)
 
+	metrics.accountStoredResponses = newCounter(cfg, reg,
+		"account_stored_responses",
+		"Count of total requests to Prebid Server that have stored responses labled by account",
+		[]string{accountLabel})
+
 	metrics.Gatherer = reg
 
 	metricsPrefix := fmt.Sprintf("%s_%s_", cfg.Namespace, cfg.Subsystem)
@@ -499,6 +523,15 @@ func (m *Metrics) RecordDebugRequest(debugEnabled bool, pubID string) {
 	}
 }
 
+func (m *Metrics) RecordStoredResponse(pubId string) {
+	m.storedResponses.Inc()
+	if !m.metricsDisabled.AccountStoredResponses && pubId != metrics.PublisherUnknown {
+		m.accountStoredResponses.With(prometheus.Labels{
+			accountLabel: pubId,
+		}).Inc()
+	}
+}
+
 func (m *Metrics) RecordImps(labels metrics.ImpLabels) {
 	m.impressions.With(prometheus.Labels{
 		isBannerLabel: strconv.FormatBool(labels.BannerImps),
@@ -538,6 +571,10 @@ func (m *Metrics) RecordStoredDataFetchTime(labels metrics.StoredDataLabels, len
 		m.storedVideoFetchTimer.With(prometheus.Labels{
 			storedDataFetchTypeLabel: string(labels.DataFetchType),
 		}).Observe(length.Seconds())
+	case metrics.ResponseDataType:
+		m.storedResponsesFetchTimer.With(prometheus.Labels{
+			storedDataFetchTypeLabel: string(labels.DataFetchType),
+		}).Observe(length.Seconds())
 	}
 }
 
@@ -563,6 +600,10 @@ func (m *Metrics) RecordStoredDataError(labels metrics.StoredDataLabels) {
 		m.storedVideoErrors.With(prometheus.Labels{
 			storedDataErrorLabel: string(labels.Error),
 		}).Inc()
+	case metrics.ResponseDataType:
+		m.storedResponsesErrors.With(prometheus.Labels{
+			storedDataErrorLabel: string(labels.Error),
+		}).Inc()
 	}
 }
 
diff --git a/openrtb_ext/bidders.go b/openrtb_ext/bidders.go
index a9830d27..6614d70c 100644
--- a/openrtb_ext/bidders.go
+++ b/openrtb_ext/bidders.go
@@ -123,6 +123,7 @@ const (
 	BidderBidsCube          BidderName = "bidscube"
 	BidderBizzclick         BidderName = "bizzclick"
 	BidderBliink            BidderName = "bliink"
+	BidderBlue              BidderName = "blue"
 	BidderBmtm              BidderName = "bmtm"
 	BidderBrightroll        BidderName = "brightroll"
 	BidderCoinzilla         BidderName = "coinzilla"
@@ -205,6 +206,7 @@ const (
 	BidderSmileWanted       BidderName = "smilewanted"
 	BidderSonobi            BidderName = "sonobi"
 	BidderSovrn             BidderName = "sovrn"
+	BidderSspBC             BidderName = "sspBC"
 	BidderStreamkey         BidderName = "streamkey"
 	BidderStroeerCore       BidderName = "stroeerCore"
 	BidderSynacormedia      BidderName = "synacormedia"
@@ -278,6 +280,7 @@ func CoreBidderNames() []BidderName {
 		BidderBidsCube,
 		BidderBizzclick,
 		BidderBliink,
+		BidderBlue,
 		BidderBmtm,
 		BidderBrightroll,
 		BidderCoinzilla,
@@ -360,6 +363,7 @@ func CoreBidderNames() []BidderName {
 		BidderSmileWanted,
 		BidderSonobi,
 		BidderSovrn,
+		BidderSspBC,
 		BidderStreamkey,
 		BidderStroeerCore,
 		BidderSynacormedia,
diff --git a/openrtb_ext/imp_sspbc.go b/openrtb_ext/imp_sspbc.go
new file mode 100644
index 00000000..750694bc
--- /dev/null
+++ b/openrtb_ext/imp_sspbc.go
@@ -0,0 +1,7 @@
+package openrtb_ext
+
+type ExtImpSspbc struct {
+	SiteId string `json:"siteId"`
+	Id     string `json:"id"`
+	IsTest int    `json:"test"`
+}
diff --git a/openrtb_ext/imp_unicorn.go b/openrtb_ext/imp_unicorn.go
index d8b7cf07..d8f095cf 100644
--- a/openrtb_ext/imp_unicorn.go
+++ b/openrtb_ext/imp_unicorn.go
@@ -3,7 +3,7 @@ package openrtb_ext
 // ExtImpUnicorn defines the contract for bidrequest.imp[i].ext.unicorn
 type ExtImpUnicorn struct {
 	PlacementID string `json:"placementId,omitempty"`
-	PublisherID int    `json:"publisherId,omitempty"`
-	MediaID     string `json:"mediaId"`
+	PublisherID string `json:"publisherId,omitempty"`
+	MediaID     string `json:"mediaId,omitempty"`
 	AccountID   int    `json:"accountId,omitempty"`
 }
diff --git a/static/bidder-info/blue.yaml b/static/bidder-info/blue.yaml
new file mode 100644
index 00000000..e7b7769f
--- /dev/null
+++ b/static/bidder-info/blue.yaml
@@ -0,0 +1,15 @@
+maintainer:
+  email: "prebid@getblue.io"
+gvlVendorID: 620
+capabilities:
+  app:
+    mediaTypes:
+      - banner
+  site:
+    mediaTypes:
+      - banner
+userSync:
+  # blue supports user syncing, but requires configuration by the host. contact this
+  # bidder directly at the email address in this file to ask about enabling user sync.
+  supports:
+    - redirect
diff --git a/static/bidder-info/rtbhouse.yaml b/static/bidder-info/rtbhouse.yaml
index 8d5ad3f0..f93dc5e9 100644
--- a/static/bidder-info/rtbhouse.yaml
+++ b/static/bidder-info/rtbhouse.yaml
@@ -9,4 +9,4 @@ userSync:
   # rtbhouse supports user syncing, but requires configuration by the host. contact this
   # bidder directly at the email address in this file to ask about enabling user sync.
   supports:
-    - redirect
\ No newline at end of file
+    - redirect
diff --git a/static/bidder-info/sspBC.yaml b/static/bidder-info/sspBC.yaml
new file mode 100644
index 00000000..aefdf58a
--- /dev/null
+++ b/static/bidder-info/sspBC.yaml
@@ -0,0 +1,12 @@
+maintainer:
+  email: "prebid-dev@grupawp.pl"
+gvlVendorID: 676
+capabilities:
+  site:
+    mediaTypes:
+      - banner
+userSync:
+  default: iframe
+  iframe:
+    url: https://ssp.wp.pl/bidder/usersync?tcf=2&redirect={{.RedirectURL}}
+    userMacro: $UID
\ No newline at end of file
diff --git a/static/bidder-params/blue.json b/static/bidder-params/blue.json
new file mode 100644
index 00000000..6624defd
--- /dev/null
+++ b/static/bidder-params/blue.json
@@ -0,0 +1,15 @@
+{
+    "$schema": "http://json-schema.org/draft-04/schema#",
+    "title": "Blue Adapter Params",
+    "description": "A schema which validates params accepted by the Blue adapter",
+    "type": "object",
+    "properties": {
+        "publisherId": {
+            "type": "string",
+            "description": "The publisher’s ID provided by Blue"
+        }
+    },
+    "required": [
+        "publisherId"
+    ]
+}
\ No newline at end of file
diff --git a/static/bidder-params/sspBC.json b/static/bidder-params/sspBC.json
new file mode 100644
index 00000000..27cb1a62
--- /dev/null
+++ b/static/bidder-params/sspBC.json
@@ -0,0 +1,27 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "title": "sspBC Bid Adapter Params",
+  "description": "A schema which validates params accepted by the sspBC bid adapter",
+  "type": "object",
+  "properties": {
+    "siteid": {
+      "type": [
+        "string"
+      ],
+      "description": "Identifier of site that is selling the impression"
+    },
+    "id": {
+      "type": [
+        "string"
+      ],
+      "description": "Identifier of adslot that the auction in running on"
+    },
+    "test": {
+      "type": [
+        "integer"
+      ],
+      "description": "Switch that enables test responses"
+    }
+  },
+  "required": []
+}
\ No newline at end of file
diff --git a/static/bidder-params/unicorn.json b/static/bidder-params/unicorn.json
index f9c4e167..9348246c 100644
--- a/static/bidder-params/unicorn.json
+++ b/static/bidder-params/unicorn.json
@@ -9,7 +9,7 @@
       "description": "In Application, if placementId is empty, prebid server configuration id will be used as placementId."
     },
     "publisherId": {
-      "type": "integer",
+      "type": "string",
       "description": "Account specific publisher id"
     },
     "mediaId": {
@@ -21,5 +21,5 @@
       "description": "Account ID for charge request"
     }
   },
-  "required" : ["mediaId", "accountId"]
+  "required" : ["accountId"]
 }
\ No newline at end of file
diff --git a/stored_requests/events/postgres/database.go b/stored_requests/events/postgres/database.go
index a666fae5..9d69e84b 100644
--- a/stored_requests/events/postgres/database.go
+++ b/stored_requests/events/postgres/database.go
@@ -25,6 +25,7 @@ var storedDataTypeMetricMap = map[config.DataType]metrics.StoredDataType{
 	config.VideoDataType:      metrics.VideoDataType,
 	config.AMPRequestDataType: metrics.AMPDataType,
 	config.AccountDataType:    metrics.AccountDataType,
+	config.ResponseDataType:   metrics.ResponseDataType,
 }
 
 type PostgresEventProducerConfig struct {


Test patch:
diff --git a/adapters/blue/blue_test.go b/adapters/blue/blue_test.go
new file mode 100644
index 00000000..d7974979
--- /dev/null
+++ b/adapters/blue/blue_test.go
@@ -0,0 +1,20 @@
+package blue
+
+import (
+	"testing"
+
+	"github.com/prebid/prebid-server/adapters/adapterstest"
+	"github.com/prebid/prebid-server/config"
+	"github.com/prebid/prebid-server/openrtb_ext"
+)
+
+func TestBidderBlue(t *testing.T) {
+	bidder, buildErr := Builder(openrtb_ext.BidderInMobi, config.Adapter{
+		Endpoint: "https://foo.io/?src=prebid"})
+
+	if buildErr != nil {
+		t.Fatalf("Builder returned unexpected error %v", buildErr)
+	}
+
+	adapterstest.RunJSONBidderTest(t, "bluetest", bidder)
+}
diff --git a/adapters/blue/bluetest/exemplary/simple-web-banner.json b/adapters/blue/bluetest/exemplary/simple-web-banner.json
new file mode 100644
index 00000000..8f75f536
--- /dev/null
+++ b/adapters/blue/bluetest/exemplary/simple-web-banner.json
@@ -0,0 +1,115 @@
+{
+  "mockBidRequest": {
+    "site": {
+      "page": "https://getblue.io"
+    },
+    "id": "req-id",
+    "device": {
+      "ip": "1.1.1.1",
+      "ua": "Mozilla/5.0 (Linux; Android 8.0.0; SM-G960F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36"
+    },
+    "imp": [
+      {
+        "ext": {
+          "bidder": {
+            "plc": "125566877"
+          }
+        },
+        "banner": {
+          "w": 300,
+          "h": 50
+        },
+        "id": "blue-id"
+      }
+    ]
+  },
+  "httpCalls": [
+    {
+      "expectedRequest": {
+        "uri": "https://foo.io/?src=prebid",
+        "headers": {
+          "Content-Type": [
+            "application/json;charset=utf-8"
+          ]
+        },
+        "body": {
+          "site": {
+            "page": "https://getblue.io"
+          },
+          "id": "req-id",
+          "device": {
+            "ip": "1.1.1.1",
+            "ua": "Mozilla/5.0 (Linux; Android 8.0.0; SM-G960F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36"
+          },
+          "imp": [
+            {
+              "ext": {
+                "bidder": {
+                  "plc": "125566877"
+                }
+              },
+              "banner": {
+                "w": 300,
+                "h": 50
+              },
+              "id": "blue-id"
+            }
+          ]
+        }
+      },
+      "mockResponse": {
+        "status": 200,
+        "body": {
+          "id": "req-id",
+          "seatbid": [
+            {
+              "bid": [
+                {
+                  "ext": {
+                    "prebid": {
+                      "meta": {
+                        "networkName": "blue"
+                      }
+                    }
+                  },
+                  "nurl": "https://some.event.url/params",
+                  "crid": "123456789",
+                  "adomain": [],
+                  "price": 1.0,
+                  "id": "1234",
+                  "adm": "bannerhtml",
+                  "impid": "blue-id"
+                }
+              ]
+            }
+          ]
+        }
+      }
+    }
+  ],
+  "expectedBidResponses": [
+    {
+      "currency": "BRL",
+      "bids": [
+        {
+          "bid": {
+            "id": "1234",
+            "impid": "blue-id",
+            "price": 1.0,
+            "adm": "bannerhtml",
+            "crid": "123456789",
+            "nurl": "https://some.event.url/params",
+            "ext": {
+              "prebid": {
+                "meta": {
+                  "networkName": "blue"
+                }
+              }
+            }
+          },
+          "type": "banner"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/adapters/blue/bluetest/supplemental/204-response-from-target.json b/adapters/blue/bluetest/supplemental/204-response-from-target.json
new file mode 100755
index 00000000..801fdb3e
--- /dev/null
+++ b/adapters/blue/bluetest/supplemental/204-response-from-target.json
@@ -0,0 +1,52 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id",
+    "imp": [
+      {
+        "id": "blue-id",
+        "banner": {
+          "format": [
+            {
+              "w": 300,
+              "h": 50
+            }
+          ]
+        },
+        "ext": {
+          "bidder": {}
+        }
+      }
+    ]
+  },
+  "httpCalls": [
+    {
+      "expectedRequest": {
+        "uri": "https://foo.io/?src=prebid",
+        "body": {
+          "id": "test-request-id",
+          "imp": [
+            {
+              "id": "blue-id",
+              "banner": {
+                "format": [
+                  {
+                    "w": 300,
+                    "h": 50
+                  }
+                ]
+              },
+              "ext": {
+                "bidder": {}
+              }
+            }
+          ]
+        }
+      },
+      "mockResponse": {
+        "status": 204,
+        "body": {}
+      }
+    }
+  ],
+  "expectedBidResponses": []
+}
\ No newline at end of file
diff --git a/adapters/blue/bluetest/supplemental/400-response-from-target.json b/adapters/blue/bluetest/supplemental/400-response-from-target.json
new file mode 100755
index 00000000..9daeeec6
--- /dev/null
+++ b/adapters/blue/bluetest/supplemental/400-response-from-target.json
@@ -0,0 +1,57 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id",
+    "imp": [
+      {
+        "id": "blue-id",
+        "banner": {
+          "format": [
+            {
+              "w": 300,
+              "h": 50
+            }
+          ]
+        },
+        "ext": {
+          "bidder": {}
+        }
+      }
+    ]
+  },
+  "httpCalls": [
+    {
+      "expectedRequest": {
+        "uri": "https://foo.io/?src=prebid",
+        "body": {
+          "id": "test-request-id",
+          "imp": [
+            {
+              "id": "blue-id",
+              "banner": {
+                "format": [
+                  {
+                    "w": 300,
+                    "h": 50
+                  }
+                ]
+              },
+              "ext": {
+                "bidder": {}
+              }
+            }
+          ]
+        }
+      },
+      "mockResponse": {
+        "status": 400,
+        "body": {}
+      }
+    }
+  ],
+  "expectedMakeBidsErrors": [
+    {
+      "value": "Unexpected status code: 400.",
+      "comparison": "literal"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/adapters/blue/bluetest/supplemental/500-response-from-target.json b/adapters/blue/bluetest/supplemental/500-response-from-target.json
new file mode 100755
index 00000000..5c206fae
--- /dev/null
+++ b/adapters/blue/bluetest/supplemental/500-response-from-target.json
@@ -0,0 +1,57 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id",
+    "imp": [
+      {
+        "id": "blue-id",
+        "banner": {
+          "format": [
+            {
+              "w": 300,
+              "h": 50
+            }
+          ]
+        },
+        "ext": {
+          "bidder": {}
+        }
+      }
+    ]
+  },
+  "httpCalls": [
+    {
+      "expectedRequest": {
+        "uri": "https://foo.io/?src=prebid",
+        "body": {
+          "id": "test-request-id",
+          "imp": [
+            {
+              "id": "blue-id",
+              "banner": {
+                "format": [
+                  {
+                    "w": 300,
+                    "h": 50
+                  }
+                ]
+              },
+              "ext": {
+                "bidder": {}
+              }
+            }
+          ]
+        }
+      },
+      "mockResponse": {
+        "status": 500,
+        "body": {}
+      }
+    }
+  ],
+  "expectedMakeBidsErrors": [
+    {
+      "value": "Unexpected status code: 500.",
+      "comparison": "literal"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/adapters/blue/bluetest/supplemental/bad_response.json b/adapters/blue/bluetest/supplemental/bad_response.json
new file mode 100644
index 00000000..2d3e45b2
--- /dev/null
+++ b/adapters/blue/bluetest/supplemental/bad_response.json
@@ -0,0 +1,57 @@
+{
+    "mockBidRequest": {
+        "id": "test-request-id",
+        "imp": [
+            {
+                "id": "blue-id",
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 50
+                        }
+                    ]
+                },
+                "ext": {
+                    "bidder": {}
+                }
+            }
+        ]
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "https://foo.io/?src=prebid",
+                "body": {
+                    "id": "test-request-id",
+                    "imp": [
+                        {
+                            "id": "blue-id",
+                            "banner": {
+                                "format": [
+                                    {
+                                        "w": 300,
+                                        "h": 50
+                                    }
+                                ]
+                            },
+                            "ext": {
+                                "bidder": {}
+                            }
+                        }
+                    ]
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": "<html><body></body></html>"
+            }
+        }
+    ],
+    "expectedMakeBidsErrors": [
+        {
+            "value": "json: cannot unmarshal string into Go value of type openrtb2.BidResponse",
+            "comparison": "literal"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/sspBC/sspbc_test.go b/adapters/sspBC/sspbc_test.go
new file mode 100644
index 00000000..7d8b22ed
--- /dev/null
+++ b/adapters/sspBC/sspbc_test.go
@@ -0,0 +1,20 @@
+package sspBC
+
+import (
+	"testing"
+
+	"github.com/prebid/prebid-server/adapters/adapterstest"
+	"github.com/prebid/prebid-server/config"
+	"github.com/prebid/prebid-server/openrtb_ext"
+)
+
+func TestJsonSamples(t *testing.T) {
+	bidder, buildErr := Builder(openrtb_ext.BidderSspBC, config.Adapter{
+		Endpoint: "http://ssp.wp.test/bidder/"})
+
+	if buildErr != nil {
+		t.Fatalf("Builder returned unexpected error %v", buildErr)
+	}
+
+	adapterstest.RunJSONBidderTest(t, "sspbctest", bidder)
+}
diff --git a/adapters/sspBC/sspbctest/exemplary/banner-fromtemplate.json b/adapters/sspBC/sspbctest/exemplary/banner-fromtemplate.json
new file mode 100644
index 00000000..9346540c
--- /dev/null
+++ b/adapters/sspBC/sspbctest/exemplary/banner-fromtemplate.json
@@ -0,0 +1,152 @@
+{
+    "mockBidRequest": {
+        "id": "test-request",
+        "imp": [
+            {
+                "id": "slot",
+                "ext": {
+                    "bidder": {
+                        "siteId": "237503",
+                        "id": "005"
+                    }
+                },
+                "secure": 1,
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 250
+                        }
+                    ]
+                }
+            }
+        ],
+        "site": {
+            "domain": "test.page",
+            "page": "https://test.page/",
+            "ref": "https://test.referer/"
+        },
+        "regs": {
+            "ext": {
+                "gdpr": 1
+            }
+        },
+        "user": {
+            "ext": {
+                "consent": "test_consent"
+            },
+            "buyeruid": "test_user"
+        }
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://ssp.wp.test/bidder/?bdver=5.6&inver=4",
+                "body": {
+                    "id": "test-request",
+                    "imp": [
+                        {
+                            "id": "005",
+                            "banner": {
+                                "format": [
+                                    {
+                                        "w": 300,
+                                        "h": 250
+                                    }
+                                ]
+                            },
+                            "tagid": "slot",
+                            "secure": 1,
+                            "ext": {
+                                "data": {
+                                    "pbslot": "slot",
+                                    "pbsize": "300x250"
+                                }
+                            }
+                        }
+                    ],
+                    "site": {
+                        "id": "237503",
+                        "domain": "test.page",
+                        "page": "https://test.page/",
+                        "ref": "https://test.referer/"
+                    },
+                    "user": {
+                        "ext": {
+                            "consent": "test_consent"
+                        },
+                        "buyeruid": "test_user"
+                    },
+                    "regs": {
+                        "ext": {
+                            "gdpr": 1
+                        }
+                    }
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": {
+                    "cur": "USD",
+                    "id": "test-request",
+                    "seatbid": [
+                        {
+                            "bid": [
+                                {
+                                    "adm": "some-test-ad",
+                                    "adomain": [
+                                        "sspbc-test"
+                                    ],
+                                    "crid": "1234",
+                                    "ext": {
+                                        "adlabel": "Reklama",
+                                        "pubid": "431",
+                                        "siteid": "237503",
+                                        "slotid": "005",
+                                        "tagid": "slot"
+                                    },
+                                    "w": 300,
+                                    "h": 250,
+                                    "id": "response-005",
+                                    "impid": "005",
+                                    "price": 20
+                                }
+                            ],
+                            "seat": "sspbc-test"
+                        }
+                    ],
+                    "sn": "sspbc-test"
+                }
+            }
+        }
+    ],
+    "expectedBidResponses": [
+        {
+            "currency": "USD",
+            "bids": [
+                {
+                    "bid": {
+                        "id": "response-005",
+                        "impid": "slot",
+                        "price": 20,
+                        "adm": "<html><head><title><\/title><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><style> body { background-color: transparent; margin: 0; padding: 0; }<\/style><script> window.rekid = \"237503\"; window.slot = \"005\"; window.adlabel = 'Reklama'; window.pubid = '431'; window.wp_sn = 'sspbc_go'; window.page = 'https:\\\/\\\/test.page\\\/'; window.ref = 'https:\\\/\\\/test.referer\\\/'; window.mcad = JSON.parse(atob('eyJpZCI6InRlc3QtcmVxdWVzdCIsInNlYXQiOiJzc3BiYy10ZXN0Iiwic2VhdGJpZCI6W3siYmlkIjpbeyJpZCI6InJlc3BvbnNlLTAwNSIsImltcGlkIjoic2xvdCIsInByaWNlIjoyMCwiYWRtIjoic29tZS10ZXN0LWFkIiwiYWRvbWFpbiI6WyJzc3BiYy10ZXN0Il0sImNyaWQiOiIxMjM0IiwidyI6MzAwLCJoIjoyNTAsImV4dCI6eyJhZGxhYmVsIjoiUmVrbGFtYSIsInB1YmlkIjoiNDMxIiwic2l0ZWlkIjoiMjM3NTAzIiwic2xvdGlkIjoiMDA1IiwidGFnaWQiOiJzbG90In19XX1dfQ=='));<\/script><\/head><body><div id=\"c\"><\/div><script async crossorigin nomodule src=\"\/\/std.wpcdn.pl\/wpjslib\/wpjslib-inline.js\" id=\"wpjslib\"><\/script><script async crossorigin type=\"module\" src=\"\/\/std.wpcdn.pl\/wpjslib6\/wpjslib-inline.js\" id=\"wpjslib6\"><\/script><\/body><\/html>",
+                        "adomain": [
+                            "sspbc-test"
+                        ],
+                        "crid": "1234",
+                        "w": 300,
+                        "h": 250,
+                        "ext": {
+                            "adlabel": "Reklama",
+                            "pubid": "431",
+                            "siteid": "237503",
+                            "slotid": "005",
+                            "tagid": "slot"
+                        }
+                    },
+                    "type": "banner"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/sspBC/sspbctest/exemplary/banner-preformatted-multiple-imps.json b/adapters/sspBC/sspbctest/exemplary/banner-preformatted-multiple-imps.json
new file mode 100644
index 00000000..80b78364
--- /dev/null
+++ b/adapters/sspBC/sspbctest/exemplary/banner-preformatted-multiple-imps.json
@@ -0,0 +1,235 @@
+{
+    "mockBidRequest": {
+        "id": "test-request",
+        "imp": [
+            {
+                "id": "slot1",
+                "ext": {
+                    "bidder": {
+                        "siteId": "237503",
+                        "id": "005"
+                    }
+                },
+                "secure": 1,
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 250
+                        }
+                    ]
+                }
+            },
+            {
+                "id": "slot2",
+                "ext": {
+                    "bidder": {
+                        "siteId": "237503",
+                        "id": "037"
+                    }
+                },
+                "secure": 1,
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 600
+                        }
+                    ]
+                }
+            }
+        ],
+        "site": {
+            "domain": "test.page",
+            "page": "https://test.page/",
+            "ref": "https://test.referer/"
+        },
+        "regs": {
+            "ext": {
+                "gdpr": 1
+            }
+        },
+        "user": {
+            "ext": {
+                "consent": "test_consent"
+            },
+            "buyeruid": "test_user"
+        }
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://ssp.wp.test/bidder/?bdver=5.6&inver=4",
+                "body": {
+                    "id": "test-request",
+                    "imp": [
+                        {
+                            "id": "005",
+                            "banner": {
+                                "format": [
+                                    {
+                                        "w": 300,
+                                        "h": 250
+                                    }
+                                ]
+                            },
+                            "tagid": "slot1",
+                            "secure": 1,
+                            "ext": {
+                                "data": {
+                                    "pbslot": "slot1",
+                                    "pbsize": "300x250"
+                                }
+                            }
+                        },
+                        {
+                            "id": "037",
+                            "banner": {
+                                "format": [
+                                    {
+                                        "w": 300,
+                                        "h": 600
+                                    }
+                                ]
+                            },
+                            "tagid": "slot2",
+                            "secure": 1,
+                            "ext": {
+                                "data": {
+                                    "pbslot": "slot2",
+                                    "pbsize": "300x600"
+                                }
+                            }
+                        }
+                    ],
+                    "site": {
+                        "id": "237503",
+                        "domain": "test.page",
+                        "page": "https://test.page/",
+                        "ref": "https://test.referer/"
+                    },
+                    "user": {
+                        "ext": {
+                            "consent": "test_consent"
+                        },
+                        "buyeruid": "test_user"
+                    },
+                    "regs": {
+                        "ext": {
+                            "gdpr": 1
+                        }
+                    }
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": {
+                    "cur": "USD",
+                    "id": "test-request",
+                    "seatbid": [
+                        {
+                            "bid": [
+                                {
+                                    "adm": "<!--preformatted-->test_ad_1",
+                                    "adomain": [
+                                        "sspbc-test"
+                                    ],
+                                    "crid": "1234",
+                                    "ext": {
+                                        "adlabel": "Reklama",
+                                        "pubid": "431",
+                                        "siteid": "237503",
+                                        "slotid": "005",
+                                        "tagid": "slot1"
+                                    },
+                                    "w": 300,
+                                    "h": 250,
+                                    "id": "response-005",
+                                    "impid": "005",
+                                    "price": 20
+                                }
+                            ],
+                            "seat": "sspbc-test"
+                        },
+                        {
+                            "bid": [
+                                {
+                                    "adm": "<!--preformatted-->test_ad_2",
+                                    "adomain": [
+                                        "sspbc-test"
+                                    ],
+                                    "crid": "5678",
+                                    "ext": {
+                                        "adlabel": "Reklama",
+                                        "pubid": "431",
+                                        "siteid": "237503",
+                                        "slotid": "037",
+                                        "tagid": "slot2"
+                                    },
+                                    "w": 300,
+                                    "h": 600,
+                                    "id": "response-037",
+                                    "impid": "037",
+                                    "price": 10
+                                }
+                            ],
+                            "seat": "sspbc-test"
+                        }
+                    ],
+                    "sn": "sspbc-test"
+                }
+            }
+        }
+    ],
+    "expectedBidResponses": [
+        {
+            "currency": "USD",
+            "bids": [
+                {
+                    "bid": {
+                        "id": "response-005",
+                        "impid": "slot1",
+                        "price": 20,
+                        "adm": "<!--preformatted-->test_ad_1",
+                        "adomain": [
+                            "sspbc-test"
+                        ],
+                        "crid": "1234",
+                        "w": 300,
+                        "h": 250,
+                        "ext": {
+                            "adlabel": "Reklama",
+                            "pubid": "431",
+                            "siteid": "237503",
+                            "slotid": "005",
+                            "tagid": "slot1"
+                        }
+                    },
+                    "type": "banner"
+                },
+                {
+                    "bid": {
+                        "id": "response-037",
+                        "impid": "slot2",
+                        "price": 10,
+                        "adm": "<!--preformatted-->test_ad_2",
+                        "adomain": [
+                            "sspbc-test"
+                        ],
+                        "crid": "5678",
+                        "w": 300,
+                        "h": 600,
+                        "ext": {
+                            "adlabel": "Reklama",
+                            "pubid": "431",
+                            "siteid": "237503",
+                            "slotid": "037",
+                            "tagid": "slot2"
+                        }
+                    },
+                    "type": "banner"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/sspBC/sspbctest/exemplary/banner-preformatted-onecode.json b/adapters/sspBC/sspbctest/exemplary/banner-preformatted-onecode.json
new file mode 100644
index 00000000..77999e40
--- /dev/null
+++ b/adapters/sspBC/sspbctest/exemplary/banner-preformatted-onecode.json
@@ -0,0 +1,146 @@
+{
+    "mockBidRequest": {
+        "id": "test-request",
+        "imp": [
+            {
+                "id": "slot",
+                "ext": {},
+                "secure": 1,
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 250
+                        }
+                    ]
+                }
+            }
+        ],
+        "site": {
+            "domain": "test.page",
+            "page": "https://test.page/",
+            "ref": "https://test.referer/"
+        },
+        "regs": {
+            "ext": {
+                "gdpr": 1
+            }
+        },
+        "user": {
+            "ext": {
+                "consent": "test_consent"
+            },
+            "buyeruid": "test_user"
+        }
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://ssp.wp.test/bidder/?bdver=5.6&inver=4",
+                "body": {
+                    "id": "test-request",
+                    "imp": [
+                        {
+                            "id": "slot",
+                            "banner": {
+                                "format": [
+                                    {
+                                        "w": 300,
+                                        "h": 250
+                                    }
+                                ]
+                            },
+                            "tagid": "slot",
+                            "secure": 1,
+                            "ext": {
+                                "data": {
+                                    "pbslot": "slot",
+                                    "pbsize": "300x250"
+                                }
+                            }
+                        }
+                    ],
+                    "site": {
+                        "domain": "test.page",
+                        "page": "https://test.page/",
+                        "ref": "https://test.referer/"
+                    },
+                    "user": {
+                        "ext": {
+                            "consent": "test_consent"
+                        },
+                        "buyeruid": "test_user"
+                    },
+                    "regs": {
+                        "ext": {
+                            "gdpr": 1
+                        }
+                    }
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": {
+                    "cur": "USD",
+                    "id": "test-request",
+                    "seatbid": [
+                        {
+                            "bid": [
+                                {
+                                    "adm": "<!--preformatted-->test_ad",
+                                    "adomain": [
+                                        "sspbc-test"
+                                    ],
+                                    "crid": "1234",
+                                    "ext": {
+                                        "adlabel": "Reklama",
+                                        "pubid": "431",
+                                        "siteid": "237503",
+                                        "slotid": "005",
+                                        "tagid": "slot"
+                                    },
+                                    "w": 300,
+                                    "h": 250,
+                                    "id": "response-005",
+                                    "impid": "slot",
+                                    "price": 20
+                                }
+                            ],
+                            "seat": "sspbc-test"
+                        }
+                    ],
+                    "sn": "sspbc-test"
+                }
+            }
+        }
+    ],
+    "expectedBidResponses": [
+        {
+            "currency": "USD",
+            "bids": [
+                {
+                    "bid": {
+                        "id": "response-005",
+                        "impid": "slot",
+                        "price": 20,
+                        "adm": "<!--preformatted-->test_ad",
+                        "adomain": [
+                            "sspbc-test"
+                        ],
+                        "crid": "1234",
+                        "w": 300,
+                        "h": 250,
+                        "ext": {
+                            "adlabel": "Reklama",
+                            "pubid": "431",
+                            "siteid": "237503",
+                            "slotid": "005",
+                            "tagid": "slot"
+                        }
+                    },
+                    "type": "banner"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/sspBC/sspbctest/exemplary/banner-preformatted.json b/adapters/sspBC/sspbctest/exemplary/banner-preformatted.json
new file mode 100644
index 00000000..ea3b9ca4
--- /dev/null
+++ b/adapters/sspBC/sspbctest/exemplary/banner-preformatted.json
@@ -0,0 +1,152 @@
+{
+    "mockBidRequest": {
+        "id": "test-request",
+        "imp": [
+            {
+                "id": "slot",
+                "ext": {
+                    "bidder": {
+                        "siteId": "237503",
+                        "id": "005"
+                    }
+                },
+                "secure": 1,
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 250
+                        }
+                    ]
+                }
+            }
+        ],
+        "site": {
+            "domain": "test.page",
+            "page": "https://test.page/",
+            "ref": "https://test.referer/"
+        },
+        "regs": {
+            "ext": {
+                "gdpr": 1
+            }
+        },
+        "user": {
+            "ext": {
+                "consent": "test_consent"
+            },
+            "buyeruid": "test_user"
+        }
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://ssp.wp.test/bidder/?bdver=5.6&inver=4",
+                "body": {
+                    "id": "test-request",
+                    "imp": [
+                        {
+                            "id": "005",
+                            "banner": {
+                                "format": [
+                                    {
+                                        "w": 300,
+                                        "h": 250
+                                    }
+                                ]
+                            },
+                            "tagid": "slot",
+                            "secure": 1,
+                            "ext": {
+                                "data": {
+                                    "pbslot": "slot",
+                                    "pbsize": "300x250"
+                                }
+                            }
+                        }
+                    ],
+                    "site": {
+                        "id": "237503",
+                        "domain": "test.page",
+                        "page": "https://test.page/",
+                        "ref": "https://test.referer/"
+                    },
+                    "user": {
+                        "ext": {
+                            "consent": "test_consent"
+                        },
+                        "buyeruid": "test_user"
+                    },
+                    "regs": {
+                        "ext": {
+                            "gdpr": 1
+                        }
+                    }
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": {
+                    "cur": "USD",
+                    "id": "test-request",
+                    "seatbid": [
+                        {
+                            "bid": [
+                                {
+                                    "adm": "<!--preformatted-->test_ad",
+                                    "adomain": [
+                                        "sspbc-test"
+                                    ],
+                                    "crid": "1234",
+                                    "ext": {
+                                        "adlabel": "Reklama",
+                                        "pubid": "431",
+                                        "siteid": "237503",
+                                        "slotid": "005",
+                                        "tagid": "slot"
+                                    },
+                                    "w": 300,
+                                    "h": 250,
+                                    "id": "response-005",
+                                    "impid": "005",
+                                    "price": 20
+                                }
+                            ],
+                            "seat": "sspbc-test"
+                        }
+                    ],
+                    "sn": "sspbc-test"
+                }
+            }
+        }
+    ],
+    "expectedBidResponses": [
+        {
+            "currency": "USD",
+            "bids": [
+                {
+                    "bid": {
+                        "id": "response-005",
+                        "impid": "slot",
+                        "price": 20,
+                        "adm": "<!--preformatted-->test_ad",
+                        "adomain": [
+                            "sspbc-test"
+                        ],
+                        "crid": "1234",
+                        "w": 300,
+                        "h": 250,
+                        "ext": {
+                            "adlabel": "Reklama",
+                            "pubid": "431",
+                            "siteid": "237503",
+                            "slotid": "005",
+                            "tagid": "slot"
+                        }
+                    },
+                    "type": "banner"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/sspBC/sspbctest/supplemental/bad_request_without_site.json b/adapters/sspBC/sspbctest/supplemental/bad_request_without_site.json
new file mode 100644
index 00000000..c8acc0c8
--- /dev/null
+++ b/adapters/sspBC/sspbctest/supplemental/bad_request_without_site.json
@@ -0,0 +1,42 @@
+{
+    "mockBidRequest": {
+        "id": "test-request",
+        "imp": [
+            {
+                "id": "slot",
+                "ext": {
+                    "bidder": {
+                        "siteId": "237503",
+                        "id": "005"
+                    }
+                },
+                "secure": 1,
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 250
+                        }
+                    ]
+                }
+            }
+        ],
+        "regs": {
+            "ext": {
+                "gdpr": 1
+            }
+        },
+        "user": {
+            "ext": {
+                "consent": "test_consent"
+            },
+            "buyeruid": "test_user"
+        }
+    },
+    "expectedMakeRequestsErrors": [
+        {
+          "value": "site cannot be nill",
+          "comparison": "literal"
+        }
+      ]
+}
\ No newline at end of file
diff --git a/adapters/sspBC/sspbctest/supplemental/bad_response.json b/adapters/sspBC/sspbctest/supplemental/bad_response.json
new file mode 100644
index 00000000..b91b8cc2
--- /dev/null
+++ b/adapters/sspBC/sspbctest/supplemental/bad_response.json
@@ -0,0 +1,99 @@
+{
+    "mockBidRequest": {
+        "id": "test-request",
+        "imp": [
+            {
+                "id": "slot",
+                "ext": {
+                    "bidder": {
+                        "siteId": "237503",
+                        "id": "005"
+                    }
+                },
+                "secure": 1,
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 250
+                        }
+                    ]
+                }
+            }
+        ],
+        "site": {
+            "domain": "test.page",
+            "page": "https://test.page/",
+            "ref": "https://test.referer/"
+        },
+        "regs": {
+            "ext": {
+                "gdpr": 1
+            }
+        },
+        "user": {
+            "ext": {
+                "consent": "test_consent"
+            },
+            "buyeruid": "test_user"
+        }
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://ssp.wp.test/bidder/?bdver=5.6&inver=4",
+                "body": {
+                    "id": "test-request",
+                    "imp": [
+                        {
+                            "id": "005",
+                            "banner": {
+                                "format": [
+                                    {
+                                        "w": 300,
+                                        "h": 250
+                                    }
+                                ]
+                            },
+                            "tagid": "slot",
+                            "secure": 1,
+                            "ext": {
+                                "data": {
+                                    "pbslot": "slot",
+                                    "pbsize": "300x250"
+                                }
+                            }
+                        }
+                    ],
+                    "site": {
+                        "id": "237503",
+                        "domain": "test.page",
+                        "page": "https://test.page/",
+                        "ref": "https://test.referer/"
+                    },
+                    "user": {
+                        "ext": {
+                            "consent": "test_consent"
+                        },
+                        "buyeruid": "test_user"
+                    },
+                    "regs": {
+                        "ext": {
+                            "gdpr": 1
+                        }
+                    }
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": "{\"id\"incorrect json"
+            }
+        }
+    ],
+    "expectedMakeBidsErrors": [
+        {
+            "value": "json: cannot unmarshal string into Go value of type openrtb2.BidResponse",
+            "comparison": "literal"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/sspBC/sspbctest/supplemental/bad_response_with_incorrect_impid.json b/adapters/sspBC/sspbctest/supplemental/bad_response_with_incorrect_impid.json
new file mode 100644
index 00000000..31da1162
--- /dev/null
+++ b/adapters/sspBC/sspbctest/supplemental/bad_response_with_incorrect_impid.json
@@ -0,0 +1,135 @@
+{
+    "mockBidRequest": {
+        "id": "test-request",
+        "imp": [
+            {
+                "id": "slot",
+                "ext": {
+                    "bidder": {
+                        "siteId": "237503",
+                        "id": "005"
+                    }
+                },
+                "secure": 1,
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 250
+                        }
+                    ]
+                }
+            }
+        ],
+        "site": {
+            "domain": "test.page",
+            "page": "https://test.page/",
+            "ref": "https://test.referer/"
+        },
+        "regs": {
+            "ext": {
+                "gdpr": 1
+            }
+        },
+        "user": {
+            "ext": {
+                "consent": "test_consent"
+            },
+            "buyeruid": "test_user"
+        }
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://ssp.wp.test/bidder/?bdver=5.6&inver=4",
+                "body": {
+                    "id": "test-request",
+                    "imp": [
+                        {
+                            "id": "005",
+                            "banner": {
+                                "format": [
+                                    {
+                                        "w": 300,
+                                        "h": 250
+                                    }
+                                ]
+                            },
+                            "tagid": "slot",
+                            "secure": 1,
+                            "ext": {
+                                "data": {
+                                    "pbslot": "slot",
+                                    "pbsize": "300x250"
+                                }
+                            }
+                        }
+                    ],
+                    "site": {
+                        "id": "237503",
+                        "domain": "test.page",
+                        "page": "https://test.page/",
+                        "ref": "https://test.referer/"
+                    },
+                    "user": {
+                        "ext": {
+                            "consent": "test_consent"
+                        },
+                        "buyeruid": "test_user"
+                    },
+                    "regs": {
+                        "ext": {
+                            "gdpr": 1
+                        }
+                    }
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": {
+                    "cur": "USD",
+                    "id": "test-request",
+                    "seatbid": [
+                        {
+                            "bid": [
+                                {
+                                    "adm": "{\"bunch\":\"237503\",\"capping\":\"\",\"server\":\"s\",\"campaign\":\"c\",\"score\":\"1\",\"creations\":[{\"type\":\"image\",\"src\":\"https:\/\/bdr.wpcdn.pl\/tests\/test-300x250.png\",\"trackers\":{},\"width\":300,\"height\":250}],\"code\":\"1\",\"aabVendors\":false,\"slot\":\"005\",\"redir\":\"https:\/\/www.wp.pl\",\"wpclid\":\"1\"}",
+                                    "adomain": [
+                                        "sspbc-test"
+                                    ],
+                                    "crid": "1234",
+                                    "ext": {
+                                        "adlabel": "Reklama",
+                                        "pubid": "431",
+                                        "siteid": "237503",
+                                        "slotid": "005",
+                                        "tagid": "slot"
+                                    },
+                                    "w": 300,
+                                    "h": 250,
+                                    "id": "response-005",
+                                    "impid": "incorrect-imp-id",
+                                    "price": 20
+                                }
+                            ],
+                            "seat": "sspbc-test"
+                        }
+                    ],
+                    "sn": "sspbc-test"
+                }
+            }
+        }
+    ],
+    "expectedBidResponses": [
+        {
+            "currency": "USD",
+            "bids": []
+        }
+    ],
+    "expectedMakeBidsErrors": [
+        {
+            "value": "imp not found",
+            "comparison": "literal"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/sspBC/sspbctest/supplemental/bad_response_without_adm.json b/adapters/sspBC/sspbctest/supplemental/bad_response_without_adm.json
new file mode 100644
index 00000000..a1f1fd2b
--- /dev/null
+++ b/adapters/sspBC/sspbctest/supplemental/bad_response_without_adm.json
@@ -0,0 +1,129 @@
+{
+    "mockBidRequest": {
+        "id": "test-request",
+        "imp": [
+            {
+                "id": "slot",
+                "ext": {
+                    "bidder": {
+                        "siteId": "237503",
+                        "id": "005"
+                    }
+                },
+                "secure": 1,
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 250
+                        }
+                    ]
+                }
+            }
+        ],
+        "site": {
+            "domain": "test.page",
+            "page": "https://test.page/",
+            "ref": "https://test.referer/"
+        },
+        "regs": {
+            "ext": {
+                "gdpr": 1
+            }
+        },
+        "user": {
+            "ext": {
+                "consent": "test_consent"
+            },
+            "buyeruid": "test_user"
+        }
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://ssp.wp.test/bidder/?bdver=5.6&inver=4",
+                "body": {
+                    "id": "test-request",
+                    "imp": [
+                        {
+                            "id": "005",
+                            "banner": {
+                                "format": [
+                                    {
+                                        "w": 300,
+                                        "h": 250
+                                    }
+                                ]
+                            },
+                            "tagid": "slot",
+                            "secure": 1,
+                            "ext": {
+                                "data": {
+                                    "pbslot": "slot",
+                                    "pbsize": "300x250"
+                                }
+                            }
+                        }
+                    ],
+                    "site": {
+                        "id": "237503",
+                        "domain": "test.page",
+                        "page": "https://test.page/",
+                        "ref": "https://test.referer/"
+                    },
+                    "user": {
+                        "ext": {
+                            "consent": "test_consent"
+                        },
+                        "buyeruid": "test_user"
+                    },
+                    "regs": {
+                        "ext": {
+                            "gdpr": 1
+                        }
+                    }
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": {
+                    "cur": "USD",
+                    "id": "test-request",
+                    "seatbid": [
+                        {
+                            "bid": [
+                                {
+                                    "adm": "",
+                                    "adomain": [
+                                        "sspbc-test"
+                                    ],
+                                    "crid": "1234",
+                                    "ext": {
+                                        "adlabel": "Reklama",
+                                        "pubid": "431",
+                                        "siteid": "237503",
+                                        "slotid": "005",
+                                        "tagid": "slot"
+                                    },
+                                    "w": 300,
+                                    "h": 250,
+                                    "id": "response-005",
+                                    "impid": "005",
+                                    "price": 20
+                                }
+                            ],
+                            "seat": "sspbc-test"
+                        }
+                    ],
+                    "sn": "sspbc-test"
+                }
+            }
+        }
+    ],
+    "expectedMakeBidsErrors": [
+        {
+            "value": "bid format is not supported",
+            "comparison": "literal"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/sspBC/sspbctest/supplemental/request_with_diffrent_siteid.json b/adapters/sspBC/sspbctest/supplemental/request_with_diffrent_siteid.json
new file mode 100644
index 00000000..ecc8bb8d
--- /dev/null
+++ b/adapters/sspBC/sspbctest/supplemental/request_with_diffrent_siteid.json
@@ -0,0 +1,153 @@
+{
+    "mockBidRequest": {
+        "id": "test-request",
+        "imp": [
+            {
+                "id": "slot",
+                "ext": {
+                    "bidder": {
+                        "siteId": "237503",
+                        "id": "005"
+                    }
+                },
+                "secure": 1,
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 250
+                        }
+                    ]
+                }
+            }
+        ],
+        "site": {
+            "id": "diffrent",
+            "domain": "test.page",
+            "page": "https://test.page/",
+            "ref": "https://test.referer/"
+        },
+        "regs": {
+            "ext": {
+                "gdpr": 1
+            }
+        },
+        "user": {
+            "ext": {
+                "consent": "test_consent"
+            },
+            "buyeruid": "test_user"
+        }
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://ssp.wp.test/bidder/?bdver=5.6&inver=4",
+                "body": {
+                    "id": "test-request",
+                    "imp": [
+                        {
+                            "id": "005",
+                            "banner": {
+                                "format": [
+                                    {
+                                        "w": 300,
+                                        "h": 250
+                                    }
+                                ]
+                            },
+                            "tagid": "slot",
+                            "secure": 1,
+                            "ext": {
+                                "data": {
+                                    "pbslot": "slot",
+                                    "pbsize": "300x250"
+                                }
+                            }
+                        }
+                    ],
+                    "site": {
+                        "id": "237503",
+                        "domain": "test.page",
+                        "page": "https://test.page/",
+                        "ref": "https://test.referer/"
+                    },
+                    "user": {
+                        "ext": {
+                            "consent": "test_consent"
+                        },
+                        "buyeruid": "test_user"
+                    },
+                    "regs": {
+                        "ext": {
+                            "gdpr": 1
+                        }
+                    }
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": {
+                    "cur": "USD",
+                    "id": "test-request",
+                    "seatbid": [
+                        {
+                            "bid": [
+                                {
+                                    "adm": "{\"bunch\":\"237503\",\"capping\":\"\",\"server\":\"s\",\"campaign\":\"c\",\"score\":\"1\",\"creations\":[{\"type\":\"image\",\"src\":\"https:\/\/bdr.wpcdn.pl\/tests\/test-300x250.png\",\"trackers\":{},\"width\":300,\"height\":250}],\"code\":\"1\",\"aabVendors\":false,\"slot\":\"005\",\"redir\":\"https:\/\/www.wp.pl\",\"wpclid\":\"1\"}",
+                                    "adomain": [
+                                        "sspbc-test"
+                                    ],
+                                    "crid": "1234",
+                                    "ext": {
+                                        "adlabel": "Reklama",
+                                        "pubid": "431",
+                                        "siteid": "237503",
+                                        "slotid": "005",
+                                        "tagid": "slot"
+                                    },
+                                    "w": 300,
+                                    "h": 250,
+                                    "id": "response-005",
+                                    "impid": "005",
+                                    "price": 20
+                                }
+                            ],
+                            "seat": "sspbc-test"
+                        }
+                    ],
+                    "sn": "sspbc-test"
+                }
+            }
+        }
+    ],
+    "expectedBidResponses": [
+        {
+            "currency": "USD",
+            "bids": [
+                {
+                    "bid": {
+                        "id": "response-005",
+                        "impid": "slot",
+                        "price": 20,
+                        "adm": "<html><head><title><\/title><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><style> body { background-color: transparent; margin: 0; padding: 0; }<\/style><script> window.rekid = \"237503\"; window.slot = \"005\"; window.adlabel = 'Reklama'; window.pubid = '431'; window.wp_sn = 'sspbc_go'; window.page = 'https:\\\/\\\/test.page\\\/'; window.ref = 'https:\\\/\\\/test.referer\\\/'; window.mcad = JSON.parse(atob('eyJpZCI6InRlc3QtcmVxdWVzdCIsInNlYXQiOiJzc3BiYy10ZXN0Iiwic2VhdGJpZCI6W3siYmlkIjpbeyJpZCI6InJlc3BvbnNlLTAwNSIsImltcGlkIjoic2xvdCIsInByaWNlIjoyMCwiYWRtIjoie1wiYnVuY2hcIjpcIjIzNzUwM1wiLFwiY2FwcGluZ1wiOlwiXCIsXCJzZXJ2ZXJcIjpcInNcIixcImNhbXBhaWduXCI6XCJjXCIsXCJzY29yZVwiOlwiMVwiLFwiY3JlYXRpb25zXCI6W3tcInR5cGVcIjpcImltYWdlXCIsXCJzcmNcIjpcImh0dHBzOi8vYmRyLndwY2RuLnBsL3Rlc3RzL3Rlc3QtMzAweDI1MC5wbmdcIixcInRyYWNrZXJzXCI6e30sXCJ3aWR0aFwiOjMwMCxcImhlaWdodFwiOjI1MH1dLFwiY29kZVwiOlwiMVwiLFwiYWFiVmVuZG9yc1wiOmZhbHNlLFwic2xvdFwiOlwiMDA1XCIsXCJyZWRpclwiOlwiaHR0cHM6Ly93d3cud3AucGxcIixcIndwY2xpZFwiOlwiMVwifSIsImFkb21haW4iOlsic3NwYmMtdGVzdCJdLCJjcmlkIjoiMTIzNCIsInciOjMwMCwiaCI6MjUwLCJleHQiOnsiYWRsYWJlbCI6IlJla2xhbWEiLCJwdWJpZCI6IjQzMSIsInNpdGVpZCI6IjIzNzUwMyIsInNsb3RpZCI6IjAwNSIsInRhZ2lkIjoic2xvdCJ9fV19XX0='));<\/script><\/head><body><div id=\"c\"><\/div><script async crossorigin nomodule src=\"\/\/std.wpcdn.pl\/wpjslib\/wpjslib-inline.js\" id=\"wpjslib\"><\/script><script async crossorigin type=\"module\" src=\"\/\/std.wpcdn.pl\/wpjslib6\/wpjslib-inline.js\" id=\"wpjslib6\"><\/script><\/body><\/html>",
+                        "adomain": [
+                            "sspbc-test"
+                        ],
+                        "crid": "1234",
+                        "w": 300,
+                        "h": 250,
+                        "ext": {
+                            "adlabel": "Reklama",
+                            "pubid": "431",
+                            "siteid": "237503",
+                            "slotid": "005",
+                            "tagid": "slot"
+                        }
+                    },
+                    "type": "banner"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/sspBC/sspbctest/supplemental/request_with_incorrect_imp_bidder_ext.json b/adapters/sspBC/sspbctest/supplemental/request_with_incorrect_imp_bidder_ext.json
new file mode 100644
index 00000000..66fd5e12
--- /dev/null
+++ b/adapters/sspBC/sspbctest/supplemental/request_with_incorrect_imp_bidder_ext.json
@@ -0,0 +1,148 @@
+{
+    "mockBidRequest": {
+        "id": "test-request",
+        "imp": [
+            {
+                "id": "slot",
+                "ext": {
+                    "bidder": "incorrect"
+                },
+                "secure": 1,
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 250
+                        }
+                    ]
+                }
+            }
+        ],
+        "site": {
+            "domain": "test.page",
+            "page": "https://test.page/",
+            "ref": "https://test.referer/"
+        },
+        "regs": {
+            "ext": {
+                "gdpr": 1
+            }
+        },
+        "user": {
+            "ext": {
+                "consent": "test_consent"
+            },
+            "buyeruid": "test_user"
+        }
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://ssp.wp.test/bidder/?bdver=5.6&inver=4",
+                "body": {
+                    "id": "test-request",
+                    "imp": [
+                        {
+                            "id": "slot",
+                            "banner": {
+                                "format": [
+                                    {
+                                        "w": 300,
+                                        "h": 250
+                                    }
+                                ]
+                            },
+                            "tagid": "slot",
+                            "secure": 1,
+                            "ext": {
+                                "data": {
+                                    "pbslot": "slot",
+                                    "pbsize": "300x250"
+                                }
+                            }
+                        }
+                    ],
+                    "site": {
+                        "domain": "test.page",
+                        "page": "https://test.page/",
+                        "ref": "https://test.referer/"
+                    },
+                    "user": {
+                        "ext": {
+                            "consent": "test_consent"
+                        },
+                        "buyeruid": "test_user"
+                    },
+                    "regs": {
+                        "ext": {
+                            "gdpr": 1
+                        }
+                    }
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": {
+                    "cur": "USD",
+                    "id": "test-request",
+                    "seatbid": [
+                        {
+                            "bid": [
+                                {
+                                    "adm": "{\"bunch\":\"237503\",\"capping\":\"\",\"server\":\"s\",\"campaign\":\"c\",\"score\":\"1\",\"creations\":[{\"type\":\"image\",\"src\":\"https:\/\/bdr.wpcdn.pl\/tests\/test-300x250.png\",\"trackers\":{},\"width\":300,\"height\":250}],\"code\":\"1\",\"aabVendors\":false,\"slot\":\"005\",\"redir\":\"https:\/\/www.wp.pl\",\"wpclid\":\"1\"}",
+                                    "adomain": [
+                                        "sspbc-test"
+                                    ],
+                                    "crid": "1234",
+                                    "ext": {
+                                        "adlabel": "Reklama",
+                                        "pubid": "431",
+                                        "siteid": "237503",
+                                        "slotid": "005",
+                                        "tagid": "slot"
+                                    },
+                                    "w": 300,
+                                    "h": 250,
+                                    "id": "response-005",
+                                    "impid": "slot",
+                                    "price": 20
+                                }
+                            ],
+                            "seat": "sspbc-test"
+                        }
+                    ],
+                    "sn": "sspbc-test"
+                }
+            }
+        }
+    ],
+    "expectedBidResponses": [
+        {
+            "currency": "USD",
+            "bids": [
+                {
+                    "bid": {
+                        "id": "response-005",
+                        "impid": "slot",
+                        "price": 20,
+                        "adm": "<html><head><title><\/title><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><style> body { background-color: transparent; margin: 0; padding: 0; }<\/style><script> window.rekid = \"237503\"; window.slot = \"005\"; window.adlabel = 'Reklama'; window.pubid = '431'; window.wp_sn = 'sspbc_go'; window.page = 'https:\\\/\\\/test.page\\\/'; window.ref = 'https:\\\/\\\/test.referer\\\/'; window.mcad = JSON.parse(atob('eyJpZCI6InRlc3QtcmVxdWVzdCIsInNlYXQiOiJzc3BiYy10ZXN0Iiwic2VhdGJpZCI6W3siYmlkIjpbeyJpZCI6InJlc3BvbnNlLTAwNSIsImltcGlkIjoic2xvdCIsInByaWNlIjoyMCwiYWRtIjoie1wiYnVuY2hcIjpcIjIzNzUwM1wiLFwiY2FwcGluZ1wiOlwiXCIsXCJzZXJ2ZXJcIjpcInNcIixcImNhbXBhaWduXCI6XCJjXCIsXCJzY29yZVwiOlwiMVwiLFwiY3JlYXRpb25zXCI6W3tcInR5cGVcIjpcImltYWdlXCIsXCJzcmNcIjpcImh0dHBzOi8vYmRyLndwY2RuLnBsL3Rlc3RzL3Rlc3QtMzAweDI1MC5wbmdcIixcInRyYWNrZXJzXCI6e30sXCJ3aWR0aFwiOjMwMCxcImhlaWdodFwiOjI1MH1dLFwiY29kZVwiOlwiMVwiLFwiYWFiVmVuZG9yc1wiOmZhbHNlLFwic2xvdFwiOlwiMDA1XCIsXCJyZWRpclwiOlwiaHR0cHM6Ly93d3cud3AucGxcIixcIndwY2xpZFwiOlwiMVwifSIsImFkb21haW4iOlsic3NwYmMtdGVzdCJdLCJjcmlkIjoiMTIzNCIsInciOjMwMCwiaCI6MjUwLCJleHQiOnsiYWRsYWJlbCI6IlJla2xhbWEiLCJwdWJpZCI6IjQzMSIsInNpdGVpZCI6IjIzNzUwMyIsInNsb3RpZCI6IjAwNSIsInRhZ2lkIjoic2xvdCJ9fV19XX0='));<\/script><\/head><body><div id=\"c\"><\/div><script async crossorigin nomodule src=\"\/\/std.wpcdn.pl\/wpjslib\/wpjslib-inline.js\" id=\"wpjslib\"><\/script><script async crossorigin type=\"module\" src=\"\/\/std.wpcdn.pl\/wpjslib6\/wpjslib-inline.js\" id=\"wpjslib6\"><\/script><\/body><\/html>",
+                        "adomain": [
+                            "sspbc-test"
+                        ],
+                        "crid": "1234",
+                        "w": 300,
+                        "h": 250,
+                        "ext": {
+                            "adlabel": "Reklama",
+                            "pubid": "431",
+                            "siteid": "237503",
+                            "slotid": "005",
+                            "tagid": "slot"
+                        }
+                    },
+                    "type": "banner"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/sspBC/sspbctest/supplemental/request_with_incorrect_imp_ext.json b/adapters/sspBC/sspbctest/supplemental/request_with_incorrect_imp_ext.json
new file mode 100644
index 00000000..f3ed6f2a
--- /dev/null
+++ b/adapters/sspBC/sspbctest/supplemental/request_with_incorrect_imp_ext.json
@@ -0,0 +1,146 @@
+{
+    "mockBidRequest": {
+        "id": "test-request",
+        "imp": [
+            {
+                "id": "slot",
+                "ext": "incorrect",
+                "secure": 1,
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 250
+                        }
+                    ]
+                }
+            }
+        ],
+        "site": {
+            "domain": "test.page",
+            "page": "https://test.page/",
+            "ref": "https://test.referer/"
+        },
+        "regs": {
+            "ext": {
+                "gdpr": 1
+            }
+        },
+        "user": {
+            "ext": {
+                "consent": "test_consent"
+            },
+            "buyeruid": "test_user"
+        }
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://ssp.wp.test/bidder/?bdver=5.6&inver=4",
+                "body": {
+                    "id": "test-request",
+                    "imp": [
+                        {
+                            "id": "slot",
+                            "banner": {
+                                "format": [
+                                    {
+                                        "w": 300,
+                                        "h": 250
+                                    }
+                                ]
+                            },
+                            "tagid": "slot",
+                            "secure": 1,
+                            "ext": {
+                                "data": {
+                                    "pbslot": "slot",
+                                    "pbsize": "300x250"
+                                }
+                            }
+                        }
+                    ],
+                    "site": {
+                        "domain": "test.page",
+                        "page": "https://test.page/",
+                        "ref": "https://test.referer/"
+                    },
+                    "user": {
+                        "ext": {
+                            "consent": "test_consent"
+                        },
+                        "buyeruid": "test_user"
+                    },
+                    "regs": {
+                        "ext": {
+                            "gdpr": 1
+                        }
+                    }
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": {
+                    "cur": "USD",
+                    "id": "test-request",
+                    "seatbid": [
+                        {
+                            "bid": [
+                                {
+                                    "adm": "{\"bunch\":\"237503\",\"capping\":\"\",\"server\":\"s\",\"campaign\":\"c\",\"score\":\"1\",\"creations\":[{\"type\":\"image\",\"src\":\"https:\/\/bdr.wpcdn.pl\/tests\/test-300x250.png\",\"trackers\":{},\"width\":300,\"height\":250}],\"code\":\"1\",\"aabVendors\":false,\"slot\":\"005\",\"redir\":\"https:\/\/www.wp.pl\",\"wpclid\":\"1\"}",
+                                    "adomain": [
+                                        "sspbc-test"
+                                    ],
+                                    "crid": "1234",
+                                    "ext": {
+                                        "adlabel": "Reklama",
+                                        "pubid": "431",
+                                        "siteid": "237503",
+                                        "slotid": "005",
+                                        "tagid": "slot"
+                                    },
+                                    "w": 300,
+                                    "h": 250,
+                                    "id": "response-005",
+                                    "impid": "slot",
+                                    "price": 20
+                                }
+                            ],
+                            "seat": "sspbc-test"
+                        }
+                    ],
+                    "sn": "sspbc-test"
+                }
+            }
+        }
+    ],
+    "expectedBidResponses": [
+        {
+            "currency": "USD",
+            "bids": [
+                {
+                    "bid": {
+                        "id": "response-005",
+                        "impid": "slot",
+                        "price": 20,
+                        "adm": "<html><head><title><\/title><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><style> body { background-color: transparent; margin: 0; padding: 0; }<\/style><script> window.rekid = \"237503\"; window.slot = \"005\"; window.adlabel = 'Reklama'; window.pubid = '431'; window.wp_sn = 'sspbc_go'; window.page = 'https:\\\/\\\/test.page\\\/'; window.ref = 'https:\\\/\\\/test.referer\\\/'; window.mcad = JSON.parse(atob('eyJpZCI6InRlc3QtcmVxdWVzdCIsInNlYXQiOiJzc3BiYy10ZXN0Iiwic2VhdGJpZCI6W3siYmlkIjpbeyJpZCI6InJlc3BvbnNlLTAwNSIsImltcGlkIjoic2xvdCIsInByaWNlIjoyMCwiYWRtIjoie1wiYnVuY2hcIjpcIjIzNzUwM1wiLFwiY2FwcGluZ1wiOlwiXCIsXCJzZXJ2ZXJcIjpcInNcIixcImNhbXBhaWduXCI6XCJjXCIsXCJzY29yZVwiOlwiMVwiLFwiY3JlYXRpb25zXCI6W3tcInR5cGVcIjpcImltYWdlXCIsXCJzcmNcIjpcImh0dHBzOi8vYmRyLndwY2RuLnBsL3Rlc3RzL3Rlc3QtMzAweDI1MC5wbmdcIixcInRyYWNrZXJzXCI6e30sXCJ3aWR0aFwiOjMwMCxcImhlaWdodFwiOjI1MH1dLFwiY29kZVwiOlwiMVwiLFwiYWFiVmVuZG9yc1wiOmZhbHNlLFwic2xvdFwiOlwiMDA1XCIsXCJyZWRpclwiOlwiaHR0cHM6Ly93d3cud3AucGxcIixcIndwY2xpZFwiOlwiMVwifSIsImFkb21haW4iOlsic3NwYmMtdGVzdCJdLCJjcmlkIjoiMTIzNCIsInciOjMwMCwiaCI6MjUwLCJleHQiOnsiYWRsYWJlbCI6IlJla2xhbWEiLCJwdWJpZCI6IjQzMSIsInNpdGVpZCI6IjIzNzUwMyIsInNsb3RpZCI6IjAwNSIsInRhZ2lkIjoic2xvdCJ9fV19XX0='));<\/script><\/head><body><div id=\"c\"><\/div><script async crossorigin nomodule src=\"\/\/std.wpcdn.pl\/wpjslib\/wpjslib-inline.js\" id=\"wpjslib\"><\/script><script async crossorigin type=\"module\" src=\"\/\/std.wpcdn.pl\/wpjslib6\/wpjslib-inline.js\" id=\"wpjslib6\"><\/script><\/body><\/html>",
+                        "adomain": [
+                            "sspbc-test"
+                        ],
+                        "crid": "1234",
+                        "w": 300,
+                        "h": 250,
+                        "ext": {
+                            "adlabel": "Reklama",
+                            "pubid": "431",
+                            "siteid": "237503",
+                            "slotid": "005",
+                            "tagid": "slot"
+                        }
+                    },
+                    "type": "banner"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/sspBC/sspbctest/supplemental/request_with_standard_and_onecode_imp.json b/adapters/sspBC/sspbctest/supplemental/request_with_standard_and_onecode_imp.json
new file mode 100644
index 00000000..e967aa09
--- /dev/null
+++ b/adapters/sspBC/sspbctest/supplemental/request_with_standard_and_onecode_imp.json
@@ -0,0 +1,229 @@
+{
+    "mockBidRequest": {
+        "id": "test-request",
+        "imp": [
+            {
+                "id": "slot-standard",
+                "ext": {
+                    "bidder": {
+                        "siteId": "237503",
+                        "id": "005"
+                    }
+                },
+                "secure": 1,
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 250
+                        }
+                    ]
+                }
+            },
+            {
+                "id": "slot-onecode",
+                "ext": {},
+                "secure": 1,
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 600
+                        }
+                    ]
+                }
+            }
+        ],
+        "site": {
+            "domain": "test.page",
+            "page": "https://test.page/",
+            "ref": "https://test.referer/"
+        },
+        "regs": {
+            "ext": {
+                "gdpr": 1
+            }
+        },
+        "user": {
+            "ext": {
+                "consent": "test_consent"
+            },
+            "buyeruid": "test_user"
+        }
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://ssp.wp.test/bidder/?bdver=5.6&inver=4",
+                "body": {
+                    "id": "test-request",
+                    "imp": [
+                        {
+                            "id": "slot-standard",
+                            "banner": {
+                                "format": [
+                                    {
+                                        "w": 300,
+                                        "h": 250
+                                    }
+                                ]
+                            },
+                            "tagid": "slot-standard",
+                            "secure": 1,
+                            "ext": {
+                                "data": {
+                                    "pbslot": "slot-standard",
+                                    "pbsize": "300x250"
+                                }
+                            }
+                        },
+                        {
+                            "id": "slot-onecode",
+                            "banner": {
+                                "format": [
+                                    {
+                                        "w": 300,
+                                        "h": 600
+                                    }
+                                ]
+                            },
+                            "tagid": "slot-onecode",
+                            "secure": 1,
+                            "ext": {
+                                "data": {
+                                    "pbslot": "slot-onecode",
+                                    "pbsize": "300x600"
+                                }
+                            }
+                        }
+                    ],
+                    "site": {
+                        "domain": "test.page",
+                        "page": "https://test.page/",
+                        "ref": "https://test.referer/"
+                    },
+                    "user": {
+                        "ext": {
+                            "consent": "test_consent"
+                        },
+                        "buyeruid": "test_user"
+                    },
+                    "regs": {
+                        "ext": {
+                            "gdpr": 1
+                        }
+                    }
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": {
+                    "cur": "USD",
+                    "id": "test-request",
+                    "seatbid": [
+                        {
+                            "bid": [
+                                {
+                                    "adm": "<!--preformatted-->test_ad_1",
+                                    "adomain": [
+                                        "sspbc-test"
+                                    ],
+                                    "crid": "1234",
+                                    "ext": {
+                                        "adlabel": "Reklama",
+                                        "pubid": "431",
+                                        "siteid": "237503",
+                                        "slotid": "005",
+                                        "tagid": "slot-standard"
+                                    },
+                                    "w": 300,
+                                    "h": 250,
+                                    "id": "response-005",
+                                    "impid": "slot-standard",
+                                    "price": 20
+                                }
+                            ],
+                            "seat": "sspbc-test"
+                        },
+                        {
+                            "bid": [
+                                {
+                                    "adm": "<!--preformatted-->test_ad_2",
+                                    "adomain": [
+                                        "sspbc-test"
+                                    ],
+                                    "crid": "5678",
+                                    "ext": {
+                                        "adlabel": "Reklama",
+                                        "pubid": "431",
+                                        "siteid": "237503",
+                                        "slotid": "037",
+                                        "tagid": "slot-onecode"
+                                    },
+                                    "w": 300,
+                                    "h": 600,
+                                    "id": "response-037",
+                                    "impid": "slot-onecode",
+                                    "price": 10
+                                }
+                            ],
+                            "seat": "sspbc-test"
+                        }
+                    ],
+                    "sn": "sspbc-test"
+                }
+            }
+        }
+    ],
+    "expectedBidResponses": [
+        {
+            "currency": "USD",
+            "bids": [
+                {
+                    "bid": {
+                        "id": "response-005",
+                        "impid": "slot-standard",
+                        "price": 20,
+                        "adm": "<!--preformatted-->test_ad_1",
+                        "adomain": [
+                            "sspbc-test"
+                        ],
+                        "crid": "1234",
+                        "w": 300,
+                        "h": 250,
+                        "ext": {
+                            "adlabel": "Reklama",
+                            "pubid": "431",
+                            "siteid": "237503",
+                            "slotid": "005",
+                            "tagid": "slot-standard"
+                        }
+                    },
+                    "type": "banner"
+                },
+                {
+                    "bid": {
+                        "id": "response-037",
+                        "impid": "slot-onecode",
+                        "price": 10,
+                        "adm": "<!--preformatted-->test_ad_2",
+                        "adomain": [
+                            "sspbc-test"
+                        ],
+                        "crid": "5678",
+                        "w": 300,
+                        "h": 600,
+                        "ext": {
+                            "adlabel": "Reklama",
+                            "pubid": "431",
+                            "siteid": "237503",
+                            "slotid": "037",
+                            "tagid": "slot-onecode"
+                        }
+                    },
+                    "type": "banner"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/sspBC/sspbctest/supplemental/request_with_test.json b/adapters/sspBC/sspbctest/supplemental/request_with_test.json
new file mode 100644
index 00000000..5d9b2f16
--- /dev/null
+++ b/adapters/sspBC/sspbctest/supplemental/request_with_test.json
@@ -0,0 +1,155 @@
+{
+    "mockBidRequest": {
+        "id": "test-request",
+        "imp": [
+            {
+                "id": "slot",
+                "ext": {
+                    "bidder": {
+                        "siteId": "237503",
+                        "id": "005",
+                        "test": 1
+                    }
+                },
+                "secure": 1,
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 250
+                        }
+                    ]
+                }
+            }
+        ],
+        "site": {
+            "id": "237503",
+            "domain": "test.page",
+            "page": "https://test.page/",
+            "ref": "https://test.referer/"
+        },
+        "regs": {
+            "ext": {
+                "gdpr": 1
+            }
+        },
+        "user": {
+            "ext": {
+                "consent": "test_consent"
+            },
+            "buyeruid": "test_user"
+        }
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://ssp.wp.test/bidder/?bdver=5.6&inver=4",
+                "body": {
+                    "id": "test-request",
+                    "imp": [
+                        {
+                            "id": "005",
+                            "banner": {
+                                "format": [
+                                    {
+                                        "w": 300,
+                                        "h": 250
+                                    }
+                                ]
+                            },
+                            "tagid": "slot",
+                            "secure": 1,
+                            "ext": {
+                                "data": {
+                                    "pbslot": "slot",
+                                    "pbsize": "300x250"
+                                }
+                            }
+                        }
+                    ],
+                    "site": {
+                        "id": "237503",
+                        "domain": "test.page",
+                        "page": "https://test.page/",
+                        "ref": "https://test.referer/"
+                    },
+                    "user": {
+                        "ext": {
+                            "consent": "test_consent"
+                        },
+                        "buyeruid": "test_user"
+                    },
+                    "test": 1,
+                    "regs": {
+                        "ext": {
+                            "gdpr": 1
+                        }
+                    }
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": {
+                    "cur": "USD",
+                    "id": "test-request",
+                    "seatbid": [
+                        {
+                            "bid": [
+                                {
+                                    "adm": "{\"bunch\":\"237503\",\"capping\":\"\",\"server\":\"s\",\"campaign\":\"c\",\"score\":\"1\",\"creations\":[{\"type\":\"image\",\"src\":\"https:\/\/bdr.wpcdn.pl\/tests\/test-300x250.png\",\"trackers\":{},\"width\":300,\"height\":250}],\"code\":\"1\",\"aabVendors\":false,\"slot\":\"005\",\"redir\":\"https:\/\/www.wp.pl\",\"wpclid\":\"1\"}",
+                                    "adomain": [
+                                        "sspbc-test"
+                                    ],
+                                    "crid": "1234",
+                                    "ext": {
+                                        "adlabel": "Reklama",
+                                        "pubid": "431",
+                                        "siteid": "237503",
+                                        "slotid": "005",
+                                        "tagid": "slot"
+                                    },
+                                    "w": 300,
+                                    "h": 250,
+                                    "id": "response-005",
+                                    "impid": "005",
+                                    "price": 20
+                                }
+                            ],
+                            "seat": "sspbc-test"
+                        }
+                    ],
+                    "sn": "sspbc-test"
+                }
+            }
+        }
+    ],
+    "expectedBidResponses": [
+        {
+            "currency": "USD",
+            "bids": [
+                {
+                    "bid": {
+                        "id": "response-005",
+                        "impid": "slot",
+                        "price": 20,
+                        "adm": "<html><head><title><\/title><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><style> body { background-color: transparent; margin: 0; padding: 0; }<\/style><script> window.rekid = \"237503\"; window.slot = \"005\"; window.adlabel = 'Reklama'; window.pubid = '431'; window.wp_sn = 'sspbc_go'; window.page = 'https:\\\/\\\/test.page\\\/'; window.ref = 'https:\\\/\\\/test.referer\\\/'; window.mcad = JSON.parse(atob('eyJpZCI6InRlc3QtcmVxdWVzdCIsInNlYXQiOiJzc3BiYy10ZXN0Iiwic2VhdGJpZCI6W3siYmlkIjpbeyJpZCI6InJlc3BvbnNlLTAwNSIsImltcGlkIjoic2xvdCIsInByaWNlIjoyMCwiYWRtIjoie1wiYnVuY2hcIjpcIjIzNzUwM1wiLFwiY2FwcGluZ1wiOlwiXCIsXCJzZXJ2ZXJcIjpcInNcIixcImNhbXBhaWduXCI6XCJjXCIsXCJzY29yZVwiOlwiMVwiLFwiY3JlYXRpb25zXCI6W3tcInR5cGVcIjpcImltYWdlXCIsXCJzcmNcIjpcImh0dHBzOi8vYmRyLndwY2RuLnBsL3Rlc3RzL3Rlc3QtMzAweDI1MC5wbmdcIixcInRyYWNrZXJzXCI6e30sXCJ3aWR0aFwiOjMwMCxcImhlaWdodFwiOjI1MH1dLFwiY29kZVwiOlwiMVwiLFwiYWFiVmVuZG9yc1wiOmZhbHNlLFwic2xvdFwiOlwiMDA1XCIsXCJyZWRpclwiOlwiaHR0cHM6Ly93d3cud3AucGxcIixcIndwY2xpZFwiOlwiMVwifSIsImFkb21haW4iOlsic3NwYmMtdGVzdCJdLCJjcmlkIjoiMTIzNCIsInciOjMwMCwiaCI6MjUwLCJleHQiOnsiYWRsYWJlbCI6IlJla2xhbWEiLCJwdWJpZCI6IjQzMSIsInNpdGVpZCI6IjIzNzUwMyIsInNsb3RpZCI6IjAwNSIsInRhZ2lkIjoic2xvdCJ9fV19XX0='));<\/script><\/head><body><div id=\"c\"><\/div><script async crossorigin nomodule src=\"\/\/std.wpcdn.pl\/wpjslib\/wpjslib-inline.js\" id=\"wpjslib\"><\/script><script async crossorigin type=\"module\" src=\"\/\/std.wpcdn.pl\/wpjslib6\/wpjslib-inline.js\" id=\"wpjslib6\"><\/script><\/body><\/html>",
+                        "adomain": [
+                            "sspbc-test"
+                        ],
+                        "crid": "1234",
+                        "w": 300,
+                        "h": 250,
+                        "ext": {
+                            "adlabel": "Reklama",
+                            "pubid": "431",
+                            "siteid": "237503",
+                            "slotid": "005",
+                            "tagid": "slot"
+                        }
+                    },
+                    "type": "banner"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/sspBC/sspbctest/supplemental/request_without_banner_format.json b/adapters/sspBC/sspbctest/supplemental/request_without_banner_format.json
new file mode 100644
index 00000000..e3301ab1
--- /dev/null
+++ b/adapters/sspBC/sspbctest/supplemental/request_without_banner_format.json
@@ -0,0 +1,141 @@
+{
+    "mockBidRequest": {
+        "id": "test-request",
+        "imp": [
+            {
+                "id": "slot",
+                "ext": {
+                    "bidder": {
+                        "siteId": "237503",
+                        "id": "005"
+                    }
+                },
+                "secure": 1,
+                "banner": {
+                    "format": []
+                }
+            }
+        ],
+        "site": {
+            "id": "237503",
+            "domain": "test.page",
+            "page": "https://test.page/",
+            "ref": "https://test.referer/"
+        },
+        "regs": {
+            "ext": {
+                "gdpr": 1
+            }
+        },
+        "user": {
+            "ext": {
+                "consent": "test_consent"
+            },
+            "buyeruid": "test_user"
+        }
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://ssp.wp.test/bidder/?bdver=5.6&inver=4",
+                "body": {
+                    "id": "test-request",
+                    "imp": [
+                        {
+                            "id": "005",
+                            "banner": {},
+                            "tagid": "slot",
+                            "secure": 1,
+                            "ext": {
+                                "data": {
+                                    "pbslot": "slot",
+                                    "pbsize": "1x1"
+                                }
+                            }
+                        }
+                    ],
+                    "site": {
+                        "id": "237503",
+                        "domain": "test.page",
+                        "page": "https://test.page/",
+                        "ref": "https://test.referer/"
+                    },
+                    "user": {
+                        "ext": {
+                            "consent": "test_consent"
+                        },
+                        "buyeruid": "test_user"
+                    },
+                    "regs": {
+                        "ext": {
+                            "gdpr": 1
+                        }
+                    }
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": {
+                    "cur": "USD",
+                    "id": "test-request",
+                    "seatbid": [
+                        {
+                            "bid": [
+                                {
+                                    "adm": "{\"bunch\":\"237503\",\"capping\":\"\",\"server\":\"s\",\"campaign\":\"c\",\"score\":\"1\",\"creations\":[{\"type\":\"image\",\"src\":\"https:\/\/bdr.wpcdn.pl\/tests\/test-300x250.png\",\"trackers\":{},\"width\":300,\"height\":250}],\"code\":\"1\",\"aabVendors\":false,\"slot\":\"005\",\"redir\":\"https:\/\/www.wp.pl\",\"wpclid\":\"1\"}",
+                                    "adomain": [
+                                        "sspbc-test"
+                                    ],
+                                    "crid": "1234",
+                                    "ext": {
+                                        "adlabel": "Reklama",
+                                        "pubid": "431",
+                                        "siteid": "237503",
+                                        "slotid": "005",
+                                        "tagid": "slot"
+                                    },
+                                    "w": 300,
+                                    "h": 250,
+                                    "id": "response-005",
+                                    "impid": "005",
+                                    "price": 20
+                                }
+                            ],
+                            "seat": "sspbc-test"
+                        }
+                    ],
+                    "sn": "sspbc-test"
+                }
+            }
+        }
+    ],
+    "expectedBidResponses": [
+        {
+            "currency": "USD",
+            "bids": [
+                {
+                    "bid": {
+                        "id": "response-005",
+                        "impid": "slot",
+                        "price": 20,
+                        "adm": "<html><head><title><\/title><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><style> body { background-color: transparent; margin: 0; padding: 0; }<\/style><script> window.rekid = \"237503\"; window.slot = \"005\"; window.adlabel = 'Reklama'; window.pubid = '431'; window.wp_sn = 'sspbc_go'; window.page = 'https:\\\/\\\/test.page\\\/'; window.ref = 'https:\\\/\\\/test.referer\\\/'; window.mcad = JSON.parse(atob('eyJpZCI6InRlc3QtcmVxdWVzdCIsInNlYXQiOiJzc3BiYy10ZXN0Iiwic2VhdGJpZCI6W3siYmlkIjpbeyJpZCI6InJlc3BvbnNlLTAwNSIsImltcGlkIjoic2xvdCIsInByaWNlIjoyMCwiYWRtIjoie1wiYnVuY2hcIjpcIjIzNzUwM1wiLFwiY2FwcGluZ1wiOlwiXCIsXCJzZXJ2ZXJcIjpcInNcIixcImNhbXBhaWduXCI6XCJjXCIsXCJzY29yZVwiOlwiMVwiLFwiY3JlYXRpb25zXCI6W3tcInR5cGVcIjpcImltYWdlXCIsXCJzcmNcIjpcImh0dHBzOi8vYmRyLndwY2RuLnBsL3Rlc3RzL3Rlc3QtMzAweDI1MC5wbmdcIixcInRyYWNrZXJzXCI6e30sXCJ3aWR0aFwiOjMwMCxcImhlaWdodFwiOjI1MH1dLFwiY29kZVwiOlwiMVwiLFwiYWFiVmVuZG9yc1wiOmZhbHNlLFwic2xvdFwiOlwiMDA1XCIsXCJyZWRpclwiOlwiaHR0cHM6Ly93d3cud3AucGxcIixcIndwY2xpZFwiOlwiMVwifSIsImFkb21haW4iOlsic3NwYmMtdGVzdCJdLCJjcmlkIjoiMTIzNCIsInciOjMwMCwiaCI6MjUwLCJleHQiOnsiYWRsYWJlbCI6IlJla2xhbWEiLCJwdWJpZCI6IjQzMSIsInNpdGVpZCI6IjIzNzUwMyIsInNsb3RpZCI6IjAwNSIsInRhZ2lkIjoic2xvdCJ9fV19XX0='));<\/script><\/head><body><div id=\"c\"><\/div><script async crossorigin nomodule src=\"\/\/std.wpcdn.pl\/wpjslib\/wpjslib-inline.js\" id=\"wpjslib\"><\/script><script async crossorigin type=\"module\" src=\"\/\/std.wpcdn.pl\/wpjslib6\/wpjslib-inline.js\" id=\"wpjslib6\"><\/script><\/body><\/html>",
+                        "adomain": [
+                            "sspbc-test"
+                        ],
+                        "crid": "1234",
+                        "w": 300,
+                        "h": 250,
+                        "ext": {
+                            "adlabel": "Reklama",
+                            "pubid": "431",
+                            "siteid": "237503",
+                            "slotid": "005",
+                            "tagid": "slot"
+                        }
+                    },
+                    "type": "banner"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/sspBC/sspbctest/supplemental/request_without_ext_id.json b/adapters/sspBC/sspbctest/supplemental/request_without_ext_id.json
new file mode 100644
index 00000000..694b03b7
--- /dev/null
+++ b/adapters/sspBC/sspbctest/supplemental/request_without_ext_id.json
@@ -0,0 +1,150 @@
+{
+    "mockBidRequest": {
+        "id": "test-request",
+        "imp": [
+            {
+                "id": "slot",
+                "ext": {
+                    "bidder": {
+                        "siteId": "237503"
+                    }
+                },
+                "secure": 1,
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 250
+                        }
+                    ]
+                }
+            }
+        ],
+        "site": {
+            "domain": "test.page",
+            "page": "https://test.page/",
+            "ref": "https://test.referer/"
+        },
+        "regs": {
+            "ext": {
+                "gdpr": 1
+            }
+        },
+        "user": {
+            "ext": {
+                "consent": "test_consent"
+            },
+            "buyeruid": "test_user"
+        }
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://ssp.wp.test/bidder/?bdver=5.6&inver=4",
+                "body": {
+                    "id": "test-request",
+                    "imp": [
+                        {
+                            "id": "slot",
+                            "banner": {
+                                "format": [
+                                    {
+                                        "w": 300,
+                                        "h": 250
+                                    }
+                                ]
+                            },
+                            "tagid": "slot",
+                            "secure": 1,
+                            "ext": {
+                                "data": {
+                                    "pbslot": "slot",
+                                    "pbsize": "300x250"
+                                }
+                            }
+                        }
+                    ],
+                    "site": {
+                        "domain": "test.page",
+                        "page": "https://test.page/",
+                        "ref": "https://test.referer/"
+                    },
+                    "user": {
+                        "ext": {
+                            "consent": "test_consent"
+                        },
+                        "buyeruid": "test_user"
+                    },
+                    "regs": {
+                        "ext": {
+                            "gdpr": 1
+                        }
+                    }
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": {
+                    "cur": "USD",
+                    "id": "test-request",
+                    "seatbid": [
+                        {
+                            "bid": [
+                                {
+                                    "adm": "{\"bunch\":\"237503\",\"capping\":\"\",\"server\":\"s\",\"campaign\":\"c\",\"score\":\"1\",\"creations\":[{\"type\":\"image\",\"src\":\"https:\/\/bdr.wpcdn.pl\/tests\/test-300x250.png\",\"trackers\":{},\"width\":300,\"height\":250}],\"code\":\"1\",\"aabVendors\":false,\"slot\":\"005\",\"redir\":\"https:\/\/www.wp.pl\",\"wpclid\":\"1\"}",
+                                    "adomain": [
+                                        "sspbc-test"
+                                    ],
+                                    "crid": "1234",
+                                    "ext": {
+                                        "adlabel": "Reklama",
+                                        "pubid": "431",
+                                        "siteid": "237503",
+                                        "slotid": "005",
+                                        "tagid": "slot"
+                                    },
+                                    "w": 300,
+                                    "h": 250,
+                                    "id": "response-005",
+                                    "impid": "slot",
+                                    "price": 20
+                                }
+                            ],
+                            "seat": "sspbc-test"
+                        }
+                    ],
+                    "sn": "sspbc-test"
+                }
+            }
+        }
+    ],
+    "expectedBidResponses": [
+        {
+            "currency": "USD",
+            "bids": [
+                {
+                    "bid": {
+                        "id": "response-005",
+                        "impid": "slot",
+                        "price": 20,
+                        "adm": "<html><head><title><\/title><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><style> body { background-color: transparent; margin: 0; padding: 0; }<\/style><script> window.rekid = \"237503\"; window.slot = \"005\"; window.adlabel = 'Reklama'; window.pubid = '431'; window.wp_sn = 'sspbc_go'; window.page = 'https:\\\/\\\/test.page\\\/'; window.ref = 'https:\\\/\\\/test.referer\\\/'; window.mcad = JSON.parse(atob('eyJpZCI6InRlc3QtcmVxdWVzdCIsInNlYXQiOiJzc3BiYy10ZXN0Iiwic2VhdGJpZCI6W3siYmlkIjpbeyJpZCI6InJlc3BvbnNlLTAwNSIsImltcGlkIjoic2xvdCIsInByaWNlIjoyMCwiYWRtIjoie1wiYnVuY2hcIjpcIjIzNzUwM1wiLFwiY2FwcGluZ1wiOlwiXCIsXCJzZXJ2ZXJcIjpcInNcIixcImNhbXBhaWduXCI6XCJjXCIsXCJzY29yZVwiOlwiMVwiLFwiY3JlYXRpb25zXCI6W3tcInR5cGVcIjpcImltYWdlXCIsXCJzcmNcIjpcImh0dHBzOi8vYmRyLndwY2RuLnBsL3Rlc3RzL3Rlc3QtMzAweDI1MC5wbmdcIixcInRyYWNrZXJzXCI6e30sXCJ3aWR0aFwiOjMwMCxcImhlaWdodFwiOjI1MH1dLFwiY29kZVwiOlwiMVwiLFwiYWFiVmVuZG9yc1wiOmZhbHNlLFwic2xvdFwiOlwiMDA1XCIsXCJyZWRpclwiOlwiaHR0cHM6Ly93d3cud3AucGxcIixcIndwY2xpZFwiOlwiMVwifSIsImFkb21haW4iOlsic3NwYmMtdGVzdCJdLCJjcmlkIjoiMTIzNCIsInciOjMwMCwiaCI6MjUwLCJleHQiOnsiYWRsYWJlbCI6IlJla2xhbWEiLCJwdWJpZCI6IjQzMSIsInNpdGVpZCI6IjIzNzUwMyIsInNsb3RpZCI6IjAwNSIsInRhZ2lkIjoic2xvdCJ9fV19XX0='));<\/script><\/head><body><div id=\"c\"><\/div><script async crossorigin nomodule src=\"\/\/std.wpcdn.pl\/wpjslib\/wpjslib-inline.js\" id=\"wpjslib\"><\/script><script async crossorigin type=\"module\" src=\"\/\/std.wpcdn.pl\/wpjslib6\/wpjslib-inline.js\" id=\"wpjslib6\"><\/script><\/body><\/html>",
+                        "adomain": [
+                            "sspbc-test"
+                        ],
+                        "crid": "1234",
+                        "w": 300,
+                        "h": 250,
+                        "ext": {
+                            "adlabel": "Reklama",
+                            "pubid": "431",
+                            "siteid": "237503",
+                            "slotid": "005",
+                            "tagid": "slot"
+                        }
+                    },
+                    "type": "banner"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/sspBC/sspbctest/supplemental/request_without_ext_site_id.json b/adapters/sspBC/sspbctest/supplemental/request_without_ext_site_id.json
new file mode 100644
index 00000000..0725b4ad
--- /dev/null
+++ b/adapters/sspBC/sspbctest/supplemental/request_without_ext_site_id.json
@@ -0,0 +1,151 @@
+{
+    "mockBidRequest": {
+        "id": "test-request",
+        "imp": [
+            {
+                "id": "slot",
+                "ext": {
+                    "bidder": {
+                        "siteId": "",
+                        "id": "005"
+                    }
+                },
+                "secure": 1,
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 250
+                        }
+                    ]
+                }
+            }
+        ],
+        "site": {
+            "domain": "test.page",
+            "page": "https://test.page/",
+            "ref": "https://test.referer/"
+        },
+        "regs": {
+            "ext": {
+                "gdpr": 1
+            }
+        },
+        "user": {
+            "ext": {
+                "consent": "test_consent"
+            },
+            "buyeruid": "test_user"
+        }
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://ssp.wp.test/bidder/?bdver=5.6&inver=4",
+                "body": {
+                    "id": "test-request",
+                    "imp": [
+                        {
+                            "id": "slot",
+                            "banner": {
+                                "format": [
+                                    {
+                                        "w": 300,
+                                        "h": 250
+                                    }
+                                ]
+                            },
+                            "tagid": "slot",
+                            "secure": 1,
+                            "ext": {
+                                "data": {
+                                    "pbslot": "slot",
+                                    "pbsize": "300x250"
+                                }
+                            }
+                        }
+                    ],
+                    "site": {
+                        "domain": "test.page",
+                        "page": "https://test.page/",
+                        "ref": "https://test.referer/"
+                    },
+                    "user": {
+                        "ext": {
+                            "consent": "test_consent"
+                        },
+                        "buyeruid": "test_user"
+                    },
+                    "regs": {
+                        "ext": {
+                            "gdpr": 1
+                        }
+                    }
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": {
+                    "cur": "USD",
+                    "id": "test-request",
+                    "seatbid": [
+                        {
+                            "bid": [
+                                {
+                                    "adm": "{\"bunch\":\"237503\",\"capping\":\"\",\"server\":\"s\",\"campaign\":\"c\",\"score\":\"1\",\"creations\":[{\"type\":\"image\",\"src\":\"https:\/\/bdr.wpcdn.pl\/tests\/test-300x250.png\",\"trackers\":{},\"width\":300,\"height\":250}],\"code\":\"1\",\"aabVendors\":false,\"slot\":\"005\",\"redir\":\"https:\/\/www.wp.pl\",\"wpclid\":\"1\"}",
+                                    "adomain": [
+                                        "sspbc-test"
+                                    ],
+                                    "crid": "1234",
+                                    "ext": {
+                                        "adlabel": "Reklama",
+                                        "pubid": "431",
+                                        "siteid": "237503",
+                                        "slotid": "005",
+                                        "tagid": "slot"
+                                    },
+                                    "w": 300,
+                                    "h": 250,
+                                    "id": "response-005",
+                                    "impid": "slot",
+                                    "price": 20
+                                }
+                            ],
+                            "seat": "sspbc-test"
+                        }
+                    ],
+                    "sn": "sspbc-test"
+                }
+            }
+        }
+    ],
+    "expectedBidResponses": [
+        {
+            "currency": "USD",
+            "bids": [
+                {
+                    "bid": {
+                        "id": "response-005",
+                        "impid": "slot",
+                        "price": 20,
+                        "adm": "<html><head><title><\/title><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><style> body { background-color: transparent; margin: 0; padding: 0; }<\/style><script> window.rekid = \"237503\"; window.slot = \"005\"; window.adlabel = 'Reklama'; window.pubid = '431'; window.wp_sn = 'sspbc_go'; window.page = 'https:\\\/\\\/test.page\\\/'; window.ref = 'https:\\\/\\\/test.referer\\\/'; window.mcad = JSON.parse(atob('eyJpZCI6InRlc3QtcmVxdWVzdCIsInNlYXQiOiJzc3BiYy10ZXN0Iiwic2VhdGJpZCI6W3siYmlkIjpbeyJpZCI6InJlc3BvbnNlLTAwNSIsImltcGlkIjoic2xvdCIsInByaWNlIjoyMCwiYWRtIjoie1wiYnVuY2hcIjpcIjIzNzUwM1wiLFwiY2FwcGluZ1wiOlwiXCIsXCJzZXJ2ZXJcIjpcInNcIixcImNhbXBhaWduXCI6XCJjXCIsXCJzY29yZVwiOlwiMVwiLFwiY3JlYXRpb25zXCI6W3tcInR5cGVcIjpcImltYWdlXCIsXCJzcmNcIjpcImh0dHBzOi8vYmRyLndwY2RuLnBsL3Rlc3RzL3Rlc3QtMzAweDI1MC5wbmdcIixcInRyYWNrZXJzXCI6e30sXCJ3aWR0aFwiOjMwMCxcImhlaWdodFwiOjI1MH1dLFwiY29kZVwiOlwiMVwiLFwiYWFiVmVuZG9yc1wiOmZhbHNlLFwic2xvdFwiOlwiMDA1XCIsXCJyZWRpclwiOlwiaHR0cHM6Ly93d3cud3AucGxcIixcIndwY2xpZFwiOlwiMVwifSIsImFkb21haW4iOlsic3NwYmMtdGVzdCJdLCJjcmlkIjoiMTIzNCIsInciOjMwMCwiaCI6MjUwLCJleHQiOnsiYWRsYWJlbCI6IlJla2xhbWEiLCJwdWJpZCI6IjQzMSIsInNpdGVpZCI6IjIzNzUwMyIsInNsb3RpZCI6IjAwNSIsInRhZ2lkIjoic2xvdCJ9fV19XX0='));<\/script><\/head><body><div id=\"c\"><\/div><script async crossorigin nomodule src=\"\/\/std.wpcdn.pl\/wpjslib\/wpjslib-inline.js\" id=\"wpjslib\"><\/script><script async crossorigin type=\"module\" src=\"\/\/std.wpcdn.pl\/wpjslib6\/wpjslib-inline.js\" id=\"wpjslib6\"><\/script><\/body><\/html>",
+                        "adomain": [
+                            "sspbc-test"
+                        ],
+                        "crid": "1234",
+                        "w": 300,
+                        "h": 250,
+                        "ext": {
+                            "adlabel": "Reklama",
+                            "pubid": "431",
+                            "siteid": "237503",
+                            "slotid": "005",
+                            "tagid": "slot"
+                        }
+                    },
+                    "type": "banner"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/sspBC/sspbctest/supplemental/status_204.json b/adapters/sspBC/sspbctest/supplemental/status_204.json
new file mode 100644
index 00000000..f53581b8
--- /dev/null
+++ b/adapters/sspBC/sspbctest/supplemental/status_204.json
@@ -0,0 +1,95 @@
+{
+    "mockBidRequest": {
+        "id": "test-request",
+        "imp": [
+            {
+                "id": "slot",
+                "ext": {
+                    "bidder": {
+                        "siteId": "237503",
+                        "id": "005"
+                    }
+                },
+                "secure": 1,
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 250
+                        }
+                    ]
+                }
+            }
+        ],
+        "site": {
+            "id": "237503",
+            "domain": "test.page",
+            "page": "https://test.page/",
+            "ref": "https://test.referer/"
+        },
+        "regs": {
+            "ext": {
+                "gdpr": 1
+            }
+        },
+        "user": {
+            "ext": {
+                "consent": "test_consent"
+            },
+            "buyeruid": "test_user"
+        }
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://ssp.wp.test/bidder/?bdver=5.6&inver=4",
+                "body": {
+                    "id": "test-request",
+                    "imp": [
+                        {
+                            "id": "005",
+                            "banner": {
+                                "format": [
+                                    {
+                                        "w": 300,
+                                        "h": 250
+                                    }
+                                ]
+                            },
+                            "tagid": "slot",
+                            "secure": 1,
+                            "ext": {
+                                "data": {
+                                    "pbslot": "slot",
+                                    "pbsize": "300x250"
+                                }
+                            }
+                        }
+                    ],
+                    "site": {
+                        "id": "237503",
+                        "domain": "test.page",
+                        "page": "https://test.page/",
+                        "ref": "https://test.referer/"
+                    },
+                    "user": {
+                        "ext": {
+                            "consent": "test_consent"
+                        },
+                        "buyeruid": "test_user"
+                    },
+                    "regs": {
+                        "ext": {
+                            "gdpr": 1
+                        }
+                    }
+                }
+            },
+            "mockResponse": {
+                "status": 204,
+                "body": {}
+            }
+        }
+    ],
+    "expectedBidResponses": []
+}
\ No newline at end of file
diff --git a/adapters/sspBC/sspbctest/supplemental/status_400.json b/adapters/sspBC/sspbctest/supplemental/status_400.json
new file mode 100644
index 00000000..4e058f1c
--- /dev/null
+++ b/adapters/sspBC/sspbctest/supplemental/status_400.json
@@ -0,0 +1,100 @@
+{
+    "mockBidRequest": {
+        "id": "test-request",
+        "imp": [
+            {
+                "id": "slot",
+                "ext": {
+                    "bidder": {
+                        "siteId": "237503",
+                        "id": "005"
+                    }
+                },
+                "secure": 1,
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 250
+                        }
+                    ]
+                }
+            }
+        ],
+        "site": {
+            "id": "237503",
+            "domain": "test.page",
+            "page": "https://test.page/",
+            "ref": "https://test.referer/"
+        },
+        "regs": {
+            "ext": {
+                "gdpr": 1
+            }
+        },
+        "user": {
+            "ext": {
+                "consent": "test_consent"
+            },
+            "buyeruid": "test_user"
+        }
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://ssp.wp.test/bidder/?bdver=5.6&inver=4",
+                "body": {
+                    "id": "test-request",
+                    "imp": [
+                        {
+                            "id": "005",
+                            "banner": {
+                                "format": [
+                                    {
+                                        "w": 300,
+                                        "h": 250
+                                    }
+                                ]
+                            },
+                            "tagid": "slot",
+                            "secure": 1,
+                            "ext": {
+                                "data": {
+                                    "pbslot": "slot",
+                                    "pbsize": "300x250"
+                                }
+                            }
+                        }
+                    ],
+                    "site": {
+                        "id": "237503",
+                        "domain": "test.page",
+                        "page": "https://test.page/",
+                        "ref": "https://test.referer/"
+                    },
+                    "user": {
+                        "ext": {
+                            "consent": "test_consent"
+                        },
+                        "buyeruid": "test_user"
+                    },
+                    "regs": {
+                        "ext": {
+                            "gdpr": 1
+                        }
+                    }
+                }
+            },
+            "mockResponse": {
+                "status": 400,
+                "body": {}
+            }
+        }
+    ],
+    "expectedMakeBidsErrors": [
+        {
+            "value": "Unexpected status code: 400.",
+            "comparison": "literal"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/triplelift/triplelifttest/supplemental/video-format-11.json b/adapters/triplelift/triplelifttest/supplemental/video-format-11.json
new file mode 100644
index 00000000..f7a88ec5
--- /dev/null
+++ b/adapters/triplelift/triplelifttest/supplemental/video-format-11.json
@@ -0,0 +1,118 @@
+{
+    "mockBidRequest": {
+        "id": "test-request-id",
+        "imp": [
+            {
+                "id": "test-imp-id",
+                "video": {
+                    "mimes": ["video/mp4"],
+                    "minduration": 15,
+                    "maxduration": 30,
+                    "protocols": [2, 3, 5, 6, 7, 8],
+                    "w": 940,
+                    "h": 560
+                },
+                "ext": {
+                    "bidder": {
+                        "inventoryCode": "aaw",
+                        "floor": 0.10
+                    }
+                }
+            }
+        ]
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://tlx.3lift.net/s2s/auction?sra=1&supplier_id=20",
+                "body": {
+                    "id": "test-request-id",
+                    "imp": [
+                        {
+                            "tagid": "aaw",
+                            "bidfloor": 0.10,
+                            "id": "test-imp-id",
+                            "video": {
+                                "mimes": [ "video/mp4"],
+                                "minduration": 15,
+                                "maxduration": 30,
+                                "protocols": [2, 3, 5, 6, 7, 8],
+                                "w": 940,
+                                "h": 560
+                            },
+                            "ext": {
+                                "bidder": {
+                                    "inventoryCode": "aaw",
+                                    "floor": 0.10
+                                }
+                            }
+                        }
+                    ]
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": {
+                    "id": "test-request-id",
+                    "seatbid": [
+                        {
+                            "seat": "958",
+                            "bid": [
+                                {
+                                    "id": "7706636740145184841",
+                                    "impid": "test-imp-id",
+                                    "price": 0.500000,
+                                    "adid": "29681110",
+                                    "adm": "some-test-ad",
+                                    "adomain": ["foo.com"],
+                                    "iurl": "http://tlx.3lift.net/s2s/auction?sra=1&supplier_id=20",
+                                    "cid": "958",
+                                    "crid": "29681110",
+                                    "h": 250,
+                                    "w": 300,
+                                    "cat": ["IAB9-1"],
+                                    "ext": {
+                                        "triplelift_pb": {
+                                            "format": 11
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    ],
+                    "bidid": "5778926625248726496",
+                    "cur": "USD"
+                }
+            }
+        }
+    ],
+    "expectedBidResponses": [
+        {
+            "currency": "USD",
+            "bids": [
+                {
+                    "bid": {
+                        "id": "7706636740145184841",
+                        "impid": "test-imp-id",
+                        "price": 0.5,
+                        "adm": "some-test-ad",
+                        "adid": "29681110",
+                        "adomain": ["foo.com"],
+                        "iurl": "http://tlx.3lift.net/s2s/auction?sra=1&supplier_id=20",
+                        "cid": "958",
+                        "crid": "29681110",
+                        "w": 300,
+                        "h": 250,
+                        "cat": ["IAB9-1"],
+                        "ext": {
+                            "triplelift_pb": {
+                                "format": 11
+                            }
+                        }
+                    },
+                    "type": "video"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/triplelift/triplelifttest/supplemental/video-format-12.json b/adapters/triplelift/triplelifttest/supplemental/video-format-12.json
new file mode 100644
index 00000000..7d5987af
--- /dev/null
+++ b/adapters/triplelift/triplelifttest/supplemental/video-format-12.json
@@ -0,0 +1,118 @@
+{
+    "mockBidRequest": {
+        "id": "test-request-id",
+        "imp": [
+            {
+                "id": "test-imp-id",
+                "video": {
+                    "mimes": ["video/mp4"],
+                    "minduration": 15,
+                    "maxduration": 30,
+                    "protocols": [2, 3, 5, 6, 7, 8],
+                    "w": 940,
+                    "h": 560
+                },
+                "ext": {
+                    "bidder": {
+                        "inventoryCode": "aaw",
+                        "floor": 0.10
+                    }
+                }
+            }
+        ]
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://tlx.3lift.net/s2s/auction?sra=1&supplier_id=20",
+                "body": {
+                    "id": "test-request-id",
+                    "imp": [
+                        {
+                            "tagid": "aaw",
+                            "bidfloor": 0.10,
+                            "id": "test-imp-id",
+                            "video": {
+                                "mimes": [ "video/mp4"],
+                                "minduration": 15,
+                                "maxduration": 30,
+                                "protocols": [2, 3, 5, 6, 7, 8],
+                                "w": 940,
+                                "h": 560
+                            },
+                            "ext": {
+                                "bidder": {
+                                    "inventoryCode": "aaw",
+                                    "floor": 0.10
+                                }
+                            }
+                        }
+                    ]
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": {
+                    "id": "test-request-id",
+                    "seatbid": [
+                        {
+                            "seat": "958",
+                            "bid": [
+                                {
+                                    "id": "7706636740145184841",
+                                    "impid": "test-imp-id",
+                                    "price": 0.500000,
+                                    "adid": "29681110",
+                                    "adm": "some-test-ad",
+                                    "adomain": ["foo.com"],
+                                    "iurl": "http://tlx.3lift.net/s2s/auction?sra=1&supplier_id=20",
+                                    "cid": "958",
+                                    "crid": "29681110",
+                                    "h": 250,
+                                    "w": 300,
+                                    "cat": ["IAB9-1"],
+                                    "ext": {
+                                        "triplelift_pb": {
+                                            "format": 12
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    ],
+                    "bidid": "5778926625248726496",
+                    "cur": "USD"
+                }
+            }
+        }
+    ],
+    "expectedBidResponses": [
+        {
+            "currency": "USD",
+            "bids": [
+                {
+                    "bid": {
+                        "id": "7706636740145184841",
+                        "impid": "test-imp-id",
+                        "price": 0.5,
+                        "adm": "some-test-ad",
+                        "adid": "29681110",
+                        "adomain": ["foo.com"],
+                        "iurl": "http://tlx.3lift.net/s2s/auction?sra=1&supplier_id=20",
+                        "cid": "958",
+                        "crid": "29681110",
+                        "w": 300,
+                        "h": 250,
+                        "cat": ["IAB9-1"],
+                        "ext": {
+                            "triplelift_pb": {
+                                "format": 12
+                            }
+                        }
+                    },
+                    "type": "video"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/triplelift/triplelifttest/supplemental/video-format-17.json b/adapters/triplelift/triplelifttest/supplemental/video-format-17.json
new file mode 100644
index 00000000..1fb44507
--- /dev/null
+++ b/adapters/triplelift/triplelifttest/supplemental/video-format-17.json
@@ -0,0 +1,118 @@
+{
+    "mockBidRequest": {
+        "id": "test-request-id",
+        "imp": [
+            {
+                "id": "test-imp-id",
+                "video": {
+                    "mimes": ["video/mp4"],
+                    "minduration": 15,
+                    "maxduration": 30,
+                    "protocols": [2, 3, 5, 6, 7, 8],
+                    "w": 940,
+                    "h": 560
+                },
+                "ext": {
+                    "bidder": {
+                        "inventoryCode": "aaw",
+                        "floor": 0.10
+                    }
+                }
+            }
+        ]
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://tlx.3lift.net/s2s/auction?sra=1&supplier_id=20",
+                "body": {
+                    "id": "test-request-id",
+                    "imp": [
+                        {
+                            "tagid": "aaw",
+                            "bidfloor": 0.10,
+                            "id": "test-imp-id",
+                            "video": {
+                                "mimes": [ "video/mp4"],
+                                "minduration": 15,
+                                "maxduration": 30,
+                                "protocols": [2, 3, 5, 6, 7, 8],
+                                "w": 940,
+                                "h": 560
+                            },
+                            "ext": {
+                                "bidder": {
+                                    "inventoryCode": "aaw",
+                                    "floor": 0.10
+                                }
+                            }
+                        }
+                    ]
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": {
+                    "id": "test-request-id",
+                    "seatbid": [
+                        {
+                            "seat": "958",
+                            "bid": [
+                                {
+                                    "id": "7706636740145184841",
+                                    "impid": "test-imp-id",
+                                    "price": 0.500000,
+                                    "adid": "29681110",
+                                    "adm": "some-test-ad",
+                                    "adomain": ["foo.com"],
+                                    "iurl": "http://tlx.3lift.net/s2s/auction?sra=1&supplier_id=20",
+                                    "cid": "958",
+                                    "crid": "29681110",
+                                    "h": 250,
+                                    "w": 300,
+                                    "cat": ["IAB9-1"],
+                                    "ext": {
+                                        "triplelift_pb": {
+                                            "format": 17
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    ],
+                    "bidid": "5778926625248726496",
+                    "cur": "USD"
+                }
+            }
+        }
+    ],
+    "expectedBidResponses": [
+        {
+            "currency": "USD",
+            "bids": [
+                {
+                    "bid": {
+                        "id": "7706636740145184841",
+                        "impid": "test-imp-id",
+                        "price": 0.5,
+                        "adm": "some-test-ad",
+                        "adid": "29681110",
+                        "adomain": ["foo.com"],
+                        "iurl": "http://tlx.3lift.net/s2s/auction?sra=1&supplier_id=20",
+                        "cid": "958",
+                        "crid": "29681110",
+                        "w": 300,
+                        "h": 250,
+                        "cat": ["IAB9-1"],
+                        "ext": {
+                            "triplelift_pb": {
+                                "format": 17
+                            }
+                        }
+                    },
+                    "type": "video"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/unicorn/params_test.go b/adapters/unicorn/params_test.go
index 4a534208..9313183f 100644
--- a/adapters/unicorn/params_test.go
+++ b/adapters/unicorn/params_test.go
@@ -35,24 +35,45 @@ func TestInvalidParams(t *testing.T) {
 
 var validParams = []string{
 	`{
-      "accountId": 199578,
-      "publisherId": 123456,
+      "accountId": 12345,
+      "publisherId": "123456",
+      "mediaId": "test_media",
+      "placementId": "test_placement"
+   }`,
+	`{
+      "accountId": 12345,
+      "publisherId": "123456-pub",
+      "mediaId": "test_media",
+      "placementId": "test_placement"
+   }`,
+	`{
+      "accountId": 12345,
+      "publisherId": "12341234123412341234",
       "mediaId": "test_media",
       "placementId": "test_placement"
    }`,
 	`{
-      "accountId": 199578,
+      "accountId": 12345,
       "mediaId": "test_media"
+   }`,
+	`{
+      "accountId": 12345
    }`,
 }
 
 var invalidParams = []string{
 	`{}`,
 	`{
-      "accountId": "199578",
+      "accountId": "12345",
       "publisherId": "123456",
       "mediaId": 12345,
       "placementId": 12345
+   }`,
+	`{
+      "accountId": 12345,
+      "publisherId": 12341234123412341234,
+      "mediaId": "test_media",
+      "placementId": "test_placement"
    }`,
 	`{
       "publisherId": 123456,
diff --git a/adapters/unicorn/unicorntest/exemplary/banner-app-no-app-publisher.json b/adapters/unicorn/unicorntest/exemplary/banner-app-no-app-publisher.json
new file mode 100644
index 00000000..1e0342fa
--- /dev/null
+++ b/adapters/unicorn/unicorntest/exemplary/banner-app-no-app-publisher.json
@@ -0,0 +1,230 @@
+{
+  "mockBidRequest": {
+    "at": 1,
+    "imp": [
+      {
+        "banner": {
+          "format": [
+            {
+              "w": 300,
+              "h": 250
+            }
+          ],
+          "api": [5]
+        },
+        "id": "29D2F33E-F865-40DA-9320-16EF77935254",
+        "secure": 1,
+        "ext": {
+          "prebid": {
+            "storedrequest": {
+              "id": "test_unicorn"
+            }
+          },
+          "bidder": {
+            "accountId": 12345,
+            "publisherId": "123456",
+            "mediaId": "test_media",
+            "placementId": "test_placement"
+          }
+        }
+      }
+    ],
+    "cur": ["JPY"],
+    "app": {
+      "ext": {
+        "prebid": {
+          "source": "prebid-mobile",
+          "version": "1.9.0"
+        }
+      },
+      "bundle": "net.ada.test",
+      "ver": "1.9.0"
+    },
+    "id": "CFD24FB1-916F-467D-8825-34892B315DB7",
+    "source": {
+      "tid": "A4B3EA9F-FF57-4716-AC85-6CBF6A46CFBD"
+    },
+    "device": {
+      "make": "Apple",
+      "osv": "14.4",
+      "connectiontype": 1,
+      "os": "iOS",
+      "w": 320,
+      "model": "Simulator",
+      "ifa": "00000000-0000-0000-0000-000000000000",
+      "devtime": 1612413327,
+      "h": 568,
+      "pxratio": 2,
+      "ext": {
+        "atts": 0
+      }
+    },
+    "user": {
+      "gender": "O"
+    },
+    "ext": {
+      "prebid": {
+        "targeting": {},
+        "cache": {
+          "bids": {}
+        },
+        "storedrequest": {
+          "id": "test"
+        }
+      }
+    }
+  },
+
+  "httpCalls": [
+    {
+      "expectedRequest": {
+        "uri": "https://ds.uncn.jp",
+        "body": {
+          "app": {
+            "bundle": "net.ada.test",
+            "ext": {
+              "prebid": {
+                "source": "prebid-mobile",
+                "version": "1.9.0"
+              }
+            },
+            "id": "test_media",
+            "publisher": {
+              "id": "123456"
+            },
+            "ver": "1.9.0"
+          },
+          "at": 1,
+          "cur": ["JPY"],
+          "device": {
+            "connectiontype": 1,
+            "ext": {
+              "atts": 0
+            },
+            "h": 568,
+            "ifa": "00000000-0000-0000-0000-000000000000",
+            "make": "Apple",
+            "model": "Simulator",
+            "os": "iOS",
+            "osv": "14.4",
+            "pxratio": 2,
+            "w": 320
+          },
+          "ext": {
+            "prebid": {
+              "bidder": null,
+              "is_rewarded_inventory": 0,
+              "storedrequest": {
+                "id": "test"
+              }
+            },
+            "accountId": 12345
+          },
+          "id": "CFD24FB1-916F-467D-8825-34892B315DB7",
+          "imp": [
+            {
+              "banner": {
+                "api": [5],
+                "format": [
+                  {
+                    "h": 250,
+                    "w": 300
+                  }
+                ]
+              },
+              "ext": {
+                "bidder": {
+                  "accountId": 12345,
+                  "publisherId": "123456",
+                  "mediaId": "test_media",
+                  "placementId": "test_placement"
+                }
+              },
+              "tagid": "test_placement",
+              "id": "29D2F33E-F865-40DA-9320-16EF77935254",
+              "secure": 1
+            }
+          ],
+          "source": {
+            "ext": {
+              "bidder": "unicorn",
+              "stype": "prebid_server_uncn"
+            },
+            "tid": "A4B3EA9F-FF57-4716-AC85-6CBF6A46CFBD"
+          },
+          "user": {
+            "gender": "O"
+          }
+        }
+      },
+      "mockResponse": {
+        "url": "https://ds.uncn.jp",
+        "status": 200,
+        "headers": {
+          "Content-Type": ["application/json"],
+          "Date": ["Thu, 04 Feb 2021 06:36:31 GMT"],
+          "Vary": ["Accept-Encoding"]
+        },
+        "body": {
+          "bidid": "f1248280-24ec-4fbc-bdf5-6a866e7dcea4",
+          "cur": "JPY",
+          "ext": {},
+          "id": "CFD24FB1-916F-467D-8825-34892B315DB7",
+          "seatbid": [
+            {
+              "bid": [
+                {
+                  "adid": "uoNYbq1L_-123456",
+                  "adm": "awesome domain",
+                  "adomain": ["example.com"],
+                  "attr": [],
+                  "bundle": "example.com",
+                  "cid": "7314",
+                  "crid": "-123456",
+                  "ext": {},
+                  "h": 250,
+                  "id": "1",
+                  "impid": "29D2F33E-F865-40DA-9320-16EF77935254",
+                  "iurl": "https://example.com/banner.png",
+                  "price": 73.283,
+                  "w": 300
+                }
+              ],
+              "group": 0,
+              "seat": "274"
+            }
+          ],
+          "units": 0
+        }
+      }
+    }
+  ],
+  "expectedBidResponses": [
+    {
+      "Currency": "JPY",
+      "bids": [
+        {
+          "Bid": {
+            "id": "1",
+            "impid": "29D2F33E-F865-40DA-9320-16EF77935254",
+            "price": 73.283,
+            "adm": "awesome domain",
+            "adid": "uoNYbq1L_-123456",
+            "adomain": ["example.com"],
+            "bundle": "example.com",
+            "iurl": "https://example.com/banner.png",
+            "cid": "7314",
+            "crid": "-123456",
+            "w": 300,
+            "h": 250,
+            "ext": {}
+          },
+          "type": "banner",
+          "BidType": "banner",
+          "BidVideo": null,
+          "DealPriority": 0
+        }
+      ]
+    }
+  ]
+}
diff --git a/adapters/unicorn/unicorntest/exemplary/banner-app-no-mediaid.json b/adapters/unicorn/unicorntest/exemplary/banner-app-no-mediaid.json
new file mode 100644
index 00000000..15098ffd
--- /dev/null
+++ b/adapters/unicorn/unicorntest/exemplary/banner-app-no-mediaid.json
@@ -0,0 +1,230 @@
+{
+  "mockBidRequest": {
+    "at": 1,
+    "imp": [
+      {
+        "banner": {
+          "format": [
+            {
+              "w": 300,
+              "h": 250
+            }
+          ],
+          "api": [5]
+        },
+        "id": "29D2F33E-F865-40DA-9320-16EF77935254",
+        "secure": 1,
+        "ext": {
+          "prebid": {
+            "storedrequest": {
+              "id": "test_unicorn"
+            }
+          },
+          "bidder": {
+            "accountId": 12345,
+            "publisherId": "123456",
+            "placementId": "test_placement"
+          }
+        }
+      }
+    ],
+    "cur": ["JPY"],
+    "app": {
+      "publisher": {
+        "id": "test"
+      },
+      "ext": {
+        "prebid": {
+          "source": "prebid-mobile",
+          "version": "1.9.0"
+        }
+      },
+      "bundle": "net.ada.test",
+      "ver": "1.9.0"
+    },
+    "id": "CFD24FB1-916F-467D-8825-34892B315DB7",
+    "source": {
+      "tid": "A4B3EA9F-FF57-4716-AC85-6CBF6A46CFBD"
+    },
+    "device": {
+      "make": "Apple",
+      "osv": "14.4",
+      "connectiontype": 1,
+      "os": "iOS",
+      "w": 320,
+      "model": "Simulator",
+      "ifa": "00000000-0000-0000-0000-000000000000",
+      "devtime": 1612413327,
+      "h": 568,
+      "pxratio": 2,
+      "ext": {
+        "atts": 0
+      }
+    },
+    "user": {
+      "gender": "O"
+    },
+    "ext": {
+      "prebid": {
+        "targeting": {},
+        "cache": {
+          "bids": {}
+        },
+        "storedrequest": {
+          "id": "test"
+        }
+      }
+    }
+  },
+
+  "httpCalls": [
+    {
+      "expectedRequest": {
+        "uri": "https://ds.uncn.jp",
+        "body": {
+          "app": {
+            "bundle": "net.ada.test",
+            "ext": {
+              "prebid": {
+                "source": "prebid-mobile",
+                "version": "1.9.0"
+              }
+            },
+            "publisher": {
+              "id": "123456"
+            },
+            "ver": "1.9.0"
+          },
+          "at": 1,
+          "cur": ["JPY"],
+          "device": {
+            "connectiontype": 1,
+            "ext": {
+              "atts": 0
+            },
+            "h": 568,
+            "ifa": "00000000-0000-0000-0000-000000000000",
+            "make": "Apple",
+            "model": "Simulator",
+            "os": "iOS",
+            "osv": "14.4",
+            "pxratio": 2,
+            "w": 320
+          },
+          "ext": {
+            "prebid": {
+              "bidder": null,
+              "is_rewarded_inventory": 0,
+              "storedrequest": {
+                "id": "test"
+              }
+            },
+            "accountId": 12345
+          },
+          "id": "CFD24FB1-916F-467D-8825-34892B315DB7",
+          "imp": [
+            {
+              "banner": {
+                "api": [5],
+                "format": [
+                  {
+                    "h": 250,
+                    "w": 300
+                  }
+                ]
+              },
+              "ext": {
+                "bidder": {
+                  "accountId": 12345,
+                  "publisherId": "123456",
+                  "placementId": "test_placement"
+                }
+              },
+              "tagid": "test_placement",
+              "id": "29D2F33E-F865-40DA-9320-16EF77935254",
+              "secure": 1
+            }
+          ],
+          "source": {
+            "ext": {
+              "bidder": "unicorn",
+              "stype": "prebid_server_uncn"
+            },
+            "tid": "A4B3EA9F-FF57-4716-AC85-6CBF6A46CFBD"
+          },
+          "user": {
+            "gender": "O"
+          }
+        }
+      },
+      "mockResponse": {
+        "url": "https://ds.uncn.jp",
+        "status": 200,
+        "headers": {
+          "Content-Type": ["application/json"],
+          "Date": ["Thu, 04 Feb 2021 06:36:31 GMT"],
+          "Vary": ["Accept-Encoding"]
+        },
+        "body": {
+          "bidid": "f1248280-24ec-4fbc-bdf5-6a866e7dcea4",
+          "cur": "JPY",
+          "ext": {},
+          "id": "CFD24FB1-916F-467D-8825-34892B315DB7",
+          "seatbid": [
+            {
+              "bid": [
+                {
+                  "adid": "uoNYbq1L_-123456",
+                  "adm": "awesome domain",
+                  "adomain": ["example.com"],
+                  "attr": [],
+                  "bundle": "example.com",
+                  "cid": "7314",
+                  "crid": "-123456",
+                  "ext": {},
+                  "h": 250,
+                  "id": "1",
+                  "impid": "29D2F33E-F865-40DA-9320-16EF77935254",
+                  "iurl": "https://example.com/banner.png",
+                  "price": 73.283,
+                  "w": 300
+                }
+              ],
+              "group": 0,
+              "seat": "274"
+            }
+          ],
+          "units": 0
+        }
+      }
+    }
+  ],
+  "expectedBidResponses": [
+    {
+      "Currency": "JPY",
+      "bids": [
+        {
+          "Bid": {
+            "id": "1",
+            "impid": "29D2F33E-F865-40DA-9320-16EF77935254",
+            "price": 73.283,
+            "adm": "awesome domain",
+            "adid": "uoNYbq1L_-123456",
+            "adomain": ["example.com"],
+            "bundle": "example.com",
+            "iurl": "https://example.com/banner.png",
+            "cid": "7314",
+            "crid": "-123456",
+            "w": 300,
+            "h": 250,
+            "ext": {}
+          },
+          "type": "banner",
+          "BidType": "banner",
+          "BidVideo": null,
+          "DealPriority": 0
+        }
+      ]
+    }
+  ]
+}
diff --git a/adapters/unicorn/unicorntest/exemplary/banner-app-no-publisherid.json b/adapters/unicorn/unicorntest/exemplary/banner-app-no-publisherid.json
new file mode 100644
index 00000000..91e25fad
--- /dev/null
+++ b/adapters/unicorn/unicorntest/exemplary/banner-app-no-publisherid.json
@@ -0,0 +1,231 @@
+{
+  "mockBidRequest": {
+    "at": 1,
+    "imp": [
+      {
+        "banner": {
+          "format": [
+            {
+              "w": 300,
+              "h": 250
+            }
+          ],
+          "api": [5]
+        },
+        "id": "29D2F33E-F865-40DA-9320-16EF77935254",
+        "secure": 1,
+        "ext": {
+          "prebid": {
+            "storedrequest": {
+              "id": "test_unicorn"
+            }
+          },
+          "bidder": {
+            "accountId": 12345,
+            "mediaId": "test_media",
+            "placementId": "test_placement"
+          }
+        }
+      }
+    ],
+    "cur": ["JPY"],
+    "app": {
+      "publisher": {
+        "id": "test"
+      },
+      "ext": {
+        "prebid": {
+          "source": "prebid-mobile",
+          "version": "1.9.0"
+        }
+      },
+      "bundle": "net.ada.test",
+      "ver": "1.9.0"
+    },
+    "id": "CFD24FB1-916F-467D-8825-34892B315DB7",
+    "source": {
+      "tid": "A4B3EA9F-FF57-4716-AC85-6CBF6A46CFBD"
+    },
+    "device": {
+      "make": "Apple",
+      "osv": "14.4",
+      "connectiontype": 1,
+      "os": "iOS",
+      "w": 320,
+      "model": "Simulator",
+      "ifa": "00000000-0000-0000-0000-000000000000",
+      "devtime": 1612413327,
+      "h": 568,
+      "pxratio": 2,
+      "ext": {
+        "atts": 0
+      }
+    },
+    "user": {
+      "gender": "O"
+    },
+    "ext": {
+      "prebid": {
+        "targeting": {},
+        "cache": {
+          "bids": {}
+        },
+        "storedrequest": {
+          "id": "test"
+        }
+      }
+    }
+  },
+
+  "httpCalls": [
+    {
+      "expectedRequest": {
+        "uri": "https://ds.uncn.jp",
+        "body": {
+          "app": {
+            "bundle": "net.ada.test",
+            "ext": {
+              "prebid": {
+                "source": "prebid-mobile",
+                "version": "1.9.0"
+              }
+            },
+            "id": "test_media",
+            "publisher": {
+              "id": "test"
+            },
+            "ver": "1.9.0"
+          },
+          "at": 1,
+          "cur": ["JPY"],
+          "device": {
+            "connectiontype": 1,
+            "ext": {
+              "atts": 0
+            },
+            "h": 568,
+            "ifa": "00000000-0000-0000-0000-000000000000",
+            "make": "Apple",
+            "model": "Simulator",
+            "os": "iOS",
+            "osv": "14.4",
+            "pxratio": 2,
+            "w": 320
+          },
+          "ext": {
+            "prebid": {
+              "bidder": null,
+              "is_rewarded_inventory": 0,
+              "storedrequest": {
+                "id": "test"
+              }
+            },
+            "accountId": 12345
+          },
+          "id": "CFD24FB1-916F-467D-8825-34892B315DB7",
+          "imp": [
+            {
+              "banner": {
+                "api": [5],
+                "format": [
+                  {
+                    "h": 250,
+                    "w": 300
+                  }
+                ]
+              },
+              "ext": {
+                "bidder": {
+                  "accountId": 12345,
+                  "mediaId": "test_media",
+                  "placementId": "test_placement"
+                }
+              },
+              "tagid": "test_placement",
+              "id": "29D2F33E-F865-40DA-9320-16EF77935254",
+              "secure": 1
+            }
+          ],
+          "source": {
+            "ext": {
+              "bidder": "unicorn",
+              "stype": "prebid_server_uncn"
+            },
+            "tid": "A4B3EA9F-FF57-4716-AC85-6CBF6A46CFBD"
+          },
+          "user": {
+            "gender": "O"
+          }
+        }
+      },
+      "mockResponse": {
+        "url": "https://ds.uncn.jp",
+        "status": 200,
+        "headers": {
+          "Content-Type": ["application/json"],
+          "Date": ["Thu, 04 Feb 2021 06:36:31 GMT"],
+          "Vary": ["Accept-Encoding"]
+        },
+        "body": {
+          "bidid": "f1248280-24ec-4fbc-bdf5-6a866e7dcea4",
+          "cur": "JPY",
+          "ext": {},
+          "id": "CFD24FB1-916F-467D-8825-34892B315DB7",
+          "seatbid": [
+            {
+              "bid": [
+                {
+                  "adid": "uoNYbq1L_-123456",
+                  "adm": "awesome domain",
+                  "adomain": ["example.com"],
+                  "attr": [],
+                  "bundle": "example.com",
+                  "cid": "7314",
+                  "crid": "-123456",
+                  "ext": {},
+                  "h": 250,
+                  "id": "1",
+                  "impid": "29D2F33E-F865-40DA-9320-16EF77935254",
+                  "iurl": "https://example.com/banner.png",
+                  "price": 73.283,
+                  "w": 300
+                }
+              ],
+              "group": 0,
+              "seat": "274"
+            }
+          ],
+          "units": 0
+        }
+      }
+    }
+  ],
+  "expectedBidResponses": [
+    {
+      "Currency": "JPY",
+      "bids": [
+        {
+          "Bid": {
+            "id": "1",
+            "impid": "29D2F33E-F865-40DA-9320-16EF77935254",
+            "price": 73.283,
+            "adm": "awesome domain",
+            "adid": "uoNYbq1L_-123456",
+            "adomain": ["example.com"],
+            "bundle": "example.com",
+            "iurl": "https://example.com/banner.png",
+            "cid": "7314",
+            "crid": "-123456",
+            "w": 300,
+            "h": 250,
+            "ext": {}
+          },
+          "type": "banner",
+          "BidType": "banner",
+          "BidVideo": null,
+          "DealPriority": 0
+        }
+      ]
+    }
+  ]
+}
diff --git a/adapters/unicorn/unicorntest/exemplary/banner-app-no-source.json b/adapters/unicorn/unicorntest/exemplary/banner-app-no-source.json
index c37c2095..522faed5 100644
--- a/adapters/unicorn/unicorntest/exemplary/banner-app-no-source.json
+++ b/adapters/unicorn/unicorntest/exemplary/banner-app-no-source.json
@@ -21,8 +21,8 @@
             }
           },
           "bidder": {
-            "accountId": 199578,
-            "publisherId": 123456,
+            "accountId": 12345,
+            "publisherId": "123456",
             "mediaId": "test_media",
             "placementId": "test_placement"
           }
@@ -88,8 +88,9 @@
                 "version": "1.9.0"
               }
             },
+            "id": "test_media",
             "publisher": {
-              "id": "test"
+              "id": "123456"
             },
             "ver": "1.9.0"
           },
@@ -117,7 +118,7 @@
                 "id": "test"
               }
             },
-            "accountId": 199578
+            "accountId": 12345
           },
           "id": "CFD24FB1-916F-467D-8825-34892B315DB7",
           "imp": [
@@ -133,8 +134,8 @@
               },
               "ext": {
                 "bidder": {
-                  "accountId": 199578,
-                  "publisherId": 123456,
+                  "accountId": 12345,
+                  "publisherId": "123456",
                   "mediaId": "test_media",
                   "placementId": "test_placement"
                 }
diff --git a/adapters/unicorn/unicorntest/exemplary/banner-app-with-ip.json b/adapters/unicorn/unicorntest/exemplary/banner-app-with-ip.json
index 2d38a990..77b25837 100644
--- a/adapters/unicorn/unicorntest/exemplary/banner-app-with-ip.json
+++ b/adapters/unicorn/unicorntest/exemplary/banner-app-with-ip.json
@@ -21,8 +21,8 @@
             }
           },
           "bidder": {
-            "accountId": 199578,
-            "publisherId": 123456,
+            "accountId": 12345,
+            "publisherId": "123456",
             "mediaId": "test_media",
             "placementId": "test_placement"
           }
@@ -93,8 +93,9 @@
                 "version": "1.9.0"
               }
             },
+            "id": "test_media",
             "publisher": {
-              "id": "test"
+              "id": "123456"
             },
             "ver": "1.9.0"
           },
@@ -124,7 +125,7 @@
                 "id": "test"
               }
             },
-            "accountId": 199578
+            "accountId": 12345
           },
           "id": "CFD24FB1-916F-467D-8825-34892B315DB7",
           "imp": [
@@ -140,8 +141,8 @@
               },
               "ext": {
                 "bidder": {
-                  "accountId": 199578,
-                  "publisherId": 123456,
+                  "accountId": 12345,
+                  "publisherId": "123456",
                   "mediaId": "test_media",
                   "placementId": "test_placement"
                 }
diff --git a/adapters/unicorn/unicorntest/exemplary/banner-app-with-ipv6.json b/adapters/unicorn/unicorntest/exemplary/banner-app-with-ipv6.json
index 595741a0..921e91a4 100644
--- a/adapters/unicorn/unicorntest/exemplary/banner-app-with-ipv6.json
+++ b/adapters/unicorn/unicorntest/exemplary/banner-app-with-ipv6.json
@@ -21,8 +21,8 @@
             }
           },
           "bidder": {
-            "accountId": 199578,
-            "publisherId": 123456,
+            "accountId": 12345,
+            "publisherId": "123456",
             "mediaId": "test_media",
             "placementId": "test_placement"
           }
@@ -93,8 +93,9 @@
                 "version": "1.9.0"
               }
             },
+            "id": "test_media",
             "publisher": {
-              "id": "test"
+              "id": "123456"
             },
             "ver": "1.9.0"
           },
@@ -124,7 +125,7 @@
                 "id": "test"
               }
             },
-            "accountId": 199578
+            "accountId": 12345
           },
           "id": "CFD24FB1-916F-467D-8825-34892B315DB7",
           "imp": [
@@ -140,8 +141,8 @@
               },
               "ext": {
                 "bidder": {
-                  "accountId": 199578,
-                  "publisherId": 123456,
+                  "accountId": 12345,
+                  "publisherId": "123456",
                   "mediaId": "test_media",
                   "placementId": "test_placement"
                 }
diff --git a/adapters/unicorn/unicorntest/exemplary/banner-app-without-ext.json b/adapters/unicorn/unicorntest/exemplary/banner-app-without-ext.json
index 8b5423a5..bc8ec8a6 100644
--- a/adapters/unicorn/unicorntest/exemplary/banner-app-without-ext.json
+++ b/adapters/unicorn/unicorntest/exemplary/banner-app-without-ext.json
@@ -21,8 +21,8 @@
             }
           },
           "bidder": {
-            "accountId": 199578,
-            "publisherId": 123456,
+            "accountId": 12345,
+            "publisherId": "123456",
             "mediaId": "test_media",
             "placementId": "test_placement"
           }
@@ -79,8 +79,9 @@
                 "version": "1.9.0"
               }
             },
+            "id": "test_media",
             "publisher": {
-              "id": "test"
+              "id": "123456"
             },
             "ver": "1.9.0"
           },
@@ -100,7 +101,7 @@
             "w": 320
           },
           "ext": {
-            "accountId": 199578
+            "accountId": 12345
           },
           "id": "CFD24FB1-916F-467D-8825-34892B315DB7",
           "imp": [
@@ -116,8 +117,8 @@
               },
               "ext": {
                 "bidder": {
-                  "accountId": 199578,
-                  "publisherId": 123456,
+                  "accountId": 12345,
+                  "publisherId": "123456",
                   "mediaId": "test_media",
                   "placementId": "test_placement"
                 }
diff --git a/adapters/unicorn/unicorntest/exemplary/banner-app-without-placementid.json b/adapters/unicorn/unicorntest/exemplary/banner-app-without-placementid.json
index c05d3b6f..a4ec0f95 100644
--- a/adapters/unicorn/unicorntest/exemplary/banner-app-without-placementid.json
+++ b/adapters/unicorn/unicorntest/exemplary/banner-app-without-placementid.json
@@ -21,8 +21,8 @@
             }
           },
           "bidder": {
-            "accountId": 199578,
-            "publisherId": 123456,
+            "accountId": 12345,
+            "publisherId": "12341234123412341234",
             "mediaId": "test_media"
           }
         }
@@ -90,8 +90,9 @@
                 "version": "1.9.0"
               }
             },
+            "id": "test_media",
             "publisher": {
-              "id": "test"
+              "id": "12341234123412341234"
             },
             "ver": "1.9.0"
           },
@@ -119,7 +120,7 @@
                 "id": "test"
               }
             },
-            "accountId": 199578
+            "accountId": 12345
           },
           "id": "CFD24FB1-916F-467D-8825-34892B315DB7",
           "imp": [
@@ -135,8 +136,8 @@
               },
               "ext": {
                 "bidder": {
-                  "accountId": 199578,
-                  "publisherId": 123456,
+                  "accountId": 12345,
+                  "publisherId": "12341234123412341234",
                   "mediaId": "test_media",
                   "placementId": "test_unicorn"
                 }
diff --git a/adapters/unicorn/unicorntest/exemplary/banner-app.json b/adapters/unicorn/unicorntest/exemplary/banner-app.json
index b29c1e1d..deb395ea 100644
--- a/adapters/unicorn/unicorntest/exemplary/banner-app.json
+++ b/adapters/unicorn/unicorntest/exemplary/banner-app.json
@@ -21,8 +21,8 @@
             }
           },
           "bidder": {
-            "accountId": 199578,
-            "publisherId": 123456,
+            "accountId": 12345,
+            "publisherId": "123456",
             "mediaId": "test_media",
             "placementId": "test_placement"
           }
@@ -91,8 +91,9 @@
                 "version": "1.9.0"
               }
             },
+            "id": "test_media",
             "publisher": {
-              "id": "test"
+              "id": "123456"
             },
             "ver": "1.9.0"
           },
@@ -120,7 +121,7 @@
                 "id": "test"
               }
             },
-            "accountId": 199578
+            "accountId": 12345
           },
           "id": "CFD24FB1-916F-467D-8825-34892B315DB7",
           "imp": [
@@ -136,8 +137,8 @@
               },
               "ext": {
                 "bidder": {
-                  "accountId": 199578,
-                  "publisherId": 123456,
+                  "accountId": 12345,
+                  "publisherId": "123456",
                   "mediaId": "test_media",
                   "placementId": "test_placement"
                 }
diff --git a/adapters/unicorn/unicorntest/exemplary/banner-app_with_fpd.json b/adapters/unicorn/unicorntest/exemplary/banner-app_with_fpd.json
index 0a6fb420..a4056566 100644
--- a/adapters/unicorn/unicorntest/exemplary/banner-app_with_fpd.json
+++ b/adapters/unicorn/unicorntest/exemplary/banner-app_with_fpd.json
@@ -21,8 +21,8 @@
             }
           },
           "bidder": {
-            "accountId": 199578,
-            "publisherId": 123456,
+            "accountId": 12345,
+            "publisherId": "123456",
             "mediaId": "test_media",
             "placementId": "test_placement"
           },
@@ -97,8 +97,9 @@
                 "version": "1.9.0"
               }
             },
+            "id": "test_media",
             "publisher": {
-              "id": "test"
+              "id": "123456"
             },
             "ver": "1.9.0"
           },
@@ -126,7 +127,7 @@
                 "id": "test"
               }
             },
-            "accountId": 199578
+            "accountId": 12345
           },
           "id": "CFD24FB1-916F-467D-8825-34892B315DB7",
           "imp": [
@@ -142,8 +143,8 @@
               },
               "ext": {
                 "bidder": {
-                  "accountId": 199578,
-                  "publisherId": 123456,
+                  "accountId": 12345,
+                  "publisherId": "123456",
                   "mediaId": "test_media",
                   "placementId": "test_placement"
                 },
diff --git a/adapters/unicorn/unicorntest/exemplary/banner-app_with_no_fpd.json b/adapters/unicorn/unicorntest/exemplary/banner-app_with_no_fpd.json
index 02224638..e118ebed 100644
--- a/adapters/unicorn/unicorntest/exemplary/banner-app_with_no_fpd.json
+++ b/adapters/unicorn/unicorntest/exemplary/banner-app_with_no_fpd.json
@@ -21,8 +21,8 @@
             }
           },
           "bidder": {
-            "accountId": 199578,
-            "publisherId": 123456,
+            "accountId": 12345,
+            "publisherId": "123456",
             "mediaId": "test_media",
             "placementId": "test_placement"
           },
@@ -94,8 +94,9 @@
                 "version": "1.9.0"
               }
             },
+            "id": "test_media",
             "publisher": {
-              "id": "test"
+              "id": "123456"
             },
             "ver": "1.9.0"
           },
@@ -123,7 +124,7 @@
                 "id": "test"
               }
             },
-            "accountId": 199578
+            "accountId": 12345
           },
           "id": "CFD24FB1-916F-467D-8825-34892B315DB7",
           "imp": [
@@ -139,8 +140,8 @@
               },
               "ext": {
                 "bidder": {
-                  "accountId": 199578,
-                  "publisherId": 123456,
+                  "accountId": 12345,
+                  "publisherId": "123456",
                   "mediaId": "test_media",
                   "placementId": "test_placement"
                 },
diff --git a/adapters/unicorn/unicorntest/supplemental/204.json b/adapters/unicorn/unicorntest/supplemental/204.json
index a0586409..fc6f8fc2 100644
--- a/adapters/unicorn/unicorntest/supplemental/204.json
+++ b/adapters/unicorn/unicorntest/supplemental/204.json
@@ -21,8 +21,8 @@
             }
           },
           "bidder": {
-            "accountId": 199578,
-            "publisherId": 123456,
+            "accountId": 12345,
+            "publisherId": "123456",
             "mediaId": "test_media",
             "placementId": "test_placement"
           }
@@ -91,8 +91,9 @@
                 "version": "1.9.0"
               }
             },
+            "id": "test_media",
             "publisher": {
-              "id": "test"
+              "id": "123456"
             },
             "ver": "1.9.0"
           },
@@ -120,7 +121,7 @@
                 "id": "test"
               }
             },
-            "accountId": 199578
+            "accountId": 12345
           },
           "id": "CFD24FB1-916F-467D-8825-34892B315DB7",
           "imp": [
@@ -136,8 +137,8 @@
               },
               "ext": {
                 "bidder": {
-                  "accountId": 199578,
-                  "publisherId": 123456,
+                  "accountId": 12345,
+                  "publisherId": "123456",
                   "mediaId": "test_media",
                   "placementId": "test_placement"
                 }
diff --git a/adapters/unicorn/unicorntest/supplemental/400.json b/adapters/unicorn/unicorntest/supplemental/400.json
index 6578082c..468d25d1 100644
--- a/adapters/unicorn/unicorntest/supplemental/400.json
+++ b/adapters/unicorn/unicorntest/supplemental/400.json
@@ -21,8 +21,8 @@
             }
           },
           "bidder": {
-            "accountId": 199578,
-            "publisherId": 123456,
+            "accountId": 12345,
+            "publisherId": "123456",
             "mediaId": "test_media",
             "placementId": "test_placement"
           }
@@ -91,8 +91,9 @@
                 "version": "1.9.0"
               }
             },
+            "id": "test_media",
             "publisher": {
-              "id": "test"
+              "id": "123456"
             },
             "ver": "1.9.0"
           },
@@ -120,7 +121,7 @@
                 "id": "test"
               }
             },
-            "accountId": 199578
+            "accountId": 12345
           },
           "id": "CFD24FB1-916F-467D-8825-34892B315DB7",
           "imp": [
@@ -136,8 +137,8 @@
               },
               "ext": {
                 "bidder": {
-                  "accountId": 199578,
-                  "publisherId": 123456,
+                  "accountId": 12345,
+                  "publisherId": "123456",
                   "mediaId": "test_media",
                   "placementId": "test_placement"
                 }
diff --git a/adapters/unicorn/unicorntest/supplemental/500.json b/adapters/unicorn/unicorntest/supplemental/500.json
index c0811be4..479f3d97 100644
--- a/adapters/unicorn/unicorntest/supplemental/500.json
+++ b/adapters/unicorn/unicorntest/supplemental/500.json
@@ -21,8 +21,8 @@
             }
           },
           "bidder": {
-            "accountId": 199578,
-            "publisherId": 123456,
+            "accountId": 12345,
+            "publisherId": "123456",
             "mediaId": "test_media",
             "placementId": "test_placement"
           }
@@ -91,8 +91,9 @@
                 "version": "1.9.0"
               }
             },
+            "id": "test_media",
             "publisher": {
-              "id": "test"
+              "id": "123456"
             },
             "ver": "1.9.0"
           },
@@ -120,7 +121,7 @@
                 "id": "test"
               }
             },
-            "accountId": 199578
+            "accountId": 12345
           },
           "id": "CFD24FB1-916F-467D-8825-34892B315DB7",
           "imp": [
@@ -136,8 +137,8 @@
               },
               "ext": {
                 "bidder": {
-                  "accountId": 199578,
-                  "publisherId": 123456,
+                  "accountId": 12345,
+                  "publisherId": "123456",
                   "mediaId": "test_media",
                   "placementId": "test_placement"
                 }
diff --git a/adapters/unicorn/unicorntest/supplemental/cannot-parse-accountid.json b/adapters/unicorn/unicorntest/supplemental/cannot-parse-accountid.json
index 6bf2b251..9ece314b 100644
--- a/adapters/unicorn/unicorntest/supplemental/cannot-parse-accountid.json
+++ b/adapters/unicorn/unicorntest/supplemental/cannot-parse-accountid.json
@@ -22,7 +22,7 @@
           },
           "bidder": {
             "accountId": "hogeohge",
-            "publisherId": 123456,
+            "publisherId": "123456",
             "mediaId": "test_media",
             "placementId": "test_placement"
           }
diff --git a/adapters/unicorn/unicorntest/supplemental/ccpa-is-enabled.json b/adapters/unicorn/unicorntest/supplemental/ccpa-is-enabled.json
index 6bc396c6..a06b82c6 100644
--- a/adapters/unicorn/unicorntest/supplemental/ccpa-is-enabled.json
+++ b/adapters/unicorn/unicorntest/supplemental/ccpa-is-enabled.json
@@ -26,8 +26,8 @@
             }
           },
           "bidder": {
-            "accountId": 199578,
-            "publisherId": 123456,
+            "accountId": 12345,
+            "publisherId": "123456",
             "mediaId": "test_media",
             "placementId": "test_placement"
           }
diff --git a/adapters/unicorn/unicorntest/supplemental/coppa-is-enabled.json b/adapters/unicorn/unicorntest/supplemental/coppa-is-enabled.json
index 1c33ce2e..fec11c14 100644
--- a/adapters/unicorn/unicorntest/supplemental/coppa-is-enabled.json
+++ b/adapters/unicorn/unicorntest/supplemental/coppa-is-enabled.json
@@ -24,8 +24,8 @@
             }
           },
           "bidder": {
-            "accountId": 199578,
-            "publisherId": 123456,
+            "accountId": 12345,
+            "publisherId": "123456",
             "mediaId": "test_media",
             "placementId": "test_placement"
           }
diff --git a/adapters/unicorn/unicorntest/supplemental/gdpr-is-enabled.json b/adapters/unicorn/unicorntest/supplemental/gdpr-is-enabled.json
index 3c9222d8..881a0fa8 100644
--- a/adapters/unicorn/unicorntest/supplemental/gdpr-is-enabled.json
+++ b/adapters/unicorn/unicorntest/supplemental/gdpr-is-enabled.json
@@ -26,8 +26,8 @@
             }
           },
           "bidder": {
-            "accountId": 199578,
-            "publisherId": 123456,
+            "accountId": 12345,
+            "publisherId": "123456",
             "mediaId": "test_media",
             "placementId": "test_placement"
           }
diff --git a/adapters/unicorn/unicorntest/supplemental/no-accountid.json b/adapters/unicorn/unicorntest/supplemental/no-accountid.json
index f7a2203c..3d26f0b7 100644
--- a/adapters/unicorn/unicorntest/supplemental/no-accountid.json
+++ b/adapters/unicorn/unicorntest/supplemental/no-accountid.json
@@ -21,7 +21,7 @@
             }
           },
           "bidder": {
-            "publisherId": 123456,
+            "publisherId": "123456",
             "mediaId": "test_media",
             "placementId": "test_placement"
           }
diff --git a/adapters/unicorn/unicorntest/supplemental/no-app.json b/adapters/unicorn/unicorntest/supplemental/no-app.json
new file mode 100644
index 00000000..a5918649
--- /dev/null
+++ b/adapters/unicorn/unicorntest/supplemental/no-app.json
@@ -0,0 +1,71 @@
+{
+  "mockBidRequest": {
+    "at": 1,
+    "imp": [
+      {
+        "banner": {
+          "format": [
+            {
+              "w": 300,
+              "h": 250
+            }
+          ],
+          "api": [5]
+        },
+        "id": "29D2F33E-F865-40DA-9320-16EF77935254",
+        "secure": 1,
+        "ext": {
+          "prebid": {
+            "storedrequest": {
+              "id": "test_unicorn"
+            }
+          },
+          "bidder": {
+            "accountId": 12345,
+            "publisherId": "123456",
+            "mediaId": "test_media",
+            "placementId": "test_placement"
+          }
+        }
+      }
+    ],
+    "cur": ["JPY"],
+    "id": "CFD24FB1-916F-467D-8825-34892B315DB7",
+    "source": {
+      "tid": "A4B3EA9F-FF57-4716-AC85-6CBF6A46CFBD"
+    },
+    "device": {
+      "make": "Apple",
+      "osv": "14.4",
+      "connectiontype": 1,
+      "os": "iOS",
+      "w": 320,
+      "model": "Simulator",
+      "ifa": "00000000-0000-0000-0000-000000000000",
+      "devtime": 1612413327,
+      "h": 568,
+      "pxratio": 2,
+      "ext": {
+        "atts": 0
+      }
+    },
+    "user": {
+      "gender": "O"
+    },
+    "ext": {
+      "prebid": {
+        "targeting": {},
+        "cache": {
+          "bids": {}
+        },
+        "storedrequest": {
+          "id": "test"
+        }
+      }
+    }
+  },
+  "expectedMakeRequestsErrors" : [{
+    "value": "request app is required",
+    "comparison": "literal"
+  }]
+}
diff --git a/adapters/unicorn/unicorntest/supplemental/no-imp-ext-prebid.json b/adapters/unicorn/unicorntest/supplemental/no-imp-ext-prebid.json
index 2e6ce79a..a75e2bb3 100644
--- a/adapters/unicorn/unicorntest/supplemental/no-imp-ext-prebid.json
+++ b/adapters/unicorn/unicorntest/supplemental/no-imp-ext-prebid.json
@@ -16,8 +16,8 @@
         "secure": 1,
         "ext": {
           "bidder": {
-            "accountId": 199578,
-            "publisherId": 123456,
+            "accountId": 12345,
+            "publisherId": "123456",
             "mediaId": "test_media"
           }
         }
diff --git a/adapters/unicorn/unicorntest/supplemental/no-storedrequest-imp.json b/adapters/unicorn/unicorntest/supplemental/no-storedrequest-imp.json
index d903effd..5372f96f 100644
--- a/adapters/unicorn/unicorntest/supplemental/no-storedrequest-imp.json
+++ b/adapters/unicorn/unicorntest/supplemental/no-storedrequest-imp.json
@@ -18,8 +18,8 @@
           "prebid": {
           },
           "bidder": {
-            "accountId": 199578,
-            "publisherId": 123456,
+            "accountId": 12345,
+            "publisherId": "123456",
             "mediaId": "test_media"
           }
         }
diff --git a/config/accounts_test.go b/config/accounts_test.go
index a7675d3a..edb6bed5 100644
--- a/config/accounts_test.go
+++ b/config/accounts_test.go
@@ -711,8 +711,8 @@ func TestBasicEnforcementVendor(t *testing.T) {
 
 func TestAlternateBidderCodes_IsValidBidderCode(t *testing.T) {
 	type fields struct {
-		Enabled  bool
-		Adapters map[string]AdapterAlternateBidderCodes
+		Enabled bool
+		Bidders map[string]AdapterAlternateBidderCodes
 	}
 	type args struct {
 		bidder          string
@@ -763,7 +763,7 @@ func TestAlternateBidderCodes_IsValidBidderCode(t *testing.T) {
 			},
 			fields: fields{
 				Enabled: true,
-				Adapters: map[string]AdapterAlternateBidderCodes{
+				Bidders: map[string]AdapterAlternateBidderCodes{
 					"appnexus": {},
 				},
 			},
@@ -778,7 +778,7 @@ func TestAlternateBidderCodes_IsValidBidderCode(t *testing.T) {
 			},
 			fields: fields{
 				Enabled: true,
-				Adapters: map[string]AdapterAlternateBidderCodes{
+				Bidders: map[string]AdapterAlternateBidderCodes{
 					"pubmatic": {},
 				},
 			},
@@ -793,7 +793,7 @@ func TestAlternateBidderCodes_IsValidBidderCode(t *testing.T) {
 			},
 			fields: fields{
 				Enabled: true,
-				Adapters: map[string]AdapterAlternateBidderCodes{
+				Bidders: map[string]AdapterAlternateBidderCodes{
 					"pubmatic": {
 						AllowedBidderCodes: []string{"*"},
 					},
@@ -809,7 +809,7 @@ func TestAlternateBidderCodes_IsValidBidderCode(t *testing.T) {
 			},
 			fields: fields{
 				Enabled: true,
-				Adapters: map[string]AdapterAlternateBidderCodes{
+				Bidders: map[string]AdapterAlternateBidderCodes{
 					"pubmatic": {
 						AllowedBidderCodes: []string{"groupm"},
 					},
@@ -825,7 +825,7 @@ func TestAlternateBidderCodes_IsValidBidderCode(t *testing.T) {
 			},
 			fields: fields{
 				Enabled: true,
-				Adapters: map[string]AdapterAlternateBidderCodes{
+				Bidders: map[string]AdapterAlternateBidderCodes{
 					"pubmatic": {
 						AllowedBidderCodes: []string{"xyz"},
 					},
@@ -838,8 +838,8 @@ func TestAlternateBidderCodes_IsValidBidderCode(t *testing.T) {
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 			a := &AlternateBidderCodes{
-				Enabled:  tt.fields.Enabled,
-				Adapters: tt.fields.Adapters,
+				Enabled: tt.fields.Enabled,
+				Bidders: tt.fields.Bidders,
 			}
 			gotIsValid, gotErr := a.IsValidBidderCode(tt.args.bidder, tt.args.alternateBidder)
 			assert.Equal(t, tt.wantIsValid, gotIsValid)
diff --git a/config/config_test.go b/config/config_test.go
index bed1bb7d..fbd9a9cb 100644
--- a/config/config_test.go
+++ b/config/config_test.go
@@ -138,6 +138,7 @@ func TestDefaults(t *testing.T) {
 	cmpInts(t, "metrics.influxdb.collection_rate_seconds", cfg.Metrics.Influxdb.MetricSendInterval, 20)
 	cmpBools(t, "account_adapter_details", cfg.Metrics.Disabled.AccountAdapterDetails, false)
 	cmpBools(t, "account_debug", cfg.Metrics.Disabled.AccountDebug, true)
+	cmpBools(t, "account_stored_responses", cfg.Metrics.Disabled.AccountStoredResponses, true)
 	cmpBools(t, "adapter_connections_metrics", cfg.Metrics.Disabled.AdapterConnectionMetrics, true)
 	cmpBools(t, "adapter_gdpr_request_blocked", cfg.Metrics.Disabled.AdapterGDPRRequestBlocked, false)
 	cmpStrings(t, "certificates_file", cfg.PemCertsFile, "")
@@ -342,6 +343,7 @@ metrics:
   disabled_metrics:
     account_adapter_details: true
     account_debug: false
+    account_stored_responses: false
     adapter_connections_metrics: true
     adapter_gdpr_request_blocked: true
 adapters:
@@ -631,6 +633,7 @@ func TestFullConfig(t *testing.T) {
 	cmpBools(t, "auto_gen_source_tid", cfg.AutoGenSourceTID, false)
 	cmpBools(t, "account_adapter_details", cfg.Metrics.Disabled.AccountAdapterDetails, true)
 	cmpBools(t, "account_debug", cfg.Metrics.Disabled.AccountDebug, false)
+	cmpBools(t, "account_stored_responses", cfg.Metrics.Disabled.AccountStoredResponses, false)
 	cmpBools(t, "adapter_connections_metrics", cfg.Metrics.Disabled.AdapterConnectionMetrics, true)
 	cmpBools(t, "adapter_gdpr_request_blocked", cfg.Metrics.Disabled.AdapterGDPRRequestBlocked, true)
 	cmpStrings(t, "certificates_file", cfg.PemCertsFile, "/etc/ssl/cert.pem")
diff --git a/exchange/bidder_test.go b/exchange/bidder_test.go
index 806d2f55..b11afa78 100644
--- a/exchange/bidder_test.go
+++ b/exchange/bidder_test.go
@@ -2079,7 +2079,7 @@ func TestExtraBid(t *testing.T) {
 	seatBids, errs := bidder.requestBid(context.Background(), bidderReq, map[string]float64{}, currencyConverter.Rates(), &adapters.ExtraRequestInfo{}, false, false,
 		config.AlternateBidderCodes{
 			Enabled: true,
-			Adapters: map[string]config.AdapterAlternateBidderCodes{
+			Bidders: map[string]config.AdapterAlternateBidderCodes{
 				string(openrtb_ext.BidderPubmatic): {
 					AllowedBidderCodes: []string{"groupm"},
 				},
@@ -2182,7 +2182,7 @@ func TestExtraBidWithAlternateBidderCodeDisabled(t *testing.T) {
 	seatBids, errs := bidder.requestBid(context.Background(), bidderReq, map[string]float64{}, currencyConverter.Rates(), &adapters.ExtraRequestInfo{}, false, false,
 		config.AlternateBidderCodes{
 			Enabled: true,
-			Adapters: map[string]config.AdapterAlternateBidderCodes{
+			Bidders: map[string]config.AdapterAlternateBidderCodes{
 				string(openrtb_ext.BidderPubmatic): {
 					AllowedBidderCodes: []string{"groupm-allowed"},
 				},
@@ -2282,7 +2282,7 @@ func TestExtraBidWithBidAdjustments(t *testing.T) {
 	seatBids, errs := bidder.requestBid(context.Background(), bidderReq, bidAdjustments, currencyConverter.Rates(), &adapters.ExtraRequestInfo{}, false, false,
 		config.AlternateBidderCodes{
 			Enabled: true,
-			Adapters: map[string]config.AdapterAlternateBidderCodes{
+			Bidders: map[string]config.AdapterAlternateBidderCodes{
 				string(openrtb_ext.BidderPubmatic): {
 					AllowedBidderCodes: []string{"groupm"},
 				},
@@ -2384,7 +2384,7 @@ func TestExtraBidWithBidAdjustmentsUsingAdapterCode(t *testing.T) {
 	seatBids, errs := bidder.requestBid(context.Background(), bidderReq, bidAdjustments, currencyConverter.Rates(), &adapters.ExtraRequestInfo{}, false, false,
 		config.AlternateBidderCodes{
 			Enabled: true,
-			Adapters: map[string]config.AdapterAlternateBidderCodes{
+			Bidders: map[string]config.AdapterAlternateBidderCodes{
 				string(openrtb_ext.BidderPubmatic): {
 					AllowedBidderCodes: []string{"groupm"},
 				},
diff --git a/metrics/go_metrics_test.go b/metrics/go_metrics_test.go
index 60cd101f..e82e7c65 100644
--- a/metrics/go_metrics_test.go
+++ b/metrics/go_metrics_test.go
@@ -33,6 +33,7 @@ func TestNewMetrics(t *testing.T) {
 	ensureContains(t, registry, "setuid_requests.opt_out", m.SetUidStatusMeter[SetUidOptOut])
 	ensureContains(t, registry, "setuid_requests.gdpr_blocked_host_cookie", m.SetUidStatusMeter[SetUidGDPRHostCookieBlocked])
 	ensureContains(t, registry, "setuid_requests.syncer_unknown", m.SetUidStatusMeter[SetUidSyncerUnknown])
+	ensureContains(t, registry, "stored_responses", m.StoredResponsesMeter)
 
 	ensureContains(t, registry, "prebid_cache_request_time.ok", m.PrebidCacheRequestTimerSuccess)
 	ensureContains(t, registry, "prebid_cache_request_time.err", m.PrebidCacheRequestTimerError)
@@ -739,6 +740,55 @@ func TestRecordSyncerSet(t *testing.T) {
 	assert.Equal(t, m.SyncerSetsMeter["foo"][SyncerSetUidCleared].Count(), int64(1))
 }
 
+func TestStoredResponses(t *testing.T) {
+	testCases := []struct {
+		description                           string
+		givenPubID                            string
+		accountStoredResponsesMetricsDisabled bool
+		expectedAccountStoredResponsesCount   int64
+		expectedStoredResponsesCount          int64
+	}{
+		{
+			description:                           "Publisher id is given, account stored responses disabled, both metrics should be updated",
+			givenPubID:                            "acct-id",
+			accountStoredResponsesMetricsDisabled: true,
+			expectedAccountStoredResponsesCount:   0,
+			expectedStoredResponsesCount:          1,
+		},
+		{
+			description:                           "Publisher id is given, account stored responses enabled, both metrics should be updated",
+			givenPubID:                            "acct-id",
+			accountStoredResponsesMetricsDisabled: false,
+			expectedAccountStoredResponsesCount:   1,
+			expectedStoredResponsesCount:          1,
+		},
+		{
+			description:                           "Publisher id is unknown, account stored responses enabled, only expectedStoredResponsesCount metric should be updated",
+			givenPubID:                            PublisherUnknown,
+			accountStoredResponsesMetricsDisabled: false,
+			expectedAccountStoredResponsesCount:   0,
+			expectedStoredResponsesCount:          1,
+		},
+		{
+			description:                           "Publisher id is unknown, account stored responses disabled, only expectedStoredResponsesCount metric should be updated",
+			givenPubID:                            PublisherUnknown,
+			accountStoredResponsesMetricsDisabled: true,
+			expectedAccountStoredResponsesCount:   0,
+			expectedStoredResponsesCount:          1,
+		},
+	}
+	for _, test := range testCases {
+		registry := metrics.NewRegistry()
+		m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus}, config.DisabledMetrics{AccountStoredResponses: test.accountStoredResponsesMetricsDisabled}, nil)
+
+		m.RecordStoredResponse(test.givenPubID)
+		am := m.getAccountMetrics(test.givenPubID)
+
+		assert.Equal(t, test.expectedStoredResponsesCount, m.StoredResponsesMeter.Count())
+		assert.Equal(t, test.expectedAccountStoredResponsesCount, am.storedResponsesMeter.Count())
+	}
+}
+
 func ensureContainsBidTypeMetrics(t *testing.T, registry metrics.Registry, prefix string, mdm map[openrtb_ext.BidType]*MarkupDeliveryMetrics) {
 	ensureContains(t, registry, prefix+".banner.adm_bids_received", mdm[openrtb_ext.BidTypeBanner].AdmMeter)
 	ensureContains(t, registry, prefix+".banner.nurl_bids_received", mdm[openrtb_ext.BidTypeBanner].NurlMeter)
diff --git a/metrics/prometheus/prometheus_test.go b/metrics/prometheus/prometheus_test.go
index f8f6cc7d..2b1704b7 100644
--- a/metrics/prometheus/prometheus_test.go
+++ b/metrics/prometheus/prometheus_test.go
@@ -502,6 +502,11 @@ func TestRecordStoredDataFetchTime(t *testing.T) {
 			dataType:    metrics.VideoDataType,
 			fetchType:   metrics.FetchDelta,
 		},
+		{
+			description: "Update stored responses histogram with delta label",
+			dataType:    metrics.ResponseDataType,
+			fetchType:   metrics.FetchDelta,
+		},
 	}
 
 	for _, tt := range tests {
@@ -525,6 +530,8 @@ func TestRecordStoredDataFetchTime(t *testing.T) {
 			metricsTimer = m.storedRequestFetchTimer
 		case metrics.VideoDataType:
 			metricsTimer = m.storedVideoFetchTimer
+		case metrics.ResponseDataType:
+			metricsTimer = m.storedResponsesFetchTimer
 		}
 
 		result := getHistogramFromHistogramVec(
@@ -602,6 +609,12 @@ func TestRecordStoredDataError(t *testing.T) {
 			errorType:   metrics.StoredDataErrorUndefined,
 			metricName:  "stored_video_errors",
 		},
+		{
+			description: "Update stored_response_errors counter with network label",
+			dataType:    metrics.ResponseDataType,
+			errorType:   metrics.StoredDataErrorNetwork,
+			metricName:  "stored_response_errors",
+		},
 	}
 
 	for _, tt := range tests {
@@ -623,6 +636,8 @@ func TestRecordStoredDataError(t *testing.T) {
 			metricsCounter = m.storedRequestErrors
 		case metrics.VideoDataType:
 			metricsCounter = m.storedVideoErrors
+		case metrics.ResponseDataType:
+			metricsCounter = m.storedResponsesErrors
 		}
 
 		assertCounterVecValue(t, tt.description, tt.metricName, metricsCounter,
@@ -1626,3 +1641,52 @@ func TestRecordAdapterGDPRRequestBlocked(t *testing.T) {
 			adapterLabel: string(openrtb_ext.BidderAppnexus),
 		})
 }
+
+func TestStoredResponsesMetric(t *testing.T) {
+	testCases := []struct {
+		description                           string
+		publisherId                           string
+		accountStoredResponsesMetricsDisabled bool
+		expectedAccountStoredResponsesCount   float64
+		expectedStoredResponsesCount          float64
+	}{
+
+		{
+			description:                           "Publisher id is given, account stored responses enabled, expected both account stored responses and stored responses counter to have a record",
+			publisherId:                           "acct-id",
+			accountStoredResponsesMetricsDisabled: false,
+			expectedAccountStoredResponsesCount:   1,
+			expectedStoredResponsesCount:          1,
+		},
+		{
+			description:                           "Publisher id is given, account stored responses disabled, expected stored responses counter only to have a record",
+			publisherId:                           "acct-id",
+			accountStoredResponsesMetricsDisabled: true,
+			expectedAccountStoredResponsesCount:   0,
+			expectedStoredResponsesCount:          1,
+		},
+		{
+			description:                           "Publisher id is unknown, account stored responses enabled, expected stored responses counter only to have a record",
+			publisherId:                           metrics.PublisherUnknown,
+			accountStoredResponsesMetricsDisabled: true,
+			expectedAccountStoredResponsesCount:   0,
+			expectedStoredResponsesCount:          1,
+		},
+		{
+			description:                           "Publisher id is unknown, account stored responses disabled, expected stored responses counter only to have a record",
+			publisherId:                           metrics.PublisherUnknown,
+			accountStoredResponsesMetricsDisabled: false,
+			expectedAccountStoredResponsesCount:   0,
+			expectedStoredResponsesCount:          1,
+		},
+	}
+
+	for _, test := range testCases {
+		m := createMetricsForTesting()
+		m.metricsDisabled.AccountStoredResponses = test.accountStoredResponsesMetricsDisabled
+		m.RecordStoredResponse(test.publisherId)
+
+		assertCounterVecValue(t, "", "account stored responses", m.accountStoredResponses, test.expectedAccountStoredResponsesCount, prometheus.Labels{accountLabel: "acct-id"})
+		assertCounterValue(t, "", "stored responses", m.storedResponses, test.expectedStoredResponsesCount)
+	}
+}