Server Log Bot Verification
Any client can send a Googlebot user agent string, and on most public sites a meaningful share of the hits claiming to be one are scrapers, monitoring tools and AI crawlers wearing the name. Crawl budget work built on an unverified log is wrong before the analysis starts, and firewall rules written from it block the wrong things. This applies whenever logs are the evidence, and always before anyone blocks a crawler at the edge.
FORMAT
server-log-bot-verification.md
WHEN TO REACH FOR THIS
Use when crawl analysis, a bandwidth spike or a proposal to block a crawler rests on log lines that say Googlebot, and nobody has checked whether they were.
The skill file
server-log-bot-verification.md
---
name: server-log-bot-verification
description: Use when crawl analysis, a bandwidth spike or a proposal to block a crawler rests on log lines that say Googlebot, and nobody has checked whether they were.
---
# Server Log Bot Verification
Any client can send a Googlebot user agent string, and on most public sites a meaningful share of the hits claiming to be one are scrapers, monitoring tools and AI crawlers wearing the name. Crawl budget work built on an unverified log is wrong before the analysis starts, and firewall rules written from it block the wrong things. This applies whenever logs are the evidence, and always before anyone blocks a crawler at the edge.
## What you need first
- Raw access logs with IP, user agent, status, bytes and timestamp, 14 days minimum and unsampled
- The ability to run reverse and forward DNS lookups from the log host, or the published IP ranges for the crawlers you care about
- robots.txt plus any CDN or WAF bot rules already in force
- A list of which crawlers matter commercially, search and AI assistants kept separate
## Method
1. Group requests by distinct user agent string with counts and bytes. Sorting by claimed identity first is what makes the impersonation visible at all.
2. Verify every hit claiming to be a search crawler by reverse DNS on the IP, then forward-resolve the returned hostname and confirm it maps back to the same IP. Where reverse DNS is not offered, match against the operator's published IP range file, refetched rather than remembered.
3. Tag each request verified, unverified or other, and keep the unverified set rather than deleting it. It is your scraping and load picture, and it is the only place a spoofer is visible.
4. Recompute crawl frequency, crawl depth and status distribution on the verified segment only. Every conclusion about crawl budget comes from this segment and no other.
5. Quantify what the unverified traffic actually costs in origin response time, 5xx rate under load and bandwidth. Rate-limit where the source may still be a tool someone relies on, and reserve outright blocking for volume that is demonstrably hurting the origin.
6. Decide AI and training crawlers separately from search crawlers, and write down the reason. This is genuinely contested: allowing them buys visibility in assistant answers that may never send a click, blocking them protects content that is being used without return, and neither position is settled.
7. Repeat after 30 days. Impersonators change user agent, legitimate crawlers change IP ranges, and a verification done once decays into a false sense of a clean log.
## What this produces
A verified-crawler log segment, a per-crawler allow, rate-limit or block decision with its stated reason, and the residual unverified traffic quantified in requests and bandwidth.
## Where this goes wrong
- Verifying by user agent, or against an IP range file downloaded months ago, so a scraper stays inside your crawl budget numbers and outside your rate limits
- Blocking at the WAF before trying a robots.txt Disallow, which turns a crawler that would have obeyed a rule into a stream of 403s you now have to explain
- Sampling one day in seven, since crawl arrives in bursts and a sampled day is either all burst or no burst
- Reading a Googlebot string from a cloud hosting range as proof of interference, when third-party emulators and testing tools send the same string legitimately
---
From the QuQi skill library - https://www.quqi.io/skills/server-log-bot-verification
Free to download · no account, no email
What you need first
-
Raw access logs with IP, user agent, status, bytes and timestamp, 14 days minimum and unsampled
-
The ability to run reverse and forward DNS lookups from the log host, or the published IP ranges for the crawlers you care about
-
robots.txt plus any CDN or WAF bot rules already in force
-
A list of which crawlers matter commercially, search and AI assistants kept separate
Method
-
01
Group requests by distinct user agent string with counts and bytes. Sorting by claimed identity first is what makes the impersonation visible at all.
-
02
Verify every hit claiming to be a search crawler by reverse DNS on the IP, then forward-resolve the returned hostname and confirm it maps back to the same IP. Where reverse DNS is not offered, match against the operator's published IP range file, refetched rather than remembered.
-
03
Tag each request verified, unverified or other, and keep the unverified set rather than deleting it. It is your scraping and load picture, and it is the only place a spoofer is visible.
-
04
Recompute crawl frequency, crawl depth and status distribution on the verified segment only. Every conclusion about crawl budget comes from this segment and no other.
-
05
Quantify what the unverified traffic actually costs in origin response time, 5xx rate under load and bandwidth. Rate-limit where the source may still be a tool someone relies on, and reserve outright blocking for volume that is demonstrably hurting the origin.
-
06
Decide AI and training crawlers separately from search crawlers, and write down the reason. This is genuinely contested: allowing them buys visibility in assistant answers that may never send a click, blocking them protects content that is being used without return, and neither position is settled.
-
07
Repeat after 30 days. Impersonators change user agent, legitimate crawlers change IP ranges, and a verification done once decays into a false sense of a clean log.
What this produces
A verified-crawler log segment, a per-crawler allow, rate-limit or block decision with its stated reason, and the residual unverified traffic quantified in requests and bandwidth.
Where this goes wrong
-
Verifying by user agent, or against an IP range file downloaded months ago, so a scraper stays inside your crawl budget numbers and outside your rate limits
-
Blocking at the WAF before trying a robots.txt Disallow, which turns a crawler that would have obeyed a rule into a stream of 403s you now have to explain
-
Sampling one day in seven, since crawl arrives in bursts and a sampled day is either all burst or no burst
-
Reading a Googlebot string from a cloud hosting range as proof of interference, when third-party emulators and testing tools send the same string legitimately
Use this skill in your own AI
The download is a plain markdown file with the name and trigger in its frontmatter. Where an assistant supports skills it can load itself, that frontmatter is what it reads to decide this one applies.
Claude Code
Save it as ~/.claude/skills/server-log-bot-verification/SKILL.md and Claude loads it on its own when what you are doing matches the trigger line. Put it in .claude/skills inside a project instead if the whole team should have it.
Claude
Upload the file in the skills section of your settings. Once it is there it applies itself in any conversation where the trigger fits, so you do not have to remember it exists.
ChatGPT
There is no skills format to install into, so paste the file contents into a Project instruction or a Custom GPT instead. It then applies to every chat in that project rather than only the one you paste it into.
Anything else
Paste the markdown into the chat before your question. It works in any assistant, it just has to be pasted again each time.
Questions about this skill
When do I verify crawlers rather than filter the log on the user agent string?
Before any conclusion drawn from logs, and always before anyone blocks a crawler at the edge. Filtering on the Googlebot user agent string is the common shortcut, and any client can send that string. On a public site a meaningful share of those hits are scrapers, monitoring tools and AI crawlers wearing the name, so the analysis is wrong before it starts.
What do I need in hand before starting?
Raw access logs with IP, user agent, status, bytes and timestamp, fourteen days minimum and unsampled, the ability to run reverse and forward DNS from the log host, and the robots.txt plus any CDN or WAF bot rules already in force. Sample one day in seven and you catch either all burst or no burst. Miss the existing WAF rules and you misread a blocked crawler as an uninterested one.
What do I end up with, and which part gets used?
A verified-crawler log segment, an allow, rate-limit or block decision per crawler with its reason written down, and the residual unverified traffic quantified. The verified segment is what gets used, since crawl frequency, crawl depth and status distribution all have to be recomputed on it. The AI crawler decisions are genuinely unsettled either way, which is why the recorded reason matters more than the verdict.
What is the mistake that ruins this, and what does it cost?
Verifying against a published IP range file downloaded months ago, or not verifying at all, so a spoofer stays inside your crawl budget numbers and outside your rate limits. Refetch the range file each run. The other one is blocking at the WAF before trying a robots.txt Disallow, which turns a crawler that would have obeyed a rule into a stream of 403s someone has to explain.
More in Technical SEO