Server Log Analysis for AI Crawlers: Verify Bots, Costs, and Policy
Technical SEO Published Updated 7 min read

Server Log Analysis for AI Crawlers: Verify Bots, Costs, and Policy

If you need to analyze AI crawler traffic, start with one rule: trust verified logs, not screenshots or user-agent guesses.

Google says the best way to confirm Googlebot is reverse DNS or Google’s published IP ranges. OpenAI documents separate crawlers for search, training, and user-triggered fetches. Cloudflare AI Crawl Control exposes requests, allowed requests, data transfer, top paths, and status-code patterns. Put those together and you can decide what to allow, narrow, rate-limit, or block with evidence instead of debate.

This guide gives you a practical workflow for analyzing AI crawler traffic without confusing verified bots, spoofed user agents, and user-triggered assistant fetches.

AI crawler verification and policy workflow

What Each Data Source Can And Cannot Tell You

Do not treat every dashboard as interchangeable.

SourceBest forWhat it misses
Raw server or edge logsVerifying who requested which URL, when, with what status, and at what byte costNeeds cleanup and bot verification
Cloudflare AI Crawl ControlRequests, allowed requests, edgeResponseBytes, status-code distribution, popular paths, crawler/operator filters, referral data on paid plansIt is a product layer, not a replacement for raw origin logs
Search Console Crawl StatsGoogle’s crawling history on your property, including requests, download size, response time, crawl purpose, and Googlebot typeGoogle only, root-level properties only, and totals may differ from your own logs
robots.txt rulesDeclaring crawl policyRules alone do not prove whether a crawler complied or whether the traffic was worth serving

Two limits matter immediately:

If you only have one source, use it. If you have to make a policy decision, combine at least logs plus one verification layer.

Step 1: Pull A Clean 7- Or 30-Day Slice

Start with a controlled time window, not a full-year export.

Use one or more of these inputs:

Keep the first pass simple:

  1. Filter to production hosts only.
  2. Remove health checks and internal monitoring traffic.
  3. Separate HTML page requests from static assets.
  4. Keep one timezone for the whole analysis.
  5. Split / and /zh/ or other locale directories if they should both be crawlable.

That gives you a slice you can actually compare week to week.

Step 2: Verify Identity Before You Trust The Label

This is the step most teams skip, and it is usually where the policy goes wrong.

Verify Googlebot

Google’s crawler documentation says the best way to verify Googlebot is reverse DNS or matching the source IP against Google’s published ranges. Do not treat Googlebot in a raw user-agent string as proof.

You can verify a suspected Googlebot IP from the shell:

host 66.249.66.1
dig -x 66.249.66.1 +short

If the reverse lookup resolves to a Google-owned hostname such as googlebot.com, google.com, or googleusercontent.com, verify the hostname maps back to the same IP before you trust it.

Verify OpenAI crawlers

OpenAI’s crawler overview splits its traffic into different roles:

User agentWhat OpenAI says it is forWhy it matters in logs
OAI-SearchBotSearch results in ChatGPT search featuresThis is the crawler that matters if you want search visibility in ChatGPT
GPTBotCrawling content that may be used to improve generative AI foundation modelsSeparate this from search decisions
ChatGPT-UserUser-triggered fetches in ChatGPT and Custom GPTsThis is not automatic web crawling, and robots.txt rules may not apply

OpenAI also publishes IP ranges for these agents on the same documentation page. If you are making allow or block decisions, verify both the declared crawler role and the source IP range instead of matching only on user-agent.

Prefer verified bot metadata over text matching

If your CDN or edge provider exposes verified bot metadata, use that first.

Cloudflare’s AI Crawl Control GraphQL filters explicitly distinguish between:

  • userAgent_like, which can be spoofed
  • botDetectionIds_hasany, which Cloudflare documents as reliably verified

That is the right model for logs too: verified detection first, raw string matching only as fallback.

Step 3: Keep The Fields That Support A Decision

For each request, keep at least these fields:

FieldWhy it matters
TimestampDetect crawl bursts and compare before/after policy changes
HostSeparate production, staging, and language hosts
Request pathSee whether bots hit canonical pages or junk URLs
Query stringCatch faceted or parameter crawl waste
User agentGroup crawler families
Verified bot or detection IDDistinguish trusted identity from spoofed strings
Status codeMeasure success versus errors
Response bytesQuantify crawl cost
ReferrerSpot user-triggered visits when present
Cache status or edge outcomeUnderstand whether the CDN shielded origin load
IP addressSupport bot verification when detection metadata is absent

If you use Cloudflare, map your operating view to the product’s documented fields and tables:

  • Analyze AI traffic surfaces total requests, allowed requests, unsuccessful requests, edgeResponseBytes, status-code distribution, top referrers, and popular paths.
  • The GraphQL API exposes filters for host, path, status range, user agent, referrer host, and verified detection IDs.

Minimum fields to keep in crawler logs

Step 4: Build A Weekly Rollup You Can Reuse

If you do not have a reporting layer yet, start with one 7-day export.

The table below is a sample operating view, not Fennec production data:

CrawlerRequests2xx rateMain path patternBytes servedLikely action
Googlebot4,82098.7%Canonical articles and docs1.4 GBAllow and monitor
OAI-SearchBot64097.8%Public blog and feature pages214 MBAllow and review landing pages
GPTBot1,12095.1%Blog plus parameter URLs690 MBNarrow low-value paths
ChatGPT-User74100.0%Deep links to specific guides19 MBKeep public pages healthy
Unknown Googlebot strings91082.4%Mixed errors and odd parameters508 MBVerify before trusting

