familiewapen Mick Beermickbeer.com

manuscript ·

beginselRTB, adtech en brokersbronnenverwant

Real-time bidding biedt jouw toestel in een veiling aan, in milliseconden

Bij real-time bidding stuurt een app een biedverzoek met kenmerken van je toestel en context (device-identifier, grofweg locatie, app, soms afgeleide interesses) naar een advertentie-uitwisseling. Tientallen partijen zien die request en bieden om jou een advertentie te tonen. Het punt is: de request zelf verspreidt je kenmerken naar alle deelnemers, ook de verliezers. Een advertentieplek is dus tientallen partijen die je profiel te zien kregen.

Wat er in die honderd milliseconden gebeurt

Je opent een app of een pagina. Voordat er iets op je scherm staat, meldt de uitgever dat er advertentieruimte vrij is. Dat bericht gaat naar een veilingplatform, een ad exchange, dat het in een fractie van een seconde doorstuurt naar tientallen partijen die mogen bieden. De hoogste bieder wint, de advertentie laadt. Het hele proces duurt ongeveer honderd milliseconden.

Die honderd milliseconden zijn geen toevallig getal. Ze staan in het biedverzoek zelf. Het protocol dat de meeste van deze veilingen aanstuurt heet OpenRTB, een open standaard van het IAB Tech Lab. In een OpenRTB-biedverzoek zit een veld tmax: de maximale tijd in milliseconden waarbinnen een bieder mag antwoorden. Wie te laat is, doet niet mee. De veiling is zo krap getimed omdat ze moet passen binnen de tijd die het laden van een pagina toch al kost.

Wat er precies de veiling in gaat

Het biedverzoek is een JSON-object. Het bevat veel meer dan de mededeling dat er een plek vrij is. Een sterk versimpeld voorbeeld, in de vorm die het protocol voorschrijft:

{
  "id": "8b3e...c1",
  "at": 1,
  "tmax": 120,
  "imp": [{ "id": "1", "banner": { "w": 320, "h": 50 } }],
  "app": { "bundle": "com.voorbeeld.app", "name": "Voorbeeld" },
  "device": {
    "ifa": "38400000-8cf0-11bd-b23e-10b96e40000d",
    "ua": "Mozilla/5.0 ...",
    "ip": "84.29.xx.xx",
    "geo": { "lat": 52.09, "lon": 5.11, "type": 2 },
    "make": "Apple", "model": "iPhone", "os": "iOS"
  },
  "user": { "id": "abc", "buyeruid": "xyz" }
}

Elk veld is een stukje van jou. ifa is je reclame-identifier, het toestelnummer dat adverteerders mogen gebruiken. geo is een geschatte locatie, soms uit je IP-adres afgeleid, soms nauwkeuriger. device beschrijft je toestel tot op het model. app.bundle verklapt in welke app je zit, en dus vaak iets over je situatie. user.buyeruid is de identifier die een koper eerder aan jou heeft gekoppeld. Dat de standaard deze velden kent, is gemeten: de OpenRTB-specificatie is openbaar en de veldnamen liggen vast. Welke velden een concrete app invult, is per app afgeleid uit het echte biedverkeer.

Verliezen kost niets, en dat is het hele punt

Hier zit de kern die de meeste mensen niet zien. Het biedverzoek wordt niet naar één koper gestuurd. Het wordt uitgezonden naar iedere partij die op dat veilingplatform mag meebieden. Tientallen bedrijven ontvangen dus dezelfde JSON met jouw kenmerken erin. Precies één van hen wint. De rest verliest de veiling en houdt de data.

Een partij hoeft de plek niet te winnen om je gegevens te ontvangen. Meebieden mogen is genoeg. Verliezen kost niets en levert wel een compleet profielsignaal op: identifier, grove locatie, toestel, app, tijdstip. Dat is de reden dat deze markt zo aantrekkelijk is voor bedrijven die in gegevens handelen. Ze kunnen structureel biedingen uitbrengen die net te laag zijn om te winnen, en toch de hele stroom binnenhalen. Dat gedrag heeft in de sector een naam: bid stream data harvesting. Dat het technisch mogelijk is, volgt rechtstreeks uit hoe het protocol uitzendt, en is dus afgeleid. Hoe vaak een specifieke partij het doet, is zonder inzage in hun systemen vermoed.

Eén advertentieplek op je scherm staat dus gelijk aan tientallen partijen die je profiel te zien kregen. Dat is een andere rekensom dan wat een privacyverklaring suggereert, waar één plek meestal klinkt als één adverteerder.

