<?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: Ali Baizhanov</title>
    <description>The latest articles on DEV Community by Ali Baizhanov (@ali_baizhanov_1c2dfd2f333).</description>
    <link>https://dev.to/ali_baizhanov_1c2dfd2f333</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%2F4178770%2F7e9dc916-bf7c-49bb-af08-ddcba43e3e6f.png</url>
      <title>DEV Community: Ali Baizhanov</title>
      <link>https://dev.to/ali_baizhanov_1c2dfd2f333</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ali_baizhanov_1c2dfd2f333"/>
    <language>en</language>
    <item>
      <title>How to see which AI crawlers read your website (5 ways, with copy-paste commands)</title>
      <dc:creator>Ali Baizhanov</dc:creator>
      <pubDate>Tue, 13 Oct 2026 09:59:02 +0000</pubDate>
      <link>https://dev.to/ali_baizhanov_1c2dfd2f333/how-to-see-which-ai-crawlers-read-your-website-5-ways-with-copy-paste-commands-3e61</link>
      <guid>https://dev.to/ali_baizhanov_1c2dfd2f333/how-to-see-which-ai-crawlers-read-your-website-5-ways-with-copy-paste-commands-3e61</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://pagelens.io/blog/how-to-see-ai-crawlers-on-your-website" rel="noopener noreferrer"&gt;pagelens.io&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;AI crawlers read websites all day, and almost no site owner can see it. The reason is simple: analytics tools count visitors with JavaScript that runs in a browser, and AI crawlers download the HTML without running any JavaScript. To see them you have to look where the request arrives: your server or your CDN.&lt;/p&gt;

&lt;p&gt;Here are five ways to do that, starting with the ones that cost nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  First: which bots to look for
&lt;/h2&gt;

&lt;p&gt;There are three kinds, and they mean different things:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kind&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;th&gt;What a request means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Training crawlers&lt;/td&gt;
&lt;td&gt;GPTBot, ClaudeBot, CCBot&lt;/td&gt;
&lt;td&gt;The page was collected for training a model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI search crawlers&lt;/td&gt;
&lt;td&gt;OAI-SearchBot, Claude-SearchBot, PerplexityBot&lt;/td&gt;
&lt;td&gt;The page went into the index an assistant searches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fetches for a person&lt;/td&gt;
&lt;td&gt;ChatGPT-User, Claude-User, Perplexity-User&lt;/td&gt;
&lt;td&gt;Someone asked an assistant about this right now, and it opened your page&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The third kind is the one to watch. It is the closest thing to "my page was used in an answer".&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Server access logs (free, if you run the server)
&lt;/h2&gt;

&lt;p&gt;Nginx and Apache already write every request to a log. Count requests per AI bot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-oE&lt;/span&gt; &lt;span class="s2"&gt;"GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|Claude-SearchBot|Claude-User|PerplexityBot|Perplexity-User"&lt;/span&gt; /var/log/nginx/access.log &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See which pages one of them asked for (the path is the 7th field in the default log format):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"ChatGPT-User"&lt;/span&gt; /var/log/nginx/access.log | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $7}'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the requests that ended in a 404, which are pages a bot expected to find and didn't (the status is the 9th field):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"GPTBot|ClaudeBot|PerplexityBot"&lt;/span&gt; /var/log/nginx/access.log | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'$9 == 404 {print $7}'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt; a one-off look on a VPS. &lt;strong&gt;Limits:&lt;/strong&gt; logs rotate after days or weeks, a CDN cache in front of the server hides requests from it, and you get a number, not a trend.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Your CDN's dashboard (free, if your site runs through one)
&lt;/h2&gt;

&lt;p&gt;A CDN sees every request before your server does, including the ones it answers from cache. Cloudflare has an AI crawler section in its dashboard that lists AI crawlers requesting your site and lets you allow or block each. Other CDNs and hosts (Vercel, Netlify, Fastly) show requests in their logs, where you can filter by user agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt; a quick answer to "which AI companies crawl me, and how much". &lt;strong&gt;Limits:&lt;/strong&gt; usually no view per page over time, and nothing about what happened next (did anyone visit, did they buy).&lt;/p&gt;

&lt;h2&gt;
  
  
  3. A few lines of middleware (free, for Next.js and similar)
&lt;/h2&gt;

