From 58e4394aed1502bb6fdc9c8a8b0c4c07fd529a12 Mon Sep 17 00:00:00 2001 From: Rafael Taveira Date: Fri, 6 Feb 2026 13:19:14 -0600 Subject: [PATCH 1/2] Nativo: Add optional placementId parameter --- adapters/nativo/nativotest/exemplary/banner-app.json | 12 +++++++++++- adapters/nativo/nativotest/exemplary/banner-web.json | 10 ++++++++++ adapters/nativo/nativotest/exemplary/native-app.json | 12 +++++++++++- adapters/nativo/nativotest/exemplary/native-web.json | 10 ++++++++++ adapters/nativo/nativotest/exemplary/video-app.json | 12 +++++++++++- adapters/nativo/nativotest/exemplary/video-web.json | 10 ++++++++++ .../200-different-impID-response-from-nativo.json | 8 ++++++-- .../supplemental/204-response-from-nativo.json | 8 ++++++-- .../supplemental/400-response-from-nativo.json | 8 ++++++-- .../supplemental/500-response-from-nativo.json | 8 ++++++-- static/bidder-params/nativo.json | 7 ++++++- 11 files changed, 93 insertions(+), 12 deletions(-) diff --git a/adapters/nativo/nativotest/exemplary/banner-app.json b/adapters/nativo/nativotest/exemplary/banner-app.json index 738d01bd9a4..ef7288d39eb 100644 --- a/adapters/nativo/nativotest/exemplary/banner-app.json +++ b/adapters/nativo/nativotest/exemplary/banner-app.json @@ -30,6 +30,11 @@ "banner": { "w": 320, "h": 50 + }, + "ext": { + "bidder": { + "placementId": 12345678 + } } } ] @@ -53,7 +58,12 @@ "w": 320, "h": 50 }, - "tagid": "ogTAGID" + "tagid": "ogTAGID", + "ext": { + "bidder": { + "placementId": 12345678 + } + } } ], "app": { diff --git a/adapters/nativo/nativotest/exemplary/banner-web.json b/adapters/nativo/nativotest/exemplary/banner-web.json index 58af89b202c..ce67bbd15f5 100644 --- a/adapters/nativo/nativotest/exemplary/banner-web.json +++ b/adapters/nativo/nativotest/exemplary/banner-web.json @@ -24,6 +24,11 @@ "banner": { "w":320, "h":50 + }, + "ext": { + "bidder": { + "placementId": 12345678 + } } } ] @@ -47,6 +52,11 @@ "banner": { "w":320, "h":50 + }, + "ext": { + "bidder": { + "placementId": 12345678 + } } } ], diff --git a/adapters/nativo/nativotest/exemplary/native-app.json b/adapters/nativo/nativotest/exemplary/native-app.json index 5f038958b76..ccd8c2287f9 100644 --- a/adapters/nativo/nativotest/exemplary/native-app.json +++ b/adapters/nativo/nativotest/exemplary/native-app.json @@ -30,6 +30,11 @@ "native": { "ver":"1.1", "request":"{\"adunit\":2,\"assets\":[{\"id\":3,\"img\":{\"h\":120,\"hmin\":0,\"type\":3,\"w\":180,\"wmin\":0},\"required\":1},{\"id\":0,\"required\":1,\"title\":{\"len\":25}},{\"data\":{\"len\":25,\"type\":1},\"id\":4,\"required\":1},{\"data\":{\"len\":140,\"type\":2},\"id\":6,\"required\":1}],\"context\":1,\"layout\":1,\"contextsubtype\":11,\"plcmtcnt\":1,\"plcmttype\":2,\"ver\":\"1.1\",\"ext\":{\"banner\":{\"w\":320,\"h\":50}}}" + }, + "ext": { + "bidder": { + "placementId": 12345678 + } } } ] @@ -53,7 +58,12 @@ "ver":"1.1", "request":"{\"adunit\":2,\"assets\":[{\"id\":3,\"img\":{\"h\":120,\"hmin\":0,\"type\":3,\"w\":180,\"wmin\":0},\"required\":1},{\"id\":0,\"required\":1,\"title\":{\"len\":25}},{\"data\":{\"len\":25,\"type\":1},\"id\":4,\"required\":1},{\"data\":{\"len\":140,\"type\":2},\"id\":6,\"required\":1}],\"context\":1,\"layout\":1,\"contextsubtype\":11,\"plcmtcnt\":1,\"plcmttype\":2,\"ver\":\"1.1\",\"ext\":{\"banner\":{\"w\":320,\"h\":50}}}" }, - "tagid": "ogTAGID" + "tagid": "ogTAGID", + "ext": { + "bidder": { + "placementId": 12345678 + } + } } ], "app": { diff --git a/adapters/nativo/nativotest/exemplary/native-web.json b/adapters/nativo/nativotest/exemplary/native-web.json index 598dc2abfc3..98e0ca38df2 100644 --- a/adapters/nativo/nativotest/exemplary/native-web.json +++ b/adapters/nativo/nativotest/exemplary/native-web.json @@ -24,6 +24,11 @@ "native": { "ver":"1.1", "request":"{\"adunit\":2,\"assets\":[{\"id\":3,\"img\":{\"h\":120,\"hmin\":0,\"type\":3,\"w\":180,\"wmin\":0},\"required\":1},{\"id\":0,\"required\":1,\"title\":{\"len\":25}},{\"data\":{\"len\":25,\"type\":1},\"id\":4,\"required\":1},{\"data\":{\"len\":140,\"type\":2},\"id\":6,\"required\":1}],\"context\":1,\"layout\":1,\"contextsubtype\":11,\"plcmtcnt\":1,\"plcmttype\":2,\"ver\":\"1.1\",\"ext\":{\"banner\":{\"w\":320,\"h\":50}}}" + }, + "ext": { + "bidder": { + "placementId": 12345678 + } } } ] @@ -47,6 +52,11 @@ "native": { "ver":"1.1", "request":"{\"adunit\":2,\"assets\":[{\"id\":3,\"img\":{\"h\":120,\"hmin\":0,\"type\":3,\"w\":180,\"wmin\":0},\"required\":1},{\"id\":0,\"required\":1,\"title\":{\"len\":25}},{\"data\":{\"len\":25,\"type\":1},\"id\":4,\"required\":1},{\"data\":{\"len\":140,\"type\":2},\"id\":6,\"required\":1}],\"context\":1,\"layout\":1,\"contextsubtype\":11,\"plcmtcnt\":1,\"plcmttype\":2,\"ver\":\"1.1\",\"ext\":{\"banner\":{\"w\":320,\"h\":50}}}" + }, + "ext": { + "bidder": { + "placementId": 12345678 + } } } ], diff --git a/adapters/nativo/nativotest/exemplary/video-app.json b/adapters/nativo/nativotest/exemplary/video-app.json index 596bf9bcaf0..10ff85a1ea8 100644 --- a/adapters/nativo/nativotest/exemplary/video-app.json +++ b/adapters/nativo/nativotest/exemplary/video-app.json @@ -35,6 +35,11 @@ "h": 480, "minduration": 120, "maxduration": 150 + }, + "ext": { + "bidder": { + "placementId": 12345678 + } } } ] @@ -63,7 +68,12 @@ "w": 640, "h": 480 }, - "tagid": "ogTAGID" + "tagid": "ogTAGID", + "ext": { + "bidder": { + "placementId": 12345678 + } + } } ], "app": { diff --git a/adapters/nativo/nativotest/exemplary/video-web.json b/adapters/nativo/nativotest/exemplary/video-web.json index 12e185ca158..a1043b21362 100644 --- a/adapters/nativo/nativotest/exemplary/video-web.json +++ b/adapters/nativo/nativotest/exemplary/video-web.json @@ -29,6 +29,11 @@ "h": 480, "minduration": 120, "maxduration": 150 + }, + "ext": { + "bidder": { + "placementId": 12345678 + } } } ] @@ -57,6 +62,11 @@ "maxduration": 150, "w": 640, "h": 480 + }, + "ext": { + "bidder": { + "placementId": 12345678 + } } } ], diff --git a/adapters/nativo/nativotest/supplemental/200-different-impID-response-from-nativo.json b/adapters/nativo/nativotest/supplemental/200-different-impID-response-from-nativo.json index 320d7f5e1b0..e74fbab8f3b 100755 --- a/adapters/nativo/nativotest/supplemental/200-different-impID-response-from-nativo.json +++ b/adapters/nativo/nativotest/supplemental/200-different-impID-response-from-nativo.json @@ -13,7 +13,9 @@ ] }, "ext": { - "bidder": {} + "bidder": { + "placementId": 12345678 + } } } ] @@ -36,7 +38,9 @@ ] }, "ext": { - "bidder": {} + "bidder": { + "placementId": 12345678 + } } } ] diff --git a/adapters/nativo/nativotest/supplemental/204-response-from-nativo.json b/adapters/nativo/nativotest/supplemental/204-response-from-nativo.json index 6f0f79ed6fd..28d30e1859a 100755 --- a/adapters/nativo/nativotest/supplemental/204-response-from-nativo.json +++ b/adapters/nativo/nativotest/supplemental/204-response-from-nativo.json @@ -13,7 +13,9 @@ ] }, "ext": { - "bidder": {} + "bidder": { + "placementId": 12345678 + } } } ] @@ -36,7 +38,9 @@ ] }, "ext": { - "bidder": {} + "bidder": { + "placementId": 12345678 + } } } ] diff --git a/adapters/nativo/nativotest/supplemental/400-response-from-nativo.json b/adapters/nativo/nativotest/supplemental/400-response-from-nativo.json index f5ebb6024cb..342ad1a243f 100755 --- a/adapters/nativo/nativotest/supplemental/400-response-from-nativo.json +++ b/adapters/nativo/nativotest/supplemental/400-response-from-nativo.json @@ -13,7 +13,9 @@ ] }, "ext": { - "bidder": {} + "bidder": { + "placementId": 12345678 + } } } ] @@ -36,7 +38,9 @@ ] }, "ext": { - "bidder": {} + "bidder": { + "placementId": 12345678 + } } } ] diff --git a/adapters/nativo/nativotest/supplemental/500-response-from-nativo.json b/adapters/nativo/nativotest/supplemental/500-response-from-nativo.json index cc58f18ecee..c111cf3edd8 100755 --- a/adapters/nativo/nativotest/supplemental/500-response-from-nativo.json +++ b/adapters/nativo/nativotest/supplemental/500-response-from-nativo.json @@ -13,7 +13,9 @@ ] }, "ext": { - "bidder": {} + "bidder": { + "placementId": 12345678 + } } } ] @@ -36,7 +38,9 @@ ] }, "ext": { - "bidder": {} + "bidder": { + "placementId": 12345678 + } } } ] diff --git a/static/bidder-params/nativo.json b/static/bidder-params/nativo.json index 0a8139a0838..fbe4685b555 100644 --- a/static/bidder-params/nativo.json +++ b/static/bidder-params/nativo.json @@ -3,5 +3,10 @@ "title": "Nativo Adapter Params", "description": "A schema which validates params accepted by the Nativo adapter", "type": "object", - "properties": {} + "properties": { + "placementId": { + "type": ["integer", "string"], + "description": "Placement ID" + } + } } \ No newline at end of file From f76f5813624db9df7bbc38115ad3d3cf8f3e08bf Mon Sep 17 00:00:00 2001 From: Rafael Taveira Date: Fri, 13 Feb 2026 10:19:42 -0600 Subject: [PATCH 2/2] Nativo: Adding missing optional parameter tests --- adapters/nativo/nativo.go | 6 +-- ...-different-impID-response-from-nativo.json | 4 +- .../204-response-from-nativo.json | 8 +--- adapters/nativo/params_test.go | 44 +++++++++++++++++++ openrtb_ext/imp_nativo.go | 7 +++ 5 files changed, 58 insertions(+), 11 deletions(-) create mode 100644 adapters/nativo/params_test.go create mode 100644 openrtb_ext/imp_nativo.go diff --git a/adapters/nativo/nativo.go b/adapters/nativo/nativo.go index 6e595bbff83..14c01f26e9a 100644 --- a/adapters/nativo/nativo.go +++ b/adapters/nativo/nativo.go @@ -1,7 +1,6 @@ package nativo import ( - "encoding/json" "fmt" "net/http" @@ -9,6 +8,7 @@ import ( "github.com/prebid/prebid-server/v3/adapters" "github.com/prebid/prebid-server/v3/config" "github.com/prebid/prebid-server/v3/openrtb_ext" + "github.com/prebid/prebid-server/v3/util/jsonutil" ) type adapter struct { @@ -24,7 +24,7 @@ func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server co } func (a *adapter) MakeRequests(request *openrtb2.BidRequest, _ *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { - requestJSON, err := json.Marshal(request) + requestJSON, err := jsonutil.Marshal(request) if err != nil { return nil, []error{err} } @@ -54,7 +54,7 @@ func (a *adapter) MakeBids(request *openrtb2.BidRequest, externalRequest *adapte var bidResp openrtb2.BidResponse - if err := json.Unmarshal(response.Body, &bidResp); err != nil { + if err := jsonutil.Unmarshal(response.Body, &bidResp); err != nil { return nil, []error{err} } diff --git a/adapters/nativo/nativotest/supplemental/200-different-impID-response-from-nativo.json b/adapters/nativo/nativotest/supplemental/200-different-impID-response-from-nativo.json index e74fbab8f3b..26b2936ca5a 100755 --- a/adapters/nativo/nativotest/supplemental/200-different-impID-response-from-nativo.json +++ b/adapters/nativo/nativotest/supplemental/200-different-impID-response-from-nativo.json @@ -14,7 +14,7 @@ }, "ext": { "bidder": { - "placementId": 12345678 + "placementId": "12345678" } } } @@ -39,7 +39,7 @@ }, "ext": { "bidder": { - "placementId": 12345678 + "placementId": "12345678" } } } diff --git a/adapters/nativo/nativotest/supplemental/204-response-from-nativo.json b/adapters/nativo/nativotest/supplemental/204-response-from-nativo.json index 28d30e1859a..6f0f79ed6fd 100755 --- a/adapters/nativo/nativotest/supplemental/204-response-from-nativo.json +++ b/adapters/nativo/nativotest/supplemental/204-response-from-nativo.json @@ -13,9 +13,7 @@ ] }, "ext": { - "bidder": { - "placementId": 12345678 - } + "bidder": {} } } ] @@ -38,9 +36,7 @@ ] }, "ext": { - "bidder": { - "placementId": 12345678 - } + "bidder": {} } } ] diff --git a/adapters/nativo/params_test.go b/adapters/nativo/params_test.go new file mode 100644 index 00000000000..7d48bfd53c7 --- /dev/null +++ b/adapters/nativo/params_test.go @@ -0,0 +1,44 @@ +package nativo + +import ( + "encoding/json" + "testing" + + "github.com/prebid/prebid-server/v3/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-schemas. %v", err) + } + + for _, validParam := range validParams { + if err := validator.Validate(openrtb_ext.BidderNativo, json.RawMessage(validParam)); err != nil { + t.Errorf("Schema rejected valid 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.BidderNativo, json.RawMessage(invalidParam)); err == nil { + t.Errorf("Schema allowed unexpected params: %s", invalidParam) + } + } +} + +var validParams = []string{ + `{"placementId": "12345678"}`, + `{"placementId": 12345678}`, + `{}`, +} + +var invalidParams = []string{ + `{"placementId": false}`, +} diff --git a/openrtb_ext/imp_nativo.go b/openrtb_ext/imp_nativo.go new file mode 100644 index 00000000000..4ad5d721c85 --- /dev/null +++ b/openrtb_ext/imp_nativo.go @@ -0,0 +1,7 @@ +package openrtb_ext + +import "github.com/prebid/prebid-server/v3/util/jsonutil" + +type ImpExtNativo struct { + PlacementID jsonutil.StringInt `json:"placementId"` +}