$ cd ~/ai-seo-research/chatgpt # updated 24 Jul 2026

ChatGPT

How ChatGPT retrieves and cites sources, read straight off the wire on my own logged-in sessions and kept current as it changes. The story so far is in part one and part two; this page is what is true now, plus every change since.

structural means a field or behaviour read straight off the wire; one clean capture proves it. directional means a frequency from a small, single-account sample: the shape, not the number. Read it on your own session with FanoutFox.

$ cat state # what is true now

The model line and the transport both moved in July. The per-source pipeline label that the first teardown was built on is no longer in the stored payload, and citations are now bound to the exact sentence they support.

  • Model routing structural

    The default is now the "auto" router, which silently picks the model. The line-up is GPT-5.3 and GPT-5.5 plus mini variants; reasoning runs on gpt-5-6-thinking with a "thinking effort" dial (an "extended" tier seen live).

  • Intent structural

    Every query is classified before any search runs (instant search, shopping, local, reasoning, image, or "text"). Text-class queries (how-to, definitions) never touch the web and are answered from training.

  • Retrieval pipelines structural

    The result_source label that tagged each source with the scraper that fetched it (serp, labrador, bright, oxylabs, bing) is gone from the stored payload. Retrieval now appears as domain-grouped results with object references, and no pipeline name attached.

  • Citations structural

    Each cited source is bound to the exact answer span it supports, by character offset, with a list of runner-up pages that backed the same claim and lost the visible slot.

  • Transport structural

    Ordinary search answers now stream over a persistent WebSocket opened at page load, not the request that sent the message. The window for reading this in DevTools is narrowing.

  • Scoring structural

    No numeric quality, authority or trust score for a web source appears anywhere in the traffic or the client config. Anyone selling reverse-engineered "ChatGPT ranking factors" is guessing.

  • What gets cited directional

    On commercial queries it leans on scraped review hubs and Reddit; YouTube is retrieved constantly and cited almost never. Facts come from your own page (in plain HTML text), the verdict comes from third-party reviews.

$ ls changelog # 6 entries

Every change I catch in the traffic, newest first.

structural

ChatGPT dropped the source-pipeline label the first teardown was built on

The result_source field that tagged every source with the scraper that fetched it is no longer in the stored payload. Citations are now bound to the exact sentence they support.

Why it matters for AI visibility

The lesson for AI visibility is to stop optimising toward ChatGPT's internal labels. That pipeline tag was always plumbing, not a ranking factor you could influence, and it is hidden now anyway. What gets you retrieved has not changed: be cleanly scrapable, and be the clearest match for the exact claim. Any audit that reported your "source pipeline" is now reading nothing on current traffic.

read the detail

In June, every web source ChatGPT pulled carried a result_source label naming the pipeline that fetched it: serp, labrador, bright, oxylabs, and later bing. That field was the centrepiece of the first teardown.

Re-read the traffic today, on the same account, and it is gone. A live commercial search retrieved 203 sources across 80 domain groups, with zero pipeline labels anywhere in the stored payload. The sources are still there, grouped by domain with object references, but the “which scraper fetched this” tag is no longer exposed.

What replaced it is sharper. Each cited source is now bound to the exact answer sentence it supports, by character offset (matched_text, start_idx, end_idx), alongside a list of runner-up pages that backed the same claim and lost the visible citation. So the engine no longer tells you how a page was fetched, but it now tells you the precise line each page won.

Read this as: any tool or claim that depended on the pipeline label is now reading nothing on current traffic.

structural

The "auto" router is now the default, and the model line-up moved

Model selection now defaults to a router that silently picks for you. Reasoning runs on gpt-5-6-thinking with a new "thinking effort" dial.

Why it matters for AI visibility

For anyone measuring AI visibility, this quietly breaks single-prompt testing. Whether ChatGPT searches the web at all, and how widely it looks, now rides on a model the router picks silently and can change between runs. The same question can be answered from training one time and from a live search the next, so read your brand's presence across repeated runs, never off a single answer.

read the detail

The model behind the “Instant” label used to be gpt-5-5. Today the default model slug is auto: the router that silently picks the model is now the default selection, not a hidden fallback.

From the model endpoint, the current line-up is gpt-5-3 (labelled “our latest and most advanced”), gpt-5-5, and mini variants of each, plus auto. Reasoning resolves to gpt-5-6-thinking, and it carries a new thinking_effort field. On a hard puzzle the router set that effort to "extended", so there are tiers of reasoning depth chosen for you per turn.

The practical consequence is the one from the original teardown, now sharper: your “Instant” benchmark is not stable, because the turn you think you are testing may be silently escalated to a reasoning model at an effort level you did not pick.

structural

Ordinary answers now stream over a persistent WebSocket

A plain search no longer streams its answer back on the request that sent it. It returns a handoff, and the answer arrives over a socket opened at page load.

read the detail

This one is why the source-pipeline finding took real work to confirm. A plain web-search turn’s request no longer returns the answer. It returns a small handoff (a token and a topic id), and the actual answer streams over a persistent WebSocket that opened when the page first loaded.

Previously this async pattern was reserved for the slow “Thinking” answers. Now it is the default path for ordinary search turns too. A pre-flight step mints a fresh transport token on every single turn.

Why it matters beyond plumbing: the readable layer for this kind of work has always been the browser network panel, after decryption. Moving the answer onto a socket opened before you can attach a listener makes it materially harder to watch a normal answer being built, unless you hook the page before it loads. The window is quietly closing, which is part of why a one-click tool that reads your own session, rather than a DevTools recipe, is now the realistic way in.

structural

The payload shape changed twice in two days

ChatGPT moved its stored retrieval format twice in 48 hours. The pipeline label started disappearing here, and source references changed shape.

read the detail

The clearest single demonstration that this is a moving target. Over 21 and 22 July, ChatGPT changed the shape of its stored retrieval payload twice.

First the flat per-source pipeline label began dropping out, and the runner-up pages moved onto the citation items instead. A day later the whole retrieval block moved again, nesting under a domain-grouped structure, and the source reference changed from a plain string into an object. Anything reading the old shape by a fixed path suddenly matched nothing and showed an empty result.

The lesson for anyone building on this: never read these payloads by a hard-coded path. Collect by the presence of a field, so a rename breaks one small thing instead of the whole read. This drift week is what set up the bigger change three days later, when the pipeline label vanished from the stored data entirely.

mixed

The runner-up layer filled in, and a fifth pipeline appeared for some accounts

A field that sat empty in June now lists, per fact, the pages that backed the same claim and lost the citation. A fifth source pipeline, Bing, showed up on some accounts and not others.

Why it matters for AI visibility

Two useful things for GEO here. The runner-up list means the wire now shows you, claim by claim, the exact page that beat you to a citation, which is competitor gap analysis you could not get any other way. And a cohort-gated pipeline means two people can ask the same thing and see different sources, so a visibility check from one account is never the full picture.

read the detail

Two findings from the follow-up sweep, covered in full in part 2 of the teardown.

The runner-up layer. A field that was empty in June is populated now. For each fact ChatGPT states, the traffic lists the other pages that backed the same claim and lost the visible citation, sometimes a sibling page on the winner’s own domain, sometimes a direct competitor. You can read, claim by claim, exactly who you lost a citation to. (structural)

A fifth pipeline, Bing, but cohort-gated. Someone was served pages through a bing pipeline that had never appeared in my own traffic. The same review page reached them through Bing and reached me through a commercial scraper, in the same week; a free account in a third country saw a third setup again. So the source pipelines are per-cohort plumbing, load-balanced across accounts, not a single global system. (structural that it exists; directional on who gets which)

This is also the finding that first proved you cannot build a tier theory off one account, a rule that only became more important as the whole pipeline label later disappeared.

mixed

ChatGPT tags every source with the scraper that fetched it

The original teardown. Every web source carried a hidden label naming one of four fetch pipelines, and a classifier decided which queries touched the web at all.

Why it matters for AI visibility

This is the foundation of the whole thing for AI visibility. ChatGPT's "open web" is served by commercial scrapers and a licensed set, so being cleanly and quickly scrapable is a genuine lever, and facts locked in JavaScript or images are invisible to the fetcher and therefore to the answer. The label naming the pipeline has since gone, but the mechanism it exposed still decides who gets pulled in.

read the detail

Where this all started, written up in full in the first teardown.

Reading the raw network traffic, every web source ChatGPT pulled carried a hidden result_source label naming one of four fetch pipelines: an open-web baseline, a licensed-content pipe, and two commercial web scrapers. ChatGPT’s “open web” was being fulfilled by competing scraping vendors, and the field told you which one served each result. (structural)

Before any search ran, a classifier filed the query into a use case, and that decided which pipelines fired. Some query types (how-to, definitions) never touched the web at all and were answered from training data. (structural)

And the directional half, from one account over a few days: on commercial queries a handful of review hubs dominated, Reddit was cited heavily while YouTube was retrieved and almost never cited, and for pricing the model opened the vendor’s own page and read the number straight from the HTML. (directional)

Almost every specific here has since changed, which is the whole reason this log exists.