AI Crawler Log Analysis

How to pull server or CDN logs and analyze AI-bot activity — verifying GPTBot, ClaudeBot, and PerplexityBot against spoofing, choosing a tool, and reading crawl frequency, crawl-vs-render, and status codes.

First published: Jul 3, 2026 · Last updated: Jul 15, 2026 · Advanced
demand #5 in Measurement and Reporting#39 in AI Search#426 on the site
1 evidence signal on this page

AI crawler log analysis is how you inspect — with your own first-party logs, not a vendor dashboard — which claimed AI bots requested your site and what the server returned. Verification is provider-specific: OpenAI publishes bot-specific IP range files, and Anthropic publishes a current shared bots.json list; a user-agent without a current official verification method remains a claim, not a verified identity. Keep raw-HTML dependency as an observed risk rather than asserting that every major AI crawler never runs JavaScript; asset-request patterns describe the measured sample, not a universal renderer contract. Crawl frequency still does not predict citation — retrieval is necessary but not sufficient. Tools scale from grep to Screaming Frog LFA to ELK/Splunk to BigQuery/Cloudflare.

TL;DR — Pull your Apache/Nginx or CDN access logs, then do four things: verify (match the user-agent and confirm the IP against each operator’s published list — spoof rates run from HUMAN Security’s 5.7% to Duane Forrester’s self-tested 81.8%); choose a tool by scale (grep → Screaming Frog Log File Analyser → ELK/Splunk → BigQuery/Cloudflare); measure crawl frequency by bot, which pages get hit, crawl-vs-render, and status codes; and interpret honestly — retrieval is necessary but not sufficient, so “more crawling = more citations” is unproven. This is the method sibling to AI crawlers (which owns what the bots are), AI traffic attribution (the click side), and LLM visibility (the retrieved → mentioned → cited framework this observes the first stage of).

What this article owns — and what it doesn’t

Logs demonstrate requests, not whether content was used for training, retrieval, or an answer. Evidence for this claim Server access logs record requests and can include fields such as request path, status, referrer, and user agent. Scope: Apache HTTP Server logging; available fields depend on server configuration. Confidence: high · Verified: Apache: Log files Verify bots using provider-published mechanisms where available and treat attribution as bounded evidence. Evidence for this claim OpenAI publishes user-agent tokens and controls for several of its crawlers. Scope: OpenAI's documented crawlers; a user-agent string is not proof of downstream training, retrieval, citation, or use. Confidence: high · Verified: OpenAI: Crawlers

The sibling AI crawlers article already owns the bot-by-bot table, the three-category taxonomy (training / AI-search / user-triggered fetch), the Google-Extended-is-a-token-not-a-bot distinction, and the robots.txt recipes. I’m not re-deriving any of that here. AI traffic attribution owns the GA4/referrer side — what the bot sent back. This article is the opposite side of the funnel: what the bot took. And LLM visibility owns the retrieved → mentioned → cited framework; log analysis is how you observe the retrieved stage specifically, and nothing past it.

This is the AI-era sequel to classic SEO log file analysis. When I reviewed Ahrefs’ How to Do an SEO Log File Analysis, the dimensions were crawl frequency, URLs crawled, status codes, and bot verification against Google’s published IPs. Same skeleton here — but pointed at a bot population that mostly doesn’t render JavaScript, gets impersonated constantly, and crawls in erratic bursts rather than a steady stream.

Step 1 — Get your logs

Your logs live in one of two places, or both:

  • Origin server logs. Apache (access.log), Nginx (access.log), or your app server. Each line has, at minimum: timestamp, client IP, request method + path, status code, bytes, referrer, and user-agent.
  • CDN / edge logs. If you’re behind Cloudflare, Fastly, Akamai, etc., a lot of bot traffic is answered at the edge and may never reach your origin — so the edge log is the fuller record. Cloudflare exposes this via Logpush (and a GraphQL API); Fastly via real-time log streaming.
