July 19, 2026 · AxioRank
How to block fake ChatGPT bots in WordPress
Anyone can set a User-Agent to ChatGPT, so a name-based block list cannot catch impostors. Here is how to verify the real OpenAI crawlers on your WordPress site and block the fakes, without writing code.
- wordpress
- ai-bots
- bot-verification
- web-bot-auth
If a visitor tells your WordPress site it is ChatGPT, should you believe it?
Most sites do. They read the User-Agent header, see something like GPTBot or
ChatGPT-User, and treat the request as OpenAI. That instinct is exactly what a
scraper, a price bot, or a content thief counts on. The header is not identity. It
is a plain piece of text the caller typed, and it takes one line of curl to wear it.
Here is the entire toolkit for impersonating ChatGPT. No exploit, no special access, just a flag on a command anyone can run.
The naive server did nothing wrong by its own logic. It matched a name it recognized and let the request through. The problem is that the name proves nothing, so the real GPTBot and a bot pretending to be GPTBot look identical to it.
Why a block list does not work
The two reflexes most WordPress owners reach for both fail here.
The first is robots.txt. It is a polite request, not a control. A well-behaved
crawler reads it and complies. An impostor ignores it, because nothing enforces it.
If your goal is to stop bad actors, a sign on the door does not do it.
The second is a User-Agent allow list or block list, usually added through a security
plugin or a few lines in .htaccess. This is worse than it looks. Block GPTBot by
name and you punish the real OpenAI crawler you may actually want, while the impostor
simply changes one string and walks in under a different name. Allow GPTBot by name
and you have handed a skeleton key to anyone who types it.
- User-Agent: GPTBotthe real GPTBot, OpenAI's crawlerallow
- User-Agent: GPTBotan impostor, curl, a scraper, anyoneallow
Both requests send the very same header, so a name match waves both through. The forgery is invisible to it.
- GPTBot, valid signaturekey matches OpenAI's directoryverified
- GPTBot, forged signaturea key that does not check outspoofed
The real crawler signs its request with a key you can check. No valid signature, no entry, even with a flawless User-Agent.
Both requests carry the same header, so any name match treats them the same. The forgery is invisible to a check that only reads a string.
How to tell a real ChatGPT bot from a fake
There is only one reliable answer: verify a signal the caller cannot forge. The User-Agent then stops being proof and becomes a hint that tells you which check to run. Two of those signals exist today.
The strong one is a cryptographic signature. OpenAI now signs its crawler requests
using Web Bot Auth, a scheme built on HTTP Message Signatures (RFC 9421). Each request
carries an Ed25519 signature, and OpenAI publishes the matching public key at a
well-known location on its own domain,
chatgpt.com/.well-known/http-message-signatures-directory. To verify, you fetch that
key, recompute its fingerprint so you never trust a self-reported key id, and check the
signature over the request. A real GPTBot produces a valid signature. An impostor
cannot, because it does not hold OpenAI's private key. GPTBot, OAI-SearchBot, and
ChatGPT-User can all be proven this way.
The classic one is reverse DNS forward confirmation. Search engines like Google, Bing, and Apple do not sign requests, but they publish the domains their crawlers come from. You take the visitor's IP address, look up its hostname, confirm the hostname ends in the operator's domain, then resolve that hostname back and confirm it points to the same IP. An impostor can spoof a User-Agent, but it cannot make Google's DNS vouch for its IP. This is the same check that has separated the real Googlebot from fakes for years.
The flow below runs the same request through both an honest GPTBot and an impostor. Switch between them and watch where the two part ways.
A request claims to be GPTBot and attaches a Web Bot Auth signature.
Notice that the User-Agent is identical in both runs. The verdict comes entirely from what happens at the signature check.
Four verdicts, one decision
Once you verify instead of guess, every visitor lands in one of four states. Each state tells you how much proof there was, and each maps cleanly to an action you control.
The signature checks out against the operator's key, or the IP confirms by reverse DNS.
Recognized by name, with no proof behind the claim. Fine to allow, but never on trust alone.
It presented a signature or claimed an IP that did not check out. This is a forgery.
Not in the directory at all. Could be a browser, could be a brand-new crawler, could be anything.
The key move is separating spoofed from unverified. Spoofed means a proof was offered and it failed, a forgery you should block. Unverified means the agent is recognized by name but offered no proof, which is not an accusation, just an absence of evidence. Treating those two the same is how you either miss real attacks or block crawlers you wanted.
Who is actually knocking
Not every AI agent can be proven yet, and pretending otherwise leads to bad rules. The directory below is the set of agents worth recognizing, grouped by how their identity can be checked today.
- Signed (Web Bot Auth)3
- Reverse DNS3
- Name only, unproven4
| Agent | Operator | Proven by | Starting policy |
|---|---|---|---|
| GPTBot | OpenAI | Signature | Allow |
| OAI-SearchBot | OpenAI | Signature | Allow |
| ChatGPT-User | OpenAI | Signature | Challenge |
| Googlebot | Reverse DNS | Allow | |
| Bingbot | Microsoft | Reverse DNS | Allow |
| Applebot | Apple | Reverse DNS | Allow |
| ClaudeBot | Anthropic | Name only | Allow |
| PerplexityBot | Perplexity | Name only | Challenge |
| Bytespider | ByteDance | Name only | Block |
| CCBot | Common Crawl | Name only | Challenge |
Only the OpenAI crawlers and the search engines can be proven today. OpenAI publishes a signing key, so GPTBot, OAI-SearchBot, and ChatGPT-User verify cryptographically. Google, Bing, and Apple confirm by reverse DNS. The rest are recognized by name only, so you decide how far to trust them. Every policy here is a starting point you can change.
Only the OpenAI crawlers and the major search engines can be verified right now. Perplexity, for example, does not publish a signing directory yet, so the honest move is to recognize it by name and decide your own level of trust, rather than claim a certainty you do not have. As more operators adopt Web Bot Auth, more of this list moves from "name only" to "cryptographically verified."
Do this in WordPress without writing code
You do not have to build any of this. The free AxioRank Agent Verification plugin puts the whole pipeline behind a settings page. It is a thin client: when a bot-like or signed request reaches WordPress, the plugin forwards a small envelope to AxioRank, which runs the signature and reverse DNS checks and returns a verdict, and the plugin applies it locally.
Getting started takes about five minutes.
-
Install and activate the plugin from your WordPress dashboard.
-
Create a free AxioRank account, register your site as a website surface, and copy the site key it gives you. It starts with
axr_site_. -
Paste the key into the plugin's Settings tab, or set it in
wp-config.phpso it lives outside the database:// wp-config.php define( 'AXIORANK_SITE_KEY', 'axr_site_your_key_here' ); -
Press Test connection, then leave the plugin in Monitor mode for a few days. It watches and logs, and it never blocks anyone while it learns.
-
Read the Activity tab. Every checked request shows who the visitor claimed to be, whether that claim held up, the verification method, the endpoint it hit, and a one click action to allow or block.
-
Add a rule or two, then flip the site to Enforce. Now spoofed agents get a clean block page and everyone else is served.
The plugin ships a full console, not just a switch. The Rules tab lets you allow, challenge, or block by agent, by category such as scrapers or training crawlers, by verification status, or by a risk threshold. There is a WordPress dashboard glance widget, a Site Health check, and WP-CLI support for anyone who lives in the terminal:
wp axiorank status
wp axiorank activityWhat it protects, and what it does not
Being honest about the edges matters more than a bigger claim. A fully page-cached
response, served by a caching plugin or a CDN, never boots PHP, so the plugin cannot see
it. What it does see is every request that actually reaches WordPress: the REST API,
admin-ajax.php, XML-RPC, the login page, on-site search, and any page load that misses
the cache. For fully cached pages, run the same verification at your edge or CDN.
Two more guarantees are worth stating plainly. The plugin fails open: if AxioRank is slow or unreachable, requests are allowed, never blocked by accident. And it strips credentials before anything leaves your server, so cookies, passwords, and authorization headers are never sent for verification.
The takeaway
Blocking fake ChatGPT bots is not about maintaining a longer list of bad names. It is about refusing to treat a name as proof. Verify the signal an impostor cannot forge, a signature or a confirmed IP, and the fakes sort themselves out. On WordPress, that is a plugin and five minutes away.
Start with the AxioRank Agent Verification plugin, or read the WordPress verification guide for the full walkthrough.
Share this post