How ChatGPT Search Selects & Cites Sources (2026 Guide)
How ChatGPT search finds and cites websites: what OpenAI documents (OAI-SearchBot, robots.txt), what it doesn't, what blocks sites, and how to track citations.
Quick answer: ChatGPT search can cite any public page its search crawler, OAI-SearchBot, is allowed to access. OpenAI documents the access rules but not its ranking. What you control is eligibility (allow OAI-SearchBot, serve content in the raw HTML, don't block it at your CDN) and quotability (clear, answer-first passages with specific facts). Blocking GPTBot only opts you out of model training; it doesn't remove you from ChatGPT search.
Plenty of articles claim to have "reverse-engineered" ChatGPT's citation algorithm. OpenAI hasn't published it, and claims of exact correlations should be read with that in mind. This guide separates what OpenAI documents, what can be measured from outside, and what's reasonable practice.
What OpenAI Documents
From OpenAI's crawler documentation, retrieved 8 October 2026:
| Crawler | What OpenAI says it's for | If you block it |
|---|---|---|
| OAI-SearchBot | "Used to surface websites in search results in ChatGPT's search features." | "Sites that are opted out of OAI-SearchBot will not be shown in ChatGPT search answers, though can still appear as navigational links." |
| ChatGPT-User | Visits a page "when users ask ChatGPT or a CustomGPT a question" | ChatGPT can't fetch the page on a user's behalf |
| GPTBot | Crawls "content that may be used in training our generative AI foundation models" | Opts out of training; separate from search |
Two practical details from the same page:
- Changes aren't instant: "it can take ~24 hours from a site's robots.txt update for our systems to adjust."
- The crawlers are independent: you can allow OAI-SearchBot (be cited) and disallow GPTBot (no training).
# robots.txt: appear in ChatGPT search, opt out of training
User-agent: OAI-SearchBot
Allow: /
User-agent: GPTBot
Disallow: /Our guide to blocking AI training while allowing AI search covers the equivalent rules for other providers.
What OpenAI Doesn't Document
OpenAI doesn't publish how ChatGPT ranks candidate pages, how many it considers, or how it weighs authority, freshness and relevance. Anything presented as the exact ChatGPT ranking formula is a hypothesis. Reasonable working assumptions, consistent with how retrieval systems generally work:
- A page must be fetched and parsed before it can be considered.
- Relevant passages are extracted, so a page with a clear, self-contained answer is easier to use than one where the answer is spread across sections.
- Specific, checkable facts (numbers, names, dates, steps) give a model something concrete to quote.
What Stops Pages From Being Cited: Data
Eligibility failures are measurable. From our study of 219 randomly sampled homepages (Tranco ranks 1,001–50,000), October 2026:
| Eligibility problem | Sites affected |
|---|---|
Didn't return 200 to a plain HTTP request (bot protection, mostly 403) | 15.1% |
| Blocked at least one AI search crawler in robots.txt | 6.4% |
| Blocked OAI-SearchBot specifically | 1.9% |
| Less than half the visible text in the raw HTML (needs JavaScript) | 26.9% (incl. unreachable) |
| No GPTBot rule at all in a readable robots.txt | 189 of 214 |
ChatGPT's crawlers don't execute JavaScript, according to Vercel's analysis of AI crawler traffic, so content that only appears after JavaScript runs is invisible to them. Full numbers: AI search readiness data study and do AI crawlers render JavaScript?
Note the bot-protection row: firewall rules that challenge non-browser clients block far more sites than robots.txt does, and they don't show up when you read your own robots.txt.
How to Make Pages Easy to Cite
| Practice | Why |
|---|---|
| Allow OAI-SearchBot in robots.txt and at your CDN/WAF | It's the documented requirement for appearing in ChatGPT search |
| Serve the content in the HTML (SSR or static) | ChatGPT's crawlers don't render JavaScript |
| Answer the question in the first 40–60 words under each key heading | Gives the model a self-contained passage to quote |
| Use specific facts: numbers, dates, named standards | Concrete claims are easier to cite than general advice |
| Use question-style headings, lists and tables | Clear structure makes passages easier to extract |
| Show authorship and dates | Helps readers (and systems) judge trust and freshness |
| Don't hide the answer behind tabs or "read more" that need JavaScript | Hidden content may not be in the fetched HTML |
See also how AI answer engines pick sources and writing content AI assistants quote.
Track Whether ChatGPT Cites You
ChatGPT referral links usually carry utm_source=chatgpt.com, and visits also show chatgpt.com as the referrer. This script counts AI-assistant referrals and OpenAI crawler hits in your access logs:
"""Which pages does ChatGPT send visitors to? Count AI referrals in your access logs.
Usage: python3 chatgpt_referrals.py access.log [more.log ...]
Counts page requests that arrive from ChatGPT (utm_source=chatgpt.com or a
chatgpt.com / chat.openai.com referrer), plus Perplexity, Claude, Gemini and
Copilot referrers for comparison, and lists the top landing pages per source.
Also counts OpenAI crawler hits by user-agent (OAI-SearchBot, ChatGPT-User, GPTBot).
"""
import re, sys
from collections import Counter, defaultdict
LINE = re.compile(r'"(?:GET|HEAD) (\S+)[^"]*" (\d{3}) \S+ "([^"]*)" "([^"]*)"')
SOURCES = {
"ChatGPT": re.compile(r"chatgpt\.com|chat\.openai\.com", re.I),
"Perplexity": re.compile(r"perplexity\.ai", re.I),
"Claude": re.compile(r"claude\.ai", re.I),
"Gemini": re.compile(r"gemini\.google\.com", re.I),
"Copilot": re.compile(r"copilot\.microsoft\.com", re.I),
}
BOTS = ("OAI-SearchBot", "ChatGPT-User", "GPTBot")
def main(paths):
visits, pages, bots = Counter(), defaultdict(Counter), Counter()
for path in paths:
for line in open(path, errors="replace"):
m = LINE.search(line)
if not m:
continue
url, status, referrer, ua = m.groups()
for bot in BOTS:
if bot in ua:
bots[(bot, status)] += 1
if re.search(r"\.(js|css|png|jpe?g|svg|webp|ico|woff2?)(\?|$)", url):
continue
for name, pat in SOURCES.items():
if pat.search(referrer) or (name == "ChatGPT" and "utm_source=chatgpt.com" in url):
visits[name] += 1
pages[name][url.split("?")[0]] += 1
break
print("AI assistant referrals (page views):")
for name, n in visits.most_common():
print(f" {n:>6} {name}")
for page, c in pages[name].most_common(5):
print(f" {c:>5} {page}")
print("\nOpenAI crawler requests (bot, status):")
for (bot, status), n in sorted(bots.items()):
print(f" {n:>6} {bot:<14} {status}")
if __name__ == "__main__":
main(sys.argv[1:])AI assistant referrals (page views):
2 ChatGPT
1 /blog/inp-explained
1 /pricing
1 Perplexity
1 /blog/inp-explained
OpenAI crawler requests (bot, status):
1 GPTBot 403
1 OAI-SearchBot 200A 403 next to OAI-SearchBot is the most important line in that output: it means your CDN or firewall is blocking the crawler that ChatGPT search depends on.
How BugViso Checks ChatGPT Eligibility
A BugViso AI readiness audit parses your robots.txt for 17 crawlers, including OAI-SearchBot, ChatGPT-User and GPTBot, sends live requests with AI crawler user-agents to catch CDN and firewall blocks, compares raw HTML with the rendered page, and scores content extractability (answer-first passages, question headings, lists and tables) and E-E-A-T signals such as authorship and dates.
For the full list of what BugViso tests here, see the GEO audit for AI search.
Common Mistakes
- Blocking GPTBot and assuming you're out of ChatGPT search. Search uses OAI-SearchBot.
- Blocking every AI bot with a CDN toggle. It can block search crawlers you want, not just training crawlers.
- Client-rendered content. If
curldoesn't return your text, ChatGPT's crawler doesn't see it. - Expecting changes immediately. OpenAI says robots.txt changes take about 24 hours.
- Trusting "exact algorithm" claims. OpenAI hasn't published one.
FAQ
How does ChatGPT search decide which websites to cite?
OpenAI doesn't publish its ranking. It documents that pages must be accessible to OAI-SearchBot. Beyond that, clear, specific, answer-first content in the HTML is the most reliable thing you control.
Does blocking GPTBot remove my site from ChatGPT?
No. GPTBot is for model training. ChatGPT search inclusion depends on OAI-SearchBot.
Can a JavaScript single-page app be cited by ChatGPT?
Only if the content is in the HTML the crawler fetches. ChatGPT's crawlers don't execute JavaScript, so use server-side rendering or prerendering.
How do I know if ChatGPT sends me traffic?
Look for utm_source=chatgpt.com in landing URLs or chatgpt.com as the referrer in analytics and logs.
Do backlinks matter for ChatGPT search?
OpenAI hasn't said. Treat authority as likely helpful, but focus first on accessibility and content quality you can control.
The Takeaway
You can't see ChatGPT's ranking, but you can guarantee eligibility and quotability, starting with a BugViso AI readiness audit that checks OAI-SearchBot access and raw-HTML content.
See where your site stands
Run a free BugViso audit for SEO, speed, accessibility and AI search readiness — with fixes you can ship today.