&lt;p&gt;If your framework lets you run code on every request, log the bots there. In Next.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// middleware.ts (proxy.ts in Next.js 16)&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;NextRequest&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AI&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|Claude-SearchBot|Claude-User|PerplexityBot|Perplexity-User/i&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user-agent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)?.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AI&lt;/span&gt;&lt;span class="p"&gt;)?.[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nextUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt; &lt;span class="p"&gt;}))&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;matcher&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/((?!_next/static|_next/image|favicon.ico).*)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The lines land in your host's function logs. The same idea works in Express, a Cloudflare Worker or any server framework.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limits:&lt;/strong&gt; you still have to store, count and chart them, and middleware runs before the page, so it doesn't know the response status.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. WordPress
&lt;/h2&gt;

&lt;p&gt;WordPress runs PHP on every uncached request, so a short snippet in a small plugin or your child theme can log AI bots:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;add_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'template_redirect'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$ua&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'HTTP_USER_AGENT'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;preg_match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|Claude-User|PerplexityBot|Perplexity-User/i'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$ua&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$m&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;error_log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'AI bot '&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;' '&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s1"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The catch:&lt;/strong&gt; page caches (WP Rocket, LiteSpeed, a CDN) serve cached pages without running PHP, so cached pages go uncounted. Exclude bot user agents from the cache, or count at the CDN instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Analytics that reads bots from your server (automatic)
&lt;/h2&gt;

&lt;p&gt;The four ways above give you raw requests. Turning them into something you can act on means storing them, grouping them by page and by company, and joining them with what people did afterwards. I built this into &lt;a href="https://pagelens.io/features/ai-traffic-analytics" rel="noopener noreferrer"&gt;PageLens&lt;/a&gt;: a small snippet on your server reports bot requests, and the dashboard shows which pages AI crawlers read, which ones assistants opened to answer people, the 404s they hit, and the visits and revenue that came from AI assistants.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check that the bots are real
&lt;/h2&gt;

&lt;p&gt;Anyone can send a request that says &lt;code&gt;GPTBot&lt;/code&gt;. OpenAI, Anthropic and Perplexity publish the IP ranges their bots use, so a request with a bot's name from another address is an impostor. When I &lt;a href="https://pagelens.io/blog/ai-bots-top-websites-study" rel="noopener noreferrer"&gt;checked 740 top websites&lt;/a&gt;, 9% turned away requests carrying AI bot names even though their robots.txt allowed those bots.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do with the numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read a lot, never opened for an answer:&lt;/strong&gt; AI knows the page exists and doesn't find it useful for questions. Put the question in the heading and the answer in the first two sentences.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opened for answers, no visits:&lt;/strong&gt; you are being used as a source without being clicked. Check how the page describes you and whether it gives a reason to click through.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Important page never read:&lt;/strong&gt; link to it from your home page and sitemap, and check robots.txt and your CDN.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bots hitting 404s:&lt;/strong&gt; they expect a page there, often &lt;code&gt;/pricing&lt;/code&gt;, &lt;code&gt;/docs&lt;/code&gt; or &lt;code&gt;/llms.txt&lt;/code&gt;. Create it or redirect.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The field numbers in the commands are for the default "combined" log format of Nginx and Apache. If your format differs, adjust them.&lt;/p&gt;

&lt;p&gt;What do you use to watch AI crawlers on your sites?&lt;/p&gt;

</description>
      <category>seo</category>
      <category>ai</category>
      <category>webdev</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>We checked 740 of the world's top websites for AI bots. Most that block GPTBot also block ChatGPT search</title>
      <dc:creator>Ali Baizhanov</dc:creator>
      <pubDate>Mon, 12 Oct 2026 08:27:34 +0000</pubDate>
      <link>https://dev.to/ali_baizhanov_1c2dfd2f333/we-checked-740-of-the-worlds-top-websites-for-ai-bots-most-that-block-gptbot-also-block-chatgpt-463d</link>
      <guid>https://dev.to/ali_baizhanov_1c2dfd2f333/we-checked-740-of-the-worlds-top-websites-for-ai-bots-most-that-block-gptbot-also-block-chatgpt-463d</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://pagelens.io/blog/ai-bots-top-websites-study" rel="noopener noreferrer"&gt;pagelens.io&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most advice about AI search starts with "check your robots.txt". I wanted to know what the biggest sites actually do, so I ran an AI visibility check on the top 1,500 domains of the &lt;a href="https://tranco-list.eu/" rel="noopener noreferrer"&gt;Tranco list&lt;/a&gt; (list 4672X), a research ranking of the most visited domains, on October 12, 2026.&lt;/p&gt;