Evidence for this claim Server access logs record requests and can include fields such as request path, status, referrer, and user agent. Scope: Apache HTTP Server logging; available fields depend on server configuration. Confidence: high · Verified: Apache: Log files

The fields you actually need for AI-bot analysis: timestamp, client IP, user-agent, request path, status code, and ideally bytes and referrer.

The practical problem is retention. Many hosts keep only a few days of logs. Lauren Busby’s Search Engine Land piece names the fix directly — a scheduled pull turns a short window into something analyzable over time: a scheduled SFTP job, built in a workflow tool like n8n or scripted, is enough to turn a short retention window into something you can actually analyze over time (Busby, SEL). Set that up before you need the data.

One honest limit to keep in mind from the start: as Busby puts it, log files show you what reached your site, but they don’t always show you what tried to (SEL) — requests blocked or answered upstream may not appear at all.

Step 2 — Verify before you trust the user-agent

This is the step that separates AI-bot log analysis from the classic version, and the one most competing how-tos skip. User-agent strings are trivially spoofed. Two independent data points on how bad it gets:

  • HUMAN Security analyzed two weeks of traffic claiming to be one of 16 well-known AI crawlers and found 5.7% of it was spoofed — roughly 1 in 18 requests (reported via SEJ).
  • Duane Forrester ran the same check on his own logs and found far worse. Of 33 requests carrying a live-fetch name, six came from an IP the vendor publishes and twenty-seven did not — an 81.8% spoof rate among the requests he could check (SEJ). His Googlebot number was worse still: of 799 requests carrying the Googlebot name, only 107 came from a verified Google address — the other roughly 87% were not Google (SEJ).

Treat those as directional from different samples and methods, not one universal number. More importantly, do not generalize one provider’s verification method to every bot. Some operators publish address ranges; others document user-agent tokens without a current public range or DNS-verification contract (SEJ).

The verification method:

  1. Match the user-agent string. GPTBot identifies itself as Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.3; +https://openai.com/gptbot; OAI-SearchBot and ChatGPT-User carry their own tokens (OpenAI bots docs).
  2. Use the provider’s current official verification method when one exists. OpenAI ships openai.com/gptbot.json, searchbot.json, and chatgpt-user.json. Anthropic’s current crawler documentation says an address in its published list indicates a crawler is coming from Anthropic. Use that current provider-specific method; do not generalize it into a universal bot-verification rule.
  3. Do not invent a fallback. Reverse-plus-forward DNS is valid for a provider only when that provider publishes the hostname pattern and verification procedure. A generic PTR match proves control of DNS, not the claimed bot identity. Screaming Frog’s Log File Analyser can apply publicly confirmed lists where available; its verify-on-import feature performs a lookup against publicly confirmed IP lists to confirm bots are genuine (Screaming Frog).

Verification should inform precise policy and incident response. Prefer the provider’s documented robots token for a crawl policy; reserve network controls for abuse or security cases and label them separately from robots compliance.

Step 3 — Choose your tool

Scale it to the size of the job, roughly free → paid, ground-truth → managed:

  • grep / PowerShell — a quick one-off count and a verification-aware filter. The AI crawlers article has the basic bot-count snippet; the Scripts tab here extends it into IP verification, a status-code breakdown, and crawl-vs-render detection.
  • Screaming Frog Log File Analyser — a desktop importer with built-in AI-bot presets (GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-User, PerplexityBot, Perplexity-User, CCBot) and a “Verify Bots When Importing” toggle. Its Response Codes tab breaks 2XX/3XX/4XX/5XX per URL, the User Agents tab shows requests and error rates per bot, the URLs tab sorts by Num Events (most-fetched pages), and the IPs tab lets you investigate suspicious sources (tutorial).
  • ELK Stack (Elasticsearch / Logstash / Kibana) or Splunk — for continuous, larger-scale ingestion with dashboards and alerting, once a single-import desktop tool gets too slow or you want ongoing monitoring rather than periodic exports.
  • BigQuery — for long-term retention and SQL querying at scale, commonly fed by Cloudflare Logpush or a scheduled GraphQL pull from Cloudflare’s httpRequestsAdaptiveGroups dataset, so you can query bot activity by page, date, and status code without re-importing flat files.
  • Cloudflare AI Crawl Control (for sites behind Cloudflare) — a managed dashboard for crawler activity and request patterns, bot verification, and directive-compliance tracking, without building your own pipeline (docs).

