How ChatGPT serves ads

· privacy web · Source ↗

TLDR

  • OpenAI injects single_advertiser_ad_unit objects into ChatGPT’s SSE stream and closes the attribution loop via the OAIQ merchant SDK and Fernet-encrypted click tokens.

Key Takeaways

  • Ad units arrive as typed SSE events on chatgpt.com/backend-api/f/conversation, structurally separate from model output, carrying advertiser_brand, carousel_cards, and four Fernet tokens per unit.
  • Attribution uses four encrypted blobs: ads_spam_integrity_payload (server-side anti-fraud), oppref (forward attribution, 30-day cookie), olref (impression logging), and ad_data_token (SSE-to-click reconciliation).
  • The merchant-side SDK oaiq.min.js (v0.1.3) loads from bzrcdn.openai.com, reads ?oppref= from the landing URL, writes __oppref and __oaiq_domain_probe cookies, and POSTs conversion events to bzr.openai.com/v1/sdk/events.
  • Targeting is contextual per conversation: six topics across one test account yielded six different advertisers including Grubhub, GetYourGuide, Axel, Gametime, Aritzia, and Canva.
  • Fernet’s first nine bytes expose the token mint timestamp without OpenAI’s key; a captured Home Depot click showed 95 seconds between token minting and browser fetch.

Hacker News Comment Review

  • Consensus view: because ad units arrive as distinct SSE event types rather than embedded in model text, they are trivially blockable today – commenters flagged bzrcdn.openai.com and bzr.openai.com as the two domains to filter.
  • The deeper concern raised is not the current display-ad format but the future risk of adversarial content shaping model outputs through training data or fine-tuning, which this architecture does not protect against.
  • Sam Altman’s 2024 statement calling ads a “last resort” surfaced repeatedly; commenters read the launch as a signal of cash pressure rather than a planned product evolution.

Notable Comments

  • @mvvl: “Ads don’t influence responses” – arrives in the same payload, four attribution layers, “politely pretend to be coincidences.”
  • @torben-friis: Flags adversarial content injection into model weights as the unsolved version of this problem – SEO spam is the analogue.
  • @Aurornis: Clarifies ads are scoped to the free tier and the $8/month Go plan, not paid subscriptions – a detail the article does not specify.

Original | Discuss on HN