ClaudeBot and PerplexityBot IP addresses: the official lists and how to use them

Anthropic and Perplexity both publish the IP addresses of their bots, but the first search result for "ClaudeBot IP addresses" is a different list entirely. Here are the right files, what each bot does, and how to check a request against them.

On this page ClaudeBot: the list people get wrong

Anthropic (Claude) and Perplexity are two of the AI companies whose bots show up most often in web logs after OpenAI. Both publish machine-readable IP lists, and both split their traffic into a crawler and a user-triggered fetcher with different robots.txt behaviour. This guide covers both, starting with a common mix-up.

ClaudeBot: the list people get wrong

Search for "Claude IP addresses" and one of the top results is Anthropic's API IP addresses page. That page has a different purpose. It lists the fixed inbound and outbound addresses of the Claude API and Claude Console, so customers can write firewall rules. The outbound ones are used, for example, for MCP tool calls to external servers. It is not the list of addresses ClaudeBot crawls from.

The crawler list is linked from Anthropic's help article Does Anthropic crawl data from the web, and how can site owners block the crawler?:

  • IP list: https://claude.com/crawling/bots.json
  • What the article says about it: "If a crawler has a source IP address on this list, it indicates that the crawler is coming from Anthropic."

The file uses the familiar Google-style format. When we checked on 12 November 2026 it had a creationTime of 20 October 2026, and its first entry was 216.73.216.0/22:

json
{
  "creationTime": "2026-10-20T00:00:00Z",
  "prefixes": [
    { "ipv4Prefix": "216.73.216.0/22" },
    { "ipv4Prefix": "34.162.230.222/32" }
  ]
}

Anthropic's three bots

Anthropic's help article names three user agents, all covered by the same IP file:

