<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Canlah AI</title>
    <description>The latest articles on DEV Community by Canlah AI (@canlahai).</description>
    <link>https://dev.to/canlahai</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4193733%2F65636940-589f-4fc1-bbe2-2e2eec695c88.png</url>
      <title>DEV Community: Canlah AI</title>
      <link>https://dev.to/canlahai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/canlahai"/>
    <language>en</language>
    <item>
      <title>We Asked ChatGPT and Google AI Mode the Same 60 Questions. They Shared 19 of 507 Cited URLs.</title>
      <dc:creator>Canlah AI</dc:creator>
      <pubDate>Mon, 19 Oct 2026 21:00:42 +0000</pubDate>
      <link>https://dev.to/canlahai/we-asked-chatgpt-and-google-ai-mode-the-same-60-questions-they-shared-19-of-507-cited-urls-ai</link>
      <guid>https://dev.to/canlahai/we-asked-chatgpt-and-google-ai-mode-the-same-60-questions-they-shared-19-of-507-cited-urls-ai</guid>
      <description>&lt;p&gt;We put the same 60 buyer questions to ChatGPT and Google AI Mode on the same night. Question by question, the two engines shared &lt;strong&gt;19 of 507&lt;/strong&gt; cited URLs. That's 3.7%. Blend both engines into one "AI visibility" score and you're averaging two different source lists.&lt;/p&gt;

&lt;p&gt;Everything behind that number is public: the questions, all 917 citation rows, the ChatGPT answers and our page-by-page notes. CC BY 4.0, on GitHub and Hugging Face, with a DOI. This post covers how it was collected, how a citation is counted, and how to recount every headline number with about 20 lines of pandas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Canlah-AI/geo-playbook/blob/main/assets/playbook-5-moves-44s.mp4" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkof0u5jc3pg682guv10k.gif" alt="The GEO Playbook in five moves: plan each engine separately, stop grading yourself on Google's top 10, put the answer in the first 30% of the page, put pricing in a real table, re-ask every month." width="560" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What the data turned into: &lt;a href="https://github.com/Canlah-AI/geo-playbook/blob/main/assets/playbook-5-moves-44s.mp4" rel="noopener noreferrer"&gt;the 44-second film&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Canlah-AI" rel="noopener noreferrer"&gt;
        Canlah-AI
      &lt;/a&gt; / &lt;a href="https://github.com/Canlah-AI/ai-citations-sg-2026" rel="noopener noreferrer"&gt;
        ai-citations-sg-2026
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      What ChatGPT and Google AI Mode cite for 110 Singapore buyer questions: every cited URL in answer order, ChatGPT answers, 92 cited pages taken apart. Round 1: 526 citations on two engines; round 2: 241 on ChatGPT. CC BY 4.0, DOI.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;
  &lt;a href="https://canlah.ai/data/ai-citations-sg-2026/?utm_source=github&amp;amp;utm_medium=community&amp;amp;utm_campaign=wk1019&amp;amp;utm_content=ai-citations-readme" rel="nofollow noopener noreferrer"&gt;
    &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FCanlah-AI%2Fai-citations-sg-2026%2FHEAD%2Fassets%2Fbanner.jpg" alt="AI Citations SG 2026: 7.2% of ChatGPT's cited URLs sat in Google's organic top 10; 23.9% of ChatGPT's cited URLs repeat when the same question is asked twice." width="100%"&gt;
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;What do ChatGPT and Google AI Mode cite when Singapore buyers ask?&lt;br&gt;110 questions, every cited URL, open to recount.&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;
  &lt;a href="https://github.com/Canlah-AI/ai-citations-sg-2026/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2e6adc0dc24f8dcaa4180005d5bd716bf839d8f424027339c8ccb8ad8db21441/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d43432532304259253230342e302d323536334542" alt="License: CC BY 4.0"&gt;&lt;/a&gt;
  &lt;a href="https://doi.org/10.5281/zenodo.23005020" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0873fcb18719261150eb7d238618bc1482a2863068cdecbb5fff135c35f04c2a/68747470733a2f2f7a656e6f646f2e6f72672f62616467652f444f492f31302e353238312f7a656e6f646f2e32333030353032302e737667" alt="DOI 10.5281/zenodo.23005020"&gt;&lt;/a&gt;
  &lt;a href="https://huggingface.co/datasets/CanlahAI/ai-citations-sg-2026" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/88ef927123f927d6722ef51a19667e89e32a8e0d3b8de49edd7ebf89d609817f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f48756767696e67253230466163652d646174617365742d323536334542" alt="Hugging Face dataset"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/16c75151cef0daf9cca0997efbbff9aca0efa8087451a72e0660d7d1ed96f4c3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7175657374696f6e732d3131302d323536334542"&gt;&lt;img src="https://camo.githubusercontent.com/16c75151cef0daf9cca0997efbbff9aca0efa8087451a72e0660d7d1ed96f4c3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7175657374696f6e732d3131302d323536334542" alt="110 questions"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/571a080ce02f279c311978bd210d218e68b06c95b4690c0e9e68ae160ee14f49/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f656e67696e65732d43686174475054253230254332254237253230476f6f676c6525323041492532304d6f64652d323536334542"&gt;&lt;img src="https://camo.githubusercontent.com/571a080ce02f279c311978bd210d218e68b06c95b4690c0e9e68ae160ee14f49/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f656e67696e65732d43686174475054253230254332254237253230476f6f676c6525323041492532304d6f64652d323536334542" alt="Engines: ChatGPT and Google AI Mode"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8dcb78ca61ec6e40bff5781b34f98fd69895a63ab0f481296a3efba2b5866b36/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f666f726d61742d4353562532302543322542372532304a534f4e4c2d323536334542"&gt;&lt;img src="https://camo.githubusercontent.com/8dcb78ca61ec6e40bff5781b34f98fd69895a63ab0f481296a3efba2b5866b36/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f666f726d61742d4353562532302543322542372532304a534f4e4c2d323536334542" alt="Format: CSV and JSONL"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://github.com/Canlah-AI/ai-citations-sg-2026#30-second-start" rel="noopener noreferrer"&gt;&lt;b&gt;Load it in 30 seconds&lt;/b&gt;&lt;/a&gt; ·
  &lt;a href="https://github.com/Canlah-AI/ai-citations-sg-2026/stats.md" rel="noopener noreferrer"&gt;Recounts and findings&lt;/a&gt; ·
  &lt;a href="https://github.com/Canlah-AI/geo-playbook" rel="noopener noreferrer"&gt;The playbook built on it&lt;/a&gt; ·
  &lt;a href="https://github.com/Canlah-AI/ai-citations-sg-2026/DATASHEET.zh.md" rel="noopener noreferrer"&gt;中文完整数据说明&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://github.com/Canlah-AI/geo-playbook/blob/main/assets/playbook-5-moves-44s.mp4" rel="noopener noreferrer"&gt;
    &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FCanlah-AI%2Fai-citations-sg-2026%2FHEAD%2Fassets%2Fplaybook-5-moves.gif" alt="What this dataset shows, in five moves: plan each engine separately, stop grading yourself on Google's top 10, put the answer in the first 30% of the page, put pricing in a real table, re-ask every month." width="560"&gt;
  &lt;/a&gt;
  &lt;br&gt;▶ &lt;a href="https://github.com/Canlah-AI/geo-playbook/blob/main/assets/playbook-5-moves-44s.mp4" rel="noopener noreferrer"&gt;Watch the 44-second film&lt;/a&gt;
