Mécanisme de création du cookie
Sur le domaine chatgpt.com, le client génère 16 octets aléatoires puis envoie un POST /backend-api/bazaar/obi/sync-token (ou /backend-anon/ lorsqu’il n’y a pas de connexion). Le serveur renvoie un JWT signé RS256 contenant les champs iss, aud, purpose, operation, consent_decision, sub (identifiant du compte) et obi (identifiant de suivi). Le jeton expire après 60 s.
{
"iss": "chatgpt-wadi",
"aud": "bzr.openai.com",
"purpose": "obi_sync",
"operation": "set",
"consent_decision": "analytics_allowed",
"sub": "…",
"obi": "…",
"exp": "iat+60s"
}Le client transmet alors le JWT à bzr.openai.com/v1/obi/sync. La réponse inclut l’en‑tête Set‑Cookie: __obi=…; Domain=.openai.com; HttpOnly; Max-Age=31536000; Path=/; SameSite=none; Secure, ce qui crée un cookie valable un an et autorisé en contexte cross‑site.
Propagation du cookie vers les sites publicitaires
Tout annonceur qui achète un pixel OpenAI intègre le script bzrcdn.openai.com/sdk/oaiq.min.js sur sa page. Lors du chargement du <script src>, le navigateur joint automatiquement le cookie __obi à la requête GET du SDK, avant que le code du SDK ne s’exécute. Ainsi, l’identifiant est transmis à OpenAI dès le premier appel réseau.
Le SDK envoie ensuite deux types de requêtes : un POST bzr.openai.com/v1/sdk/events avec un corps JSON contenant un champ obref, et un POST « no credentials » où le corps est vide. Dans les deux cas, le cookie __obi est présent.
Données collectées et traitement
Le SDK sépare les données en quatre sources : in (valeurs fournies par l’annonceur), fm (extraction de champs de formulaire), ht (texte rendu) et js (bus du gestionnaire de balises). Dans l’échantillon observé, 685 événements proviennent de fm contre 255 de in. Le bus du gestionnaire de balises fournit la majorité des adresses e‑mail en interceptant window.dataLayer.push et en lisant adobeDataLayer ou les couches GTM renommées.
Avant transmission, les champs e‑mail, téléphone, prénom et nom sont hachés SHA‑256. Les informations géographiques (pays, région, ville, code postal) restent en clair ; le code postal a été relevé 100 fois sur 28 sites. Les URL sont tronquées à l’origine et au chemin, sans chaîne de requête, mais les chemins peuvent contenir des termes sensibles (ex. : condition médicale, procédure de recouvrement).
Portée, contraintes et limites
Sur l’appareil de l’auteur, un même identifiant __obi a été envoyé depuis 12 sites commerciaux différents, incluant Chewy, Wayfair et Coursera, sous 13 ID de pixel distincts. Dans le trafic agrégé, 12 des 30 identifiants observés apparaissent sur plusieurs annonceurs, un identifiant étant présent sur dix sites. Le mécanisme fonctionne également pour les utilisateurs anonymes : 196 des 932 jetons décodés portent subject_type: anonymous et restent stables pendant au moins 27 jours.
Le cookie est classé « Analytics » dans la politique d’OpenAI, avec une durée d’un an. La politique sépare le consentement analytique (oai_consent_analytics) du consentement marketing (oai_consent_marketing), mais chaque jeton observé indique analytics_allowed. OpenAI n’a pas confirmé si le refus du marketing bloque la synchronisation.
Le suivi est limité aux navigateurs qui acceptent les cookies tiers : Chrome Android le supporte, Safari avec ITP bloque le cookie, et Chrome iOS, basé sur WebKit, le bloque également. Le client mobile de ChatGPT ne déclenche pas de synchronisation publicitaire.