User agentPurpose (Anthropic's description)If you disallow it in robots.txt
ClaudeBotCollects public web content that may be used for model trainingFuture content on your site is excluded from training datasets
Claude-UserFetches pages when a Claude user's question needs themClaude can't retrieve your content for user questions
Claude-SearchBotIndexes content to improve search responsesYour content is not indexed for Claude's search

So, as with OpenAI, you can say no to training and yes to search with two robots.txt groups:

text
User-agent: ClaudeBot
Disallow: /

User-agent: Claude-SearchBot
Allow: /

User-agent: Claude-User
Allow: /

Anthropic's note on IP blocking

The same article says that blocking Anthropic's IP addresses "may not work correctly" as an opt-out. Blocking the IPs also stops the bot from reading your robots.txt, and robots.txt is how Anthropic records the opt-out. In practice:

  • Use robots.txt to opt out of Anthropic's crawling.
  • Use the IP list to verify that a request claiming to be ClaudeBot really is, and to rate limit or log it. Don't use it as your only opt-out.

PerplexityBot and Perplexity-User

Perplexity documents two agents on its crawlers page, each with its own IP file:

User agentPurposeRobots.txtOfficial IP list
PerplexityBotSurfaces and links websites in Perplexity search results. Perplexity says it is not used to crawl content for AI foundation modelsPerplexity recommends allowing it in robots.txt so your site appears in resultsperplexitybot.json
Perplexity-UserFetches a page when a user asks Perplexity a question"Since a user requested the fetch, this fetcher generally ignores robots.txt rules."perplexity-user.json

The documented user-agent strings are:

text
Mozilla/5.0 (compatible; PerplexityBot/1.0; +https://perplexity.ai/perplexitybot)
Mozilla/5.0 (compatible; Perplexity-User/1.0; +https://perplexity.ai/perplexity-user)

Perplexity notes that the version numbers may change, so match on the bot name, not the full string.

Because Perplexity-User generally ignores robots.txt, the IP list is the only reliable way to recognise those fetches. Perplexity's crawling has also had public attention: in 2025 Cloudflare published research accusing it of crawling from undeclared IPs and user agents, and Perplexity disputed the findings. Whatever you conclude from that, the practical lesson is the same: a published IP list tells you about the declared traffic. Requests that don't match are unverified, and they are not automatically human.

Verifying a request in practice

The logic is the same for both companies. When a request claims an Anthropic or Perplexity user agent, check that the source IP is in that company's file.

A small Python helper you can call from a log processor or a web app:

python
import ipaddress
import json
import urllib.request

LISTS = {
    "anthropic": "https://claude.com/crawling/bots.json",
    "perplexitybot": "https://www.perplexity.ai/perplexitybot.json",
    "perplexity-user": "https://www.perplexity.ai/perplexity-user.json",
}

CLAIMS = {
    "ClaudeBot": "anthropic",
    "Claude-User": "anthropic",
    "Claude-SearchBot": "anthropic",
    "PerplexityBot": "perplexitybot",
    "Perplexity-User": "perplexity-user",
}

def fetch_networks(url):
    with urllib.request.urlopen(url, timeout=10) as resp:
        data = json.load(resp)
    return [ipaddress.ip_network(p.get("ipv4Prefix") or p.get("ipv6Prefix"))
            for p in data.get("prefixes", [])
            if p.get("ipv4Prefix") or p.get("ipv6Prefix")]

NETWORKS = {name: fetch_networks(url) for name, url in LISTS.items()}

def verify(ip, user_agent):
    """Returns (claimed_bot, verified) or (None, None) when no known bot is claimed."""
    claimed = next((bot for bot in CLAIMS if bot in (user_agent or "")), None)
    if not claimed:
        return None, None
    addr = ipaddress.ip_address(ip)
    nets = NETWORKS[CLAIMS[claimed]]
    return claimed, any(addr in n for n in nets if n.version == addr.version)

print(verify("216.73.216.10", "Mozilla/5.0 (compatible; ClaudeBot/1.0)"))

In production, reload NETWORKS on a schedule (a few times a day) and keep the old data if a download fails.

With the IPAPI.GR API

If you also need OpenAI, Google, Apple, Amazon, Mistral and the rest, the number of files adds up quickly. The risk.is_ai flag in the IPAPI.GR lookup API covers the operators listed on our bot signals page, from their published sources only:

python
import os
import requests

def is_verified_ai(ip):
    r = requests.get(
        f"https://fast.ipapi.gr/api/lookup/{ip}",
        params={"key": os.environ["IPAPI_KEY"]},
        timeout=5,
    )
    r.raise_for_status()
    return bool(r.json().get("risk", {}).get("is_ai"))

The risk object is included on the Pro plan. With a free key the response has no risk object, so this function returns False. See the docs for exact field semantics.

FAQ

Is the Claude API IP list useful for anything on my website?

Only if you allowlist traffic from Anthropic's platform, for example MCP servers that Claude connects to as a tool. It isn't for identifying ClaudeBot.

Does Claude-User follow robots.txt?

Anthropic's article describes disallowing Claude-User as the way to stop retrieval for user questions. Perplexity, in contrast, says its user-triggered fetcher generally ignores robots.txt.

Do I need separate checks for Claude-SearchBot?

No. The single bots.json file covers Anthropic's bots. Use the user agent to tell them apart, and the IP to confirm they're Anthropic.

PerplexityBot matched, but the user agent was a normal browser. What is it?

An address in perplexitybot.json with a browser user agent doesn't fit Perplexity's documented behaviour. Log it and treat the IP match as the stronger signal.

Checklist

  • ClaudeBot, Claude-User and Claude-SearchBot: verify against claude.com/crawling/bots.json. The API IP addresses page is a different list.
  • Opt out of Anthropic with robots.txt. Anthropic says IP blocks may not work as an opt-out.
  • PerplexityBot and Perplexity-User have separate files. Perplexity-User generally ignores robots.txt.
  • A failed match means "not that bot". It doesn't mean "human".
  • Fetch the official files on a schedule. Don't copy ranges from articles.

More in this series: the general method for verifying AI crawlers, OpenAI's four bots, and enforcing your policy in Nginx.