Skip to content

New Adapter: Floxis - #4811

Open
floxis-admin wants to merge 14 commits into
prebid:masterfrom
floxis-admin:floxis-adapter
Open

New Adapter: Floxis#4811
floxis-admin wants to merge 14 commits into
prebid:masterfrom
floxis-admin:floxis-adapter

Conversation

@floxis-admin

@floxis-admin floxis-admin commented Jun 3, 2026

Copy link
Copy Markdown

Type of change

  • New bidder adapter

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

  • Media types: banner, video, native, audio (declared for both app and site).
  • OpenRTB 2.6 compliant; GPP supported. The incoming bid request body is forwarded unchanged.
  • Cookie sync: redirect type.
  • modifyingVastXmlAllowed: false declared explicitly.

Adapter behavior

  • Bidder params (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, default us-e) — the regional RTB host, used as a subdomain label. Validated as a DNS label by the params JSON schema.
    • partner (string, optional, default floxis) — white-label partner, used as an additional subdomain label. Validated as a DNS label by the params JSON schema.
  • Endpoint routing: the fixed parent domain (.floxis.tech) is pinned in the adapter's endpoint config; only the {{.Host}} subdomain is filled per-request. The subdomain is region (e.g. us-e.floxis.tech), or partner-region for a named white-label partner (e.g. acme-us-e.floxis.tech); the default floxis partner adds no prefix. region/partner are 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/partner are read from the first imp; a multi-imp request that mixes seats/regions/partners is rejected as BadInput (one request routes to one host).
  • The adapter does not mutate the caller's BidRequest; copy-on-write is satisfied by construction (the request is marshalled unchanged).
  • Bid type resolution treats bid.mtype (OpenRTB 2.6) as authoritative (1/2/3/4 → banner/video/audio/native). When mtype is absent, a single-format imp's media type is used; an imp without exactly one format cannot be disambiguated and surfaces a BadServerResponse.

Cookie sync

userSync:
  redirect:
    url: "https://px-us-e.floxis.tech/sync?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&gpp={{.GPP}}&gpp_sid={{.GPPSID}}&us_privacy={{.USPrivacy}}&dest={{.RedirectURL}}"
    userMacro: "${USER_ID}"

Standard PBS redirect-type sync. The Floxis /sync endpoint substitutes its own cookie ID into the dest setuid URL and 302s back. Cookie family is floxis (the bidder name default).

GVL vendor ID

gvlVendorID is 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).
  • Exemplary fixtures: banner (web + app), video (web, eu region), native (app, apac region), audio (web), a banner-no-mtype single-format-fallback case, and a partner-prefixed host case — covering all four media types, both app and site, regions, and the white-label partner prefix.
  • Supplemental fixtures: region default-to-us-e when omitted, first-imp-routes for multi-imp (and rejection when imps mix seat/partner), response 204 / 400 / 500 / no-cur, malformed imp.ext, malformed bidder params, malformed response body, unsupported bid.mtype, multi-format imp typed via mtype, multi-format imp without mtype surfaces BadServerResponse, unmatched bid impid, and request with neither site nor app.
  • White-box unit tests cover region/partner host resolution, URL escaping of the seat, multi-imp consistency, the media-type resolver, and caller-request mutation safety. Invalid host-label rejection is covered at the schema layer in 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.tech

Thanks for maintaining the project — happy to iterate on review feedback.

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.
… 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.
@floxis-admin

Copy link
Copy Markdown
Author

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!

@floxis-admin

floxis-admin commented Jul 2, 2026

Copy link
Copy Markdown
Author

Documentation PR (per the add-new-bidder checklist): prebid/prebid.github.io#6596 — already approved by @muuki88; it sets pbs: true, gvl_id: 1609 and documents the PBS endpoints/params. (A small follow-up, prebid/prebid.github.io#6650, adds the first-party-id storage section for the Prebid.js-side PR prebid/Prebid.js#15295.)

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.

@floxis-admin

Copy link
Copy Markdown
Author

