ChatGPT投放广告。以下是完整的归因循环。
How ChatGPT serves ads

原始链接: https://www.buchodi.com/how-chatgpt-serves-ads-heres-the-full-attribution-loop/

## OpenAI 的 ChatGPT 广告平台:摘要 OpenAI 的新广告平台将广告直接整合到 ChatGPT 对话中。广告以结构化数据(“single_advertiser_ad_unit”)的形式传递,位于标准的 SSE 流中,显示为包含品牌信息和链接的轮播图。OpenAI 托管广告素材本身。 广告选择似乎是由当前对话主题驱动的——例如,关于北京的聊天可能会触发中国美食外卖或旅游的广告。 至关重要的是,追踪依赖于每个广告的四个 Fernet 加密令牌,用于安全和归因。这些令牌通过浏览器 SDK(“OAIQ”)促进从点击到商家网站的追踪,该 SDK 将产品浏览量报告回 OpenAI,并设置一个长期存在的 cookie (`__oppref`)。 该系统允许 OpenAI 观察在其应用内浏览器中的点击后导航,补充传统的像素追踪。令牌时间戳是公开可恢复的,在观察到的案例中,显示点击到加载的延迟高达 95 秒。 阻止广告事件的关键域名是 `bzrcdn.openai.com` 和 `bzr.openai.com`,相关的 cookie 包括 `__oppref` 和 `__oaiq_domain_probe`。

## ChatGPT 现在开始投放广告,引发用户担忧 最近的 Hacker News 讨论指出,OpenAI 的 ChatGPT 现在开始显示广告。用户对这一发展表示不满,担心这标志着平台质量开始下降——一些人称之为“劣质化”。 担忧范围从广告可能侵入式地直接整合到回复中(需要观看广告才能获得增强功能),到对服务发展方向的普遍失望。 讨论也转向了本地托管的大型语言模型 (LLM) 作为替代方案的可行性日益提高。虽然托管模型目前在实时互联网访问方面仍具有优势,但用户指出本地模型正在迅速改进,并且也可以利用工具访问外部信息。对话涉及运行强大的本地 LLM 的硬件要求,其中 VRAM 是一个关键因素。
相关文章

原文

OpenAI's ad platform has two halves. On the ChatGPT side, the backend injects structured single_advertiser_ad_unit objects into the conversation SSE stream while the model is responding. On the merchant side, a tracking SDK called OAIQ runs in the visitor's browser and reports product views back to OpenAI. The two are tied together by Fernet-encrypted click tokens, four of them per ad.

I captured both halves on a consented mobile-traffic research fleet. Everything below comes from observed traffic.

How an ad gets into a conversation

When you send a message to ChatGPT, the backend opens an SSE response at chatgpt.com/backend-api/f/conversation. Most events in that stream are model-output. Some are ad units. They look like this:

event: delta
data: {
  "type":           "single_advertiser_ad_unit",
  "ads_request_id": "069e89b3-c038-7764-8000-6e5a193e5f69",
  "ads_spam_integrity_payload": "gAAAAABp6Js_<...redacted...>",
  "preamble":       "",
  "advertiser_brand": {
    "name":        "Grubhub",
    "url":         "www.grubhub.com",
    "favicon_url": "https://bzrcdn.openai.com/cabfae7ead26b03d.png",
    "id":          "adacct_6984ed0ba55481a29894bb192f7773b4"
  },
  "carousel_cards": [{
    "title":     "Get Chinese Food Delivered",
    "body":      "Satisfy Your Cravings with Grubhub Delivery.",
    "image_url": "https://bzrcdn.openai.com/cabfae7ead26b03d.png",
    "target": {
      "type":  "url",
      "value": "https://www.grubhub.com/?utm_source=chatgptpilot&utm_medium=paid&utm_campaign=diner_gh_search_chatgpt_kw_traffic_nb_x_nat_x&utm_content=nbchinese&oppref=gAAAA<...>&olref=gAAAA<...>",
      "open_externally": false
    },
    "ad_data_token": "eyJwYXlsb2<...>"
  }]
}