&lt;/p&gt;




&lt;p&gt;Put the same 60 Singapore buyer questions to ChatGPT and Google AI Mode and they cite almost entirely different pages: &lt;strong&gt;19 of 507 cited URLs shared (3.7%)&lt;/strong&gt;. Ask ChatGPT the same question twice, minutes apart, and only 23.9% of its cited URLs come back. Here is every citation behind those numbers, so you can check them yourself.&lt;/p&gt;

&lt;p&gt;Five Singapore industries. 110 buyer questions. ChatGPT (OpenAI API, &lt;code&gt;gpt-5.5&lt;/code&gt; with web search, Singapore location) and, in round 1, Google AI Mode (through a third-party SERP API). This dataset keeps the questions, every cited URL in answer order, the ChatGPT answer texts, our page-by-page annotations of cited pages, and a…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Canlah-AI/ai-citations-sg-2026" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;60 buyer questions from five Singapore industries: dental, family law, tuition, B2B SaaS and e-commerce. ChatGPT returned 307 citations, Google AI Mode 219: &lt;strong&gt;526 citations, 474 distinct URLs&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Same question, two engines: &lt;strong&gt;19 shared URLs out of 507&lt;/strong&gt; (3.7%). In 36 of the 54 questions where both engines cited sources, they shared nothing at all.&lt;/li&gt;
&lt;li&gt;In that round, ChatGPT cited &lt;strong&gt;0 of 307&lt;/strong&gt; forum or social pages. AI Mode cited 30 of 219 (YouTube 13, Reddit 10).&lt;/li&gt;
&lt;li&gt;Ask ChatGPT the same question twice, minutes apart, and only &lt;strong&gt;53 of 222&lt;/strong&gt; cited URLs repeat (23.9%).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What we collected
&lt;/h2&gt;

&lt;p&gt;Two rounds, both run in the early hours of 23 September 2026 (Singapore time), about 55 minutes apart.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Round 1&lt;/th&gt;
&lt;th&gt;Round 2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Questions&lt;/td&gt;
&lt;td&gt;60 (5 industries × 12, 6 in Chinese)&lt;/td&gt;
&lt;td&gt;50 (5 × 10, 5 in Chinese)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Engines&lt;/td&gt;
&lt;td&gt;ChatGPT + Google AI Mode&lt;/td&gt;
&lt;td&gt;ChatGPT only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Official citations&lt;/td&gt;
&lt;td&gt;307 + 219 = 526&lt;/td&gt;
&lt;td&gt;241&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Round 1 asks buying questions: how much, which one, A or B, what if it goes wrong. Round 2 uses the same nine question types in every industry: definition, process, statistics, calculation, near me, single review, full guide, rules and checklist.&lt;/p&gt;

&lt;p&gt;The rounds ask different questions, so we never add them together. Each one stands on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  How one citation is captured
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ChatGPT&lt;/strong&gt; goes through the OpenAI Responses API: &lt;code&gt;gpt-5.5&lt;/code&gt; with the &lt;code&gt;web_search&lt;/code&gt; tool, approximate location Singapore, no system prompt, the question passed in as-is. Citations come from the &lt;code&gt;url_citation&lt;/code&gt; annotations on the answer text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google AI Mode&lt;/strong&gt; goes through a third-party SERP API with &lt;code&gt;gl=sg&lt;/code&gt;; citations come from its reference list.&lt;/p&gt;

&lt;p&gt;Both are API results, not what someone sees in the consumer app, and each question was asked once in the official runs.&lt;/p&gt;

&lt;p&gt;Here's the shape of the ChatGPT call, simplified from the method in the dataset README:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;urllib.parse&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urlsplit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urlunsplit&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;strip_openai_utm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Drop only utm_source=openai; leave every other parameter byte-for-byte.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;urlsplit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kept&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;amp;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utm_source=openai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;urlunsplit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;amp;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kept&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;


&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;web_search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_location&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;approximate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;country&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SG&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;city&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Singapore&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}}],&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;how much does a single tooth dental implant cost in Singapore and can I use Medisave&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;citations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;  &lt;span class="c1"&gt;# one entry per distinct URL, in order of first mention
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ann&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;annotations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;[]:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ann&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url_citation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;strip_openai_utm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ann&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;citations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;citations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;citations&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three rules turn raw answers into rows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;One citation = one distinct URL within one answer.&lt;/strong&gt; A URL linked five times in one answer counts once. That's why 526 citations collapse to 474 distinct URLs once you dedupe across answers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strip only &lt;code&gt;utm_source=openai&lt;/code&gt;.&lt;/strong&gt; ChatGPT appends it to links. It touched 30 of the 917 rows, and removing it creates no new duplicates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the order.&lt;/strong&gt; &lt;code&gt;position&lt;/code&gt; is the order of first mention in the ChatGPT answer, or the order of AI Mode's reference list.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The files
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Rows&lt;/th&gt;
&lt;th&gt;One row is&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;queries.csv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;td&gt;a question, with industry, round, language and question type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;citations.csv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;917&lt;/td&gt;
&lt;td&gt;one URL in one answer (767 official, 150 supplementary)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;chatgpt_answers.jsonl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;141&lt;/td&gt;
&lt;td&gt;one ChatGPT call, with the model receipt and answer text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;page_annotations.csv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;141&lt;/td&gt;
&lt;td&gt;our notes on one cited page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;page_types.csv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;td&gt;one type of cited page&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Filter on &lt;code&gt;official == "yes"&lt;/code&gt; for the headline numbers. The supplementary rows are an independent second run of 30 round-2 questions, plus one retry, kept for the repeat test further down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recount the headline numbers
&lt;/h2&gt;

&lt;p&gt;No clone needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://raw.githubusercontent.com/Canlah-AI/ai-citations-sg-2026/main/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;cites&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;citations.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Headline numbers use the official runs only
&lt;/span&gt;&lt;span class="n"&gt;r1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cites&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;cites&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;official&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cites&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;round&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;value_counts&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;to_dict&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;citations,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;nunique&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;distinct URLs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Same question, two engines: how many cited URLs overlap?
&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;union&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;query_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chatgpt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rstrip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google_ai_mode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rstrip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;shared&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;union&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; shared of &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;union&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;union&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Forum and social pages, per engine
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;is_ugc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;value_counts&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;to_dict&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{'chatgpt': 307, 'google_ai_mode': 219}
526 citations, 474 distinct URLs
19 shared of 507 (3.7%)
{'google_ai_mode': 30}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prefer Hugging Face? &lt;code&gt;load_dataset("CanlahAI/ai-citations-sg-2026", "citations")&lt;/code&gt; gives you the same 917 rows.&lt;/p&gt;

&lt;p&gt;Read the 3.7% for what it is: overlap of cited URLs, not a score for either engine. Two engines, two source lists. If you care about both, check both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ask twice, get a different list
&lt;/h2&gt;

&lt;p&gt;Thirty round-2 questions were sent twice, minutes apart, same model, same settings. Same &lt;code&gt;cites&lt;/code&gt; frame as above:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;twice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cites&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;cites&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;run_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;isin&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r2_rerun&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])]&lt;/span&gt;