@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 (pbs: true, GVL ID 1609), exemplary + supplemental JSON tests, and the matching PBS-Java port (prebid/prebid-server-java#4529) has already been through a review round with all feedback applied. The CI workflows here are still awaiting first-time-contributor approval, so a one-click "approve and run" would let them go green. Happy to turn any feedback around quickly.

@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown

Code coverage summary

Note:

  • Prebid team doesn't anticipate tests covering code paths that might result in marshal and unmarshal errors
  • Coverage summary encompasses all commits leading up to the latest one, b9140f6

floxis

Refer here for heat map coverage report

github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:27:	resolveBidHost		100.0%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:41:	Builder			75.0%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:49:	MakeRequests		85.0%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:92:	MakeBids		100.0%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:126:	parseImpExt		100.0%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:138:	getMediaTypeForBid	100.0%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:178:	countFormats		100.0%
total:									(statements)		95.5%

Comment thread static/bidder-info/floxis.yaml
Comment thread static/bidder-info/floxis.yaml
@przemkaczmarek przemkaczmarek self-assigned this Jul 2, 2026
Comment thread static/bidder-info/floxis.yaml
Comment thread adapters/floxis/floxis.go Outdated
@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown

Code coverage summary

Note:

  • Prebid team doesn't anticipate tests covering code paths that might result in marshal and unmarshal errors
  • Coverage summary encompasses all commits leading up to the latest one, efa1881

floxis

Refer here for heat map coverage report

github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:27:	resolveBidHost		100.0%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:41:	Builder			75.0%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:49:	MakeRequests		86.4%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:94:	MakeBids		100.0%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:128:	parseImpExt		100.0%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:140:	getMediaTypeForBid	100.0%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:180:	countFormats		100.0%
total:									(statements)		95.6%

przemkaczmarek
przemkaczmarek previously approved these changes Jul 6, 2026
@floxis-admin

floxis-admin commented Jul 31, 2026

Copy link
Copy Markdown
Author

All checks are green now, including validate-merge — the earlier red was an unrelated flaky test in the AGMA analytics module, and it's passing again without any change on our side.

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.

@floxis-admin

floxis-admin commented Aug 4, 2026

Copy link
Copy Markdown
Author

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 Review required, so a second approval looks like the only thing left before this is mergeable.

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.

@floxis-admin

Copy link
Copy Markdown
Author

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.
@floxis-admin

Copy link
Copy Markdown
Author

Pushed three fixes. This dismissed the existing approval, which I'd rather have avoided, but the first one is a real defect:

  • bidder-params/floxis.json set additionalProperties: false, so any param outside seat/region/partner failed schema validation. request_validator returns on that failure, so a publisher setting the bidFloor param our docs list would lose the whole auction request, not just the floxis imp. 263 of 265 param schemas leave the root open.
  • Imps targeting different seats or hosts are now grouped into one request each instead of the request being rejected outright.
  • A single unparseable imp.ext no longer aborts the request; that imp is dropped and the error returned.

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.
@floxis-admin

Copy link
Copy Markdown
Author

@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:

  1. CI hasn't run — Validate, Validate Merge and Adapter Code Coverage are all at action_required on the current head. Someone with write access has to click "Approve and run workflows" before anyone can even see green checks. Five seconds, and it re-arms on every push.
  2. @przemkaczmarek approved on 6 July; my push yesterday auto-dismissed it. That push fixed a real defect — additionalProperties: false in our param schema meant a publisher setting the bidFloor param our docs document would lose their whole auction request, not just the floxis imp (263 of 265 schemas leave the root open).
  3. Then a second approval + merge.

semgrep-check is red on every open PR in the repo right now (#4897, #4885, #4854), not just this one.

Step 1 alone would at least get you green checks to look at. Thanks.

@github-actions

Copy link
Copy Markdown

Code coverage summary

Note:

  • Prebid team doesn't anticipate tests covering code paths that might result in marshal and unmarshal errors
  • Coverage summary encompasses all commits leading up to the latest one, 13d5bcf

floxis

Refer here for heat map coverage report

github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:32:	resolveBidHost		100.0%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:48:	Builder			75.0%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:62:	MakeRequests		88.9%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:123:	MakeBids		100.0%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:157:	parseImpExt		100.0%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:178:	getMediaTypeForBid	100.0%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:218:	countFormats		100.0%
total:									(statements)		95.5%

przemkaczmarek
przemkaczmarek previously approved these changes Aug 12, 2026
Comment thread static/bidder-info/floxis.yaml
The /pbs supply route decodes gzip request bodies (decodeRequestWith(Gzip, NoCoding)), so PBS can compress outbound bid requests.
@floxis-admin

Copy link
Copy Markdown
Author

@linux019 yes, it does — added in de15a64e8.

The /pbs supply route decodes gzip request bodies (decodeRequestWith(Gzip, NoCoding) on the handler that serves this endpoint), and I confirmed a request carrying Content-Encoding: gzip traverses our edge to the application untouched. I've mirrored it into the Java port too (prebid-server-java#4529), since both point at the same endpoint.

@przemkaczmarek sorry — this push auto-dismissed your 12 Aug approval. It's a one-line change to static/bidder-info/floxis.yaml, nothing else moved. Could you re-approve when you get a moment?

Full diff since your approval: 13d5bcf...de15a64

@github-actions

Copy link
Copy Markdown

Code coverage summary

Note:

  • Prebid team doesn't anticipate tests covering code paths that might result in marshal and unmarshal errors
  • Coverage summary encompasses all commits leading up to the latest one, de15a64

floxis

Refer here for heat map coverage report

github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:32:	resolveBidHost		100.0%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:48:	Builder			75.0%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:62:	MakeRequests		88.9%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:123:	MakeBids		100.0%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:157:	parseImpExt		100.0%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:178:	getMediaTypeForBid	100.0%
github.com/prebid/prebid-server/v4/adapters/floxis/floxis.go:218:	countFormats		100.0%
total:									(statements)		95.5%

@floxis-admin
floxis-admin requested a review from linux019 August 14, 2026 10:38
@floxis-admin

Copy link
Copy Markdown
Author

@linux019 please check it out when you have time 🙏

Comment thread adapters/floxis/floxis.go
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants