Measurement Instruments · 11 min read

Proving Which AI Crawlers Actually Fetched Your Pages

A user agent string is a claim, not evidence. Here is the full pipeline, including the verification step that most published guides skip entirely.

81.8%of requests claiming to be an AI assistant failed IP verification in one operator's own logsDuane Forrester, 33 requests, one site
The short version
  • One operator published his raw counts: 81.8 percent of requests claiming to be an AI assistant, and 87 percent of requests claiming to be Googlebot, came from IPs outside the vendors' published ranges.
  • OpenAI, Anthropic, Perplexity, Google and Microsoft all publish machine readable IP range files. If you are not matching source IPs against them, your AI crawler report is unverified.
  • Google is the exception: it wants a reverse DNS lookup plus a forward lookup back to the same IP, not just a CIDR match.
  • A training crawl and a live retrieval fetch are different bots with different consequences. Cloudflare measured training at about 79 percent of AI crawler traffic in July 2025, and only the retrieval side has any bearing on whether you get cited today.
  • The deliverable is not a bot count. It is a coverage table: every important URL, whether a verified retrieval agent fetched it, when, and what status code it got.

Your bot log is lying to you, and somebody published the receipts

Duane Forrester ran a verification script over his own server logs and printed the raw counts. Twenty seven of thirty three requests claiming to be an AI assistant, 81.8 percent, came from IP addresses outside the vendors' published ranges. The Googlebot number was worse: of 799 requests carrying a Googlebot user agent, 107 verified and 692 did not. All twenty CCBot requests were impostors.

The short answer

A user agent string is a self reported claim, not evidence. To prove an AI crawler fetched your page you need three steps in order: pull the request from a raw server log, resolve the source IP against that vendor's published IP ranges or reverse DNS, and classify which crawler it actually was, because a training crawl and a live retrieval fetch mean entirely different things. Skip the middle step and your access report is counting traffic that may never have been the engine.

That is one site and a small sample, and I am not going to dress it up as a population estimate. Forrester's own writeup shows the denominators, which is exactly why it is citable. Read it as an existence proof: unverified bot counts can be wrong by an order of magnitude on a real site.

That matters because the whole AI access argument now runs on log evidence. Confirming the crawlers can reach you is a robots.txt and WAF job. Confirming they did reach you is a log job, and it is the one almost nobody finishes.

The name is the claim. The IP is the proof.

Duane ForresterFounder and CEO, UnboundAnswers.com

Stage one, filter: the agent list, and the two lines most people get wrong

Grep your raw access log, not your analytics. AI crawlers fetch HTML over HTTP and do not run your JavaScript, so client side analytics never fires for them. Vercel and MERJ found GPTBot fetched JavaScript files in 11.50 percent of requests and ClaudeBot in 23.84 percent, and neither executed them. That study is from December 2024 and nobody has replicated it at scale since, so treat the rendering conclusion as dated but directionally unchallenged.

One filter line covers the current field:

  • grep -E 'GPTBot|OAI-SearchBot|OAI-AdsBot|ChatGPT-User|ClaudeBot|Claude-User|Claude-SearchBot|PerplexityBot|Perplexity-User|Google-Extended|Google-CloudVertexBot|Bingbot|Amazonbot|Applebot-Extended|CCBot|Bytespider|meta-externalagent|MistralAI-User' access.log > ai-hits.log

Two lines in that list are the ones I see mis-handled on nearly every audit I inherit.

The first is OAI-SearchBot. OpenAI documents four separate bots, and it is OAI-SearchBot, not GPTBot, that surfaces sites in ChatGPT's search features. Blocking GPTBot is a training decision with zero visibility cost. Blocking OAI-SearchBot removes you from ChatGPT search answers.

The second is Google-Extended. Google states it does not impact a site's inclusion in Google Search nor is it used as a ranking signal, and it has no separate HTTP user agent string of its own. If your log shows Google-Extended as a distinct agent, something in your stack is inventing it.

Stage two, verify: the step that turns a count into evidence

Every major vendor now publishes machine readable IP ranges, and each one tells you to use them. Perplexity's documentation says to combine both User-Agent string matching and IP address verification and calls its JSON endpoints the source of truth for WAF configuration. Anthropic states that if a crawler has a source IP on its published list, that indicates the crawler is coming from Anthropic.

The files you need:

VendorVerification asset
OpenAIopenai.com/searchbot.json, gptbot.json, chatgpt-user.json, adsbot.json
Anthropicclaude.com/crawling/bots.json
Perplexityperplexity.com/perplexitybot.json, perplexity-user.json
Googledevelopers.google.com/static/crawling/ipranges/common-crawlers.json plus reverse DNS
Microsoftbing.com/toolbox/bingbot.json plus reverse DNS to search.msn.com

Google is deliberately the odd one out, and this trips people up. Google's documented method is a two way DNS check: run a reverse DNS lookup on the accessing IP, confirm the domain is googlebot.com, google.com or googleusercontent.com, then run a forward lookup on that domain and confirm it returns the original IP. A one way reverse lookup is forgeable. The round trip is not.

Runnable, in the order I actually run it:

The verification loop
Step 01

Pull the ranges

curl -s https://openai.com/searchbot.json | jq -r '.prefixes[].ipv4Prefix' >> ranges.txt. Repeat for every vendor file, refresh it on a schedule, and never hardcode a CIDR block from a blog post.

Step 02

Extract the IPs

Cut field one from ai-hits.log, sort, uniq. You are usually verifying a few hundred distinct addresses, not millions of rows.

Step 03

Match against CIDR

grepcidr -f ranges.txt ips.txt gives you the verified set. Anything not in the output is unverified until proven otherwise.

Step 04

Round trip Google and Bing

host 66.249.66.1 then host the hostname it returns, and require the original IP back. Bing's hostname must end in search.msn.com.

Step 05

Tag and rejoin

Write verified, spoofed or unverifiable back onto every log line before you aggregate anything. Aggregating first is how bad numbers get into client decks.

Unverifiable is a real third bucket, not a rounding error. Some vendors publish nothing, some requests arrive through proxies, and Forrester's method explicitly kept an unverifiable class rather than forcing a binary. Report it as its own column and stop pretending it is clean.

Stage three, the branch: how big the spoofed pile really is

Here the evidence genuinely conflicts, and the honest move is to say so rather than pick the scarier number.

On one side, DataDome's threat research team reports that when roughly 700,000 reachable sites were tested with a spoofed ChatGPT style user agent, 79.7 percent let it through without blocking or challenging it, that Meta-ExternalAgent drew 16.4 million spoofed requests and ChatGPT-User 7.9 million, and that nearly 2.4 percent of requests claiming to be PerplexityBot were fraudulent. On the other, Screaming Frog's own guidance says spoofing of AI bot user agents is currently rare compared to search engine bots.

Both can be true, and I think they are. DataDome measures a security network where attackers self select toward the traffic that gets waved through, and a 2.4 percent fraud rate on PerplexityBot is a long way from 81.8 percent. Forrester measured one small site. The defensible reading is that the spoofed share on any given site is unknown until you check, plausibly small, and occasionally enormous. That is precisely why the check is not optional.

Not only do most AI agents fail to properly identify themselves, but most websites can't tell a legitimate AI agent from an attacker pretending to be one.

Jerome SeguraVP of Threat Research, DataDome

The strongest single case is not a random scraper. Cloudflare documented Perplexity running an undeclared crawler that presented a generic Chrome user agent, used IPs outside its published range, and rotated ASNs to evade blocks, generating three to six million daily requests across tens of thousands of domains. Cloudflare de-listed Perplexity as a verified bot over it. If a named vendor will do that, an anonymous scraper typing GPTBot into a header is not a stretch.

81.8%
of "AI assistant" requests failed IP verification in one operator's logs
79.7%
of tested sites let a spoofed ChatGPT style user agent straight through
79%
of AI crawler traffic was model training, not search or user answers

Stage four, classify: a training crawl has nothing to do with being cited today

Once you have a verified set, the single most useful thing you can do with it is split it by purpose. Every vendor has now converged on the same three way architecture, and Search Engine Land's Lauren Busby lays out the training side plainly.

Training crawlers, such as GPTBot, ClaudeBot, CCBot, and Google-Extended, collect content for large-scale datasets and model development.

Lauren BusbyCo-Founder, Trebletree
Two very different log lines
Training crawlRetrieval or user fetch
AgentsGPTBot, ClaudeBot, CCBot, Google-Extended, Applebot-ExtendedOAI-SearchBot, Claude-SearchBot, PerplexityBot, ChatGPT-User, Claude-User, Perplexity-User
What it meansYour content may enter a future model weight setYour content is in, or being pulled into, an answer surface people use now
Effect on citations this quarterNone you can observeDirect, and the prerequisite for everything downstream
Share of AI crawl trafficAbout 79 percent (Cloudflare, July 2025)About 17 percent search plus 3.2 percent user actions
Right response to zero hitsUsually fine, sometimes deliberateInvestigate immediately

The volume asymmetry is the punchline. Cloudflare measured training at 79 percent of AI crawler traffic in July 2025, search at 17 percent and user actions at 3.2 percent, and a companion analysis put training at nearly 80 percent of AI bot crawling. Those are 2025 network wide figures, not your site, and they are the best public numbers available.

So an unclassified dashboard that shouts "AI crawler traffic up 300 percent" is, four times out of five, reporting training crawls. That is a bandwidth and licensing story. It is not an AI visibility story, and reporting it as one is how GEO retainers lose credibility in month three.

Process diagram of five stages of AI crawler log analysis, from raw log through IP verification to a page level coverage report
Stage two is where the pipeline earns its keep. Without it you are reporting a header string that anyone can type.Sources: Google Search Central verification docs, OpenAI bots documentation, Perplexity crawler docs, Anthropic crawler docs, Cloudflare (July 2025), DataDome (2026), Duane Forrester (2026).
Use this graphic on your site

Free to republish with a link back to this page. Copy the embed code:

<a href="https://josephtimpson.com/insights/ai-crawler-log-analysis"><img src="https://josephtimpson.com/assets/infographics/ai-crawler-log-analysis.svg" alt="Process diagram of five stages of AI crawler log analysis, from raw log through IP verification to a page level coverage report" width="1200" style="max-width:100%;height:auto"></a><p>Graphic by <a href="https://josephtimpson.com/insights/ai-crawler-log-analysis">Joseph Timpson</a></p>

Stage five, roll up: build the coverage table, not a bot count

The deliverable is a join, not a chart. Take your crawl inventory (every URL you care about) and left join the verified retrieval hits onto it. What you want is the rows with nothing on the right.

Columns in the coverage report
  1. URL and its priority tier (money page, cluster hub, supporting post)
  2. Last verified fetch by any retrieval agent, with the date
  3. Which agents: OAI-SearchBot, Claude-SearchBot, PerplexityBot, each as its own column
  4. Status code returned to that agent, not to Googlebot
  5. Bytes served and whether the response was cached or challenged
  6. Verified, spoofed and unverifiable request counts as three separate totals

The zero rows are the finding. A page no verified retrieval agent has ever fetched is not a content problem, an entity problem, or a schema problem. It is an access or discovery problem, and no amount of writing fixes it.

Status codes deserve their own pass. Vercel and MERJ found ChatGPT's crawler wasted 34.82 percent of its fetches on 404s and Claude's 34.16 percent, against 8.22 percent for Googlebot. Again, December 2024 data. But if a third of what an AI crawler requests on your site is missing, your internal linking and redirect hygiene are costing you retrieval that you have already paid to earn.

ACCESS proves the crawlers can reach you. This pipeline proves they did. The Cited Method is the five stage sequence those two steps sit inside.

See how ACCESS and MEASURE fit together

What logs cannot tell you, said plainly

A verified fetch is not a citation. It is the necessary condition, and the correlation between fetch volume and citation volume is something nobody has published a credible study on. Anyone selling you "crawl frequency drives citations" is extrapolating.

It also cannot tell you about eligibility. Google states a page must be indexed and eligible to be shown with a snippet to appear in generative AI features, which means a stray nosnippet directive can zero out AI presence on a page your logs show being fetched cleanly every week. Logs and index status answer different questions. Run both.

And the two levers most often sold alongside log analysis do not survive contact with the evidence. llms.txt files are overwhelmingly never requested, and schema does not causally lift AI citations. Your logs will confirm the first one for free: check how many hits your own llms.txt has taken.

The half of this pipeline that is on its way out

IP allowlists are a maintenance treadmill and everyone involved knows it. Cloudflare's own framing is blunt: existing identification methods rely on a combination of IP address range, which may be shared by other services or change over time, and user-agent header, which is easily spoofable.

The replacement is cryptographic. Web Bot Auth has crawlers sign their requests using HTTP Message Signatures and publish their public keys at a declared domain, so verification becomes a signature check instead of a range lookup. Cloudflare's Perplexity post already lists it as one of the ways a well behaved crawler should identify themselves honestly, using a unique user-agent, a declared list of IP ranges or Web Bot Auth integration.

My read: stage two of this pipeline gets simpler within eighteen months and stages one, three, four and five do not change at all. Build the pipeline around the classification and the coverage join, because those survive. Do not build your tooling around a hardcoded CIDR list. This is also the direction that makes agent traffic a first class SEO concern rather than a bot management footnote.

The web is not disappearing. Humans are simply becoming the minority of those who read it.

Michael KingFounder and CEO, iPullRank

If you genuinely cannot get raw logs

Plenty of clients are on managed hosting with no log export. Three usable fallbacks, in the order I reach for them.

Cloudflare's AI Crawl Control is free on all plans with zero configuration and shows crawler activity and request patterns per operator. It is verification you did not have to build, because Cloudflare is doing the bot identification upstream. The tradeoff is that you get their classification, not yours, and no per URL join.

Google's Search Console generative AI performance reports and Bing Webmaster Tools' AI Performance report cover the citation side rather than the fetch side. They are first party, free, and they answer a different question than logs do. Use them together and stop paying for tools that only sample prompts.

A log analyser closes the gap for everyone else. Screaming Frog's Log File Analyser documents an AI bot monitoring workflow with a not-in-log view that surfaces the pages the AI bots you are monitoring never requested. That single view is the closest off the shelf equivalent to the coverage table above. Note that its IP list verification is documented for search engine bots, so the AI agent verification in stage two is still yours to run.

Whatever you use, the report you hand a client is the same one: verified retrieval fetches, by page, by agent, by date, with the spoofed and unverifiable rows shown rather than quietly dropped. That is what makes it reporting rather than storytelling, and it is the evidence layer everything in the rest of the insights library is built on.

Frequently asked questions

Can I trust a user agent string in my server logs?

No. The user agent is a self reported header that any client can set to any value. One published test found 81.8 percent of requests claiming to be an AI assistant and 87 percent claiming to be Googlebot came from IPs outside the vendors' published ranges. Verify the source IP before you count anything.

How do I verify that GPTBot traffic is really from OpenAI?

Match the source IP against OpenAI's published range files. OpenAI publishes a separate JSON file per bot at openai.com/gptbot.json, searchbot.json, chatgpt-user.json and adsbot.json. Pull them on a schedule, extract the CIDR prefixes, and match every log line's source IP against that list before aggregating.

Why is verifying Googlebot different from verifying GPTBot?

Google wants a two way DNS check, not just a range match. Run a reverse DNS lookup on the accessing IP, confirm the domain is googlebot.com, google.com or googleusercontent.com, then run a forward lookup on that domain and confirm it returns the original IP. A one way reverse lookup can be forged.

