
2026/04/29 8:54
ChatGPT も広告を表示しています。以下がその全体的な帰属循環のプロセスです。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
OpenAI は、ChatGPT に独自の広告システムを直接統合し、SSE ストリームに
single_advertiser_ad_unit オブジェクトを注入し、クリエイティブ資産を独自ドメインである bzrcdn.openai.com 上にホストしています。ブラウザには OAIQ v0.1.3 という追跡用 SDK が実行されており、製品の閲覧情報を OpenAI のサーバーへ報告しています。このシステムは Fernet 暗号化されたトークン(例:ads_spam_integrity_payload, oppref, olref, ad_data_token)を使用しており、これらは公衆向けのヘッダーバイトを 9 文字含み、トークンの発行時刻の復元を可能にしています(例:2026 年 4 月 26 日)。クリックされたリンクは外部ではなく ChatGPT の内部ウェブビュー内(open_externally: false)で開かれるため、OpenAI はクリック後のナビゲーションを観察できます。アトリビューションチェーンには、720 時間の有効期限を持つファーストパーティcookieに格納されるフォワードトークン(__oppref)と、impression ログを記録する olref が使用されます。コンテキストターゲティングは、北京旅行、フライト、NBA など 6 つの異なる会話トピックで確認されています。広告出稿元には Grubhub や GetYourGuide があります。追跡を軽減するには、ドメイン bzrcdn.openai.com と bzr.openai.com をフィルタリングし、cookie(例:__oppref, __oaiq_domain_probe)を確認する必要があります。本文
2026 年 4 月 28 日
OpenAI の広告プラットフォームは、大きく分けて 2 つの構成要素からなっています。ChatGPT 側の仕組みでは、会話中のモデル応答時にバックエンドが構造化された
single_advertiser_ad_unit オブジェクトを SSE(Server-Sent Events)ストリームに注入します。一方で商取引側では、訪問者のブラウザ内で OAIQ という追跡用 SDK が実行され、製品閲覧情報を OpenAI へ報告します。この両者は、各広告につき 4 つの Fernet エンコードされたクリックトークンを介して統合されています。以下の情報は、同意を得たモバイルトラフィックのリサーチフリートで観測したすべてのものであり、すべてが実際のトラフィックからの発見に基づいています。
チャット GPT(ChatGPT)にメッセージを送信すると、バックエンドは
chatgpt.com/backend-api/f/conversation で SSE 応答を開始します。そのストリームの大部分のイベントはモデルからの出力ですが、一部が広告ユニットです。それらの形式は以下の通りです:
event: delta data: { "type": "single_advertiser_ad_unit", "ads_request_id": "069e89b3-c038-7764-8000-6e5a193e5f69", "ads_spam_integrity_payload": "gAAAAABp6Js_<...省略された部分...>", "preamble": "", "advertiser_brand": { "name": "Grubhub", "url": "www.grubhub.com", "favicon_url": "https://bzrcdn.openai.com/cabfae7ead26b03d.png", "id": "adacct_6984ed0ba55481a29894bb192f7773b4" }, "carousel_cards": [{ "title": "中国料理を配達してもらう", "body": "Grubhub で配達を受け、ご満足ください", "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<...>" }] }
注釈:
は型付スキーマであり、名称から多Advertiser など兄弟構造も想定されます。single_advertiser_ad_unit
はadvertiser_brand.id
の形式で、各事業者向けに一意かつ安定したアカウント識別子です。adacct_<32_hex>- ブランドのファビコン画像と広告画像の両方が
から読み込まれます。OpenAI は事業者自体がホストするのではなく、広告クリエイティブを自らのインフラ上でホストしています。bzrcdn.openai.com
は、リンクをクリックしても ChatGPT のアプリ内 WebView で開かれるため、クイックナビゲーション後も OpenAI 側でクリック後の遷移を直接観測可能になっています。またピクセルシグナルも追加で取得できます。target.open_externally: false- 各広告には Fernet エンコードされたトークンが 4 つ付属します:
,ads_spam_integrity_payload
,oppref
、および base64 でラップされたolref
です。これらすべてはサーバー固有のキーを用いて AES-128-CBC で暗号化され、HMAC-SHA256 による完全性検証が施されています。ad_data_token
広告の選択プロセスについて パネル内の単一アカウントに対し、6 つの異なるトピックでの会話がそれぞれ 6 回行われ、そこに 6 種類以上の異なる広告が配信されました。ターゲティングは完全に会話文脈に基づいています:
| 会話のトピック | 配信された事業者 |
|---|---|
| 北京旅行計画(万里の長城・紫禁城など) | Grubhub — 「中国料理を配達してもらう」 |
| 北京観光ツアーの手配 | GetYourGuide — 万里の長城ツアー(ad_id=beijing003) |
| 北京へのフライト予約 | Axel — utm_term=vflight_beijing_03 |
| NBA プレーオフ | Gametime — utm_campaign=nba&utm_content=playoffs |
| スpring ファッション・トレンド | Aritzia — utm_campaign=chatgptpilot_trav3 |
| 生産性向上・スライド作成 | Canva — utm_campaign=…link-clicks_products |
同じアカウントで異なるトピック、そして異なるブランド。ただし、ターゲティングに過去の会話履歴が組み込まれているかどうかについては、明確な証拠は見つかりませんでした。
4 つのトークンによるアトリビューションチェーン
各広告は 4 つの異なる Fernet エンコードされたデータ塊とともに送信されます。それぞれは以下のように機能します(位置付けから判断):
: SSE データ内部に送られ、クリック URL には含まれません。サーバー側で偽造クリックからの完全性を検証するためのものでした。ads_spam_integrity_payload
: クリック URL に含まれ、OAIQ ピクセルによって完全に同じ値を保持したままクッキーoppref
(TTL:720 時間/30 日)に記録されます。これは「前方アトリビューショントークン」であり、その後の事業者側のピクセルイベントを通じてすべて移動します。__oppref
:olref
と共にクリック URL に含まれますが、観測された SDK では保存されていません。OpenAI サーバー側でのインプレッションサイド/アウトバウンドリンク参照ログの役割を持つと考えられます。oppref
: Base64 でラップされた JSON で、さらに Fernet エンコードされたトークンを内包しています。SSE ペイロードに持たされ、おそらくクリック時にサーバー上で照合されます。ad_data_token
Fernet の最初の 9 バイトは公開情報であり、バージョンバイト
0x80 に続く 8 バイトのビッグエンディアン形式的な Unix タイムスタンプが含まれます。したがって、これらのトークンの発券時刻を OpenAI のキーなしに復元することが可能です:
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
Home Depot のクリック URL をキャプチャした例では、トークンの発券時刻は 11:30:08、ブラウザが事業者ページを取得したのは 11:31:43 で、クリックレイテンシは 95 秒に相当しました。
商取引側でのループ閉鎖の仕組み
ユーザーがカードをタップすると、ブラウザは以下のような URL を開きます:
https://www.grubhub.com/?utm_source=chatgptpilot&...
&oppref=gAAAA<...>
&olref=gAAAA<...>
事業者ページは OAIQ SDK を読み込みます:
<script src="https://bzrcdn.openai.com/sdk/oaiq.min.js"></script> <script> oaiq('init', { pid: '<事業者のピクセル ID>' }); oaiq('measure', 'contents_viewed', { ... }); </script>
oaiq.min.js のバージョンは 0.1.3 です。初期化時に window.location から ?oppref= を読み取り、ファーストパーティクッキー __oppref(TTL:720 時間)に書き込み、探査用クッキー __oaiq_domain_probe を設定します。その後続する measure 呼び出しごとに JSON を以下へ POST 送信します:
POST https://bzr.openai.com/v1/sdk/events?pid=<事業者>&st=oaiq-web&sv=0.1.3
確認すべきドメインとクッキー:
- ChatGPT の広告イベントをブロックしたい場合、フィルタリストに加えるべきドメイン:
,bzrcdn.openai.combzr.openai.com - ChatGPT による推奨クリックの後に確認すべき 2 つのクッキー名:
,__oppref__oaiq_domain_probe