Bot signals — AI crawler & agent

ClaudeBot IP addresses

Anthropic Claude bots

Shared ClaudeBot, Claude-SearchBot and Claude-User published egress.

risk.is_airisk.is_crawler Ranges Reviewed

Check an IP

Is this IP really ClaudeBot?

Checks the address against what Anthropic Claude bots publishes, the same evidence behind risk.is_ai.

01 — Verification

How IPAPI.GR verifies ClaudeBot.

Only from what Anthropic Claude bots publishes about itself. No third-party blocklists, no behavioural guesses. Live address counts change with every publication, so check the official files for the current list.

Anthropic Claude bots

risk.is_airisk.is_crawler

Shared ClaudeBot, Claude-SearchBot and Claude-User published egress.

Method
Ranges Published IP ranges
Format
JSON range file
Refresh
Every hour. If a refresh fails, entries expire after 24 hours instead of being trusted forever.
Reviewed
2026-11-10

02 — In the response

What a match looks like.

A lookup of a ClaudeBot address sets risk.is_ai and risk.is_crawler. The flags come with geolocation and network data in the same response, for Pro API keys.

This publication is AI crawling or retrieval traffic, so it counts as both an AI source and a crawler.

The response says which kind of bot an address belongs to, not which operator. Pair it with the user agent: a request that claims to be ClaudeBot but doesn't match is unverified.

GET /api/lookup/{ip}?key=PRO_KEY
{
  // … location and network fields …
  "risk": {
    "is_ai": true,
    "is_crawler": true,
    "is_scanner": false
  }
}

03 — Configuration

Allow, block or verify it yourself.

robots.txt
User-agent: ClaudeBot
Disallow: /
Anthropic documents robots.txt as the opt-out for each of its bots, and says IP blocks may not work as an opt-out because a blocked bot cannot read robots.txt.
nginx + jq
# 1. Build a geo include from the official file (cron, e.g. hourly).
#    Keep the old file if the download fails or comes back empty.
curl -fsS https://claude.com/crawling/bots.json \
  | jq -r '.prefixes[] | (.ipv4Prefix // .ipv6Prefix // empty) | "\(.) 1;"' \
  > /etc/nginx/claudebot-ranges.conf.new && [ -s /etc/nginx/claudebot-ranges.conf.new ] && mv /etc/nginx/claudebot-ranges.conf.new /etc/nginx/claudebot-ranges.conf \
  && nginx -t -q && nginx -s reload

# 2. In the http block: 1 when the client IP is in the published ranges.
geo $claudebot_ip {
    default 0;
    include /etc/nginx/claudebot-ranges.conf;
}

# 3. A request that claims to be ClaudeBot, Claude-SearchBot or Claude-User from any other address is an impostor.
map "$http_user_agent:$claudebot_ip" $fake_claudebot {
    default 0;
    "~*(ClaudeBot|Claude-SearchBot|Claude-User).*:0$" 1;
}

# In the server block:
if ($fake_claudebot) { return 403; }
Built from claude.com/crawling/bots.json, a JSON file with a prefixes array. It covers that file only.

04 — Questions

About ClaudeBot.

Where does ClaudeBot publish its IP addresses?

Anthropic Claude bots publishes its addresses in 3 places at https://claude.com/crawling/bots.json, https://claude.com/.well-known/sail and https://platform.claude.com/docs/en/api/ip-addresses.md. IPAPI.GR reads those publications directly, not a third-party copy.

How often is the ClaudeBot list refreshed?

IPAPI.GR re-fetches it every 15 to 60 minutes. If a refresh fails, the previous entries expire after at most 24 hours instead of being trusted forever.

Which risk flag does ClaudeBot set?

A matching address sets risk.is_ai and risk.is_crawler in the lookup response. The risk flags are returned for Pro API keys.

Verify ClaudeBot on every request.

Pro: 40,000,000 requests a day with is_ai, is_crawler and is_scanner in every lookup.