&lt;p&gt;Many of those domains are APIs and CDNs with no home page (gstatic.com, akamai.net and so on). &lt;strong&gt;740 served a home page to a normal browser request&lt;/strong&gt;, and every number below is out of those 740 websites.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;15% block GPTBot&lt;/strong&gt; in robots.txt, and about as many block ClaudeBot (14%) and Google-Extended (13%).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;13% block at least one agent that answers people&lt;/strong&gt;: OAI-SearchBot, ChatGPT-User, Perplexity's bots or Claude-User.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Of the 109 sites that block GPTBot, 69 (63%) also block ChatGPT's search or browsing agent.&lt;/strong&gt; Only 40 block training and keep ChatGPT search open.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;9% turn away requests that carry an AI bot's name at the server&lt;/strong&gt;, even though their robots.txt allows those bots.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;About 14% publish an llms.txt&lt;/strong&gt;; 45% have structured data on the home page; 38% have no sitemap I could find.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. robots.txt: training bots are blocked more than answer bots
&lt;/h2&gt;

&lt;p&gt;Share of the 740 websites whose robots.txt keeps each agent off the home page (in practice, off the site):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Blocked&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CCBot&lt;/td&gt;
&lt;td&gt;Common Crawl, an open dataset many AI labs train on&lt;/td&gt;
&lt;td&gt;16.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bytespider&lt;/td&gt;
&lt;td&gt;ByteDance training crawler&lt;/td&gt;
&lt;td&gt;15.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPTBot&lt;/td&gt;
&lt;td&gt;OpenAI training crawler&lt;/td&gt;
&lt;td&gt;14.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ClaudeBot&lt;/td&gt;
&lt;td&gt;Anthropic training crawler&lt;/td&gt;
&lt;td&gt;13.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google-Extended&lt;/td&gt;
&lt;td&gt;Gemini training (a robots.txt token, not a separate crawler)&lt;/td&gt;
&lt;td&gt;13.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;meta-externalagent&lt;/td&gt;
&lt;td&gt;Meta training crawler&lt;/td&gt;
&lt;td&gt;12.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PerplexityBot&lt;/td&gt;
&lt;td&gt;Perplexity search index&lt;/td&gt;
&lt;td&gt;10.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ChatGPT-User&lt;/td&gt;
&lt;td&gt;ChatGPT opening a page for a person&lt;/td&gt;
&lt;td&gt;9.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Applebot-Extended&lt;/td&gt;
&lt;td&gt;Apple Intelligence training&lt;/td&gt;
&lt;td&gt;9.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perplexity-User&lt;/td&gt;
&lt;td&gt;Perplexity opening a page for a person&lt;/td&gt;
&lt;td&gt;8.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude-User&lt;/td&gt;
&lt;td&gt;Claude opening a page for a person&lt;/td&gt;
&lt;td&gt;8.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OAI-SearchBot&lt;/td&gt;
&lt;td&gt;ChatGPT search index&lt;/td&gt;
&lt;td&gt;7.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Most of these are deliberate: 92 of the 109 GPTBot blocks name GPTBot explicitly, the rest come from a rule for all bots.&lt;/p&gt;

&lt;p&gt;Each agent has a page in this &lt;a href="https://pagelens.io/ai-bots" rel="noopener noreferrer"&gt;AI bots directory&lt;/a&gt; with its user agent, robots.txt rules and published IP ranges.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Blocking GPTBot usually blocks ChatGPT search too
&lt;/h2&gt;

&lt;p&gt;GPTBot only collects training data. Whether a site appears in ChatGPT search depends on &lt;strong&gt;OAI-SearchBot&lt;/strong&gt;, and &lt;strong&gt;ChatGPT-User&lt;/strong&gt; is the agent that opens a page while ChatGPT answers someone. OpenAI documents them as separate agents. One nuance: OpenAI says robots.txt rules may not apply to ChatGPT-User, because a person starts those requests, so a robots.txt block of it is a stated preference more than a guarantee.&lt;/p&gt;

&lt;p&gt;Of the 109 websites that block GPTBot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;69 also block OAI-SearchBot or ChatGPT-User.&lt;/strong&gt; Among them are cnn.com, bbc.com, reddit.com, imdb.com, espn.com, nature.com and Amazon's stores. They opt out of ChatGPT as a whole.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;40 block only training&lt;/strong&gt; and leave ChatGPT search and browsing open, including forbes.com, bloomberg.com, airbnb.com, figma.com, ted.com and nintendo.com.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are legitimate choices. The second one is what most businesses want: stay out of training, stay in the answers. If you copied a "block AI bots" robots.txt from a blog post, check which group you're in.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. robots.txt isn't the whole story
&lt;/h2&gt;

