Repository: prebid/prebid-server
Pull request #3198 (2023-10-10 19:08:25)

Prometheus metrics:  bidder name should be in lowercase
- As of now, following are the prometheus metrics which have bidder name as label
  	```
	RecordAdapterRequest(labels AdapterLabels)
	RecordAdapterConnections(adapterName openrtb_ext.BidderName, connWasReused bool, connWaitTime time.Duration)
	RecordAdapterPanic(labels AdapterLabels)
	RecordAdapterBidReceived(labels AdapterLabels, bidType openrtb_ext.BidType, hasAdm bool)
	RecordAdapterPrice(labels AdapterLabels, cpm float64)
	RecordAdapterTime(labels AdapterLabels, length time.Duration)
	RecordAdapterGDPRRequestBlocked(adapterName openrtb_ext.BidderName)
	RecordBidValidationCreativeSizeError(adapter openrtb_ext.BidderName, account string)
	RecordBidValidationCreativeSizeWarn(adapter openrtb_ext.BidderName, account string)
	RecordBidValidationSecureMarkupError(adapter openrtb_ext.BidderName, account string)
	RecordBidValidationSecureMarkupWarn(adapter openrtb_ext.BidderName, account string)
    ```
    
- PR implements changes implements changes to make sure above promethus metrics records bidder name in lowercase.

