Free, open source, runs on your machine

See what AI agents are doing on your site.

Legacy analytics platforms only focus on humans. But AI agents are crawling your pages, reading them to answer questions, and then deciding what to cite. None of this shows up in your analytics. Until now.

$ npx agenttraffic ./logs --days 7Quick startGitHub
$ npx agenttraffic ./logs --days 7
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   AGENTTRAFFIC · 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 FROM YOUR LOGS  ·······························································
  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

Nothing to install on your site. Point it at the log 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

Why logs

Your server already keeps the record. Analytics just never reads it.

Every visit to your site, human or agent, leaves a line in your server log. Analytics tools skip the agents. agenttraffic starts from the log, so nothing is skipped.

Analytics sees

  • People whose browser ran the tracking script
  • Referrers the browser chose to send
  • Nothing from an AI agent or crawler

Your logs see

  • Every AI agent: ChatGPT, Claude, Perplexity, Google
  • Whether each one was really who it claimed to be
  • Links shared in private chats, via the preview fetch
  • Readers who block tracking scripts

How it works

One command on the logs you already have

  1. STEP 01

    Point it at your logs

    CloudFront, nginx or Apache. Files, folders or a whole S3 bucket. Nothing to install on your site, and it works on last month's traffic today.

    npx agenttraffic ./logs --days 7
  2. STEP 02

    Every agent gets checked

    Anyone can claim to be ChatGPT. Each request is checked against the IP addresses the operator actually publishes, so fakes are counted separately from the real thing.

    ChatGPT-User 90 verified · 20 spoofed
  3. STEP 03

    Read the report

    One screen: which agents came, which pages they read, and what else your analytics missed. JSON output if you want to build on it.

    npx agenttraffic ./logs --json

01

Honest numbers

Some agents hide, and one question can trigger several fetches. So every count is a minimum, and the report says what was measured, never what it might mean.

02

Real or fake

A request that says ChatGPT might not be. Requests inside the operator's published IP addresses are verified. Outside them, they're marked as fakes. When an operator publishes nothing, the report says so instead of guessing.

03

Nothing leaves your machine

It runs on your computer, on your logs. No account, no tracking, and IP addresses are never written out.

Registry

Every agent, explained

One page per AI agent: who runs it, what it's for, how to tell a real visit from a fake, and how to block it if you want to.

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?

Run npx agenttraffic on your server logs. The report lists every AI agent it found by name (ChatGPT, Claude, Perplexity and the rest), how many times each one came, which pages it read, and whether the requests came from the operator's real IP addresses. Analytics tools can't show you this because AI agents never run the tracking script.

What does GPTBot in my logs mean, and how is it different from ChatGPT-User?

GPTBot is OpenAI's training crawler; ChatGPT-User is the live fetch made when a person asks ChatGPT about a page; OAI-SearchBot builds the search index behind ChatGPT search. They are three different agents with three different meanings for your site, and blocking one does not block the others. Read the comparison.

Is a request that says it is ChatGPT really from ChatGPT?

Not always. Anyone can put any name in a request. agenttraffic checks each one against the IP addresses the operator publishes and keeps three answers apart: verified (inside the published addresses), fake (outside them) and unverified (the operator publishes no addresses, so there is nothing to check against). Requests with no usable client IP are marked not checked, with the reason.

Which log formats does it read?

CloudFront standard logs (both the current and the older format), plus the common and combined formats written by nginx, Apache and most other servers. Files, folders and wildcards, gzipped or not, and a fetch command that pulls a date range straight from an S3 bucket. More CDNs and hosts are planned.

Is any of my data sent anywhere?

No. The report is computed on your machine and there is no tracking. IP addresses are used in memory to verify agents and estimate distinct visitors, and are never written to the output. Only two commands touch the network, and only when you run them: update, which downloads fresh IP address lists, and fetch, which downloads logs from your own bucket.

Why are counts labelled as floors instead of visitors?

Because a log cannot prove a person. One question to an assistant can trigger several fetches, some crawlers do not announce themselves, and some requests are fakes. So any number that could be inflated or under-counted is labelled a floor, meaning at least this many, and the report says what was measured rather than what it might imply.

How is this different from Google Analytics or Plausible?

Those tools count people whose browser loaded their script. Logs count every request your server answered: AI agents, search crawlers, link previews from Slack and iMessage, readers with ad blockers, scanners and broken links. agenttraffic does not replace your analytics. It shows the traffic your analytics was never built to see.

Can I get the data as JSON?

Yes. Pass --json (or --json=report.json) to get a JSON file instead of the terminal report. The format is versioned and documented, so you can build on it without it changing under you. See the docs.

Roadmap

Get a weekly report in your inbox

The command-line tool is free and stays free. A hosted version that emails you each week is on the roadmap. Leave your email and you'll hear once, when it exists.