&lt;p&gt;For each site I also requested the home page with each bot's name in the user agent (GPTBot, ChatGPT-User, ClaudeBot, PerplexityBot) and compared the answer with a normal browser request. On 130 sites, at least one bot-named request was turned away (a 403, a challenge page or no answer) although robots.txt allows that bot.&lt;/p&gt;

&lt;p&gt;I then re-tested those 130 sites with a fourth request: a generic, made-up crawler name. That splits them into groups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;69 (9.3% of all sites)&lt;/strong&gt; let the browser and the generic crawler through, but turn away requests named after AI bots. 37 of them turn away ChatGPT-User, the agent that opens pages to answer people.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;37 (5%)&lt;/strong&gt; turn away any bot-like request, AI or not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;19&lt;/strong&gt; did not repeat on the second test, and 5 blocked the browser too.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One caution: these requests don't come from OpenAI's or Anthropic's servers. Some CDNs block requests that &lt;em&gt;claim&lt;/em&gt; to be GPTBot but don't come from the IP ranges OpenAI publishes, and let the real GPTBot in. From the outside, "blocks AI bots" and "blocks impostors" look the same, which is why I don't name sites in this group. If you're one of them, your CDN's bot settings (in Cloudflare: Security → Bots) will tell you which it is.&lt;/p&gt;

&lt;p&gt;The useful lesson for a site owner: robots.txt can say "allowed" while the server says no, and nothing in robots.txt will show it.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Can AI read the page once it gets it?
&lt;/h2&gt;

&lt;p&gt;AI crawlers don't run JavaScript. On &lt;strong&gt;22%&lt;/strong&gt; of home pages, fewer than 120 words were readable in the HTML before scripts run. This is an upper bound: some sites send bots a short interstitial page instead of the real one. But for a single-page app, an empty HTML shell is what every AI crawler sees.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Signal&lt;/th&gt;
&lt;th&gt;Share of the 740 sites&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Has a robots.txt&lt;/td&gt;
&lt;td&gt;76%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Has a sitemap (in robots.txt or at /sitemap.xml)&lt;/td&gt;
&lt;td&gt;62%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Has structured data (JSON-LD) on the home page&lt;/td&gt;
&lt;td&gt;45%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing a title or meta description&lt;/td&gt;
&lt;td&gt;21%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Publishes an llms.txt (Markdown with a title)&lt;/td&gt;
&lt;td&gt;14%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;llms.txt is still a minority practice even among the largest sites: about one in seven. Several more sites answered /llms.txt with something that isn't one (an IP address, a bare "OK", an error page), which a naive check would count.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do on your own site
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Decide training and answers separately.&lt;/strong&gt; Blocking GPTBot and ClaudeBot keeps you out of training; to stay in ChatGPT and Claude answers, allow OAI-SearchBot, ChatGPT-User, Claude-SearchBot and Claude-User.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the server, not only the file.&lt;/strong&gt; CDN bot settings and firewalls override robots.txt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make sure the text is in the HTML.&lt;/strong&gt; Server rendering or prerendering for the pages you want quoted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Then measure what AI actually does.&lt;/strong&gt; Server logs show which pages AI crawlers read and which ones assistants open to answer people.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you want to run the same check on your site, I built it as a free tool (no sign-up): &lt;a href="https://pagelens.io/tools/ai-crawler-checker" rel="noopener noreferrer"&gt;pagelens.io/tools/ai-crawler-checker&lt;/a&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Domains: top 1,500 of Tranco list 4672X. A domain counts as a website if a normal browser request to its home page got a page (2xx or 3xx, no challenge). 740 did.&lt;/li&gt;
&lt;li&gt;robots.txt rules were evaluated for the home page path with the most specific matching user-agent group, as crawlers do.&lt;/li&gt;
&lt;li&gt;Bot requests used each bot's name and said they came from the checker. Run from Central Asia on October 12, 2026; results can differ by location and change at any time.&lt;/li&gt;
&lt;li&gt;These are shares, not judgements: blocking AI bots is a valid choice.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy to answer questions about the data or the method in the comments.&lt;/p&gt;

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