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.).
is a typed schema. The naming implies siblings (multi-advertiser, etc.). advertiser_brand.id is adacct_<32-hex> — a stable per-merchant account identifier.
is — 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.
. 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.
... continue reading