AI crawler log analysis is the practice of examining a website's raw server access logs for the user agent strings of AI crawlers - GPTBot, ClaudeBot, PerplexityBot, Googlebot-Extended, and others - to confirm they are actually fetching pages, rather than merely permitted to. It is the only reliable way to know whether an AI engine is indexing your latest content, because robots.txt only states a permission; it says nothing about whether the crawler showed up, what it received, or whether something else quietly blocked it.
Most AEO advice stops at the robots.txt check: confirm GPTBot and ClaudeBot are not disallowed, and move on. That check is necessary but not sufficient. A page can pass every robots.txt rule and still never be crawled, because the block is happening somewhere robots.txt cannot see - a content delivery network's bot-management rules, a rate limiter, a JavaScript-only rendering path, or a web application firewall challenge page. Log analysis is where those silent failures become visible.
Why robots.txt access is not proof of a visit
robots.txt is a request, not an enforcement mechanism. It tells well-behaved crawlers what they are allowed to fetch, and reputable AI crawlers do respect it, but the file has no power to make a crawler actually arrive, and no visibility into what happens between the crawler's request and your origin server.
Several layers sit between an allowed robots.txt rule and a successful page fetch. Cloudflare's bot-fight mode and similar CDN-level bot management products can challenge or block unrecognised automated traffic entirely independently of your robots.txt configuration, sometimes even when the crawler is on an allow-list you configured elsewhere. Rate limiting can return 429 responses to a crawler that requests pages faster than your threshold permits. And because most AI crawlers do not execute JavaScript, a page that renders its core content client-side can return a technically successful 200 response that contains none of the text you intended to be citable.
A 200 status code in your logs does not guarantee the crawler received usable content. If your page relies on client-side rendering, pair log analysis with a plain-text fetch of the URL (curl or a server-rendered HTML diff) to confirm the response body actually contains your content.
Where to find your server logs
Log access varies significantly by hosting environment, and this is the step that trips up most teams running log analysis for the first time.
Vercel and other serverless hosting
On Vercel, raw request logs are available in the dashboard under the project's Logs tab for a limited retention window, and can be piped continuously to a third-party destination through a Log Drain (Vercel supports drains to destinations such as Datadog, Axiom, or a custom HTTP endpoint) for longer retention and querying. Without a log drain configured, you will only see a rolling recent window, which is enough for a spot check but not for a month-over-month trend.
Traditional Nginx, Apache, and CDN logs
On a self-managed server, access logs are typically at /var/log/nginx/access.log or /var/log/apache2/access.log and already contain the full user agent string for every request, going back as far as your log rotation policy allows. If a CDN such as Cloudflare or Fastly sits in front of your origin, check its analytics or logging product as well, since CDN-level blocks can prevent a request from ever reaching your origin server's logs at all - meaning your origin logs would show no evidence of the crawler even attempting to visit.
The AI crawler user agent strings to search for
Search your logs for these substrings, which appear in the user agent field of the relevant crawler's requests:
- GPTBot - OpenAI, used for ChatGPT and API retrieval
- OAI-SearchBot - OpenAI's separate real-time search crawler
- ClaudeBot - Anthropic, used to build Claude's knowledge base
- PerplexityBot - Perplexity AI's retrieval crawler
- Googlebot-Extended - Google, used for Gemini and AI Overviews
- Applebot-Extended - Apple, used for Apple Intelligence
- Meta-ExternalAgent - Meta, used for Meta AI
- Amazonbot - Amazon, used for Alexa and Rufus
- Bytespider - ByteDance, used for Doubao and related products
A step-by-step log analysis process
- Export at least 30 days of access logs so you have enough volume to distinguish a genuinely absent crawler from one that simply has not visited this week
- Search the user agent field for each bot string above and extract the matching lines into a separate file per bot
- Tabulate hits by path and by response code, so you can see which pages each crawler is fetching and whether it is receiving 200, 403, 429, or 5xx responses
- Cross-reference the fetched paths against your recently published or updated content to confirm new pages are being picked up, not just old, previously-indexed ones
- Flag any bot receiving a high proportion of non-200 responses for investigation, since this is usually where a WAF rule, rate limit, or misconfigured CDN setting is silently blocking a crawler that robots.txt allows
Run the same grep command against last month's log export before and after any robots.txt or CDN configuration change. A sudden drop in hits for a specific bot, with no corresponding change in your rules, is the clearest signal that something outside robots.txt started blocking it.
Interpreting what the logs show
A healthy pattern looks like regular, spread-out requests from each major crawler across a broad set of your pages, with response codes overwhelmingly 200. GPTBot and ClaudeBot tend to crawl in batches tied to their training and retrieval refresh cycles, so some week-to-week variance in volume is normal and not itself a warning sign.
An unhealthy pattern looks different in a few distinct ways: a crawler that appears in no logs at all despite an explicit robots.txt allow rule, a crawler that hits only your homepage and never your deeper content, or a crawler that receives a consistent run of 403 or 429 responses. Each of these points to a different fix - the first usually means a CDN or WAF layer is blocking above your application, the second often means internal linking is not surfacing your content to the crawler, and the third means a rate limit or bot-management rule needs an explicit exception for that user agent.
Common blocking causes that logs reveal but robots.txt cannot
- CDN or WAF bot-management modes (such as aggressive bot-fight settings) that challenge or block unrecognised automated traffic regardless of robots.txt
- Rate limiting that returns 429 responses once a crawler exceeds a request threshold your infrastructure was not tuned to expect
- Client-side rendering that returns a 200 response containing an empty shell, since most AI crawlers do not execute JavaScript
- Geo-based blocking rules that reject requests from the IP ranges AI crawlers commonly operate from
- Stale edge-cached robots.txt responses that still reflect an older, more restrictive configuration than the one you most recently deployed
Building an ongoing monitoring routine
Treat log analysis as a recurring check, not a one-time audit. A monthly cadence is enough to catch configuration regressions - a WAF rule tightened for an unrelated reason, a CDN plan change that alters bot-management defaults, or a new rate limit introduced during a traffic spike - before they cost you weeks of missed indexing.
For teams without dedicated observability infrastructure, a lightweight setup is enough to start: a scheduled export of the previous month's logs, the grep command above run against each bot string, and a simple spreadsheet tracking hit counts and response codes over time. Only invest in a dedicated log pipeline (BigQuery export, Datadog, or a similar tool) once you are managing this across enough properties that manual export becomes the bottleneck.
Log analysis confirms whether crawlers are visiting; it does not confirm whether they are citing you. Pair it with a CiteRank audit to check the structural signals (schema, E-E-A-T, content structure) that determine whether a successfully-crawled page is actually worth citing. For data that changes faster than a crawl cycle can keep up with, an MCP server lets an agent query it directly instead of waiting for the next crawl.