Skip to content

Build1 publisher3 min readPublished

A log audit can only catch the nine AI agents that send an HTTP request

Google-Extended and Applebot-Extended are robots.txt tokens that never issue a request, so the nine agents OpenAI, Anthropic and Perplexity document are the only AI traffic a WordPress site can confirm for itself.

The Engineer · Build desk

Illustration accompanying A log audit can only catch the nine AI agents that send an HTTP request

What happened

  • OpenAI documents four agents, Anthropic three and Perplexity two, giving nine user agent strings that actually send requests a WordPress install can match against.
  • OpenAI says robots.txt rules may not apply to ChatGPT-User because a user starts the action, and Perplexity says its user fetcher generally ignores those rules for the same reason.
  • On a WordPress 7.1 test install, a must-use plugin hooked to template_redirect recorded a GPTBot request within the same second, and a Chrome user agent left no trace.

Compiled by The EngineerSomething wrong?How this is made

Why it matters

  • constraint Whether a Google-Extended or Applebot-Extended opt-out is honoured cannot be checked from your own server, because there is no request to compare the token against. Verification stops at the vendor's word.
  • decision On any site with a full-page cache, choosing PHP-level logging means accepting a count of cache misses. Shell access and the server access log give the complete figure.
  • exposure A page excluded from training sets stays reachable by the user-triggered fetchers, and the owner finds out about those visits only by keeping a log.
  • cost Trusting a logged name means resolving the IP against each vendor's published JSON ranges, an extra lookup per visit for anyone who wants the count to survive scrutiny.

Drop the file in wp-content/mu-plugins/ and it hooks template_redirect at priority 1, then runs a case-insensitive substring match of the request's user agent against nine names [12]. A hit writes to a single option, ai_crawler_log, saved with autoload switched off so ordinary page loads never load it, capped by array_slice at the last 500 visits, with the loop stopping at the first matching name [13]. Reading it back is one command, wp option get ai_crawler_log --format=json [15]. On a local WordPress 7.1 install a request sent with the GPTBot string appeared in the option within the same second, while a Chrome agent left no trace [14].

The nine come from three vendor pages. OpenAI documents four: GPTBot for training material, OAI-SearchBot for the ChatGPT search index, ChatGPT-User for fetches a person asks for, and OAI-AdsBot for pages submitted as ads [4]. Anthropic documents three, split the same way, with ClaudeBot on training data and Claude-User and Claude-SearchBot on live questions and search [6]. Perplexity runs two [7]. Four plus three plus two is the nine strings in the array [21].

That split matters more than the count. Anthropic's help page says its bots "respect 'do not crawl' signals by honoring industry standard directives in robots.txt" [9]. OpenAI writes that ChatGPT-User "is not used for crawling the web in an automatic fashion" and that "robots.txt rules may not apply", because a user starts the action [10]. Perplexity's guide is plainer about Perplexity-User: "Since a user requested the fetch, this fetcher generally ignores robots.txt rules" [11]. Two of the nine names are documented by their own vendors as not necessarily bound by robots.txt [22]. A Disallow line can keep a page out of a training set, and the same page can be fetched for a ChatGPT user five minutes later [19].

Then the two names in every guide. Google's crawler documentation says Google-Extended "doesn't have a separate HTTP request user agent string" [2]. Apple's Applebot page says "Applebot-Extended does not crawl webpages" [3]. Both are opt-out tokens that cannot be checked from the server side, because there is no request to log [1]. The write-up says these are among the names robots.txt guides list most often; it does not measure how many published blocklists or log audits rest on them.

Two more names circulate in templates that Anthropic's own page does not list, anthropic-ai and Claude-Web [8].

The PHP approach has a blind spot worth knowing before you ship it. When a full-page cache answers the request, WP Rocket or a CDN edge, WordPress never starts and the visit is not recorded, so a PHP log on a cached site shows cache misses only [17]. The server access log catches those hits, and a grep pipeline counts the same nine names in one pass [16]. In my view, if you have shell access, build that counter first. Either way the name in the string is self-reported: any script can call itself GPTBot. The vendors publish their IP ranges as JSON, openai.com/gptbot.json among them [18]. The author of the write-up develops Prime SEO, a WordPress plugin that includes a log like this, and says every user agent was checked against vendor documentation on September 21, 2026, and that the code runs without any plugin [20].

What to watch

  • Whether Anthropic's documentation ever describes Claude-User as a user-started fetcher outside robots.txt, as OpenAI and Perplexity do for theirs.
  • Whether Google or Apple publish a signal for the Extended tokens that a site owner can observe from the server side.
  • Whether the vendor IP-range JSON files stay current enough to use as the identity check on a logged user agent.
Loading claim ledger
Loading source directory links
Loading share composer
Loading topic controls
Loading related stories