{
  "slug": "bot-hits",
  "name": "Bot hits",
  "aliases": [
    "Crawl hits",
    "Bot requests",
    "Crawl volume"
  ],
  "definition": "The number of requests a named crawler made to your origin in the period, counted from server logs.",
  "category": "Crawl and logs",
  "type": "raw measure",
  "unit": "log requests",
  "direction": "neutral",
  "verification": "verified",
  "calculation": "A row count over the server-log records matching the bot filter and date range. In the semantic layer it is a plain count measure over the log table.",
  "aggregation": "Sums across rows. One page fetched twice contributes two.",
  "grain": "One count per bot per date range, or one count per bot per day, week or month when a granularity is requested.",
  "dimensions": [
    "bot_type",
    "date"
  ],
  "requiredFilters": [
    "date_range"
  ],
  "sources": [
    "server-logs"
  ],
  "reports": [
    "ai-bot-activity-report",
    "crawl-log-report",
    "internal-linking-report",
    "technical-seo-audit-report"
  ],
  "skills": [
    "ai-crawler-readiness",
    "crawl-efficiency-review",
    "technical-health-audit"
  ],
  "verbs": [
    "ai_crawler_analysis"
  ],
  "rungs": [
    "R1"
  ],
  "levers": [
    "L1"
  ],
  "questions": [
    "Are AI crawlers reaching our content?",
    "Which bots crawl us most?",
    "Has GPTBot activity changed?"
  ],
  "interpretation": "Evidence of what your origin actually served, which no other source can supply, everything else infers crawling. It counts requests, not pages and not coverage, so a rising number can mean broader reach or the same handful of pages fetched more often.",
  "caveats": [
    "Requests, not pages. Read it beside the unique-pages figure before calling it coverage.",
    "The answer-engine bot list is a hardcoded user-agent token set covering GPTBot, ChatGPT-User, PerplexityBot, ClaudeBot, Claude-Web, Google-Extended, CCBot and Bytespider. Google-Extended is a robots token with no user agent, so that entry can never match a request. The list is documented in code as drifting on a timescale of months, so a bot that renamed or launched since will be missing.",
    "Matching is on the declared user agent. Only Googlebot has an IP verification path; there is no address verification for any AI bot, so an AI-bot count includes anything that claimed the name.",
    "Logs record what your origin served, so a request answered by a CDN edge may never appear. Absence of a bot is evidence your logs do not have it, which is a weaker claim than it never came.",
    "Crawl activity is not visibility: fetch counts are never presented as citations.",
    "The tool checks the log feed is populated before reading and returns a plain note when it is not, rather than an empty result."
  ],
  "freshness": "hours to nightly, depends on how logs are shipped; the card carries the ingestion time.",
  "failureModes": [
    "Presenting fetch counts as AI visibility or as citations.",
    "Concluding a bot is blocked because it is absent from the logs.",
    "Reading a hit count as pages reached."
  ],
  "notSameAs": [
    {
      "slug": "crawler-readiness",
      "why": "Observed visits are what was fetched. Readiness is whether the pages you want cited are reachable, indexable and linked, a composition that is not implemented; no tool crosses log hits with indexability and orphan status."
    },
    {
      "slug": "unique-pages-crawled-by-bots",
      "why": "Hits count requests; unique pages count distinct URLs. A large hit count over a small page set is a crawl-budget finding, not a coverage one."
    },
    {
      "slug": "verified-vs-spoofed-googlebot",
      "why": "Hit counts are matched on the declared user agent alone. Only the verification split establishes whether a requester was who it claimed to be, and it does so for Googlebot only.",
      "mirroredFrom": "verified-vs-spoofed-googlebot"
    },
    {
      "slug": "crawl-depth",
      "why": "Depth is what the crawl graph says is reachable; hits are what a bot actually fetched. Conflating the two is how a team concludes a page is fine because it could in principle be crawled.",
      "mirroredFrom": "crawl-depth"
    }
  ],
  "related": [
    "unique-pages-crawled-by-bots",
    "status-code-hits",
    "verified-vs-spoofed-googlebot",
    "crawler-readiness"
  ],
  "workflows": [],
  "lastVerified": "2026-08-04"
}