That single table changes the conversation from “Do we like this bot?” to “What did this verified crawler actually request, and what did it cost?”

Step 5: Query Verified Traffic First

If your logs land in a warehouse, use verified identifiers whenever you can.

For Cloudflare-backed analysis, the official GraphQL examples show two approaches:

  1. botDetectionIds_hasany for reliably verified crawlers
  2. userAgent_like only when detection IDs are unavailable

This example follows that pattern:

{
  viewer {
    zones(filter: { zoneTag: "<ZONE_ID>" }) {
      httpRequestsAdaptiveGroups(
        filter: {
          datetime_geq: "2026-07-19T00:00:00Z"
          datetime_leq: "2026-07-26T00:00:00Z"
          requestSource: "eyeball"
          botDetectionIds_hasany: [123815556, 132995013, 126255384]
        }
        limit: 5000
      ) {
        count
        dimensions {
          datetimeHour
          botDetectionIds
          clientRequestHTTPHost
        }
        sum {
          edgeResponseBytes
        }
      }
    }
  }
}

If you are using raw logs in BigQuery, ClickHouse, Athena, or another warehouse, keep the first pass simple:

SELECT
  verified_bot,
  COUNT(*) AS requests,
  ROUND(100 * AVG(CASE WHEN status BETWEEN 200 AND 299 THEN 1 ELSE 0 END), 1) AS rate_2xx,
  SUM(bytes_sent) AS bytes_served
FROM edge_logs
WHERE ts >= CURRENT_TIMESTAMP - INTERVAL '7 days'
  AND host = 'www.example.com'
GROUP BY verified_bot
ORDER BY bytes_served DESC;

Then rank the paths that actually consumed crawler budget:

SELECT
  verified_bot,
  request_path,
  COUNT(*) AS requests,
  SUM(bytes_sent) AS bytes_served,
  ROUND(100 * AVG(CASE WHEN status BETWEEN 200 AND 299 THEN 1 ELSE 0 END), 1) AS rate_2xx
FROM edge_logs
WHERE ts >= CURRENT_TIMESTAMP - INTERVAL '7 days'
  AND host = 'www.example.com'
GROUP BY verified_bot, request_path
ORDER BY bytes_served DESC
LIMIT 50;

If you do not have a verified bot field, substitute the cleanest available detection layer and mark the limitation in your report.

Step 6: Score Four Signals, Not Just Volume

Once crawler families are clean, score them on four operating signals:

SignalHealthy patternRisk pattern
URL qualityCanonical pages, docs, blog posts, product pagesParameters, search results, admin paths, duplicate URLs
Response healthMostly 200 and useful 301Repeated 404, 5xx, redirect loops
CostModerate bytes on HTMLHeavy media downloads, repeated cache misses, bursty asset crawling
Business valueVisits to indexable pages and useful contentMostly low-value paths with no clear visibility upside

This makes the review operational instead of ideological.

Step 7: Turn The Findings Into A Policy

Your last step should be narrower than “allow AI” or “block AI.”

SituationBetter action
Verified crawler, healthy URLs, manageable costAllow and monitor
Useful crawler, but noisy duplicate pathsAllow with narrower path rules
User-triggered access on important public pagesKeep access open and improve page quality
Unverified or abusive trafficRate-limit or block
High-cost crawling on assets or private pathsRestrict those paths, not the whole public site

For a narrower decision on training access, use the GPTBot decision framework. For on-page crawl controls, compare the logs with Robots.txt Checker, Canonical Checker, Sitemap Checker, and Technical SEO Audit.

Crawler grouping matrix for log analysis

Common Failure Modes

This is where teams usually misread the data:

Failure modeWhat usually went wrongBetter check
”Googlebot” traffic looks hugeRaw user-agent strings were trusted without verificationUse reverse DNS or Google IP ranges first
OpenAI traffic looks inconsistentOAI-SearchBot, GPTBot, and ChatGPT-User were merged into one bucketSeparate search, training, and user-triggered fetches
Cloudflare shows violations after a new ruleThe dashboard compares current directives with past requestsRecheck the rule date before calling it non-compliance
Search Console totals do not match logsCrawl Stats is Google-only and may differ from server logsTreat it as Google context, not a full crawler ledger
Byte cost looks scaryStatic assets or cache-miss paths were mixed into the reviewSplit HTML, media, parameters, and locale paths

Crawler action scorecard for weekly reviews

A Weekly Review Checklist

Use this checklist for recurring reviews:

  1. Export the last 7 days of crawler traffic.
  2. Separate verified bots from unverified user agents.
  3. Split search, training, and user-triggered traffic.
  4. Rank requested paths by volume and bytes.
  5. Check 2xx, 3xx, 4xx, and 5xx rates by crawler family.
  6. Compare top requests with canonical and sitemap coverage.
  7. Recheck policy changes against logs one week later.

That is usually enough to catch the expensive mistakes: fake bot traffic, duplicate URL waste, broken locale paths, and crawler rules that hide the wrong content.

Next Action With Fennec

If you want a fast first pass, do this in order:

  1. Use Bot Simulator on the top five HTML URLs from your log export.
  2. Validate crawler rules in Robots.txt Checker.
  3. Confirm duplicate control with Canonical Checker.
  4. Check sitemap coverage in Sitemap Checker.
  5. Use Audit or GSC Management to connect crawl behavior with broader indexing patterns.

Privacy & Cookies

We use cookies to enhance your experience. By continuing to visit this site you agree to our use of cookies.