- Also on startup, PBS server preloads prometheus with bidder names. For this, [CoreBidderNames](https://github.com/prebid/prebid-server/blob/23bc394e8218bb3f6c860c37bd13c56ea50d3df1/openrtb_ext/bidders.go#L20) are used. 
  - For example, `audienceNetwork, seedingAlliance, yahooAds, yahooAdvertising` are the bidders from CoreBidderNames that are in camel case. PR implements changes to make sure prometheus metrics for such bidders are preloaded with lower case bidder name.
  - Testing:
    - Before this PR change with master branch code, prometheus metrics are preloades with non lower case bidder names
        ```
        adapter_bids{adapter="yahooAds",delivery="adm"} 0
        ...
        adapter_response_validation_size_warn{adapter="yahooAds",success="false"} 0

        adapter_bids{adapter="seedingAlliance",delivery="adm"} 0
        ...
        syncer_sets{status="ok",syncer="seedingAlliance"} 0

        adapter_bids{adapter="audienceNetwork",delivery="adm"} 0
        ...
        adapter_response_validation_size_warn{adapter="audienceNetwork",success="true"} 0

        adapter_bids{adapter="yahooAdvertising",delivery="adm"} 0
         ...
        adapter_response_validation_size_warn{adapter="yahooAdvertising",success="true"} 0
        ```
     -  With PR changes, above metrics are preloaded with lower case bidder names
        ```
        adapter_bids{adapter="audiencenetwork",delivery="adm"} 0
         ...
        adapter_response_validation_size_warn{adapter="audiencenetwork",success="true"} 0

        adapter_bids{adapter="seedingalliance",delivery="adm"} 0
        ...
        syncer_sets{status="ok",syncer="seedingAlliance"} 0

        adapter_bids{adapter="yahooads",delivery="adm"} 0
        ...        
        adapter_response_validation_size_warn{adapter="yahooads",success="true"} 0

        adapter_bids{adapter="yahooadvertising",delivery="adm"} 0
        ... 
        adapter_response_validation_size_warn{adapter="yahooadvertising",success="true"} 0
        ```


Patch:
diff --git a/adapters/edge226/edge226.go b/adapters/edge226/edge226.go
new file mode 100644
index 00000000..a124cb47
--- /dev/null
+++ b/adapters/edge226/edge226.go
@@ -0,0 +1,145 @@
+package edge226
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/http"
+
+	"github.com/prebid/openrtb/v19/openrtb2"
+	"github.com/prebid/prebid-server/adapters"
+	"github.com/prebid/prebid-server/config"
+	"github.com/prebid/prebid-server/openrtb_ext"
+)
+
+type adapter struct {
+	endpoint string
+}
+
+type reqBodyExt struct {
+	Edge226BidderExt reqBodyExtBidder `json:"bidder"`
+}
+
+type reqBodyExtBidder struct {
+	Type        string `json:"type"`
+	PlacementID string `json:"placementId,omitempty"`
+	EndpointID  string `json:"endpointId,omitempty"`
+}
+
+func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) {
+	bidder := &adapter{
+		endpoint: config.Endpoint,
+	}
+	return bidder, nil
+}
+
+func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) {
+	var err error
+	var adapterRequests []*adapters.RequestData
+
+	reqCopy := *request
+	for _, imp := range request.Imp {
+		reqCopy.Imp = []openrtb2.Imp{imp}
+
+		var bidderExt adapters.ExtImpBidder
+		var edge226Ext openrtb_ext.ImpExtEdge226
+
+		if err = json.Unmarshal(reqCopy.Imp[0].Ext, &bidderExt); err != nil {
+			return nil, []error{err}
+		}
+		if err = json.Unmarshal(bidderExt.Bidder, &edge226Ext); err != nil {
+			return nil, []error{err}
+		}
+
+		temp := reqBodyExt{Edge226BidderExt: reqBodyExtBidder{}}
+
+		if edge226Ext.PlacementID != "" {
+			temp.Edge226BidderExt.PlacementID = edge226Ext.PlacementID
+			temp.Edge226BidderExt.Type = "publisher"
+		} else if edge226Ext.EndpointID != "" {
+			temp.Edge226BidderExt.EndpointID = edge226Ext.EndpointID
+			temp.Edge226BidderExt.Type = "network"
+		}
+
+		finalyImpExt, err := json.Marshal(temp)
+		if err != nil {
+			return nil, []error{err}
+		}
+
+		reqCopy.Imp[0].Ext = finalyImpExt
+
+		adapterReq, err := a.makeRequest(&reqCopy)
+		if err != nil {
+			return nil, []error{err}
+		}
+
+		if adapterReq != nil {
+			adapterRequests = append(adapterRequests, adapterReq)
+		}
+	}
+	return adapterRequests, nil
+}
+
+func (a *adapter) makeRequest(request *openrtb2.BidRequest) (*adapters.RequestData, error) {
+	reqJSON, err := json.Marshal(request)
+	if err != nil {
+		return nil, err
+	}
+
+	headers := http.Header{}
+	headers.Add("Content-Type", "application/json;charset=utf-8")
+	headers.Add("Accept", "application/json")
+	return &adapters.RequestData{
+		Method:  "POST",
+		Uri:     a.endpoint,
+		Body:    reqJSON,
+		Headers: headers,
+	}, err
+}
+
+func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) {
+	if adapters.IsResponseStatusCodeNoContent(responseData) {
+		return nil, nil
+	}
+
+	if err := adapters.CheckResponseStatusCodeForErrors(responseData); err != nil {
+		return nil, []error{err}
+	}
+
+	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 {
+			bidType, err := getBidMediaType(&seatBid.Bid[i])
+			if err != nil {
+				return nil, []error{err}
+			}
+
+			b := &adapters.TypedBid{
+				Bid:     &seatBid.Bid[i],
+				BidType: bidType,
+			}
+			bidResponse.Bids = append(bidResponse.Bids, b)
+		}
+	}
+	return bidResponse, nil
+}
+
+func getBidMediaType(bid *openrtb2.Bid) (openrtb_ext.BidType, error) {
+	switch bid.MType {
+	case openrtb2.MarkupBanner:
+		return openrtb_ext.BidTypeBanner, nil
+	case openrtb2.MarkupVideo:
+		return openrtb_ext.BidTypeVideo, nil
+	case openrtb2.MarkupAudio:
+		return openrtb_ext.BidTypeAudio, nil
+	case openrtb2.MarkupNative:
+		return openrtb_ext.BidTypeNative, nil
+	default:
+		return "", fmt.Errorf("Unable to fetch mediaType in multi-format: %s", bid.ImpID)
+	}
+}
diff --git a/adapters/lemmadigital/lemmadigital.go b/adapters/lemmadigital/lemmadigital.go
new file mode 100644
index 00000000..3b77de52
--- /dev/null
+++ b/adapters/lemmadigital/lemmadigital.go
@@ -0,0 +1,114 @@
+package lemmadigital
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"strconv"
+	"text/template"
+
+	"github.com/prebid/openrtb/v19/openrtb2"
+	"github.com/prebid/prebid-server/adapters"
+	"github.com/prebid/prebid-server/config"
+	"github.com/prebid/prebid-server/errortypes"
+	"github.com/prebid/prebid-server/macros"
+	"github.com/prebid/prebid-server/openrtb_ext"
+)
+
+type adapter struct {
+	endpoint *template.Template
+}
+
+// Builder builds a new instance of the Lemmadigital adapter for the given bidder with the given config.
+func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) {
+	template, err := template.New("endpointTemplate").Parse(config.Endpoint)
+	if err != nil {
+		return nil, fmt.Errorf("unable to parse endpoint url template: %v", err)
+	}
+
+	bidder := &adapter{
+		endpoint: template,
+	}
+	return bidder, nil
+}
+
+func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) {
+	if len(request.Imp) == 0 {
+		return nil, []error{errors.New("Impression array should not be empty")}
+	}
+
+	var bidderExt adapters.ExtImpBidder
+	if err := json.Unmarshal(request.Imp[0].Ext, &bidderExt); err != nil {
+		return nil, []error{&errortypes.BadInput{
+			Message: fmt.Sprintf("Invalid imp.ext for impression index %d. Error Infomation: %s", 0, err.Error()),
+		}}
+	}
+
+	var impExt openrtb_ext.ImpExtLemmaDigital
+	if err := json.Unmarshal(bidderExt.Bidder, &impExt); err != nil {
+		return nil, []error{&errortypes.BadInput{
+			Message: fmt.Sprintf("Invalid imp.ext.bidder for impression index %d. Error Infomation: %s", 0, err.Error()),
+		}}
+	}
+
+	endpoint, err := a.buildEndpointURL(impExt)
+	if err != nil {
+		return nil, []error{err}
+	}
+
+	requestJSON, err := json.Marshal(request)
+	if err != nil {
+		return nil, []error{err}
+	}
+
+	requestData := &adapters.RequestData{
+		Method: "POST",
+		Uri:    endpoint,
+		Body:   requestJSON,
+	}
+
+	return []*adapters.RequestData{requestData}, nil
+}
+
+func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) {
+	if adapters.IsResponseStatusCodeNoContent(responseData) {
+		return nil, nil
+	}
+
+	if err := adapters.CheckResponseStatusCodeForErrors(responseData); err != nil {
+		return nil, []error{err}
+	}
+
+	var response openrtb2.BidResponse
+	if err := json.Unmarshal(responseData.Body, &response); err != nil {
+		return nil, []error{err}
+	}
+
+	bidType := openrtb_ext.BidTypeBanner
+	if nil != request.Imp[0].Video {
+		bidType = openrtb_ext.BidTypeVideo
+	}
+
+	bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp))
+	if len(response.Cur) > 0 {
+		bidResponse.Currency = response.Cur
+	}
+	for _, seatBid := range response.SeatBid {
+		for i := range seatBid.Bid {
+			b := &adapters.TypedBid{
+				Bid:     &seatBid.Bid[i],
+				BidType: bidType,
+			}
+			bidResponse.Bids = append(bidResponse.Bids, b)
+		}
+		break
+	}
+
+	return bidResponse, nil
+}
+
+func (a *adapter) buildEndpointURL(params openrtb_ext.ImpExtLemmaDigital) (string, error) {
+	endpointParams := macros.EndpointTemplateParams{PublisherID: strconv.Itoa(params.PublisherId),
+		AdUnit: strconv.Itoa(params.AdId)}
+	return macros.ResolveMacros(a.endpoint, endpointParams)
+}
diff --git a/adapters/pubmatic/pubmatic.go b/adapters/pubmatic/pubmatic.go
index 04bd00cb..bd406d68 100644
--- a/adapters/pubmatic/pubmatic.go
+++ b/adapters/pubmatic/pubmatic.go
@@ -19,6 +19,8 @@ import (
 
 const MAX_IMPRESSIONS_PUBMATIC = 30
 
+const ae = "ae"
+
 type PubmaticAdapter struct {
 	URI string
 }
@@ -42,6 +44,7 @@ type pubmaticBidExtVideo struct {
 type ExtImpBidderPubmatic struct {
 	adapters.ExtImpBidder
 	Data json.RawMessage `json:"data,omitempty"`
+	AE   int             `json:"ae,omitempty"`
 }
 
 type ExtAdServer struct {
@@ -60,6 +63,10 @@ type extRequestAdServer struct {
 	openrtb_ext.ExtRequest
 }
 
+type respExt struct {
+	FledgeAuctionConfigs map[string]json.RawMessage `json:"fledge_auction_configs,omitempty"`
+}
+
 const (
 	dctrKeyName        = "key_val"
 	pmZoneIDKeyName    = "pmZoneId"
@@ -304,6 +311,10 @@ func parseImpressionObject(imp *openrtb2.Imp, extractWrapperExtFromImp, extractP
 		populateFirstPartyDataImpAttributes(bidderExt.Data, extMap)
 	}
 
+	if bidderExt.AE != 0 {
+		extMap[ae] = bidderExt.AE
+	}
+
 	imp.Ext = nil
 	if len(extMap) > 0 {
 		ext, err := json.Marshal(extMap)
@@ -465,6 +476,20 @@ func (a *PubmaticAdapter) MakeBids(internalRequest *openrtb2.BidRequest, externa
 	if bidResp.Cur != "" {
 		bidResponse.Currency = bidResp.Cur
 	}
+
+	if bidResp.Ext != nil {
+		var bidRespExt respExt
+		if err := json.Unmarshal(bidResp.Ext, &bidRespExt); err == nil && bidRespExt.FledgeAuctionConfigs != nil {
+			bidResponse.FledgeAuctionConfigs = make([]*openrtb_ext.FledgeAuctionConfig, 0, len(bidRespExt.FledgeAuctionConfigs))
+			for impId, config := range bidRespExt.FledgeAuctionConfigs {
+				fledgeAuctionConfig := &openrtb_ext.FledgeAuctionConfig{
+					ImpId:  impId,
+					Config: config,
+				}
+				bidResponse.FledgeAuctionConfigs = append(bidResponse.FledgeAuctionConfigs, fledgeAuctionConfig)
+			}
+		}
+	}
 	return bidResponse, errs
 }
 
diff --git a/adapters/sovrn/sovrn.go b/adapters/sovrn/sovrn.go
index 405e5ebf..15b07800 100644
--- a/adapters/sovrn/sovrn.go
+++ b/adapters/sovrn/sovrn.go
@@ -97,7 +97,6 @@ func (s *SovrnAdapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapt
 		video := imp.Video
 		if video != nil {
 			if video.MIMEs == nil ||
-				video.MinDuration == 0 ||
 				video.MaxDuration == 0 ||
 				video.Protocols == nil {
 				errs = append(errs, &errortypes.BadInput{
diff --git a/adapters/teads/models.go b/adapters/teads/models.go
new file mode 100644
index 00000000..5b63c163
--- /dev/null
+++ b/adapters/teads/models.go
@@ -0,0 +1,40 @@
+package teads
+
+import (
+	"encoding/json"
+	"text/template"
+)
+
+type adapter struct {
+	endpointTemplate *template.Template
+}
+
+type defaultBidderImpExtension struct {
+	Bidder bidder `json:"bidder"`
+}
+
+type bidder struct {
+	PlacementId int `json:"placementId"`
+}
+
+type teadsImpExtension struct {
+	KV teadsKV `json:"kv"`
+}
+
+type teadsKV struct {
+	PlacementId int `json:"placementId"`
+}
+
+type teadsBidExt struct {
+	Prebid teadsPrebidExt `json:"prebid"`
+}
+
+type teadsPrebidExt struct {
+	Meta teadsPrebidMeta `json:"meta"`
+}
+
+type teadsPrebidMeta struct {
+	RendererName    string          `json:"rendererName"`
+	RendererVersion string          `json:"rendererVersion"`
+	RendererData    json.RawMessage `json:"rendererData"`
+}
diff --git a/adapters/teads/teads.go b/adapters/teads/teads.go
new file mode 100644
index 00000000..9c2bb57f
--- /dev/null
+++ b/adapters/teads/teads.go
@@ -0,0 +1,202 @@
+package teads
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/http"
+	"net/url"
+	"strconv"
+	"text/template"
+
+	"github.com/prebid/openrtb/v19/openrtb2"
+	"github.com/prebid/prebid-server/adapters"
+	"github.com/prebid/prebid-server/config"
+	"github.com/prebid/prebid-server/errortypes"
+	"github.com/prebid/prebid-server/macros"
+	"github.com/prebid/prebid-server/openrtb_ext"
+)
+
+// Builder builds a new instance of the Teads adapter for the given bidder with the given config.
+func Builder(_ openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) {
+	template, err := template.New("endpointTemplate").Parse(config.Endpoint)
+	if err != nil {
+		return nil, fmt.Errorf("unable to parse endpoint url template: %v", err)
+	}
+
+	bidder := &adapter{
+		endpointTemplate: template,
+	}
+	return bidder, nil
+}
+
+func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) {
+	if len(request.Imp) == 0 {
+		return nil, []error{&errortypes.BadInput{
+			Message: "No impression in the bid request",
+		}}
+	}
+
+	endpointURL, err := a.buildEndpointURL()
+	if endpointURL == "" {
+		return nil, []error{err}
+	}
+
+	if err := updateImpObject(request.Imp); err != nil {
+		return nil, []error{err}
+	}
+
+	reqJSON, err := json.Marshal(request)
+	if err != nil {
+		return nil, []error{&errortypes.BadInput{
+			Message: "Error parsing BidRequest object",
+		}}
+	}
+
+	headers := http.Header{}
+	headers.Add("Content-Type", "application/json;charset=utf-8")
+	return []*adapters.RequestData{{
+		Method:  "POST",
+		Uri:     endpointURL,
+		Body:    reqJSON,
+		Headers: headers,
+	}}, []error{}
+}
+
+func updateImpObject(imps []openrtb2.Imp) error {
+	for i := range imps {
+		imp := &imps[i]
+
+		if imp.Banner != nil {
+			if len(imp.Banner.Format) != 0 {
+				bannerCopy := *imp.Banner
+				bannerCopy.H = &imp.Banner.Format[0].H
+				bannerCopy.W = &imp.Banner.Format[0].W
+				imp.Banner = &bannerCopy
+			}
+		}
+
+		var defaultImpExt defaultBidderImpExtension
+		if err := json.Unmarshal(imp.Ext, &defaultImpExt); err != nil {
+			return &errortypes.BadInput{
+				Message: "Error parsing Imp.Ext object",
+			}
+		}
+		if defaultImpExt.Bidder.PlacementId == 0 {
+			return &errortypes.BadInput{
+				Message: "placementId should not be 0.",
+			}
+		}
+		imp.TagID = strconv.Itoa(defaultImpExt.Bidder.PlacementId)
+		teadsImpExt := &teadsImpExtension{
+			KV: teadsKV{
+				PlacementId: defaultImpExt.Bidder.PlacementId,
+			},
+		}
+		if extJson, err := json.Marshal(teadsImpExt); err != nil {
+			return &errortypes.BadInput{
+				Message: "Error stringify Imp.Ext object",
+			}
+		} else {
+			imp.Ext = extJson
+		}
+	}
+	return nil
+}
+
+// Builds enpoint url based on adapter-specific pub settings from imp.ext
+func (a *adapter) buildEndpointURL() (string, error) {
+	endpointParams := macros.EndpointTemplateParams{}
+	host, err := macros.ResolveMacros(a.endpointTemplate, endpointParams)
+
+	if err != nil {
+		return "", &errortypes.BadInput{
+			Message: "Unable to parse endpoint url template: " + err.Error(),
+		}
+	}
+
+	thisURI, err := url.Parse(host)
+	if err != nil {
+		return "", &errortypes.BadInput{
+			Message: "Malformed URL: " + err.Error(),
+		}
+	}
+
+	return thisURI.String(), nil
+}
+
+func (a *adapter) MakeBids(internalRequest *openrtb2.BidRequest, _ *adapters.RequestData, response *adapters.ResponseData) (*adapters.BidderResponse, []error) {
+	if adapters.IsResponseStatusCodeNoContent(response) {
+		return nil, nil
+	}
+
+	err := adapters.CheckResponseStatusCodeForErrors(response)
+	if err != nil {
+		return nil, []error{err}
+	}
+
+	var bidResp openrtb2.BidResponse
+	if err := json.Unmarshal(response.Body, &bidResp); err != nil {
+		return nil, []error{err}
+	}
+
+	bidderResponse := adapters.NewBidderResponseWithBidsCapacity(len(bidResp.SeatBid))
+
+	for _, sb := range bidResp.SeatBid {
+		for i := 0; i < len(sb.Bid); i++ {
+			bid := sb.Bid[i]
+
+			bidExtTeads, err := getTeadsRendererFromBidExt(bid.Ext)
+			if err != nil {
+				return nil, err
+			}
+			bidType, err := getMediaTypeForImp(bid.ImpID, internalRequest.Imp)
+			if err != nil {
+				return nil, err
+			}
+			bidderResponse.Bids = append(bidderResponse.Bids, &adapters.TypedBid{
+				Bid: &bid,
+				BidMeta: &openrtb_ext.ExtBidPrebidMeta{
+					RendererName:    bidExtTeads.Prebid.Meta.RendererName,
+					RendererVersion: bidExtTeads.Prebid.Meta.RendererVersion,
+				},
+				BidType: bidType,
+			})
+		}
+	}
+	if bidResp.Cur != "" {
+		bidderResponse.Currency = bidResp.Cur
+	}
+	return bidderResponse, nil
+}
+
+func getTeadsRendererFromBidExt(ext json.RawMessage) (*teadsBidExt, []error) {
+	var bidExtTeads teadsBidExt
+	if err := json.Unmarshal(ext, &bidExtTeads); err != nil {
+		return nil, []error{err}
+	}
+	if bidExtTeads.Prebid.Meta.RendererName == "" {
+		return nil, []error{&errortypes.BadInput{
+			Message: "RendererName should not be empty if present",
+		}}
+	}
+	if bidExtTeads.Prebid.Meta.RendererVersion == "" {
+		return nil, []error{&errortypes.BadInput{
+			Message: "RendererVersion should not be empty if present",
+		}}
+	}
+	return &bidExtTeads, nil
+}
+
+func getMediaTypeForImp(impID string, imps []openrtb2.Imp) (openrtb_ext.BidType, []error) {
+	for _, imp := range imps {
+		if imp.ID == impID {
+			if imp.Video != nil {
+				return openrtb_ext.BidTypeVideo, nil
+			}
+			return openrtb_ext.BidTypeBanner, nil
+		}
+	}
+	return openrtb_ext.BidType(""), []error{&errortypes.BadInput{
+		Message: "Imp ids were not equals",
+	}}
+}
diff --git a/endpoints/events/event.go b/endpoints/events/event.go
index d5cf89b2..ffcb4e00 100644
--- a/endpoints/events/event.go
+++ b/endpoints/events/event.go
@@ -4,6 +4,7 @@ import (
 	"context"
 	"errors"
 	"fmt"
+	"github.com/prebid/prebid-server/openrtb_ext"
 	"net/http"
 	"net/url"
 	"strconv"
@@ -188,7 +189,12 @@ func ParseEventRequest(r *http.Request) (*analytics.EventRequest, []error) {
 	}
 
 	// Bidder
-	event.Bidder = r.URL.Query().Get(BidderParameter)
+	bidderName := r.URL.Query().Get(BidderParameter)
+	if normalisedBidderName, ok := openrtb_ext.NormalizeBidderName(bidderName); ok {
+		bidderName = normalisedBidderName.String()
+	}
+
+	event.Bidder = bidderName
 
 	return event, errs
 }
diff --git a/endpoints/events/vtrack.go b/endpoints/events/vtrack.go
index d320fdc6..e0bf3fd4 100644
--- a/endpoints/events/vtrack.go
+++ b/endpoints/events/vtrack.go
@@ -16,6 +16,7 @@ import (
 	"github.com/prebid/prebid-server/config"
 	"github.com/prebid/prebid-server/errortypes"
 	"github.com/prebid/prebid-server/metrics"
+	"github.com/prebid/prebid-server/openrtb_ext"
 	"github.com/prebid/prebid-server/prebid_cache_client"
 	"github.com/prebid/prebid-server/stored_requests"
 )
@@ -27,12 +28,15 @@ const (
 	ImpressionOpenTag    = "<Impression>"
 )
 
+type normalizeBidderName func(name string) (openrtb_ext.BidderName, bool)
+
 type vtrackEndpoint struct {
-	Cfg           *config.Configuration
-	Accounts      stored_requests.AccountFetcher
-	BidderInfos   config.BidderInfos
-	Cache         prebid_cache_client.Client
-	MetricsEngine metrics.MetricsEngine
+	Cfg                 *config.Configuration
+	Accounts            stored_requests.AccountFetcher
+	BidderInfos         config.BidderInfos
+	Cache               prebid_cache_client.Client
+	MetricsEngine       metrics.MetricsEngine
+	normalizeBidderName normalizeBidderName
 }
 
 type BidCacheRequest struct {
@@ -49,11 +53,12 @@ type CacheObject struct {
 
 func NewVTrackEndpoint(cfg *config.Configuration, accounts stored_requests.AccountFetcher, cache prebid_cache_client.Client, bidderInfos config.BidderInfos, me metrics.MetricsEngine) httprouter.Handle {
 	vte := &vtrackEndpoint{
-		Cfg:           cfg,
-		Accounts:      accounts,
-		BidderInfos:   bidderInfos,
-		Cache:         cache,
-		MetricsEngine: me,
+		Cfg:                 cfg,
+		Accounts:            accounts,
+		BidderInfos:         bidderInfos,
+		Cache:               cache,
+		MetricsEngine:       me,
+		normalizeBidderName: openrtb_ext.NormalizeBidderName,
 	}
 
 	return vte.Handle
@@ -203,7 +208,7 @@ func ParseVTrackRequest(httpRequest *http.Request, maxRequestSize int64) (req *B
 
 // handleVTrackRequest handles a VTrack request
 func (v *vtrackEndpoint) handleVTrackRequest(ctx context.Context, req *BidCacheRequest, account *config.Account, integration string) (*BidCacheResponse, []error) {
-	biddersAllowingVastUpdate := getBiddersAllowingVastUpdate(req, &v.BidderInfos, v.Cfg.VTrack.AllowUnknownBidder)
+	biddersAllowingVastUpdate := getBiddersAllowingVastUpdate(req, &v.BidderInfos, v.Cfg.VTrack.AllowUnknownBidder, v.normalizeBidderName)
 	// cache data
 	r, errs := v.cachePutObjects(ctx, req, biddersAllowingVastUpdate, account.ID, integration)
 
@@ -251,11 +256,11 @@ func (v *vtrackEndpoint) cachePutObjects(ctx context.Context, req *BidCacheReque
 }
 
 // getBiddersAllowingVastUpdate returns a list of bidders that allow VAST XML modification
-func getBiddersAllowingVastUpdate(req *BidCacheRequest, bidderInfos *config.BidderInfos, allowUnknownBidder bool) map[string]struct{} {
+func getBiddersAllowingVastUpdate(req *BidCacheRequest, bidderInfos *config.BidderInfos, allowUnknownBidder bool, normalizeBidderName normalizeBidderName) map[string]struct{} {
 	bl := map[string]struct{}{}
 
 	for _, bcr := range req.Puts {
-		if _, ok := bl[bcr.Bidder]; isAllowVastForBidder(bcr.Bidder, bidderInfos, allowUnknownBidder) && !ok {
+		if _, ok := bl[bcr.Bidder]; isAllowVastForBidder(bcr.Bidder, bidderInfos, allowUnknownBidder, normalizeBidderName) && !ok {
 			bl[bcr.Bidder] = struct{}{}
 		}
 	}
@@ -264,12 +269,14 @@ func getBiddersAllowingVastUpdate(req *BidCacheRequest, bidderInfos *config.Bidd
 }
 
 // isAllowVastForBidder checks if a bidder is active and allowed to modify vast xml data
-func isAllowVastForBidder(bidder string, bidderInfos *config.BidderInfos, allowUnknownBidder bool) bool {
+func isAllowVastForBidder(bidder string, bidderInfos *config.BidderInfos, allowUnknownBidder bool, normalizeBidderName normalizeBidderName) bool {
 	//if bidder is active and isModifyingVastXmlAllowed is true
 	// check if bidder is configured
-	if b, ok := (*bidderInfos)[bidder]; bidderInfos != nil && ok {
-		// check if bidder is enabled
-		return b.IsEnabled() && b.ModifyingVastXmlAllowed
+	if normalizedBidder, ok := normalizeBidderName(bidder); ok {
+		if b, ok := (*bidderInfos)[normalizedBidder.String()]; bidderInfos != nil && ok {
+			// check if bidder is enabled
+			return b.IsEnabled() && b.ModifyingVastXmlAllowed
+		}
 	}
 
 	return allowUnknownBidder
diff --git a/exchange/adapter_builders.go b/exchange/adapter_builders.go
index 95cb1626..25630fed 100755
--- a/exchange/adapter_builders.go
+++ b/exchange/adapter_builders.go
@@ -74,6 +74,7 @@ import (
 	"github.com/prebid/prebid-server/adapters/dianomi"
 	"github.com/prebid/prebid-server/adapters/dmx"
 	evolution "github.com/prebid/prebid-server/adapters/e_volution"
+	"github.com/prebid/prebid-server/adapters/edge226"
 	"github.com/prebid/prebid-server/adapters/emtv"
 	"github.com/prebid/prebid-server/adapters/eplanning"
 	"github.com/prebid/prebid-server/adapters/epom"
@@ -102,6 +103,7 @@ import (
 	"github.com/prebid/prebid-server/adapters/kidoz"
 	"github.com/prebid/prebid-server/adapters/kiviads"
 	"github.com/prebid/prebid-server/adapters/krushmedia"
+	"github.com/prebid/prebid-server/adapters/lemmadigital"
 	"github.com/prebid/prebid-server/adapters/liftoff"
 	"github.com/prebid/prebid-server/adapters/limelightDigital"
 	lmkiviads "github.com/prebid/prebid-server/adapters/lm_kiviads"
@@ -158,6 +160,7 @@ import (
 	"github.com/prebid/prebid-server/adapters/suntContent"
 	"github.com/prebid/prebid-server/adapters/taboola"
 	"github.com/prebid/prebid-server/adapters/tappx"
+	"github.com/prebid/prebid-server/adapters/teads"
 	"github.com/prebid/prebid-server/adapters/telaria"
 	"github.com/prebid/prebid-server/adapters/tpmn"
 	"github.com/prebid/prebid-server/adapters/trafficgate"
@@ -263,6 +266,7 @@ func newAdapterBuilders() map[openrtb_ext.BidderName]adapters.Builder {
 		openrtb_ext.BidderDecenterAds:       decenterads.Builder,
 		openrtb_ext.BidderDeepintent:        deepintent.Builder,
 		openrtb_ext.BidderDianomi:           dianomi.Builder,
+		openrtb_ext.BidderEdge226:           edge226.Builder,
 		openrtb_ext.BidderDmx:               dmx.Builder,
 		openrtb_ext.BidderEmtv:              emtv.Builder,
 		openrtb_ext.BidderEmxDigital:        cadentaperturemx.Builder,
@@ -301,6 +305,7 @@ func newAdapterBuilders() map[openrtb_ext.BidderName]adapters.Builder {
 		openrtb_ext.BidderKiviads:           kiviads.Builder,
 		openrtb_ext.BidderLmKiviads:         lmkiviads.Builder,
 		openrtb_ext.BidderKrushmedia:        krushmedia.Builder,
+		openrtb_ext.BidderLemmadigital:      lemmadigital.Builder,
 		openrtb_ext.BidderLiftoff:           liftoff.Builder,
 		openrtb_ext.BidderLimelightDigital:  limelightDigital.Builder,
 		openrtb_ext.BidderLockerDome:        lockerdome.Builder,
@@ -361,6 +366,7 @@ func newAdapterBuilders() map[openrtb_ext.BidderName]adapters.Builder {
 		openrtb_ext.BidderSynacormedia:      imds.Builder,
 		openrtb_ext.BidderTaboola:           taboola.Builder,
 		openrtb_ext.BidderTappx:             tappx.Builder,
+		openrtb_ext.BidderTeads:             teads.Builder,
 		openrtb_ext.BidderTelaria:           telaria.Builder,
 		openrtb_ext.BidderTpmn:              tpmn.Builder,
 		openrtb_ext.BidderTrafficGate:       trafficgate.Builder,
diff --git a/metrics/prometheus/preload.go b/metrics/prometheus/preload.go
index 59f70cfb..db40feab 100644
--- a/metrics/prometheus/preload.go
+++ b/metrics/prometheus/preload.go
@@ -9,7 +9,7 @@ import (
 func preloadLabelValues(m *Metrics, syncerKeys []string, moduleStageNames map[string][]string) {
 	var (
 		adapterErrorValues        = enumAsString(metrics.AdapterErrors())
-		adapterValues             = enumAsString(openrtb_ext.CoreBidderNames())
+		adapterValues             = enumAsLowerCaseString(openrtb_ext.CoreBidderNames())
 		bidTypeValues             = []string{markupDeliveryAdm, markupDeliveryNurl}
 		boolValues                = boolValuesAsString()
 		cacheResultValues         = enumAsString(metrics.CacheResults())
diff --git a/metrics/prometheus/prometheus.go b/metrics/prometheus/prometheus.go
index 30fb6c5f..bd63997f 100644
--- a/metrics/prometheus/prometheus.go
+++ b/metrics/prometheus/prometheus.go
@@ -3,6 +3,7 @@ package prometheusmetrics
 import (
 	"fmt"
 	"strconv"
+	"strings"
 	"time"
 
 	"github.com/prebid/prebid-server/config"
@@ -762,15 +763,16 @@ func (m *Metrics) RecordStoredDataError(labels metrics.StoredDataLabels) {
 }
 
 func (m *Metrics) RecordAdapterRequest(labels metrics.AdapterLabels) {
+	lowerCasedAdapter := strings.ToLower(string(labels.Adapter))
 	m.adapterRequests.With(prometheus.Labels{
-		adapterLabel: string(labels.Adapter),
+		adapterLabel: lowerCasedAdapter,
 		cookieLabel:  string(labels.CookieFlag),
 		hasBidsLabel: strconv.FormatBool(labels.AdapterBids == metrics.AdapterBidPresent),
 	}).Inc()
 
 	for err := range labels.AdapterErrors {
 		m.adapterErrors.With(prometheus.Labels{
-			adapterLabel:      string(labels.Adapter),
+			adapterLabel:      lowerCasedAdapter,
 			adapterErrorLabel: string(err),
 		}).Inc()
 	}
@@ -779,22 +781,23 @@ func (m *Metrics) RecordAdapterRequest(labels metrics.AdapterLabels) {
 // Keeps track of created and reused connections to adapter bidders and the time from the
 // connection request, to the connection creation, or reuse from the pool across all engines
 func (m *Metrics) RecordAdapterConnections(adapterName openrtb_ext.BidderName, connWasReused bool, connWaitTime time.Duration) {
+	lowerCasedAdapterName := strings.ToLower(string(adapterName))
 	if m.metricsDisabled.AdapterConnectionMetrics {
 		return
 	}
 
 	if connWasReused {
 		m.adapterReusedConnections.With(prometheus.Labels{
-			adapterLabel: string(adapterName),
+			adapterLabel: lowerCasedAdapterName,
 		}).Inc()
 	} else {
 		m.adapterCreatedConnections.With(prometheus.Labels{
-			adapterLabel: string(adapterName),
+			adapterLabel: lowerCasedAdapterName,
 		}).Inc()
 	}
 
 	m.adapterConnectionWaitTime.With(prometheus.Labels{
-		adapterLabel: string(adapterName),
+		adapterLabel: lowerCasedAdapterName,
 	}).Observe(connWaitTime.Seconds())
 }
 
@@ -812,7 +815,7 @@ func (m *Metrics) RecordBidderServerResponseTime(bidderServerResponseTime time.D
 
 func (m *Metrics) RecordAdapterPanic(labels metrics.AdapterLabels) {
 	m.adapterPanics.With(prometheus.Labels{
-		adapterLabel: string(labels.Adapter),
+		adapterLabel: strings.ToLower(string(labels.Adapter)),
 	}).Inc()
 }
 
@@ -823,14 +826,14 @@ func (m *Metrics) RecordAdapterBidReceived(labels metrics.AdapterLabels, bidType
 	}
 
 	m.adapterBids.With(prometheus.Labels{
-		adapterLabel:        string(labels.Adapter),
+		adapterLabel:        strings.ToLower(string(labels.Adapter)),
 		markupDeliveryLabel: markupDelivery,
 	}).Inc()
 }
 
 func (m *Metrics) RecordAdapterPrice(labels metrics.AdapterLabels, cpm float64) {
 	m.adapterPrices.With(prometheus.Labels{
-		adapterLabel: string(labels.Adapter),
+		adapterLabel: strings.ToLower(string(labels.Adapter)),
 	}).Observe(cpm)
 }
 
@@ -843,7 +846,7 @@ func (m *Metrics) RecordOverheadTime(overhead metrics.OverheadType, duration tim
 func (m *Metrics) RecordAdapterTime(labels metrics.AdapterLabels, length time.Duration) {
 	if len(labels.AdapterErrors) == 0 {
 		m.adapterRequestsTimer.With(prometheus.Labels{
-			adapterLabel: string(labels.Adapter),
+			adapterLabel: strings.ToLower(string(labels.Adapter)),
 		}).Observe(length.Seconds())
 	}
 }
@@ -955,7 +958,7 @@ func (m *Metrics) RecordAdapterGDPRRequestBlocked(adapterName openrtb_ext.Bidder
 	}
 
 	m.adapterGDPRBlockedRequests.With(prometheus.Labels{
-		adapterLabel: string(adapterName),
+		adapterLabel: strings.ToLower(string(adapterName)),
 	}).Inc()
 }
 
@@ -975,8 +978,9 @@ func (m *Metrics) RecordAdsCertSignTime(adsCertSignTime time.Duration) {
 }
 
 func (m *Metrics) RecordBidValidationCreativeSizeError(adapter openrtb_ext.BidderName, account string) {
+	lowerCasedAdapter := strings.ToLower(string(adapter))
 	m.adapterBidResponseValidationSizeError.With(prometheus.Labels{
-		adapterLabel: string(adapter), successLabel: successLabel,
+		adapterLabel: lowerCasedAdapter, successLabel: successLabel,
 	}).Inc()
 
 	if !m.metricsDisabled.AccountAdapterDetails && account != metrics.PublisherUnknown {
@@ -987,8 +991,9 @@ func (m *Metrics) RecordBidValidationCreativeSizeError(adapter openrtb_ext.Bidde
 }
 
 func (m *Metrics) RecordBidValidationCreativeSizeWarn(adapter openrtb_ext.BidderName, account string) {
+	lowerCasedAdapter := strings.ToLower(string(adapter))
 	m.adapterBidResponseValidationSizeWarn.With(prometheus.Labels{
-		adapterLabel: string(adapter), successLabel: successLabel,
+		adapterLabel: lowerCasedAdapter, successLabel: successLabel,
 	}).Inc()
 
 	if !m.metricsDisabled.AccountAdapterDetails && account != metrics.PublisherUnknown {
@@ -1000,7 +1005,7 @@ func (m *Metrics) RecordBidValidationCreativeSizeWarn(adapter openrtb_ext.Bidder
 
 func (m *Metrics) RecordBidValidationSecureMarkupError(adapter openrtb_ext.BidderName, account string) {
 	m.adapterBidResponseSecureMarkupError.With(prometheus.Labels{
-		adapterLabel: string(adapter), successLabel: successLabel,
+		adapterLabel: strings.ToLower(string(adapter)), successLabel: successLabel,
 	}).Inc()
 
 	if !m.metricsDisabled.AccountAdapterDetails && account != metrics.PublisherUnknown {
@@ -1012,7 +1017,7 @@ func (m *Metrics) RecordBidValidationSecureMarkupError(adapter openrtb_ext.Bidde
 
 func (m *Metrics) RecordBidValidationSecureMarkupWarn(adapter openrtb_ext.BidderName, account string) {
 	m.adapterBidResponseSecureMarkupWarn.With(prometheus.Labels{
-		adapterLabel: string(adapter), successLabel: successLabel,
+		adapterLabel: strings.ToLower(string(adapter)), successLabel: successLabel,
 	}).Inc()
 
 	if !m.metricsDisabled.AccountAdapterDetails && account != metrics.PublisherUnknown {
diff --git a/metrics/prometheus/type_conversion.go b/metrics/prometheus/type_conversion.go
index 0ae5366b..9bf2ec94 100644
--- a/metrics/prometheus/type_conversion.go
+++ b/metrics/prometheus/type_conversion.go
@@ -2,6 +2,7 @@ package prometheusmetrics
 
 import (
 	"strconv"
+	"strings"
 )
 
 func enumAsString[T ~string](values []T) []string {
@@ -12,6 +13,14 @@ func enumAsString[T ~string](values []T) []string {
 	return valuesAsString
 }
 
+func enumAsLowerCaseString[T ~string](values []T) []string {
+	valuesAsString := make([]string, len(values))
+	for i, v := range values {
+		valuesAsString[i] = strings.ToLower(string(v))
+	}
+	return valuesAsString
+}
+
 func boolValuesAsString() []string {
 	return []string{
 		strconv.FormatBool(true),
diff --git a/openrtb_ext/bidders.go b/openrtb_ext/bidders.go
index 475d56a7..744c7fad 100644
--- a/openrtb_ext/bidders.go
+++ b/openrtb_ext/bidders.go
@@ -92,6 +92,7 @@ var coreBidderNames []BidderName = []BidderName{
 	BidderDecenterAds,
 	BidderDeepintent,
 	BidderDianomi,
+	BidderEdge226,
 	BidderDmx,
 	BidderEmtv,
 	BidderEmxDigital,
@@ -130,6 +131,7 @@ var coreBidderNames []BidderName = []BidderName{
 	BidderKiviads,
 	BidderLmKiviads,
 	BidderKrushmedia,
+	BidderLemmadigital,
 	BidderLiftoff,
 	BidderLimelightDigital,
 	BidderLockerDome,
@@ -190,6 +192,7 @@ var coreBidderNames []BidderName = []BidderName{
 	BidderSynacormedia,
 	BidderTaboola,
 	BidderTappx,
+	BidderTeads,
 	BidderTelaria,
 	BidderTpmn,
 	BidderTrafficGate,
@@ -381,6 +384,7 @@ const (
 	BidderDecenterAds       BidderName = "decenterads"
 	BidderDeepintent        BidderName = "deepintent"
 	BidderDianomi           BidderName = "dianomi"
+	BidderEdge226           BidderName = "edge226"
 	BidderDmx               BidderName = "dmx"
 	BidderEmtv              BidderName = "emtv"
 	BidderEmxDigital        BidderName = "emx_digital"
@@ -419,6 +423,7 @@ const (
 	BidderKiviads           BidderName = "kiviads"
 	BidderLmKiviads         BidderName = "lm_kiviads"
 	BidderKrushmedia        BidderName = "krushmedia"
+	BidderLemmadigital      BidderName = "lemmadigital"
 	BidderLiftoff           BidderName = "liftoff"
 	BidderLimelightDigital  BidderName = "limelightDigital"
 	BidderLockerDome        BidderName = "lockerdome"
@@ -479,6 +484,7 @@ const (
 	BidderSynacormedia      BidderName = "synacormedia"
 	BidderTaboola           BidderName = "taboola"
 	BidderTappx             BidderName = "tappx"
+	BidderTeads             BidderName = "teads"
 	BidderTelaria           BidderName = "telaria"
 	BidderTpmn              BidderName = "tpmn"
 	BidderTrafficGate       BidderName = "trafficgate"
diff --git a/openrtb_ext/imp_edge226.go b/openrtb_ext/imp_edge226.go
new file mode 100644
index 00000000..44f3490e
--- /dev/null
+++ b/openrtb_ext/imp_edge226.go
@@ -0,0 +1,6 @@
+package openrtb_ext
+
+type ImpExtEdge226 struct {
+	PlacementID string `json:"placementId"`
+	EndpointID  string `json:"endpointId"`
+}
diff --git a/openrtb_ext/imp_lemmadigital.go b/openrtb_ext/imp_lemmadigital.go
new file mode 100644
index 00000000..c691dd17
--- /dev/null
+++ b/openrtb_ext/imp_lemmadigital.go
@@ -0,0 +1,6 @@
+package openrtb_ext
+
+type ImpExtLemmaDigital struct {
+	PublisherId int `json:"pid"`
+	AdId        int `json:"aid"`
+}
diff --git a/openrtb_ext/imp_teads.go b/openrtb_ext/imp_teads.go
new file mode 100644
index 00000000..50d11ae9
--- /dev/null
+++ b/openrtb_ext/imp_teads.go
@@ -0,0 +1,5 @@
+package openrtb_ext
+
+type ExtImpTeads struct {
+	PlacementID string `json:"placementId"`
+}
diff --git a/static/bidder-info/edge226.yaml b/static/bidder-info/edge226.yaml
new file mode 100644
index 00000000..c4fbdefc
--- /dev/null
+++ b/static/bidder-info/edge226.yaml
@@ -0,0 +1,16 @@
+endpoint: "http://ssp.dauup.com/pserver"
+maintainer:
+  email: "audit@edge226.com"
+gvlVendorID: 1202
+capabilities:
+  site:
+    mediaTypes:
+    - banner
+    - video
+    - native
+    
+  app:
+    mediaTypes:
+    - banner
+    - video
+    - native
diff --git a/static/bidder-info/lemmadigital.yaml b/static/bidder-info/lemmadigital.yaml
new file mode 100644
index 00000000..535c91ff
--- /dev/null
+++ b/static/bidder-info/lemmadigital.yaml
@@ -0,0 +1,14 @@
+endpoint: "https://sg.ads.lemmatechnologies.com/lemma/servad?pid={{.PublisherID}}&aid={{.AdUnit}}"
+maintainer:
+  email: support@lemmatechnologies.com
+endpointCompression: gzip
+modifyingVastXmlAllowed: true
+capabilities:
+  app:
+    mediaTypes:
+      - banner
+      - video
+  site:
+    mediaTypes:
+      - banner
+      - video
\ No newline at end of file
diff --git a/static/bidder-info/orbidder.yaml b/static/bidder-info/orbidder.yaml
index 74348c75..c42fb91d 100644
--- a/static/bidder-info/orbidder.yaml
+++ b/static/bidder-info/orbidder.yaml
@@ -11,6 +11,7 @@ capabilities:
       - banner
       - native
 userSync:
+  supportCors: true
   redirect:
     url: "https://orbidder.otto.de/pbs-usersync?gdpr={{.GDPR}}&consent={{.GDPRConsent}}&redirect={{.RedirectURL}}"
     userMacro: "[ODN_ID]"
\ No newline at end of file
diff --git a/static/bidder-info/teads.yaml b/static/bidder-info/teads.yaml
new file mode 100644
index 00000000..5dc428dd
--- /dev/null
+++ b/static/bidder-info/teads.yaml
@@ -0,0 +1,9 @@
+endpoint: "https://a.teads.tv/prebid-server/bid-request"
+maintainer:
+  email: "support-sdk@teads.com"
+gvlVendorID: 132
+capabilities:
+  app:
+    mediaTypes:
+      - banner
+      - video
\ No newline at end of file
diff --git a/static/bidder-info/vrtcal.yaml b/static/bidder-info/vrtcal.yaml
index 2aeb292a..1ce005cd 100644
--- a/static/bidder-info/vrtcal.yaml
+++ b/static/bidder-info/vrtcal.yaml
@@ -14,7 +14,11 @@ capabilities:
       - video
       - native
 userSync:
-  # vrtcal 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
+  iframe:
+    url: "https://usync.vrtcal.com/i?ssp=1804&synctype=iframe&us_privacy={{.USPrivacy}}&gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&gpp={{.GPP}}&gpp_sid={{.GPPSID}}&surl={{.RedirectURL}}"
+    userMacro: "$$VRTCALUSER$$"
+  redirect:
+    url: "https://usync.vrtcal.com/i?ssp=1804&synctype=redirect&us_privacy={{.USPrivacy}}&gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&gpp={{.GPP}}&gpp_sid={{.GPPSID}}&surl={{.RedirectURL}}"
+    userMacro: "$$VRTCALUSER$$"
+openrtb:
+  gpp-supported: true
diff --git a/static/bidder-params/edge226.json b/static/bidder-params/edge226.json
new file mode 100644
index 00000000..95b0fbda
--- /dev/null
+++ b/static/bidder-params/edge226.json
@@ -0,0 +1,23 @@
+{
+    "$schema": "http://json-schema.org/draft-04/schema#",
+    "title": "Edge226 Adapter Params",
+    "description": "A schema which validates params accepted by the Edge226 adapter",
+    "type": "object",
+  
+    "properties": {
+      "placementId": {
+        "type": "string",
+        "minLength": 1,
+        "description": "Placement ID"
+      },
+      "endpointId": {
+        "type": "string",
+        "minLength": 1,
+        "description": "Endpoint ID"
+      }
+    },
+    "oneOf": [
+      { "required": ["placementId"] },
+      { "required": ["endpointId"] }
+    ]
+  }
\ No newline at end of file
diff --git a/static/bidder-params/lemmadigital.json b/static/bidder-params/lemmadigital.json
new file mode 100644
index 00000000..be4a89ed
--- /dev/null
+++ b/static/bidder-params/lemmadigital.json
@@ -0,0 +1,19 @@
+{
+    "$schema": "http://json-schema.org/draft-04/schema#",
+    "title": "Lemma Adapter Params",
+    "description": "A schema which validates params accepted by the Lemma adapter",
+    "type": "object",
+
+    "properties": {
+        "pid": {
+            "type": "integer",
+            "description": "Publisher ID"
+        },
+        "aid": {
+            "type": "integer",
+            "description": "Ad ID"
+        }
+    },
+
+    "required": ["pid", "aid"]
+}
\ No newline at end of file
diff --git a/static/bidder-params/teads.json b/static/bidder-params/teads.json
new file mode 100644
index 00000000..2b3f47d8
--- /dev/null
+++ b/static/bidder-params/teads.json
@@ -0,0 +1,15 @@
+{
+    "$schema": "http://json-schema.org/draft-04/schema#",
+    "title": "Teads Adapter Params",
+    "description": "A schema which validates params accepted by the Teads adapter",
+  
+    "type": "object",
+    "properties": {
+      "placementId": {
+        "type": "integer",
+        "description": "The placement id.",
+        "minimum": 1
+      }
+    },
+    "required": ["placementId"]
+  }
\ No newline at end of file


Test patch:
diff --git a/adapters/edge226/edge226_test.go b/adapters/edge226/edge226_test.go
new file mode 100644
index 00000000..c5e40ce7
--- /dev/null
+++ b/adapters/edge226/edge226_test.go
@@ -0,0 +1,20 @@
+package edge226
+
+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.BidderEdge226, config.Adapter{
+		Endpoint: "http://test.com/pserver"}, config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"})
+
+	if buildErr != nil {
+		t.Fatalf("Builder returned unexpected error %v", buildErr)
+	}
+
+	adapterstest.RunJSONBidderTest(t, "edge226test", bidder)
+}
diff --git a/adapters/edge226/edge226test/exemplary/endpointId.json b/adapters/edge226/edge226test/exemplary/endpointId.json
new file mode 100644
index 00000000..741c1f8c
--- /dev/null
+++ b/adapters/edge226/edge226test/exemplary/endpointId.json
@@ -0,0 +1,125 @@
+{
+    "mockBidRequest": {
+        "id": "test-request-id",
+        "device": {
+            "ip": "123.123.123.123",
+            "ua": "iPad"
+        },
+        "app": {
+            "id": "1",
+            "bundle": "com.wls.testwlsapplication"
+        },
+        "imp": [
+            {
+                "id": "test-imp-id",
+                "tagid": "test",
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 250
+                        },
+                        {
+                            "w": 300,
+                            "h": 600
+                        }
+                    ]
+                },
+                "ext": {
+                    "bidder": {
+                        "endpointId": "test"
+                    }
+                }
+            }
+        ]
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://test.com/pserver",
+                "body": {
+                    "id": "test-request-id",
+                    "imp": [
+                        {
+                            "id": "test-imp-id",
+                            "tagid": "test",
+                            "banner": {
+                                "format": [
+                                    {
+                                        "w": 300,
+                                        "h": 250
+                                    },
+                                    {
+                                        "w": 300,
+                                        "h": 600
+                                    }
+                                ]
+                            },
+                            "ext": {
+                                "bidder": {
+                                    "endpointId": "test",
+                                    "type": "network"
+                                }
+                            }
+                        }
+                    ],
+                    "app": {
+                        "id": "1",
+                        "bundle": "com.wls.testwlsapplication"
+                    },
+                    "device": {
+                        "ip": "123.123.123.123",
+                        "ua": "iPad"
+                    }
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": {
+                    "id": "test-request-id",
+                    "seatbid": [
+                        {
+                            "bid": [
+                                {
+                                    "id": "test_bid_id",
+                                    "impid": "test-imp-id",
+                                    "price": 0.27543,
+                                    "adm": "<iframe id=\"adm-banner-16\" width=\"300\" height=\"250\" frameborder=\"0\" marginheight=\"0\" marginwidth=\"0\" style=\"{overflow:hidden}\" src=\"http://test.com/pserver&k=882b2510ed6d6c94fa69c99aa522a708\"></iframe>",
+                                    "cid": "test_cid",
+                                    "crid": "test_crid",
+                                    "dealid": "test_dealid",
+                                    "w": 300,
+                                    "h": 250,
+                                    "mtype": 1
+                                }
+                            ],
+                            "seat": "edge226"
+                        }
+                    ],
+                    "cur": "USD"
+                }
+            }
+        }
+    ],
+    "expectedBidResponses": [
+        {
+            "bids": [
+                {
+                    "bid": {
+                        "id": "test_bid_id",
+                        "impid": "test-imp-id",
+                        "price": 0.27543,
+                        "adm": "<iframe id=\"adm-banner-16\" width=\"300\" height=\"250\" frameborder=\"0\" marginheight=\"0\" marginwidth=\"0\" style=\"{overflow:hidden}\" src=\"http://test.com/pserver&k=882b2510ed6d6c94fa69c99aa522a708\"></iframe>",
+                        "cid": "test_cid",
+                        "crid": "test_crid",
+                        "dealid": "test_dealid",
+                        "w": 300,
+                        "h": 250,
+                        "mtype": 1
+                    },
+                    "type": "banner"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/edge226/edge226test/exemplary/simple-banner.json b/adapters/edge226/edge226test/exemplary/simple-banner.json
new file mode 100644
index 00000000..741c1f8c
--- /dev/null
+++ b/adapters/edge226/edge226test/exemplary/simple-banner.json
@@ -0,0 +1,125 @@
+{
+    "mockBidRequest": {
+        "id": "test-request-id",
+        "device": {
+            "ip": "123.123.123.123",
+            "ua": "iPad"
+        },
+        "app": {
+            "id": "1",
+            "bundle": "com.wls.testwlsapplication"
+        },
+        "imp": [
+            {
+                "id": "test-imp-id",
+                "tagid": "test",
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 250
+                        },
+                        {
+                            "w": 300,
+                            "h": 600
+                        }
+                    ]
+                },
+                "ext": {
+                    "bidder": {
+                        "endpointId": "test"
+                    }
+                }
+            }
+        ]
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://test.com/pserver",
+                "body": {
+                    "id": "test-request-id",
+                    "imp": [
+                        {
+                            "id": "test-imp-id",
+                            "tagid": "test",
+                            "banner": {
+                                "format": [
+                                    {
+                                        "w": 300,
+                                        "h": 250
+                                    },
+                                    {
+                                        "w": 300,
+                                        "h": 600
+                                    }
+                                ]
+                            },
+                            "ext": {
+                                "bidder": {
+                                    "endpointId": "test",
+                                    "type": "network"
+                                }
+                            }
+                        }
+                    ],
+                    "app": {
+                        "id": "1",
+                        "bundle": "com.wls.testwlsapplication"
+                    },
+                    "device": {
+                        "ip": "123.123.123.123",
+                        "ua": "iPad"
+                    }
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": {
+                    "id": "test-request-id",
+                    "seatbid": [
+                        {
+                            "bid": [
+                                {
+                                    "id": "test_bid_id",
+                                    "impid": "test-imp-id",
+                                    "price": 0.27543,
+                                    "adm": "<iframe id=\"adm-banner-16\" width=\"300\" height=\"250\" frameborder=\"0\" marginheight=\"0\" marginwidth=\"0\" style=\"{overflow:hidden}\" src=\"http://test.com/pserver&k=882b2510ed6d6c94fa69c99aa522a708\"></iframe>",
+                                    "cid": "test_cid",
+                                    "crid": "test_crid",
+                                    "dealid": "test_dealid",
+                                    "w": 300,
+                                    "h": 250,
+                                    "mtype": 1
+                                }
+                            ],
+                            "seat": "edge226"
+                        }
+                    ],
+                    "cur": "USD"
+                }
+            }
+        }
+    ],
+    "expectedBidResponses": [
+        {
+            "bids": [
+                {
+                    "bid": {
+                        "id": "test_bid_id",
+                        "impid": "test-imp-id",
+                        "price": 0.27543,
+                        "adm": "<iframe id=\"adm-banner-16\" width=\"300\" height=\"250\" frameborder=\"0\" marginheight=\"0\" marginwidth=\"0\" style=\"{overflow:hidden}\" src=\"http://test.com/pserver&k=882b2510ed6d6c94fa69c99aa522a708\"></iframe>",
+                        "cid": "test_cid",
+                        "crid": "test_crid",
+                        "dealid": "test_dealid",
+                        "w": 300,
+                        "h": 250,
+                        "mtype": 1
+                    },
+                    "type": "banner"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/edge226/edge226test/exemplary/simple-native.json b/adapters/edge226/edge226test/exemplary/simple-native.json
new file mode 100644
index 00000000..581864cd
--- /dev/null
+++ b/adapters/edge226/edge226test/exemplary/simple-native.json
@@ -0,0 +1,109 @@
+{
+    "mockBidRequest": {
+        "id": "test-request-id",
+        "device": {
+            "ip": "123.123.123.123",
+            "ua": "iPad"
+        },
+        "app": {
+            "id": "1",
+            "bundle": "com.wls.testwlsapplication"
+        },
+        "imp": [
+            {
+                "id": "test-imp-id",
+                "tagid": "test",
+                "native": {
+                    "request": "{\"ver\":\"1.1\",\"layout\":1,\"adunit\":2,\"plcmtcnt\":6,\"plcmttype\":4,\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":75}},{\"id\":2,\"required\":1,\"img\":{\"wmin\":492,\"hmin\":328,\"type\":3,\"mimes\":[\"image/jpeg\",\"image/jpg\",\"image/png\"]}},{\"id\":4,\"required\":0,\"data\":{\"type\":6}},{\"id\":5,\"required\":0,\"data\":{\"type\":7}},{\"id\":6,\"required\":0,\"data\":{\"type\":1,\"len\":20}}]}",
+                    "ver": "1.1"
+                },
+                "ext": {
+                    "bidder": {
+                        "placementId": "test"
+                    }
+                }
+            }
+        ]
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://test.com/pserver",
+                "body": {
+                    "id": "test-request-id",
+                    "imp": [
+                        {
+                            "id": "test-imp-id",
+                            "tagid": "test",
+                            "native": {
+                                "request": "{\"ver\":\"1.1\",\"layout\":1,\"adunit\":2,\"plcmtcnt\":6,\"plcmttype\":4,\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":75}},{\"id\":2,\"required\":1,\"img\":{\"wmin\":492,\"hmin\":328,\"type\":3,\"mimes\":[\"image/jpeg\",\"image/jpg\",\"image/png\"]}},{\"id\":4,\"required\":0,\"data\":{\"type\":6}},{\"id\":5,\"required\":0,\"data\":{\"type\":7}},{\"id\":6,\"required\":0,\"data\":{\"type\":1,\"len\":20}}]}",
+                                "ver": "1.1"
+                            },
+                            "ext": {
+                                "bidder": {
+                                    "placementId": "test",
+                                    "type": "publisher"
+                                }
+                            }
+                        }
+                    ],
+                    "app": {
+                        "id": "1",
+                        "bundle": "com.wls.testwlsapplication"
+                    },
+                    "device": {
+                        "ip": "123.123.123.123",
+                        "ua": "iPad"
+                    }
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": {
+                    "id": "test-request-id",
+                    "seatbid": [
+                        {
+                            "bid": [
+                                {
+                                    "id": "test_bid_id",
+                                    "impid": "test-imp-id",
+                                    "price": 0.27543,
+                                    "adm": "<iframe id=\"adm-banner-16\" width=\"300\" height=\"250\" frameborder=\"0\" marginheight=\"0\" marginwidth=\"0\" style=\"{overflow:hidden}\" src=\"http://test.com/pserver&k=882b2510ed6d6c94fa69c99aa522a708\"></iframe>",
+                                    "cid": "test_cid",
+                                    "crid": "test_crid",
+                                    "dealid": "test_dealid",
+                                    "w": 300,
+                                    "h": 250,
+                                    "mtype": 4
+                                }
+                            ],
+                            "seat": "edge226"
+                        }
+                    ],
+                    "cur": "USD"
+                }
+            }
+        }
+    ],
+    "expectedBidResponses": [
+        {
+            "bids": [
+                {
+                    "bid": {
+                        "id": "test_bid_id",
+                        "impid": "test-imp-id",
+                        "price": 0.27543,
+                        "adm": "<iframe id=\"adm-banner-16\" width=\"300\" height=\"250\" frameborder=\"0\" marginheight=\"0\" marginwidth=\"0\" style=\"{overflow:hidden}\" src=\"http://test.com/pserver&k=882b2510ed6d6c94fa69c99aa522a708\"></iframe>",
+                        "cid": "test_cid",
+                        "crid": "test_crid",
+                        "dealid": "test_dealid",
+                        "w": 300,
+                        "h": 250,
+                        "mtype": 4
+                    },
+                    "type": "native"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/edge226/edge226test/exemplary/simple-video.json b/adapters/edge226/edge226test/exemplary/simple-video.json
new file mode 100644
index 00000000..c14a1bd9
--- /dev/null
+++ b/adapters/edge226/edge226test/exemplary/simple-video.json
@@ -0,0 +1,120 @@
+{
+    "mockBidRequest": {
+        "id": "test-request-id",
+        "device": {
+            "ip": "123.123.123.123",
+            "ua": "iPad"
+        },
+        "app": {
+            "id": "1",
+            "bundle": "com.wls.testwlsapplication"
+        },
+        "imp": [
+            {
+                "id": "test-imp-id",
+                "tagid": "test",
+                "video": {
+                    "mimes": [
+                        "video/mp4"
+                    ],
+                    "protocols": [
+                        2,
+                        5
+                    ],
+                    "w": 1024,
+                    "h": 576
+                },
+                "ext": {
+                    "bidder": {
+                        "placementId": "test"
+                    }
+                }
+            }
+        ]
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://test.com/pserver",
+                "body": {
+                    "id": "test-request-id",
+                    "device": {
+                        "ip": "123.123.123.123",
+                        "ua": "iPad"
+                    },
+                    "app": {
+                        "id": "1",
+                        "bundle": "com.wls.testwlsapplication"
+                    },
+                    "imp": [
+                        {
+                            "id": "test-imp-id",
+                            "tagid": "test",
+                            "video": {
+                                "mimes": [
+                                    "video/mp4"
+                                ],
+                                "protocols": [
+                                    2,
+                                    5
+                                ],
+                                "w": 1024,
+                                "h": 576
+                            },
+                            "ext": {
+                                "bidder": {
+                                    "placementId": "test",
+                                    "type": "publisher"
+                                }
+                            }
+                        }
+                    ]
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": {
+                    "id": "test-request-id",
+                    "seatbid": [
+                        {
+                            "bid": [
+                                {
+                                    "id": "test_bid_id",
+                                    "impid": "test-imp-id",
+                                    "price": 0.27543,
+                                    "adm": "<VAST version=\"3.0\"><Ad id=\"20001\" sequence=\"1\"><InLine><AdSystem version=\"4.0\"><![CDATA[iabtechlab]]></AdSystem><AdTitle><![CDATA[Inline Simple Ad]]></AdTitle><Impression><![CDATA[]]></Impression><Creatives><Creative id=\"5480\" sequence=\"1\"><Linear><Duration>00:01:00</Duration><MediaFiles><MediaFile id=\"5246\" delivery=\"progressive\" type=\"video/mp4\" bitrate=\"600\" width=\"640\" height=\"360\" minBitrate=\"500\" maxBitrate=\"700\" scalable=\"1\" maintainAspectRatio=\"1\" codec=\"0\"><![CDATA[https://s0.2mdn.net/4253510/google_ddm_animation_480P.mp4]]></MediaFile></MediaFiles><VideoClicks><ClickThrough id=\"blog\"><![CDATA[https://example.com]]></ClickThrough></VideoClicks></Linear></Creative></Creatives></InLine></Ad></VAST>",
+                                    "cid": "test_cid",
+                                    "crid": "test_crid",
+                                    "dealid": "test_dealid",
+                                    "mtype": 2
+                                }
+                            ],
+                            "seat": "edge226"
+                        }
+                    ],
+                    "cur": "USD"
+                }
+            }
+        }
+    ],
+    "expectedBidResponses": [
+        {
+            "currency": "USD",
+            "bids": [
+                {
+                    "bid": {
+                        "id": "test_bid_id",
+                        "impid": "test-imp-id",
+                        "price": 0.27543,
+                        "adm": "<VAST version=\"3.0\"><Ad id=\"20001\" sequence=\"1\"><InLine><AdSystem version=\"4.0\"><![CDATA[iabtechlab]]></AdSystem><AdTitle><![CDATA[Inline Simple Ad]]></AdTitle><Impression><![CDATA[]]></Impression><Creatives><Creative id=\"5480\" sequence=\"1\"><Linear><Duration>00:01:00</Duration><MediaFiles><MediaFile id=\"5246\" delivery=\"progressive\" type=\"video/mp4\" bitrate=\"600\" width=\"640\" height=\"360\" minBitrate=\"500\" maxBitrate=\"700\" scalable=\"1\" maintainAspectRatio=\"1\" codec=\"0\"><![CDATA[https://s0.2mdn.net/4253510/google_ddm_animation_480P.mp4]]></MediaFile></MediaFiles><VideoClicks><ClickThrough id=\"blog\"><![CDATA[https://example.com]]></ClickThrough></VideoClicks></Linear></Creative></Creatives></InLine></Ad></VAST>",
+                        "cid": "test_cid",
+                        "crid": "test_crid",
+                        "dealid": "test_dealid",
+                        "mtype": 2
+                    },
+                    "type": "video"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/edge226/edge226test/exemplary/simple-web-banner.json b/adapters/edge226/edge226test/exemplary/simple-web-banner.json
new file mode 100644
index 00000000..6cc72950
--- /dev/null
+++ b/adapters/edge226/edge226test/exemplary/simple-web-banner.json
@@ -0,0 +1,125 @@
+{
+    "mockBidRequest": {
+        "id": "test-request-id",
+        "imp": [
+            {
+                "id": "test-imp-id",
+                "tagid": "test",
+                "banner": {
+                    "format": [
+                        {
+                            "w": 300,
+                            "h": 250
+                        },
+                        {
+                            "w": 300,
+                            "h": 600
+                        }
+                    ]
+                },
+                "ext": {
+                    "bidder": {
+                        "placementId": "test"
+                    }
+                }
+            }
+        ],
+        "site": {
+            "id": "1",
+            "domain": "test.com"
+        },
+        "device": {
+            "ip": "123.123.123.123",
+            "ua": "Ubuntu"
+        }
+    },
+    "httpCalls": [
+        {
+            "expectedRequest": {
+                "uri": "http://test.com/pserver",
+                "body": {
+                    "id": "test-request-id",
+                    "imp": [
+                        {
+                            "id": "test-imp-id",
+                            "tagid": "test",
+                            "banner": {
+                                "format": [
+                                    {
+                                        "w": 300,
+                                        "h": 250
+                                    },
+                                    {
+                                        "w": 300,
+                                        "h": 600
+                                    }
+                                ]
+                            },
+                            "ext": {
+                                "bidder": {
+                                    "placementId": "test",
+                                    "type": "publisher"
+                                }
+                            }
+                        }
+                    ],
+                    "site": {
+                        "id": "1",
+                        "domain": "test.com"
+                    },
+                    "device": {
+                        "ip": "123.123.123.123",
+                        "ua": "Ubuntu"
+                    }
+                }
+            },
+            "mockResponse": {
+                "status": 200,
+                "body": {
+                    "id": "test-request-id",
+                    "seatbid": [
+                        {
+                            "bid": [
+                                {
+                                    "id": "test_bid_id",
+                                    "impid": "test-imp-id",
+                                    "price": 0.27543,
+                                    "adm": "<iframe id=\"adm-banner-1\" width=\"468\" height=\"60\" frameborder=\"0\" marginheight=\"0\" marginwidth=\"0\" style=\"{overflow:hidden}\" src=\"http://test.com/pserver&k=bc2d316f39931a07d9a8dd249bf85fc0\"></iframe>",
+                                    "cid": "test_cid",
+                                    "crid": "test_crid",
+                                    "dealid": "test_dealid",
+                                    "w": 468,
+                                    "h": 60,
+                                    "mtype": 1
+                                }
+                            ],
+                            "seat": "edge226"
+                        }
+                    ],
+                    "cur": "USD"
+                }
+            }
+        }
+    ],
+    "expectedBidResponses": [
+        {
+            "bids": [
+                {
+                    "bid": {
+                        "id": "test_bid_id",
+                        "impid": "test-imp-id",
+                        "price": 0.27543,
+                        "adm": "<iframe id=\"adm-banner-1\" width=\"468\" height=\"60\" frameborder=\"0\" marginheight=\"0\" marginwidth=\"0\" style=\"{overflow:hidden}\" src=\"http://test.com/pserver&k=bc2d316f39931a07d9a8dd249bf85fc0\"></iframe>",
+                        "cid": "test_cid",
+                        "crid": "test_crid",
+                        "dealid": "test_dealid",
+                        "w": 468,
+                        "h": 60,
+                        "mtype": 1
+                    },
+                    "type": "banner"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/adapters/edge226/edge226test/supplemental/bad_media_type.json b/adapters/edge226/edge226test/supplemental/bad_media_type.json
new file mode 100644
index 00000000..75b13412
--- /dev/null
+++ b/adapters/edge226/edge226test/supplemental/bad_media_type.json
@@ -0,0 +1,82 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id",
+    "imp": [
+      {
+        "id": "test-imp-id",
+        "ext": {
+          "bidder": {
+            "placementId": "test"
+          }
+        }
+      }
+    ],
+    "app": {
+      "id": "1",
+      "bundle": "com.wls.testwlsapplication"
+    },
+    "device": {
+      "ip": "123.123.123.123",
+      "ifa": "sdjfksdf-dfsds-dsdg-dsgg"
+    }
+  },
+  "httpCalls": [{
+    "expectedRequest": {
+      "uri": "http://test.com/pserver",
+      "body": {
+        "id": "test-request-id",
+        "imp": [
+          {
+            "id": "test-imp-id",
+            "ext": {
+              "bidder": {
+                "placementId": "test",
+                "type": "publisher"
+              }
+            }
+          }
+        ],
+        "app": {
+          "id": "1",
+          "bundle": "com.wls.testwlsapplication"
+        },
+        "device": {
+          "ip": "123.123.123.123",
+          "ifa": "sdjfksdf-dfsds-dsdg-dsgg"
+        }
+      }
+    },
+    "mockResponse": {
+      "status": 200,
+      "body": {
+        "id": "test-request-id",
+        "seatbid": [
+          {
+            "bid": [
+              {
+                "id": "test_bid_id",
+                "impid": "test-imp-id",
+                "price": 0.27543,
+                "adm": "<iframe id=\"adm-banner-16\" width=\"300\" height=\"250\" frameborder=\"0\" marginheight=\"0\" marginwidth=\"0\" style=\"{overflow:hidden}\" src=\"http://test.com/pserver&k=882b2510ed6d6c94fa69c99aa522a708\"></iframe>",
+                "cid": "test_cid",
+                "crid": "test_crid",
+                "dealid": "test_dealid",
+                "w": 300,
+                "h": 250,
+                "ext": {}
+              }
+            ],
+            "seat": "edge226"
+          }
+        ],
+        "cur": "USD"
+      }
+    }
+  }],
+  "expectedMakeBidsErrors": [
+    {
+      "value": "Unable to fetch mediaType in multi-format: test-imp-id",
+      "comparison": "literal"
+    }
+  ]
+}
diff --git a/adapters/edge226/edge226test/supplemental/bad_response.json b/adapters/edge226/edge226test/supplemental/bad_response.json
new file mode 100644
index 00000000..1e5664ba
--- /dev/null
+++ b/adapters/edge226/edge226test/supplemental/bad_response.json
@@ -0,0 +1,84 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id",
+    "imp": [
+      {
+        "id": "test-imp-id",
+        "banner": {
+          "format": [
+            {
+              "w": 300,
+              "h": 250
+            },
+            {
+              "w": 300,
+              "h": 600
+            }
+          ]
+        },
+        "ext": {
+          "bidder": {
+            "placementId": "test"
+          }
+        }
+      }
+    ],
+    "app": {
+      "id": "1",
+      "bundle": "com.wls.testwlsapplication"
+    },
+    "device": {
+      "ip": "123.123.123.123",
+      "ifa": "sdjfksdf-dfsds-dsdg-dsgg"
+    }
+  },
+  "httpCalls": [{
+    "expectedRequest": {
+      "uri": "http://test.com/pserver",
+      "body": {
+        "id": "test-request-id",
+        "imp": [
+          {
+            "id": "test-imp-id",
+            "banner": {
+              "format": [
+                {
+                  "w": 300,
+                  "h": 250
+                },
+                {
+                  "w": 300,
+                  "h": 600
+                }
+              ]
+            },
+            "ext": {
+              "bidder": {
+                "placementId": "test",
+                "type": "publisher"
+              }
+            }
+          }
+        ],
+        "app": {
+          "id": "1",
+          "bundle": "com.wls.testwlsapplication"
+        },
+        "device": {
+          "ip": "123.123.123.123",
+          "ifa": "sdjfksdf-dfsds-dsdg-dsgg"
+        }
+      }
+    },
+    "mockResponse": {
+      "status": 200,
+      "body": ""
+    }
+  }],
+  "expectedMakeBidsErrors": [
+    {
+      "value": "json: cannot unmarshal string into Go value of type openrtb2.BidResponse",
+      "comparison": "literal"
+    }
+  ]
+}
diff --git a/adapters/edge226/edge226test/supplemental/status-204.json b/adapters/edge226/edge226test/supplemental/status-204.json
new file mode 100644
index 00000000..da929ce6
--- /dev/null
+++ b/adapters/edge226/edge226test/supplemental/status-204.json
@@ -0,0 +1,79 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id",
+    "imp": [
+      {
+        "id": "test-imp-id",
+        "banner": {
+          "format": [
+            {
+              "w": 300,
+              "h": 250
+            },
+            {
+              "w": 300,
+              "h": 600
+            }
+          ]
+        },
+        "ext": {
+          "bidder": {
+            "placementId": "test"
+          }
+        }
+      }
+    ],
+    "app": {
+      "id": "1",
+      "bundle": "com.wls.testwlsapplication"
+    },
+    "device": {
+      "ip": "123.123.123.123",
+      "ifa": "sdjfksdf-dfsds-dsdg-dsgg"
+    }
+  },
+  "httpCalls": [{
+    "expectedRequest": {
+      "uri": "http://test.com/pserver",
+      "body": {
+        "id": "test-request-id",
+        "imp": [
+          {
+            "id": "test-imp-id",
+            "banner": {
+              "format": [
+                {
+                  "w": 300,
+                  "h": 250
+                },
+                {
+                  "w": 300,
+                  "h": 600
+                }
+              ]
+            },
+            "ext": {
+              "bidder": {
+                "placementId": "test",
+                "type": "publisher"
+              }
+            }
+          }
+        ],
+        "app": {
+          "id": "1",
+          "bundle": "com.wls.testwlsapplication"
+        },
+        "device": {
+          "ip": "123.123.123.123",
+          "ifa": "sdjfksdf-dfsds-dsdg-dsgg"
+        }
+      }
+    },
+    "mockResponse": {
+      "status": 204,
+      "body": {}
+    }
+  }],
+  "expectedBidResponses": []
+}
diff --git a/adapters/edge226/edge226test/supplemental/status-not-200.json b/adapters/edge226/edge226test/supplemental/status-not-200.json
new file mode 100644
index 00000000..cf1847c2
--- /dev/null
+++ b/adapters/edge226/edge226test/supplemental/status-not-200.json
@@ -0,0 +1,84 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id",
+    "imp": [
+      {
+        "id": "test-imp-id",
+        "banner": {
+          "format": [
+            {
+              "w": 300,
+              "h": 250
+            },
+            {
+              "w": 300,
+              "h": 600
+            }
+          ]
+        },
+        "ext": {
+          "bidder": {
+            "placementId": "test"
+          }
+        }
+      }
+    ],
+    "app": {
+      "id": "1",
+      "bundle": "com.wls.testwlsapplication"
+    },
+    "device": {
+      "ip": "123.123.123.123",
+      "ifa": "sdjfksdf-dfsds-dsdg-dsgg"
+    }
+  },
+  "httpCalls": [{
+    "expectedRequest": {
+      "uri": "http://test.com/pserver",
+      "body": {
+        "id": "test-request-id",
+        "imp": [
+          {
+            "id": "test-imp-id",
+            "banner": {
+              "format": [
+                {
+                  "w": 300,
+                  "h": 250
+                },
+                {
+                  "w": 300,
+                  "h": 600
+                }
+              ]
+            },
+            "ext": {
+              "bidder": {
+                "placementId": "test",
+                "type": "publisher"
+              }
+            }
+          }
+        ],
+        "app": {
+          "id": "1",
+          "bundle": "com.wls.testwlsapplication"
+        },
+        "device": {
+          "ip": "123.123.123.123",
+          "ifa": "sdjfksdf-dfsds-dsdg-dsgg"
+        }
+      }
+    },
+    "mockResponse": {
+      "status": 404,
+      "body": {}
+    }
+  }],
+  "expectedMakeBidsErrors": [
+    {
+      "value": "Unexpected status code: 404. Run with request.debug = 1 for more info",
+      "comparison": "literal"
+    }
+  ]
+}
diff --git a/adapters/edge226/params_test.go b/adapters/edge226/params_test.go
new file mode 100644
index 00000000..3191bc62
--- /dev/null
+++ b/adapters/edge226/params_test.go
@@ -0,0 +1,47 @@
+package edge226
+
+import (
+	"encoding/json"
+	"testing"
+
+	"github.com/prebid/prebid-server/openrtb_ext"
+)
+
+func TestValidParams(t *testing.T) {
+	validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params")
+	if err != nil {
+		t.Fatalf("Failed to fetch the json schema. %v", err)
+	}
+
+	for _, p := range validParams {
+		if err := validator.Validate(openrtb_ext.BidderEdge226, json.RawMessage(p)); err != nil {
+			t.Errorf("Schema rejected valid params: %s", p)
+		}
+	}
+}
+
+func TestInvalidParams(t *testing.T) {
+	validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params")
+	if err != nil {
+		t.Fatalf("Failed to fetch the json schema. %v", err)
+	}
+
+	for _, p := range invalidParams {
+		if err := validator.Validate(openrtb_ext.BidderEdge226, json.RawMessage(p)); err == nil {
+			t.Errorf("Schema allowed invalid params: %s", p)
+		}
+	}
+}
+
+var validParams = []string{
+	`{"placementId": "test"}`,
+	`{"placementId": "1"}`,
+	`{"endpointId": "test"}`,
+	`{"endpointId": "1"}`,
+}
+
+var invalidParams = []string{
+	`{"placementId": 42}`,
+	`{"endpointId": 42}`,
+	`{"placementId": "1", "endpointId": "1"}`,
+}
diff --git a/adapters/lemmadigital/lemmadigital_test.go b/adapters/lemmadigital/lemmadigital_test.go
new file mode 100644
index 00000000..0372fa81
--- /dev/null
+++ b/adapters/lemmadigital/lemmadigital_test.go
@@ -0,0 +1,20 @@
+package lemmadigital
+
+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.BidderLemmadigital, config.Adapter{
+		Endpoint: "https://sg.ads.lemmatechnologies.com/lemma/servad?pid={{.PublisherID}}&aid={{.AdUnit}}"}, config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"})
+
+	if buildErr != nil {
+		t.Fatalf("Builder returned unexpected error %v", buildErr)
+	}
+
+	adapterstest.RunJSONBidderTest(t, "lemmadigitaltest", bidder)
+}
diff --git a/adapters/lemmadigital/lemmadigitaltest/exemplary/banner.json b/adapters/lemmadigital/lemmadigitaltest/exemplary/banner.json
new file mode 100644
index 00000000..a478380e
--- /dev/null
+++ b/adapters/lemmadigital/lemmadigitaltest/exemplary/banner.json
@@ -0,0 +1,110 @@
+{
+    "mockBidRequest": {
+        "id": "test-request-id",
+        "imp": [{
+            "id": "test-imp-id",
+            "banner": {
+                "format": [{
+                    "w": 1920,
+                    "h": 1080
+                }],
+                "w": 1920,
+                "h": 1080
+            },
+            "ext": {
+                "bidder": {
+                    "aid": 1,
+                    "pid": 1
+                }
+            },
+            "bidfloor": 0.1
+        }],
+        "device": {
+            "ua": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
+        },
+        "site": {
+            "id": "siteID",
+            "publisher": {
+                "id": "1"
+            }
+        }
+    },
+
+    "httpCalls": [{
+        "expectedRequest": {
+            "uri": "https://sg.ads.lemmatechnologies.com/lemma/servad?pid=1&aid=1",
+            "body": {
+                "id": "test-request-id",
+                "imp": [{
+                    "id": "test-imp-id",
+                    "banner": {
+                        "format": [{
+                            "w": 1920,
+                            "h": 1080
+                        }],
+                        "w": 1920,
+                        "h": 1080
+                    },
+                    "ext": {
+                        "bidder": {
+                            "aid": 1,
+                            "pid": 1
+                        }
+                    },
+                    "bidfloor": 0.1
+                }],
+                "device": {
+                    "ua": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
+                },
+                "site": {
+                    "id": "siteID",
+                    "publisher": {
+                        "id": "1"
+                    }
+                }
+            }
+        },
+        "mockResponse": {
+            "status": 200,
+            "body": {
+                "id": "test-request-id",
+                "seatbid": [{
+                    "seat": "1",
+                    "bid": [{
+                        "id": "1239875642389471056",
+                        "impid": "test-imp-id",
+                        "price": 0.500000,
+                        "adid": "1",
+                        "adm": "some-test-ad",
+                        "adomain": ["lemmadigital.com"],
+                        "crid": "1",
+                        "h": 1080,
+                        "w": 1920,
+                        "dealid": "test_deal"
+                    }]
+                }],
+                "bidid": "1239875642389471056",
+                "cur": "USD"
+            }
+        }
+    }],
+
+    "expectedBidResponses": [{
+        "currency": "USD",
+        "bids": [{
+            "bid": {
+                "id": "1239875642389471056",
+                "impid": "test-imp-id",
+                "price": 0.5,
+                "adid": "1",
+                "adm": "some-test-ad",
+                "adomain": ["lemmadigital.com"],
+                "crid": "1",
+                "w": 1920,
+                "h": 1080,
+                "dealid": "test_deal"
+            },
+            "type": "banner"
+        }]
+    }]
+}
\ No newline at end of file
diff --git a/adapters/lemmadigital/lemmadigitaltest/exemplary/multi-imp.json b/adapters/lemmadigital/lemmadigitaltest/exemplary/multi-imp.json
new file mode 100644
index 00000000..e051b54f
--- /dev/null
+++ b/adapters/lemmadigital/lemmadigitaltest/exemplary/multi-imp.json
@@ -0,0 +1,144 @@
+{
+    "mockBidRequest": {
+        "id": "test-request-id",
+        "imp": [{
+            "id": "test-imp-id",
+            "banner": {
+                "format": [{
+                    "w": 1920,
+                    "h": 1080
+                }],
+                "h": 1080,
+                "w": 1920
+            },
+            "ext": {
+                "bidder": {
+                    "aid": 1,
+                    "pid": 1
+                }
+            },
+            "bidfloor": 0.1
+        }, {
+            "id": "test-imp-id-2",
+            "banner": {
+                "format": [{
+                    "w": 1080,
+                    "h": 1920
+                }],
+                "h": 1920,
+                "w": 1080
+            },
+            "ext": {
+                "bidder": {
+                    "aid": 1,
+                    "pid": 1
+                }
+            },
+            "bidfloor": 0.12
+        }],
+        "device": {
+            "ua": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
+        },
+        "site": {
+            "id": "siteID",
+            "publisher": {
+                "id": "1"
+            }
+        }
+    },
+
+    "httpCalls": [{
+        "expectedRequest": {
+            "uri": "https://sg.ads.lemmatechnologies.com/lemma/servad?pid=1&aid=1",
+            "body": {
+                "id": "test-request-id",
+                "imp": [{
+                    "id": "test-imp-id",
+                    "banner": {
+                        "format": [{
+                            "w": 1920,
+                            "h": 1080
+                        }],
+                        "h": 1080,
+                        "w": 1920
+                    },
+                    "ext": {
+                        "bidder": {
+                            "aid": 1,
+                            "pid": 1
+                        }
+                    },
+                    "bidfloor": 0.1
+                }, {
+                    "id": "test-imp-id-2",
+                    "banner": {
+                        "format": [{
+                            "w": 1080,
+                            "h": 1920
+                        }],
+                        "h": 1920,
+                        "w": 1080
+                    },
+                    "ext": {
+                        "bidder": {
+                            "aid": 1,
+                            "pid": 1
+                        }
+                    },
+                    "bidfloor": 0.12
+                }],
+                "device": {
+                    "ua": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
+                },
+                "site": {
+                    "id": "siteID",
+                    "publisher": {
+                        "id": "1"
+                    }
+                }
+            }
+        },
+        "mockResponse": {
+            "status": 200,
+            "body": {
+                "id": "test-request-id",
+                "seatbid": [{
+                    "seat": "1",
+                    "bid": [{
+                        "id": "1239875642389471056",
+                        "impid": "test-imp-id",
+                        "price": 0.500000,
+                        "adid": "1",
+                        "adm": "some-test-ad",
+                        "adomain": ["lemmadigital.com"],
+                        "crid": "1",
+                        "h": 1080,
+                        "w": 1920,
+                        "dealid": "test_deal"
+                    }]
+                }],
+                "bidid": "1239875642389471056",
+                "cur": "USD"
+            }
+        }
+    }],
+
+    "expectedBidResponses": [{
+        "currency": "USD",
+        "bids": [{
+            "bid": {
+                "id": "1239875642389471056",
+                "impid": "test-imp-id",
+                "price": 0.5,
+                "adid": "1",
+                "adm": "some-test-ad",
+                "adomain": ["lemmadigital.com"],
+                "crid": "1",
+                "w": 1920,
+                "h": 1080,
+                "dealid": "test_deal"
+            },
+            "type": "banner"
+        }]
+    }]
+}
\ No newline at end of file
diff --git a/adapters/lemmadigital/lemmadigitaltest/exemplary/video.json b/adapters/lemmadigital/lemmadigitaltest/exemplary/video.json
new file mode 100644
index 00000000..63bab75b
--- /dev/null
+++ b/adapters/lemmadigital/lemmadigitaltest/exemplary/video.json
@@ -0,0 +1,89 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id-video",
+    "imp": [{
+      "id": "test-imp-id-video",
+      "video": {
+        "mimes": ["video/mp4"],
+        "protocols": [1],
+        "w": 1920,
+        "h": 1080
+      },
+      "ext": {
+        "bidder": {
+          "aid": 1,
+          "pid": 1
+        }
+      }
+    }],
+    "site": {
+      "publisher": {
+        "id": "1"
+      }
+    }
+  },
+
+  "httpCalls": [{
+    "expectedRequest": {
+      "uri": "https://sg.ads.lemmatechnologies.com/lemma/servad?pid=1&aid=1",
+      "body": {
+        "id": "test-request-id-video",
+        "imp": [{
+          "id": "test-imp-id-video",
+          "video": {
+            "mimes": ["video/mp4"],
+            "protocols": [1],
+            "w": 1920,
+            "h": 1080
+          },
+          "ext": {
+            "bidder": {
+              "aid": 1,
+              "pid": 1
+            }
+          }
+        }],
+        "site": {
+          "publisher": {
+            "id": "1"
+          }
+        }
+      }
+    },
+    "mockResponse": {
+      "status": 200,
+      "body": {
+        "id": "test-request-id-video",
+        "seatbid": [{
+          "seat": "1",
+          "bid": [{
+            "id": "1239875642389471056",
+            "impid": "test-imp-id-video",
+            "price": 0.500000,
+            "adm": "some-test-ad",
+            "crid": "crid_video",
+            "h": 1080,
+            "w": 1920
+          }]
+        }],
+        "cur": "USD"
+      }
+    }
+  }],
+
+  "expectedBidResponses": [{
+    "currency": "USD",
+    "bids": [{
+      "bid": {
+        "id": "1239875642389471056",
+        "impid": "test-imp-id-video",
+        "price": 0.5,
+        "adm": "some-test-ad",
+        "crid": "crid_video",
+        "w": 1920,
+        "h": 1080
+      },
+      "type": "video"
+    }]
+  }]
+}
\ No newline at end of file
diff --git a/adapters/lemmadigital/lemmadigitaltest/supplemental/empty-imps.json b/adapters/lemmadigital/lemmadigitaltest/supplemental/empty-imps.json
new file mode 100644
index 00000000..e13cdcb4
--- /dev/null
+++ b/adapters/lemmadigital/lemmadigitaltest/supplemental/empty-imps.json
@@ -0,0 +1,18 @@
+{
+    "mockBidRequest": {
+        "id": "test-request-id-video",
+        "imp": [],
+        "site": {
+            "publisher": {
+                "id": "1"
+            }
+        }
+    },
+
+    "httpCalls": [],
+    "expectedBidResponses": [],
+    "expectedMakeRequestsErrors": [{
+        "value": "Impression array should not be empty",
+        "comparison": "literal"
+    }]
+}
\ No newline at end of file
diff --git a/adapters/lemmadigital/lemmadigitaltest/supplemental/empty-seatbid-array.json b/adapters/lemmadigital/lemmadigitaltest/supplemental/empty-seatbid-array.json
new file mode 100644
index 00000000..c88e0fa7
--- /dev/null
+++ b/adapters/lemmadigital/lemmadigitaltest/supplemental/empty-seatbid-array.json
@@ -0,0 +1,101 @@
+{
+  "mockBidRequest": {
+    "app": {
+      "bundle": "com.ld.test",
+      "cat": [
+        "IAB-1"
+      ],
+      "domain": "ld.com",
+      "id": "1",
+      "name": "LD Test",
+      "publisher": {
+        "id": "1"
+      }
+    },
+    "device": {
+      "dnt": 0,
+      "ip": "0.0.0.0",
+      "language": "en",
+      "ua": "user-agent"
+    },
+    "id": "test-request-id-video",
+    "imp": [{
+      "ext": {
+        "bidder": {
+          "aid": 1,
+          "pid": 1
+        }
+      },
+      "id": "test-imp-id-video",
+      "video": {
+        "h": 1080,
+        "mimes": [
+          "video/mp4"
+        ],
+        "protocols": [
+          1
+        ],
+        "w": 1920
+      }
+    }],
+    "tmax": 1000
+  },
+  "httpCalls": [{
+    "expectedRequest": {
+      "uri": "https://sg.ads.lemmatechnologies.com/lemma/servad?pid=1&aid=1",
+      "body": {
+        "app": {
+          "bundle": "com.ld.test",
+          "cat": [
+            "IAB-1"
+          ],
+          "domain": "ld.com",
+          "id": "1",
+          "name": "LD Test",
+          "publisher": {
+            "id": "1"
+          }
+        },
+        "device": {
+          "dnt": 0,
+          "ip": "0.0.0.0",
+          "language": "en",
+          "ua": "user-agent"
+        },
+        "id": "test-request-id-video",
+        "imp": [{
+          "ext": {
+            "bidder": {
+              "aid": 1,
+              "pid": 1
+            }
+          },
+          "id": "test-imp-id-video",
+          "video": {
+            "h": 1080,
+            "mimes": [
+              "video/mp4"
+            ],
+            "protocols": [
+              1
+            ],
+            "w": 1920
+          }
+        }],
+        "tmax": 1000
+      }
+    },
+    "mockResponse": {
+      "status": 200,
+      "body": {
+        "id": "test-1",
+        "seatbid": [],
+        "cur": "USD"
+      }
+    }
+  }],
+  "expectedBidResponses": [{
+    "currency": "USD",
+    "bids": []
+}]
+}
\ No newline at end of file
diff --git a/adapters/lemmadigital/lemmadigitaltest/supplemental/invalid-ld-ext-bidder-object.json b/adapters/lemmadigital/lemmadigitaltest/supplemental/invalid-ld-ext-bidder-object.json
new file mode 100644
index 00000000..ba46d76b
--- /dev/null
+++ b/adapters/lemmadigital/lemmadigitaltest/supplemental/invalid-ld-ext-bidder-object.json
@@ -0,0 +1,48 @@
+{
+    "expectedMakeRequestsErrors": [{
+      "value": "Invalid imp.ext.bidder for impression index 0. Error Infomation: json: cannot unmarshal string into Go struct field ImpExtLemmaDigital.pid of type int",
+      "comparison": "literal"
+    }],
+    "mockBidRequest": {
+      "app": {
+        "bundle": "com.ld.test",
+        "cat": [
+          "IAB-1"
+        ],
+        "domain": "ld.com",
+        "id": "1",
+        "name": "LD Test",
+        "publisher": {
+          "id": "1"
+        }
+      },
+      "device": {
+        "dnt": 0,
+        "ip": "0.0.0.0",
+        "language": "en",
+        "ua": "user-agent"
+      },
+      "id": "test-request-id-video",
+      "imp": [{
+        "id": "test-imp-id-video",
+        "video": {
+          "h": 1080,
+          "mimes": [
+            "video/mp4"
+          ],
+          "protocols": [
+            1
+          ],
+          "w": 1920
+        },
+        "ext": {
+          "bidder": {
+            "aid": 1,
+            "pid": "1"
+          }
+        }
+      }],
+      "tmax": 1000
+    },
+    "httpCalls": []
+  }
\ No newline at end of file
diff --git a/adapters/lemmadigital/lemmadigitaltest/supplemental/invalid-ld-ext-object.json b/adapters/lemmadigital/lemmadigitaltest/supplemental/invalid-ld-ext-object.json
new file mode 100644
index 00000000..4d3d795c
--- /dev/null
+++ b/adapters/lemmadigital/lemmadigitaltest/supplemental/invalid-ld-ext-object.json
@@ -0,0 +1,42 @@
+{
+  "expectedMakeRequestsErrors": [{
+    "value": "Invalid imp.ext for impression index 0. Error Infomation: unexpected end of JSON input",
+    "comparison": "literal"
+  }],
+  "mockBidRequest": {
+    "app": {
+      "bundle": "com.ld.test",
+      "cat": [
+        "IAB-1"
+      ],
+      "domain": "ld.com",
+      "id": "1",
+      "name": "LD Test",
+      "publisher": {
+        "id": "1"
+      }
+    },
+    "device": {
+      "dnt": 0,
+      "ip": "0.0.0.0",
+      "language": "en",
+      "ua": "user-agent"
+    },
+    "id": "test-request-id-video",
+    "imp": [{
+      "id": "test-imp-id-video",
+      "video": {
+        "h": 1080,
+        "mimes": [
+          "video/mp4"
+        ],
+        "protocols": [
+          1
+        ],
+        "w": 1920
+      }
+    }],
+    "tmax": 1000
+  },
+  "httpCalls": []
+}
\ No newline at end of file
diff --git a/adapters/lemmadigital/lemmadigitaltest/supplemental/invalid-response.json b/adapters/lemmadigital/lemmadigitaltest/supplemental/invalid-response.json
new file mode 100644
index 00000000..036d35fb
--- /dev/null
+++ b/adapters/lemmadigital/lemmadigitaltest/supplemental/invalid-response.json
@@ -0,0 +1,62 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id-video",
+    "imp": [{
+      "id": "test-imp-id-video",
+      "video": {
+        "mimes": ["video/mp4"],
+        "protocols": [1],
+        "w": 1920,
+        "h": 1080
+      },
+      "ext": {
+        "bidder": {
+          "aid": 1,
+          "pid": 1
+        }
+      }
+    }],
+    "site": {
+      "publisher": {
+        "id": "1"
+      }
+    }
+  },
+
+  "httpCalls": [{
+    "expectedRequest": {
+      "uri": "https://sg.ads.lemmatechnologies.com/lemma/servad?pid=1&aid=1",
+      "body": {
+        "id": "test-request-id-video",
+        "imp": [{
+          "id": "test-imp-id-video",
+          "video": {
+            "mimes": ["video/mp4"],
+            "protocols": [1],
+            "w": 1920,
+            "h": 1080
+          },
+          "ext": {
+            "bidder": {
+              "aid": 1,
+              "pid": 1
+            }
+          }
+        }],
+        "site": {
+          "publisher": {
+            "id": "1"
+          }
+        }
+      }
+    },
+    "mockResponse": {
+      "status": 200,
+      "body": "<VAST/>"
+    }
+  }],
+  "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/lemmadigital/lemmadigitaltest/supplemental/status-code-bad-request.json b/adapters/lemmadigital/lemmadigitaltest/supplemental/status-code-bad-request.json
new file mode 100644
index 00000000..37ebea4b
--- /dev/null
+++ b/adapters/lemmadigital/lemmadigitaltest/supplemental/status-code-bad-request.json
@@ -0,0 +1,62 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id-video",
+    "imp": [{
+      "id": "test-imp-id-video",
+      "video": {
+        "mimes": ["video/mp4"],
+        "protocols": [1],
+        "w": 1920,
+        "h": 1080
+      },
+      "ext": {
+        "bidder": {
+          "aid": 1,
+          "pid": 1
+        }
+      }
+    }],
+    "site": {
+      "publisher": {
+        "id": "1"
+      }
+    }
+  },
+
+  "httpCalls": [{
+    "expectedRequest": {
+      "uri": "https://sg.ads.lemmatechnologies.com/lemma/servad?pid=1&aid=1",
+      "body": {
+        "id": "test-request-id-video",
+        "imp": [{
+          "id": "test-imp-id-video",
+          "video": {
+            "mimes": ["video/mp4"],
+            "protocols": [1],
+            "w": 1920,
+            "h": 1080
+          },
+          "ext": {
+            "bidder": {
+              "aid": 1,
+              "pid": 1
+            }
+          }
+        }],
+        "site": {
+          "publisher": {
+            "id": "1"
+          }
+        }
+      }
+    },
+    "mockResponse": {
+      "status": 400
+    }
+  }],
+  "expectedBidResponses": [],
+  "expectedMakeBidsErrors": [{
+    "value": "Unexpected status code: 400. Run with request.debug = 1 for more info",
+    "comparison": "literal"
+  }]
+}
\ No newline at end of file
diff --git a/adapters/lemmadigital/lemmadigitaltest/supplemental/status-code-no-content.json b/adapters/lemmadigital/lemmadigitaltest/supplemental/status-code-no-content.json
new file mode 100644
index 00000000..7c4813df
--- /dev/null
+++ b/adapters/lemmadigital/lemmadigitaltest/supplemental/status-code-no-content.json
@@ -0,0 +1,59 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id-video",
+    "imp": [{
+      "id": "test-imp-id-video",
+      "video": {
+        "mimes": ["video/mp4"],
+        "protocols": [1],
+        "w": 1920,
+        "h": 1080
+      },
+      "ext": {
+        "bidder": {
+          "aid": 1,
+          "pid": 1
+        }
+      }
+    }],
+    "site": {
+      "publisher": {
+        "id": "1"
+      }
+    }
+  },
+
+  "httpCalls": [{
+    "expectedRequest": {
+      "uri": "https://sg.ads.lemmatechnologies.com/lemma/servad?pid=1&aid=1",
+      "body": {
+        "id": "test-request-id-video",
+        "imp": [{
+          "id": "test-imp-id-video",
+          "video": {
+            "mimes": ["video/mp4"],
+            "protocols": [1],
+            "w": 1920,
+            "h": 1080
+          },
+          "ext": {
+            "bidder": {
+              "aid": 1,
+              "pid": 1
+            }
+          }
+        }],
+        "site": {
+          "publisher": {
+            "id": "1"
+          }
+        }
+      }
+    },
+    "mockResponse": {
+      "status": 204
+    }
+  }],
+  "expectedBidResponses": [],
+  "expectedMakeBidsErrors": []
+}
\ No newline at end of file
diff --git a/adapters/lemmadigital/lemmadigitaltest/supplemental/status-code-other-error.json b/adapters/lemmadigital/lemmadigitaltest/supplemental/status-code-other-error.json
new file mode 100644
index 00000000..047dc4ef
--- /dev/null
+++ b/adapters/lemmadigital/lemmadigitaltest/supplemental/status-code-other-error.json
@@ -0,0 +1,62 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id-video",
+    "imp": [{
+      "id": "test-imp-id-video",
+      "video": {
+        "mimes": ["video/mp4"],
+        "protocols": [1],
+        "w": 1920,
+        "h": 1080
+      },
+      "ext": {
+        "bidder": {
+          "aid": 1,
+          "pid": 1
+        }
+      }
+    }],
+    "site": {
+      "publisher": {
+        "id": "1"
+      }
+    }
+  },
+
+  "httpCalls": [{
+    "expectedRequest": {
+      "uri": "https://sg.ads.lemmatechnologies.com/lemma/servad?pid=1&aid=1",
+      "body": {
+        "id": "test-request-id-video",
+        "imp": [{
+          "id": "test-imp-id-video",
+          "video": {
+            "mimes": ["video/mp4"],
+            "protocols": [1],
+            "w": 1920,
+            "h": 1080
+          },
+          "ext": {
+            "bidder": {
+              "aid": 1,
+              "pid": 1
+            }
+          }
+        }],
+        "site": {
+          "publisher": {
+            "id": "1"
+          }
+        }
+      }
+    },
+    "mockResponse": {
+      "status": 503
+    }
+  }],
+  "expectedBidResponses": [],
+  "expectedMakeBidsErrors": [{
+    "value": "Unexpected status code: 503. Run with request.debug = 1 for more info",
+    "comparison": "literal"
+  }]
+}
\ No newline at end of file
diff --git a/adapters/lemmadigital/params_test.go b/adapters/lemmadigital/params_test.go
new file mode 100644
index 00000000..57bc7d83
--- /dev/null
+++ b/adapters/lemmadigital/params_test.go
@@ -0,0 +1,59 @@
+package lemmadigital
+
+import (
+	"encoding/json"
+	"testing"
+
+	"github.com/prebid/prebid-server/openrtb_ext"
+)
+
+// Tests for static/bidder-params/lemmadigital.json
+
+// Tests whether the schema supports the intended params.
+func TestValidParams(t *testing.T) {
+	validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params")
+	if err != nil {
+		t.Fatalf("Failed to fetch the json-schema. %v", err)
+	}
+
+	for _, validParam := range validParams {
+		if err := validator.Validate(openrtb_ext.BidderLemmadigital, json.RawMessage(validParam)); err != nil {
+			t.Errorf("Schema rejected params: %s \n Error: %s", validParam, err)
+		}
+	}
+}
+
+// Tests whether the schema rejects unsupported imp.ext fields.
+func TestInvalidParams(t *testing.T) {
+	validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params")
+	if err != nil {
+		t.Fatalf("Failed to fetch the json-schema. %v", err)
+	}
+
+	for _, invalidParam := range invalidParams {
+		if err := validator.Validate(openrtb_ext.BidderLemmadigital, json.RawMessage(invalidParam)); err == nil {
+			t.Errorf("Schema allowed invalid/unexpected params: %s", invalidParam)
+		}
+	}
+}
+
+var validParams = []string{
+	`{"pid":1, "aid": 1}`,
+	`{"pid":2147483647, "aid": 2147483647}`,
+}
+
+var invalidParams = []string{
+	``,
+	`null`,
+	`false`,
+	`0`,
+	`0.0`,
+	`[]`,
+	`{}`,
+	`{"pid":1}`,
+	`{"aid":1}`,
+	`{"pid":"1","aid":1}`,
+	`{"pid":1.0,"aid":"1"}`,
+	`{"pid":"1","aid":"1"}`,
+	`{"pid":false,"aid":true}`,
+}
diff --git a/adapters/pubmatic/pubmatictest/exemplary/fledge.json b/adapters/pubmatic/pubmatictest/exemplary/fledge.json
new file mode 100644
index 00000000..793f0984
--- /dev/null
+++ b/adapters/pubmatic/pubmatictest/exemplary/fledge.json
@@ -0,0 +1,166 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id",
+    "imp": [
+      {
+        "id": "test-imp-id",
+        "banner": {
+          "format": [
+            {
+              "w": 728,
+              "h": 90
+            }
+          ]
+        },
+        "ext": {
+          "ae": 1,
+          "bidder": {
+            "publisherId": "999",
+            "adSlot": "AdTag_Div1@300x250"
+          }
+        }
+      }
+    ]
+  },
+  "httpCalls": [
+    {
+      "expectedRequest": {
+        "uri": "https://hbopenbid.pubmatic.com/translator?source=prebid-server",
+        "body": {
+          "id": "test-request-id",
+          "imp": [
+            {
+              "id": "test-imp-id",
+              "banner": {
+                "format": [
+                  {
+                    "w": 728,
+                    "h": 90
+                  }
+                ],
+                "h": 250,
+                "w": 300
+              },
+              "tagid": "AdTag_Div1",
+              "ext": {
+                "ae": 1
+              }
+            }
+          ],
+          "ext": {"prebid":{}}
+        }
+      },
+      "mockResponse": {
+        "status": 200,
+        "body": {
+          "id": "test-request-id",
+          "seatbid": [
+            {
+              "seat": "pubmatic",
+              "bid": [
+                {
+                  "id": "9d8e77c2-ee0f-4781-af59-5359493b11af",
+                  "impid": "test-imp-id",
+                  "price": 1.1,
+                  "adm": "some-test-ad",
+                  "crid": "crid_10",
+                  "h": 90,
+                  "w": 728,
+                  "ext": {}
+                }
+              ]
+            }
+          ],
+          "cur": "USD",
+          "ext": {
+            "fledge_auction_configs": {
+              "test-imp-id": {
+                "seller": "PUBMATIC_SELLER_CONSTANT_STRING",
+                "sellerTimeout": 123,
+                "decisionLogicUrl": "PUBMATIC_URL_CONSTANT_STRING",
+                "interestGroupBuyers": [
+                  "somedomain1.com",
+                  "somedomain2.com",
+                  "somedomain3.com",
+                  "somedomain4.com"
+                ],
+                "perBuyerSignals": {
+                  "somedomain1.com": {
+                    "multiplier": 1,
+                    "win_reporting_id": "1234"
+                  },
+                  "somedomain2.com": {
+                    "multiplier": 2,
+                    "win_reporting_id": "2345"
+                  },
+                  "somedomain3.com": {
+                    "multiplier": 3,
+                    "win_reporting_id": "3456"
+                  },
+                  "somedomain4.com": {
+                    "multiplier": 4,
+                    "win_reporting_id": "4567"
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  ],
+  "expectedBidResponses": [
+    {
+      "currency": "USD",
+      "bids": [
+        {
+          "bid": {
+            "id": "9d8e77c2-ee0f-4781-af59-5359493b11af",
+            "impid": "test-imp-id",
+            "price": 1.1,
+            "adm": "some-test-ad",
+            "crid": "crid_10",
+            "w": 728,
+            "h": 90,
+            "ext": {}
+          },
+          "type": "banner"
+        }
+      ],
+      "fledgeauctionconfigs": [
+        {
+          "impid": "test-imp-id",
+          "config": {
+            "seller": "PUBMATIC_SELLER_CONSTANT_STRING",
+            "sellerTimeout": 123,
+            "decisionLogicUrl": "PUBMATIC_URL_CONSTANT_STRING",
+            "interestGroupBuyers": [
+              "somedomain1.com",
+              "somedomain2.com",
+              "somedomain3.com",
+              "somedomain4.com"
+            ],
+            "perBuyerSignals": {
+              "somedomain1.com": {
+                "multiplier": 1,
+                "win_reporting_id": "1234"
+              },
+              "somedomain2.com": {
+                "multiplier": 2,
+                "win_reporting_id": "2345"
+              },
+              "somedomain3.com": {
+                "multiplier": 3,
+                "win_reporting_id": "3456"
+              },
+              "somedomain4.com": {
+                "multiplier": 4,
+                "win_reporting_id": "4567"
+              }
+            }
+          }
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/adapters/sovrn/sovrntest/video/simple-video.json b/adapters/sovrn/sovrntest/video/simple-video.json
index 9cfeef5e..fae6778a 100644
--- a/adapters/sovrn/sovrntest/video/simple-video.json
+++ b/adapters/sovrn/sovrntest/video/simple-video.json
@@ -10,7 +10,6 @@
           "video/3gpp",
           "video/x-ms-wmv"
         ],
-        "minduration": 5,
         "maxduration": 30,
         "protocols": [
           4,
@@ -79,7 +78,6 @@
                   "video/3gpp",
                   "video/x-ms-wmv"
                 ],
-                "minduration": 5,
                 "maxduration": 30,
                 "protocols": [
                   4,
diff --git a/adapters/sovrn/sovrntest/videosupplemental/no-minduration.json b/adapters/sovrn/sovrntest/videosupplemental/no-minduration.json
deleted file mode 100644
index 88703dda..00000000
--- a/adapters/sovrn/sovrntest/videosupplemental/no-minduration.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{
-  "mockBidRequest": {
-    "id": "test-request-id",
-    "imp": [
-      {
-        "id": "test-imp-id",
-        "video": {
-          "mimes": [
-            "video/mp4",
-            "video/3gpp",
-            "video/x-ms-wmv"
-          ],
-          "maxduration": 30,
-          "protocols": [
-            4,
-            5,
-            6,
-            8
-          ]
-        },
-        "ext": {
-          "bidder": {
-            "tagid": "123456"
-          }
-        }
-      }
-    ],
-    "device": {
-      "ua": "test-user-agent",
-      "ip": "123.123.123.123",
-      "language": "en",
-      "dnt": 0
-    },
-    "site": {
-      "domain": "www.publisher.com",
-      "page": "http://www.publisher.com/awesome/site"
-    },
-    "user": {
-      "buyeruid": "test_reader_id"
-    }
-  },
-  "expectedMakeRequestsErrors": [
-    {
-      "value": "Missing required video parameter",
-      "comparison": "literal"
-    }
-  ],
-  "httpCalls": []
-}
diff --git a/adapters/teads/teads_test.go b/adapters/teads/teads_test.go
new file mode 100644
index 00000000..791ce7ae
--- /dev/null
+++ b/adapters/teads/teads_test.go
@@ -0,0 +1,27 @@
+package teads
+
+import (
+	"github.com/prebid/prebid-server/adapters/adapterstest"
+	"github.com/prebid/prebid-server/config"
+	"github.com/prebid/prebid-server/openrtb_ext"
+	"github.com/stretchr/testify/assert"
+	"testing"
+)
+
+func TestJsonSamples(t *testing.T) {
+	bidder, buildErr := Builder(openrtb_ext.BidderTeads, config.Adapter{
+		Endpoint: "https://a.teads.tv/prebid-server/bid-request"}, config.Server{ExternalUrl: "https://a.teads.tv/prebid-server/bid-request", GvlID: 1, DataCenter: "2"})
+
+	if buildErr != nil {
+		t.Fatalf("Builder returned unexpected error %v", buildErr)
+	}
+
+	adapterstest.RunJSONBidderTest(t, "teadstest", bidder)
+}
+
+func TestEndpointTemplateMalformed(t *testing.T) {
+	_, buildErr := Builder(openrtb_ext.BidderTeads, config.Adapter{
+		Endpoint: "{{Malformed}}"}, config.Server{ExternalUrl: "https://a.teads.tv/prebid-server/bid-request", GvlID: 1, DataCenter: "2"})
+
+	assert.Error(t, buildErr)
+}
diff --git a/adapters/teads/teadstest/exemplary/simple-banner-with-format.json b/adapters/teads/teadstest/exemplary/simple-banner-with-format.json
new file mode 100644
index 00000000..b2677e6f
--- /dev/null
+++ b/adapters/teads/teadstest/exemplary/simple-banner-with-format.json
@@ -0,0 +1,168 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id",
+    "imp": [
+      {
+        "id": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+        "banner": {
+          "format": [
+            {
+              "w": 300,
+              "h": 250
+            }
+          ]
+        },
+        "ext": {
+          "bidder": {
+            "placementId": 125
+          }
+        }
+      }
+    ],
+    "ext": {
+      "prebid": {
+        "sdk": {
+          "renderers": [
+            {
+              "name": "teads",
+              "version": "5.0.25",
+              "data": {
+                "resize": true,
+                "sdkEngineVersion": "189"
+              }
+            }
+          ]
+        }
+      }
+    }
+  },
+  "httpCalls": [
+    {
+      "expectedRequest": {
+        "uri": "https://a.teads.tv/prebid-server/bid-request",
+        "body": {
+          "id": "test-request-id",
+          "imp": [
+            {
+              "id": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+              "tagid": "125",
+              "banner": {
+                "w": 300,
+                "h": 250,
+                "format": [
+                  {
+                    "w": 300,
+                    "h": 250
+                  }
+                ]
+              },
+              "ext": {
+                "kv": {
+                  "placementId": 125
+                }
+              }
+            }
+          ],
+          "ext": {
+            "prebid": {
+              "sdk": {
+                "renderers": [
+                  {
+                    "name": "teads",
+                    "version": "5.0.25",
+                    "data": {
+                      "resize": true,
+                      "sdkEngineVersion": "189"
+                    }
+                  }
+                ]
+              }
+            }
+          }
+        }
+      },
+      "mockResponse": {
+        "status": 200,
+        "body": {
+          "id": "39312703-e970-4914-ae56-8e7d7d1fd16b",
+          "tagid": "125",
+          "seatbid": [
+            {
+              "seat": "teads",
+              "bid": [
+                {
+                  "id": "695ac187-fb3f-4d1f-8d5d-099c5e4c4d28",
+                  "impid": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+                  "price": 33,
+                  "nurl": "https://localhost:8080/prebid-server/win-notice?data=base64&clearingPrice=${AUCTION_PRICE}",
+                  "adm": "{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"ads\":[{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"type\":\"VastXml\",\"content\":\"<VAST version=\\\"3.0\\\"><Ad id=\\\"1\\\"><Wrapper><AdSystem>Teads Technology</AdSystem><VASTAdTagURI><![CDATA[http://vast.tv?auction_publisher_cost=LlBEcMjl2WSVYTIV0ZvZwFta&auction_publisher_cost_currency=USD&auction_ssb_provider_fee=&auction_ssb_provider_fee_currency=&auction_price=74Xz11zXoN9S_a18chCl1DB6&auction_currency=USD]]></VASTAdTagURI><Error><![CDATA[https://localhost:18281/track?action=error-vast&code=[ERRORCODE]&pid=2&vid=708ca808-ec55-4d97-ab81-9c4777e16058&pfid=971104812&mediaFileType=[MEDIAFILETYPE]&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&sid=0&scid=971105412&pscid=971105411&psid=971105457&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&dsp_campaign_id=1&dsp_creative_id=1&env=thirdparty-inapp&p=GmbtDz8E6SttqPqekGLm3vHN7muObx7-w6kGLgR8KMiWgUo78VfzNzYlcfjjRwTen7Oad6lYvgPUaiHwDV0lZcpu7lXO4Y7at1NIyIPxfcgdBw&cts=1685971107728&1685971107728]]></Error><Creatives></Creatives></Wrapper></Ad></VAST>\",\"scenario_id\":971105412,\"dsp_campaign_id\":\"1\",\"dsp_creative_id\":\"1\",\"insertion_id\":1,\"placement_id\":2,\"portfolio_item_id\":971104812}],\"wigoEnabled\":false,\"placementMetadata\":{\"2\":{\"adCallTrackingUrl\":\"https://localhost:18281/track?action=adCall&pid=2&pageId=2&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&vid=708ca808-ec55-4d97-ab81-9c4777e16058&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&env=thirdparty-inapp&gtc=1&gdpr_apply=false&gac=1&gap=1&ca=false&bsg=uncat&bsias=uncat&pfid=971104812&gid=1&brid=0&cid=1&rpm_reason=3&ut=1&p=5fwoPMJCquIB-txdmwQS0l79-hhHVnlTzyR9mmnBMtZRceP6-q31KzCfLpS8WTNaw_sXr-hkOFBxaxa-jyLblbVc&cts=1685971107773&cs=267268361555465193905\",\"auctionId\":\"39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6\"}},\"viewerId\":\"708ca808-ec55-4d97-ab81-9c4777e16058\"}",
+                  "adid": "1",
+                  "adomain": [
+                    "teads.com"
+                  ],
+                  "cid": "1",
+                  "crid": "1",
+                  "cat": [
+                    "IAB1-6",
+                    "IAB10-5"
+                  ],
+                  "ext": {
+                    "prebid": {
+                      "meta": {
+                        "rendererName": "teads",
+                        "rendererVersion": "5.0.25",
+                        "rendererData": {
+                          "resize": true,
+                          "sdkEngineVersion": "189"
+                        }
+                      }
+                    }
+                  }
+                }
+              ]
+            }
+          ]
+        }
+      }
+    }
+  ],
+  "expectedBidResponses": [
+    {
+      "currency": "USD",
+      "bids": [
+        {
+          "bid": {
+            "id": "695ac187-fb3f-4d1f-8d5d-099c5e4c4d28",
+            "impid": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+            "price": 33,
+            "nurl": "https://localhost:8080/prebid-server/win-notice?data=base64&clearingPrice=${AUCTION_PRICE}",
+            "adm": "{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"ads\":[{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"type\":\"VastXml\",\"content\":\"<VAST version=\\\"3.0\\\"><Ad id=\\\"1\\\"><Wrapper><AdSystem>Teads Technology</AdSystem><VASTAdTagURI><![CDATA[http://vast.tv?auction_publisher_cost=LlBEcMjl2WSVYTIV0ZvZwFta&auction_publisher_cost_currency=USD&auction_ssb_provider_fee=&auction_ssb_provider_fee_currency=&auction_price=74Xz11zXoN9S_a18chCl1DB6&auction_currency=USD]]></VASTAdTagURI><Error><![CDATA[https://localhost:18281/track?action=error-vast&code=[ERRORCODE]&pid=2&vid=708ca808-ec55-4d97-ab81-9c4777e16058&pfid=971104812&mediaFileType=[MEDIAFILETYPE]&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&sid=0&scid=971105412&pscid=971105411&psid=971105457&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&dsp_campaign_id=1&dsp_creative_id=1&env=thirdparty-inapp&p=GmbtDz8E6SttqPqekGLm3vHN7muObx7-w6kGLgR8KMiWgUo78VfzNzYlcfjjRwTen7Oad6lYvgPUaiHwDV0lZcpu7lXO4Y7at1NIyIPxfcgdBw&cts=1685971107728&1685971107728]]></Error><Creatives></Creatives></Wrapper></Ad></VAST>\",\"scenario_id\":971105412,\"dsp_campaign_id\":\"1\",\"dsp_creative_id\":\"1\",\"insertion_id\":1,\"placement_id\":2,\"portfolio_item_id\":971104812}],\"wigoEnabled\":false,\"placementMetadata\":{\"2\":{\"adCallTrackingUrl\":\"https://localhost:18281/track?action=adCall&pid=2&pageId=2&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&vid=708ca808-ec55-4d97-ab81-9c4777e16058&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&env=thirdparty-inapp&gtc=1&gdpr_apply=false&gac=1&gap=1&ca=false&bsg=uncat&bsias=uncat&pfid=971104812&gid=1&brid=0&cid=1&rpm_reason=3&ut=1&p=5fwoPMJCquIB-txdmwQS0l79-hhHVnlTzyR9mmnBMtZRceP6-q31KzCfLpS8WTNaw_sXr-hkOFBxaxa-jyLblbVc&cts=1685971107773&cs=267268361555465193905\",\"auctionId\":\"39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6\"}},\"viewerId\":\"708ca808-ec55-4d97-ab81-9c4777e16058\"}",
+            "adid": "1",
+            "adomain": [
+              "teads.com"
+            ],
+            "cid": "1",
+            "crid": "1",
+            "cat": [
+              "IAB1-6",
+              "IAB10-5"
+            ],
+            "ext": {
+              "prebid": {
+                "meta": {
+                  "rendererName": "teads",
+                  "rendererVersion": "5.0.25",
+                  "rendererData": {
+                    "resize": true,
+                    "sdkEngineVersion": "189"
+                  }
+                }
+              }
+            }
+          },
+          "type": "banner"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/adapters/teads/teadstest/exemplary/simple-banner.json b/adapters/teads/teadstest/exemplary/simple-banner.json
new file mode 100644
index 00000000..2d9be7c7
--- /dev/null
+++ b/adapters/teads/teadstest/exemplary/simple-banner.json
@@ -0,0 +1,158 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id",
+    "imp": [
+      {
+        "id": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+        "banner": {
+          "w": 300,
+          "h": 250
+        },
+        "ext": {
+          "bidder": {
+            "placementId": 125
+          }
+        }
+      }
+    ],
+    "ext": {
+      "prebid": {
+        "sdk": {
+          "renderers": [
+            {
+              "name": "teads",
+              "version": "5.0.25",
+              "data": {
+                "resize": true,
+                "sdkEngineVersion": "189"
+              }
+            }
+          ]
+        }
+      }
+    }
+  },
+  "httpCalls": [
+    {
+      "expectedRequest": {
+        "uri": "https://a.teads.tv/prebid-server/bid-request",
+        "body": {
+          "id": "test-request-id",
+          "imp": [
+            {
+              "id": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+              "tagid": "125",
+              "banner": {
+                "w": 300,
+                "h": 250
+              },
+              "ext": {
+                "kv": {
+                  "placementId": 125
+                }
+              }
+            }
+          ],
+          "ext": {
+            "prebid": {
+              "sdk": {
+                "renderers": [
+                  {
+                    "name": "teads",
+                    "version": "5.0.25",
+                    "data": {
+                      "resize": true,
+                      "sdkEngineVersion": "189"
+                    }
+                  }
+                ]
+              }
+            }
+          }
+        }
+      },
+      "mockResponse": {
+        "status": 200,
+        "body": {
+          "id": "39312703-e970-4914-ae56-8e7d7d1fd16b",
+          "tagid": "125",
+          "seatbid": [
+            {
+              "seat": "teads",
+              "bid": [
+                {
+                  "id": "695ac187-fb3f-4d1f-8d5d-099c5e4c4d28",
+                  "impid": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+                  "price": 33,
+                  "nurl": "https://localhost:8080/prebid-server/win-notice?data=base64&clearingPrice=${AUCTION_PRICE}",
+                  "adm": "{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"ads\":[{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"type\":\"VastXml\",\"content\":\"<VAST version=\\\"3.0\\\"><Ad id=\\\"1\\\"><Wrapper><AdSystem>Teads Technology</AdSystem><VASTAdTagURI><![CDATA[http://vast.tv?auction_publisher_cost=LlBEcMjl2WSVYTIV0ZvZwFta&auction_publisher_cost_currency=USD&auction_ssb_provider_fee=&auction_ssb_provider_fee_currency=&auction_price=74Xz11zXoN9S_a18chCl1DB6&auction_currency=USD]]></VASTAdTagURI><Error><![CDATA[https://localhost:18281/track?action=error-vast&code=[ERRORCODE]&pid=2&vid=708ca808-ec55-4d97-ab81-9c4777e16058&pfid=971104812&mediaFileType=[MEDIAFILETYPE]&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&sid=0&scid=971105412&pscid=971105411&psid=971105457&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&dsp_campaign_id=1&dsp_creative_id=1&env=thirdparty-inapp&p=GmbtDz8E6SttqPqekGLm3vHN7muObx7-w6kGLgR8KMiWgUo78VfzNzYlcfjjRwTen7Oad6lYvgPUaiHwDV0lZcpu7lXO4Y7at1NIyIPxfcgdBw&cts=1685971107728&1685971107728]]></Error><Creatives></Creatives></Wrapper></Ad></VAST>\",\"scenario_id\":971105412,\"dsp_campaign_id\":\"1\",\"dsp_creative_id\":\"1\",\"insertion_id\":1,\"placement_id\":2,\"portfolio_item_id\":971104812}],\"wigoEnabled\":false,\"placementMetadata\":{\"2\":{\"adCallTrackingUrl\":\"https://localhost:18281/track?action=adCall&pid=2&pageId=2&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&vid=708ca808-ec55-4d97-ab81-9c4777e16058&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&env=thirdparty-inapp&gtc=1&gdpr_apply=false&gac=1&gap=1&ca=false&bsg=uncat&bsias=uncat&pfid=971104812&gid=1&brid=0&cid=1&rpm_reason=3&ut=1&p=5fwoPMJCquIB-txdmwQS0l79-hhHVnlTzyR9mmnBMtZRceP6-q31KzCfLpS8WTNaw_sXr-hkOFBxaxa-jyLblbVc&cts=1685971107773&cs=267268361555465193905\",\"auctionId\":\"39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6\"}},\"viewerId\":\"708ca808-ec55-4d97-ab81-9c4777e16058\"}",
+                  "adid": "1",
+                  "adomain": [
+                    "teads.com"
+                  ],
+                  "cid": "1",
+                  "crid": "1",
+                  "cat": [
+                    "IAB1-6",
+                    "IAB10-5"
+                  ],
+                  "ext": {
+                    "prebid": {
+                      "meta": {
+                        "rendererName": "teads",
+                        "rendererVersion": "5.0.25",
+                        "rendererData": {
+                          "resize": true,
+                          "sdkEngineVersion": "189"
+                        }
+                      }
+                    }
+                  }
+                }
+              ]
+            }
+          ]
+        }
+      }
+    }
+  ],
+  "expectedBidResponses": [
+    {
+      "currency": "USD",
+      "bids": [
+        {
+          "bid": {
+            "id": "695ac187-fb3f-4d1f-8d5d-099c5e4c4d28",
+            "impid": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+            "price": 33,
+            "nurl": "https://localhost:8080/prebid-server/win-notice?data=base64&clearingPrice=${AUCTION_PRICE}",
+            "adm": "{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"ads\":[{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"type\":\"VastXml\",\"content\":\"<VAST version=\\\"3.0\\\"><Ad id=\\\"1\\\"><Wrapper><AdSystem>Teads Technology</AdSystem><VASTAdTagURI><![CDATA[http://vast.tv?auction_publisher_cost=LlBEcMjl2WSVYTIV0ZvZwFta&auction_publisher_cost_currency=USD&auction_ssb_provider_fee=&auction_ssb_provider_fee_currency=&auction_price=74Xz11zXoN9S_a18chCl1DB6&auction_currency=USD]]></VASTAdTagURI><Error><![CDATA[https://localhost:18281/track?action=error-vast&code=[ERRORCODE]&pid=2&vid=708ca808-ec55-4d97-ab81-9c4777e16058&pfid=971104812&mediaFileType=[MEDIAFILETYPE]&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&sid=0&scid=971105412&pscid=971105411&psid=971105457&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&dsp_campaign_id=1&dsp_creative_id=1&env=thirdparty-inapp&p=GmbtDz8E6SttqPqekGLm3vHN7muObx7-w6kGLgR8KMiWgUo78VfzNzYlcfjjRwTen7Oad6lYvgPUaiHwDV0lZcpu7lXO4Y7at1NIyIPxfcgdBw&cts=1685971107728&1685971107728]]></Error><Creatives></Creatives></Wrapper></Ad></VAST>\",\"scenario_id\":971105412,\"dsp_campaign_id\":\"1\",\"dsp_creative_id\":\"1\",\"insertion_id\":1,\"placement_id\":2,\"portfolio_item_id\":971104812}],\"wigoEnabled\":false,\"placementMetadata\":{\"2\":{\"adCallTrackingUrl\":\"https://localhost:18281/track?action=adCall&pid=2&pageId=2&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&vid=708ca808-ec55-4d97-ab81-9c4777e16058&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&env=thirdparty-inapp&gtc=1&gdpr_apply=false&gac=1&gap=1&ca=false&bsg=uncat&bsias=uncat&pfid=971104812&gid=1&brid=0&cid=1&rpm_reason=3&ut=1&p=5fwoPMJCquIB-txdmwQS0l79-hhHVnlTzyR9mmnBMtZRceP6-q31KzCfLpS8WTNaw_sXr-hkOFBxaxa-jyLblbVc&cts=1685971107773&cs=267268361555465193905\",\"auctionId\":\"39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6\"}},\"viewerId\":\"708ca808-ec55-4d97-ab81-9c4777e16058\"}",
+            "adid": "1",
+            "adomain": [
+              "teads.com"
+            ],
+            "cid": "1",
+            "crid": "1",
+            "cat": [
+              "IAB1-6",
+              "IAB10-5"
+            ],
+            "ext": {
+              "prebid": {
+                "meta": {
+                  "rendererName": "teads",
+                  "rendererVersion": "5.0.25",
+                  "rendererData": {
+                    "resize": true,
+                    "sdkEngineVersion": "189"
+                  }
+                }
+              }
+            }
+          },
+          "type": "banner"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/adapters/teads/teadstest/exemplary/simple-video.json b/adapters/teads/teadstest/exemplary/simple-video.json
new file mode 100644
index 00000000..814569a4
--- /dev/null
+++ b/adapters/teads/teadstest/exemplary/simple-video.json
@@ -0,0 +1,184 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id",
+    "imp": [
+      {
+        "id": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+        "video": {
+          "mimes": [
+            "video/mp4"
+          ],
+          "minduration": 15,
+          "maxduration": 30,
+          "protocols": [
+            2,
+            3,
+            5,
+            6,
+            7,
+            8
+          ],
+          "w": 940,
+          "h": 560
+        },
+        "ext": {
+          "bidder": {
+            "placementId": 125
+          }
+        }
+      }
+    ],
+    "ext": {
+      "prebid": {
+        "sdk": {
+          "renderers": [
+            {
+              "name": "teads",
+              "version": "5.0.25",
+              "data": {
+                "resize": true,
+                "sdkEngineVersion": "189"
+              }
+            }
+          ]
+        }
+      }
+    }
+  },
+  "httpCalls": [
+    {
+      "expectedRequest": {
+        "uri": "https://a.teads.tv/prebid-server/bid-request",
+        "body": {
+          "id": "test-request-id",
+          "imp": [
+            {
+              "id": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+              "tagid": "125",
+              "video": {
+                "mimes": [
+                  "video/mp4"
+                ],
+                "minduration": 15,
+                "maxduration": 30,
+                "protocols": [
+                  2,
+                  3,
+                  5,
+                  6,
+                  7,
+                  8
+                ],
+                "w": 940,
+                "h": 560
+              },
+              "ext": {
+                "kv": {
+                  "placementId": 125
+                }
+              }
+            }
+          ],
+          "ext": {
+            "prebid": {
+              "sdk": {
+                "renderers": [
+                  {
+                    "name": "teads",
+                    "version": "5.0.25",
+                    "data": {
+                      "resize": true,
+                      "sdkEngineVersion": "189"
+                    }
+                  }
+                ]
+              }
+            }
+          }
+        }
+      },
+      "mockResponse": {
+        "status": 200,
+        "body": {
+          "id": "39312703-e970-4914-ae56-8e7d7d1fd16b",
+          "tagid": "125",
+          "seatbid": [
+            {
+              "seat": "teads",
+              "bid": [
+                {
+                  "id": "695ac187-fb3f-4d1f-8d5d-099c5e4c4d28",
+                  "impid": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+                  "price": 33,
+                  "nurl": "https://localhost:8080/prebid-server/win-notice?data=base64&clearingPrice=${AUCTION_PRICE}",
+                  "adm": "{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"ads\":[{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"type\":\"VastXml\",\"content\":\"<VAST version=\\\"3.0\\\"><Ad id=\\\"1\\\"><Wrapper><AdSystem>Teads Technology</AdSystem><VASTAdTagURI><![CDATA[http://vast.tv?auction_publisher_cost=LlBEcMjl2WSVYTIV0ZvZwFta&auction_publisher_cost_currency=USD&auction_ssb_provider_fee=&auction_ssb_provider_fee_currency=&auction_price=74Xz11zXoN9S_a18chCl1DB6&auction_currency=USD]]></VASTAdTagURI><Error><![CDATA[https://localhost:18281/track?action=error-vast&code=[ERRORCODE]&pid=2&vid=708ca808-ec55-4d97-ab81-9c4777e16058&pfid=971104812&mediaFileType=[MEDIAFILETYPE]&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&sid=0&scid=971105412&pscid=971105411&psid=971105457&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&dsp_campaign_id=1&dsp_creative_id=1&env=thirdparty-inapp&p=GmbtDz8E6SttqPqekGLm3vHN7muObx7-w6kGLgR8KMiWgUo78VfzNzYlcfjjRwTen7Oad6lYvgPUaiHwDV0lZcpu7lXO4Y7at1NIyIPxfcgdBw&cts=1685971107728&1685971107728]]></Error><Creatives></Creatives></Wrapper></Ad></VAST>\",\"scenario_id\":971105412,\"dsp_campaign_id\":\"1\",\"dsp_creative_id\":\"1\",\"insertion_id\":1,\"placement_id\":2,\"portfolio_item_id\":971104812}],\"wigoEnabled\":false,\"placementMetadata\":{\"2\":{\"adCallTrackingUrl\":\"https://localhost:18281/track?action=adCall&pid=2&pageId=2&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&vid=708ca808-ec55-4d97-ab81-9c4777e16058&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&env=thirdparty-inapp&gtc=1&gdpr_apply=false&gac=1&gap=1&ca=false&bsg=uncat&bsias=uncat&pfid=971104812&gid=1&brid=0&cid=1&rpm_reason=3&ut=1&p=5fwoPMJCquIB-txdmwQS0l79-hhHVnlTzyR9mmnBMtZRceP6-q31KzCfLpS8WTNaw_sXr-hkOFBxaxa-jyLblbVc&cts=1685971107773&cs=267268361555465193905\",\"auctionId\":\"39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6\"}},\"viewerId\":\"708ca808-ec55-4d97-ab81-9c4777e16058\"}",
+                  "adid": "1",
+                  "adomain": [
+                    "teads.com"
+                  ],
+                  "cid": "1",
+                  "crid": "1",
+                  "cat": [
+                    "IAB1-6",
+                    "IAB10-5"
+                  ],
+                  "ext": {
+                    "prebid": {
+                      "meta": {
+                        "rendererName": "teads",
+                        "rendererVersion": "5.0.25",
+                        "rendererData": {
+                          "resize": true,
+                          "sdkEngineVersion": "189"
+                        }
+                      }
+                    }
+                  }
+                }
+              ]
+            }
+          ]
+        }
+      }
+    }
+  ],
+  "expectedBidResponses": [
+    {
+      "currency": "USD",
+      "bids": [
+        {
+          "bid": {
+            "id": "695ac187-fb3f-4d1f-8d5d-099c5e4c4d28",
+            "impid": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+            "price": 33,
+            "nurl": "https://localhost:8080/prebid-server/win-notice?data=base64&clearingPrice=${AUCTION_PRICE}",
+            "adm": "{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"ads\":[{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"type\":\"VastXml\",\"content\":\"<VAST version=\\\"3.0\\\"><Ad id=\\\"1\\\"><Wrapper><AdSystem>Teads Technology</AdSystem><VASTAdTagURI><![CDATA[http://vast.tv?auction_publisher_cost=LlBEcMjl2WSVYTIV0ZvZwFta&auction_publisher_cost_currency=USD&auction_ssb_provider_fee=&auction_ssb_provider_fee_currency=&auction_price=74Xz11zXoN9S_a18chCl1DB6&auction_currency=USD]]></VASTAdTagURI><Error><![CDATA[https://localhost:18281/track?action=error-vast&code=[ERRORCODE]&pid=2&vid=708ca808-ec55-4d97-ab81-9c4777e16058&pfid=971104812&mediaFileType=[MEDIAFILETYPE]&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&sid=0&scid=971105412&pscid=971105411&psid=971105457&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&dsp_campaign_id=1&dsp_creative_id=1&env=thirdparty-inapp&p=GmbtDz8E6SttqPqekGLm3vHN7muObx7-w6kGLgR8KMiWgUo78VfzNzYlcfjjRwTen7Oad6lYvgPUaiHwDV0lZcpu7lXO4Y7at1NIyIPxfcgdBw&cts=1685971107728&1685971107728]]></Error><Creatives></Creatives></Wrapper></Ad></VAST>\",\"scenario_id\":971105412,\"dsp_campaign_id\":\"1\",\"dsp_creative_id\":\"1\",\"insertion_id\":1,\"placement_id\":2,\"portfolio_item_id\":971104812}],\"wigoEnabled\":false,\"placementMetadata\":{\"2\":{\"adCallTrackingUrl\":\"https://localhost:18281/track?action=adCall&pid=2&pageId=2&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&vid=708ca808-ec55-4d97-ab81-9c4777e16058&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&env=thirdparty-inapp&gtc=1&gdpr_apply=false&gac=1&gap=1&ca=false&bsg=uncat&bsias=uncat&pfid=971104812&gid=1&brid=0&cid=1&rpm_reason=3&ut=1&p=5fwoPMJCquIB-txdmwQS0l79-hhHVnlTzyR9mmnBMtZRceP6-q31KzCfLpS8WTNaw_sXr-hkOFBxaxa-jyLblbVc&cts=1685971107773&cs=267268361555465193905\",\"auctionId\":\"39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6\"}},\"viewerId\":\"708ca808-ec55-4d97-ab81-9c4777e16058\"}",
+            "adid": "1",
+            "adomain": [
+              "teads.com"
+            ],
+            "cid": "1",
+            "crid": "1",
+            "cat": [
+              "IAB1-6",
+              "IAB10-5"
+            ],
+            "ext": {
+              "prebid": {
+                "meta": {
+                  "rendererName": "teads",
+                  "rendererVersion": "5.0.25",
+                  "rendererData": {
+                    "resize": true,
+                    "sdkEngineVersion": "189"
+                  }
+                }
+              }
+            }
+          },
+          "type": "video"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/adapters/teads/teadstest/supplemental/bid-id-does-not-match.json b/adapters/teads/teadstest/supplemental/bid-id-does-not-match.json
new file mode 100644
index 00000000..384e72fb
--- /dev/null
+++ b/adapters/teads/teadstest/supplemental/bid-id-does-not-match.json
@@ -0,0 +1,152 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id",
+    "imp": [
+      {
+        "id": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+        "video": {
+          "mimes": [
+            "video/mp4"
+          ],
+          "minduration": 15,
+          "maxduration": 30,
+          "protocols": [
+            2,
+            3,
+            5,
+            6,
+            7,
+            8
+          ],
+          "w": 940,
+          "h": 560
+        },
+        "ext": {
+          "bidder": {
+            "placementId": 125
+          }
+        }
+      }
+    ],
+    "ext": {
+      "prebid": {
+        "sdk": {
+          "renderers": [
+            {
+              "name": "teads",
+              "version": "5.0.25",
+              "data": {
+                "resize": true,
+                "sdkEngineVersion": "189"
+              }
+            }
+          ]
+        }
+      }
+    }
+  },
+  "httpCalls": [
+    {
+      "expectedRequest": {
+        "uri": "https://a.teads.tv/prebid-server/bid-request",
+        "body": {
+          "id": "test-request-id",
+          "imp": [
+            {
+              "id": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+              "tagid": "125",
+              "video": {
+                "mimes": [
+                  "video/mp4"
+                ],
+                "minduration": 15,
+                "maxduration": 30,
+                "protocols": [
+                  2,
+                  3,
+                  5,
+                  6,
+                  7,
+                  8
+                ],
+                "w": 940,
+                "h": 560
+              },
+              "ext": {
+                "kv": {
+                  "placementId": 125
+                }
+              }
+            }
+          ],
+          "ext": {
+            "prebid": {
+              "sdk": {
+                "renderers": [
+                  {
+                    "name": "teads",
+                    "version": "5.0.25",
+                    "data": {
+                      "resize": true,
+                      "sdkEngineVersion": "189"
+                    }
+                  }
+                ]
+              }
+            }
+          }
+        }
+      },
+      "mockResponse": {
+        "status": 200,
+        "body": {
+          "id": "39312703-e970-4914-ae56-8e7d7d1fd16b",
+          "cur": "EUR",
+          "tagid": "125",
+          "seatbid": [
+            {
+              "seat": "teads",
+              "bid": [
+                {
+                  "id": "695ac187-fb3f-4d1f-8d5d-099c5e4c4d28",
+                  "impid": "does-not-match",
+                  "price": 33,
+                  "nurl": "https://localhost:8080/prebid-server/win-notice?data=base64&clearingPrice=${AUCTION_PRICE}",
+                  "adm": "{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"ads\":[{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"type\":\"VastXml\",\"content\":\"<VAST version=\\\"3.0\\\"><Ad id=\\\"1\\\"><Wrapper><AdSystem>Teads Technology</AdSystem><VASTAdTagURI><![CDATA[http://vast.tv?auction_publisher_cost=LlBEcMjl2WSVYTIV0ZvZwFta&auction_publisher_cost_currency=USD&auction_ssb_provider_fee=&auction_ssb_provider_fee_currency=&auction_price=74Xz11zXoN9S_a18chCl1DB6&auction_currency=USD]]></VASTAdTagURI><Error><![CDATA[https://localhost:18281/track?action=error-vast&code=[ERRORCODE]&pid=2&vid=708ca808-ec55-4d97-ab81-9c4777e16058&pfid=971104812&mediaFileType=[MEDIAFILETYPE]&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&sid=0&scid=971105412&pscid=971105411&psid=971105457&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&dsp_campaign_id=1&dsp_creative_id=1&env=thirdparty-inapp&p=GmbtDz8E6SttqPqekGLm3vHN7muObx7-w6kGLgR8KMiWgUo78VfzNzYlcfjjRwTen7Oad6lYvgPUaiHwDV0lZcpu7lXO4Y7at1NIyIPxfcgdBw&cts=1685971107728&1685971107728]]></Error><Creatives></Creatives></Wrapper></Ad></VAST>\",\"scenario_id\":971105412,\"dsp_campaign_id\":\"1\",\"dsp_creative_id\":\"1\",\"insertion_id\":1,\"placement_id\":2,\"portfolio_item_id\":971104812}],\"wigoEnabled\":false,\"placementMetadata\":{\"2\":{\"adCallTrackingUrl\":\"https://localhost:18281/track?action=adCall&pid=2&pageId=2&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&vid=708ca808-ec55-4d97-ab81-9c4777e16058&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&env=thirdparty-inapp&gtc=1&gdpr_apply=false&gac=1&gap=1&ca=false&bsg=uncat&bsias=uncat&pfid=971104812&gid=1&brid=0&cid=1&rpm_reason=3&ut=1&p=5fwoPMJCquIB-txdmwQS0l79-hhHVnlTzyR9mmnBMtZRceP6-q31KzCfLpS8WTNaw_sXr-hkOFBxaxa-jyLblbVc&cts=1685971107773&cs=267268361555465193905\",\"auctionId\":\"39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6\"}},\"viewerId\":\"708ca808-ec55-4d97-ab81-9c4777e16058\"}",
+                  "adid": "1",
+                  "adomain": [
+                    "teads.com"
+                  ],
+                  "cid": "1",
+                  "crid": "1",
+                  "cat": [
+                    "IAB1-6",
+                    "IAB10-5"
+                  ],
+                  "ext": {
+                    "prebid": {
+                      "meta": {
+                        "rendererName": "teads",
+                        "rendererVersion": "5.0.25",
+                        "rendererData": {
+                          "resize": true,
+                          "sdkEngineVersion": "189"
+                        }
+                      }
+                    }
+                  }
+                }
+              ]
+            }
+          ]
+        }
+      }
+    }
+  ],
+  "expectedMakeBidsErrors": [
+    {
+      "value": "Imp ids were not equals",
+      "comparison": "literal"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/adapters/teads/teadstest/supplemental/currency-empty-string.json b/adapters/teads/teadstest/supplemental/currency-empty-string.json
new file mode 100644
index 00000000..5f0d700b
--- /dev/null
+++ b/adapters/teads/teadstest/supplemental/currency-empty-string.json
@@ -0,0 +1,185 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id",
+    "imp": [
+      {
+        "id": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+        "video": {
+          "mimes": [
+            "video/mp4"
+          ],
+          "minduration": 15,
+          "maxduration": 30,
+          "protocols": [
+            2,
+            3,
+            5,
+            6,
+            7,
+            8
+          ],
+          "w": 940,
+          "h": 560
+        },
+        "ext": {
+          "bidder": {
+            "placementId": 125
+          }
+        }
+      }
+    ],
+    "ext": {
+      "prebid": {
+        "sdk": {
+          "renderers": [
+            {
+              "name": "teads",
+              "version": "5.0.25",
+              "data": {
+                "resize": true,
+                "sdkEngineVersion": "189"
+              }
+            }
+          ]
+        }
+      }
+    }
+  },
+  "httpCalls": [
+    {
+      "expectedRequest": {
+        "uri": "https://a.teads.tv/prebid-server/bid-request",
+        "body": {
+          "id": "test-request-id",
+          "imp": [
+            {
+              "id": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+              "tagid": "125",
+              "video": {
+                "mimes": [
+                  "video/mp4"
+                ],
+                "minduration": 15,
+                "maxduration": 30,
+                "protocols": [
+                  2,
+                  3,
+                  5,
+                  6,
+                  7,
+                  8
+                ],
+                "w": 940,
+                "h": 560
+              },
+              "ext": {
+                "kv": {
+                  "placementId": 125
+                }
+              }
+            }
+          ],
+          "ext": {
+            "prebid": {
+              "sdk": {
+                "renderers": [
+                  {
+                    "name": "teads",
+                    "version": "5.0.25",
+                    "data": {
+                      "resize": true,
+                      "sdkEngineVersion": "189"
+                    }
+                  }
+                ]
+              }
+            }
+          }
+        }
+      },
+      "mockResponse": {
+        "status": 200,
+        "body": {
+          "id": "39312703-e970-4914-ae56-8e7d7d1fd16b",
+          "cur": "EUR",
+          "tagid": "125",
+          "seatbid": [
+            {
+              "seat": "teads",
+              "bid": [
+                {
+                  "id": "695ac187-fb3f-4d1f-8d5d-099c5e4c4d28",
+                  "impid": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+                  "price": 33,
+                  "nurl": "https://localhost:8080/prebid-server/win-notice?data=base64&clearingPrice=${AUCTION_PRICE}",
+                  "adm": "{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"ads\":[{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"type\":\"VastXml\",\"content\":\"<VAST version=\\\"3.0\\\"><Ad id=\\\"1\\\"><Wrapper><AdSystem>Teads Technology</AdSystem><VASTAdTagURI><![CDATA[http://vast.tv?auction_publisher_cost=LlBEcMjl2WSVYTIV0ZvZwFta&auction_publisher_cost_currency=USD&auction_ssb_provider_fee=&auction_ssb_provider_fee_currency=&auction_price=74Xz11zXoN9S_a18chCl1DB6&auction_currency=USD]]></VASTAdTagURI><Error><![CDATA[https://localhost:18281/track?action=error-vast&code=[ERRORCODE]&pid=2&vid=708ca808-ec55-4d97-ab81-9c4777e16058&pfid=971104812&mediaFileType=[MEDIAFILETYPE]&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&sid=0&scid=971105412&pscid=971105411&psid=971105457&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&dsp_campaign_id=1&dsp_creative_id=1&env=thirdparty-inapp&p=GmbtDz8E6SttqPqekGLm3vHN7muObx7-w6kGLgR8KMiWgUo78VfzNzYlcfjjRwTen7Oad6lYvgPUaiHwDV0lZcpu7lXO4Y7at1NIyIPxfcgdBw&cts=1685971107728&1685971107728]]></Error><Creatives></Creatives></Wrapper></Ad></VAST>\",\"scenario_id\":971105412,\"dsp_campaign_id\":\"1\",\"dsp_creative_id\":\"1\",\"insertion_id\":1,\"placement_id\":2,\"portfolio_item_id\":971104812}],\"wigoEnabled\":false,\"placementMetadata\":{\"2\":{\"adCallTrackingUrl\":\"https://localhost:18281/track?action=adCall&pid=2&pageId=2&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&vid=708ca808-ec55-4d97-ab81-9c4777e16058&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&env=thirdparty-inapp&gtc=1&gdpr_apply=false&gac=1&gap=1&ca=false&bsg=uncat&bsias=uncat&pfid=971104812&gid=1&brid=0&cid=1&rpm_reason=3&ut=1&p=5fwoPMJCquIB-txdmwQS0l79-hhHVnlTzyR9mmnBMtZRceP6-q31KzCfLpS8WTNaw_sXr-hkOFBxaxa-jyLblbVc&cts=1685971107773&cs=267268361555465193905\",\"auctionId\":\"39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6\"}},\"viewerId\":\"708ca808-ec55-4d97-ab81-9c4777e16058\"}",
+                  "adid": "1",
+                  "adomain": [
+                    "teads.com"
+                  ],
+                  "cid": "1",
+                  "crid": "1",
+                  "cat": [
+                    "IAB1-6",
+                    "IAB10-5"
+                  ],
+                  "ext": {
+                    "prebid": {
+                      "meta": {
+                        "rendererName": "teads",
+                        "rendererVersion": "5.0.25",
+                        "rendererData": {
+                          "resize": true,
+                          "sdkEngineVersion": "189"
+                        }
+                      }
+                    }
+                  }
+                }
+              ]
+            }
+          ]
+        }
+      }
+    }
+  ],
+  "expectedBidResponses": [
+    {
+      "currency": "EUR",
+      "bids": [
+        {
+          "bid": {
+            "id": "695ac187-fb3f-4d1f-8d5d-099c5e4c4d28",
+            "impid": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+            "price": 33,
+            "nurl": "https://localhost:8080/prebid-server/win-notice?data=base64&clearingPrice=${AUCTION_PRICE}",
+            "adm": "{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"ads\":[{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"type\":\"VastXml\",\"content\":\"<VAST version=\\\"3.0\\\"><Ad id=\\\"1\\\"><Wrapper><AdSystem>Teads Technology</AdSystem><VASTAdTagURI><![CDATA[http://vast.tv?auction_publisher_cost=LlBEcMjl2WSVYTIV0ZvZwFta&auction_publisher_cost_currency=USD&auction_ssb_provider_fee=&auction_ssb_provider_fee_currency=&auction_price=74Xz11zXoN9S_a18chCl1DB6&auction_currency=USD]]></VASTAdTagURI><Error><![CDATA[https://localhost:18281/track?action=error-vast&code=[ERRORCODE]&pid=2&vid=708ca808-ec55-4d97-ab81-9c4777e16058&pfid=971104812&mediaFileType=[MEDIAFILETYPE]&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&sid=0&scid=971105412&pscid=971105411&psid=971105457&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&dsp_campaign_id=1&dsp_creative_id=1&env=thirdparty-inapp&p=GmbtDz8E6SttqPqekGLm3vHN7muObx7-w6kGLgR8KMiWgUo78VfzNzYlcfjjRwTen7Oad6lYvgPUaiHwDV0lZcpu7lXO4Y7at1NIyIPxfcgdBw&cts=1685971107728&1685971107728]]></Error><Creatives></Creatives></Wrapper></Ad></VAST>\",\"scenario_id\":971105412,\"dsp_campaign_id\":\"1\",\"dsp_creative_id\":\"1\",\"insertion_id\":1,\"placement_id\":2,\"portfolio_item_id\":971104812}],\"wigoEnabled\":false,\"placementMetadata\":{\"2\":{\"adCallTrackingUrl\":\"https://localhost:18281/track?action=adCall&pid=2&pageId=2&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&vid=708ca808-ec55-4d97-ab81-9c4777e16058&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&env=thirdparty-inapp&gtc=1&gdpr_apply=false&gac=1&gap=1&ca=false&bsg=uncat&bsias=uncat&pfid=971104812&gid=1&brid=0&cid=1&rpm_reason=3&ut=1&p=5fwoPMJCquIB-txdmwQS0l79-hhHVnlTzyR9mmnBMtZRceP6-q31KzCfLpS8WTNaw_sXr-hkOFBxaxa-jyLblbVc&cts=1685971107773&cs=267268361555465193905\",\"auctionId\":\"39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6\"}},\"viewerId\":\"708ca808-ec55-4d97-ab81-9c4777e16058\"}",
+            "adid": "1",
+            "adomain": [
+              "teads.com"
+            ],
+            "cid": "1",
+            "crid": "1",
+            "cat": [
+              "IAB1-6",
+              "IAB10-5"
+            ],
+            "ext": {
+              "prebid": {
+                "meta": {
+                  "rendererName": "teads",
+                  "rendererVersion": "5.0.25",
+                  "rendererData": {
+                    "resize": true,
+                    "sdkEngineVersion": "189"
+                  }
+                }
+              }
+            }
+          },
+          "type": "video"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/adapters/teads/teadstest/supplemental/no-impression-response.json b/adapters/teads/teadstest/supplemental/no-impression-response.json
new file mode 100644
index 00000000..814569a4
--- /dev/null
+++ b/adapters/teads/teadstest/supplemental/no-impression-response.json
@@ -0,0 +1,184 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id",
+    "imp": [
+      {
+        "id": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+        "video": {
+          "mimes": [
+            "video/mp4"
+          ],
+          "minduration": 15,
+          "maxduration": 30,
+          "protocols": [
+            2,
+            3,
+            5,
+            6,
+            7,
+            8
+          ],
+          "w": 940,
+          "h": 560
+        },
+        "ext": {
+          "bidder": {
+            "placementId": 125
+          }
+        }
+      }
+    ],
+    "ext": {
+      "prebid": {
+        "sdk": {
+          "renderers": [
+            {
+              "name": "teads",
+              "version": "5.0.25",
+              "data": {
+                "resize": true,
+                "sdkEngineVersion": "189"
+              }
+            }
+          ]
+        }
+      }
+    }
+  },
+  "httpCalls": [
+    {
+      "expectedRequest": {
+        "uri": "https://a.teads.tv/prebid-server/bid-request",
+        "body": {
+          "id": "test-request-id",
+          "imp": [
+            {
+              "id": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+              "tagid": "125",
+              "video": {
+                "mimes": [
+                  "video/mp4"
+                ],
+                "minduration": 15,
+                "maxduration": 30,
+                "protocols": [
+                  2,
+                  3,
+                  5,
+                  6,
+                  7,
+                  8
+                ],
+                "w": 940,
+                "h": 560
+              },
+              "ext": {
+                "kv": {
+                  "placementId": 125
+                }
+              }
+            }
+          ],
+          "ext": {
+            "prebid": {
+              "sdk": {
+                "renderers": [
+                  {
+                    "name": "teads",
+                    "version": "5.0.25",
+                    "data": {
+                      "resize": true,
+                      "sdkEngineVersion": "189"
+                    }
+                  }
+                ]
+              }
+            }
+          }
+        }
+      },
+      "mockResponse": {
+        "status": 200,
+        "body": {
+          "id": "39312703-e970-4914-ae56-8e7d7d1fd16b",
+          "tagid": "125",
+          "seatbid": [
+            {
+              "seat": "teads",
+              "bid": [
+                {
+                  "id": "695ac187-fb3f-4d1f-8d5d-099c5e4c4d28",
+                  "impid": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+                  "price": 33,
+                  "nurl": "https://localhost:8080/prebid-server/win-notice?data=base64&clearingPrice=${AUCTION_PRICE}",
+                  "adm": "{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"ads\":[{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"type\":\"VastXml\",\"content\":\"<VAST version=\\\"3.0\\\"><Ad id=\\\"1\\\"><Wrapper><AdSystem>Teads Technology</AdSystem><VASTAdTagURI><![CDATA[http://vast.tv?auction_publisher_cost=LlBEcMjl2WSVYTIV0ZvZwFta&auction_publisher_cost_currency=USD&auction_ssb_provider_fee=&auction_ssb_provider_fee_currency=&auction_price=74Xz11zXoN9S_a18chCl1DB6&auction_currency=USD]]></VASTAdTagURI><Error><![CDATA[https://localhost:18281/track?action=error-vast&code=[ERRORCODE]&pid=2&vid=708ca808-ec55-4d97-ab81-9c4777e16058&pfid=971104812&mediaFileType=[MEDIAFILETYPE]&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&sid=0&scid=971105412&pscid=971105411&psid=971105457&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&dsp_campaign_id=1&dsp_creative_id=1&env=thirdparty-inapp&p=GmbtDz8E6SttqPqekGLm3vHN7muObx7-w6kGLgR8KMiWgUo78VfzNzYlcfjjRwTen7Oad6lYvgPUaiHwDV0lZcpu7lXO4Y7at1NIyIPxfcgdBw&cts=1685971107728&1685971107728]]></Error><Creatives></Creatives></Wrapper></Ad></VAST>\",\"scenario_id\":971105412,\"dsp_campaign_id\":\"1\",\"dsp_creative_id\":\"1\",\"insertion_id\":1,\"placement_id\":2,\"portfolio_item_id\":971104812}],\"wigoEnabled\":false,\"placementMetadata\":{\"2\":{\"adCallTrackingUrl\":\"https://localhost:18281/track?action=adCall&pid=2&pageId=2&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&vid=708ca808-ec55-4d97-ab81-9c4777e16058&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&env=thirdparty-inapp&gtc=1&gdpr_apply=false&gac=1&gap=1&ca=false&bsg=uncat&bsias=uncat&pfid=971104812&gid=1&brid=0&cid=1&rpm_reason=3&ut=1&p=5fwoPMJCquIB-txdmwQS0l79-hhHVnlTzyR9mmnBMtZRceP6-q31KzCfLpS8WTNaw_sXr-hkOFBxaxa-jyLblbVc&cts=1685971107773&cs=267268361555465193905\",\"auctionId\":\"39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6\"}},\"viewerId\":\"708ca808-ec55-4d97-ab81-9c4777e16058\"}",
+                  "adid": "1",
+                  "adomain": [
+                    "teads.com"
+                  ],
+                  "cid": "1",
+                  "crid": "1",
+                  "cat": [
+                    "IAB1-6",
+                    "IAB10-5"
+                  ],
+                  "ext": {
+                    "prebid": {
+                      "meta": {
+                        "rendererName": "teads",
+                        "rendererVersion": "5.0.25",
+                        "rendererData": {
+                          "resize": true,
+                          "sdkEngineVersion": "189"
+                        }
+                      }
+                    }
+                  }
+                }
+              ]
+            }
+          ]
+        }
+      }
+    }
+  ],
+  "expectedBidResponses": [
+    {
+      "currency": "USD",
+      "bids": [
+        {
+          "bid": {
+            "id": "695ac187-fb3f-4d1f-8d5d-099c5e4c4d28",
+            "impid": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+            "price": 33,
+            "nurl": "https://localhost:8080/prebid-server/win-notice?data=base64&clearingPrice=${AUCTION_PRICE}",
+            "adm": "{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"ads\":[{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"type\":\"VastXml\",\"content\":\"<VAST version=\\\"3.0\\\"><Ad id=\\\"1\\\"><Wrapper><AdSystem>Teads Technology</AdSystem><VASTAdTagURI><![CDATA[http://vast.tv?auction_publisher_cost=LlBEcMjl2WSVYTIV0ZvZwFta&auction_publisher_cost_currency=USD&auction_ssb_provider_fee=&auction_ssb_provider_fee_currency=&auction_price=74Xz11zXoN9S_a18chCl1DB6&auction_currency=USD]]></VASTAdTagURI><Error><![CDATA[https://localhost:18281/track?action=error-vast&code=[ERRORCODE]&pid=2&vid=708ca808-ec55-4d97-ab81-9c4777e16058&pfid=971104812&mediaFileType=[MEDIAFILETYPE]&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&sid=0&scid=971105412&pscid=971105411&psid=971105457&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&dsp_campaign_id=1&dsp_creative_id=1&env=thirdparty-inapp&p=GmbtDz8E6SttqPqekGLm3vHN7muObx7-w6kGLgR8KMiWgUo78VfzNzYlcfjjRwTen7Oad6lYvgPUaiHwDV0lZcpu7lXO4Y7at1NIyIPxfcgdBw&cts=1685971107728&1685971107728]]></Error><Creatives></Creatives></Wrapper></Ad></VAST>\",\"scenario_id\":971105412,\"dsp_campaign_id\":\"1\",\"dsp_creative_id\":\"1\",\"insertion_id\":1,\"placement_id\":2,\"portfolio_item_id\":971104812}],\"wigoEnabled\":false,\"placementMetadata\":{\"2\":{\"adCallTrackingUrl\":\"https://localhost:18281/track?action=adCall&pid=2&pageId=2&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&vid=708ca808-ec55-4d97-ab81-9c4777e16058&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&env=thirdparty-inapp&gtc=1&gdpr_apply=false&gac=1&gap=1&ca=false&bsg=uncat&bsias=uncat&pfid=971104812&gid=1&brid=0&cid=1&rpm_reason=3&ut=1&p=5fwoPMJCquIB-txdmwQS0l79-hhHVnlTzyR9mmnBMtZRceP6-q31KzCfLpS8WTNaw_sXr-hkOFBxaxa-jyLblbVc&cts=1685971107773&cs=267268361555465193905\",\"auctionId\":\"39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6\"}},\"viewerId\":\"708ca808-ec55-4d97-ab81-9c4777e16058\"}",
+            "adid": "1",
+            "adomain": [
+              "teads.com"
+            ],
+            "cid": "1",
+            "crid": "1",
+            "cat": [
+              "IAB1-6",
+              "IAB10-5"
+            ],
+            "ext": {
+              "prebid": {
+                "meta": {
+                  "rendererName": "teads",
+                  "rendererVersion": "5.0.25",
+                  "rendererData": {
+                    "resize": true,
+                    "sdkEngineVersion": "189"
+                  }
+                }
+              }
+            }
+          },
+          "type": "video"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/adapters/teads/teadstest/supplemental/no-impression.json b/adapters/teads/teadstest/supplemental/no-impression.json
new file mode 100644
index 00000000..7b1cdceb
--- /dev/null
+++ b/adapters/teads/teadstest/supplemental/no-impression.json
@@ -0,0 +1,12 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id"
+  },
+
+  "expectedMakeRequestsErrors": [
+    {
+      "value": "No impression in the bid request",
+      "comparison": "literal"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/adapters/teads/teadstest/supplemental/no-placementId.json b/adapters/teads/teadstest/supplemental/no-placementId.json
new file mode 100644
index 00000000..e343bc82
--- /dev/null
+++ b/adapters/teads/teadstest/supplemental/no-placementId.json
@@ -0,0 +1,28 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id",
+    "imp": [
+      {
+        "id": "test-imp-id-1",
+        "banner": {
+          "format": [
+            {
+              "w": 300,
+              "h": 250
+            }
+          ]
+        },
+        "ext": {
+          "bidder": {}
+        }
+      }
+    ]
+  },
+
+  "expectedMakeRequestsErrors": [
+    {
+      "value": "placementId should not be 0.",
+      "comparison": "literal"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/adapters/teads/teadstest/supplemental/renderer-name-empty.json b/adapters/teads/teadstest/supplemental/renderer-name-empty.json
new file mode 100644
index 00000000..da4ee9a5
--- /dev/null
+++ b/adapters/teads/teadstest/supplemental/renderer-name-empty.json
@@ -0,0 +1,143 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id",
+    "imp": [
+      {
+        "id": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+        "video": {
+          "mimes": [
+            "video/mp4"
+          ],
+          "minduration": 15,
+          "maxduration": 30,
+          "protocols": [
+            2,
+            3
+          ],
+          "w": 940,
+          "h": 560
+        },
+        "ext": {
+          "bidder": {
+            "placementId": 125
+          }
+        }
+      }
+    ],
+    "ext": {
+      "prebid": {
+        "sdk": {
+          "renderers": [
+            {
+              "name": "",
+              "version": "5.0.25",
+              "data": {
+                "resize": true,
+                "sdkEngineVersion": "189"
+              }
+            }
+          ]
+        }
+      }
+    }
+  },
+  "httpCalls": [
+    {
+      "expectedRequest": {
+        "uri": "https://a.teads.tv/prebid-server/bid-request",
+        "body": {
+          "id": "test-request-id",
+          "imp": [
+            {
+              "id": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+              "tagid": "125",
+              "video": {
+                "mimes": [
+                  "video/mp4"
+                ],
+                "minduration": 15,
+                "maxduration": 30,
+                "protocols": [
+                  2,
+                  3
+                ],
+                "w": 940,
+                "h": 560
+              },
+              "ext": {
+                "kv": {
+                  "placementId": 125
+                }
+              }
+            }
+          ],
+          "ext": {
+            "prebid": {
+              "sdk": {
+                "renderers": [
+                  {
+                    "name": "",
+                    "version": "5.0.25",
+                    "data": {
+                      "resize": true,
+                      "sdkEngineVersion": "189"
+                    }
+                  }
+                ]
+              }
+            }
+          }
+        }
+      },
+      "mockResponse": {
+        "status": 200,
+        "body": {
+          "id": "39312703-e970-4914-ae56-8e7d7d1fd16b",
+          "tagid": "125",
+          "seatbid": [
+            {
+              "seat": "teads",
+              "bid": [
+                {
+                  "id": "695ac187-fb3f-4d1f-8d5d-099c5e4c4d28",
+                  "impid": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+                  "price": 33,
+                  "nurl": "https://localhost:8080/prebid-server/win-notice?data=base64&clearingPrice=${AUCTION_PRICE}",
+                  "adm": "{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"ads\":[{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"type\":\"VastXml\",\"content\":\"<VAST version=\\\"3.0\\\"><Ad id=\\\"1\\\"><Wrapper><AdSystem>Teads Technology</AdSystem><VASTAdTagURI><![CDATA[http://vast.tv?auction_publisher_cost=LlBEcMjl2WSVYTIV0ZvZwFta&auction_publisher_cost_currency=USD&auction_ssb_provider_fee=&auction_ssb_provider_fee_currency=&auction_price=74Xz11zXoN9S_a18chCl1DB6&auction_currency=USD]]></VASTAdTagURI><Error><![CDATA[https://localhost:18281/track?action=error-vast&code=[ERRORCODE]&pid=2&vid=708ca808-ec55-4d97-ab81-9c4777e16058&pfid=971104812&mediaFileType=[MEDIAFILETYPE]&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&sid=0&scid=971105412&pscid=971105411&psid=971105457&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&dsp_campaign_id=1&dsp_creative_id=1&env=thirdparty-inapp&p=GmbtDz8E6SttqPqekGLm3vHN7muObx7-w6kGLgR8KMiWgUo78VfzNzYlcfjjRwTen7Oad6lYvgPUaiHwDV0lZcpu7lXO4Y7at1NIyIPxfcgdBw&cts=1685971107728&1685971107728]]></Error><Creatives></Creatives></Wrapper></Ad></VAST>\",\"scenario_id\":971105412,\"dsp_campaign_id\":\"1\",\"dsp_creative_id\":\"1\",\"insertion_id\":1,\"placement_id\":2,\"portfolio_item_id\":971104812}],\"wigoEnabled\":false,\"placementMetadata\":{\"2\":{\"adCallTrackingUrl\":\"https://localhost:18281/track?action=adCall&pid=2&pageId=2&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&vid=708ca808-ec55-4d97-ab81-9c4777e16058&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&env=thirdparty-inapp&gtc=1&gdpr_apply=false&gac=1&gap=1&ca=false&bsg=uncat&bsias=uncat&pfid=971104812&gid=1&brid=0&cid=1&rpm_reason=3&ut=1&p=5fwoPMJCquIB-txdmwQS0l79-hhHVnlTzyR9mmnBMtZRceP6-q31KzCfLpS8WTNaw_sXr-hkOFBxaxa-jyLblbVc&cts=1685971107773&cs=267268361555465193905\",\"auctionId\":\"39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6\"}},\"viewerId\":\"708ca808-ec55-4d97-ab81-9c4777e16058\"}",
+                  "adid": "1",
+                  "adomain": [
+                    "teads.com"
+                  ],
+                  "cid": "1",
+                  "crid": "1",
+                  "cat": [
+                    "IAB1-6",
+                    "IAB10-5"
+                  ],
+                  "ext": {
+                    "prebid": {
+                      "meta": {
+                        "rendererName": "",
+                        "rendererVersion": "5.0.25",
+                        "rendererData": {
+                          "resize": true,
+                          "sdkEngineVersion": "189"
+                        }
+                      }
+                    }
+                  }
+                }
+              ]
+            }
+          ]
+        }
+      }
+    }
+  ],
+  "expectedMakeBidsErrors": [
+    {
+      "value": "RendererName should not be empty if present",
+      "comparison": "literal"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/adapters/teads/teadstest/supplemental/renderer-version-empty.json b/adapters/teads/teadstest/supplemental/renderer-version-empty.json
new file mode 100644
index 00000000..e9e7b278
--- /dev/null
+++ b/adapters/teads/teadstest/supplemental/renderer-version-empty.json
@@ -0,0 +1,143 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id",
+    "imp": [
+      {
+        "id": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+        "video": {
+          "mimes": [
+            "video/mp4"
+          ],
+          "minduration": 15,
+          "maxduration": 30,
+          "protocols": [
+            2,
+            3
+          ],
+          "w": 940,
+          "h": 560
+        },
+        "ext": {
+          "bidder": {
+            "placementId": 125
+          }
+        }
+      }
+    ],
+    "ext": {
+      "prebid": {
+        "sdk": {
+          "renderers": [
+            {
+              "name": "teads",
+              "version": "",
+              "data": {
+                "resize": true,
+                "sdkEngineVersion": "189"
+              }
+            }
+          ]
+        }
+      }
+    }
+  },
+  "httpCalls": [
+    {
+      "expectedRequest": {
+        "uri": "https://a.teads.tv/prebid-server/bid-request",
+        "body": {
+          "id": "test-request-id",
+          "imp": [
+            {
+              "id": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+              "tagid": "125",
+              "video": {
+                "mimes": [
+                  "video/mp4"
+                ],
+                "minduration": 15,
+                "maxduration": 30,
+                "protocols": [
+                  2,
+                  3
+                ],
+                "w": 940,
+                "h": 560
+              },
+              "ext": {
+                "kv": {
+                  "placementId": 125
+                }
+              }
+            }
+          ],
+          "ext": {
+            "prebid": {
+              "sdk": {
+                "renderers": [
+                  {
+                    "name": "teads",
+                    "version": "",
+                    "data": {
+                      "resize": true,
+                      "sdkEngineVersion": "189"
+                    }
+                  }
+                ]
+              }
+            }
+          }
+        }
+      },
+      "mockResponse": {
+        "status": 200,
+        "body": {
+          "id": "39312703-e970-4914-ae56-8e7d7d1fd16b",
+          "tagid": "125",
+          "seatbid": [
+            {
+              "seat": "teads",
+              "bid": [
+                {
+                  "id": "695ac187-fb3f-4d1f-8d5d-099c5e4c4d28",
+                  "impid": "b6321d41-3840-4cb3-baad-b6fc5b0c8553",
+                  "price": 33,
+                  "nurl": "https://localhost:8080/prebid-server/win-notice?data=base64&clearingPrice=${AUCTION_PRICE}",
+                  "adm": "{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"ads\":[{\"settings\":{\"values\":{\"animations\":{\"expand\":0,\"collapse\":0.5},\"placementId\":2,\"adType\":\"video\",\"placementFormat\":\"inread\",\"allowedPlayer\":\"any\",\"pageId\":2},\"components\":{\"closeButton\":{\"display\":false,\"countdown\":0},\"credits\":{\"display\":false},\"soundButton\":{\"display\":true,\"countdown\":0,\"type\":\"equalizer\"},\"label\":{\"display\":false},\"slider\":{\"closeButtonDisplay\":false}},\"behaviors\":{\"smartPosition\":{\"top\":false,\"corner\":false,\"mustBypassWhitelist\":true},\"slider\":{\"enable\":false},\"friendly\":false,\"playerClick\":\"fullscreen\",\"soundStart\":{\"type\":\"mute\"},\"soundMute\":\"threshold\",\"soundOver\":\"over\",\"launch\":\"auto\",\"videoStart\":\"threshold\",\"videoPause\":\"threshold\",\"secure\":false}},\"type\":\"VastXml\",\"content\":\"<VAST version=\\\"3.0\\\"><Ad id=\\\"1\\\"><Wrapper><AdSystem>Teads Technology</AdSystem><VASTAdTagURI><![CDATA[http://vast.tv?auction_publisher_cost=LlBEcMjl2WSVYTIV0ZvZwFta&auction_publisher_cost_currency=USD&auction_ssb_provider_fee=&auction_ssb_provider_fee_currency=&auction_price=74Xz11zXoN9S_a18chCl1DB6&auction_currency=USD]]></VASTAdTagURI><Error><![CDATA[https://localhost:18281/track?action=error-vast&code=[ERRORCODE]&pid=2&vid=708ca808-ec55-4d97-ab81-9c4777e16058&pfid=971104812&mediaFileType=[MEDIAFILETYPE]&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&sid=0&scid=971105412&pscid=971105411&psid=971105457&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&dsp_campaign_id=1&dsp_creative_id=1&env=thirdparty-inapp&p=GmbtDz8E6SttqPqekGLm3vHN7muObx7-w6kGLgR8KMiWgUo78VfzNzYlcfjjRwTen7Oad6lYvgPUaiHwDV0lZcpu7lXO4Y7at1NIyIPxfcgdBw&cts=1685971107728&1685971107728]]></Error><Creatives></Creatives></Wrapper></Ad></VAST>\",\"scenario_id\":971105412,\"dsp_campaign_id\":\"1\",\"dsp_creative_id\":\"1\",\"insertion_id\":1,\"placement_id\":2,\"portfolio_item_id\":971104812}],\"wigoEnabled\":false,\"placementMetadata\":{\"2\":{\"adCallTrackingUrl\":\"https://localhost:18281/track?action=adCall&pid=2&pageId=2&auctid=39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6&vid=708ca808-ec55-4d97-ab81-9c4777e16058&hb_provider=prebid-server&hb_ad_unit_code=742d38c4-7994-4c2b-ac82-18d3a64ba3c7&env=thirdparty-inapp&gtc=1&gdpr_apply=false&gac=1&gap=1&ca=false&bsg=uncat&bsias=uncat&pfid=971104812&gid=1&brid=0&cid=1&rpm_reason=3&ut=1&p=5fwoPMJCquIB-txdmwQS0l79-hhHVnlTzyR9mmnBMtZRceP6-q31KzCfLpS8WTNaw_sXr-hkOFBxaxa-jyLblbVc&cts=1685971107773&cs=267268361555465193905\",\"auctionId\":\"39312703-e970-4914-ae56-8e7d7d1fd16b__b6321d41-3840-4cb3-baad-b6fc5b0c8553__c0f2e6ba-63d0-4e20-ab41-fe0822eb65a6\"}},\"viewerId\":\"708ca808-ec55-4d97-ab81-9c4777e16058\"}",
+                  "adid": "1",
+                  "adomain": [
+                    "teads.com"
+                  ],
+                  "cid": "1",
+                  "crid": "1",
+                  "cat": [
+                    "IAB1-6",
+                    "IAB10-5"
+                  ],
+                  "ext": {
+                    "prebid": {
+                      "meta": {
+                        "rendererName": "teads",
+                        "rendererVersion": "",
+                        "rendererData": {
+                          "resize": true,
+                          "sdkEngineVersion": "189"
+                        }
+                      }
+                    }
+                  }
+                }
+              ]
+            }
+          ]
+        }
+      }
+    }
+  ],
+  "expectedMakeBidsErrors": [
+    {
+      "value": "RendererVersion should not be empty if present",
+      "comparison": "literal"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/adapters/teads/teadstest/supplemental/status-400.json b/adapters/teads/teadstest/supplemental/status-400.json
new file mode 100644
index 00000000..cd9fafff
--- /dev/null
+++ b/adapters/teads/teadstest/supplemental/status-400.json
@@ -0,0 +1,65 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id",
+    "imp": [
+      {
+        "id": "test-imp-id",
+        "banner": {
+          "format": [
+            {
+              "w": 300,
+              "h": 250
+            }
+          ]
+        },
+        "ext": {
+          "bidder": {
+            "placementId": 1
+          }
+        }
+      }
+    ]
+  },
+
+  "httpCalls": [
+    {
+      "expectedRequest": {
+        "uri": "https://a.teads.tv/prebid-server/bid-request",
+        "body": {
+          "id": "test-request-id",
+          "imp": [
+            {
+              "id": "test-imp-id",
+              "tagid": "1",
+              "banner": {
+                "format": [
+                  {
+                    "w": 300,
+                    "h": 250
+                  }
+                ],
+                "w": 300,
+                "h": 250
+              },
+              "ext": {
+                "kv": {
+                  "placementId": 1
+                }
+              }
+            }
+          ]
+        }
+      },
+      "mockResponse": {
+        "status": 400,
+        "body": {}
+      }
+    }
+  ],
+  "expectedMakeBidsErrors": [
+    {
+      "value": "Unexpected status code: 400. Run with request.debug = 1 for more info",
+      "comparison": "literal"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/adapters/teads/teadstest/supplemental/status-500.json b/adapters/teads/teadstest/supplemental/status-500.json
new file mode 100644
index 00000000..337d4754
--- /dev/null
+++ b/adapters/teads/teadstest/supplemental/status-500.json
@@ -0,0 +1,65 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id",
+    "imp": [
+      {
+        "id": "test-imp-id",
+        "banner": {
+          "format": [
+            {
+              "w": 300,
+              "h": 250
+            }
+          ]
+        },
+        "ext": {
+          "bidder": {
+            "placementId": 1
+          }
+        }
+      }
+    ]
+  },
+
+  "httpCalls": [
+    {
+      "expectedRequest": {
+        "uri": "https://a.teads.tv/prebid-server/bid-request",
+        "body": {
+          "id": "test-request-id",
+          "imp": [
+            {
+              "id": "test-imp-id",
+              "tagid": "1",
+              "banner": {
+                "format": [
+                  {
+                    "w": 300,
+                    "h": 250
+                  }
+                ],
+                "w": 300,
+                "h": 250
+              },
+              "ext": {
+                "kv": {
+                  "placementId": 1
+                }
+              }
+            }
+          ]
+        }
+      },
+      "mockResponse": {
+        "status": 500,
+        "body": {}
+      }
+    }
+  ],
+  "expectedMakeBidsErrors": [
+    {
+      "value": "Unexpected status code: 500. Run with request.debug = 1 for more info",
+      "comparison": "literal"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/endpoints/events/event_test.go b/endpoints/events/event_test.go
index d721187b..5fc11578 100644
--- a/endpoints/events/event_test.go
+++ b/endpoints/events/event_test.go
@@ -651,6 +651,19 @@ func TestShouldParseEventCorrectly(t *testing.T) {
 				Analytics: analytics.Enabled,
 			},
 		},
+		"case insensitive bidder name": {
+			req: httptest.NewRequest("GET", "/event?t=win&b=bidId&f=b&ts=1000&x=1&a=accountId&bidder=RubiCon&int=intType", strings.NewReader("")),
+			expected: &analytics.EventRequest{
+				Type:        analytics.Win,
+				BidID:       "bidId",
+				Timestamp:   1000,
+				Bidder:      "rubicon",
+				AccountID:   "",
+				Format:      analytics.Blank,
+				Analytics:   analytics.Enabled,
+				Integration: "intType",
+			},
+		},
 	}
 
 	for name, test := range tests {
diff --git a/endpoints/events/vtrack_test.go b/endpoints/events/vtrack_test.go
index 2c40c9b4..1e36a9e6 100644
--- a/endpoints/events/vtrack_test.go
+++ b/endpoints/events/vtrack_test.go
@@ -13,6 +13,7 @@ import (
 	"testing"
 
 	"github.com/prebid/prebid-server/config"
+	"github.com/prebid/prebid-server/openrtb_ext"
 	"github.com/prebid/prebid-server/prebid_cache_client"
 	"github.com/prebid/prebid-server/stored_requests"
 	"github.com/stretchr/testify/assert"
@@ -28,15 +29,17 @@ const (
 
 // Mock pbs cache client
 type vtrackMockCacheClient struct {
-	Fail  bool
-	Error error
-	Uuids []string
+	Fail   bool
+	Error  error
+	Uuids  []string
+	Values []prebid_cache_client.Cacheable
 }
 
 func (m *vtrackMockCacheClient) PutJson(ctx context.Context, values []prebid_cache_client.Cacheable) ([]string, []error) {
 	if m.Fail {
 		return []string{}, []error{m.Error}
 	}
+	m.Values = values
 	return m.Uuids, []error{}
 }
 func (m *vtrackMockCacheClient) GetExtCacheData() (scheme string, host string, path string) {
@@ -64,10 +67,11 @@ func TestShouldRespondWithBadRequestWhenAccountParameterIsMissing(t *testing.T)
 	recorder := httptest.NewRecorder()
 
 	e := vtrackEndpoint{
-		Cfg:         cfg,
-		BidderInfos: nil,
-		Cache:       mockCacheClient,
-		Accounts:    mockAccountsFetcher,
+		Cfg:                 cfg,
+		BidderInfos:         nil,
+		Cache:               mockCacheClient,
+		Accounts:            mockAccountsFetcher,
+		normalizeBidderName: openrtb_ext.NormalizeBidderName,
 	}
 
 	// execute
@@ -105,10 +109,11 @@ func TestShouldRespondWithBadRequestWhenRequestBodyIsEmpty(t *testing.T) {
 	recorder := httptest.NewRecorder()
 
 	e := vtrackEndpoint{
-		Cfg:         cfg,
-		BidderInfos: nil,
-		Cache:       mockCacheClient,
-		Accounts:    mockAccountsFetcher,
+		Cfg:                 cfg,
+		BidderInfos:         nil,
+		Cache:               mockCacheClient,
+		Accounts:            mockAccountsFetcher,
+		normalizeBidderName: openrtb_ext.NormalizeBidderName,
 	}
 
 	// execute
@@ -146,10 +151,11 @@ func TestShouldRespondWithBadRequestWhenRequestBodyIsInvalid(t *testing.T) {
 	recorder := httptest.NewRecorder()
 
 	e := vtrackEndpoint{
-		Cfg:         cfg,
-		BidderInfos: nil,
-		Cache:       mockCacheClient,
-		Accounts:    mockAccountsFetcher,
+		Cfg:                 cfg,
+		BidderInfos:         nil,
+		Cache:               mockCacheClient,
+		Accounts:            mockAccountsFetcher,
+		normalizeBidderName: openrtb_ext.NormalizeBidderName,
 	}
 
 	// execute
@@ -190,10 +196,11 @@ func TestShouldRespondWithBadRequestWhenBidIdIsMissing(t *testing.T) {
 	recorder := httptest.NewRecorder()
 
 	e := vtrackEndpoint{
-		Cfg:         cfg,
-		BidderInfos: nil,
-		Cache:       mockCacheClient,
-		Accounts:    mockAccountsFetcher,
+		Cfg:                 cfg,
+		BidderInfos:         nil,
+		Cache:               mockCacheClient,
+		Accounts:            mockAccountsFetcher,
+		normalizeBidderName: openrtb_ext.NormalizeBidderName,
 	}
 
 	// execute
@@ -242,10 +249,11 @@ func TestShouldRespondWithBadRequestWhenBidderIsMissing(t *testing.T) {
 	recorder := httptest.NewRecorder()
 
 	e := vtrackEndpoint{
-		Cfg:         cfg,
-		BidderInfos: nil,
-		Cache:       mockCacheClient,
-		Accounts:    mockAccountsFetcher,
+		Cfg:                 cfg,
+		BidderInfos:         nil,
+		Cache:               mockCacheClient,
+		Accounts:            mockAccountsFetcher,
+		normalizeBidderName: openrtb_ext.NormalizeBidderName,
 	}
 
 	// execute
@@ -291,10 +299,11 @@ func TestShouldRespondWithInternalServerErrorWhenPbsCacheClientFails(t *testing.
 	recorder := httptest.NewRecorder()
 
 	e := vtrackEndpoint{
-		Cfg:         cfg,
-		BidderInfos: nil,
-		Cache:       mockCacheClient,
-		Accounts:    mockAccountsFetcher,
+		Cfg:                 cfg,
+		BidderInfos:         nil,
+		Cache:               mockCacheClient,
+		Accounts:            mockAccountsFetcher,
+		normalizeBidderName: openrtb_ext.NormalizeBidderName,
 	}
 
 	// execute
@@ -340,10 +349,11 @@ func TestShouldTolerateAccountNotFound(t *testing.T) {
 	recorder := httptest.NewRecorder()
 
 	e := vtrackEndpoint{
-		Cfg:         cfg,
-		BidderInfos: nil,
-		Cache:       mockCacheClient,
-		Accounts:    mockAccountsFetcher,
+		Cfg:                 cfg,
+		BidderInfos:         nil,
+		Cache:               mockCacheClient,
+		Accounts:            mockAccountsFetcher,
+		normalizeBidderName: openrtb_ext.NormalizeBidderName,
 	}
 
 	// execute
@@ -397,10 +407,11 @@ func TestShouldSendToCacheExpectedPutsAndUpdatableBiddersWhenBidderVastNotAllowe
 	recorder := httptest.NewRecorder()
 
 	e := vtrackEndpoint{
-		Cfg:         cfg,
-		BidderInfos: bidderInfos,
-		Cache:       mockCacheClient,
-		Accounts:    mockAccountsFetcher,
+		Cfg:                 cfg,
+		BidderInfos:         bidderInfos,
+		Cache:               mockCacheClient,
+		Accounts:            mockAccountsFetcher,
+		normalizeBidderName: openrtb_ext.NormalizeBidderName,
 	}
 
 	// execute
@@ -459,11 +470,15 @@ func TestShouldSendToCacheExpectedPutsAndUpdatableBiddersWhenBidderVastAllowed(t
 
 	recorder := httptest.NewRecorder()
 
+	var mockNormalizeBidderName normalizeBidderName = func(name string) (openrtb_ext.BidderName, bool) {
+		return openrtb_ext.BidderName(name), true
+	}
 	e := vtrackEndpoint{
-		Cfg:         cfg,
-		BidderInfos: bidderInfos,
-		Cache:       mockCacheClient,
-		Accounts:    mockAccountsFetcher,
+		Cfg:                 cfg,
+		BidderInfos:         bidderInfos,
+		Cache:               mockCacheClient,
+		Accounts:            mockAccountsFetcher,
+		normalizeBidderName: mockNormalizeBidderName,
 	}
 
 	// execute
@@ -478,6 +493,95 @@ func TestShouldSendToCacheExpectedPutsAndUpdatableBiddersWhenBidderVastAllowed(t
 	assert.Equal(t, 200, recorder.Result().StatusCode, "Expected 200 when account is not found and request is valid")
 	assert.Equal(t, "{\"responses\":[{\"uuid\":\"uuid1\"},{\"uuid\":\"uuid2\"}]}", string(d), "Expected 200 when account is found and request is valid")
 	assert.Equal(t, "application/json", recorder.Header().Get("Content-Type"))
+	assert.Len(t, mockCacheClient.Values, 2)
+	assert.Contains(t, string(mockCacheClient.Values[0].Data), "bidder=bidder")
+	assert.Contains(t, string(mockCacheClient.Values[1].Data), "bidder=updatable_bidder")
+}
+
+func TestShouldSendToCacheExpectedPutsAndUpdatableCaseSensitiveBiddersWhenBidderVastAllowed(t *testing.T) {
+	// mock pbs cache client
+	mockCacheClient := &vtrackMockCacheClient{
+		Fail:  false,
+		Uuids: []string{"uuid1", "uuid2"},
+	}
+
+	// mock AccountsFetcher
+	mockAccountsFetcher := &mockAccountsFetcher{
+		Fail: false,
+	}
+
+	// config
+	cfg := &config.Configuration{
+		MaxRequestSize: maxSize, VTrack: config.VTrack{
+			TimeoutMS: int64(2000), AllowUnknownBidder: false,
+		},
+		AccountDefaults: config.Account{},
+	}
+	cfg.MarshalAccountDefaults()
+
+	// bidder info
+	bidderInfos := make(config.BidderInfos)
+	bidderInfos["appnexus"] = config.BidderInfo{
+		Disabled:                false,
+		ModifyingVastXmlAllowed: true,
+	}
+
+	d, err := getVTrackRequestData(true, true)
+	assert.NoError(t, err)
+
+	cacheReq := &BidCacheRequest{
+		Puts: []prebid_cache_client.Cacheable{
+			{
+				Type:       prebid_cache_client.TypeXML,
+				BidID:      "bidId1",
+				Bidder:     "APPNEXUS", // case sensitive name
+				Data:       d,
+				TTLSeconds: 3600,
+				Timestamp:  1000,
+			},
+			{
+				Type:       prebid_cache_client.TypeXML,
+				BidID:      "bidId2",
+				Bidder:     "ApPnExUs", // case sensitive name
+				Data:       d,
+				TTLSeconds: 3600,
+				Timestamp:  1000,
+			},
+		},
+	}
+	buf := &bytes.Buffer{}
+	enc := json.NewEncoder(buf)
+	enc.SetEscapeHTML(false)
+	err = enc.Encode(cacheReq)
+	assert.NoError(t, err)
+	data := buf.String()
+
+	req := httptest.NewRequest("POST", "/vtrack?a=events_enabled", strings.NewReader(data))
+
+	recorder := httptest.NewRecorder()
+	e := vtrackEndpoint{
+		Cfg:                 cfg,
+		BidderInfos:         bidderInfos,
+		Cache:               mockCacheClient,
+		Accounts:            mockAccountsFetcher,
+		normalizeBidderName: openrtb_ext.NormalizeBidderName,
+	}
+
+	// execute
+	e.Handle(recorder, req, nil)
+
+	d, err = io.ReadAll(recorder.Result().Body)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	// validate
+	assert.Equal(t, 200, recorder.Result().StatusCode, "Expected 200 when account is not found and request is valid")
+	assert.Equal(t, "{\"responses\":[{\"uuid\":\"uuid1\"},{\"uuid\":\"uuid2\"}]}", string(d), "Expected 200 when account is found and request is valid")
+	assert.Equal(t, "application/json", recorder.Header().Get("Content-Type"))
+	assert.Len(t, mockCacheClient.Values, 2)
+	assert.Contains(t, string(mockCacheClient.Values[0].Data), "bidder=APPNEXUS")
+	assert.Contains(t, string(mockCacheClient.Values[1].Data), "bidder=ApPnExUs")
 }
 
 func TestShouldSendToCacheExpectedPutsAndUpdatableUnknownBiddersWhenUnknownBidderIsAllowed(t *testing.T) {
@@ -515,10 +619,11 @@ func TestShouldSendToCacheExpectedPutsAndUpdatableUnknownBiddersWhenUnknownBidde
 	recorder := httptest.NewRecorder()
 
 	e := vtrackEndpoint{
-		Cfg:         cfg,
-		BidderInfos: bidderInfos,
-		Cache:       mockCacheClient,
-		Accounts:    mockAccountsFetcher,
+		Cfg:                 cfg,
+		BidderInfos:         bidderInfos,
+		Cache:               mockCacheClient,
+		Accounts:            mockAccountsFetcher,
+		normalizeBidderName: openrtb_ext.NormalizeBidderName,
 	}
 
 	// execute
@@ -571,10 +676,11 @@ func TestShouldReturnBadRequestWhenRequestExceedsMaxRequestSize(t *testing.T) {
 	recorder := httptest.NewRecorder()
 
 	e := vtrackEndpoint{
-		Cfg:         cfg,
-		BidderInfos: bidderInfos,
-		Cache:       mockCacheClient,
-		Accounts:    mockAccountsFetcher,
+		Cfg:                 cfg,
+		BidderInfos:         bidderInfos,
+		Cache:               mockCacheClient,
+		Accounts:            mockAccountsFetcher,
+		normalizeBidderName: openrtb_ext.NormalizeBidderName,
 	}
 
 	// execute
@@ -615,10 +721,11 @@ func TestShouldRespondWithInternalErrorPbsCacheIsNotConfigured(t *testing.T) {
 	recorder := httptest.NewRecorder()
 
 	e := vtrackEndpoint{
-		Cfg:         cfg,
-		BidderInfos: nil,
-		Cache:       nil,
-		Accounts:    mockAccountsFetcher,
+		Cfg:                 cfg,
+		BidderInfos:         nil,
+		Cache:               nil,
+		Accounts:            mockAccountsFetcher,
+		normalizeBidderName: openrtb_ext.NormalizeBidderName,
 	}
 
 	// execute
diff --git a/metrics/prometheus/prometheus_test.go b/metrics/prometheus/prometheus_test.go
index e57ae5e1..bea0087c 100644
--- a/metrics/prometheus/prometheus_test.go
+++ b/metrics/prometheus/prometheus_test.go
@@ -226,18 +226,19 @@ func TestBidValidationCreativeSizeMetric(t *testing.T) {
 			expectedAccountCount:               0,
 		},
 	}
-
+	adapterName := openrtb_ext.BidderName("AnyName")
+	lowerCasedAdapterName := "anyname"
 	for _, test := range testCases {
 		m := createMetricsForTesting()
 		m.metricsDisabled.AccountAdapterDetails = test.givenAccountAdapterMetricsDisabled
-		m.RecordBidValidationCreativeSizeError(adapterLabel, "acct-id")
-		m.RecordBidValidationCreativeSizeWarn(adapterLabel, "acct-id")
+		m.RecordBidValidationCreativeSizeError(adapterName, "acct-id")
+		m.RecordBidValidationCreativeSizeWarn(adapterName, "acct-id")
 
 		assertCounterVecValue(t, "", "account bid validation", m.accountBidResponseValidationSizeError, test.expectedAccountCount, prometheus.Labels{accountLabel: "acct-id", successLabel: successLabel})
-		assertCounterVecValue(t, "", "adapter bid validation", m.adapterBidResponseValidationSizeError, test.expectedAdapterCount, prometheus.Labels{adapterLabel: adapterLabel, successLabel: successLabel})
+		assertCounterVecValue(t, "", "adapter bid validation", m.adapterBidResponseValidationSizeError, test.expectedAdapterCount, prometheus.Labels{adapterLabel: lowerCasedAdapterName, successLabel: successLabel})
 
 		assertCounterVecValue(t, "", "account bid validation", m.accountBidResponseValidationSizeWarn, test.expectedAccountCount, prometheus.Labels{accountLabel: "acct-id", successLabel: successLabel})
-		assertCounterVecValue(t, "", "adapter bid validation", m.adapterBidResponseValidationSizeWarn, test.expectedAdapterCount, prometheus.Labels{adapterLabel: adapterLabel, successLabel: successLabel})
+		assertCounterVecValue(t, "", "adapter bid validation", m.adapterBidResponseValidationSizeWarn, test.expectedAdapterCount, prometheus.Labels{adapterLabel: lowerCasedAdapterName, successLabel: successLabel})
 	}
 }
 
@@ -263,17 +264,19 @@ func TestBidValidationSecureMarkupMetric(t *testing.T) {
 		},
 	}
 
+	adapterName := openrtb_ext.BidderName("AnyName")
+	lowerCasedAdapterName := "anyname"
 	for _, test := range testCases {
 		m := createMetricsForTesting()
 		m.metricsDisabled.AccountAdapterDetails = test.givenAccountAdapterMetricsDisabled
-		m.RecordBidValidationSecureMarkupError(adapterLabel, "acct-id")
-		m.RecordBidValidationSecureMarkupWarn(adapterLabel, "acct-id")
+		m.RecordBidValidationSecureMarkupError(adapterName, "acct-id")
+		m.RecordBidValidationSecureMarkupWarn(adapterName, "acct-id")
 
 		assertCounterVecValue(t, "", "Account Secure Markup Error", m.accountBidResponseSecureMarkupError, test.expectedAccountCount, prometheus.Labels{accountLabel: "acct-id", successLabel: successLabel})
-		assertCounterVecValue(t, "", "Adapter Secure Markup Error", m.adapterBidResponseSecureMarkupError, test.expectedAdapterCount, prometheus.Labels{adapterLabel: adapterLabel, successLabel: successLabel})
+		assertCounterVecValue(t, "", "Adapter Secure Markup Error", m.adapterBidResponseSecureMarkupError, test.expectedAdapterCount, prometheus.Labels{adapterLabel: lowerCasedAdapterName, successLabel: successLabel})
 
 		assertCounterVecValue(t, "", "Account Secure Markup Warn", m.accountBidResponseSecureMarkupWarn, test.expectedAccountCount, prometheus.Labels{accountLabel: "acct-id", successLabel: successLabel})
-		assertCounterVecValue(t, "", "Adapter Secure Markup Warn", m.adapterBidResponseSecureMarkupWarn, test.expectedAdapterCount, prometheus.Labels{adapterLabel: adapterLabel, successLabel: successLabel})
+		assertCounterVecValue(t, "", "Adapter Secure Markup Warn", m.adapterBidResponseSecureMarkupWarn, test.expectedAdapterCount, prometheus.Labels{adapterLabel: lowerCasedAdapterName, successLabel: successLabel})
 	}
 }
 
@@ -768,10 +771,11 @@ func TestRecordStoredDataError(t *testing.T) {
 }
 
 func TestAdapterBidReceivedMetric(t *testing.T) {
-	adapterName := "anyName"
+	adapterName := openrtb_ext.BidderName("anyName")
+	lowerCasedAdapterName := "anyname"
 	performTest := func(m *Metrics, hasAdm bool) {
 		labels := metrics.AdapterLabels{
-			Adapter: openrtb_ext.BidderName(adapterName),
+			Adapter: adapterName,
 		}
 		bidType := openrtb_ext.BidTypeBanner
 		m.RecordAdapterBidReceived(labels, bidType, hasAdm)
@@ -809,13 +813,13 @@ func TestAdapterBidReceivedMetric(t *testing.T) {
 		assertCounterVecValue(t, test.description, "adapterBids[adm]", m.adapterBids,
 			test.expectedAdmCount,
 			prometheus.Labels{
-				adapterLabel:        adapterName,
+				adapterLabel:        lowerCasedAdapterName,
 				markupDeliveryLabel: markupDeliveryAdm,
 			})
 		assertCounterVecValue(t, test.description, "adapterBids[nurl]", m.adapterBids,
 			test.expectedNurlCount,
 			prometheus.Labels{
-				adapterLabel:        adapterName,
+				adapterLabel:        lowerCasedAdapterName,
 				markupDeliveryLabel: markupDeliveryNurl,
 			})
 	}
@@ -824,6 +828,7 @@ func TestAdapterBidReceivedMetric(t *testing.T) {
 func TestRecordAdapterPriceMetric(t *testing.T) {
 	m := createMetricsForTesting()
 	adapterName := "anyName"
+	lowerCasedAdapterName := "anyname"
 	cpm := float64(42)
 
 	m.RecordAdapterPrice(metrics.AdapterLabels{
@@ -832,12 +837,13 @@ func TestRecordAdapterPriceMetric(t *testing.T) {
 
 	expectedCount := uint64(1)
 	expectedSum := cpm
-	result := getHistogramFromHistogramVec(m.adapterPrices, adapterLabel, adapterName)
+	result := getHistogramFromHistogramVec(m.adapterPrices, adapterLabel, lowerCasedAdapterName)
 	assertHistogram(t, "adapterPrices", result, expectedCount, expectedSum)
 }
 
 func TestAdapterRequestMetrics(t *testing.T) {
 	adapterName := "anyName"
+	lowerCasedAdapterName := "anyname"
 	performTest := func(m *Metrics, cookieFlag metrics.CookieFlag, adapterBids metrics.AdapterBid) {
 		labels := metrics.AdapterLabels{
 			Adapter:     openrtb_ext.BidderName(adapterName),
@@ -937,7 +943,7 @@ func TestAdapterRequestMetrics(t *testing.T) {
 		processMetrics(m.adapterRequests, func(m dto.Metric) {
 			isMetricForAdapter := false
 			for _, label := range m.GetLabel() {
-				if label.GetName() == adapterLabel && label.GetValue() == adapterName {
+				if label.GetName() == adapterLabel && label.GetValue() == lowerCasedAdapterName {
 					isMetricForAdapter = true
 				}
 			}
@@ -974,6 +980,7 @@ func TestAdapterRequestMetrics(t *testing.T) {
 
 func TestAdapterRequestErrorMetrics(t *testing.T) {
 	adapterName := "anyName"
+	lowerCasedAdapterName := "anyname"
 	performTest := func(m *Metrics, adapterErrors map[metrics.AdapterError]struct{}) {
 		labels := metrics.AdapterLabels{
 			Adapter:       openrtb_ext.BidderName(adapterName),
@@ -1030,7 +1037,7 @@ func TestAdapterRequestErrorMetrics(t *testing.T) {
 		processMetrics(m.adapterErrors, func(m dto.Metric) {
 			isMetricForAdapter := false
 			for _, label := range m.GetLabel() {
-				if label.GetName() == adapterLabel && label.GetValue() == adapterName {
+				if label.GetName() == adapterLabel && label.GetValue() == lowerCasedAdapterName {
 					isMetricForAdapter = true
 				}
 			}
@@ -1052,6 +1059,7 @@ func TestAdapterRequestErrorMetrics(t *testing.T) {
 
 func TestAdapterTimeMetric(t *testing.T) {
 	adapterName := "anyName"
+	lowerCasedAdapterName := "anyname"
 	performTest := func(m *Metrics, timeInMs float64, adapterErrors map[metrics.AdapterError]struct{}) {
 		m.RecordAdapterTime(metrics.AdapterLabels{
 			Adapter:       openrtb_ext.BidderName(adapterName),
@@ -1090,24 +1098,24 @@ func TestAdapterTimeMetric(t *testing.T) {
 
 		test.testCase(m)
 
-		result := getHistogramFromHistogramVec(m.adapterRequestsTimer, adapterLabel, adapterName)
+		result := getHistogramFromHistogramVec(m.adapterRequestsTimer, adapterLabel, lowerCasedAdapterName)
 		assertHistogram(t, test.description, result, test.expectedCount, test.expectedSum)
 	}
 }
 
 func TestAdapterPanicMetric(t *testing.T) {
 	m := createMetricsForTesting()
-	adapterName := "anyName"
-
+	adapterName := openrtb_ext.BidderName("anyName")
+	lowerCasedAdapterName := "anyname"
 	m.RecordAdapterPanic(metrics.AdapterLabels{
-		Adapter: openrtb_ext.BidderName(adapterName),
+		Adapter: adapterName,
 	})
 
 	expectedCount := float64(1)
 	assertCounterVecValue(t, "", "adapterPanics", m.adapterPanics,
 		expectedCount,
 		prometheus.Labels{
-			adapterLabel: adapterName,
+			adapterLabel: lowerCasedAdapterName,
 		})
 }
 
@@ -1509,6 +1517,8 @@ func TestRecordBidderServerResponseTime(t *testing.T) {
 }
 
 func TestRecordAdapterConnections(t *testing.T) {
+	adapterName := openrtb_ext.BidderName("Adapter")
+	lowerCasedAdapterName := "adapter"
 
 	type testIn struct {
 		adapterName   openrtb_ext.BidderName
@@ -1531,7 +1541,7 @@ func TestRecordAdapterConnections(t *testing.T) {
 		{
 			description: "[1] Successful, new connection created, was idle, has connection wait",
 			in: testIn{
-				adapterName:   openrtb_ext.BidderAppnexus,
+				adapterName:   adapterName,
 				connWasReused: false,
 				connWait:      time.Second * 5,
 			},
@@ -1545,7 +1555,7 @@ func TestRecordAdapterConnections(t *testing.T) {
 		{
 			description: "[2] Successful, new connection created, not idle, has connection wait",
 			in: testIn{
-				adapterName:   openrtb_ext.BidderAppnexus,
+				adapterName:   adapterName,
 				connWasReused: false,
 				connWait:      time.Second * 4,
 			},
@@ -1559,7 +1569,7 @@ func TestRecordAdapterConnections(t *testing.T) {
 		{
 			description: "[3] Successful, was reused, was idle, no connection wait",
 			in: testIn{
-				adapterName:   openrtb_ext.BidderAppnexus,
+				adapterName:   adapterName,
 				connWasReused: true,
 			},
 			out: testOut{
@@ -1572,7 +1582,7 @@ func TestRecordAdapterConnections(t *testing.T) {
 		{
 			description: "[4] Successful, was reused, not idle, has connection wait",
 			in: testIn{
-				adapterName:   openrtb_ext.BidderAppnexus,
+				adapterName:   adapterName,
 				connWasReused: true,
 				connWait:      time.Second * 5,
 			},
@@ -1602,7 +1612,7 @@ func TestRecordAdapterConnections(t *testing.T) {
 			"adapter_connection_reused",
 			m.adapterReusedConnections,
 			float64(test.out.expectedConnReusedCount),
-			prometheus.Labels{adapterLabel: string(test.in.adapterName)})
+			prometheus.Labels{adapterLabel: lowerCasedAdapterName})
 
 		// Assert number of new created connections
 		assertCounterVecValue(t,
@@ -1610,10 +1620,10 @@ func TestRecordAdapterConnections(t *testing.T) {
 			"adapter_connection_created",
 			m.adapterCreatedConnections,
 			float64(test.out.expectedConnCreatedCount),
-			prometheus.Labels{adapterLabel: string(test.in.adapterName)})
+			prometheus.Labels{adapterLabel: lowerCasedAdapterName})
 
 		// Assert connection wait time
-		histogram := getHistogramFromHistogramVec(m.adapterConnectionWaitTime, adapterLabel, string(test.in.adapterName))
+		histogram := getHistogramFromHistogramVec(m.adapterConnectionWaitTime, adapterLabel, lowerCasedAdapterName)
 		assert.Equal(t, test.out.expectedConnWaitCount, histogram.GetSampleCount(), assertDesciptions[2])
 		assert.Equal(t, test.out.expectedConnWaitTime, histogram.GetSampleSum(), assertDesciptions[3])
 	}
@@ -1781,8 +1791,9 @@ func assertHistogram(t *testing.T, name string, histogram dto.Histogram, expecte
 
 func TestRecordAdapterGDPRRequestBlocked(t *testing.T) {
 	m := createMetricsForTesting()
-
-	m.RecordAdapterGDPRRequestBlocked(openrtb_ext.BidderAppnexus)
+	adapterName := openrtb_ext.BidderName("AnyName")
+	lowerCasedAdapterName := "anyname"
+	m.RecordAdapterGDPRRequestBlocked(adapterName)
 
 	assertCounterVecValue(t,
 		"Increment adapter GDPR request blocked counter",
@@ -1790,7 +1801,7 @@ func TestRecordAdapterGDPRRequestBlocked(t *testing.T) {
 		m.adapterGDPRBlockedRequests,
 		1,
 		prometheus.Labels{
-			adapterLabel: string(openrtb_ext.BidderAppnexus),
+			adapterLabel: lowerCasedAdapterName,
 		})
 }