AI search news ·
Is the GPTBot in your server logs really OpenAI? A vulnerability scanner wore 6 AI-crawler user-agents for 22 requests in 4.5 seconds — and was every 'Google-Extended' fetch we ever logged
At 18:19:56 UTC on 2026-08-21, a scanner in Singapore made 22 requests to this site in 4.5 seconds — for `/.env`, `/.git/HEAD`, `/.aws/credentials`, `/etc/passwd` and the like — and on each request wore one of six AI-crawler user-agent strings: GPTBot, ChatGPT-User, OAI-SearchBot, Google-Extended, Amazonbot and Amzn-SearchBot. Our server-side crawler ledger classifies requests by user agent, so it booked all 22 as genuine vendor fetches. Google's own crawler documentation says that one of those six strings does not exist: "Google-Extended doesn't have a separate HTTP request user agent string." Here is the burst request by request, what each vendor says a real request looks like, what the scanner did to a week of crawler counts, and the correction we shipped.
The burst, request by request
| UTC (2026-08-21) | Path requested | User-agent worn | Booked by the ledger as |
|---|---|---|---|
| 18:19:56.518 | /@fs/proc/self/environ | GPTBot/1.4 | openai / crawl |
| 18:19:57.007 | /.git/HEAD | Google-Extended/1.0 | google / crawl |
| 18:19:57.034 | /.git-credentials | ChatGPT-User/1.0 | openai / user |
| 18:19:57.034 | /.env.local | GPTBot/1.4 | openai / crawl |
| 18:19:57.037 | /app/.env | OAI-SearchBot/1.3 | openai / crawl |
| 18:19:57.045 | /@fs/proc/self/environ | Amazonbot/0.1 | amazon / crawl |
| 18:19:57.065 | /media../etc/passwd | ChatGPT-User/1.0 | openai / user |
| 18:19:57.081 | /static../.aws/credentials | OAI-SearchBot/1.3 | openai / crawl |
| 18:19:57.167 | /@fs/home/ec2-user/.aws/credentials | ChatGPT-User/1.0 | openai / user |
| 18:19:57.169 | /static../etc/passwd | Google-Extended/1.0 | google / crawl |
| 18:19:57.235 | /.env | Amzn-SearchBot/1.0 | amazon / crawl |
| 18:19:57.242 | /@fs/etc/passwd | GPTBot/1.4 | openai / crawl |
| 18:19:57.495 | /proc/self/environ | Amazonbot/0.1 | amazon / crawl |
| 18:19:57.513 | /@fs/root/.aws/credentials | Google-Extended/1.0 | google / crawl |
| 18:19:57.728 | /.aws/credentials | Google-Extended/1.0 | google / crawl |
| 18:19:57.769 | /media../.env | Amzn-SearchBot/1.0 | amazon / crawl |
| 18:19:57.779 | /@fs/etc/passwd | Amazonbot/0.1 | amazon / crawl |
| 18:19:57.886 | /.env | GPTBot/1.4 | openai / crawl |
| 18:19:58.004 | /static../.env | Amzn-SearchBot/1.0 | amazon / crawl |
| 18:19:58.129 | /files../etc/passwd | Amazonbot/0.1 | amazon / crawl |
| 18:20:00.390 | /.mcp.json | Amzn-SearchBot/1.0 | amazon / crawl |
| 18:20:01.029 | /@fs/proc/1/environ | OAI-SearchBot/1.3 | openai / crawl |
Method: the ledger is edge middleware that records every bot-shaped user agent before any JavaScript runs, with the request path, the edge's country code and a timestamp; rows are classified into vendor and kind by a user-agent token table. Every row above carries the edge country SG and falls inside 4,511 milliseconds. The 22 paths are the standard shopping list of a secrets scanner — environment files, git metadata, cloud credentials, `/etc/passwd` through path-traversal tricks (`/media../`, `/static../`, `/@fs/`) — and not one is a page this site has ever served. The ledger stored no IP address at the time, so the burst is named by country and timing rather than by address; that gap is part of what we fixed, below. The full row set is saved machine-readable beside this post.
What the vendors say a real request looks like
- Google: the 'Google-Extended' user agent does not exist. Google's common crawlers page, read today: "Google-Extended doesn't have a separate HTTP request user agent string. Crawling is done with existing Google user agent strings; the robots.txt user-agent token is used in a control capacity." Google-Extended is a name you put in robots.txt to control AI training use; it never appears in a request. The string the scanner wore — `Mozilla/5.0 (compatible; Google-Extended/1.0; +http://www.google.com/bot.html)` — is an invention, and every one of the four rows our ledger has ever booked under it came from this burst. Google's verification page gives the real test: "Run a reverse DNS lookup on the accessing IP address from your logs, using the host command. Verify that the domain name is either googlebot.com, google.com, or googleusercontent.com" — or match the address against the published `googlebot.json` (315 prefixes, regenerated 2026-08-21).
- OpenAI publishes an IP list per bot. The OpenAI crawler overview lists a 'Published IP addresses' JSON for each agent: `gptbot.json` (21 prefixes), `searchbot.json` (35) and `chatgpt-user.json` (204, regenerated 2026-08-14). Two of the scanner's three OpenAI strings match OpenAI's documented examples character for character (GPTBot/1.4 and ChatGPT-User/1.0); the third, `OAI-SearchBot/1.3`, is shorter than the documented string and one version behind it — a weak tell at best, since OpenAI notes the version number may change. The strong test is the address, and a Singapore scanner is not in those lists.
- Amazon publishes one too. The Amazonbot page gives an example string and a 'Published IP Addresses' page for each of Amazonbot, Amzn-SearchBot and Amzn-User. The scanner's Amazon strings are truncated versions of the documented ones (no `Chrome/… Safari/…` tail) and carry a version Amazon does not document for Amzn-SearchBot (1.0 vs 0.1). Again: suggestive, not proof. The address is the proof.
What 22 requests did to a week of counts
| User-agent token | Rows, 7 days to 08-22 16:40Z (gross) | Net of the scanner | Scanner share |
|---|---|---|---|
| Google-Extended | 4 | 0 | 100% |
| Amzn-SearchBot | 6 | 2 | 67% |
| GPTBot | 11 | 7 | 36% |
| Amazonbot | 129 | 125 | 3% |
| OAI-SearchBot | 131 | 128 | 2% |
| ChatGPT-User | 198 | 195 | 2% |
| All bot-shaped rows | 1,524 | 1,502 | 1.4% |
The damage is proportional to how rare the real thing is. ChatGPT-User and OAI-SearchBot fetch this site hundreds of times a week, so three fake rows barely move them. GPTBot — the training crawler, the one most robots.txt debates are about — fetched this site 7 times this week, so four fakes made it 11, a 57% overstatement. In the 24-hour window our analyst reads each morning (08-21 09:37Z to 08-22 09:37Z) the per-vendor figures moved from 245 rows to 223: google/crawl 4 to 0, openai/crawl 23 to 16, openai/user 39 to 36, amazon/crawl 39 to 31. Every one of the 'Google-Extended fetches' that window reported was the scanner.
Why this matters if you care about AI visibility
- Every 'GPTBot traffic' chart built from user-agent strings — ours and everyone's — carries this contamination. Crawler-traffic reports from analytics vendors and CDNs classify by user agent unless they say otherwise. The error is small for high-volume agents and large for the rare ones, which are exactly the agents people make decisions about. If a report says a training crawler fetched your site a handful of times, ask whether the rows were address-verified before you block anything or celebrate anything. We reported how fast each AI crawler fetches a new page three days ago from the same ledger; those rows were page fetches on real paths and none match the scanner shape, but the instrument that produced them was blind to this until yesterday.
- 'Google-Extended' in a request log is a tell, not a data point. Google says the string does not exist. A log row carrying it is a third party naming Google — usually a scanner or a scraper hoping a Google name gets it past a WAF rule. The same logic applies to any robots.txt-only token that shows up as a user agent.
- A user-agent string is a claim; the address is the evidence, and the evidence is free. Google, OpenAI and Amazon each publish the address ranges their crawlers use, in machine-readable form, refreshed on a schedule. Verifying costs a lookup. Our fix: the ledger now tags any request whose path matches a secrets/traversal shape as spoofed, excludes those rows from every count by default, and stores the request's /24 on spoofed rows only — so the next burst is named by address, not just by country. A backfill over 1,525 stored rows flagged exactly the 22 above and nothing else. The fetch-versus-index story in yesterday's post on Googlebot and new posts is unaffected: that count was of Googlebot page fetches on real paths, and no spoofed row carries a Googlebot string.
Limits
One small site and one burst — n=22 rows on a 5.7-day-old ledger of 1,524 bot-shaped rows, a 1.4% contamination rate that says nothing about yours. The ledger only records bot-shaped user agents, so a scanner wearing a browser string is invisible to it, and this burst is the one we caught, not the population. No IP was stored for these 22 rows, so 'Singapore' is the edge's country code and the attribution to a scanner rests on the paths and the 4.5-second cluster, which we consider conclusive for these paths but cannot corroborate by reverse DNS. The tells in the user-agent strings (versions, truncation) are noted because they were there, not because they are a test; the vendors' address lists are the test. Nothing here says any of the three vendors did anything — the point is that their names were borrowed, and that a user-agent-only instrument cannot tell. The IbouBot and PetalBot post from the same ledger stated the same UA-only limit two days ago; today is what the limit looks like when it bites. If you want to know whether the engines that really do crawl you are naming your business when customers ask, run a free check.
How do I verify that a GPTBot request really came from OpenAI?
Check the request's IP address against OpenAI's published list for that agent — gptbot.json for GPTBot, searchbot.json for OAI-SearchBot, chatgpt-user.json for ChatGPT-User — all linked from OpenAI's crawler documentation. A matching user-agent string on its own proves nothing; anyone can send one.
Does Google-Extended have a user-agent string?
No. Google's documentation states that Google-Extended doesn't have a separate HTTP request user agent string; it is a robots.txt token only, and Google's crawling is done with its existing user agents such as Googlebot. A request log row naming Google-Extended as its user agent did not come from Google.
How much AI-crawler traffic in a server log is fake?
On this site, over the 7 days to 2026-08-22, 22 of 1,524 bot-shaped requests (1.4%) were a single scanner wearing six AI-crawler strings — but the share was 36% of GPTBot rows, 67% of Amzn-SearchBot rows and 100% of Google-Extended rows, because fakes matter most where the real agent is rare. Your number depends on your traffic; the only way to know is to verify addresses against the vendors' published ranges.
See your number
See which businesses AI names when your client's buyers ask.
Running this for clients? The $249 agency 5-pack audits five businesses, white-labeled.
Who runs this
- Built and operated by Sensara LLC, Atlanta, Georgia — about us and how the audit works.
- See what the report looks like before you run anything — score per engine, the competitors AI names instead of you, and a fix plan.
- We run the same audit on ourselves every week and publish the result: in the latest run AI named AskedAbout in 1 of 144 answers. We report our own numbers the way we report yours.