How a video ad actually gets to your screen.
Eight systems. One impression. Roughly three hundred milliseconds. Scroll to follow a single ad request through every hop — then drive your own auction in the sandbox.
- 8
- core players
- 10
- lifecycle steps
- 19
- failure modes
One request. Eight systems. Watch them talk.
The diagram on the left pins to the viewport. Each beat on the right advances it to the next message on the wire. Hover a payload to read the actual bytes.
- 01 · Setup
Player asks for an ad
A viewer hits play. The publisher's player fires a VAST tag at the ad server with page context and player size. The 250ms clock starts.
VAST ad requestGET https://ads.example/vast?iu=/news/video &sz=640x360 &gdfp_req=1 &ifa=8e8d-… &url=https://news.example/article-42 - 02 · Auction
Ad server hands off to the SSP
No direct-sold campaign wins, so the request is wrapped as OpenRTB and forwarded to an SSP for an open auction.
OpenRTB 2.6 BidRequest{ "id": "req-3a91", "imp": [{ "id": "1", "video": { "mimes": ["video/mp4"], "minduration": 6, "maxduration": 30 } }], "site": { "domain": "news.example", "cat": ["IAB12"] }, "device": { "ifa": "8e8d-…", "ua": "Mozilla/5.0" }, "tmax": 250 } - 03 · Auction
Exchange fans out to bidders
The exchange replicates the request to dozens of DSPs in parallel. Each has ~80ms to respond.
- 04 · Auction
DSP submits a bid
Winning DSP returns a price and inlined VAST. Other bidders are doing the same in parallel.
OpenRTB BidResponse{ "id": "req-3a91", "seatbid": [{ "bid": [{ "id": "b1", "impid": "1", "price": 14.20, "adm": "<VAST version=\"4.3\">…</VAST>", "crid": "aurora-15s" }] }] } - 05 · Auction
Exchange clears the auction
Bids are compared against floors and brand-safety rules. The winner clears at one cent above the runner-up.
- 06 · Render & Measure
VAST returns to the player
The winning VAST XML travels back. The player parses MediaFiles and picks the best bitrate for the connection.
VAST 4.3 InLine (excerpt)<VAST version="4.3"> <Ad><InLine> <Impression><![CDATA[https://t.example/imp?b=xy]]></Impression> <Creatives><Creative><Linear> <Duration>00:00:15</Duration> <MediaFiles> <MediaFile type="video/mp4" bitrate="2400"> https://cdn.example/aurora-15s.mp4 </MediaFile> </MediaFiles> </Linear></Creative></Creatives> </InLine></Ad> </VAST> - 07 · Render & Measure
CDN streams the creative
Bytes flow from a CDN edge near the user. Cache-hit ratio at this step is what keeps start times sub-second.
- 08 · Render & Measure
Beacons fire as it plays
Quartile pings and OMID viewability go out to tracking endpoints. This is what advertisers actually pay for.
Quartile beaconPOST https://t.example/q3?b=xy&ts=1714… X-OMID-Viewable: 1
Roughly one in seven requests doesn't make it.
Timeouts, malformed VAST, missing IFAs, slow stitchers, ads.txt drift. Each one mutates the message flow in a specific way. Pick a failure and replay it in the sandbox.
tmax timeout
DSP responds after the bid deadline; the bid is discarded.
Malformed VAST
Player receives invalid VAST XML and fires an error pixel.
ads.txt mismatch
Reseller not authorized in the publisher's ads.txt — bid rejected.
Now drive the auction yourself.
Pick a scenario, tune the knobs — floor, tmax, fill rate, pod size — and step through every message between players. Inject failures and watch the mock player react.
Drive a live auctionRead shallow. Drill in.
Every page has Overview · How it works · Under the hood tabs.
Players
Publishers, SSPs, DSPs, exchanges — who does what.
Standards
VAST, VMAP, OpenRTB, OMID — annotated samples.
Delivery models
Waterfall vs header bidding, CSAI vs SSAI.
Measurement
Viewability, IVT, attribution — what counts.
Learn mode
Flashcards, quiz, sequence, match — drill the lattice.
Glossary
Every acronym, one line each.