Construct a JSON BidRequest object conforming to the OpenRTB 2.6 specification, populating the id, imp array (with banner or video object), site or app object, device, and user fields
Populate the imp[].banner or imp[].video object with supported sizes/protocols, the imp[].bidfloor and imp[].bidfloorcur fields, and the imp[].ext object for exchange-specific extensions
Include a SupplyChain (schain) object in the BidRequest.ext.schain field to declare all nodes in the reseller chain per the IAB SupplyChain spec
POST the BidRequest via HTTP POST with Content-Type: application/json (or application/x-protobuf for protobuf mode) to each bidder's endpoint, respecting the auction timeout (typically 100-300ms)
Parse the BidResponse: check for seatbid arrays, validate that the bid price meets or exceeds the floor, select the winning bid, and return a win notice by calling the nurl (win notice URL) on the winning bid object
For CTV/video impressions using dynamic ad pods, populate the imp[].video.podid and podsequence fields introduced in OpenRTB 2.6 to indicate pod position and enforce competitive exclusions
Known gotchas
OpenRTB 2.6 requires price fields to be in the currency specified by cur at the request level; mixing USD and EUR without proper currency declaration causes SSPs and DSPs to mismatch bid comparisons
The nurl win notice must be fired by the exchange, not the creative; many integrations incorrectly have the creative fire the nurl, which inflates reported wins when the creative loads client-side
Dynamic pod bidding fields (podid, mimes, protocols for VAST) in OpenRTB 2.6 are not universally implemented; check each DSP's documentation for which pod fields they consume before relying on pod-level competitive separation
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp