From Sanskriti Khandelwal | Product & Market Analysis
AI Agent Traffic Is in Your Logs: How to Spot ChatGPT, Perplexity and Gemini
On this page
Cloudflare measured AI "user action" crawling, the fetches an assistant makes when a person asks it something, rising over 21x between January and early December 2025. Most of that AI agent traffic never appears in Google Analytics. It sits in your server logs under names like ChatGPT-User and Perplexity-User, and four vendors now publish enough documentation to count it properly.
Key takeaways
- AI agent traffic is a different object from AI crawler traffic. OpenAI, Perplexity, Google and Anthropic each document a separate user agent for fetches triggered by a person's question, and each says or implies that robots.txt may not govern those fetches.
- The verification lists are uneven, and one is a year old. OpenAI's ChatGPT-User file listed 234 IPv4 prefixes on 20 October 2026. Perplexity's Perplexity-User file listed 4 prefixes and carried a creation time of 17 October 2025.
- GA4 is structurally blind to most of it. Vercel found in December 2024 that ChatGPT-User and the other major AI fetchers do not execute JavaScript, so no tag fires, and GA4 excludes known bots without showing how many it removed.
- The fastest growing agents are the hardest to see. Agentic browsers such as ChatGPT Atlas present a standard Chrome user agent, and Google signs only a subset of Google-Agent requests, so a log filter undercounts by design.
The short answer
To identify AI agent traffic, match the user agent tokens ChatGPT-User, Perplexity-User, Google-Agent and Claude-User in your server or CDN logs. Then confirm each hit against the vendor's published IP file, or a Web Bot Auth signature where one exists. GA4 will not show these fetches, because they do not run your tag.
What AI agent traffic is, and why it is not crawler traffic
A crawler fetches pages on its own schedule, to train a model or to build a search index. An agent fetches a page because one person, a few seconds earlier, asked a question that needed it. Those two visits share a server but they mean different things for your business.
The robots.txt question, which bots to let in, is a separate decision with its own economics. That trade is covered in the analysis of which AI crawlers to block and which to allow. This post assumes you have made that call and now want to measure what is actually arriving.
Three kinds of AI visit
The first is the user-triggered fetch. A person asks ChatGPT, Perplexity or Claude about a product, and the assistant pulls your page to answer. Your server sees one request, usually for HTML only, with a declared user agent.
The second is agent browsing. A product such as ChatGPT agent or Google-Agent navigates your site on a user's behalf, clicking and filling forms. Some of these sign their requests cryptographically, and some do not.
The third is the human click from an AI answer. A person reads a cited answer and clicks through in their own browser. This is the only one of the three that behaves like a normal visit, and the only one GA4 is designed to see.
Why the distinction changes your numbers
Cloudflare's 2025 review defines user action as crawling that "visits Web sites in response to user questions posed to a chatbot." It reports that this category started 2025 with the lowest volume of the three declared purposes and then grew faster than either training or search.
Cloudflare also states that the growth "maps very closely to the traffic trends seen for OpenAI's ChatGPT-User bot." It found peak ChatGPT-User request volumes as much as 16x higher than at the start of the year, with a weekday pattern that suggests workplace use.
My position is that this is the most commercially interesting bot traffic on a B2B site. A training crawl tells you nothing about demand. A ChatGPT-User fetch of your pricing page tells you a person asked a question your pricing page answers, today.
The documented AI agent user agents, by vendor
Every entry below comes from the vendor's own documentation, read on 21 October 2026. Version numbers inside user agent strings change, so match on the token, never on the full string.
| Vendor | Token to match | Job | robots.txt | Verification |
|---|---|---|---|---|
| OpenAI | ChatGPT-User | User-initiated fetches in ChatGPT, Custom GPTs and GPT Actions. | "May not apply," per OpenAI. | openai.com/chatgpt-user.json |
| OpenAI | OAI-SearchBot | Indexing for ChatGPT search. | Applies. Changes take about 24 hours. | openai.com/searchbot.json |
| OpenAI | GPTBot | Crawling for model training. | Applies. | openai.com/gptbot.json |
| OpenAI | ChatGPT agent | Agent browsing on a user's behalf. | Not stated in the crawler page. | Signed requests, Signature-Agent header. |
| Perplexity | Perplexity-User | Fetches a page to answer a user's question. | "Generally ignores" robots.txt. | perplexity.com/perplexity-user.json |
| Perplexity | PerplexityBot | Indexing for Perplexity search, not model training. | Applies. | perplexity.com/perplexitybot.json |
| Google-Agent | Agents on Google infrastructure acting on a user request. | User-triggered fetchers "generally ignore" it. | user-triggered-agents.json, plus signatures on a subset. | |
| Google-GeminiNotebook | Fetches URLs a user added as sources. Replaces Google-NotebookLM. | Generally ignored. | user-triggered-fetchers-google.json | |
| Anthropic | Claude-User | Fetches a page when a person asks Claude a question. | Anthropic says its bots honour robots.txt. | claude.com/crawling/bots.json |
| Anthropic | Claude-SearchBot, ClaudeBot | Search indexing, and training collection. | Honoured, including Crawl-delay. | Same single file. |
Sources: OpenAI, Perplexity, Google and Anthropic crawler documentation, each read 21 October 2026. Anthropic's help article lists the three bot names but gives no full user agent strings. Google's list states that it "is not exhaustive."
Three details in that table are easy to miss. Anthropic is the only one of the four that says its user-triggered fetcher honours robots.txt. OpenAI and Perplexity both describe their user fetchers as exempt in some cases. Google says the same of its entire user-triggered class.
Google's list also shows how fast the names move. The former Google-NotebookLM token was supported only until August 2026, so any filter written last year already misses Gemini Notebook fetches. That one rename is the strongest argument for reviewing your classification list every quarter.
The Gemini app itself is the awkward case. Google documents no fetcher called Gemini-User. Google-Agent covers agent actions and Google-GeminiNotebook covers sources, while ordinary Gemini answers draw on Google's search index. I would not invent a Gemini row in your dashboard until Google documents one.
Verifying a ChatGPT-User or Perplexity-User request is real
A user agent is a string the client chooses. Anyone can send "ChatGPT-User" from a laptop, and scrapers do exactly that to borrow a trusted name. Treat the user agent as a claim and the source IP or signature as the evidence.
Published IP lists, and how fresh they are
All four vendors publish JSON files of source addresses. The files share one shape, a creationTime field and a list of prefixes, which means a single script can check all of them.
The files are not equally maintained. On 21 October 2026, OpenAI's ChatGPT-User file held 234 IPv4 prefixes created the previous day. Perplexity's Perplexity-User file held 4 prefixes with a creation time of 17 October 2025, a full year earlier.
A small, old list is not proof that it is wrong. It may simply be that Perplexity's user fetches leave from a few fixed addresses. It does mean you should log failed verifications rather than drop them, so you can see whether real Perplexity traffic is arriving from addresses the file does not cover.
Web Bot Auth signatures
IP lists break when vendors route agents through cloud browsers and shared infrastructure. The replacement is Web Bot Auth, an IETF draft built on HTTP Message Signatures, RFC 9421. The agent signs each request and adds a Signature-Agent header pointing to its public key directory.
Cloudflare described the mechanism in May 2025 and quoted an OpenAI engineer saying "OpenAI signs all Operator requests". In August 2025 Cloudflare named ChatGPT agent in its first cohort of signed agents, alongside Goose from Block, Browserbase and Anchor Browser.
Google followed with a narrower commitment. Its Web Bot Auth page, updated 13 October 2026, says "a subset of requests made by the Google-Agent are signed", with the identity https://agent.bot.goog. Google tells you to fall back to IP verification for the rest. If you run on Cloudflare, Akamai or Vercel, your CDN may already validate these signatures, so check its bot logs before writing your own verifier.
Segmenting AI agent traffic in server logs
Your raw access logs, or your CDN's request logs, are the only place this traffic is recorded in full. The method is a classification column added at ingest, not a one-off grep.
A classification you can paste
Match tokens case-insensitively, and map each one to a job rather than to a vendor. The job is what you will report on, because "user fetch" and "training crawl" answer different questions.
user_fetch: ChatGPT-User|Perplexity-User|Claude-User|Google-GeminiNotebook|Google-NotebookLM
agent: Google-Agent (plus any request carrying a Signature-Agent header)
search_idx: OAI-SearchBot|PerplexityBot|Claude-SearchBot
training: GPTBot|ClaudeBot|CCBot|Google-Extended
Google-Extended is a robots.txt token and does not appear in logs as its own user agent, so expect zero hits on that last entry. It is listed so nobody wastes a morning wondering why it is missing.
Then add a second column called verified, set to true only when the source IP falls inside that vendor's current file or a signature validates. Refresh the files daily. OpenAI regenerated its file the day before this post was written.
What to count once it is segmented
Count unique URLs fetched by the user_fetch class per week, not raw hits. One question in ChatGPT can trigger several fetches, so raw hits inflate quickly and tell you little.
The most useful report is a ranked list of which pages user agents fetch. On most B2B sites I would expect pricing, comparison and integration pages to lead, but that is a hypothesis for you to test, not a finding. If your blog posts dominate instead, your product pages are probably not answering the questions buyers ask assistants.
Join that list against the pages that receive AI referral clicks in analytics. The pages fetched often but clicked rarely are being read and summarised without a visit. That gap is the measurable part of what the post on zero-click search metrics describes from the search side.
| Visit type | Server or CDN logs | GA4 or other tag-based analytics |
|---|---|---|
| Training and search crawlers | Visible by token. Verifiable by IP. | Not visible. No JavaScript runs, and known bots are excluded. |
| User-triggered fetch | Visible by token. Verifiable by IP, with uneven list quality. | Not visible. The page is fetched as HTML and the tag never fires. |
| Signed agent browsing | Visible through the Signature-Agent header where present. | Partly visible if the agent runs a real browser, and then unlabelled. |
| Agentic browser such as ChatGPT Atlas | Looks like Chrome. Not separable by user agent. | Counted as a normal Chrome session. |
| Human click from an AI answer | Visible as a referrer, when one is passed. | Visible in the AI Assistant or Referral channel. |
Why GA4 sees almost none of the AI bot traffic
Marketing teams usually start in GA4 because that is where the dashboards are. For AI agent traffic that is the wrong starting point, for two separate reasons that compound.
Fetches never fire a tag
GA4 records a visit when its JavaScript runs in a browser. Vercel tested this directly in December 2024 and reported that "none of the major AI crawlers currently render JavaScript", naming ChatGPT-User explicitly. ChatGPT and Claude fetchers did download JavaScript files, but did not execute them.
Even if a fetcher did run your tag, GA4 would discard it. Google's help page states that "traffic from known bots and spiders is automatically excluded", and that you cannot see how much was excluded. So GA4 cannot tell you the volume even in principle.
The AI Assistant channel covers clicks, not fetches
What GA4 can see is the third kind of visit, the human click. Google's default channel group now contains an AI Assistant channel for "sources like ChatGPT, Gemini, Deepseek, Copilot, or Grok", which excludes Google's own AI Overviews and AI Mode.
That default depends on a referrer arriving. Several agency analyses report that ChatGPT appends utm_source=chatgpt.com to cited links without a utm_medium, which can drop a click into Unassigned instead. I have not verified that behaviour from an OpenAI source, so check your own landing page report for the parameter before acting on it.
If you need a view that also captures those tagged clicks, build a custom channel group. Google allows 2 custom groups on a standard property and 5 on 360. Its help page says traffic lands in "the first channel whose definition it matches," so place your AI rule above Referral. Custom groups also apply retroactively, which makes this a low-risk change. How the three main analytics tools handle questions about this data is compared in the review of AI chat inside GA4, Amplitude and Mixpanel.
The AI agents that do not announce themselves
Everything above depends on the visitor telling the truth about what it is. The fastest growing category does not, and in most cases that is by design rather than deception.
ChatGPT Atlas, OpenAI's Chromium browser, launched on 21 October 2025. Simon Willison reported the same day that its user agent was identical to the latest Google Chrome on macOS, and Kick Point's independent test found the same. Adobe's analytics guidance describes Atlas traffic as indistinguishable from other Chromium browsers by user agent alone.
That is a reasonable design choice. A browser that announces itself as an AI agent gets blocked by sites with blanket bot rules, and the person using it is a real customer. The cost is that your logs record a human Chrome session when an agent may be doing the clicking. The governance questions that raises for corporate buyers are covered in the comparison of admin controls in agentic browsers.
Undeclared crawlers and borrowed names
The less benign case is a fetcher that hides its origin. In August 2025 Cloudflare published an investigation attributing undeclared crawling that presented as Chrome on macOS to Perplexity, which disputed the finding. Whatever the truth of that case, it shows the limit of any method based on declared names.
The reverse problem is just as common. Scrapers send "ChatGPT-User" to slip past rules that trust AI fetchers. If your verified column shows a large share of claimed ChatGPT-User hits failing the IP check, you are looking at impostors, and they should not count toward any AI visibility metric.
My position is to report three numbers rather than one: verified agent fetches, claimed but unverified fetches, and human clicks from AI answers. Collapsing them into a single "AI traffic" line hides exactly the failures you need to see.
Where this measurement method is weakest
This post gives you a method for counting what declares itself. That is a real improvement on GA4 alone, and it still undercounts in ways you should state whenever you report the number.
The growth figure is not your growth figure. Cloudflare's 21x comes from its own network across 2025, and its own post gives two different multiples, over 15x in the heading and over 21x in the body. The number shows direction across a large sample. It says nothing about the share of your traffic, which could be far lower on a niche B2B site.
A fetch is not a reader. One ChatGPT-User request may serve one person, or the answer may be cached and reused. No vendor publishes how many users a single fetch represents, so you cannot convert fetches into audience. Treat the count as an index of attention, not a head count.
The JavaScript finding is nearly 2 years old. Vercel's test dates from December 2024. Agent products that drive real browsers do execute JavaScript, and the user fetchers may change. Re-test by serving a page with a client-side-only marker and checking whether it ever reaches your analytics.
The strongest competing view is that this is not worth the effort. If AI referral clicks are already visible in GA4 and they convert, a marketing team might reasonably ignore fetch volume entirely. I think that view loses on B2B sites, because the buying decision now often happens inside the answer. It would win on a site whose only goal is the click, and the evidence on how those clicks convert is set out in the analysis of AI referral conversion multiples.
Frequently asked questions
What is the ChatGPT-User user agent?
ChatGPT-User is the user agent OpenAI uses when ChatGPT, a Custom GPT or a GPT Action fetches a page because a person asked for it. OpenAI says it is not used for automatic crawling and not used to decide what appears in ChatGPT search. OpenAI also says robots.txt rules may not apply to it, and publishes its source addresses at openai.com/chatgpt-user.json for verification.
What is the Perplexity user agent?
Perplexity documents two. PerplexityBot indexes pages for Perplexity search and, the company says, is not used to train foundation models. Perplexity-User fetches a page when someone asks Perplexity a question, and Perplexity says it generally ignores robots.txt because a user requested the fetch. Each has its own published IP file, and the Perplexity-User file was dated October 2025 when checked a year later.
Does Google Analytics 4 track AI bot traffic?
No. GA4 records visits when its JavaScript tag runs, and Vercel's 2024 tests found that the major AI fetchers, including ChatGPT-User, do not execute JavaScript. GA4 also excludes known bots automatically and does not show how many it removed. What GA4 does track is human clicks from AI answers, which its default AI Assistant channel groups when a recognised referrer is passed.
How do I find AI agent traffic in server logs?
Search your access or CDN logs for the tokens ChatGPT-User, Perplexity-User, Claude-User, Google-Agent and Google-GeminiNotebook, matching case-insensitively and ignoring version numbers. Tag each match with its job, such as user fetch, search index or training. Then verify the source IP against the vendor's published JSON file, or validate a Web Bot Auth signature, and report verified and unverified hits separately.
Can AI agents be identified if they look like Chrome?
Not reliably from the user agent. ChatGPT Atlas was found at launch to send the same user agent as desktop Chrome, so it appears as a normal browser session in logs and analytics. Signed agents are the exception, because they add a Signature-Agent header you can validate. For unsigned agentic browsers, behavioural signals are the only remaining evidence, and none of them is conclusive.
How do I verify a request really comes from ChatGPT?
Check the source IP against OpenAI's published file for that bot, such as chatgpt-user.json for ChatGPT-User or searchbot.json for OAI-SearchBot. Refresh the file often, because OpenAI regenerates it frequently. For ChatGPT agent, validate the HTTP message signature using the Signature-Agent header instead. A request that claims an OpenAI user agent but fails both checks should be treated as an impostor.
How to start measuring this week
Pull 7 days of raw request logs from your server or CDN and run the four-class classification above against them. Rank the pages the user_fetch class requested. That single list tells you which of your pages assistants are reading on behalf of buyers, and it takes about an hour.
Then add the verified column before anyone builds a dashboard on the numbers. If more than a small share of claimed ChatGPT-User hits fail the IP check, fix that first, because an AI traffic report full of impostors is worse than having no report. When the counts hold up, feed them into the structure set out in the guide to building an AI visibility dashboard.
Related measurement
Fetch counts are one half of the picture. The other half is the buying activity that leaves no click at all, covered in the analysis of dark discovery and attribution.
References
- OpenAI, Overview of OpenAI crawlers, read 21 October 2026, with the IP file openai.com/chatgpt-user.json (creationTime 20 October 2026). Used for OpenAI user agents, purposes, robots.txt statements and the prefix count.
- Perplexity, Perplexity crawlers, read 21 October 2026, with perplexity-user.json (creationTime 17 October 2025). Used for Perplexity user agents and the prefix count.
- Google, List of Google user-triggered fetchers, last updated 19 August 2026, and Web Bot Auth, last updated 13 October 2026. Used for Google-Agent, Google-GeminiNotebook, IP files and signing.
- Anthropic, Does Anthropic crawl data from the web, dated 7 April 2026, with claude.com/crawling/bots.json. Used for Claude bot names and verification.
- Cloudflare, Radar 2025 Year in Review, December 2025. Used for user-action growth, ChatGPT-User peak volume and AI share of HTML requests.
- Cloudflare, The age of agents: cryptographically recognizing agent traffic, 28 August 2025, and Forget IPs: using cryptography to verify bot and agent traffic, 15 May 2025. Used for Web Bot Auth and signed agents.
- Vercel, The rise of the AI crawler, 17 December 2024. Used for JavaScript rendering findings.
- Google Analytics Help, Default channel group, Custom channel groups and Known bot-traffic exclusion, read 21 October 2026. Used for the AI Assistant channel, group limits and bot exclusion.
Weakest part of the source base: the traffic volumes come from one infrastructure vendor's network, and the claim that ChatGPT appends utm_source parameters rests on agency analyses rather than an OpenAI document. User agent lists and IP files change monthly, so every token and count here is dated 21 October 2026.
Related reading