e advertentieketen heeft schakels die niemand in de verklaring noemt
Tussen een app en 'een advertentie' zit een keten: een SSP in de app, een uitwisseling die de veiling houdt, en bidders die namens adverteerders bieden. Elke schakel is een aparte partij die data aanraakt. Verantwoordingsdocumenten noemen zelden de hele keten; wie alleen de eerste stap meet, ziet het topje. Uitpluizen wie er echt achter de biedstroom zit, is een eigen onderzoeksstap.
De schakels tussen de app en de advertentie¶
Tussen de app die je opent en de advertentie die verschijnt, zitten meer partijen dan er ooit in een privacyverklaring staan. De keten heeft een vaste vorm. In de app zit een SSP, een supply-side platform, dat de advertentieplek te koop aanbiedt. Die plek gaat naar een of meer exchanges, de beurzen die de veiling houden. Aan de andere kant staan bidders, ook wel DSP's genoemd, die namens adverteerders bieden. En daartussen zitten vaak nog resellers, tussenpartijen die dezelfde plek doorverkopen aan andere beurzen.
Elke schakel is een aparte partij die je data aanraakt. De SSP stelt het biedverzoek samen met je toestelkenmerken erin. De exchange zendt het uit naar de bieders. Elke reseller die de plek doorzet, ziet de stroom passeren. De verklaring van de app noemt er een paar. De keten telt er meer. Wie alleen de eerste stap meet, ziet het topje.
Waarom de verklaring de keten niet noemt¶
Er zijn twee nuchtere redenen, en geen ervan hoeft kwade opzet te zijn. De eerste is dat de uitgever zijn eigen keten vaak niet volledig kent. Hij sluit een contract met één SSP en die SSP regelt de rest. Wat er achter de eerste beurs gebeurt, ligt buiten zijn zicht en buiten zijn invloed. De tweede reden is dat het er domweg te veel zijn om op te sommen. Een plek kan via tien routes tegelijk worden aangeboden, en elke route heeft een eigen staart van doorverkopers.
Die onoverzichtelijkheid is een kenmerk van de markt, geen incident. Hoe langer de keten, hoe moeilijker het is om vast te stellen wie precies wat met je gegevens doet. Dat is juridisch een probleem, want de AVG eist dat een verwerkingsverantwoordelijke kan aantonen aan wie hij gegevens doorgeeft. Een keten die zichzelf niet kent, kan die verantwoording niet leveren.
Er speelt nog iets. Dezelfde plek wordt vaak via meerdere routes tegelijk aangeboden, een praktijk die supply path optimization heet. Een adverteerder ziet dan hetzelfde biedverzoek langs drie of vier paden binnenkomen en kiest de goedkoopste. Voor jou betekent het dat je kenmerken langs elk van die paden lopen, met bij elke stap een extra partij die de stroom aanraakt. De keten vertakt zich dus, en de vertakkingen staan nergens in een verklaring omdat de uitgever ze zelf niet aanstuurt. Het is de SSP die bepaalt via welke beurzen hij verkoopt, en de beurs die bepaalt aan welke resellers hij doorzet.
De keten is publiek gedeeltelijk gedocumenteerd¶
Het mooie is dat de sector zichzelf een paar openbare bestanden heeft opgelegd, juist om fraude in de keten tegen te gaan. Ik gebruik die bestanden om de keten terug te lopen. Ze zijn niet bedoeld voor privacyonderzoek, en ze zijn er wel bruikbaar voor.
- ads.txt en zijn mobiele variant app-ads.txt. Een tekstbestand dat een uitgever op zijn eigen domein zet. Elke regel verklaart een verkooprelatie: welke beurs mag deze uitgever verkopen, onder welk account-id, en of dat rechtstreeks is (
DIRECT) of via een doorverkoper (RESELLER). - sellers.json. Een bestand dat elke beurs zelf publiceert. Het koppelt de account-id's uit ads.txt aan echte bedrijfsnamen en domeinen, en het zegt of een verkoper een uitgever is (
PUBLISHER), een tussenpartij (INTERMEDIARY) of allebei (BOTH). - De supply chain-object,
schain, in het OpenRTB-biedverzoek zelf. Dat is een lijst van knopen die de route beschrijft die het biedverzoek al heeft afgelegd. Elke knoop draagt eenasi(het advertentiesysteem) en eensid(de verkoper-id op dat systeem).
Een ads.txt-regel ziet er zo uit:
exchange-voorbeeld.com, 12345, DIRECT, f08c47fec0942fa0
reseller-voorbeeld.com, 98765, RESELLER, a1b2c3d4e5f6De eerste regel is een rechtstreekse verkoop, de tweede loopt via een doorverkoper. Dat woord RESELLER is het spoor. Het zegt dat er achter deze beurs nog een schakel zit.
Hoe ik de keten terugloop¶
Ik begin bij het biedverkeer dat ik heb vastgelegd, en ik trek de keten omhoog via de openbare bestanden. De procedure is stug maar simpel:
1. Uit het biedverzoek haal ik welke exchanges de plek aanboden, en indien aanwezig het schain-object met de route.
2. Ik haal het app-ads.txt van de uitgever op en lees welke beurzen en resellers hij declareert.
3. Voor elke beurs haal ik het sellers.json op en zoek de account-id op, zodat ik de echte bedrijfsnaam achter een id te pakken krijg.
4. Waar een regel RESELLER zegt, herhaal ik de stap voor die doorverkoper. Zo klim ik schakel voor schakel omhoog.
Een fragment dat de resellers uit een ads.txt-bestand vist:
import requests
tekst = requests.get("https://voorbeeld.app/app-ads.txt").text
resellers = []
for regel in tekst.splitlines():
regel = regel.split("#")[0].strip() # commentaar weg
if not regel:
continue
velden = [v.strip() for v in regel.split(",")]
if len(velden) >= 3 and velden[2].upper() == "RESELLER":
resellers.append((velden[0], velden[1])) # (beursdomein, account-id)
for beurs, acct in resellers:
print("doorverkoop via", beurs, "onder account", acct)Elke regel die dit oplevert, is een partij die de nette samenvatting van de app niet noemt. Door de sellers.json van elke beurs erbij te pakken, zet ik de account-id's om in namen, en dan heb ik een lijst van bedrijven die in de keten zitten zonder ergens in een verklaring te staan. Het is precies dat verschil, tussen wat wordt genoemd en wat er werkelijk in de keten zit, waar de bevinding ligt.
Wat dit voor mijn werk betekent¶
Uitpluizen wie er echt achter de biedstroom zit, is een eigen onderzoeksstap, los van het meten van de app zelf. De meeste rapporten slaan die stap over, want hij is bewerkelijk en hij vraagt geduld. Juist daarom levert hij iets op wat een gewone scan niet heeft: een naam en een land achter een account-id dat verder nergens opduikt. Dat een biedstroom een buitenlandse veiling in kan lopen, werk ik uit in Een biedstroom kan een veiling ingaan waar buitenlandse partijen op meebieden, en dat begint precies bij het terugvinden van deze schakels. De veiling zelf, het moment waarop de stroom uitwaaiert, staat in Real-time bidding biedt jouw toestel in een veiling aan, in milliseconden. De les is telkens dezelfde. De nette samenvatting toont het topje. De openbare registers laten de rest van de ijsberg zien, als je de moeite neemt ze te lezen.
Zie ook Real-time bidding biedt jouw toestel in een veiling aan, in milliseconden, Een biedstroom kan een veiling ingaan waar buitenlandse partijen op meebieden en Label elke bevinding op bewijsniveau.
- IAB Tech Lab, "ads.txt" en "sellers.json" specificatiesde openbare bestanden waarmee schakels in de keten zijn na te lopen