CDN and server logs, read locally
See the traffic analytics cannot: AI agents, private shares, unmeasured readers.
agenttraffic reads the logs your CDN already writes and reports which AI agents fetched your pages, verified against the IP ranges their operators publish, plus the link previews that reveal private sharing and the visitors your analytics script never counted. Open source, local, no telemetry.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ EDGE · EXAMPLE.COM 7 days ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2026-08-18T04:00:00.000Z → 2026-08-25T04:00:00.000Z (America/New_York) IP ranges shipped, 5 days old AI CRAWLERS ··········································································· ChatGPT-User OpenAI live-fetch 90 14p 20 spoofed, 10… PerplexityBot Perplexity search 10 12p 30 unchecked live-fetch = a person just asked an assistant about the page primary number = requests verified against published provider IP ranges unchecked = no range data (rDNS-only provider) or no usable client IP 1 training / ops crawler hidden (--show-training) SEARCH CRAWLERS ······································································· Googlebot 30 5 spoofed, 25 unche… SPOOFED UA MATCHES recognised bot UA, IP outside the published range ················· ChatGPT-User 20 ip-range Googlebot 5 ip-range PAGES ASSISTANTS FETCHED live-fetch + search ········································· / 35 /app 27 MEASURED AT THE EDGE ·································································· requests 1200 browser requests 800 500 page fetches, 210 distinct IPs bot ua matches 300 130 verified spoofed 25 bot UA, IP outside published range unclassified 45 neither browser- nor bot-shaped cache hit 75.0% 4xx / 5xx 110 / 5 scanner probes 60 PHP/CMS probes, all 4xx asset probes 9 nested image 404s, CMS logo scans devtools opened 3 distinct IPs (7 source-map 404s) REFERRERS external, browser page fetches ············································· news.ycombinator.com 40 www.google.com 40 t.co 10 350 no referrer · 55 internal navigation · 5 unparseable of the no-referrer fetches, 100 (29%) are shared links SHARED LINKS ?preset= page fetches, not shares ······································ https://example.com/app?preset=abc123 70 https://example.com/app?preset=def456 50 LINK PREVIEWS links pasted into chat apps (floor) ···································· Facebook / iMessage 30 12 urls Slack 15 6 urls Discord 5 3 urls BROKEN LINKS 404s, excluding probes ·················································· /old-page 12 /feed 4 OTHER BOTS unrecognised agents, worth a look ········································· AhrefsBot 25 python-requests 5 UNCLASSIFIED neither browser- nor bot-shaped ········································· curl 30 Go-http-client 15 excluded from the split: UptimeRobot 30 NOTES ················································································· Perplexity has been documented crawling with undeclared user agents; verified count is a floor. iMessage unfurls arrive as facebookexternalhit and Twitterbot; they are counted under Facebook / iMessage. Gemini training traffic arrives as Googlebot and is inside this row. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Log sources
Reads the logs your stack already writes
No agent to install and nothing to change at the edge. Point it at the files you already have.
- CloudFrontstandard logs, v2 and legacy
- S3fetch a window straight from the bucket
- NGINXcombined format
- Apachecombined format
- Any CLF logcommon or combined, gzip too
- CloudflaresoonLogpush
- VercelsoonLog Drains
- NetlifysoonLog Drains
- Fastlysoonreal-time logging
- AkamaisoonDataStream
- CaddysoonJSON access logs
The gap
Analytics counts browsers that run its script. Logs count everything.
AI assistants, crawlers, and link unfurlers never execute JavaScript, and a growing share of readers block it. The edge log is the only record that sees them all.
Analytics script sees
- Browsers that loaded the tag
- Referrers the browser chose to send
- Sessions, if consent was given
- Nothing from a bot, an assistant, or an unfurler
The edge log sees
- Every request: ChatGPT-User, Claude, Perplexity, Googlebot
- Which agents are real, verified against published IP ranges
- Link previews from Slack, iMessage and Discord: private shares
- Readers who blocked the script, scanners, broken links, cache hits
How it works
Three steps, nothing installed, nothing sent
STEP 01
Point it at your logs
CloudFront standard logs (v2 or legacy), nginx or Apache combined format. Files, directories, globs, gzip. Or fetch straight from S3.
npx agenttraffic ./logs --days 7STEP 02
Every bot UA gets checked
Each recognised agent is matched against the IP ranges its operator publishes. Verified, spoofed and unchecked are never added together.
ChatGPT-User 90 verified · 20 spoofedSTEP 03
Read the report
One screen: which agents fetched what, where links were shared, and what your analytics script never counted. JSON output for anything else.
npx agenttraffic ./logs --json
01
Floors, not totals
Every count that can be spoofed, stealth-crawled or fanned out is labelled a floor. The report says "fetch events", never "people asked".
02
Verified, unverified, spoofed
A bot UA is checked against the IP ranges its operator publishes. The three outcomes stay separate; a range that was never published is not the same as a spoof.
03
Local by default
Client IPs are used in memory for verification and distinct estimates and never written out. Network access only in the commands that ask for it.
Registry
Which agents read your site
One page per user agent: the exact UA strings, how to verify it, and what its hits mean.
- agents in the registry
- 54
- operators
- 33
- with published IP ranges
- 15
- IP range snapshot
- 2026-08-28
Guides
Telling the agents apart
By kind: Live fetch, AI search, Training, Search engine, Operational, Link unfurl
FAQ
Straight answers
How do I know if ChatGPT, Claude or Perplexity is reading my site?
What does GPTBot in my logs mean, and how is it different from ChatGPT-User?
Is a bot user agent in my logs actually that bot?
Which log formats does it read?
Is any of my data sent anywhere?
Why does the report say "fetch events" and "floor" instead of visitors?
How is this different from Google Analytics or Plausible?
Can I get the data as JSON?
Roadmap
Weekly: which agents read your site
A hosted weekly report is on the roadmap. Leave an email to hear when it exists; nothing else is sent.