ChatGPT now knows what you do on other websites via ad collector OpenAI's ad measurement system sets a first-party cookie called __obi on the .openai.com domain that is sent back to OpenAI from advertiser websites running its measurement pixel, letting the company tie browsing and purchase activity on those sites to a user's ChatGPT account, according to an independent technical analysis that reproduced the mechanism on a phone and cross-checked 936 advertiser pixels across 1,029 hostnames. The __obi cookie is issued via an RS256 JWT from the /backend-api/bazaar/obi/sync-token endpoint, scoped to Domain=.openai.com with SameSite=none, Secure, HttpOnly and a one-year Max-Age, and is transmitted to bzr.openai.com even on the script load of the SDK. The same SDK scrapes identity from advertiser pages, with scraped identity outnumbering advertiser-supplied identity 685 events to 255 in observed traffic, and version 0.1.31 also collected names and geography before the scope was narrowed on 27 August. ChatGPT now knows what you do on other websites via ad collector OpenAI's ad collector at bzr.openai.com sets a cookie called obi , scoped to .openai.com . The value is while you are on ChatGPT and tied to your ChatGPT account. obi is then sent to OpenAI from ordinary websites you visit. Any company that buys ads on ChatGPT installs a small piece of OpenAI code https://developers.openai.com/ads/measurement-pixel?ref=buchodi.com on its own site, the same way retailers already install Meta and Google tracking code. Loading that code, sends obi to OpenAI along with data about the page you are browsing. This includes products you are searching for, articles you are reading, and purchase behaviors. The bottom line is that OpenAI can connect what you do on those sites to your ChatGPT account. I reproduced the full mechanism on my own phone, verified with two independent capture methods, and cross-checked against several months of observed traffic covering 936 distinct advertiser pixels across 1,029 hostnames. How it works Step 1. ChatGPT creates an identifier and signs it. On chatgpt.com , the client generates 16 random bytes and calls POST /backend-api/bazaar/obi/sync-token or /backend-anon/ when signed out . The backend returns an RS256 JWT: { "iss": "chatgpt-wadi", "aud": "bzr.openai.com", "purpose": "obi sync", "operation": "set", "consent decision": "analytics allowed", "consent policy version": "user granular consent v1", "sub": "«redacted: 64-hex account subject»", "subject type": "account user", "obi": "«redacted: 22-char identifier»", "exp": "«iat + 60s»" } sub is the account. obi is the identifier. The token binds them, is scoped to the collector, and expires in 60 seconds. bzr stands for bazaar , OpenAI's internal name for the ads platform; wadi is the issuing service. Step 2. The identifier becomes a cookie on OpenAI's domain. The client POSTs {"token": "«JWT»"} cross-site to bzr.openai.com/v1/obi/sync . The response: Set-Cookie: obi=«redacted»; Domain=.openai.com; HttpOnly; Max-Age=31536000; Path=/; SameSite=none; Secure SameSite=none with Secure is the configuration a cookie needs to be sent on cross-site requests. Max-Age is one year. The obi value in the JWT and the value in the cookie are identical. Step 3. Advertiser sites send it back. Three request classes go from an advertiser's page to OpenAI's hosts. On a phone with obi in the jar, all three carried it: | Request | Carried obi | Notes | |---|---|---| | GET bzrcdn.openai.com/sdk/oaiq.min.js | yes | the script load itself | | POST bzr.openai.com/v1/sdk/events with obref | yes | conversion events | | POST bzr.openai.com/v1/sdk/events , bare body | yes | the SDK's "no credentials" path | | GET bzrcdn.openai.com/pixel-config/… | no cookie header at all | control | The first row is particularly interesting. The pixel SDK has a code path that omits credentials, and it does not help: the browser attaches cookies to the