# Prebid Server

Source: https://docs.ezoic.com/docs/prebid-adapter/prebid-server/


`ezoic` is a built-in bidder in Prebid Server (Go) from **v4.8.0**. Adding it is config only. Complete the [onboarding steps](/docs/prebid-adapter/#before-you-start) first: unregistered domains and app bundles get no bids.

| | |
|---|---|
| Bidder code | `ezoic` |
| Available since | Prebid Server (Go) v4.8.0 |
| User sync built in | Releases newer than v4.10.0 (see [User sync](#user-sync)) |
| OpenRTB | 2.6, site and app, banner / video / native |

## Enable the bidder

- **Self-hosted:** upgrade to v4.8.0 or newer. The adapter is enabled in the default build. If you keep an explicit bidder allowlist, add `ezoic`.
- **Through a host:** ask your host to enable `ezoic` for your account. No endpoint or credentials are needed on their side.

## Add Ezoic to impressions

Add `ezoic` under `imp.ext.prebid.bidder`, directly or in your stored requests:

~~~json
{
  "imp": [{
    "id": "1",
    "banner": { "format": [{ "w": 300, "h": 250 }, { "w": 336, "h": 280 }] },
    "ext": {
      "prebid": {
        "bidder": {
          "ezoic": {}
        }
      }
    }
  }]
}
~~~

`{}` is valid. You can add an optional `placementId` string, for example `{ "placementId": "sidebar-top" }`. It is recorded for reporting and doesn't change bidding.

### From Prebid.js (s2sConfig)

If your pages send bidders to Prebid Server through `s2sConfig`, add `ezoic` to the bidder list and to the ad units routed through it:

~~~javascript
pbjs.setConfig({
  s2sConfig: [{
    accountId: '<your PBS account>',
    bidders: ['ezoic' /* , ...other server-side bidders */],
    defaultVendor: '<your host, if applicable>'
  }]
});
~~~

~~~javascript
bids: [{ bidder: 'ezoic', params: {} }]
~~~

### Apps (Prebid Mobile)

Prebid Mobile auctions run through your Prebid Server, so apps work the same way: enable `ezoic` on the server and include it in the stored requests your app's ad units use. No Ezoic SDK is needed. App bundles must be registered with Ezoic.

## User sync

Ezoic matches users through an iframe sync. Matched users bid at noticeably higher rates, so turn it on for web inventory.

- **Newer than v4.10.0:** the sync is part of the `ezoic` bidder config. Nothing to add.
- **v4.10.0 or older:** add it to your Prebid Server config yourself (or ask your host to):

~~~yaml
adapters:
  ezoic:
    usersync:
      iframe:
        url: "https://g.ezoic.net/ezoic/prebid/adapter/usersync-frame?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&gpp={{.GPP}}&gpp_sid={{.GPPSID}}&r={{.RedirectURL}}"
        user_macro: "$UID"
~~~

`ezoic` then joins your normal `/cookie_sync` and `/setuid` flow. The sync honors TCF (vendor 347) and GPP, and sets no ID without consent where consent is required. To check it, call `/cookie_sync` with `"bidders": ["ezoic"]` and confirm a sync URL comes back.

## What comes back

- At most one bid per impression, in seat `ezoic`.
- **Banner and native** (`mtype` 1 and 4): `adm` is self-contained markup that includes Ezoic's impression tracking. Render it in a standard iframe. No win notice is needed from your side.
- **Video** (`mtype` 2): the bid carries a VAST URL. Prebid Server's standard video and cache flow handles it, and impression tracking is inside the VAST.

## Privacy and identity

- TCF v2 (`user.consent`, `regs.gdpr`), GPP (`regs.gpp`, `regs.gpp_sid`) and US Privacy (`regs.ext.us_privacy`) are honored and passed to all of Ezoic's demand.
- `user.eids` from your request are forwarded. Requests without a matched user are still bid on, at lower expected prices.

## Timeouts

Requests that reach Ezoic with less than about 250 ms left get a no-bid. Use an auction `tmax` of **800–1000 ms** end to end. Ezoic needs no special per-bidder timeout.

## Check that it works

1. **Endpoint reachability:** POST any valid OpenRTB request to `https://g.ezoic.net/ezoic/prebid/adapter/ortb`. Before your inventory is approved it returns HTTP 204, which confirms the request parsed. 400 means malformed JSON.
2. **Through Prebid Server:** run a test auction with `"test": 1` (or `ext.prebid.debug: 1`) and look for `ext.debug.httpcalls.ezoic` in the response.
3. **Bids** appear once the inventory is approved and demand matches.

## Troubleshooting

| Symptom | Likely cause |
|---|---|
| No `ezoic` entry in debug `httpcalls` | Bidder not enabled, missing from the imp's `ext.prebid.bidder`, or Prebid Server older than v4.8.0. |
| Always no-bid | Inventory not approved yet (most common), under ~250 ms left on `tmax`, or a privacy-restricted request. |
| Bids, but a low rate | ads.txt / app-ads.txt entries missing or stale, or floors above available demand. |
| Video bid has no `adm` | Expected: Ezoic video bids carry the VAST by URL. Use the standard video cache flow. |
| CPMs lower than partner-reported gross | Ezoic bids are net of revenue share. |

## Go-live checklist

- [ ] Prebid Server v4.8.0 or newer, or your host confirms `ezoic` is enabled
- [ ] Domains / app bundles registered and approved by Ezoic
- [ ] ads.txt / app-ads.txt entries published
- [ ] `ezoic` in your imps or stored requests
- [ ] `tmax` of 800 ms or more end to end
- [ ] Consent strings populated where they apply
- [ ] User sync on for web inventory (built in after v4.10.0, manual before)
- [ ] A debug auction shows `ezoic` in `httpcalls`
- [ ] Start with low traffic and agree the ramp window with your Ezoic contact