Waarom dit juridisch zwaar weegt

Onder de AVG is een reclame-identifier een persoonsgegeven, want hij maakt je herkenbaar. Het uitzenden van dat gegeven naar tientallen ontvangers is een verwerking, en elke ontvanger is een eigen verwerkingsverantwoordelijke of ontvanger in de zin van de wet. De rechtsgrond voor die verspreiding is vrijwel altijd toestemming, geregeld via het IAB TCF, het Transparency and Consent Framework. Dat framework codeert jouw keuzes in een consent string die met het biedverzoek meereist.

Het probleem is dat de toestemming die je geeft, zelden dekt wat er feitelijk gebeurt. Je stemt in met een lijst partners die je op een muur te zien kreeg, terwijl de biedstroom naar meer partijen gaat dan op die muur stond. Dat verschil werk ik uit in De cookiemuur toont minder partners dan de code telt. En de keten achter de exchange, de doorverkopers en tussenpartijen, staat helemaal niet in enige verklaring, zoals ik laat zien in De advertentieketen heeft schakels die niemand in de verklaring noemt. De Belgische toezichthouder heeft in 2022 geoordeeld dat het TCF zoals het toen werkte in strijd was met de AVG, onder meer omdat de consent string zelf een persoonsgegeven is dat zonder geldige grond werd verspreid. Dat oordeel is gemeten feit, openbaar gepubliceerd.

Hoe ik dit in mijn eigen werk aantoon

Ik meet dit door het echte netwerkverkeer van een app of site vast te leggen en de biedverzoeken eruit te vissen. Een biedverzoek herken je aan de structuur: een POST naar een exchange-endpoint met een JSON-body die de OpenRTB-velden draagt. In een opgeslagen HAR-bestand of een onderschepte stroom filter ik op de veldnamen die de standaard voorschrijft.

import json, glob

VELDEN = {"imp", "device", "at", "tmax"}  # OpenRTB-signatuur

for pad in glob.glob("verkeer/*.json"):
    body = json.load(open(pad))
    if VELDEN.issubset(body.keys()):
        dev = body.get("device", {})
        print(pad, "->", dev.get("ifa"), dev.get("geo"))

Dit vertelt me twee dingen. Ten eerste of de app überhaupt aan real-time bidding doet. Ten tweede welke van mijn kenmerken de veiling in gaan. Wat het niet vertelt, is wie er allemaal aan de andere kant meeluistert. Dat zie ik niet, want de uitzending gebeurt op het veilingplatform, buiten mijn zicht. Ik kan wel het vertrek meten, ik kan de volledige ontvangerslijst niet meten. Die grens benoem ik expliciet, in lijn met Label elke bevinding op bewijsniveau. De techniek van het lezen zelf beschrijf ik in Netwerkverkeer lezen via HAR-files.

Wat ik ervan vind

De veilingmetafoor is eerlijker dan het woord "advertentie" doet vermoeden. Bij een advertentie denk je aan één boodschap van één merk. Bij een veiling wordt je toestel als kavel aangeboden aan een zaal vol partijen, en de zaal ziet de kavelbeschrijving voordat er geboden wordt. Dat de verliezers je gegevens houden, is het detail dat het systeem kantelt van reclame naar datahandel. Ik vind dat je dat detail hard mag maken voordat je er een oordeel aan hangt. Daarom meet ik het vertrek nauwkeurig en houd ik me in over de ontvangst, waar ik geen zicht op heb. Het mechanisme staat vast. De omvang bij een concrete app is een aparte meting, elke keer opnieuw.

Zie ook Een biedstroom kan een veiling ingaan waar buitenlandse partijen op meebieden, Onverwante apps sturen je profiel dezelfde veiling in en Het risico zit in de optelsom, niet in het losse veld.

bronnen
  1. IAB Tech Lab, "OpenRTB API Specification"de velden die in een biedverzoek meegaan, waaronder toestel, locatie en identifiers
  2. Johnny Ryan, ICCL, rapporten over de omvang van RTB in Europade schaal: het aantal biedverzoeken per persoon per dag
citeer alsBeer, M. (2026, 9 juli). Real-time bidding biedt jouw toestel in een veiling aan, in milliseconden. mickbeer.com. https://mickbeer.com/#real-time-bidding-biedt-jouw-toestel-in-een-veiling-aan-in-milliseconden

lees dit stuk in het manuscript, met alles waar het aan hangt