Skip to content

Prebid Server: server-side bidders don't need a client-side adapter - #6848

Open
patmmccann wants to merge 2 commits into
prebid:masterfrom
patmmccann:agent-s2s-without-client-adapter
Open

patmmccann wants to merge 2 commits into
prebid:masterfrom
patmmccann:agent-s2s-without-client-adapter

Conversation

@patmmccann

@patmmccann patmmccann commented Oct 22, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #6053

This adds the note agreed in the issue: a publisher can leave a server-side bidder's Prebid.js adapter out of the build. It also documents the quirks that come with that, checked against current Prebid.js code.

Changes

  • dev-docs/modules/prebidServer.md: new section "Server-Side Bidders Don't Need a Client-Side Adapter".
    • Why it works: adapterManager.makeBidRequests only looks up a registered adapter for client bidders. S2S bidders are forwarded to PBS without one. There are no bidder-specific param transforms anymore: transformBidParams was removed in 9, and the AppNexus PSP converter module no longer exists. PBS handles param validation and type conversion, plus user syncs via /cookie_sync.
    • GDPR/TCF: the GVL ID normally comes from the client adapter. With tcfControl enforcing vendor consent for basicAds (the default, enforceVendor: true), a bidder with an unknown GVL ID is removed. The fix is gvlMapping or deferS2Sbidders: true (modules/tcfControl.ts getGvlid / validateRules).
    • Aliases: aliases defined in the client adapter aren't known without it. Use PBS's own aliases or extPrebid.aliases.
    • Client-side fallback: routing a bidder to the client, e.g. with s2sTesting, needs the adapter in the build.
  • dev-docs/examples/s2s-only.md (new, for Document server-side bidding without client-side adapters #5033): a "Server-Side Only Bidding" example page, plus a sidebar entry next to "Running Prebid.js as an ad server".
    • Live example: an ad unit with no client-side bidders (bids: [{ module: 'pbsBidAdapter', params: { configName } }]) that requests a Prebid Server stored impression. It uses the Prebid mobile team's test server (prebid-server-test-j.prebid.org, the stored request prebid-demo-banner-300-250 and the demo account from the mobile docs). The page says not to use that server in production.
    • Static example: s2sConfig.bidders listing a bidder whose adapter isn't in the build, linking to the caveats section above.
    • Tested in headless Chrome with the page's own JS and the prebid.js@latest not-for-prod build. The test server allows CORS from any origin; one auction request returns a 0.15 USD 300x250 s2s bid from seat prebid, which renders the Prebid test creative. With allowUnknownBidderCodes: false no bid comes back, so the example's comment about it is accurate.
    • Its sidebar entry goes in the same spot as the one in Example: Prebid as ad server with cross-origin (SafeFrame-style) rendering #6864, so whichever merges second needs a trivial rebase.
  • prebid-server/use-cases/pbs-pbjs.md: one paragraph under the s2sConfig example saying bidderA/bidderB's adapters don't need to be in the build, with a link to the new section.
    • Also fixes that file's existing markdownlint errors (code fence languages, list style), since CI lints the whole file.

markdownlint-cli2 0.20.0 (CI's version) and 0.22.1 pass on all changed files.

🤖 Generated with Claude Code

Document that bidders in s2sConfig.bidders can be left out of the Prebid.js
build, and the caveats: TCF vendor enforcement needs gvlMapping or
deferS2Sbidders because the GVL ID comes from the client adapter, adapter-
defined aliases aren't known, and client-side fallback (s2sTesting) needs the
adapter. Mention it on the PBS + Prebid.js use case page, and fix that page's
existing markdownlint errors.

Fixes prebid#6053

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@netlify

netlify Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for prebid-docs-preview ready!

Name Link
🔨 Latest commit ebfcbcc
🔍 Latest deploy log https://app.netlify.com/projects/prebid-docs-preview/deploys/6add205b32a73cdbdcf16a5b
😎 Deploy Preview https://deploy-preview-6848--prebid-docs-preview.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-22T19:14:39.335948Z 781d150 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 781d1507b3

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".


If you leave the adapter out, keep these in mind:

- **GDPR / TCF:** the bidder's Global Vendor List ID is normally declared by its Prebid.js adapter. Without the adapter, Prebid.js doesn't know it. If the [TCF Control module](/dev-docs/modules/tcfControl.html) is enforcing vendor consent for `basicAds` (the default), the bidder is removed from the auction. Either declare its ID with [`gvlMapping`](/dev-docs/publisher-api-reference/setConfig.html#setConfig-gvlMapping), which also sends it to Prebid Server for aliases, or set `deferS2Sbidders: true` on the `basicAds` rule to let Prebid Server enforce vendor consent for bidders with unknown IDs.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Warn that deferral still blocks user syncs

When the default Purpose 1/storage vendor check is active, deferS2Sbidders is not a full alternative to gvlMapping: the option applies only to basicAds (dev-docs/modules/tcfControl.md:83), while user-sync pixels are separately gated by Purpose 1 (dev-docs/modules/tcfControl.md:46). For a server-only bidder with no adapter/GVL mapping, this recommendation therefore lets its bids through but still silently blocks the /cookie_sync results that the preceding paragraph says will run, reducing match rates; document that gvlMapping (or a storage-rule exception) is still required for user syncs.

Useful? React with 👍 / 👎.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant