How to capture ChatGPT
fan-out queries
When ChatGPT searches the web it does not search for what you asked. It rewrites your question into a handful of narrower queries and searches for those instead. Here is how to see them: the hard way with code, and the short way with Moose.
OpenAI exposed 12 distinct ChatGPT fan-out queries for this prompt.
best AI security platforms for SMB
- best AI security platforms SMB 2026 endpoint email cloud managed detection small business
- Gartner market guide SMB cybersecurity platforms AI 2026
- small business cybersecurity platform AI features official pricing MDR email security official
- site:microsoft.com Defender for Business official SMB endpoint protection
- site:huntress.com managed EDR small business official
- site:sentinelone.com Singularity Core small business official
- site:sophos.com Intercept X small business official
- site:crowdstrike.com Falcon Go small business official pricing
- site:bitdefender.com GravityZone Small Business Security official pricing
- site:todyl.com managed security platform SMB official
- best MDR for small business 2026 independent comparison review
- SMB email security AI phishing protection official pricing 2026
Chief desk supervisor. Not involved in the capture, but the product is named after him, so he gets a photo on every page.
What is a ChatGPT fan-out query?
A fan-out query is one of the several search queries ChatGPT writes for itself when it decides to search the web. You type one question. Before it answers, the model rewrites your question into a set of narrower, more specific searches, runs all of them, reads what comes back, and synthesises a single answer.
The searches it wrote are the fan-out queries. They are not what you typed, and they are not visible in the answer. They are the queries your pages actually have to win.
How to capture fan-out queries with code
There is no public API for this. The only way to see the queries yourself is to drive a real, logged-in browser and read the search tool calls out of the response stream as they go by. Here is a working starting point, and an honest list of what will break.
# fanout.py · read ChatGPT's own search calls off the wire import asyncio, json from playwright.async_api import async_playwright PROMPT = "best AI security platforms for SMB" found = set() def harvest(evt): msg = evt.get("message") or {} # the fan-out queries ride inside the search tool call if msg.get("author", {}).get("name") != "web": return for part in msg.get("content", {}).get("parts", []): if isinstance(part, str) and part.startswith('search("'): found.add(part[8:-2]) async def main(): async with async_playwright() as pw: # a real logged-in profile. clean headless gets challenged. ctx = await pw.chromium.launch_persistent_context( "~/.chatgpt-profile", headless=False) page = await ctx.new_page() async def on_response(res): if "/backend-api/conversation" not in res.url: return body = await res.text() # SSE, not JSON for line in body.splitlines(): if line.startswith("data: "): try: harvest(json.loads(line[6:])) except ValueError: pass page.on("response", on_response) await page.goto("https://chatgpt.com/?search=1") await page.fill("#prompt-textarea", PROMPT) await page.keyboard.press("Enter") await page.wait_for_timeout(45_000) # no "done" signal print(json.dumps(sorted(found), indent=2)) asyncio.run(main())
// fanout.mjs · same idea, node + playwright import { chromium } from 'playwright'; const PROMPT = 'best AI security platforms for SMB'; const found = new Set(); // headless gets challenged, so this opens a real window const ctx = await chromium.launchPersistentContext( './chatgpt-profile', { headless: false }); const page = await ctx.newPage(); page.on('response', async (res) => { if (!res.url().includes('/backend-api/conversation')) return; const body = await res.text().catch(() => ''); // SSE for (const line of body.split('\n')) { if (!line.startsWith('data: ')) continue; let evt; try { evt = JSON.parse(line.slice(6)); } catch { continue; } const msg = evt?.message; if (msg?.author?.name !== 'web') continue; for (const p of msg?.content?.parts ?? []) { if (typeof p === 'string' && p.startsWith('search("')) found.add(p.slice(8, -2)); } } }); await page.goto('https://chatgpt.com/?search=1'); await page.fill('#prompt-textarea', PROMPT); await page.keyboard.press('Enter'); await page.waitForTimeout(45_000); // no "done" signal console.log([...found].sort());
A clean headless context gets challenged. You end up running a visible Chromium with your own session in it, and babysitting it.
The author name, the parts array, the search("...") wrapper: none of it is a contract. It has changed before and it will change again, quietly.
If the model answers from memory there is no fan-out at all, and nothing tells you that is what happened. You just get an empty set.
No schedule, no dedupe across runs, no diff against last week. Capturing once is easy. Capturing repeatedly and noticing what moved is the actual work.
Automating a logged-in ChatGPT session is a decision you make about your own account. We are not going to tell you it is fine.
Or you ask, and it is done in three moves
Same capture, same source, none of the browser babysitting. Moose keeps every run, so you can compare this week's query set against last week's.
Type "capture ChatGPT fan-out queries". No workflow to configure, no endpoint to look up.
Any question a buyer would actually type. Moose runs it and captures the search calls that come back.
The queries land in your library, exportable, and ready to feed a brief or a coverage check.
This one is not available on BYOK Free or BYOK. The capture has to come straight from OpenAI, and routed access through OpenRouter does not expose ChatGPT's internal search queries at all. If you are on a key-based plan, everything else in Moose still works. This one feature does not.
The twelve queries, in full
Captured for the prompt best AI security platforms for SMB. Read the site: lines closely. That is the model naming the brands it already trusts to have an official answer.
A captured fan-out is a content brief the engine wrote for you
Those twelve searches, not the original question, decide which pages get pulled and read. Optimising for the prompt is optimising for something the retriever never saw.
When ChatGPT wants an official answer it goes straight to specific domains. If yours is not among them for your own category, that is the clearest gap signal you will get.
Pricing, comparison, official spec, independent review: the fan-out tells you which of those the engine wanted and could not find in one place.
The query set drifts as the model and the index change. Watching new queries appear is an early read on where the category is moving.
Questions people actually ask
Are fan-out queries the same as the citations ChatGPT shows?
No. Citations are the pages that survived. Fan-out queries are the searches that found them. Two very different things: the citation list tells you who won, the query list tells you what the contest was.
Do the queries change if I run the same prompt again?
Usually yes, a little. The core queries are stable, the long tail moves. That is exactly why one capture is a snapshot and repeated captures are a signal. Run the same prompt weekly and watch which queries appear and disappear.
Can I capture fan-out queries on the free plan?
Not this one. Fan-out capture needs a direct connection to OpenAI, and BYOK Free and BYOK both route through OpenRouter, which does not expose ChatGPT's internal search queries. It is a managed plan feature. Everything else in Moose, including instant visibility checks across five real AI search engines, runs on the free plan.
Will optimising for fan-out queries get me cited?
Nobody can promise that, and Moose will not either. What the queries give you is an honest reading of what the model went looking for. If none of your pages answer those searches, you are not in the running. If they do, you are at least eligible.
Do other answer engines fan out too?
Most of them do. Perplexity, Google AI Mode and Gemini all decompose a question before searching. What differs is how much of it they show you. Google is the other one worth capturing, and it works differently enough to have its own page.
More things to ask Moose
All use casesThe same question for the other engine. The searches Google writes for itself, and who it cites.
One question, five real engines, about a minute. Free on every plan.
A semantic index of every page, built and kept on your computer. Ask it what you cover.
Top-10 results, People Also Ask, the AI Overview and its sources, all cited in the brief.
Twelve AI crawlers checked individually, Bing index verified in a real browser.
Share drops past your threshold, Moose finds the page, prepares the fix, waits for you.
Stop guessing at the query
behind the answer.
Download Hi, Moose, open a chat, and ask. Free to install, free to run local visibility checks, no meter.