Bot traffic
Bot request share, top user-agents and detection on the Cloudflare edge — based on UA regex, not botScore.
Overview#
Bot traffic data comes from Cloudflare GraphQL Analytics, not GA4/GSC.
Note: /dashboard/mkit/bots redirects to the crawl page; the Bot cards actually appear in the mKit overview, and when Cloudflare is not connected they prompt you to "Connect Cloudflare".
Detection#
Bot detection is based purely on UA regex (classifyBot) and does not use the Cloudflare botScore:
| kind | UA keywords |
|---|---|
| seo_crawler | ahrefs, semrush, mj12, dotbot, screaming |
| llm_trainer | gptbot, claudebot, ccbot, anthropic, google-extended, perplexity |
| search_engine | googlebot, bingbot, yandexbot, baiduspider, duckduck |
| other | Everything else; filtered out and excluded from bot_requests / top_bots |
Note: The UI copy says "Top bot user-agents (botScore)", but the implementation never uses the botScore field — detection is UA regex only.
Metric definitions#
Key definitions:
- bot_requests is the sum of Top UA hits classified by classifyBot as not "other" (count / sampleInterval).
- bot_pct = bot_requests / requests * 100; the denominator is all HTTP requests, not pageviews.
- top_bots comes from the httpRequestsAdaptiveGroups userAgent dimension, top 10, then reclassified; the mKit overview takes only the top 5.
- uniques is an estimate of pageviews * 0.62, not a real deduplicated visitor count.
- cache.saved_bytes is an estimate of bytes * 0.7.
Limits#
Limits:
- History: Free/Pro 14 days, Business/Enterprise 30 days.
- The real query always returns history_days = 14 (mock returns 30).
- avg_edge_ms / avg_origin_ms / p95_* are fixed at 0 in the real query.
- The site must be hosted on CF DNS with a bound zone; otherwise cfContext returns null.
- Bot data has no plan gating — it is shown whenever Cloudflare is connected.
Related docs#
- Edge comparison: /edge-comparison
- Data latency & metric definitions: /data-latency