Measured resultThe experiment was run and the numbers below are ours. The environment, sample and limitations are stated so the result can be challenged.

Original research

Who Actually Crawls a Developer Documentation Site

Fifteen days of server logs from a 129-page documentation site: 90.9% of requests were not people, and AI assistants fetched more than every search engine combined.

The question

On a small, new technical documentation site, what proportion of HTTP requests come from people, and how does AI-assistant crawling compare to search-engine crawling?

Written by
The Copilot Stack Editorial Team
Published
Last verified
Reading time
3 min

What was measured

45,085 parsed nginx access-log entries from thecopilotstack.com between 20 August and 4 September 2026 — the complete log retention window. One site, 129 indexable pages, no advertising and no inbound links from other domains. 126 malformed lines were excluded.

Environment

  • nginx 1.24.0 access logs, complete retention window
  • Site: 129 indexable static pages, no CDN in front of origin
  • Classification: scripts/ops/traffic-report.mjs in this repository
  • Window: 2026-08-20T12:33Z to 2026-09-04T05:34Z
/research/who-crawls-a-docs-site/

Everyone quotes a bot-traffic percentage. Almost nobody publishes their logs.

Here are ours: fifteen days, 45,085 parsed requests, one small technical documentation site with no backlinks and no advertising.

The headline

90.9% of requests were not people.

ClassRequestsShareAddresses
AI assistants11,31725.1%181
Search engines10,15622.5%658
The site’s own indexer5,68912.6%1
Vulnerability scanners5,16411.5%359
Social unfurlers4,95711.0%25
Unverified4,0839.1%1,173
Automation (curl, headless)1,0982.4%98
Other declared bots1,0612.4%79
Forged browser strings7471.7%167
SEO backlink crawlers4090.9%194
No user agent4040.9%132

AI assistants fetched more than every search engine combined — 11,317 against 10,156, a ratio of 1.11×.

Why the “unverified” figure is the honest one

It would be easy to write “9.1% human traffic” and it would be wrong.

Classification here is by user-agent string, which is self-reported. A crawler that declares itself is easy to count; one that copies Chrome’s string is indistinguishable from Chrome at the log level. The forged-browser bucket (1.7%) contains only the obvious forgeries — Internet Explorer 6, Opera 7, Windows CE, Android 2.x, each arriving from a single address several hundred times. Software nobody has run in a decade is a spoof. A current Chrome string is not detectable this way at all.

This is why the site’s human numbers come from JavaScript analytics rather than from logs. A crawler that executes JavaScript and reports a plausible user-agent is a much smaller population than one that does neither.

The scanner floor

11.5% of requests were vulnerability scanners: roughly 3,600 probes for /wp-login.php, /.env, /.git/config and similar, from 359 addresses.

This site is a static Astro build with no WordPress, no PHP and no .env anywhere in its output. The probes are indiscriminate and constant, and they arrived within days of the domain first resolving.

A detail worth knowing if you serve a static site with a trailing-slash rule: each probe cost two requests. A request for /.env was 301-redirected to /.env/ before returning 404. Answering with a single 444 instead halves the traffic and removes the redirect from the logs.

What we did and did not block

We block scanners, SEO backlink crawlers and forged ancient user-agents.

We deliberately do not block AI assistants, despite them being the single largest class. Two reasons, and only one of them is philosophical:

The practical one is that Perplexity and Google Gemini already appear as referrers in our analytics, sending real readers. Blocking the crawler removes the citation that produces the visit.

The other is that a documentation site exists to be read. An answer engine quoting a page correctly, with attribution, is the site working — not the site being stolen from.

That is a judgement, not a finding, and a site whose revenue depends on pageviews would reasonably reach the opposite conclusion from the same numbers.

Top AI crawlers by request count

Claude-User (1,803), ChatGPT-User (1,794) and OAI-SearchBot (1,550) led, with GPTBot, PerplexityBot, Perplexity-User, ClaudeBot and Bytespider behind them.

The split between the -User agents and the indexing agents is the interesting part: a -User fetch is generally made because a person asked a question right then, which is closer to a visit than to a crawl.

Raw data

The complete classified dataset is published as JSON — every class, request count, byte total and distinct-address count, with the window and the methodology in the envelope.

Limitations

What this cannot tell you. Stated in the frontmatter so it cannot be dropped in an edit.

  • One site. A 129-page GitHub Copilot documentation site is a specific target and these proportions will not transfer to a consumer site, an e-commerce site, or an established site with backlinks.
  • Classification is by user-agent string, which is self-reported and trivially forged. The 'unverified' bucket at 9.1% almost certainly contains further bots; it is a ceiling on human traffic, not a count.
  • The site's own indexer accounts for 12.6% of requests. We have excluded it from no figure and label it separately, but it inflates the total.
  • Fifteen days spanning a period when the site was being actively built and deployed. Crawl rates on a stable site would differ.
  • We cannot distinguish an AI crawler indexing for training from one fetching to answer a live user question, beyond what the user-agent declares.

Reproduce this

Run `npm run ops:traffic` in this repository against the nginx logs, or `npm run ops:traffic -- --json` for the machine-readable form. The classifier's rules are in scripts/ops/traffic-report.mjs and its ordering is documented there — user-agent identity is decided before any path heuristic, because every AI crawler in this log fetched a probe-shaped URL at least once and classifying those by path would have booked ClaudeBot and PerplexityBot as vulnerability scanners.

Raw results: /research-data/crawler-traffic-2026-09.json

Sources

Every version-sensitive claim on this page was checked against first-party documentation. Only sources actually used are listed.

Primary sources

Cite this research

Free to use, republish and build on. A link back is appreciated and is not a condition. The one thing we ask is that theverification date travels with the numbers — several of these figures change monthly, and a table with no date on it becomes misinformation within a quarter however accurate it was when copied.

Plain citation

The Copilot Stack. "Who Actually Crawls a Developer Documentation Site." Version 2026-09-04. https://thecopilotstack.com/research/who-crawls-a-docs-site/ (verified 2026-09-04).

Markdown

[The Copilot Stack — Who Actually Crawls a Developer Documentation Site](https://thecopilotstack.com/research/who-crawls-a-docs-site/) (verified 2026-09-04)
BibTeX
@misc{copilotstack_research-who-crawls-a-docs-site_2026,
  title        = {Who Actually Crawls a Developer Documentation Site},
  author       = {{The Copilot Stack}},
  year         = {2026},
  note         = {Version 2026-09-04. Maintained research, not peer reviewed},
  howpublished = {\url{https://thecopilotstack.com/research/who-crawls-a-docs-site/}},
  urldate      = {2026-09-04}
}

@misc rather than @article or@dataset, and the note records that this is a maintained research that has not been peer reviewed. Formatting it as a journal reference would imply a review process that did not happen.

Licence. Free to reuse for any purpose, including commercially. This is original work by The Copilot Stack — the method, the harness and the results — and it has not been peer reviewed.

All research