Publishers (SSP) integration

You send us OpenRTB 2.5 bid requests for popunder impressions; we answer with a first-price bid or no bid. You are paid for impressions confirmed by our billing notice.

Endpoint

Request line and headers
POST https://rtb.example.net/openrtb/{your-key}
Content-Type: application/json
X-Openrtb-Version: 2.5        (optional)

Response codes

CodeMeaning
200 + JSONA bid (see Bid response)
204No bid, no content. On request we answer no bid with HTTP 200 and an empty body instead

We never answer the bid endpoint with other codes. A malformed request, an unknown key, a paused feed, a request above your agreed rate or an overload are all answered as no bid — your system never sees an error status from us and never has to throttle us.

Rate limit. We agree a requests-per-second cap for your feed. Requests above it are answered with 204 no bid, not with HTTP 429. Ask your manager if you need a higher cap.

Bid request

Object / fieldRequiredNotes
idyesUnique per request; up to 128 bytes, printable characters
imp[]yesAt least one
imp.idyesUnique within the request; same rules as id
imp.bidfloornoCPM in USD; absent or 0 = no floor. A number or a numeric string
imp.bidfloorcurnoUSD only; any other currency → no bid
imp.instlrecommended1 for popunder
imp.tagidrecommendedPlacement id
imp.securerecommended1
site.id, site.domain, site.pageyesAt least one of domain / page. Used for reporting and filters
site.publisher.idrecommended
device.ua, device.ipyesThe browser and OS for filters are read from ua when device.os is absent
device.geo.countryrecommendedISO-3166-1 alpha-3 (alpha-2 accepted); user.geo.country is used when absent
device.os, device.osv, device.devicetype, device.languagerecommendeddevicetype per OpenRTB 2.5 list 5.21
user.idrecommended
atnoWe bid first price (1)
tmaxnoMilliseconds; we use the smaller of your tmax and 250
curnoAbsent, or a list containing USD
badv, bcatnoRespected: we never return a bid with a blocked advertiser domain (or its subdomain) or category (IAB25 also blocks IAB25-3)
source, regs, ext and any other fieldsnoPassed on to the buyer as received
Example bid request
{
  "id": "079675c8bdb440daa073c39fbac3bacc",
  "imp": [{
    "id": "3851dc773b66462f81bc32c3a07a08aa",
    "instl": 1,
    "tagid": "1234",
    "bidfloor": 0.01,
    "bidfloorcur": "USD",
    "secure": 1
  }],
  "site": {
    "id": "777",
    "domain": "example.com",
    "page": "https://example.com/page",
    "publisher": {"id": "12"}
  },
  "device": {
    "ua": "Mozilla/5.0 (Linux; Android 13; Pixel 7)",
    "ip": "203.0.113.10",
    "language": "en",
    "js": 1,
    "geo": {"country": "DEU"}
  },
  "user": {"id": "64223830e7e94f0ebedf5966599fc9d8"},
  "at": 1,
  "tmax": 250,
  "cur": ["USD"]
}
Try it with curl
curl -i -X POST 'https://rtb.example.net/openrtb/YOUR_KEY' \
  -H 'Content-Type: application/json' \
  --data @request.json
# 200 with a bid, or 204 for no bid

Floors and timeouts

Bid response

Example bid response
{
  "id": "079675c8bdb440daa073c39fbac3bacc",
  "seatbid": [{
    "seat": "…",
    "bid": [{
      "id": "…",
      "impid": "3851dc773b66462f81bc32c3a07a08aa",
      "price": 0.0388,
      "adm": "https://go.example.net/r/…",
      "burl": "https://burl.example.net/b/…",
      "nurl": "https://burl.example.net/w/…",
      "adomain": ["advertiser.example"],
      "crid": "…"
    }]
  }],
  "cur": "USD"
}

Notices

NoticeWhen to callOur answerRetries
burl (billing)When the impression is shown — the only event we pay for200 once the impression is recordedOn 503 or a network error, retry with back-off for up to 1 hour. A repeated call never counts twice
nurl (win)When our bid winsAlways 200Not needed: statistics only

We pay on our burl only. Wins without a billing notice are not paid. A billing notice is answered with 200 only after it is safely stored.

Statistics and reconciliation

Your statistics with us (requests, bids, wins, impressions, amount) are available by the reporting API. If you give us a read-only key to your reporting API, we reconcile with your numbers every day.

FAQ

Why do I get many 204 answers?

A 204 means no bid. Common reasons: no buyer bid above your floor, the traffic does not match the feed's filters, the request is above your agreed rate, the currency is not USD, the request is malformed (for example a missing id or imp), or the buyer did not answer in time. Your manager can see a breakdown of the reasons for your feed.

Do you answer HTTP 429 or 5xx?

No. The bid endpoint only answers 200 with a bid or 204 (or 200 empty) with no bid.

Which formats do you buy?

Popunder only.

Do I need to fill in ${AUCTION_PRICE}?

No. We bid first price and our burl carries no price macro.

Can I send several impressions in one request?

Yes. Each impression gets at most one bid — the best valid one.

Is there a test mode?

There is no test flag yet. We test the integration together on a small volume before the feed goes live.

Questions about the integration? Write to manager@gfybid.com or use the contact form.