Notes:

  • single_advertiser_ad_unit is a typed schema. The naming implies siblings (multi-advertiser, etc.).
  • advertiser_brand.id is adacct_<32-hex> — a stable per-merchant account identifier.
  • Brand favicon and ad image both load from bzrcdn.openai.com. OpenAI hosts the advertiser's creative, not the merchant.
  • target.open_externally: false opens the link in ChatGPT's in-app webview, so OpenAI observes the post-click navigation on top of any pixel signal.
  • Four Fernet tokens per ad: ads_spam_integrity_payload, oppref, olref, and a base64-wrapped ad_data_token. Each is AES-128-CBC under a server-only key with HMAC-SHA256 integrity.

How ads get selected

A single account in the panel received six different ads across six conversations on six different topics. The targeting is contextual to the chat:

Conversation topic Advertiser delivered
Beijing trip planning (Great Wall, Forbidden City) Grubhub — "Get Chinese Food Delivered"
Beijing tour bookings GetYourGuide — Great Wall tour, ad_id=beijing003
Beijing flights Axel — utm_term=vflight_beijing_03
NBA playoffs Gametime — utm_campaign=nba&utm_content=playoffs
Spring fashion/trends Aritzia — utm_campaign=chatgptpilot_trav3
Productivity / slides Canva — utm_campaign=…link-clicks_products

Same account, different topic, different brand. I didn't find evidence one way or the other on whether targeting also incorporates prior conversation history.

The four-token attribution chain

Every ad ships with four distinct Fernet-encrypted blobs. Their roles, based on where they appear:

  1. ads_spam_integrity_payload sent inside the SSE data, never on the click URL. Server-side integrity check against forged ad clicks.
  2. oppref present on the click URL and copied verbatim by the OAIQ pixel into the cookie __oppref (TTL 720 hours / 30 days). The forward attribution token. Travels with every subsequent merchant pixel event.
  3. olref paired with oppref on the click URL but not stored by the SDK we observed. Likely impression-side / outbound-link-reference logging on OpenAI's servers.
  4. ad_data_token base64-wrapped JSON containing yet another Fernet token. Carried in the SSE payload, presumably reconciled server-side at click time.

Fernet's first nine bytes are public: version byte 0x80 plus an 8-byte big-endian Unix timestamp. So the mint time of any of these tokens is recoverable without OpenAI's key:

import base64, struct, datetime
b = base64.urlsafe_b64decode("gAAAAABp7fdA" + "==")
print(datetime.datetime.utcfromtimestamp(struct.unpack(">Q", b[1:9])[0]))
# → 2026-04-26 11:30:08 UTC

The Home Depot click URL I captured was minted at 11:30:08; the browser fetched the merchant page at 11:31:43. Click latency: 95 seconds.

How the loop closes on the merchant side

User taps the card. Browser opens:

https://www.grubhub.com/?utm_source=chatgptpilot&...
                       &oppref=gAAAA<...>
                       &olref=gAAAA<...>

The merchant page loads the OAIQ SDK:

<script src="https://bzrcdn.openai.com/sdk/oaiq.min.js"></script>
<script>
  oaiq('init',    { pid: '<merchant pixel ID>' });
  oaiq('measure', 'contents_viewed', { ... });
</script>

oaiq.min.js is at version 0.1.3. On init it reads ?oppref= from window.location, writes it into the first-party cookie __oppref with a 720-hour TTL, and sets a probe cookie __oaiq_domain_probe. Every subsequent measure call POSTs JSON to:

POST https://bzr.openai.com/v1/sdk/events?pid=<merchant>&st=oaiq-web&sv=0.1.3
Two domains to add to your filter list if you want to block ChatGPT ad events: bzrcdn.openai.combzr.openai.com. Two cookie names to inspect after any ChatGPT-recommended click: __oppref__oaiq_domain_probe.
联系我们 contact @ memedata.com