For DSP partners

Direct supply path. Full schain. No middlemen.

Adbustr is a direct supply integration target for performance-focused DSPs, aggregating long-tail video and display inventory served as web (site) supply — in-stream VAST, VPAID, banner, ADM and pop. One OpenRTB 2.5 wire contract, a SupplyChain object on every request, and impression-level logs for reconciliation.

Integration brief

Standards-first. Side-deal-free. Audit-friendly.

OpenRTB 2.5 wire contract

HTTPS POST, application/json, x-openrtb-version: 2.5, keep-alive, UTF-8. Exactly one imp per request. Standard objects throughout — any ext field is agreed at onboarding, never assumed.

SupplyChain object on every request

Each impression we surface carries source.ext.schain (ver 1.0) with asi, sid, and hp=1 on the Adbustr node. sellers.json, ads.txt, and app-ads.txt are published at their canonical locations.

Second price by default

at=2 is the default clearing rule; at=1 is available per seat. Ranking normalises to a base currency — Norm = price × currency rate × BidRate — and anything under the endpoint bidfloor never clears. The clearing price recorded per request is available to you in the impression-level logs for reconciliation.

Economics you can read off the contract

Revenue share is configured per integration with per-country (ISO2) overrides. bidfloor, BidRate, and request throttling (ReqFilter) are set per seat and per zone, read from configuration rather than hardcoded.

The request we send

One imp. Enriched device. Full supply chain.

Every request is enriched before it leaves us — real client IP, GeoIP resolution, and browser, OS, and device class from the user agent — then built into a canonical OpenRTB 2.5 BidRequest and fanned out to every eligible seat in parallel, inside tmax.

imp
Exactly one impression object per request.
site / app
site on every request — all supply currently transacts as web inventory. No app object is emitted, so app.bundle targeting and app-ads.txt resolution are not available yet.
device
ua, ip, and geo — country ISO2, region, city, coordinates — plus browser, OS, and device type resolved server-side.
user.buyeruid
Sent whenever an ID sync is in place for your seat.
source.ext.schain
Complete SupplyChain object, ver 1.0, hp=1 on our node.
regs.ext
gdpr and consent, propagated from the supply side.
badv
Advertiser domain blocklist declared by the publisher.
tmax · cur · at
Auction timeout, bid currency, and auction type.

Video profile

mimes
video/mp4 · video/webm · application/javascript · video/3gpp
protocols
[2, 3, 5, 6] — VAST 2.0 / 3.0, InLine and Wrapper
api
[1, 2] — VPAID 1.0 / 2.0
duration
minduration / maxduration within 1–150 s
bitrate
10–9000 kbps
also sent
linearity, startdelay, placement, w/h

The response we expect

Standard BidResponse. Nothing bespoke to build.

seatbid[].bid[]
One or more bids per seat; empty response is read as a no-bid.
price
CPM in the seat currency. price ≤ 0 is discarded.
impid
Must match the imp.id we sent.
adm
VAST tag URL for video, HTML for banner, landing URL for pop.
nurl · burl
Win notice called server-side, billing notice fired from the rendered creative.
crid · cid · adid
Creative, campaign, and ad identifiers — carried into reporting.
adomain
Advertiser domain, checked against the publisher's badv list.
w / h
Creative dimensions, validated against the sizes declared on the imp.

What goes in adm

Video

Put the URL of your VAST tag in adm. We wrap it in our own VAST 3.0 wrapper through VASTAdTagURI and serve it to the player. Inline VAST markup in adm will not render.

Banner

adm carries the HTML markup. It is served through our banner container with price macros already substituted.

Popunder

adm carries the landing URL, flagged with imp.instl=1. nurl is accepted as an alternative carrier for the destination.

Notices & macros

Win, bill, and loss — all three, on every auction.

nurl

Called server-side the moment your bid wins, after macro substitution. On the OpenRTB channel the win notice can be proxied through /rtb/nurl/{id} so it fires on the billable impression rather than at auction time.

burl

Passed into the rendered creative and fired by the client on the billable impression — from the player in VPAID, from the impression pixel list in pop.

lurl

Fired on every valid losing bid, with the loss reason carried in ${AUCTION_LOSS}.

Supported macros

${AUCTION_PRICE}${AUCTION_CURRENCY}${AUCTION_ID}${AUCTION_LOSS}

Macros are substituted server-side before the notice is fired — on nurl, burl and lurl alike. Any additional macro or encoding your seat requires is agreed at onboarding.

Validation

Every bid is checked, every drop is logged with a reason.

A bid is dropped when

  • HTTP status other than 200, an empty body, or a payload that does not parse as JSON.
  • price ≤ 0, or a normalised price below the bidfloor set on the seat or zone.
  • Response currency outside the currencies declared for the seat.
  • Missing adm, or non-secure adm served against a secure impression (imp.secure=1).
  • Missing adomain, or an adomain on the publisher's badv list; bcat, bapp, and battr violations.
  • Creative dimensions outside the sizes declared on the imp.
  • Seat outside the publisher's allow-list, or explicitly blocked for the zone.
  • Anything that arrives after tmax — late responses are discarded, not queued.

Request-level refusal codes

Requests that never reach your QPS budget are logged with a bid / no-bid verdict and the reason below, per request, and surfaced in reporting.

HTTP 400
Body does not parse as JSON.
unknown_endpoint
uid is unknown or the endpoint is switched off.
no_ip_ua
device.ip or device.ua is missing.
browser_not_allowed
User agent does not map to the browser allow-list.
non_mainstream
IAB25, IAB25-3, or IAB26 with the mainstream filter enabled.
fanout_off
Demand fan-out is toggled off — the request is accepted and logged, no demand spend.
no_imp
Empty imp array.
no_feeds
No live demand feed is attached to the endpoint.
HTTP 204
Final no-bid for any of the reasons above.

How partnerships work

01

NDA + technical exchange

Initial outreach goes through partnerships@adbustr.com. We execute a mutual NDA and exchange technical documentation, including QPS profiles, geographic coverage, seat and currency setup, and inventory class breakdowns.

02

Endpoint connection

We register your bidder URL, agree tmax and currency, and verify connectivity — a GET on the OpenRTB endpoint is treated as a ping, not a bid request. Test traffic validates schain propagation, macro substitution, and nurl / burl handling end to end.

03

Production ramp

Traffic opens under ReqFilter throttling and a per-endpoint QPS cap, then scales as bid rate, timeout rate, and downstream performance hold. Every step is reversible: the demand fan-out toggle is fail-safe OFF and flips instantly.

Specifications

Endpoints & timing.

Demand endpointyour bidder URL  (regional URLs supported)OpenRTB inboundhttps://rtb.adbustr.com/rtb/{uid}POST = bid request · GET = pingProtocolHTTPS POST · application/json · UTF-8Headersx-openrtb-version: 2.5 · keep-aliveSpecOpenRTB 2.5Auction timeouttmax 300–500 ms  (per publisher / zone)Bidder timeout500 ms · late responses discardedAuction typeat=2 second price (default) · at=1 optionalCurrencyper-seat cur · USD-based rates, hot-reloadedThrottlingReqFilter share per seat · maxqps per endpointNo-bidHTTP 204

Open a conversation.

Email is the fastest path. Or use the form — DSP inquiries are routed straight to the partnerships team.

partnerships@adbustr.com