Why UA matching isn't enough
User-agent strings are client-controlled text — spoofing one takes a single curl flag. Common Crawl itself warns that spoofers impersonate CCBot. Scrapers routinely borrow reputable bot names to slip past naive allow-lists, and some bots (Bytespider is widely reported to) rotate user agents entirely. The analyzer is a UA-string first pass: fast and useful for triage, never proof.
The verification method
- Match the source IP against the vendor's published range. Most major AI vendors publish their crawler IPs as JSON (table below). A genuine hit falls inside a published CIDR — we've RDAP-confirmed a real GPTBot hit inside OpenAI's published 74.7.241.0/25 on a production site we operate before trusting it wasn't a spoofer.
- No published list? RDAP/rDNS the IP.
rdap.org/ip/<addr>(orwhois) shows who owns the block — a "Googlebot" from a residential ISP is a spoofer. Reverse DNS helps where vendors document it: Google resolves to*.googlebot.com, Applebot to*.applebot.apple.com— then forward-confirm the hostname resolves back to the same IP. - Treat unverifiable bots accordingly. Some crawlers (Bytespider, cohere-ai, Diffbot) publish no IP ranges at all. You can't positively verify them — decide policy on the assumption that any such UA may be anyone.
Published IP lists (20 bots)
Field note: what a UA-spoofing scanner actually looks like
Observed on this site, 2026-08-15 (Cloudflare edge logs): the site took 621 client-error requests in a day, and the eight most common user-agent strings on those errors were all AI-crawler names — Amazonbot, Amzn-SearchBot, GPTBot, ChatGPT-User, OAI-SearchBot, PerplexityBot, ClaudeBot, Google-Extended — each of them appearing on the same credential-probe paths, i.e. one scanner rotating borrowed names. The tell wasn't the UA, it was the paths: /.env, /.aws/credentials, /wp-admin/install.php, /.gcloud/credentials, /actuator/configprops — credential probes no real crawler fetches. Every request got a 404/405. Two lessons that generalize: (1) a UA-only crawler report would have shown a surge of "AI crawler interest" that was one hostile scanner, and (2) the Google-Extended hits were spoofed by definition (gotcha #2 below) — the fastest single filter you have.