Step 4 — What to measure and how to read it

Crawl frequency by bot. Hits per day/week per bot name. AI bots crawl in bursts, not steady streams. In WISLR’s 48-day CDN-log case study, GPTBot was absent for weeks, then hit 187 requests in a single week — 152 of them in a three-minute burst, peaking at 114 requests/minute (WISLR). Read frequency as pattern, not just a total.

Which pages get hit — and which important ones don’t. Sort by request count. Busby notes AI crawlers commonly stay shallow — it’s common to see them limited to top-level pages: the homepage, primary navigation, and a small number of high-level URLs (SEL) — dropping off sharply for deep pages even when those deep pages matter most for citation. A deep page that never appears in the logs can’t be retrieved.

Raw-HTML dependency — measure, don’t universalize. Provider documentation does not give one shared JavaScript-rendering contract for GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, PerplexityBot, and other agents. One observed signature is still useful: in WISLR’s sample, ChatGPT-User fetched HTML only — zero requests for images, CSS, or JS files — while Googlebot and OAI-SearchBot also pulled images (WISLR). If your logs show AI bots hammering pages whose raw HTML is a near-empty JS shell, that’s a checkable dependency risk, not proof that every provider always behaves this way. Compare delivered HTML with outcomes or provider-specific fetch tests. (For the rendering fundamentals, see JavaScript SEO.)

Status-code / blocked breakdown. Watch: 200 (success), 304 (not modified — good, efficient re-crawl), 404 (broken links the bot followed), and 403/429 (blocked / rate-limited). Busby specifically calls out that log files surface where crawlers encounter issues, including 403 responses (blocked requests) and 429 responses (rate limiting) (SEL). Check whether that blocking is intentional or an accident.

robots.txt and llms.txt requests as their own signal. Cross-reference which bots request /robots.txt at all before crawling — in WISLR’s sample, GPTBot and Meta-WebIndexer never checked it across 48 days — and whether disallowed paths get hit anyway. WISLR also logged zero requests to /llms.txt from any AI bot over those 48 days (WISLR), consistent with the roughly 97%-unread finding covered in the AI crawlers article. Don’t expect llms.txt requests in your logs as proof it “works.”

Does more crawling mean more citations? Be honest.

No established data supports “crawl more, get cited more.” Retrieval is a necessary precondition for citation but nowhere near sufficient — pages get crawled constantly and never cited, whether because of client-side rendering, paywalls, thin or duplicate content, or simply losing to a better source in the model’s retrieval/ranking step. The load-bearing framing lives in the LLM visibility article: retrieved → mentioned → cited, and log analysis observes only that first stage.

The way to close the loop honestly is to pair the crawl-input side (your logs) with the citation-output side. Bing’s AI Performance report (public preview, Feb 2026) is the first official tool exposing citation data alongside its grounding queries — the key phrases the AI used when retrieving content that was referenced in AI-generated answers (Bing Webmaster Blog). Logs tell you what got taken; grounding queries and citation counts tell you what came of it. Neither alone is the whole picture — see the measurement and reporting hub for how these layers stack.

The stealth-crawling wrinkle

Verification isn’t a one-time audit. Per Seer Interactive’s Clint Spaulding, once blocked, stealth crawlers can reappear under generic browser headers and unrelated IPs — these sessions look human in logs, which means session counts get inflated, bot traffic gets undercounted, and GEO segmentation becomes less trustworthy (Seer). His blunt summary: if you can’t see these stealth crawlers, you can’t measure their impact. This is exactly why log analysis needs periodic re-verification and re-baselining, not a single pass.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin an expert quote first.