New Adapter: Floxis - #4811
Conversation
Adds the Floxis bidder adapter. Standard OpenRTB 2.x server-to-server; region param selects a fixed RTB host (us-e/eu/apac, default us-e); supports banner, video, native, and audio.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
82085dd to
26ab0bf
Compare
… host comment - MakeRequests now sets Content-Type: application/json;charset=utf-8 and Accept: application/json on the outbound POST (the dominant convention across in-tree adapters), asserted in all exemplary test cases. - Reword the bidder-info comment: region/partner are validated as single DNS host-labels prefixed onto the fixed .floxis.tech domain — there is no fixed us-e/eu/apac allowlist (the prior comment misdescribed the SSRF control).
…tner are subdomain labels) Per the dev-guide, a bidder endpoint domain must not be fully variable. Move the fixed .floxis.tech suffix into the bidder-info endpoint template and have resolveBidHost return just the validated region/partner subdomain label. Resolved URLs are unchanged (e.g. https://us-e.floxis.tech/pbs); this matches the fixed-suffix pattern of merged region-routed adapters (rubicon, clydo, mediago, algorix).
…Formats Remove the in-code host-label regex (the params JSON schema already enforces the same pattern before MakeRequests runs), the redundant empty-imp guard (the framework only invokes the adapter with at least one imp), and the explanatory comment blocks. Extract a countFormats helper; resolveBidHost no longer needs to return an error. Schema-level host-label rejection stays covered by params_test.go.
|
Hi — a gentle nudge on this Floxis adapter PR, open since June 3 with no review yet. The matching Java adapter (prebid/prebid-server-java#4529) has already been through a review round with the feedback applied. Whenever a maintainer has bandwidth, I'd appreciate a first pass — glad to address anything. Thanks for your time! |
|
Documentation PR (per the add-new-bidder checklist): prebid/prebid.github.io#6596 — already approved by @muuki88; it sets One ask for a maintainer: the CI workflows on this PR (Validate / Adapter Code Coverage / Validate Merge) are still awaiting first-time-contributor approval, so they've never run — could someone approve the workflow runs? Happy to address anything they or a review turn up. |
|
@bsardo @SyntaxNode @przemkaczmarek — sorry for the direct ping, but this one has been open since June 3 without a first review, so flagging it for your queue. The submission checklist is complete: docs PR prebid/prebid.github.io#6650 ( |
Code coverage summaryNote:
floxisRefer here for heat map coverage report |
Code coverage summaryNote:
floxisRefer here for heat map coverage report |
|
All checks are green now, including So this one is green with an approval already on record from Jul 6. Just needs a second look whenever someone has time. Docs PR (prebid/prebid.github.io#6596) is approved. |
|
Following up — all checks here have been green since the AGMA flake cleared, and the PR has carried an approval since 6 July. GitHub still shows A batch of adapter PRs went in today and this one wasn't part of it, which I assume is exactly that. Could one of you take the second look, or tell me if something else is outstanding on our side? @bsardo @postindustria-code @ccorbo — apologies for the direct ping. A rough sense of timing would genuinely help us plan: the Java port (prebid/prebid-server-java#4529) and the docs PR (prebid/prebid.github.io#6596, already approved) are both queued behind this one. |
|
I think I got the merge bar wrong in my last comment. The code review doc says a larger PR merges "whenever the second reviewer approves, or if 5 business days pass with no farther changes requested by anybody, whichever comes first." This has had an approval since 6 July with nothing requested since, so the second clause looks met. A second review is still welcome if anyone wants one. Not rebasing deliberately — it still merges clean against master, and a push would drop the approval. |
additionalProperties:false meant any param outside seat/region/partner failed schema validation, and request_validator returns on that failure - so a publisher setting the documented bidFloor param lost the whole auction request, not just the floxis imp. 263 of 265 sibling schemas leave the root open.
Its claim that the host label is validated in the adapter stopped being true when the in-code regex was removed; the JSON schema validates it now.
Imps targeting different seats or hosts were rejected outright, dropping the whole auction; they are now grouped into one request each. A single unparseable imp.ext no longer aborts the request either - that imp is dropped and the error appended, matching the corpus.
|
Pushed three fixes. This dismissed the existing approval, which I'd rather have avoided, but the first one is a real defect:
All three are covered by tests. |
Removing additionalProperties from the params schema also removed the only thing stopping a case-variant key from reaching the host. Schema property names are case-sensitive but JSON unmarshalling is not, so {"REGION":"evil.com/"} skipped the schema pattern and produced https://evil.com/.floxis.tech/pbs. Validated in the adapter now, so the invariant does not depend on the schema. Java is unaffected - Jackson matches case-sensitively.
A case-variant key overrides the schema-validated value (JSON unmarshalling is case-insensitive), so {"seat":"good","Seat":""} produced an empty seat despite minLength:1. Region and partner are also lowercased before they become routing state, so case variants of one region no longer fan out into duplicate POSTs to the same host.
|
@bsardo @przemkaczmarek @ChrisHuie @linux019 @mmoschovas @nickllerandi — sorry for the broad ping, tagging whoever has a minute. Open since 3 June. Five releases have shipped since, and three adapters submitted after this one (#4823, #4834, #4842) are already merged and released. We have publishers waiting to go live and can't onboard them until this is in a release — it's costing us business now, not just time. Nothing here looks contentious. What's blocking:
Step 1 alone would at least get you green checks to look at. Thanks. |
Code coverage summaryNote:
floxisRefer here for heat map coverage report |
The /pbs supply route decodes gzip request bodies (decodeRequestWith(Gzip, NoCoding)), so PBS can compress outbound bid requests.
|
@linux019 yes, it does — added in The @przemkaczmarek sorry — this push auto-dismissed your 12 Aug approval. It's a one-line change to Full diff since your approval: 13d5bcf...de15a64 |
Code coverage summaryNote:
floxisRefer here for heat map coverage report |
|
@linux019 please check it out when you have time 🙏 |
Type of change
Overview
Hi Prebid maintainers,
This PR adds the Floxis bidder adapter to prebid-server. Floxis is an ad exchange; this adapter sends standard OpenRTB 2.x server-to-server bid requests to the Floxis exchange so PBS publishers can access Floxis demand.
Scope
appandsite).modifyingVastXmlAllowed: falsedeclared explicitly.Adapter behavior
imp[].ext.bidder):seat(string, required, minLength 1) — the Floxis seat the publisher buys through; appended url-escaped to the endpoint as?seat=.region(string, optional, defaultus-e) — the regional RTB host, used as a subdomain label. Validated as a DNS label by the params JSON schema.partner(string, optional, defaultfloxis) — white-label partner, used as an additional subdomain label. Validated as a DNS label by the params JSON schema..floxis.tech) is pinned in the adapter'sendpointconfig; only the{{.Host}}subdomain is filled per-request. The subdomain isregion(e.g.us-e.floxis.tech), orpartner-regionfor a named white-label partner (e.g.acme-us-e.floxis.tech); the defaultfloxispartner adds no prefix.region/partnerare constrained to DNS labels by the params schema, so the host is never derived from a request-supplied hostname — this satisfies the "no fully dynamic hostnames" requirement. Which region maps to which datacenter is handled at DNS/LB level, not in the adapter.seat/region/partnerare read from the first imp; a multi-imp request that mixes seats/regions/partners is rejected asBadInput(one request routes to one host).BidRequest; copy-on-write is satisfied by construction (the request is marshalled unchanged).bid.mtype(OpenRTB 2.6) as authoritative (1/2/3/4 → banner/video/audio/native). Whenmtypeis absent, a single-format imp's media type is used; an imp without exactly one format cannot be disambiguated and surfaces aBadServerResponse.Cookie sync
Standard PBS redirect-type sync. The Floxis
/syncendpoint substitutes its own cookie ID into thedestsetuid URL and 302s back. Cookie family isfloxis(the bidder name default).GVL vendor ID
gvlVendorIDis set to 1609 — Floxis (legal entity Ad Tech Company OÜ) is registered as an IAB TCF vendor with GVL ID 1609, so EU/TCF consent is enforced against that vendor ID.Tests
go test ./adapters/floxis/...— passes, 95.5% coverage../validate.sh --nofmt --cov— passes (config registration, params-schema strictness, bidder-info capabilities, alphabetical ordering,go vet).bid.mtype, multi-format imp typed viamtype, multi-format imp withoutmtypesurfacesBadServerResponse, unmatched bid impid, and request with neither site nor app.params_test.go.Docs
Companion docs PR: prebid/prebid.github.io#6596 (approved) — sets
pbs: true,gvl_id: 1609, and documents the PBS endpoints/params.Maintainer
prebid@floxis.techThanks for maintaining the project — happy to iterate on review feedback.