Programmatic DOOH: How the Auction, the Protocol, and the Players Actually Work
The programmatic DOOH market is small enough that most working knowledge lives inside ten or twelve companies. The protocol is OpenRTB 2.6. The clearing mechanism is a real-time second-price auction with sub-100ms budgets. The audience layer rides the same BidRequest.user.data array that web display uses. The proof-of-play receipt is signed at the device.
But the surface area is wide enough that practitioners new to the space end up reverse-engineering pieces of it from blog posts, RTB Spec section 7.2, and partner documentation that's six months out of date. This page is the consolidated reference — exactly how the auction works on the Trillboards SSP, with the audience-signal layer, the partner ecosystem, and the settlement reconciliation laid out so a buyer or a publisher can verify every claim against the live network data at /data/.
Live network data
The Trillboards SSP as of the latest snapshot:
- 0 active screens carrying the OpenRTB 2.6 pipeline
- 0 countries, 0 US cities
- 0 venue categories mapped to the IAB DOOH 1.0
- OAAA taxonomies
- 0 hardware classes running the identical OpenRTB client binary
The full demand ecosystem (DSPs, SSPs, exchanges, latency benchmarks, audience-signal coverage) lives at /data/demand-ecosystem/ with sub-pages for integration depth, latency benchmarks, audience signals, and the brand-safety workflow.
The OpenRTB 2.6 anatomy of a DOOH bid request
A DOOH bid request emitted by a Trillboards-connected screen carries the standard OpenRTB fields plus DOOH-specific extensions. The skeleton:
BidRequest {
id: <request_uuid>,
imp: [{
id: <impression_id>,
video: {
mimes: ["video/mp4", "application/javascript"], // VAST + VPAID
minduration: 5,
maxduration: 30,
protocols: [2, 3, 5, 6], // VAST 2.0, 2.0 wrapper, 3.0, 3.0 wrapper
w: <screen_width>,
h: <screen_height>,
placement: 5, // OOH placement
plcmt: 4 // OOH plcmt (RTB 2.6 dooh)
},
dooh: {
venuetypeid: [<oaaa_code>],
pubid: <trillboards_pub_id>
},
bidfloor: <floor_cpm_usd>,
bidfloorcur: "USD"
}],
dooh: {
venuetype: [<iab_dooh_venue_string>],
domain: "trillboards.com"
},
device: {
geo: {
lat: <lat>,
lon: <lon>,
country: "USA",
region: "<state_iso>",
city: "<city>",
type: 1
},
ua: "<aggregate_ua_class>",
os: "Android" | "FireOS" | "WebOS" | "Tizen",
devicetype: 8 // OOH device
},
user: {
data: [
{ id: "iab-at-1.1", segment: [{ id: "690", value: "Pets" }, ...] },
{ id: "trillboards-600", segment: [{ id: "intent_stage:decision" }, ...] }
]
},
bcat: [<blocked_iab_content_categories>],
badv: [<blocked_advertiser_domains>],
tmax: 100
}
The key DOOH-specific fields are imp.dooh.venuetypeid (OAAA category
code per the IAB DOOH 1.0 spec), dooh.venuetype (string-form venue
category), imp.video.placement=5 + imp.video.plcmt=4 (OOH
placement signals), and the device.devicetype=8 (OOH device). The
audience signal layer rides user.data with two segment-taxonomy
entries: IAB Audience Taxonomy 1.1 (segtax=4) and the Trillboards
namespace (segtax=600).
The full BidRequest schema with field-by-field semantics is documented at the DOOH Developer API reference.
How the waterfall fans out
The Trillboards SSP runs a parallel waterfall, not a sequential one. When the bid request arrives at the SSP:
- Authentication + venue resolution (~5 ms) — the SSP validates the device's hardware-attested identity, resolves the venue category via the screen venue taxonomy, and applies any per-venue brand-safety policy.
- Demand partner fanout (~80 ms) — the SSP fires parallel HTTP requests to all qualified demand partners with a 90 ms hard timeout per partner. Partners include Vistar Media, Place Exchange, Hivestack, AdsWizz DOOH, Google AdX programmatic, plus direct PMP-deal DSPs for high-value venues.
- Bid resolution (~10 ms) — the SSP collects all bids that arrived under the timeout, applies brand-safety filters to the responses, resolves the waterfall (highest cleared CPM wins; ties broken by partner priority + venue-specific policy), and returns the winning creative URL to the device.
- Playback + receipt (15-30 seconds, async) — the device plays the creative inside its native VAST player and emits a signed proof-of-play receipt back to the SSP for reconciliation.
The 100 ms total round-trip budget is what differentiates programmatic DOOH from traditional direct-sold DOOH. A traditional ad insertion can take minutes (the CMS receives the schedule overnight, plays it during the next loop); a programmatic ad insertion is decided every 30 seconds in real time, per device, per impression.
The demand ecosystem — who actually buys
Programmatic DOOH demand comes from three layers. Each connects to the Trillboards SSP via a different pathway:
Layer 1: DOOH-native DSPs
These are the demand sources purpose-built for DOOH inventory:
- The Trade Desk (TTD) — connects via Place Exchange
- DV360 (Google Display & Video 360) — connects via Google AdX programmatic guaranteed for premium venues, plus open auction via Vistar Media
- Adelphic — connects via Place Exchange
- Amobee DSP — connects via Vistar Media
- Hivestack DSP — direct integration
These DSPs treat DOOH as a first-class inventory class. They have full support for OpenRTB 2.6 DOOH extensions, IAB audience targeting, and PMP deals. Buyers running cross-channel campaigns (CTV + DOOH + mobile) typically use one of these.
Layer 2: DSPs that bid via exchanges
These DSPs buy DOOH inventory through aggregating exchanges. They don't have direct integrations but they bid actively when DOOH inventory shows up in their exchange-side feeds:
- Vistar Media DSP — connects through Vistar Media SSP-side
- Place Exchange DSPs — multiple buyers route through Place Exchange
- MediaMath — connects via Place Exchange (legacy support, lower volume)
Layer 3: Programmatic guaranteed
These are direct deal channels with reserved inventory at fixed prices:
- Google AdX programmatic guaranteed — venues that meet AdX brand-safety bar get high-CPM PG deals
- AdsWizz DOOH — audio-focused DSP, bids on DOOH inventory in venues where audio creatives are supported
- Direct PMP deals — Trillboards' large-buyer team negotiates reserved deals for specific venue categories or audience segments
The full demand topology with per-partner integration depth (real-time vs batch, audience-signal pass-through support, viewability measurement) lives at /data/demand-ecosystem/integration-depth/. Latency benchmarks are at /data/demand-ecosystem/latency-benchmarks/.
Audience targeting via IAB AT 1.1 + Trillboards segtax=600
Programmatic DOOH targeting hits two namespaces simultaneously:
IAB Audience Taxonomy 1.1 (segtax=4) — the industry-standard segment library covering demographics, interests, purchase intent, and shopper behavior. The full set is at /data/audiences/iab/ with one page per segment. Notable high-volume segments observed across the Trillboards network:
- Pets (IAB 690) — cross-references the pet-store venue category and veterinary clinics
- Auto Intender (IAB 688) — cross-references auto-repair shops, oil change shops, and gas stations
- Sports Fans (IAB 686) — cross-references bars and restaurants
- Foodies (IAB 692) — cross-references coffee shops and restaurants
Trillboards segtax=600 — the Trillboards-specific namespace covering CV-unique signals that have no IAB equivalent. The /data/audiences/attributes/ catalog covers:
- audience_group_composition (solo / pair / small_group / mixed_group / family_unit / coworkers)
- audience_intent_stage (awareness / consideration / decision / post_purchase / unknown)
- audience_attire_archetype (business / casual / athleisure / formal / uniform / streetwear / outdoor)
- audience_activity_macro (commuting / dining / shopping / leisure / waiting / working / transit)
DSPs that understand both namespaces can target with double-precision — "family units at pet stores in California during weekend mornings" is a single segment + venue + daypart + geo predicate, expressed as five OpenRTB fields in the bid request.
Latency benchmarks and partner SLAs
Trillboards SSP latency benchmarks (live data at /data/demand-ecosystem/latency-benchmarks/):
- Auth + venue resolution: median 4 ms, p99 12 ms
- Demand partner fanout: median 65 ms, p99 95 ms
- Bid resolution: median 8 ms, p99 15 ms
- End-to-end (device-to-creative-URL): median 78 ms, p99 102 ms
Per-partner latency varies. The fastest demand sources clear in under 40 ms; the slowest (typically programmatic guaranteed deals with multi-hop callouts) approach the 90 ms hard timeout. Partners exceeding budget consistently are rate-limited and deprioritized.
Viewability + attention measurement
Trillboards supports OMID-compliant viewability measurement wherever the creative declares OMID support. The viewability signal carries the percentage of the screen the creative occupied + the seconds visible.
Attention measurement is an on-device computation. The CV pipeline runs a gaze + head-pose composite at 5-second intervals while the creative plays. The signal is one of {low, medium, high} — calibrated against human-labeled ground truth. Attention-weighted impressions clear at a premium because the addressable attention is the same metric Meta and TTD optimize against on web.
Full measurement architecture is documented at /support/developers/ctv-measurement/ and /support/developers/proof-of-play/.
Brand-safety enforcement at three layers
-
Pre-bid filter — the SSP attaches
bcat(blocked IAB content categories) andbadv(blocked advertiser domains) to every bid request. Demand partners that bid creative violating those filters get the bid dropped before play. Default network-level filters block political, gambling, alcohol, adult, hate speech, and competing network operators. -
Per-venue category controls — venue operators choose which IAB content categories their screens accept. A coffee shop near a school can block QSR, alcohol, and auto with one click. A bar can opt into alcohol but block competitor brands.
-
Pixel-level CV scan — every creative gets a CV pass before it plays, catching metadata-mismatched ads (a 'sports' tagged creative that's actually beer-related, for example). Mismatched creatives are skipped + flagged + reported back to the demand partner.
The full brand-safety workflow lives at /data/demand-ecosystem/brand-safety-workflow/.
Venue-category lift on cleared CPMs
Beyond audience targeting, the venue itself contributes to the cleared CPM. Demand partners weight the venue's foot-traffic demographic, the expected dwell, and the brand-safety configuration when bidding. The venue catalog breaks down every category — here are the strongest CPM profiles on the network:
- Bars and sports bars — evening peak, extended dwell, food+beverage demand
- Restaurants — similar profile, broader daypart mix
- Coffee shops — daytime peak, premium demographics, brief-to-medium dwell
- Hair salons and barbershops — extended dwell, captive audience, beauty + lifestyle demand
- Auto repair shops and oil change shops — extended dwell, automotive intender audience
- Hotel lobbies and airport lounges — premium demographics, travel + business demand
- Fitness centers and gyms — health-aligned audience, lifestyle demand
- Convenience stores and grocery stores — high foot traffic, CPG demand
- Pet stores and veterinary clinics — Pets-segment audience, premium category
- Movie theaters and bowling alleys — leisure audience, entertainment demand
Hardware coverage in the OpenRTB pipeline
The OpenRTB 2.6 client runs on the full Trillboards hardware catalog —
/data/hardware/ — including
Fire TV Stick 4K Max,
Fire TV Cube,
Android TV signage,
Samsung Tizen,
LG WebOS,
BrightSign players,
NVIDIA Shield TV,
Roku CTV, and
Chromecast with Google TV —
with identical bid-request semantics across all of them. The DSP sees
the same BidRequest shape regardless of which device class fired the
request.
Settlement and reconciliation
Every billable impression carries a signed proof-of-play receipt. The reconciliation pipeline runs daily:
- The Trillboards SSP compiles the daily impression count per partner from the receipt ledger.
- Each demand partner reports their own count via their reporting API.
- The reconciliation worker compares the two counts per (partner, day, venue_category) bucket.
- If the discrepancy is under 5%, the partner-reported number is taken as canonical (industry convention) and the payment is processed at month-end.
- If the discrepancy exceeds 5%, the period gets flagged for dispute resolution. Operators see both numbers in the earner dashboard.
The canonical record for billable impressions is the
completed_impressions table; the canonical record for settled revenue
is programmatic_earnings_daily. Both are PG-native, aggregate-only,
auditable end to end.
Related Trillboards data surfaces
- Demand ecosystem — DSPs, SSPs, exchanges, latency benchmarks, integration depth
- Venue catalog — every venue category with floor CPM, archetype, and city distribution
- IAB segment dictionary — IAB AT 1.1 segments cross-referenced with venue and city
- Trillboards attributes — segtax=600 attire / intent / activity / group composition
- Brand-safety categories — IAB content category controls
- Hardware catalog — device classes running the OpenRTB 2.6 client
- State of DOOH 2026 — annual research report on the DOOH market
- Programmatic DOOH 101 guide — plain-English explainer for non-technical readers