RTB Architecture
Prebid Server Bidder Adapters: The List, How They Work and How to Add One
Published · Last updated
Next scheduled review:
A Prebid Server bidder adapter is the code that turns one server-side auction into a request for a single SSP or exchange and maps its bids back. PBS-Go ships 281 core adapters plus 116 aliases (GitHub, 30 October 2026). Each adapter is a YAML info file, a JSON parameter schema, adapter code and JSON-driven tests.
Key terms on this page: bidder adapter · Prebid Server · SSP · OpenRTB · TCF · cookie sync · ads.txt
Contents
Key facts
- The Go build carries the most adapters. PBS-Go's master branch held 397 bidder-info files on 9 November 2026, of which 116 declare
aliasOf, leaving 281 core adapters (static/bidder-info, last commit 30 October 2026). - The Java build has fewer. PBS-Java's master branch held 266 bidder-config files, which declare 103 further aliases between them (bidder-config, last commit 4 November 2026).
- The docs list mixes both. Prebid's bidder data file marks 395 entries as server-side adapters, 83 of them aliases (bidder-data.csv, last modified 3 November 2026).
- Defaults are opposite. PBS-Go enables most bidders by default; PBS-Java enables none (bidder hosting guidelines, accessed 9 November 2026).
- Adapters are an attack surface. On 8 June 2026, Prebid published critical request-forgery advisories for PBS-Go before 4.4.0 (CVE-2026-54735) and PBS-Java before 3.43.0 (CVE-2026-54734) (GHSA-4p3g-4hcj-wpvx; GHSA-fr2c-g2f8-qchg).
Definition
Bidder adapter (Prebid Server): a module that builds outgoing HTTP requests to one demand partner from Prebid Server's validated OpenRTB request, and turns that partner's response into typed bids for the auction. In PBS-Go, these are the MakeRequests and MakeBids methods of the adapters.Bidder interface (Prebid.org, new bid adapter for Go, accessed 9 November 2026).
An adapter never opens its own connections. Prebid's guide forbids "directly initiating any form of network communication", so the core can pool connections and record metrics for every bidder in the same way.
How to read the Prebid Server bidder list
The same exchanges that bid in the browser usually bid on the server too, but through separate code; the browser side is explained in header bidding explained. Prebid publishes the adapter list as a searchable page and a CSV file (Prebid Server bidder params). Each row comes from a bidder's documentation page, not from the code. So the list tells you what a bidder says it supports, and the repository tells you what a given build contains.
4 of 4 rows
PBS-Go | Bidder info files | 397 | 116 |
PBS-Java | Adapter config files, plus aliases inside them | 266 | 103 more |
Prebid docs CSV (3 Nov 2026) | Doc pages marked | 395 | 83 |
Prebid docs CSV (3 Nov 2026) | Doc pages marked | 733 | n/d |
PBS-Go static/bidder-info (30 Oct 2026)
- What it counts
Bidder info files
- Total
397
- Of which aliases
116
PBS-Java bidder-config (4 Nov 2026)
- What it counts
Adapter config files, plus aliases inside them
- Total
266
- Of which aliases
103 more
Prebid docs CSV (3 Nov 2026)
- What it counts
Doc pages marked
server-adapter: yes- Total
395
- Of which aliases
83
Prebid docs CSV (3 Nov 2026)
- What it counts
Doc pages marked
client-adapter: yes- Total
733
- Of which aliases
n/d
Table by AdSovereign, CC BY 4.0.
Sources: the PBS-Go and PBS-Java repositories and bidder-data.csv, counted by us on 9 November 2026. The Java alias figure is our count of entries under aliases: in the YAML files.
The CSV also shows what server-side bidders declare. Of the 395 entries, 392 accept banner, 344 video and 235 native. Only 182 say "yes" to mobile apps, while 194 say "check with bidder". And 238 declare TCF EU support (bidder-data.csv). Treat these as self-declared. Confirm with the bidder before you rely on a column.
Names can also differ between builds. In PBS-Go, magnite is an alias of the core rubicon adapter (magnite.yaml). PBS-Java 4.0.0 made magnite the core adapter and rubicon the alias (PBS-Java 4.0.0, 6 August 2026). A running server answers the question for itself. PBS-Go serves GET /info/bidders and GET /info/bidders/{name} (router.go).
What an adapter is made of
The two builds split an adapter into similar parts with different file names.
7 of 7 rows
Bidder info: endpoint, GVL ID, media types, user sync |
|
|
Parameter schema |
|
|
Parameter type |
|
|
Adapter code |
|
|
Unit tests |
|
|
Integration test | n/a |
|
Registration |
|
|
Bidder info: endpoint, GVL ID, media types, user sync
- PBS-Go file
static/bidder-info/{bidder}.yaml- PBS-Java file
resources/bidder-config/{bidder}.yaml
Parameter schema
- PBS-Go file
static/bidder-params/{bidder}.json- PBS-Java file
resources/static/bidder-params/{bidder}.json
Parameter type
- PBS-Go file
openrtb_ext/imp_{bidder}.go- PBS-Java file
ExtImp{Bidder}.java
Adapter code
- PBS-Go file
adapters/{bidder}/{bidder}.go- PBS-Java file
bidder/{bidder}/{Bidder}Bidder.java
Unit tests
- PBS-Go file
{bidder}_test.go,params_test.go,{bidder}test/exemplary/*.json,supplemental/*.json- PBS-Java file
{Bidder}BidderTest.java
Integration test
- PBS-Go file
n/a
- PBS-Java file
it/{Bidder}Test.javaplus four JSON fixtures
Registration
- PBS-Go file
openrtb_ext/bidders.go,exchange/adapter_builders.go- PBS-Java file
spring/config/bidder/{Bidder}Configuration.java
Table by AdSovereign, CC BY 4.0.
The bidder info file, annotated
The bidder info file is where a host learns how to reach you. This PBS-Go example is for an imaginary bidder, examplebidder. The keys follow Prebid's template.
# static/bidder-info/examplebidder.yaml (PBS-Go 4.11.x)
endpoint: "https://REGION.bid.example.com/openrtb2" # hosts swap REGION per data centre
endpointCompression: gzip # remove if your server cannot accept gzip
geoscope: # read by hosts, not by code (yet)
- USA
- "!EEA"
maintainer:
email: "prebid-maintainer@example.com" # a group list, not a person
gvlVendorID: 9999 # placeholder; use your real IAB Europe GVL ID or delete the line
modifyingVastXmlAllowed: true # lets hosts add video impression tracking
openrtb:
version: 2.6 # remove if you only accept the 2.5 model
capabilities:
app:
mediaTypes: [banner, video]
site:
mediaTypes: [banner, video, native]
userSync:
redirect:
url: "https://sync.example.com/match?gdpr={{.GDPR}}&consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&redirect={{.RedirectURL}}"
userMacro: "$UID" # the macro your sync endpoint fills with its user IDPrebid explains each choice in its guide. The geoscope list accepts three-letter country codes, "EEA" or "global", and a value can be negated with "!". Leaving out openrtb.version makes Prebid Server downgrade 2.6 fields back to their 2.5 extension locations (new bid adapter for Go). The userSync block feeds the sync flow described in Prebid Server cookie sync.
PBS-Java uses different names for the same facts. PubMatic's two files show the mapping (Go pubmatic.yaml; Java bidder-config).
6 of 6 rows
Compression |
|
|
GVL ID |
|
|
Media types |
|
|
OpenRTB version |
|
|
Sync macros |
|
|
Cookie family | the bidder name, or |
|
Compression
- PBS-Go key
endpointCompression- PBS-Java key
endpoint-compression
GVL ID
- PBS-Go key
gvlVendorID- PBS-Java key
meta-info.vendor-id
Media types
- PBS-Go key
capabilities.site.mediaTypes- PBS-Java key
meta-info.site-media-types
OpenRTB version
- PBS-Go key
openrtb.version- PBS-Java key
ortb-version
Sync macros
- PBS-Go key
{{.GDPR}},{{.RedirectURL}}- PBS-Java key
{gdpr},{redirect_url}
Cookie family
- PBS-Go key
the bidder name, or
userSync.key- PBS-Java key
usersync.cookie-family-name
Table by AdSovereign, CC BY 4.0.
The parameter schema
Each adapter publishes a JSON Schema for its bidder parameters. Prebid Server validates imp[].ext.prebid.bidder.{bidder} against it before the adapter runs, so the adapter can assume valid input (new bid adapter for Go). PubMatic's schema, for example, requires only publisherId (pubmatic.json).
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "Examplebidder Adapter Params",
"description": "A schema which validates params accepted by the Examplebidder adapter",
"type": "object",
"properties": {
"placementId": { "type": "string", "minLength": 1, "description": "Placement ID issued by Examplebidder" },
"bidFloor": { "type": "number", "minimum": 0, "description": "Optional floor in USD CPM" }
},
"required": ["placementId"]
}If you also have a Prebid.js adapter, Prebid asks you to use the same name and the same parameters, so publishers can move a bidder between browser and server without new IDs.
The adapter code
A PBS-Go adapter is a Builder function plus two methods. This skeleton shows the shape; the full version, with media-type detection and status-code handling, is in Prebid's guide.
package examplebidder
import (
"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/openrtb_ext"
"github.com/prebid/prebid-server/v4/util/jsonutil"
)
type adapter struct{ endpoint string }
// Builder is registered in exchange/adapter_builders.go.
func Builder(bidderName openrtb_ext.BidderName, cfg config.Adapter, server config.Server) (adapters.Bidder, error) {
return &adapter{endpoint: cfg.Endpoint}, nil
}
// MakeRequests returns the HTTP calls; the core sends them.
func (a *adapter) MakeRequests(request *openrtb2.BidRequest, info *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) {
body, err := jsonutil.Marshal(request)
if err != nil {
return nil, []error{err}
}
return []*adapters.RequestData{{
Method: "POST",
Uri: a.endpoint,
Body: body,
ImpIDs: openrtb_ext.GetImpIDs(request.Imp),
}}, nil
}
// MakeBids maps one HTTP response to typed bids (banner, video, native, audio).
func (a *adapter) MakeBids(request *openrtb2.BidRequest, reqData *adapters.RequestData, resp *adapters.ResponseData) (*adapters.BidderResponse, []error) {
// Check resp.StatusCode, unmarshal with jsonutil, set BidType from bid.MType.
return nil, nil
}Three rules from the guide shape this code. The request object holds pointers to shared memory, so copy before you change anything other than request.Imp. Use jsonutil.Marshal and jsonutil.Unmarshal, not the standard library. And let the core handle gzip; do not set compression headers yourself.
PBS-Java follows the same pattern with makeHttpRequests and makeBids. Its porting guide asks for "the same functionality as the Go adapter" and warns that "the PBS-Go team is more lenient" about what adapters may do (bid adapter porting guide, accessed 9 November 2026).
Testing: JSON in, JSON out
PBS-Go tests adapters with JSON files instead of hand-written mocks. Happy paths go in exemplary/, one per media type; errors and edge cases go in supplemental/. A short Go test calls adapterstest.RunJSONBidderTest over the folder, as PubMatic's does (pubmatic_test.go). This is a complete exemplary banner test for the imaginary bidder.
{
"mockBidRequest": {
"id": "test-request-id",
"imp": [
{
"id": "imp-1",
"banner": { "format": [ { "w": 300, "h": 250 } ] },
"ext": { "bidder": { "placementId": "pl-123" } }
}
]
},
"httpCalls": [
{
"expectedRequest": {
"uri": "https://us-east.bid.example.com/openrtb2",
"body": {
"id": "test-request-id",
"imp": [
{
"id": "imp-1",
"banner": { "format": [ { "w": 300, "h": 250 } ] },
"ext": { "bidder": { "placementId": "pl-123" } }
}
]
},
"impIDs": ["imp-1"]
},
"mockResponse": {
"status": 200,
"body": {
"id": "test-request-id",
"cur": "USD",
"seatbid": [
{
"seat": "examplebidder",
"bid": [
{ "id": "bid-1", "impid": "imp-1", "price": 1.25, "adm": "<div>ad</div>", "crid": "cr-1", "w": 300, "h": 250, "mtype": 1 }
]
}
]
}
}
}
],
"expectedBidResponses": [
{
"currency": "USD",
"bids": [
{
"bid": { "id": "bid-1", "impid": "imp-1", "price": 1.25, "adm": "<div>ad</div>", "crid": "cr-1", "w": 300, "h": 250, "mtype": 1 },
"type": "banner"
}
]
}
]
}The mockBidRequest, httpCalls and expectedBidResponses fields are required. Expected errors go in expectedMakeRequestsErrors and expectedMakeBidsErrors, compared as literal text or a regex (new bid adapter for Go). Run the same checks as the project's CI with ./validate.sh --nofmt --cov --race 10. Prebid says its guidance usually yields 90% to 95% coverage, but it does not enforce a threshold.
Then test by hand. Start the server, post an auction with "test": 1 to /openrtb2/auction, and read ext.debug.httpcalls for your bidder. For user sync, save an ID through /setuid and confirm it appears in the outgoing request. The debug fields are explained in Prebid Server analytics and debugging.
How to add a bidder adapter, step by step
- Pick a name. Lower case, no special characters, and not one of the reserved words
ae,all,context,data,general,gpid,prebid,skadnortid. Reuse your Prebid.js bidder code if you have one. - Write the bidder info file and parameter schema. Use a group email and your real GVL ID.
- Write the adapter and register it. Add the name to
openrtb_ext/bidders.goand the builder toexchange/adapter_builders.go. - Write the JSON tests and run
validate.sh. - Open the docs pull request. Prebid will not merge an adapter until a documentation PR exists in the
prebid.github.iorepository. - Open the code pull request. Title it "New Adapter: {Bidder}". Prebid says you do not need to ask permission or open an issue first.
- Stay reachable. Prebid gives maintainers at least a week to review core changes that touch their adapter, and may disable an adapter whose owner stops responding.
Steps 1 to 7 summarise Prebid's Go adapter guide, accessed 9 November 2026. Prebid recommends building new adapters in Go first; the core team then ports them to Java "within a couple of months" (Prebid Server versions, accessed 9 November 2026). How the two builds differ beyond adapters is in Prebid Server Go vs Java.
Aliases: one adapter, several names
An alias reuses an existing adapter under a new bidder code. In PBS-Go, you add a bidder info file that contains aliasOf and the parent name; Prebid asks that alias names stay unique in their first six characters. Since PBS-Go 4.0.0, an alias must declare its own GVL vendor ID explicitly (new bid adapter for Go; v4.0.0 release, 6 March 2026). PBS-Java lists aliases under the parent's aliases: block and made vendor-id mandatory for them in 4.0.0 (PBS-Java 4.0.0).
Hosts can also define aliases per request, in ext.prebid.aliases, or server-wide in a default request. That is how a publisher routes a second seat on the same exchange without new code. See Prebid Server stored requests for the default request file.
Enabling adapters as a host
Because PBS-Go enables most adapters out of the box, a host's first job is to switch off the ones it does not use. That also keeps unused bidders out of cooperative cookie syncs (bidder hosting guidelines).
# pbs.yaml (PBS-Go): disable what you do not buy from, pin regional endpoints
adapters:
examplebidder:
disabled: true # adapters are on unless disabled
rubicon:
endpoint: "https://exapi-eu.rubiconproject.com/a/api/exchange" # EU data centre# prebid-config.yaml (PBS-Java): nothing runs until enabled
adapters:
pubmatic:
enabled: true
ix:
enabled: trueEvery bidder you enable is also a seller relationship. List it in your ads.txt file and check the supply chain with our ads.txt and sellers.json validator; the reasoning is in schain, ads.txt and sellers.json together.
On your own deployment, the enabled list is part of the container config shown in our AWS and Docker reference setup, and the self-hosted Prebid Server profile weighs that work against renting. Hosted services such as Magnite Prebid Server, PubMatic OpenWrap and Index Exchange Prebid Server make these choices for you. The Prebid Server self-hosting guide covers making them yourself, and the publisher independence hub explains why that control matters.
Common mistakes
- Running an old build. The June 2026 advisories rate the request-forgery flaw as critical. Upgrade PBS-Go to 4.4.0 or later and PBS-Java to 3.43.0 or later; current releases are PBS-Go 4.11.1 (2 November 2026) and PBS-Java 4.5.0 (4 November 2026).
- A personal maintainer email. People leave. Prebid asks for a group distribution list.
- Dynamic hostnames in the endpoint. Prebid's FAQ discourages a fully variable domain such as
https://{host}/path, and hosts may disable an adapter that uses one (Prebid Server FAQ). - Mutating the shared request. Change a copy, not the pointer you were given, except for
request.Imp. - Host-specific defaults. The default endpoint must not depend on a particular host company; Prebid may question suspicious IDs in review.
- Leaving every Go adapter enabled. Unused adapters still appear in cooperative syncs and in
/info/bidders. - Assuming the list equals the build. A bidder on the docs page may be Go-only, Java-only or an alias. Check the repository for the version you run.
FAQ
How many bidders does Prebid Server support?
Where is the Prebid Server adapter list?
static/bidder-info in PBS-Go or bidder-config in PBS-Java, or call /info/bidders on a running PBS-Go server.How do I add a bidder adapter to Prebid Server?
Should I build my adapter in Go or Java first?
What is a bidder alias in Prebid Server?
Does my Prebid.js adapter work in Prebid Server?
How this works on owned infrastructure
The adapter list is, in practice, your demand list: which partners can bid, through which regional endpoint, with which GVL ID and sync URL. A managed host decides which adapters it compiles and enables, and when it upgrades past an advisory. AdSovereign runs Prebid Server inside your own environment, so your engineers choose the build, the enabled adapters and the patch date, and can add a private adapter for your own demand in a fork without waiting on anyone. The integrations page lists the bidder and DSP connections maintained for the stack, and the architecture page shows where adapters sit in the request path.
Sources
- Prebid.org, "Prebid Server: New Bid Adapter (Go)" (accessed 9 November 2026). https://docs.prebid.org/prebid-server/developers/add-new-bidder-go.html
- Prebid.org, "Prebid Server: Adding a New Bidder (Java)" (accessed 9 November 2026). https://docs.prebid.org/prebid-server/developers/add-new-bidder-java.html
- Prebid.org, "Prebid Server Bidder Params" and "bidder-data.csv" (CSV last modified 3 November 2026). https://docs.prebid.org/dev-docs/pbs-bidders.html
- Prebid.org, "Bidder-Specific Hosting Guidelines" (accessed 9 November 2026). https://docs.prebid.org/prebid-server/hosting/bidder-specific-guidelines.html
- Prebid.org, "Prebid Server Code Bases" (accessed 9 November 2026). https://docs.prebid.org/prebid-server/versions/pbs-versions-overview.html
- Prebid.org, "Prebid Server FAQ" (accessed 9 November 2026). https://docs.prebid.org/faq/prebid-server-faq.html
- GitHub, prebid/prebid-server,
static/bidder-info,static/bidder-params,adapters/pubmatic,router/router.go(master, last commit 30 October 2026). https://github.com/prebid/prebid-server - GitHub, prebid/prebid-server-java,
src/main/resources/bidder-config, README anddocs/developers/bid-adapter-porting-guide.md(master, last commit 4 November 2026). https://github.com/prebid/prebid-server-java - GitHub, prebid/prebid-server releases v4.0.0 (6 March 2026) and v4.11.1 (2 November 2026). https://github.com/prebid/prebid-server/releases
- GitHub, prebid/prebid-server-java releases 4.0.0 (6 August 2026) and 4.5.0 (4 November 2026). https://github.com/prebid/prebid-server-java/releases
More sources (2)
- GitHub Security Advisory GHSA-4p3g-4hcj-wpvx (CVE-2026-54735), prebid/prebid-server (8 June 2026). https://github.com/prebid/prebid-server/security/advisories/GHSA-4p3g-4hcj-wpvx
- GitHub Security Advisory GHSA-fr2c-g2f8-qchg (CVE-2026-54734), prebid/prebid-server-java (8 June 2026). https://github.com/prebid/prebid-server-java/security/advisories/GHSA-fr2c-g2f8-qchg