diff --git a/adapters/ezoic/ezoic.go b/adapters/ezoic/ezoic.go
new file mode 100644
index 000000000..fd5e51950
--- /dev/null
+++ b/adapters/ezoic/ezoic.go
@@ -0,0 +1,95 @@
+package ezoic
+
+import (
+ "fmt"
+ "net/http"
+
+ "github.com/prebid/openrtb/v20/openrtb2"
+ "github.com/prebid/prebid-server/v4/adapters"
+ "github.com/prebid/prebid-server/v4/config"
+ "github.com/prebid/prebid-server/v4/errortypes"
+ "github.com/prebid/prebid-server/v4/openrtb_ext"
+ "github.com/prebid/prebid-server/v4/util/jsonutil"
+)
+
+type adapter struct {
+ endpoint string
+}
+
+// Builder builds a new instance of the Ezoic adapter for the given bidder with the given config.
+func Builder(bidderName openrtb_ext.BidderName, cfg config.Adapter, server config.Server) (adapters.Bidder, error) {
+ return &adapter{endpoint: cfg.Endpoint}, nil
+}
+
+// MakeRequests forwards the OpenRTB request to the Ezoic bidder endpoint
+// unchanged. Eligibility, demand selection, and creative construction all
+// happen server-side at Ezoic; the adapter is a deliberately thin transport.
+func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) {
+ body, err := jsonutil.Marshal(request)
+ if err != nil {
+ return nil, []error{fmt.Errorf("unable to marshal openrtb request: %w", err)}
+ }
+
+ headers := http.Header{}
+ headers.Add("Content-Type", "application/json;charset=utf-8")
+ headers.Add("Accept", "application/json")
+
+ return []*adapters.RequestData{{
+ Method: http.MethodPost,
+ Uri: a.endpoint,
+ Body: body,
+ Headers: headers,
+ ImpIDs: openrtb_ext.GetImpIDs(request.Imp),
+ }}, nil
+}
+
+// MakeBids unpacks the Ezoic endpoint's OpenRTB BidResponse.
+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 bidResp openrtb2.BidResponse
+ if err := jsonutil.Unmarshal(responseData.Body, &bidResp); err != nil {
+ return nil, []error{err}
+ }
+
+ bidderResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp))
+ if bidResp.Cur != "" {
+ bidderResponse.Currency = bidResp.Cur
+ }
+
+ var errs []error
+ for _, seatBid := range bidResp.SeatBid {
+ for i := range seatBid.Bid {
+ bidType, err := getMediaTypeForBid(seatBid.Bid[i])
+ if err != nil {
+ errs = append(errs, err)
+ continue
+ }
+ bidderResponse.Bids = append(bidderResponse.Bids, &adapters.TypedBid{
+ Bid: &seatBid.Bid[i],
+ BidType: bidType,
+ })
+ }
+ }
+ return bidderResponse, errs
+}
+
+func getMediaTypeForBid(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.MarkupNative:
+ return openrtb_ext.BidTypeNative, nil
+ default:
+ return "", &errortypes.BadServerResponse{
+ Message: fmt.Sprintf("unsupported mtype %d for bid %s", bid.MType, bid.ID),
+ }
+ }
+}
diff --git a/adapters/ezoic/ezoic_test.go b/adapters/ezoic/ezoic_test.go
new file mode 100644
index 000000000..0c9a24a95
--- /dev/null
+++ b/adapters/ezoic/ezoic_test.go
@@ -0,0 +1,57 @@
+package ezoic
+
+import (
+ "testing"
+
+ "github.com/prebid/openrtb/v20/openrtb2"
+ "github.com/prebid/prebid-server/v4/adapters"
+ "github.com/prebid/prebid-server/v4/adapters/adapterstest"
+ "github.com/prebid/prebid-server/v4/config"
+ "github.com/prebid/prebid-server/v4/openrtb_ext"
+ "github.com/stretchr/testify/assert"
+)
+
+const testsBidderEndpoint = "https://g.ezoic.net/ezoic/prebid/adapter/ortb"
+
+func TestJsonSamples(t *testing.T) {
+ bidder, buildErr := Builder(openrtb_ext.BidderEzoic, config.Adapter{
+ Endpoint: testsBidderEndpoint}, config.Server{})
+
+ if buildErr != nil {
+ t.Fatalf("Builder returned unexpected error %v", buildErr)
+ }
+
+ adapterstest.RunJSONBidderTest(t, "ezoictest", bidder)
+}
+
+func TestNoContentResponse(t *testing.T) {
+ bidder, buildErr := Builder(openrtb_ext.BidderEzoic, config.Adapter{
+ Endpoint: testsBidderEndpoint}, config.Server{})
+ if buildErr != nil {
+ t.Fatalf("Builder returned unexpected error %v", buildErr)
+ }
+
+ bidResponse, errs := bidder.MakeBids(nil, nil, &adapters.ResponseData{StatusCode: 204})
+ assert.Nil(t, bidResponse)
+ assert.Empty(t, errs)
+}
+
+func TestGetMediaTypeForBid(t *testing.T) {
+ bidType, err := getMediaTypeForBid(openrtb2.Bid{MType: openrtb2.MarkupBanner})
+ assert.NoError(t, err)
+ assert.Equal(t, openrtb_ext.BidTypeBanner, bidType)
+
+ bidType, err = getMediaTypeForBid(openrtb2.Bid{MType: openrtb2.MarkupVideo})
+ assert.NoError(t, err)
+ assert.Equal(t, openrtb_ext.BidTypeVideo, bidType)
+
+ bidType, err = getMediaTypeForBid(openrtb2.Bid{MType: openrtb2.MarkupNative})
+ assert.NoError(t, err)
+ assert.Equal(t, openrtb_ext.BidTypeNative, bidType)
+
+ _, err = getMediaTypeForBid(openrtb2.Bid{ID: "no-mtype"})
+ assert.Error(t, err)
+
+ _, err = getMediaTypeForBid(openrtb2.Bid{ID: "audio", MType: openrtb2.MarkupAudio})
+ assert.Error(t, err)
+}
diff --git a/adapters/ezoic/ezoictest/exemplary/simple-banner.json b/adapters/ezoic/ezoictest/exemplary/simple-banner.json
new file mode 100644
index 000000000..7c3c29b29
--- /dev/null
+++ b/adapters/ezoic/ezoictest/exemplary/simple-banner.json
@@ -0,0 +1,124 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "tmax": 750,
+ "site": {
+ "page": "https://example.com/article",
+ "domain": "example.com"
+ },
+ "device": {
+ "ua": "test-user-agent",
+ "ip": "203.0.113.9"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "tagid": "div-gpt-ad-1",
+ "bidfloor": 0.25,
+ "bidfloorcur": "USD",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "placementId": "ezoic-placement-1"
+ }
+ }
+ }
+ ]
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://g.ezoic.net/ezoic/prebid/adapter/ortb",
+ "body": {
+ "id": "test-request-id",
+ "tmax": 750,
+ "site": {
+ "page": "https://example.com/article",
+ "domain": "example.com"
+ },
+ "device": {
+ "ua": "test-user-agent",
+ "ip": "203.0.113.9"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "tagid": "div-gpt-ad-1",
+ "bidfloor": 0.25,
+ "bidfloorcur": "USD",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {
+ "placementId": "ezoic-placement-1"
+ }
+ }
+ }
+ ]
+ },
+ "impIDs": [
+ "test-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "test-request-id",
+ "cur": "USD",
+ "seatbid": [
+ {
+ "seat": "ezoic",
+ "bid": [
+ {
+ "id": "ezoic-bid-1",
+ "impid": "test-imp-id",
+ "price": 2.5,
+ "adm": "
ezoic-self-tracking-creative
",
+ "crid": "ezoic-creative-1",
+ "w": 300,
+ "h": 250,
+ "mtype": 1,
+ "exp": 300
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "currency": "USD",
+ "bids": [
+ {
+ "bid": {
+ "id": "ezoic-bid-1",
+ "impid": "test-imp-id",
+ "price": 2.5,
+ "adm": "ezoic-self-tracking-creative
",
+ "crid": "ezoic-creative-1",
+ "w": 300,
+ "h": 250,
+ "mtype": 1,
+ "exp": 300
+ },
+ "type": "banner"
+ }
+ ]
+ }
+ ]
+}
diff --git a/adapters/ezoic/ezoictest/exemplary/simple-native.json b/adapters/ezoic/ezoictest/exemplary/simple-native.json
new file mode 100644
index 000000000..31a072cd6
--- /dev/null
+++ b/adapters/ezoic/ezoictest/exemplary/simple-native.json
@@ -0,0 +1,112 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "tmax": 750,
+ "site": {
+ "page": "https://example.com/article",
+ "domain": "example.com"
+ },
+ "device": {
+ "ua": "test-user-agent",
+ "ip": "203.0.113.9"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "tagid": "div-gpt-ad-1",
+ "bidfloor": 0.25,
+ "bidfloorcur": "USD",
+ "native": {
+ "ver": "1.2",
+ "request": "{\"ver\":\"1.2\",\"context\":1,\"plcmttype\":4,\"plcmtcnt\":1,\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"w\":1200,\"h\":627}}]}"
+ },
+ "ext": {
+ "bidder": {
+ "placementId": "ezoic-placement-1"
+ }
+ }
+ }
+ ]
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://g.ezoic.net/ezoic/prebid/adapter/ortb",
+ "body": {
+ "id": "test-request-id",
+ "tmax": 750,
+ "site": {
+ "page": "https://example.com/article",
+ "domain": "example.com"
+ },
+ "device": {
+ "ua": "test-user-agent",
+ "ip": "203.0.113.9"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "tagid": "div-gpt-ad-1",
+ "bidfloor": 0.25,
+ "bidfloorcur": "USD",
+ "native": {
+ "ver": "1.2",
+ "request": "{\"ver\":\"1.2\",\"context\":1,\"plcmttype\":4,\"plcmtcnt\":1,\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"w\":1200,\"h\":627}}]}"
+ },
+ "ext": {
+ "bidder": {
+ "placementId": "ezoic-placement-1"
+ }
+ }
+ }
+ ]
+ },
+ "impIDs": [
+ "test-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "test-request-id",
+ "cur": "USD",
+ "seatbid": [
+ {
+ "seat": "ezoic",
+ "bid": [
+ {
+ "id": "ezoic-bid-1",
+ "impid": "test-imp-id",
+ "price": 1.75,
+ "adm": "{\"native\":{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"title\":{\"text\":\"ezoic native title\"}}],\"link\":{\"url\":\"https://example.com/click\"}}}",
+ "crid": "ezoic-creative-1",
+ "mtype": 4,
+ "exp": 300
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "currency": "USD",
+ "bids": [
+ {
+ "bid": {
+ "id": "ezoic-bid-1",
+ "impid": "test-imp-id",
+ "price": 1.75,
+ "adm": "{\"native\":{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"title\":{\"text\":\"ezoic native title\"}}],\"link\":{\"url\":\"https://example.com/click\"}}}",
+ "crid": "ezoic-creative-1",
+ "mtype": 4,
+ "exp": 300
+ },
+ "type": "native"
+ }
+ ]
+ }
+ ]
+}
diff --git a/adapters/ezoic/ezoictest/exemplary/simple-video.json b/adapters/ezoic/ezoictest/exemplary/simple-video.json
new file mode 100644
index 000000000..6db45edc5
--- /dev/null
+++ b/adapters/ezoic/ezoictest/exemplary/simple-video.json
@@ -0,0 +1,138 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "tmax": 750,
+ "site": {
+ "page": "https://example.com/article",
+ "domain": "example.com"
+ },
+ "device": {
+ "ua": "test-user-agent",
+ "ip": "203.0.113.9"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "tagid": "div-gpt-ad-1",
+ "bidfloor": 0.25,
+ "bidfloorcur": "USD",
+ "video": {
+ "mimes": [
+ "video/mp4"
+ ],
+ "protocols": [
+ 2,
+ 3,
+ 5,
+ 6
+ ],
+ "w": 640,
+ "h": 480,
+ "minduration": 5,
+ "maxduration": 30
+ },
+ "ext": {
+ "bidder": {
+ "placementId": "ezoic-placement-1"
+ }
+ }
+ }
+ ]
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://g.ezoic.net/ezoic/prebid/adapter/ortb",
+ "body": {
+ "id": "test-request-id",
+ "tmax": 750,
+ "site": {
+ "page": "https://example.com/article",
+ "domain": "example.com"
+ },
+ "device": {
+ "ua": "test-user-agent",
+ "ip": "203.0.113.9"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "tagid": "div-gpt-ad-1",
+ "bidfloor": 0.25,
+ "bidfloorcur": "USD",
+ "video": {
+ "mimes": [
+ "video/mp4"
+ ],
+ "protocols": [
+ 2,
+ 3,
+ 5,
+ 6
+ ],
+ "w": 640,
+ "h": 480,
+ "minduration": 5,
+ "maxduration": 30
+ },
+ "ext": {
+ "bidder": {
+ "placementId": "ezoic-placement-1"
+ }
+ }
+ }
+ ]
+ },
+ "impIDs": [
+ "test-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "test-request-id",
+ "cur": "USD",
+ "seatbid": [
+ {
+ "seat": "ezoic",
+ "bid": [
+ {
+ "id": "ezoic-bid-1",
+ "impid": "test-imp-id",
+ "price": 4.5,
+ "adm": "",
+ "crid": "ezoic-creative-1",
+ "w": 640,
+ "h": 480,
+ "mtype": 2,
+ "exp": 300
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "currency": "USD",
+ "bids": [
+ {
+ "bid": {
+ "id": "ezoic-bid-1",
+ "impid": "test-imp-id",
+ "price": 4.5,
+ "adm": "",
+ "crid": "ezoic-creative-1",
+ "w": 640,
+ "h": 480,
+ "mtype": 2,
+ "exp": 300
+ },
+ "type": "video"
+ }
+ ]
+ }
+ ]
+}
diff --git a/adapters/ezoic/ezoictest/supplemental/invalid-response.json b/adapters/ezoic/ezoictest/supplemental/invalid-response.json
new file mode 100644
index 000000000..adcb3c100
--- /dev/null
+++ b/adapters/ezoic/ezoictest/supplemental/invalid-response.json
@@ -0,0 +1,69 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "site": {
+ "page": "https://example.com/article",
+ "domain": "example.com"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {}
+ }
+ }
+ ]
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://g.ezoic.net/ezoic/prebid/adapter/ortb",
+ "body": {
+ "id": "test-request-id",
+ "site": {
+ "page": "https://example.com/article",
+ "domain": "example.com"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {}
+ }
+ }
+ ]
+ },
+ "impIDs": [
+ "test-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": "invalid response"
+ }
+ }
+ ],
+ "expectedBidResponses": [],
+ "expectedMakeBidsErrors": [
+ {
+ "value": "expect",
+ "comparison": "regex"
+ }
+ ]
+}
diff --git a/adapters/ezoic/ezoictest/supplemental/status-204.json b/adapters/ezoic/ezoictest/supplemental/status-204.json
new file mode 100644
index 000000000..2c60ef485
--- /dev/null
+++ b/adapters/ezoic/ezoictest/supplemental/status-204.json
@@ -0,0 +1,63 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "site": {
+ "page": "https://example.com/article",
+ "domain": "example.com"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {}
+ }
+ }
+ ]
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://g.ezoic.net/ezoic/prebid/adapter/ortb",
+ "body": {
+ "id": "test-request-id",
+ "site": {
+ "page": "https://example.com/article",
+ "domain": "example.com"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {}
+ }
+ }
+ ]
+ },
+ "impIDs": [
+ "test-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 204,
+ "body": {}
+ }
+ }
+ ],
+ "expectedBidResponses": []
+}
diff --git a/adapters/ezoic/ezoictest/supplemental/status-400.json b/adapters/ezoic/ezoictest/supplemental/status-400.json
new file mode 100644
index 000000000..8d156eb86
--- /dev/null
+++ b/adapters/ezoic/ezoictest/supplemental/status-400.json
@@ -0,0 +1,69 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "site": {
+ "page": "https://example.com/article",
+ "domain": "example.com"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {}
+ }
+ }
+ ]
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://g.ezoic.net/ezoic/prebid/adapter/ortb",
+ "body": {
+ "id": "test-request-id",
+ "site": {
+ "page": "https://example.com/article",
+ "domain": "example.com"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {}
+ }
+ }
+ ]
+ },
+ "impIDs": [
+ "test-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 400,
+ "body": {}
+ }
+ }
+ ],
+ "expectedBidResponses": [],
+ "expectedMakeBidsErrors": [
+ {
+ "value": "Unexpected status code: 400. Run with request.debug = 1 for more info",
+ "comparison": "literal"
+ }
+ ]
+}
diff --git a/adapters/ezoic/ezoictest/supplemental/status-500.json b/adapters/ezoic/ezoictest/supplemental/status-500.json
new file mode 100644
index 000000000..1d0b41829
--- /dev/null
+++ b/adapters/ezoic/ezoictest/supplemental/status-500.json
@@ -0,0 +1,69 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "site": {
+ "page": "https://example.com/article",
+ "domain": "example.com"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {}
+ }
+ }
+ ]
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://g.ezoic.net/ezoic/prebid/adapter/ortb",
+ "body": {
+ "id": "test-request-id",
+ "site": {
+ "page": "https://example.com/article",
+ "domain": "example.com"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {}
+ }
+ }
+ ]
+ },
+ "impIDs": [
+ "test-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 500,
+ "body": {}
+ }
+ }
+ ],
+ "expectedBidResponses": [],
+ "expectedMakeBidsErrors": [
+ {
+ "value": "Unexpected status code: 500. Run with request.debug = 1 for more info",
+ "comparison": "literal"
+ }
+ ]
+}
diff --git a/adapters/ezoic/ezoictest/supplemental/unsupported-mtype.json b/adapters/ezoic/ezoictest/supplemental/unsupported-mtype.json
new file mode 100644
index 000000000..39d7506d6
--- /dev/null
+++ b/adapters/ezoic/ezoictest/supplemental/unsupported-mtype.json
@@ -0,0 +1,117 @@
+{
+ "mockBidRequest": {
+ "id": "test-request-id",
+ "site": {
+ "page": "https://example.com/article",
+ "domain": "example.com"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {}
+ }
+ }
+ ]
+ },
+ "httpCalls": [
+ {
+ "expectedRequest": {
+ "uri": "https://g.ezoic.net/ezoic/prebid/adapter/ortb",
+ "body": {
+ "id": "test-request-id",
+ "site": {
+ "page": "https://example.com/article",
+ "domain": "example.com"
+ },
+ "imp": [
+ {
+ "id": "test-imp-id",
+ "banner": {
+ "format": [
+ {
+ "w": 300,
+ "h": 250
+ }
+ ]
+ },
+ "ext": {
+ "bidder": {}
+ }
+ }
+ ]
+ },
+ "impIDs": [
+ "test-imp-id"
+ ]
+ },
+ "mockResponse": {
+ "status": 200,
+ "body": {
+ "id": "test-request-id",
+ "cur": "USD",
+ "seatbid": [
+ {
+ "seat": "ezoic",
+ "bid": [
+ {
+ "id": "ezoic-bid-good",
+ "impid": "test-imp-id",
+ "price": 1.25,
+ "adm": "creative
",
+ "crid": "ezoic-creative-1",
+ "w": 300,
+ "h": 250,
+ "mtype": 1
+ },
+ {
+ "id": "ezoic-bid-no-mtype",
+ "impid": "test-imp-id",
+ "price": 9.99,
+ "adm": "creative
",
+ "crid": "ezoic-creative-2",
+ "w": 300,
+ "h": 250
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "expectedBidResponses": [
+ {
+ "currency": "USD",
+ "bids": [
+ {
+ "bid": {
+ "id": "ezoic-bid-good",
+ "impid": "test-imp-id",
+ "price": 1.25,
+ "adm": "creative
",
+ "crid": "ezoic-creative-1",
+ "w": 300,
+ "h": 250,
+ "mtype": 1
+ },
+ "type": "banner"
+ }
+ ]
+ }
+ ],
+ "expectedMakeBidsErrors": [
+ {
+ "value": "unsupported mtype 0 for bid ezoic-bid-no-mtype",
+ "comparison": "literal"
+ }
+ ]
+}
diff --git a/adapters/ezoic/params_test.go b/adapters/ezoic/params_test.go
new file mode 100644
index 000000000..91994fe4c
--- /dev/null
+++ b/adapters/ezoic/params_test.go
@@ -0,0 +1,52 @@
+package ezoic
+
+import (
+ "encoding/json"
+ "testing"
+
+ "github.com/prebid/prebid-server/v4/openrtb_ext"
+)
+
+// This file intends to test static/bidder-params/ezoic.json
+//
+// These also validate the format of the external API: request.imp[i].ext.prebid.bidder.ezoic
+
+func TestValidParams(t *testing.T) {
+ validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params")
+ if err != nil {
+ t.Fatalf("Failed to fetch the json-schemas. %v", err)
+ }
+
+ for _, validParam := range validParams {
+ if err := validator.Validate(openrtb_ext.BidderEzoic, json.RawMessage(validParam)); err != nil {
+ t.Errorf("Schema rejected ezoic params: %s", validParam)
+ }
+ }
+}
+
+func TestInvalidParams(t *testing.T) {
+ validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params")
+ if err != nil {
+ t.Fatalf("Failed to fetch the json-schemas. %v", err)
+ }
+
+ for _, invalidParam := range invalidParams {
+ if err := validator.Validate(openrtb_ext.BidderEzoic, json.RawMessage(invalidParam)); err == nil {
+ t.Errorf("Schema allowed unexpected params: %s", invalidParam)
+ }
+ }
+}
+
+var validParams = []string{
+ `{}`,
+ `{"placementId": "ezoic-placement-1"}`,
+}
+
+var invalidParams = []string{
+ `null`,
+ `true`,
+ `[]`,
+ `"placementId"`,
+ `{"placementId": 12345}`,
+ `{"placementId": true}`,
+}
diff --git a/exchange/adapter_builders.go b/exchange/adapter_builders.go
index fa1ea996f..17b7ae4c2 100755
--- a/exchange/adapter_builders.go
+++ b/exchange/adapter_builders.go
@@ -1,263 +1,275 @@
package exchange
import (
- "github.com/prebid/prebid-server/v3/adapters"
- ttx "github.com/prebid/prebid-server/v3/adapters/33across"
- "github.com/prebid/prebid-server/v3/adapters/aax"
- "github.com/prebid/prebid-server/v3/adapters/aceex"
- "github.com/prebid/prebid-server/v3/adapters/acuityads"
- "github.com/prebid/prebid-server/v3/adapters/adagio"
- "github.com/prebid/prebid-server/v3/adapters/adelement"
- "github.com/prebid/prebid-server/v3/adapters/adf"
- "github.com/prebid/prebid-server/v3/adapters/adgeneration"
- "github.com/prebid/prebid-server/v3/adapters/adhese"
- "github.com/prebid/prebid-server/v3/adapters/adkernel"
- "github.com/prebid/prebid-server/v3/adapters/adkernelAdn"
- "github.com/prebid/prebid-server/v3/adapters/adman"
- "github.com/prebid/prebid-server/v3/adapters/admatic"
- "github.com/prebid/prebid-server/v3/adapters/admixer"
- "github.com/prebid/prebid-server/v3/adapters/adnuntius"
- "github.com/prebid/prebid-server/v3/adapters/adocean"
- "github.com/prebid/prebid-server/v3/adapters/adoppler"
- "github.com/prebid/prebid-server/v3/adapters/adot"
- "github.com/prebid/prebid-server/v3/adapters/adpone"
- "github.com/prebid/prebid-server/v3/adapters/adprime"
- "github.com/prebid/prebid-server/v3/adapters/adquery"
- "github.com/prebid/prebid-server/v3/adapters/adrino"
- "github.com/prebid/prebid-server/v3/adapters/ads_interactive"
- "github.com/prebid/prebid-server/v3/adapters/adsinteractive"
- "github.com/prebid/prebid-server/v3/adapters/adtarget"
- "github.com/prebid/prebid-server/v3/adapters/adtelligent"
- "github.com/prebid/prebid-server/v3/adapters/adtonos"
- "github.com/prebid/prebid-server/v3/adapters/adtrgtme"
- "github.com/prebid/prebid-server/v3/adapters/aduptech"
- "github.com/prebid/prebid-server/v3/adapters/advangelists"
- "github.com/prebid/prebid-server/v3/adapters/adverxo"
- "github.com/prebid/prebid-server/v3/adapters/adview"
- "github.com/prebid/prebid-server/v3/adapters/adxcg"
- "github.com/prebid/prebid-server/v3/adapters/adyoulike"
- "github.com/prebid/prebid-server/v3/adapters/afront"
- "github.com/prebid/prebid-server/v3/adapters/aidem"
- "github.com/prebid/prebid-server/v3/adapters/aja"
- "github.com/prebid/prebid-server/v3/adapters/akcelo"
- "github.com/prebid/prebid-server/v3/adapters/algorix"
- "github.com/prebid/prebid-server/v3/adapters/alkimi"
- "github.com/prebid/prebid-server/v3/adapters/amx"
- "github.com/prebid/prebid-server/v3/adapters/apacdex"
- "github.com/prebid/prebid-server/v3/adapters/appnexus"
- "github.com/prebid/prebid-server/v3/adapters/appush"
- "github.com/prebid/prebid-server/v3/adapters/aso"
- "github.com/prebid/prebid-server/v3/adapters/audienceNetwork"
- "github.com/prebid/prebid-server/v3/adapters/automatad"
- "github.com/prebid/prebid-server/v3/adapters/avocet"
- "github.com/prebid/prebid-server/v3/adapters/axis"
- "github.com/prebid/prebid-server/v3/adapters/axonix"
- "github.com/prebid/prebid-server/v3/adapters/beachfront"
- "github.com/prebid/prebid-server/v3/adapters/beintoo"
- "github.com/prebid/prebid-server/v3/adapters/bematterfull"
- "github.com/prebid/prebid-server/v3/adapters/between"
- "github.com/prebid/prebid-server/v3/adapters/beyondmedia"
- "github.com/prebid/prebid-server/v3/adapters/bidmachine"
- "github.com/prebid/prebid-server/v3/adapters/bidmatic"
- "github.com/prebid/prebid-server/v3/adapters/bidmyadz"
- "github.com/prebid/prebid-server/v3/adapters/bidscube"
- "github.com/prebid/prebid-server/v3/adapters/bidstack"
- "github.com/prebid/prebid-server/v3/adapters/bidtheatre"
- "github.com/prebid/prebid-server/v3/adapters/bigoad"
- "github.com/prebid/prebid-server/v3/adapters/blasto"
- "github.com/prebid/prebid-server/v3/adapters/bliink"
- "github.com/prebid/prebid-server/v3/adapters/blis"
- "github.com/prebid/prebid-server/v3/adapters/blue"
- "github.com/prebid/prebid-server/v3/adapters/bluesea"
- "github.com/prebid/prebid-server/v3/adapters/bmtm"
- "github.com/prebid/prebid-server/v3/adapters/boldwin"
- "github.com/prebid/prebid-server/v3/adapters/brave"
- "github.com/prebid/prebid-server/v3/adapters/bwx"
- cadentaperturemx "github.com/prebid/prebid-server/v3/adapters/cadent_aperture_mx"
- "github.com/prebid/prebid-server/v3/adapters/ccx"
- "github.com/prebid/prebid-server/v3/adapters/cointraffic"
- "github.com/prebid/prebid-server/v3/adapters/coinzilla"
- "github.com/prebid/prebid-server/v3/adapters/colossus"
- "github.com/prebid/prebid-server/v3/adapters/compass"
- "github.com/prebid/prebid-server/v3/adapters/concert"
- "github.com/prebid/prebid-server/v3/adapters/connatix"
- "github.com/prebid/prebid-server/v3/adapters/connectad"
- "github.com/prebid/prebid-server/v3/adapters/consumable"
- "github.com/prebid/prebid-server/v3/adapters/conversant"
- "github.com/prebid/prebid-server/v3/adapters/copper6ssp"
- "github.com/prebid/prebid-server/v3/adapters/cpmstar"
- "github.com/prebid/prebid-server/v3/adapters/criteo"
- "github.com/prebid/prebid-server/v3/adapters/cwire"
- "github.com/prebid/prebid-server/v3/adapters/datablocks"
- "github.com/prebid/prebid-server/v3/adapters/decenterads"
- "github.com/prebid/prebid-server/v3/adapters/deepintent"
- "github.com/prebid/prebid-server/v3/adapters/definemedia"
- "github.com/prebid/prebid-server/v3/adapters/dianomi"
- "github.com/prebid/prebid-server/v3/adapters/displayio"
- "github.com/prebid/prebid-server/v3/adapters/dmx"
- "github.com/prebid/prebid-server/v3/adapters/driftpixel"
- "github.com/prebid/prebid-server/v3/adapters/dxkulture"
- evolution "github.com/prebid/prebid-server/v3/adapters/e_volution"
- "github.com/prebid/prebid-server/v3/adapters/edge226"
- "github.com/prebid/prebid-server/v3/adapters/emtv"
- "github.com/prebid/prebid-server/v3/adapters/eplanning"
- "github.com/prebid/prebid-server/v3/adapters/epom"
- "github.com/prebid/prebid-server/v3/adapters/escalax"
- "github.com/prebid/prebid-server/v3/adapters/exco"
- "github.com/prebid/prebid-server/v3/adapters/feedad"
- "github.com/prebid/prebid-server/v3/adapters/flatads"
- "github.com/prebid/prebid-server/v3/adapters/flipp"
- "github.com/prebid/prebid-server/v3/adapters/freewheelssp"
- "github.com/prebid/prebid-server/v3/adapters/frvradn"
- "github.com/prebid/prebid-server/v3/adapters/fwssp"
- "github.com/prebid/prebid-server/v3/adapters/gamma"
- "github.com/prebid/prebid-server/v3/adapters/gamoshi"
- "github.com/prebid/prebid-server/v3/adapters/globalsun"
- "github.com/prebid/prebid-server/v3/adapters/gothamads"
- "github.com/prebid/prebid-server/v3/adapters/grid"
- "github.com/prebid/prebid-server/v3/adapters/gumgum"
- "github.com/prebid/prebid-server/v3/adapters/huaweiads"
- "github.com/prebid/prebid-server/v3/adapters/imds"
- "github.com/prebid/prebid-server/v3/adapters/impactify"
- "github.com/prebid/prebid-server/v3/adapters/improvedigital"
- "github.com/prebid/prebid-server/v3/adapters/infytv"
- "github.com/prebid/prebid-server/v3/adapters/inmobi"
- "github.com/prebid/prebid-server/v3/adapters/insticator"
- "github.com/prebid/prebid-server/v3/adapters/interactiveoffers"
- "github.com/prebid/prebid-server/v3/adapters/intertech"
- "github.com/prebid/prebid-server/v3/adapters/invibes"
- "github.com/prebid/prebid-server/v3/adapters/iqx"
- "github.com/prebid/prebid-server/v3/adapters/iqzone"
- "github.com/prebid/prebid-server/v3/adapters/ix"
- "github.com/prebid/prebid-server/v3/adapters/jixie"
- "github.com/prebid/prebid-server/v3/adapters/kargo"
- "github.com/prebid/prebid-server/v3/adapters/kayzen"
- "github.com/prebid/prebid-server/v3/adapters/kidoz"
- "github.com/prebid/prebid-server/v3/adapters/kiviads"
- "github.com/prebid/prebid-server/v3/adapters/kobler"
- "github.com/prebid/prebid-server/v3/adapters/krushmedia"
- "github.com/prebid/prebid-server/v3/adapters/kueezrtb"
- "github.com/prebid/prebid-server/v3/adapters/lemmadigital"
- "github.com/prebid/prebid-server/v3/adapters/limelightDigital"
- lmkiviads "github.com/prebid/prebid-server/v3/adapters/lm_kiviads"
- "github.com/prebid/prebid-server/v3/adapters/lockerdome"
- "github.com/prebid/prebid-server/v3/adapters/logan"
- "github.com/prebid/prebid-server/v3/adapters/logicad"
- "github.com/prebid/prebid-server/v3/adapters/loopme"
- "github.com/prebid/prebid-server/v3/adapters/loyal"
- "github.com/prebid/prebid-server/v3/adapters/lunamedia"
- "github.com/prebid/prebid-server/v3/adapters/mabidder"
- "github.com/prebid/prebid-server/v3/adapters/madsense"
- "github.com/prebid/prebid-server/v3/adapters/madvertise"
- "github.com/prebid/prebid-server/v3/adapters/marsmedia"
- "github.com/prebid/prebid-server/v3/adapters/mediago"
- "github.com/prebid/prebid-server/v3/adapters/medianet"
- "github.com/prebid/prebid-server/v3/adapters/mediasquare"
- "github.com/prebid/prebid-server/v3/adapters/melozen"
- "github.com/prebid/prebid-server/v3/adapters/metax"
- "github.com/prebid/prebid-server/v3/adapters/mgid"
- "github.com/prebid/prebid-server/v3/adapters/mgidX"
- "github.com/prebid/prebid-server/v3/adapters/minutemedia"
- "github.com/prebid/prebid-server/v3/adapters/missena"
- "github.com/prebid/prebid-server/v3/adapters/mobfoxpb"
- "github.com/prebid/prebid-server/v3/adapters/mobilefuse"
- "github.com/prebid/prebid-server/v3/adapters/mobkoi"
- "github.com/prebid/prebid-server/v3/adapters/motorik"
- "github.com/prebid/prebid-server/v3/adapters/nativo"
- "github.com/prebid/prebid-server/v3/adapters/nextmillennium"
- "github.com/prebid/prebid-server/v3/adapters/nexx360"
- "github.com/prebid/prebid-server/v3/adapters/nobid"
- "github.com/prebid/prebid-server/v3/adapters/ogury"
- "github.com/prebid/prebid-server/v3/adapters/oms"
- "github.com/prebid/prebid-server/v3/adapters/onetag"
- "github.com/prebid/prebid-server/v3/adapters/openweb"
- "github.com/prebid/prebid-server/v3/adapters/openx"
- "github.com/prebid/prebid-server/v3/adapters/operaads"
- "github.com/prebid/prebid-server/v3/adapters/optidigital"
- "github.com/prebid/prebid-server/v3/adapters/oraki"
- "github.com/prebid/prebid-server/v3/adapters/orbidder"
- "github.com/prebid/prebid-server/v3/adapters/outbrain"
- "github.com/prebid/prebid-server/v3/adapters/ownadx"
- "github.com/prebid/prebid-server/v3/adapters/pangle"
- "github.com/prebid/prebid-server/v3/adapters/pgamssp"
- "github.com/prebid/prebid-server/v3/adapters/playdigo"
- "github.com/prebid/prebid-server/v3/adapters/pubmatic"
- "github.com/prebid/prebid-server/v3/adapters/pubnative"
- "github.com/prebid/prebid-server/v3/adapters/pubrise"
- "github.com/prebid/prebid-server/v3/adapters/pulsepoint"
- "github.com/prebid/prebid-server/v3/adapters/pwbid"
- "github.com/prebid/prebid-server/v3/adapters/qt"
- "github.com/prebid/prebid-server/v3/adapters/readpeak"
- "github.com/prebid/prebid-server/v3/adapters/rediads"
- "github.com/prebid/prebid-server/v3/adapters/relevantdigital"
- "github.com/prebid/prebid-server/v3/adapters/resetdigital"
- "github.com/prebid/prebid-server/v3/adapters/revcontent"
- "github.com/prebid/prebid-server/v3/adapters/richaudience"
- "github.com/prebid/prebid-server/v3/adapters/rise"
- "github.com/prebid/prebid-server/v3/adapters/roulax"
- "github.com/prebid/prebid-server/v3/adapters/rtbhouse"
- "github.com/prebid/prebid-server/v3/adapters/rubicon"
- salunamedia "github.com/prebid/prebid-server/v3/adapters/sa_lunamedia"
- "github.com/prebid/prebid-server/v3/adapters/screencore"
- "github.com/prebid/prebid-server/v3/adapters/seedingAlliance"
- "github.com/prebid/prebid-server/v3/adapters/seedtag"
- "github.com/prebid/prebid-server/v3/adapters/sharethrough"
- "github.com/prebid/prebid-server/v3/adapters/silvermob"
- "github.com/prebid/prebid-server/v3/adapters/silverpush"
- "github.com/prebid/prebid-server/v3/adapters/smaato"
- "github.com/prebid/prebid-server/v3/adapters/smartadserver"
- "github.com/prebid/prebid-server/v3/adapters/smarthub"
- "github.com/prebid/prebid-server/v3/adapters/smartrtb"
- "github.com/prebid/prebid-server/v3/adapters/smartx"
- "github.com/prebid/prebid-server/v3/adapters/smartyads"
- "github.com/prebid/prebid-server/v3/adapters/smilewanted"
- "github.com/prebid/prebid-server/v3/adapters/smoot"
- "github.com/prebid/prebid-server/v3/adapters/smrtconnect"
- "github.com/prebid/prebid-server/v3/adapters/sonobi"
- "github.com/prebid/prebid-server/v3/adapters/sovrn"
- "github.com/prebid/prebid-server/v3/adapters/sovrnXsp"
- "github.com/prebid/prebid-server/v3/adapters/sparteo"
- "github.com/prebid/prebid-server/v3/adapters/sspBC"
- "github.com/prebid/prebid-server/v3/adapters/startio"
- "github.com/prebid/prebid-server/v3/adapters/stroeerCore"
- "github.com/prebid/prebid-server/v3/adapters/taboola"
- "github.com/prebid/prebid-server/v3/adapters/tappx"
- "github.com/prebid/prebid-server/v3/adapters/teads"
- "github.com/prebid/prebid-server/v3/adapters/telaria"
- "github.com/prebid/prebid-server/v3/adapters/teqblaze"
- "github.com/prebid/prebid-server/v3/adapters/theadx"
- "github.com/prebid/prebid-server/v3/adapters/thetradedesk"
- "github.com/prebid/prebid-server/v3/adapters/tpmn"
- "github.com/prebid/prebid-server/v3/adapters/tradplus"
- "github.com/prebid/prebid-server/v3/adapters/trafficgate"
- "github.com/prebid/prebid-server/v3/adapters/triplelift"
- "github.com/prebid/prebid-server/v3/adapters/triplelift_native"
- "github.com/prebid/prebid-server/v3/adapters/trustedstack"
- "github.com/prebid/prebid-server/v3/adapters/ucfunnel"
- "github.com/prebid/prebid-server/v3/adapters/undertone"
- "github.com/prebid/prebid-server/v3/adapters/unicorn"
- "github.com/prebid/prebid-server/v3/adapters/unruly"
- "github.com/prebid/prebid-server/v3/adapters/vidazoo"
- "github.com/prebid/prebid-server/v3/adapters/videobyte"
- "github.com/prebid/prebid-server/v3/adapters/videoheroes"
- "github.com/prebid/prebid-server/v3/adapters/vidoomy"
- "github.com/prebid/prebid-server/v3/adapters/visiblemeasures"
- "github.com/prebid/prebid-server/v3/adapters/visx"
- "github.com/prebid/prebid-server/v3/adapters/vox"
- "github.com/prebid/prebid-server/v3/adapters/vrtcal"
- "github.com/prebid/prebid-server/v3/adapters/vungle"
- "github.com/prebid/prebid-server/v3/adapters/xeworks"
- "github.com/prebid/prebid-server/v3/adapters/yahooAds"
- "github.com/prebid/prebid-server/v3/adapters/yandex"
- "github.com/prebid/prebid-server/v3/adapters/yeahmobi"
- "github.com/prebid/prebid-server/v3/adapters/yieldlab"
- "github.com/prebid/prebid-server/v3/adapters/yieldmo"
- "github.com/prebid/prebid-server/v3/adapters/yieldone"
- "github.com/prebid/prebid-server/v3/adapters/zentotem"
- "github.com/prebid/prebid-server/v3/adapters/zeroclickfraud"
- "github.com/prebid/prebid-server/v3/adapters/zeta_global_ssp"
- "github.com/prebid/prebid-server/v3/adapters/zmaticoo"
- "github.com/prebid/prebid-server/v3/openrtb_ext"
+ "github.com/prebid/prebid-server/v4/adapters"
+ ttx "github.com/prebid/prebid-server/v4/adapters/33across"
+ "github.com/prebid/prebid-server/v4/adapters/aax"
+ "github.com/prebid/prebid-server/v4/adapters/aceex"
+ "github.com/prebid/prebid-server/v4/adapters/acuityads"
+ "github.com/prebid/prebid-server/v4/adapters/adagio"
+ "github.com/prebid/prebid-server/v4/adapters/adelement"
+ "github.com/prebid/prebid-server/v4/adapters/adf"
+ "github.com/prebid/prebid-server/v4/adapters/adgeneration"
+ "github.com/prebid/prebid-server/v4/adapters/adhese"
+ "github.com/prebid/prebid-server/v4/adapters/adkernel"
+ "github.com/prebid/prebid-server/v4/adapters/adkernelAdn"
+ "github.com/prebid/prebid-server/v4/adapters/adman"
+ "github.com/prebid/prebid-server/v4/adapters/admatic"
+ "github.com/prebid/prebid-server/v4/adapters/admixer"
+ "github.com/prebid/prebid-server/v4/adapters/adnuntius"
+ "github.com/prebid/prebid-server/v4/adapters/adot"
+ "github.com/prebid/prebid-server/v4/adapters/adpone"
+ "github.com/prebid/prebid-server/v4/adapters/adprime"
+ "github.com/prebid/prebid-server/v4/adapters/adquery"
+ "github.com/prebid/prebid-server/v4/adapters/adrino"
+ "github.com/prebid/prebid-server/v4/adapters/adtarget"
+ "github.com/prebid/prebid-server/v4/adapters/adtelligent"
+ "github.com/prebid/prebid-server/v4/adapters/adtonos"
+ "github.com/prebid/prebid-server/v4/adapters/adtrgtme"
+ "github.com/prebid/prebid-server/v4/adapters/aduptech"
+ "github.com/prebid/prebid-server/v4/adapters/advangelists"
+ "github.com/prebid/prebid-server/v4/adapters/adverxo"
+ "github.com/prebid/prebid-server/v4/adapters/adview"
+ "github.com/prebid/prebid-server/v4/adapters/adxcg"
+ "github.com/prebid/prebid-server/v4/adapters/adyoulike"
+ "github.com/prebid/prebid-server/v4/adapters/afront"
+ "github.com/prebid/prebid-server/v4/adapters/aidem"
+ "github.com/prebid/prebid-server/v4/adapters/aja"
+ "github.com/prebid/prebid-server/v4/adapters/akcelo"
+ "github.com/prebid/prebid-server/v4/adapters/algorix"
+ "github.com/prebid/prebid-server/v4/adapters/alkimi"
+ alliance_gravity "github.com/prebid/prebid-server/v4/adapters/alliance_gravity"
+ "github.com/prebid/prebid-server/v4/adapters/amx"
+ "github.com/prebid/prebid-server/v4/adapters/apacdex"
+ "github.com/prebid/prebid-server/v4/adapters/appnexus"
+ "github.com/prebid/prebid-server/v4/adapters/appush"
+ "github.com/prebid/prebid-server/v4/adapters/aso"
+ "github.com/prebid/prebid-server/v4/adapters/audienceNetwork"
+ "github.com/prebid/prebid-server/v4/adapters/automatad"
+ "github.com/prebid/prebid-server/v4/adapters/avocet"
+ "github.com/prebid/prebid-server/v4/adapters/axis"
+ "github.com/prebid/prebid-server/v4/adapters/axonix"
+ "github.com/prebid/prebid-server/v4/adapters/beachfront"
+ "github.com/prebid/prebid-server/v4/adapters/beintoo"
+ "github.com/prebid/prebid-server/v4/adapters/bematterfull"
+ "github.com/prebid/prebid-server/v4/adapters/beop"
+ "github.com/prebid/prebid-server/v4/adapters/between"
+ "github.com/prebid/prebid-server/v4/adapters/beyondmedia"
+ "github.com/prebid/prebid-server/v4/adapters/bidmachine"
+ "github.com/prebid/prebid-server/v4/adapters/bidmatic"
+ "github.com/prebid/prebid-server/v4/adapters/bidmyadz"
+ "github.com/prebid/prebid-server/v4/adapters/bidscube"
+ "github.com/prebid/prebid-server/v4/adapters/bidstack"
+ "github.com/prebid/prebid-server/v4/adapters/bidtheatre"
+ "github.com/prebid/prebid-server/v4/adapters/bigoad"
+ "github.com/prebid/prebid-server/v4/adapters/blasto"
+ "github.com/prebid/prebid-server/v4/adapters/bliink"
+ "github.com/prebid/prebid-server/v4/adapters/blis"
+ "github.com/prebid/prebid-server/v4/adapters/blue"
+ "github.com/prebid/prebid-server/v4/adapters/bluesea"
+ "github.com/prebid/prebid-server/v4/adapters/bmtm"
+ "github.com/prebid/prebid-server/v4/adapters/boldwin"
+ "github.com/prebid/prebid-server/v4/adapters/boldwin_rapid"
+ "github.com/prebid/prebid-server/v4/adapters/brave"
+ "github.com/prebid/prebid-server/v4/adapters/bwx"
+ cadentaperturemx "github.com/prebid/prebid-server/v4/adapters/cadent_aperture_mx"
+ "github.com/prebid/prebid-server/v4/adapters/ccx"
+ "github.com/prebid/prebid-server/v4/adapters/clydo"
+ "github.com/prebid/prebid-server/v4/adapters/cointraffic"
+ "github.com/prebid/prebid-server/v4/adapters/coinzilla"
+ "github.com/prebid/prebid-server/v4/adapters/colossus"
+ "github.com/prebid/prebid-server/v4/adapters/compass"
+ "github.com/prebid/prebid-server/v4/adapters/concert"
+ "github.com/prebid/prebid-server/v4/adapters/connatix"
+ "github.com/prebid/prebid-server/v4/adapters/connectad"
+ "github.com/prebid/prebid-server/v4/adapters/consumable"
+ "github.com/prebid/prebid-server/v4/adapters/contxtful"
+ "github.com/prebid/prebid-server/v4/adapters/conversant"
+ "github.com/prebid/prebid-server/v4/adapters/copper6ssp"
+ "github.com/prebid/prebid-server/v4/adapters/cpmstar"
+ "github.com/prebid/prebid-server/v4/adapters/criteo"
+ "github.com/prebid/prebid-server/v4/adapters/cwire"
+ "github.com/prebid/prebid-server/v4/adapters/datablocks"
+ "github.com/prebid/prebid-server/v4/adapters/decenterads"
+ "github.com/prebid/prebid-server/v4/adapters/deepintent"
+ "github.com/prebid/prebid-server/v4/adapters/definemedia"
+ "github.com/prebid/prebid-server/v4/adapters/dianomi"
+ "github.com/prebid/prebid-server/v4/adapters/displayio"
+ "github.com/prebid/prebid-server/v4/adapters/dmx"
+ "github.com/prebid/prebid-server/v4/adapters/driftpixel"
+ evolution "github.com/prebid/prebid-server/v4/adapters/e_volution"
+ "github.com/prebid/prebid-server/v4/adapters/edge226"
+ "github.com/prebid/prebid-server/v4/adapters/elementaltv"
+ "github.com/prebid/prebid-server/v4/adapters/emtv"
+ "github.com/prebid/prebid-server/v4/adapters/eplanning"
+ "github.com/prebid/prebid-server/v4/adapters/epom"
+ "github.com/prebid/prebid-server/v4/adapters/escalax"
+ "github.com/prebid/prebid-server/v4/adapters/eskimi"
+ "github.com/prebid/prebid-server/v4/adapters/exco"
+ "github.com/prebid/prebid-server/v4/adapters/ezoic"
+ "github.com/prebid/prebid-server/v4/adapters/feedad"
+ "github.com/prebid/prebid-server/v4/adapters/flatads"
+ "github.com/prebid/prebid-server/v4/adapters/flipp"
+ "github.com/prebid/prebid-server/v4/adapters/freewheelssp"
+ "github.com/prebid/prebid-server/v4/adapters/frvradn"
+ "github.com/prebid/prebid-server/v4/adapters/fwssp"
+ "github.com/prebid/prebid-server/v4/adapters/gamma"
+ "github.com/prebid/prebid-server/v4/adapters/gamoshi"
+ "github.com/prebid/prebid-server/v4/adapters/globalsun"
+ "github.com/prebid/prebid-server/v4/adapters/goldbach"
+ "github.com/prebid/prebid-server/v4/adapters/grid"
+ "github.com/prebid/prebid-server/v4/adapters/gumgum"
+ "github.com/prebid/prebid-server/v4/adapters/huaweiads"
+ "github.com/prebid/prebid-server/v4/adapters/imds"
+ "github.com/prebid/prebid-server/v4/adapters/impactify"
+ "github.com/prebid/prebid-server/v4/adapters/improvedigital"
+ "github.com/prebid/prebid-server/v4/adapters/infytv"
+ "github.com/prebid/prebid-server/v4/adapters/inmobi"
+ "github.com/prebid/prebid-server/v4/adapters/insticator"
+ "github.com/prebid/prebid-server/v4/adapters/intenze"
+ "github.com/prebid/prebid-server/v4/adapters/interactiveoffers"
+ "github.com/prebid/prebid-server/v4/adapters/invibes"
+ "github.com/prebid/prebid-server/v4/adapters/iqx"
+ "github.com/prebid/prebid-server/v4/adapters/iqzone"
+ "github.com/prebid/prebid-server/v4/adapters/ix"
+ "github.com/prebid/prebid-server/v4/adapters/jixie"
+ "github.com/prebid/prebid-server/v4/adapters/kargo"
+ "github.com/prebid/prebid-server/v4/adapters/kayzen"
+ "github.com/prebid/prebid-server/v4/adapters/kidoz"
+ "github.com/prebid/prebid-server/v4/adapters/kiviads"
+ "github.com/prebid/prebid-server/v4/adapters/kobler"
+ "github.com/prebid/prebid-server/v4/adapters/krushmedia"
+ "github.com/prebid/prebid-server/v4/adapters/kueezrtb"
+ "github.com/prebid/prebid-server/v4/adapters/lemmadigital"
+ "github.com/prebid/prebid-server/v4/adapters/limelightDigital"
+ lmkiviads "github.com/prebid/prebid-server/v4/adapters/lm_kiviads"
+ "github.com/prebid/prebid-server/v4/adapters/lockerdome"
+ "github.com/prebid/prebid-server/v4/adapters/logan"
+ "github.com/prebid/prebid-server/v4/adapters/logicad"
+ "github.com/prebid/prebid-server/v4/adapters/loopme"
+ "github.com/prebid/prebid-server/v4/adapters/loyal"
+ "github.com/prebid/prebid-server/v4/adapters/lunamedia"
+ "github.com/prebid/prebid-server/v4/adapters/mabidder"
+ "github.com/prebid/prebid-server/v4/adapters/madsense"
+ "github.com/prebid/prebid-server/v4/adapters/madvertise"
+ "github.com/prebid/prebid-server/v4/adapters/marsmedia"
+ "github.com/prebid/prebid-server/v4/adapters/mediago"
+ "github.com/prebid/prebid-server/v4/adapters/medianet"
+ "github.com/prebid/prebid-server/v4/adapters/mediasquare"
+ "github.com/prebid/prebid-server/v4/adapters/melozen"
+ "github.com/prebid/prebid-server/v4/adapters/metax"
+ "github.com/prebid/prebid-server/v4/adapters/mgid"
+ "github.com/prebid/prebid-server/v4/adapters/mgidX"
+ "github.com/prebid/prebid-server/v4/adapters/minutemedia"
+ "github.com/prebid/prebid-server/v4/adapters/missena"
+ "github.com/prebid/prebid-server/v4/adapters/mobfoxpb"
+ "github.com/prebid/prebid-server/v4/adapters/mobilefuse"
+ "github.com/prebid/prebid-server/v4/adapters/mobkoi"
+ "github.com/prebid/prebid-server/v4/adapters/motorik"
+ "github.com/prebid/prebid-server/v4/adapters/msft"
+ "github.com/prebid/prebid-server/v4/adapters/nativery"
+ "github.com/prebid/prebid-server/v4/adapters/nativo"
+ "github.com/prebid/prebid-server/v4/adapters/nextmillennium"
+ "github.com/prebid/prebid-server/v4/adapters/nexx360"
+ "github.com/prebid/prebid-server/v4/adapters/nobid"
+ "github.com/prebid/prebid-server/v4/adapters/ogury"
+ "github.com/prebid/prebid-server/v4/adapters/oms"
+ "github.com/prebid/prebid-server/v4/adapters/onetag"
+ "github.com/prebid/prebid-server/v4/adapters/openweb"
+ "github.com/prebid/prebid-server/v4/adapters/openx"
+ "github.com/prebid/prebid-server/v4/adapters/operaads"
+ "github.com/prebid/prebid-server/v4/adapters/optidigital"
+ "github.com/prebid/prebid-server/v4/adapters/oraki"
+ "github.com/prebid/prebid-server/v4/adapters/orbidder"
+ "github.com/prebid/prebid-server/v4/adapters/outbrain"
+ "github.com/prebid/prebid-server/v4/adapters/ownadx"
+ "github.com/prebid/prebid-server/v4/adapters/pangle"
+ "github.com/prebid/prebid-server/v4/adapters/pgamssp"
+ "github.com/prebid/prebid-server/v4/adapters/playdigo"
+ "github.com/prebid/prebid-server/v4/adapters/pubmatic"
+ "github.com/prebid/prebid-server/v4/adapters/pubnative"
+ "github.com/prebid/prebid-server/v4/adapters/pubrise"
+ "github.com/prebid/prebid-server/v4/adapters/pulsepoint"
+ "github.com/prebid/prebid-server/v4/adapters/pwbid"
+ "github.com/prebid/prebid-server/v4/adapters/qt"
+ "github.com/prebid/prebid-server/v4/adapters/readpeak"
+ "github.com/prebid/prebid-server/v4/adapters/rediads"
+ "github.com/prebid/prebid-server/v4/adapters/relevantdigital"
+ "github.com/prebid/prebid-server/v4/adapters/resetdigital"
+ "github.com/prebid/prebid-server/v4/adapters/revcontent"
+ "github.com/prebid/prebid-server/v4/adapters/richaudience"
+ "github.com/prebid/prebid-server/v4/adapters/rise"
+ "github.com/prebid/prebid-server/v4/adapters/roulax"
+ "github.com/prebid/prebid-server/v4/adapters/rtbhouse"
+ "github.com/prebid/prebid-server/v4/adapters/rtbstack"
+ "github.com/prebid/prebid-server/v4/adapters/rubicon"
+ salunamedia "github.com/prebid/prebid-server/v4/adapters/sa_lunamedia"
+ "github.com/prebid/prebid-server/v4/adapters/scalibur"
+ "github.com/prebid/prebid-server/v4/adapters/seedingAlliance"
+ "github.com/prebid/prebid-server/v4/adapters/seedtag"
+ "github.com/prebid/prebid-server/v4/adapters/sharethrough"
+ "github.com/prebid/prebid-server/v4/adapters/showheroes"
+ "github.com/prebid/prebid-server/v4/adapters/silvermob"
+ "github.com/prebid/prebid-server/v4/adapters/silverpush"
+ "github.com/prebid/prebid-server/v4/adapters/smaato"
+ "github.com/prebid/prebid-server/v4/adapters/smartadserver"
+ "github.com/prebid/prebid-server/v4/adapters/smarthub"
+ "github.com/prebid/prebid-server/v4/adapters/smartrtb"
+ "github.com/prebid/prebid-server/v4/adapters/smartx"
+ "github.com/prebid/prebid-server/v4/adapters/smartyads"
+ "github.com/prebid/prebid-server/v4/adapters/smilewanted"
+ "github.com/prebid/prebid-server/v4/adapters/smoot"
+ "github.com/prebid/prebid-server/v4/adapters/smrtconnect"
+ "github.com/prebid/prebid-server/v4/adapters/sonobi"
+ "github.com/prebid/prebid-server/v4/adapters/sovrn"
+ "github.com/prebid/prebid-server/v4/adapters/sovrnXsp"
+ "github.com/prebid/prebid-server/v4/adapters/sparteo"
+ "github.com/prebid/prebid-server/v4/adapters/sspBC"
+ "github.com/prebid/prebid-server/v4/adapters/startio"
+ "github.com/prebid/prebid-server/v4/adapters/stroeerCore"
+ "github.com/prebid/prebid-server/v4/adapters/synapseHX"
+ "github.com/prebid/prebid-server/v4/adapters/taboola"
+ "github.com/prebid/prebid-server/v4/adapters/tadvertising_blis"
+ "github.com/prebid/prebid-server/v4/adapters/tappx"
+ "github.com/prebid/prebid-server/v4/adapters/targetVideo"
+ "github.com/prebid/prebid-server/v4/adapters/teads"
+ "github.com/prebid/prebid-server/v4/adapters/teal"
+ "github.com/prebid/prebid-server/v4/adapters/telaria"
+ "github.com/prebid/prebid-server/v4/adapters/teqblaze"
+ "github.com/prebid/prebid-server/v4/adapters/theadx"
+ "github.com/prebid/prebid-server/v4/adapters/thetradedesk"
+ "github.com/prebid/prebid-server/v4/adapters/tpmn"
+ "github.com/prebid/prebid-server/v4/adapters/tradplus"
+ "github.com/prebid/prebid-server/v4/adapters/trafficgate"
+ "github.com/prebid/prebid-server/v4/adapters/triplelift"
+ "github.com/prebid/prebid-server/v4/adapters/triplelift_native"
+ "github.com/prebid/prebid-server/v4/adapters/trustedstack"
+ "github.com/prebid/prebid-server/v4/adapters/trustx"
+ "github.com/prebid/prebid-server/v4/adapters/ucfunnel"
+ "github.com/prebid/prebid-server/v4/adapters/undertone"
+ "github.com/prebid/prebid-server/v4/adapters/unicorn"
+ "github.com/prebid/prebid-server/v4/adapters/unruly"
+ "github.com/prebid/prebid-server/v4/adapters/vidazoo"
+ "github.com/prebid/prebid-server/v4/adapters/videobyte"
+ "github.com/prebid/prebid-server/v4/adapters/videoheroes"
+ "github.com/prebid/prebid-server/v4/adapters/vidoomy"
+ "github.com/prebid/prebid-server/v4/adapters/visiblemeasures"
+ "github.com/prebid/prebid-server/v4/adapters/visx"
+ "github.com/prebid/prebid-server/v4/adapters/vox"
+ "github.com/prebid/prebid-server/v4/adapters/vrtcal"
+ "github.com/prebid/prebid-server/v4/adapters/vungle"
+ "github.com/prebid/prebid-server/v4/adapters/xeworks"
+ "github.com/prebid/prebid-server/v4/adapters/yahooAds"
+ "github.com/prebid/prebid-server/v4/adapters/yandex"
+ "github.com/prebid/prebid-server/v4/adapters/yeahmobi"
+ "github.com/prebid/prebid-server/v4/adapters/yieldlab"
+ "github.com/prebid/prebid-server/v4/adapters/yieldmo"
+ "github.com/prebid/prebid-server/v4/adapters/yieldone"
+ "github.com/prebid/prebid-server/v4/adapters/zentotem"
+ "github.com/prebid/prebid-server/v4/adapters/zeroclickfraud"
+ "github.com/prebid/prebid-server/v4/adapters/zeta_global_ssp"
+ "github.com/prebid/prebid-server/v4/adapters/zmaticoo"
+ "github.com/prebid/prebid-server/v4/openrtb_ext"
)
// Adapter registration is kept in this separate file for ease of use and to aid
@@ -368,6 +380,7 @@ func newAdapterBuilders() map[openrtb_ext.BidderName]adapters.Builder {
openrtb_ext.BidderEscalax: escalax.Builder,
openrtb_ext.BidderExco: exco.Builder,
openrtb_ext.BidderEVolution: evolution.Builder,
+ openrtb_ext.BidderEzoic: ezoic.Builder,
openrtb_ext.BidderFeedAd: feedad.Builder,
openrtb_ext.BidderFlatads: flatads.Builder,
openrtb_ext.BidderFlipp: flipp.Builder,
diff --git a/openrtb_ext/bidders.go b/openrtb_ext/bidders.go
index c9f3fa601..24569ed28 100644
--- a/openrtb_ext/bidders.go
+++ b/openrtb_ext/bidders.go
@@ -121,6 +121,7 @@ var coreBidderNames []BidderName = []BidderName{
BidderEscalax,
BidderEVolution,
BidderExco,
+ BidderEzoic,
BidderFeedAd,
BidderFlatads,
BidderFlipp,
@@ -491,6 +492,7 @@ const (
BidderEscalax BidderName = "escalax"
BidderExco BidderName = "exco"
BidderEVolution BidderName = "e_volution"
+ BidderEzoic BidderName = "ezoic"
BidderFeedAd BidderName = "feedad"
BidderFlatads BidderName = "flatads"
BidderFlipp BidderName = "flipp"
diff --git a/openrtb_ext/imp_ezoic.go b/openrtb_ext/imp_ezoic.go
new file mode 100644
index 000000000..609650ad5
--- /dev/null
+++ b/openrtb_ext/imp_ezoic.go
@@ -0,0 +1,8 @@
+package openrtb_ext
+
+// ExtImpEzoic defines the contract for bidrequest.imp[i].ext.prebid.bidder.ezoic.
+// Ezoic eligibility is resolved server-side from site.domain, so no params are
+// required; placementId is an optional onboarding-assigned identifier.
+type ExtImpEzoic struct {
+ PlacementID string `json:"placementId,omitempty"`
+}
diff --git a/static/bidder-info/ezoic.yaml b/static/bidder-info/ezoic.yaml
new file mode 100644
index 000000000..9f8be82b5
--- /dev/null
+++ b/static/bidder-info/ezoic.yaml
@@ -0,0 +1,23 @@
+# Ezoic requires publisher domains to be registered and approved before
+# bidding; unapproved inventory receives no-bid responses. Contact
+# prebid@ezoic.com to get set up.
+endpoint: "https://g.ezoic.net/ezoic/prebid/adapter/ortb"
+maintainer:
+ email: prebid@ezoic.com
+gvlVendorID: 347
+geoscope:
+ - global
+openrtb:
+ version: 2.6
+modifyingVastXmlAllowed: false
+capabilities:
+ app:
+ mediaTypes:
+ - banner
+ - video
+ - native
+ site:
+ mediaTypes:
+ - banner
+ - video
+ - native
diff --git a/static/bidder-params/ezoic.json b/static/bidder-params/ezoic.json
new file mode 100644
index 000000000..ecd916a46
--- /dev/null
+++ b/static/bidder-params/ezoic.json
@@ -0,0 +1,13 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Ezoic Adapter Params",
+ "description": "A schema which validates params accepted by the Ezoic adapter",
+ "type": "object",
+ "properties": {
+ "placementId": {
+ "type": "string",
+ "description": "Optional placement identifier assigned during Ezoic onboarding"
+ }
+ },
+ "required": []
+}