What is the difference between a training crawl and a retrieval fetch?

Training crawlers such as GPTBot, ClaudeBot and CCBot collect content for future model training and have no effect on whether you are cited today. Retrieval agents such as OAI-SearchBot, Claude-SearchBot and PerplexityBot feed the answer surfaces people actually use. Only the second group matters for current AI visibility.

Does a verified crawler fetch mean my page will be cited?

No. A verified fetch proves retrieval was possible, nothing more. There is no published study establishing that crawl frequency causes citation frequency, so treat fetch data as a necessary condition and a diagnostic, never as a forecast of citations or traffic.

Why do AI crawlers not show up in Google Analytics?

Client side analytics fires from JavaScript, and AI crawlers request raw HTML without executing scripts. Vercel and MERJ found GPTBot fetched JavaScript files in 11.50 percent of requests and ClaudeBot in 23.84 percent, and neither executed them. Raw server logs or an edge bot report are the only reliable sources.

What should the finished AI crawler log report actually contain?

A coverage table, not a bot count. One row per important URL, showing the last verified fetch by each retrieval agent, the status code that agent received, and separate totals for verified, spoofed and unverifiable requests. The rows with zero verified fetches are the finding.

How often should I rebuild the vendor IP range lists?

Automatically, on a schedule, because the ranges change. Perplexity's documentation calls its JSON endpoints the source of truth and states they are updated regularly. Never hardcode a CIDR block copied from a blog post, and log the date you last refreshed the list alongside your results.

Sources

  1. Search Engine Journal (Duane Forrester). 81.8% of My AI Assistant Traffic Was Fake. The Googlebot Number Was Worse (2026-06)
  2. Duane Forrester Decodes. 81.8% of My AI Assistant Traffic Was Fake (original writeup with raw counts) (2026-06)
  3. Google Search Central. Verifying Googlebot and other Google crawlers (2026-07)
  4. Google Search Central. Google crawlers and fetchers overview (2026-07)
  5. OpenAI. OpenAI bots documentation (2026-07)
  6. Anthropic. Does Anthropic crawl data from the web, and how can site owners block the crawler? (2026-04)
  7. Perplexity AI. PerplexityBot and Perplexity-User crawler documentation (2026-07)
  8. Cloudflare (Reid Tatoris). Perplexity is using stealth, undeclared crawlers to evade website no-crawl directives (2025-08)
  9. Cloudflare (Joao Tome). The crawl-to-click gap: Cloudflare data on AI bots, training, and referrals (2025-08)
  10. Cloudflare (David Belson). A deeper look at AI crawlers: breaking down traffic by purpose and industry (2025-08)
  11. Cloudflare. Message Signatures are now part of our Verified Bots Program (2025-07)
  12. DataDome (Jerome Segura). The Agentic Threats and Industry Trends Defining 2026 (So Far) (2026-07)
  13. Screaming Frog. How to Monitor AI Bots in the Log File Analyser (2026)
  14. Search Engine Land (Lauren Busby). Why log file analysis matters for AI crawlers and search visibility (2026-04)
  15. Vercel with MERJ. The rise of the AI crawler (2024-12)
  16. Google Search Central. AI Features and your website (2025-12)
  17. Cloudflare Developers. AI Crawl Control overview (2026)
  18. Google Search Central. Introducing Search generative AI performance reports in Search Console (2026-06)
  19. iPullRank (Michael King). Machine Media (2026-05)
Joseph Timpson
Written by
Joseph Timpson

Joseph Timpson has worked in search since 2010 and runs Timpson Marketing out of St. George, Utah. He built The Cited Method, a five stage framework for earning and proving real citations in AI answers, and publishes what does not work alongside what does.

Want me to run this on your site and show you the before and after?

One call, no pitch deck. We look at what is actually blocking you and tell you the truth about whether we can help.

Book a free consultation