BackCrawlers

How to Detect and Verify GPTBot, ClaudeBot and PerplexityBot

Detect GPTBot, ClaudeBot and PerplexityBot by user agent, then verify source IPs against official feeds. Set separate rules for training, search and fetches.

Panagiotis Visilias

Nov 13, 2026 · 6 min read

Painted evening desk with laptop log lines, three robot figurines, a magnifying glass and tea

Detect GPTBot, ClaudeBot and PerplexityBot by reading the request's full user agent at your server or edge. Verify the source IP against the matching vendor feed before trusting that identity. Then choose access rules for training, search and user requests separately.

How do you detect which crawler requested a page?

Start with one request, rather than a total labeled “AI traffic.” Keep its timestamp, hostname, path, response status, full user agent and source IP together.

A user-agent string is a claim that another client can copy. Matching a bot name identifies a candidate; checking its network address adds the vendor's documented origin check.

Look for these identities before choosing a feed:

Claimed identityPurposeReference
GPTBotContent collection for possible model trainingGPTBot user agent and IP ranges
ClaudeBotContent collection for possible model trainingClaudeBot user agent and IP ranges
PerplexityBotSearch discovery and linksPerplexityBot user agent and IP ranges

OpenAI's example contains GPTBot/1.4, and Perplexity's contains PerplexityBot/1.0. Both vendors say versions may change in their OpenAI and Perplexity crawler documentation.

Use the documented token instead of requiring one fixed browser wrapper or version. Anthropic documents ClaudeBot, but Aiola's directory marks its full sample string as unverified.

Keep the original header when creating a shorter bot label. That lets you inspect future changes without losing the evidence behind an earlier classification.

How do you verify crawler IPs against official feeds?

Select the feed for the claimed identity, then test whether the source address belongs to a published CIDR range. Searching for an exact address string can miss a valid address inside a larger range.

Request claimsOfficial feed
GPTBotOpenAI GPTBot JSON
ClaudeBot, Claude-SearchBot or Claude-UserAnthropic bots JSON
PerplexityBotPerplexityBot JSON

These feeds expose a prefixes list containing ipv4Prefix entries. Read the current feed instead of copying addresses from an old article or screenshot.

Follow this sequence for each request:

  1. Take the source address from the server or edge record for that request.
  2. Fetch the official feed matching its claimed bot identity.
  3. Parse each CIDR with an IP address library and test network membership.
  4. Save the matching prefix, feed URL, feed timestamp and time of your check.
  5. Keep unmatched requests separate for investigation before changing access rules.

Anthropic's crawler guidance says an address on its published list indicates an Anthropic crawler. The shared list cannot distinguish ClaudeBot from Claude-User; retain the user agent alongside the match.

Likewise, do not assume different OpenAI feeds have no overlapping prefixes. A matching range supports the origin check without identifying the request's purpose by itself.

If nothing matches, check the address you captured and whether your saved feed is current. Record “unverified” rather than turning a failed comparison into a confirmed vendor identity.

Refresh stored ranges when the official feeds change. Perplexity explicitly recommends combining the user agent and the appropriate IP list in firewall rules.

These sources publish IP feeds for the bots covered here. This workflow uses those feeds rather than assuming a reverse-DNS suffix establishes identity.

How should you handle search bots and user fetchers separately?

GPTBot is not OAI-SearchBot, and ClaudeBot is not Claude-SearchBot. Keep their search identities separate when reading requests or writing access rules.

Use OAI-SearchBot user agent and IP ranges with OpenAI's search feed. Use Claude-SearchBot user agent and IP ranges with Anthropic's shared feed.

User fetchers need their own checks:

OpenAI says robots.txt may not apply to ChatGPT-User requests because a user initiated them. Perplexity says its user fetcher generally ignores robots.txt for that reason. Anthropic says its documented bots honor robots.txt, including Claude-User.

For the OpenAI distinction, see OAI-SearchBot vs GPTBot vs ChatGPT-User.

If your policy allows public search but excludes training collection, merge these groups into your existing robots.txt:

User-agent: GPTBot
Disallow: /

User-agent: ClaudeBot
Disallow: /

User-agent: OAI-SearchBot
Allow: /

User-agent: Claude-SearchBot
Allow: /

User-agent: PerplexityBot
Allow: /

Perplexity describes PerplexityBot as a search bot, rather than a foundation-model training crawler. It belongs with search access in this example.

Add your own excluded paths to each allowed group. Specific groups do not inherit a wildcard group's exclusions, as the AI bots robots.txt guide explains.

Preserve existing sitemap lines and unrelated groups. Read the served /robots.txt after deployment, and check each hostname separately. Keep private content behind application access controls; robots.txt expresses crawl preferences.

How does Aiola record crawler requests and help agents fix failures?

Aiola crawler analytics records recognized crawler requests through a server or edge snippet. Many crawlers skip browser JavaScript, so the browser tag alone misses those requests.

Choose the implementation for your stack in the Analytics setup guide. It sends matching requests with the public tracking ID, hostname, path and user agent. Country and response status are optional fields.

Send the actual status where your capture point can observe it. An omitted status defaults to 200, so a recorded success can reflect missing status data.

The snippet recognizes user agents; that classification is separate from your source-IP verification. Keep the address check in your server or edge investigation.

Open Analytics, then AI, to inspect bots, pages, crawl activity and crawler 404s. Ask your coding agent to investigate affected URLs, check redirects and propose a fix. Review the diff and relevant checks before publishing, then inspect fresh requests.

A crawl record does not prove that an assistant cited your page. An empty period means no matching event arrived, rather than proving the vendor cannot reach your site.

Try it in Aiola

Your coding agent can read crawler evidence alongside the repository and turn a failed page into a proposed fix. Aiola brings building, running and supporting products into one app; hosted Analytics is part of Pro. Download Aiola to keep production evidence within your agent's reach.

Common questions

More from the blog

Everything your agents need, in one app

Errors, user feedback, GitHub and analytics live next to your coding agents. Every issue becomes a task an agent can take.