Programmatic broadsheet · Set in real time
adon3
The Real-Time Bidding Exchange
Integration Docs
Supply side · XML feed · OpenRTB 2.6 / 2.5

Bid Response

When our demand pool bids, we answer 200 with a standard OpenRTB BidResponse and Content-Type: application/json; charset=utf-8. When nothing bids we answer 204 with an empty body.

We return the single winning bid: one seatbid, carrying one bid. There is no landscape to rank and no auction to run on your side.

Fields marked 2.6 exist in OpenRTB 2.6 only and are omitted when you declare 2.5. Complete bodies are on Bid Response Samples.

BidResponse

FieldTypeNotes
idstringThe BidRequest.id you sent. Always echoed.
seatbidobject[]The winning seat bid. Absent on a no-bid body.
bididstringOur identifier for this response. Quote it in support requests.
curstringCurrency of price. USD at launch.
customdatastringOpaque data, when a buyer supplies it.
nbrintNo-bid reason, on the rare 200 we send without seatbid.
extobjectExchange extensions.

SeatBid

FieldTypeNotes
bidobject[]The bid. Always exactly one entry.
seatstringBuyer seat the bid is made on behalf of.
groupintAlways 0, since we return a single bid.
extobjectExchange extensions.

Bid

FieldTypeNotes
idstringBidder-generated id for this bid.
impidstringThe imp.id from your request.
pricefloatBid price CPM in cur. See the note on settlement below.
adidstringId of the ad to be served, in the buyer's system.
nurlstringWin notice URL. Fire it after substitution.
burlstringBilling notice URL. Fire it when the impression is counted.
lurlstringLoss notice URL. Not returned to you, since we send you the winner.
admstringThe creative markup. Substitute macros before rendering.
adomainstring[]Advertiser domains, for your own blocklists.
bundlestringBundle or package name for app-promotion creatives.
iurlstringSample image URL, for ad quality checks.
cidstringCampaign id in the buyer's system.
cridstringCreative id in the buyer's system.
tacticstringTactic id, where a buyer supplies one.
cattaxintTaxonomy the cat values follow. 2.6.
catstring[]IAB content categories of the creative.
attrint[]Creative attributes present in the markup.
apisint[]API frameworks the markup requires. 2.6.
apiintAPI framework the markup requires.
protocolintVideo response protocol of the markup.
qagmediaratingintCreative media rating per IQG guidelines.
languagestringCreative language, ISO-639-1.
langbstringCreative language, IETF BCP 47. 2.6.
dealidstringDeal id, when the bid transacts on a deal from imp.pmp.
wintCreative width in device-independent pixels.
hintCreative height in device-independent pixels.
wratiointRelative width when expressing size as a ratio.
hratiointRelative height when expressing size as a ratio.
expintSeconds the bid is valid for, and the creative may be cached.
durintCreative duration in seconds, for video and audio. 2.6.
mtypeintCreative type: 1 banner, 2 video, 3 audio, 4 native. 2.6.
slotinpodintSlot position within a pod. 2.6.
extobjectExchange extensions.

Rendering the bid

  1. Substitute the macros in adm, nurl and burl. This is not optional, and an unsubstituted ${AUCTION_PRICE} in a notice means the win is recorded at no price. See Substitution Macros.
  2. Check mtype under 2.6, or infer the type from which object you sent under 2.5, and hand the markup to the right renderer.
  3. Render adm in the slot the impression came from, at w by h when they are present, or at the size you offered when they are not.
  4. Respect imp.secure. If you set it to 1, every asset in the returned markup will be HTTPS. If you did not set it, the markup may contain HTTP assets, which an HTTPS page will block.
  5. Honour exp. A creative rendered after the bid expires produces an impression we will not bill.

Native bids carry the native response object JSON-encoded into adm as a string, mirroring the way imp.native.request is sent. Video bids carry a VAST document inline in adm, or a VAST URL when tag-based serving is agreed for your account.

Win and billing notices

NoticeFire it whenCarries
nurlThe bid wins your auction, before render${AUCTION_PRICE}
burlThe impression is counted${AUCTION_PRICE} and impression identifiers

Fire both. nurl tells the buyer they won, burl tells them the impression happened, and buyers who see wins without billing notices reduce their bids on your inventory. The gap between the two is normal, since a win precedes a render.

Notices are plain HTTP GETs. Fire them server side where you can, and do not retry a failed one, since a duplicate notice counts as a duplicate impression.

Settlement

bid.price is what the buyer bid. What you are paid is what ${AUCTION_PRICE} resolves to after substitution, which under a second-price auction (at of 2) is normally lower.

Bill against the substituted value. Reconciling against the raw bid.price will overstate your revenue by a stable margin every day, and it is the single most common cause of a discrepancy claim that turns out not to be one.

No bid

204 No Content with an empty body. There is nothing to parse. Fall back to whatever you would otherwise show and move on.

Occasionally you will see 200 with nbr and no seatbid instead. It carries a reason code, and it is otherwise equivalent to a 204. Reason codes are listed on Errors & No-Bids.

Next: Substitution Macros.

sellers.json · schain enforced · OpenRTB 2.5 / 2.6 / 3.0 · XML
Printed on the Open Exchange
—  Integration Docs  —