&lt;span class="n"&gt;inter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;union&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;twice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;twice&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;run_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r2_rerun&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;query_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;twice&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;twice&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;query_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;run_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;run_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r2_rerun&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;inter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;union&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;inter&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; of &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;union&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; URLs repeat (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;inter&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;union&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 53 of 222 (23.9%)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By registered domain it's 64 of 146 (43.8%). Exactly 1 of the 30 questions came back with an identical list. One answer is one sample. A ranking built on one sample is noise with a decimal point.&lt;/p&gt;

&lt;h2&gt;
  
  
  What else is in there
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Different engines lean on different sources.&lt;/strong&gt; For dental questions, 76% of ChatGPT's citations (38 of 50) went to government and public-institution pages, while 75% of AI Mode's (39 of 52) went to clinics and other commercial sites. Filter &lt;code&gt;r1&lt;/code&gt; to &lt;code&gt;query_id&lt;/code&gt; values containing &lt;code&gt;DEN&lt;/code&gt; and run &lt;code&gt;pd.crosstab(den["engine"], den["site_type"])&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mostly not the Google top ten.&lt;/strong&gt; Only 7.2% of ChatGPT's cited URLs (22 of 307) sat in Google's organic top ten for the same question. For AI Mode it was 40.6% (89 of 219). Google's result lists aren't redistributed, so this one lives as aggregates in &lt;code&gt;stats.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The lifted line opens a paragraph.&lt;/strong&gt; On 15 of 18 cited family-law pages, the sentence the engine used was the first sentence of its paragraph. The position notes (written in Chinese) are in &lt;code&gt;page_annotations.csv&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;46 types of cited page&lt;/strong&gt;, from price guides to statute explainers: 9 tested on both engines, 33 with ChatGPT evidence only, 4 untested and labelled that way in &lt;code&gt;page_types.csv&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Scope, in one paragraph
&lt;/h2&gt;

&lt;p&gt;These are API results, not the consumer UI. One market (Singapore), mostly English, 10 to 12 questions per industry, one night in September. Official answers are stored as their first 600 characters, so later sentences can't be matched to citations. Site types come from domain rules, not hand checks. The README (English summary on top, detail in Chinese) spells out what the data shouldn't be used for, including scoring individual businesses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ideas if you want to build on it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Re-run the 110 questions on a newer model and diff against September.&lt;/li&gt;
&lt;li&gt;Add a Google AI Mode leg to round 2, which is ChatGPT only today.&lt;/li&gt;
&lt;li&gt;Test whether the "first sentence of a paragraph" pattern holds outside Singapore.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To cite it: Pang, H. (2026). &lt;em&gt;Singapore GEO Citation Probes, September 2026 (ChatGPT and Google AI Mode)&lt;/em&gt;. Canlah AI. &lt;a href="https://doi.org/10.5281/zenodo.23005020" rel="noopener noreferrer"&gt;doi.org/10.5281/zenodo.23005020&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it exists
&lt;/h2&gt;

&lt;p&gt;We collected it to write the &lt;a href="https://canlah.ai/playbook/?utm_source=devto&amp;amp;utm_medium=blog&amp;amp;utm_campaign=wk1019&amp;amp;utm_content=devto-01-dataset" rel="noopener noreferrer"&gt;GEO Playbook&lt;/a&gt;, a free method book on getting a business named in AI answers: 9 chapters plus 4 appendices, a blueprint for each of the 46 page types, and dental and law-firm editions. All CC BY 4.0, and every number in it is sourced, with our own measurements tracing back to these files (&lt;a href="https://canlah.ai/playbook/evidence/?utm_source=devto&amp;amp;utm_medium=blog&amp;amp;utm_campaign=wk1019&amp;amp;utm_content=devto-01-dataset" rel="noopener noreferrer"&gt;evidence appendix&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;If you'd rather hand the method to an agent, the condensed version is a Claude Code plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/plugin marketplace add Canlah-AI/geo-playbook
/plugin install geo-playbook@canlah-ai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Codex, Cursor and other agents can read the same rules from &lt;code&gt;AGENTS.md&lt;/code&gt; in &lt;a href="https://github.com/Canlah-AI/geo-playbook" rel="noopener noreferrer"&gt;the repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What would you test first with 917 labelled citations? Tell me in the comments.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Written with AI assistance. The headline numbers were recounted from the dataset with the code in this post; the rest come from the dataset's &lt;code&gt;stats.md&lt;/code&gt; and README.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>python</category>
      <category>seo</category>
    </item>
    <item>
      <title>What Is llms.txt? A Plain Guide, and Why It Doesn't Move AI Citations</title>
      <dc:creator>Canlah AI</dc:creator>
      <pubDate>Mon, 19 Oct 2026 09:37:31 +0000</pubDate>
      <link>https://dev.to/canlahai/what-is-llmstxt-a-plain-guide-and-why-it-doesnt-move-ai-citations-1lpb</link>
      <guid>https://dev.to/canlahai/what-is-llmstxt-a-plain-guide-and-why-it-doesnt-move-ai-citations-1lpb</guid>
      <description>&lt;p&gt;llms.txt is a plain Markdown file, usually published at the root of a website, that tells AI agents what the site is and which pages to read first; it blocks nothing, and in the sources Canlah AI reviewed on September 23, 2026, a statement by any major answer engine that it uses the file to choose citations was not found.&lt;/p&gt;

&lt;p&gt;The takeaway&lt;/p&gt;

&lt;p&gt;robots.txt decides which crawlers may enter your site; llms.txt hands an AI agent a short, curated map once it is inside. The two are complementary, not substitutes. llms.txt is cheap to publish and useful to coding agents and browser agents, but the public evidence reviewed on September 23, 2026 shows no measurable link between publishing one and being cited more often in AI answers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; Canlah AI publishes this guide, operates canlah.ai/llms.txt and sells the SEO + GEO work described below. Third-party studies and vendor positions were reviewed on September 23, 2026 from their public pages; Canlah AI figures are first-party and directional, not an independent benchmark.&lt;/p&gt;

&lt;h2&gt;
  
  
  You published llms.txt, so why hasn’t AI started citing you?
&lt;/h2&gt;

&lt;p&gt;Publishing llms.txt does not make ChatGPT, Perplexity or Gemini recommend a site, because the file tells an agent where to read, not which brand to name. Many teams expect the opposite, and treat the file going live as the moment AI answers should start improving.&lt;/p&gt;

&lt;p&gt;A site can serve a tidy llms.txt, rank well on Google and pass every technical check, and still be absent when a prospect puts buyer questions like these to ChatGPT, Perplexity, Gemini or Google AI Mode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Which GEO agencies in Singapore are worth shortlisting?”&lt;/li&gt;
&lt;li&gt;“Is llms.txt enough to get my brand cited?”&lt;/li&gt;
&lt;li&gt;“What should a B2B SaaS team fix first for AI search?”&lt;/li&gt;
&lt;li&gt;“Who measures AI visibility with evidence?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Canlah AI measured this on its own site. canlah.ai has served an llms.txt since at least August 2026, and on September 7, 2026 it still scored &lt;strong&gt;4 out of 100&lt;/strong&gt; on the GEO dimension of Canlah AI’s own audit, with the brand named in 7 of 177 grounded answers to open buyer questions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;robots.txt determines whether AI crawlers may read your pages; llms.txt determines how easily an agent finds the right ones; neither determines whether AI recommends you.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The file is not useless; it answers a different question from the one most buyers are asking.&lt;/p&gt;

&lt;h2&gt;
  
  
  llms.txt in 30 seconds
&lt;/h2&gt;

&lt;p&gt;llms.txt is a reading guide written for language models. It sits beside robots.txt and sitemap.xml, but it does a narrower job than either: it summarises the site in a few lines and links to the pages an agent should fetch when it needs detail.&lt;/p&gt;

&lt;p&gt;Put simply:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;robots.txt tells crawlers where they may and may not go;&lt;/li&gt;
&lt;li&gt;sitemap.xml lists every indexable URL for search engines;&lt;/li&gt;
&lt;li&gt;llms.txt gives an agent a short, human-written summary plus a curated list of links;&lt;/li&gt;
&lt;li&gt;llms-full.txt puts the full text of those pages into one file an agent can load in one request;&lt;/li&gt;
&lt;li&gt;none of the four decides whether an AI engine cites or recommends your brand.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The four root files compared on format, reader, blocking power and evidence of effect on AI citations, reviewed September 23, 2026&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;th&gt;Main reader&lt;/th&gt;
&lt;th&gt;Can it block access?&lt;/th&gt;
&lt;th&gt;Google position for AI features&lt;/th&gt;
&lt;th&gt;Evidence it raises AI citations&lt;/th&gt;
&lt;th&gt;What to verify on your own site&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;robots.txt&lt;/td&gt;
&lt;td&gt;Crawl-access rules as plain-text directives (RFC 9309)&lt;/td&gt;
&lt;td&gt;Search and AI crawlers at crawl time&lt;/td&gt;
&lt;td&gt;Yes, for compliant crawlers&lt;/td&gt;
&lt;td&gt;Access must be allowed for AI Overviews and AI Mode&lt;/td&gt;
&lt;td&gt;Indirect: blocking a crawler removes you from its answers&lt;/td&gt;
&lt;td&gt;That GPTBot, OAI-SearchBot, PerplexityBot and ClaudeBot are not disallowed by accident&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sitemap.xml&lt;/td&gt;
&lt;td&gt;Complete XML inventory of indexable URLs&lt;/td&gt;
&lt;td&gt;Search engine crawlers&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Not found in the sources reviewed&lt;/td&gt;
&lt;td&gt;That every listed URL is live, canonical and indexable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;llms.txt&lt;/td&gt;
&lt;td&gt;Curated Markdown map: H1, blockquote, H2 link lists&lt;/td&gt;
&lt;td&gt;Agents and AI tools at the moment of a task&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Not needed; Google’s AI optimization guide says it can be ignored&lt;/td&gt;
&lt;td&gt;Not found in the sources reviewed&lt;/td&gt;
&lt;td&gt;That it returns 200 as text and its summary matches the About page and schema&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;llms-full.txt&lt;/td&gt;
&lt;td&gt;Full text of the key pages in one Markdown file, often megabytes&lt;/td&gt;
&lt;td&gt;Coding agents, IDE assistants, retrieval pipelines&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Not needed&lt;/td&gt;
&lt;td&gt;Not found in the sources reviewed&lt;/td&gt;
&lt;td&gt;That it is generated on every deploy rather than written by hand&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;“Not found in the sources reviewed” means the public studies and vendor documentation listed in Method and sources did not report that effect when they were checked on September 23, 2026. It is not proof that the effect is absent. Provenance: llmstxt.org v2, Google Search Central, IETF RFC 9309, Chrome Lighthouse 13.3 documentation and the seven studies in the evidence table below.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In one line:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;robots.txt controls access; llms.txt controls orientation; citations are decided by the evidence the engine finds.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why llms.txt became a standard talking point in 2026
&lt;/h2&gt;

&lt;p&gt;llms.txt became a standard talking point in 2026 because the reader of a commercial web page is increasingly a model rather than a person. Buyers put a full question to an assistant instead of scanning a results page, and agents fetch pages on a buyer’s behalf to check integrations, prices, framework compatibility and release notes.&lt;/p&gt;

&lt;p&gt;For those readers, HTML built for people wraps its content in navigation, scripts and layout, and converting it back into clean text wastes tokens. That is the genuine problem the file addresses, and it is a real one for documentation-heavy sites.&lt;/p&gt;

&lt;p&gt;It is also why the file became a sales line. Agencies and plugin vendors found a deliverable that is cheap to produce and hard for a client to evaluate, and SEO tools started flagging its absence. Google’s Search Central team, in its May 2026 guide to optimizing for generative AI features, tells site owners they can ignore “creating unnecessary AI text files (like llms.txt)”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Being easy for an agent to read is not the same as being chosen by an engine to cite.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is llms.txt?
&lt;/h2&gt;

&lt;p&gt;llms.txt is a proposed convention, not a ratified standard. Jeremy Howard of Answer.AI published the proposal at llmstxt.org on September 3, 2024; version 2 of the page was last modified on August 10, 2026. It proposes a Markdown file at /llms.txt, or at any subpath such as /docs/llms.txt, that gives agents “brief background information, guidance, and links to detailed markdown files”.&lt;/p&gt;

&lt;p&gt;The format is deliberately simple, in a fixed order:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an H1 with the name of the site or project, which is the only required element;&lt;/li&gt;
&lt;li&gt;a blockquote with a short summary that an agent needs in order to read the rest;&lt;/li&gt;
&lt;li&gt;optional paragraphs or lists with more detail, but no headings;&lt;/li&gt;
&lt;li&gt;H2 sections containing “file lists”, each item a Markdown link with an optional note after a colon;&lt;/li&gt;
&lt;li&gt;an H2 named Optional for secondary links an agent can skip when context is short.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The proposal also recommends serving a clean Markdown copy of important pages at the same URL with .md appended, and linking pages to their llms.txt with standard link relations.&lt;/p&gt;

&lt;p&gt;The spec is explicit about its intended use. The llmstxt.org page says the file is used “on demand, when an agent needs information about a topic while assisting a user”, and that it was expected to matter mainly for inference rather than training. It’s used most heavily for software documentation, where coding agents follow it to API references.&lt;/p&gt;

&lt;p&gt;Adoption is real, if concentrated. Anthropic, OpenAI, Stripe, Cloudflare and Google’s ai.google.dev all served llms.txt files for their developer documentation when checked on September 23, 2026. Mintlify, GitBook, Yoast SEO, AIOSEO and Wix generate the file automatically, according to the integrations listed on llmstxt.org.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;llms.txt is a reading aid for agents, not a permission system and not a ranking signal.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is llms-full.txt?
&lt;/h2&gt;

&lt;p&gt;llms-full.txt is a companion file that isn’t in the core llms.txt spec but spread through documentation platforms. Mintlify announced on November 20, 2024 that it automatically generates and hosts both /llms.txt and /llms-full.txt for every docs site it hosts. Where llms.txt is an index of links, llms-full.txt concatenates the full text of those pages into a single Markdown file.&lt;/p&gt;

&lt;p&gt;The trade-off is size. Vercel’s /docs/llms-full.txt returned about 9.5 MB on September 23, 2026, far larger than most context windows can hold in one pass. One Singapore GEO agency served an 827 KB llms-full.txt containing every article it publishes, checked on September 22, 2026.&lt;/p&gt;

&lt;p&gt;The use case is narrow but genuine: a developer pastes one URL into an assistant or IDE and the whole corpus loads without crawling. For a marketing site, llms-full.txt mainly guarantees that an agent reading your content sees the full article body, with dates and summaries attached, rather than a truncated page.&lt;/p&gt;

&lt;p&gt;Canlah AI builds its own llms-full.txt from every blog post in English, Simplified Chinese and Traditional Chinese, each preceded by URL, language, topics, type, published date, last-updated date and summary. When this page was reviewed on September 23, 2026, the live canlah.ai/llms-full.txt still returned a 404, and the generator that fixes it shipped with the September 23, 2026 update of this page. That is the kind of gap a file audit catches and a strategy deck does not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Differences Between llms.txt and robots.txt
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The core differences between llms.txt and robots.txt on purpose, format, standard status, reader, timing, blocking power and Google’s position, reviewed September 23, 2026&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;robots.txt&lt;/th&gt;
&lt;th&gt;llms.txt&lt;/th&gt;
&lt;th&gt;What the difference means for you&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Purpose&lt;/td&gt;
&lt;td&gt;States which automated clients may access which paths&lt;/td&gt;
&lt;td&gt;Summarises the site and points agents to the pages worth reading&lt;/td&gt;
&lt;td&gt;Fix access first; a reading list helps nobody who was refused entry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Format&lt;/td&gt;
&lt;td&gt;User-agent groups with Allow and Disallow lines&lt;/td&gt;
&lt;td&gt;Markdown with H1, blockquote and H2 link lists&lt;/td&gt;
&lt;td&gt;A Disallow line inside llms.txt has no effect anywhere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Standard status&lt;/td&gt;
&lt;td&gt;IETF RFC 9309, published September 2022&lt;/td&gt;
&lt;td&gt;Community proposal at llmstxt.org, v2 modified August 10, 2026&lt;/td&gt;
&lt;td&gt;robots.txt behaviour is predictable; llms.txt support varies by agent and can change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;When it is read&lt;/td&gt;
&lt;td&gt;Before a crawl, by crawlers such as Googlebot, GPTBot, OAI-SearchBot, PerplexityBot and ClaudeBot&lt;/td&gt;
&lt;td&gt;On demand, when an agent is assisting a user with a task&lt;/td&gt;
&lt;td&gt;A stale llms.txt is read at the worst moment, mid-task&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can it block AI crawlers?&lt;/td&gt;
&lt;td&gt;Yes, for crawlers that honour it&lt;/td&gt;
&lt;td&gt;No; it has no directive syntax&lt;/td&gt;
&lt;td&gt;Opting out of AI training is a robots.txt job, never an llms.txt one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Search position&lt;/td&gt;
&lt;td&gt;Respected; blocking Googlebot removes pages from AI Overviews and AI Mode&lt;/td&gt;
&lt;td&gt;Not used for Search; Lighthouse 13.3 checks for it in an experimental Agentic Browsing audit&lt;/td&gt;
&lt;td&gt;Publish llms.txt for agent readiness, not in the expectation of Google rankings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical mistake&lt;/td&gt;
&lt;td&gt;Accidentally blocking the answer-engine crawler you want citations from&lt;/td&gt;
&lt;td&gt;Filling it with robots-style directives; an agent that parses those lines was not found in the sources reviewed&lt;/td&gt;
&lt;td&gt;Audit both files in the same pass, on a fixed date&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Provenance: IETF RFC 9309, the llmstxt.org v2 page modified August 10, 2026, Google Search Central’s AI optimization guide and the Chrome Lighthouse 13.3 documentation, all reviewed on September 23, 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In one sentence:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;robots.txt manages the “door.” llms.txt manages the “reading list.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;robots.txt is like the sign at a library entrance saying which rooms are open; llms.txt is like the librarian’s one-page guide to the ten shelves worth your time. The first determines whether a reader gets in at all; the second determines how fast a reader who is already inside finds what matters.&lt;/p&gt;

&lt;p&gt;That distinction is where the earlier version of this page went wrong. It described llms.txt with directives such as User-agent, Disallow, Attribution and Commercial-Use. Those lines belong to robots.txt or to nobody: an agent that reads an attribution or licensing directive from llms.txt was not found in the sources reviewed, and the llmstxt.org format has no directive syntax at all.&lt;/p&gt;

&lt;p&gt;If your goal is to stop a model from training on your content, the tool is robots.txt with named user agents such as GPTBot, Google-Extended, CCBot and anthropic-ai. If your goal is to help an agent that’s already allowed in, the tool is llms.txt.&lt;/p&gt;

&lt;h2&gt;
  
  
  If Google Ignores llms.txt, Why Does Anyone Still Publish One?
&lt;/h2&gt;

&lt;p&gt;Google’s own products disagree about llms.txt, which is the main reason teams keep publishing it after the Search team dismissed it. Search Engine Journal reported on May 20, 2026 that the Search team’s new guide lists llms.txt among tactics to skip, while Chrome’s Lighthouse 13.3 added an llms.txt check to its experimental Agentic Browsing category. The Lighthouse documentation says that without the file, “agents may spend more time crawling the site to understand its high-level structure and primary content.”&lt;/p&gt;

&lt;p&gt;Across Canlah AI’s own site and the sites it reviews, three patterns explain why the file keeps getting published.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 1: Coding agents and IDE assistants read it routinely
&lt;/h3&gt;

&lt;p&gt;Developer documentation is where llms.txt earns its keep. A coding agent asked to call an API can fetch docs.stripe.com/llms.txt or docs.anthropic.com/llms.txt, find the right reference page and load its Markdown version instead of scraping HTML.&lt;/p&gt;

&lt;p&gt;This usually isn’t a search visibility question. It’s a developer experience question, and for API-first companies it’s a sensible one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 2: Browser agents and audits reward a clean map
&lt;/h3&gt;

&lt;p&gt;Lighthouse 13.3 reports whether a site provides llms.txt and flags server errors when fetching it. As browser agents complete tasks on a user’s behalf, a short map of the site’s structure reduces wasted crawling.&lt;/p&gt;

&lt;p&gt;This is readiness for agents that act, not ranking in engines that answer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 3: Platforms publish it by default
&lt;/h3&gt;

&lt;p&gt;Mintlify, GitBook, Wix, Yoast SEO and AIOSEO generate the file automatically, so many sites have one without anyone deciding to. In Canlah AI’s August 2026 agent-readiness dataset, 26 of 47 reachable cross-border DTC storefronts served /llms.txt, and 23 of those 26 also carried a Shopify-issued commerce manifest.&lt;/p&gt;

&lt;p&gt;That pattern suggests platform defaults rather than 26 separate strategic decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Most Common llms.txt Problem in Real Projects: Treating a Map as a Ranking Signal
&lt;/h2&gt;

&lt;p&gt;The observations below come from Canlah AI’s audit of its own site and from Canlah AI’s open agent-readiness dataset. No client data is used; canlah.ai is the only property named, and the storefront dataset is public under CC BY 4.0.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The file was in place, and open-question visibility was still near zero
&lt;/h3&gt;

&lt;p&gt;canlah.ai publishes a 113-line, 15,953-byte llms.txt with eight H2 sections, from Key pages and Services through Open data, the whitepaper index and Optional.&lt;/p&gt;

&lt;p&gt;On September 7, 2026, Canlah AI probed canlah.ai with 39 buyer questions, three runs each, on ChatGPT and Gemini. The site scored 85 out of 100 on the SEO dimension and 4 out of 100 on the GEO dimension. It was named in 39 of 39 grounded answers to branded questions and 7 of 177 grounded answers to open questions, a 4.0% non-brand mention rate.&lt;/p&gt;

&lt;p&gt;This shows:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An agent-friendly map doesn’t make an engine recommend you on questions where the buyer hasn’t named you.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The engines cited 381 distinct third-party domains instead, mostly listicles and competitor pages. That’s where the gap was; the llms.txt couldn’t close it.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The llms.txt summary disagreed with the site’s own entity description
&lt;/h3&gt;

&lt;p&gt;The blockquote in canlah.ai/llms.txt describes Canlah AI as operating inside “ChatGPT, Perplexity, Gemini and Google AI Overviews” and probing “three engines”. Canlah AI’s organisation description elsewhere names eight engines. Both were accurate when written.&lt;/p&gt;

&lt;p&gt;This kind of drift matters more than the file’s existence. Engines assemble a brand’s description from many sources, and an llms.txt that contradicts the About page, the schema and third-party profiles adds noise rather than clarity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;llms.txt is only as useful as its consistency with everything else you publish.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The file you think is live might not be
&lt;/h3&gt;

&lt;p&gt;Canlah AI’s llms-full.txt route returned a 404 on canlah.ai on September 23, 2026. Nobody had noticed, because nothing measured it.&lt;/p&gt;

&lt;p&gt;A monthly llms.txt check confirms five things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;that /llms.txt returns 200 with a text content type rather than an HTML error page;&lt;/li&gt;
&lt;li&gt;that its summary matches the entity description on the site and in the Organization schema;&lt;/li&gt;
&lt;li&gt;that its links resolve and point to Markdown or clean pages;&lt;/li&gt;
&lt;li&gt;that it was updated the last time pricing, services or key pages changed;&lt;/li&gt;
&lt;li&gt;that robots.txt allows the answer-engine crawlers you want citations from.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the difference between publishing a file and managing a signal: the file is a deliverable; the recurring check is the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four common problems with how sites handle llms.txt
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Robots-style directives in a Markdown file
&lt;/h3&gt;

&lt;p&gt;Many llms.txt files, including earlier guidance on this page, contain Disallow, Crawl-delay or Attribution lines. Documentation of any agent honouring those lines was not found in the sources reviewed. If a directive matters, it belongs in robots.txt, where compliant crawlers read it.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. A link dump instead of a curated map
&lt;/h3&gt;

&lt;p&gt;Some files list hundreds of URLs, effectively a sitemap in Markdown. The spec intends a short file that fits in context; if everything is listed, nothing is prioritised.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Stale facts that outlive the page they came from
&lt;/h3&gt;

&lt;p&gt;An llms.txt written once and never revisited quietly becomes the most outdated description of your company that an agent can find. canlah.ai showed this drift: its llms.txt blockquote named three probed engines on September 23, 2026 while the site’s organisation description named eight. Generate the summary from the same source as the About page, and re-read the file whenever pricing or positioning changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Paying for it as a citation lever
&lt;/h3&gt;

&lt;p&gt;Canlah AI’s &lt;a href="https://canlah.ai/blog/geo-vendor-evidence-checklist/" rel="noopener noreferrer"&gt;vendor evidence checklist&lt;/a&gt; flags llms.txt sold as a reason you’ll be cited as a proposal warning sign. When a proposal leads with it, ask which measurement data the recommendation is based on.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the evidence says about llms.txt and AI citations
&lt;/h2&gt;

&lt;p&gt;The question buyers care about is whether the file changes AI answers. Five public sources and two Canlah AI measurements address it, and none shows a positive effect on citations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public evidence on llms.txt adoption, crawler requests and AI citations, reviewed September 23, 2026&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;What was measured&lt;/th&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Caveat that limits the finding&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SE Ranking&lt;/td&gt;
&lt;td&gt;November 7, 2025&lt;/td&gt;
&lt;td&gt;About 300,000 domains, citation frequency in sampled LLM answers&lt;/td&gt;
&lt;td&gt;10.13% had llms.txt; no correlation with AI citations in Spearman, XGBoost or SHAP analysis&lt;/td&gt;
&lt;td&gt;Correlational, and SE Ranking sells SEO software; no correlation in a sample is not proof of no effect&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OtterlyAI&lt;/td&gt;
&lt;td&gt;February 5, 2026&lt;/td&gt;
&lt;td&gt;One test site, 90 days of AI bot server logs&lt;/td&gt;
&lt;td&gt;84 of 62,100+ AI bot requests hit /llms.txt, about 0.1%; an average page drew about 265&lt;/td&gt;
&lt;td&gt;One site, one log window; OtterlyAI sells AI visibility monitoring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Search Central&lt;/td&gt;
&lt;td&gt;May 2026&lt;/td&gt;
&lt;td&gt;Guide to optimizing for generative AI features&lt;/td&gt;
&lt;td&gt;Lists llms.txt among tactics site owners can ignore for Google Search&lt;/td&gt;
&lt;td&gt;Covers Google Search only, not coding agents or browser agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chrome Lighthouse 13.3&lt;/td&gt;
&lt;td&gt;May 2026&lt;/td&gt;
&lt;td&gt;Experimental Agentic Browsing audit&lt;/td&gt;
&lt;td&gt;Checks whether llms.txt exists and whether it errors; not an SEO audit&lt;/td&gt;
&lt;td&gt;Measures agent readiness, not citations, and the category is labelled experimental&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ahrefs&lt;/td&gt;
&lt;td&gt;Updated June 15, 2026&lt;/td&gt;
&lt;td&gt;About 38,000 domains with a valid llms.txt&lt;/td&gt;
&lt;td&gt;97% received zero requests for the file in May 2026&lt;/td&gt;
&lt;td&gt;Counts requests, not answers; Ahrefs sells SEO software&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Canlah AI agent-readiness dataset&lt;/td&gt;
&lt;td&gt;August 2026&lt;/td&gt;
&lt;td&gt;47 reachable DTC storefronts&lt;/td&gt;
&lt;td&gt;26 of 47 served llms.txt, mostly alongside platform-issued manifests&lt;/td&gt;
&lt;td&gt;Cross-border storefronts only, not a random sample of the web; first-party&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Canlah AI self-audit&lt;/td&gt;
&lt;td&gt;September 7, 2026&lt;/td&gt;
&lt;td&gt;canlah.ai, 39 questions, ChatGPT and Gemini, 3 runs&lt;/td&gt;
&lt;td&gt;4.0% non-brand mention rate with llms.txt in place&lt;/td&gt;
&lt;td&gt;One site, two engines, no control site; first-party and directional&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Provenance: every row links to its source in Method and sources, and each page was checked on September 23, 2026. Third-party findings are reported as their publishers state them and were not independently replicated. “No correlation” means the study detected no measurable relationship under its own method, which is not proof that llms.txt can never matter.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The three vendor studies earn their place on scale and directness: SE Ranking and Ahrefs each cover tens of thousands to hundreds of thousands of domains, and OtterlyAI reads server logs rather than asking practitioners what they believe. Two cautions still apply. All three sell SEO or AI visibility tools, so their studies are not neutral market consensus, and every source here is correlational; none ran a controlled experiment where the only change was adding the file.&lt;/p&gt;

&lt;p&gt;Across seven sources and four different methods, no source reports a positive effect of llms.txt on AI citations, and two independently show that AI crawlers rarely request the file at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  llms.txt priorities are not the same across AI engines
&lt;/h2&gt;

&lt;p&gt;Documentation naming llms.txt as an input to answer selection was not found for any of the answer engines below, in the sources reviewed on September 23, 2026. What each engine does document differs enough to change where the work goes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ChatGPT:&lt;/strong&gt; OpenAI documents GPTBot and OAI-SearchBot together with robots.txt controls, and publishes an llms.txt for its own developer docs. Reading third-party llms.txt for ChatGPT search answers: not found in the sources reviewed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perplexity:&lt;/strong&gt; Perplexity’s crawler documentation states that PerplexityBot respects robots.txt, and citations follow retrievable, current pages. Use of a map file in answer selection: not found in the sources reviewed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini:&lt;/strong&gt; grounding runs through Google Search, so Google’s Search guidance applies unchanged. A separate Gemini position on llms.txt: not found in the sources reviewed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google AI Overviews and Google AI Mode:&lt;/strong&gt; Google Search states that llms.txt is not needed, and eligibility follows indexing and standard SEO requirements. Chrome’s Lighthouse 13.3 checks the file for browser agents instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DeepSeek, Qwen and Doubao:&lt;/strong&gt; these engines retrieve from Chinese-language sources first, so a Chinese-language page body matters far more than an English llms.txt. A documented llms.txt input: not found in the sources reviewed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An llms.txt review that stops at confirming the file exists misses every question that decides citations. It should check, engine by engine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;whether each answer engine’s crawler is allowed in robots.txt;&lt;/li&gt;
&lt;li&gt;whether the pages that engine cites for your category include yours;&lt;/li&gt;
&lt;li&gt;whether your own description is consistent across site, schema and llms.txt;&lt;/li&gt;
&lt;li&gt;whether coding and browser agents can load the pages your llms.txt lists.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Should my website have llms.txt?
&lt;/h2&gt;

&lt;p&gt;It depends on who reads your site, but most sites shouldn’t treat the file as a strategy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case 1: You publish developer documentation or an API
&lt;/h3&gt;

&lt;p&gt;Yes, publish llms.txt, and consider llms-full.txt and Markdown versions of your docs pages. Coding agents are the one audience with documented, routine use of the file. If your docs platform generates it, check that the output is current and not a raw link dump.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case 2: You run a marketing, services or ecommerce site
&lt;/h3&gt;

&lt;p&gt;Publish a short one if it takes an hour, and don’t pay a retainer for it. Put the hours into what engines evidently use: crawler access in robots.txt, indexable pages with clear answers, consistent entity facts and third-party sources that engines already cite for your category. Canlah AI’s &lt;a href="https://canlah.ai/blog/how-ai-engines-choose-sources/" rel="noopener noreferrer"&gt;guide to how AI engines choose sources&lt;/a&gt; covers those levers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case 3: You want to keep AI from using your content
&lt;/h3&gt;

&lt;p&gt;llms.txt won’t help. Use robots.txt rules for named AI user agents, and understand the trade: blocking an answer engine’s crawler also removes you from the answers it writes.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to create llms.txt in six steps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Decide who the file is for
&lt;/h3&gt;

&lt;p&gt;Write for an agent that knows nothing about you and has a small context budget: what you are, what you sell, where you operate and which pages hold the detail.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Write the H1 and the summary blockquote
&lt;/h3&gt;

&lt;p&gt;Use the exact brand name as the H1. In the blockquote, write two or three factual sentences that match the entity description on your About page and in your Organization schema, word for word where possible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Add curated H2 link lists
&lt;/h3&gt;

&lt;p&gt;Group 10 to 40 links under plain H2s such as Key pages, Services, Documentation or Company facts. Give every link a one-line note after a colon explaining what the page answers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Move secondary links under Optional
&lt;/h3&gt;

&lt;p&gt;Anything an agent can skip, such as archives, older posts or legal pages, belongs under an H2 named Optional so a context-limited agent can drop it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Publish at the root and verify the response
&lt;/h3&gt;

&lt;p&gt;Serve the file at /llms.txt with a text content type and a 200 status. Fetch it from outside your network, confirm it isn’t blocked by robots.txt or a firewall rule and check it in Lighthouse’s Agentic Browsing audit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Decide on llms-full.txt and keep both current
&lt;/h3&gt;

&lt;p&gt;If you have documentation or a substantial article library, generate llms-full.txt from the same source as your pages rather than by hand. Regenerate on every deploy, and add both files to whatever checks catch broken pages.&lt;/p&gt;

&lt;p&gt;A compact version of canlah.ai’s structure, with the summary aligned to the entity description used across the site, looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Canlah AI

&amp;gt; Canlah AI is a Singapore-based SEO + GEO agency that measures and improves brand visibility inside AI answers, reporting AI visibility as re-verifiable ranges with timestamped evidence.

Contact: admin@canlah.ai · Singapore

## Key pages

- [AI Info](https://canlah.ai/ai-info/): Plain-language facts about Canlah AI, its method and pricing structure.
- [GEO Services](https://canlah.ai/geo/): The four-stage SEO + GEO programme and measurement protocol.
- [Pricing](https://canlah.ai/pricing/): Package structure for SEO + GEO engagements.

## Open data

- [Agent-Readiness of 50 Cross-Border DTC Brands](https://canlah.ai/data/agent-readiness-2026/): CC BY 4.0 dataset, 50 rows x 22 fields.

## Optional

- [Blog](https://canlah.ai/blog/): Essays and data reports on AI visibility.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Summary: robots.txt governs access, llms.txt guides reading, evidence decides citation
&lt;/h2&gt;

&lt;p&gt;robots.txt addresses whether AI crawlers may read your site.&lt;br&gt;&lt;br&gt;
llms.txt addresses how quickly an agent finds the right pages once it can.&lt;/p&gt;

&lt;p&gt;Neither addresses the question most brands are really asking, which is whether an AI engine names them when a buyer asks for a recommendation. That’s decided by what the engine retrieves: indexable pages that answer the question, consistent facts about the brand and the third-party sources the engine already trusts.&lt;/p&gt;

&lt;p&gt;Canlah AI is a Singapore-based SEO + GEO agency that measures and improves brand visibility inside ChatGPT, Gemini, Google AI Overviews and Google AI Mode, reporting AI visibility as re-verifiable ranges with timestamped evidence. Canlah AI ships llms.txt as one small part of the on-site foundation in its programme, and measures whether anything changed rather than assuming it did.&lt;/p&gt;

&lt;p&gt;The limitation is worth stating plainly: as of September 23, 2026, Canlah AI had not run a controlled test isolating llms.txt on a client site, so it cannot tell you the file will move your numbers, and no other source reviewed for this guide can either.&lt;/p&gt;

&lt;p&gt;Verify before you pay anyone, including Canlah AI. Fetch your own /llms.txt and /robots.txt, confirm both return the status and content you expect, put your buyers’ real questions to the engines they use and record which domains come back. If a provider says llms.txt will raise your citations, ask for the probe data measured before and after the file went live.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is llms.txt in simple terms?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;llms.txt is a Markdown file at a website’s root that summarises the site and links to its most useful pages, written for AI agents rather than people. It was proposed by Jeremy Howard at llmstxt.org in September 2024. It guides reading; it doesn’t grant or deny access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the difference between llms.txt and robots.txt?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;robots.txt is a formal standard that tells crawlers which paths they may access, and compliant crawlers obey it. llms.txt is a community proposal that tells an agent what the site is and which pages to read, and it contains no rules to obey. Use robots.txt to allow or block AI crawlers and llms.txt to orient the agents you’ve let in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should my website have llms.txt?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you publish developer documentation or an API, yes, because coding agents routinely use it. For most marketing and ecommerce sites, a short llms.txt is harmless and quick to add, but it isn’t a priority. Crawler access, indexable answer pages and consistent brand facts matter more for AI search visibility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does llms.txt improve AI citations or rankings?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Documentation of llms.txt as a citation input was not found for any major answer engine in the sources reviewed on September 23, 2026, SE Ranking found no correlation across about 300,000 domains and Google Search says the file is not needed for its AI features. llms.txt may still help an agent navigate a site, which is a different outcome from being cited.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is llms-full.txt and do I need one?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;llms-full.txt is a single Markdown file containing the full text of a site’s key pages, popularised by documentation platforms such as Mintlify. It’s most useful for developer docs that people load into coding assistants. A marketing site can publish one generated from its article library, but it should be built automatically so it never goes stale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I create llms.txt for my website?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Write a Markdown file with the brand name as an H1, a two- or three-sentence summary in a blockquote and H2 sections listing key pages with one-line notes. Put secondary links under an H2 named Optional. Publish it at /llms.txt with a 200 status and check that its facts match your About page and schema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Google use llms.txt?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google Search doesn’t use llms.txt for AI Overviews, AI Mode or rankings, and its May 2026 guide lists the file among tactics site owners can ignore. Chrome’s Lighthouse 13.3 does check for llms.txt in an experimental Agentic Browsing audit aimed at browser agents. The two positions cover different products, not a change of policy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can llms.txt stop AI from training on my content?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. llms.txt has no directive syntax, so it can’t block anything. To limit AI training, use robots.txt rules for named user agents such as GPTBot, Google-Extended, CCBot and anthropic-ai, and accept that blocking an answer engine’s crawler also removes you from its answers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Canlah AI going to sell me an llms.txt file?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Canlah AI includes llms.txt in its on-site foundation work at no separate charge and doesn’t sell it as a citation lever. Engagements start with a baseline of buyer questions probed across AI engines, and on-site files are judged against that baseline. If a proposal from any provider leads with llms.txt, ask which measurement supports it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method and sources
&lt;/h2&gt;

&lt;p&gt;This guide was built from the llms.txt proposal, Google’s public documentation, the most-cited public studies on llms.txt and AI citations and Canlah AI’s own files and audit archive. Public pages were reviewed on September 23, 2026, and live llms.txt files were fetched the same day. Third-party study findings are reported as their publishers state them and were not independently replicated. Canlah AI figures are first-party and directional.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://llmstxt.org/" rel="noopener noreferrer"&gt;llmstxt.org, “The /llms.txt file, v2”, Jeremy Howard&lt;/a&gt;. Origin, format, intended use at inference time and the list of generating platforms.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developers.google.com/search/docs/fundamentals/ai-optimization-guide" rel="noopener noreferrer"&gt;Google Search Central, guide to optimizing for generative AI features&lt;/a&gt;. The statement that llms.txt can be ignored for Google Search.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.chrome.com/docs/lighthouse/agentic-browsing/llms-txt" rel="noopener noreferrer"&gt;Chrome for Developers, Lighthouse llms.txt audit&lt;/a&gt;. The Agentic Browsing check and its description of the file.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.searchenginejournal.com/googles-llms-txt-guidance-depends-on-which-product-you-ask/575431/" rel="noopener noreferrer"&gt;Search Engine Journal, “Google’s llms.txt Guidance Depends On Which Product You Ask”, May 20, 2026&lt;/a&gt;. The Search versus Lighthouse split and earlier Google statements.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.seroundtable.com/google-does-not-endorse-llms-txt-40789.html" rel="noopener noreferrer"&gt;Search Engine Roundtable, “Google Search Team Does Not Endorse LLMs.txt Files”, January 20, 2026&lt;/a&gt;. John Mueller’s statement that files on Google developer properties are not an endorsement.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://seranking.com/blog/llms-txt/" rel="noopener noreferrer"&gt;SE Ranking, “LLMs.txt: Why Brands Rely On It and Why It Doesn’t Work”, November 7, 2025&lt;/a&gt;. The 300,000-domain adoption and correlation study.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://otterly.ai/blog/the-llms-txt-experiment/" rel="noopener noreferrer"&gt;OtterlyAI, “Llms.txt Experiment”, February 5, 2026&lt;/a&gt;. The 90-day server-log experiment.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ahrefs.com/blog/what-is-llms-txt/" rel="noopener noreferrer"&gt;Ahrefs, “What Is llms.txt, and Should You Care About It?”, updated June 15, 2026&lt;/a&gt;. The 38,000-domain request analysis.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.mintlify.com/docs/ai/llmstxt" rel="noopener noreferrer"&gt;Mintlify, llms.txt documentation&lt;/a&gt;. Automatic llms.txt and llms-full.txt generation.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.rfc-editor.org/rfc/rfc9309" rel="noopener noreferrer"&gt;IETF, RFC 9309 Robots Exclusion Protocol&lt;/a&gt;. The robots.txt standard.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://canlah.ai/llms.txt" rel="noopener noreferrer"&gt;Canlah AI llms.txt&lt;/a&gt; and &lt;a href="https://canlah.ai/robots.txt" rel="noopener noreferrer"&gt;robots.txt&lt;/a&gt;. The worked example; 113 lines and 15,953 bytes on September 23, 2026.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://canlah.ai/data/agent-readiness-2026/" rel="noopener noreferrer"&gt;Canlah AI, Agent-Readiness of 50 Cross-Border DTC Brands&lt;/a&gt;. The 26 of 47 llms.txt adoption figure.&lt;/li&gt;
&lt;li&gt;Canlah AI audit archive for canlah.ai, September 7, 2026. 39 questions, ChatGPT and Gemini, 3 runs; the 7 of 177 non-brand mention rate and the 85 and 4 dimension scores.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;See where your brand stands in AI answers. &lt;a href="https://canlah.ai/free-ai-audit/" rel="noopener noreferrer"&gt;Run the free AI visibility audit →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Related articles&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://canlah.ai/blog/we-ran-our-own-geo-audit/" rel="noopener noreferrer"&gt;We ran our own GEO audit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://canlah.ai/blog/how-ai-engines-choose-sources/" rel="noopener noreferrer"&gt;How AI engines choose sources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://canlah.ai/blog/seo-vs-aeo-vs-geo/" rel="noopener noreferrer"&gt;SEO vs AEO vs GEO: what’s the difference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://canlah.ai/blog/geo-vendor-evidence-checklist/" rel="noopener noreferrer"&gt;The GEO vendor evidence checklist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://canlah.ai/blog/why-is-my-business-not-showing-up-in-chatgpt/" rel="noopener noreferrer"&gt;Why is my business not showing up in ChatGPT?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://canlah.ai/blog/what-is-llms-txt-2026/" rel="noopener noreferrer"&gt;canlah.ai&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>ai</category>
      <category>chatgpt</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
