For the complete documentation index, see llms.txt. Every page on this site is also served as Markdown: append `.md` to any URL, or send `Accept: text/markdown`.
Skip to content

The AI crawler guide: bots, jobs and robots.txt · chapter 4

How to verify an AI crawler is real

To verify an AI crawler, ignore the user-agent string, which anyone can fake, and check the request's IP address. Either match it against the operator's published IP list, as OpenAI, Anthropic, Perplexity and Common Crawl provide, or run a reverse DNS lookup and confirm it with a forward lookup, as Google and Apple document.

7 days free · card required

AI crawler requests counted, by the user agent each one claimed
120,143
30 days
of them verified by IP list or DNS
0
n=120,143 requests
Analyst agentAnalystattensira.com AI traffic, read over the Attensira MCP on 2026-10-04 · to
Karl-Gustav KallasmaaKarl-Gustav Kallasmaa, Founder & CEO

Last updated

Key facts

What does verifying a crawler look like in practice?

Two commands and a list. Here are real lookups, run on 4 October 2026.

Reverse DNS, then forward DNS, for an IP claiming to be Googlebot:

plain text
$ host 66.249.66.1
1.66.249.66.in-addr.arpa domain name pointer crawl-66-249-66-1.googlebot.com.

$ host crawl-66-249-66-1.googlebot.com
crawl-66-249-66-1.googlebot.com has address 66.249.66.1

The name ends in googlebot.com, and the forward lookup returns the same IP. That is Google's documented test, passed. The same reverse lookup on 17.241.219.1 returned 17-241-219-1.applebot.apple.com, the domain Apple documents for Applebot.

A published IP list, for an IP claiming to be GPTBot. OpenAI publishes the ranges each of its agents uses. We fetched openai.com/gptbot.json and checked two addresses: 132.196.86.5 falls inside one of its 18 ranges; 8.8.8.8 falls in none. A request from the second claiming to be GPTBot is not GPTBot.

That is all verification is: ignore what the request says it is, and check where it came from.

Now the uncomfortable part, at the top of this page: our own AI traffic board for attensira.com reports none of a month's AI crawler requests as verified. That is deliberate. Attensira counts visits by user agent at the edge and says plainly in its documentation that it does not claim to prove a request came from a named crawler. Every crawler table in this guide is therefore labelled as unverified. Before you block, allow or celebrate a specific agent on the strength of a log line, do the check above.

What did our own lookups return?

Four checks we ran by hand. Two IPs resolve back to the operator's documented domain, one falls inside OpenAI's published ranges, and one claims to be GPTBot from an address OpenAI never lists.

Four requests, four checks
  • 66.249.66.1

    Claims to be
    Googlebot
    Check
    Reverse, then forward DNS
    Result
    googlebot.com: genuine
  • 17.241.219.1

    Claims to be
    Applebot
    Check
    Reverse DNS
    Result
    applebot.apple.com: genuine
  • 132.196.86.5

    Claims to be
    GPTBot
    Check
    openai.com/gptbot.json
    Result
    inside a listed range
  • 8.8.8.8

    Claims to be
    GPTBot
    Check
    openai.com/gptbot.json
    Result
    in no range: not GPTBot
host lookups and OpenAI's published list, run by us ·

Why can't you trust a user-agent string?

Because the client writes it. A User-Agent header is free text. Any script can send GPTBot/1.4 or Googlebot/2.1, and scrapers routinely borrow well-known crawler names to get past filters that wave known bots through. Common Crawl says outright that it is aware of crawlers falsely identifying themselves as CCBot.

So a user-agent string tells you what a request claims. The IP address, which has to be real for the request to get a response, tells you where it came from. Every operator's verification method is built on the IP.

Which verification method does each operator support?

  • Google

    Agents
    Googlebot and other Google crawlers
    Method
    Reverse DNS to googlebot.com, google.com or googleusercontent.com, then forward DNS; or JSON range files
    Where
    Google's verification page
  • Apple

    Agents
    Applebot
    Method
    Reverse DNS in applebot.apple.com; or a JSON file of CIDRs
    Where
    Apple's Applebot page
  • OpenAI

    Agents
    GPTBot, OAI-SearchBot, ChatGPT-User, OAI-AdsBot
    Method
    One JSON range file per agent
    Where
    openai.com/gptbot.json and siblings
  • Anthropic

    Agents
    ClaudeBot, Claude-SearchBot, Claude-User
    Method
    One JSON range file for all its bots
    Where
    claude.com/crawling/bots.json
  • Perplexity

    Agents
    PerplexityBot, Perplexity-User
    Method
    One JSON file per agent
    Where
    perplexity.com/perplexitybot.json, perplexity-user.json
  • Common Crawl

    Agents
    CCBot
    Method
    Reverse DNS, or a JSON range file
    Where
    index.commoncrawl.org/ccbot.json
  • Amazon

    Agents
    Amazonbot
    Method
    A published list of IP addresses
    Where
    developer.amazon.com/amazonbot/ip-addresses

Two details matter. OpenAI's files are per agent, so you can check not just that a request is from OpenAI but which of its agents sent it, independent of the header. Anthropic's single file tells you a request is from Anthropic but not which bot.

Why do fake crawlers borrow AI names at all?

Because many sites wave known crawlers through. A firewall rule, a rate limiter or a paywall that exempts any request whose header says GPTBot or Googlebot is an open door for anyone who types those words. Scrapers that would be throttled as unknown clients get unlimited access by claiming to be a crawler the site has decided to welcome.

The fix is to allowlist by address, never by header. Meta's documentation makes the same point about its own crawlers: you can allowlist either their user-agent strings or their IP addresses, and it calls the IP route more secure. The same holds for every operator. A rule that says "let GPTBot in" should mean "let in requests from the ranges in gptbot.json", and the header becomes a label you check against the address, not a key.

How do user-triggered fetchers change verification?

They come from more places, and their lists are bigger and change faster.

A search crawler runs from a fleet the operator controls and schedules. A user-triggered fetcher runs whenever a person somewhere asks a question, so it needs capacity close to where people are. That shows in the files: on 4 October 2026, OpenAI's list for ChatGPT-User held 230 ranges, against 18 for GPTBot and 39 for OAI-SearchBot, and it had been regenerated nine days earlier. A stale copy of that file is the one most likely to reject real visitors.

Two operators complicate things further. Meta documents that Meta-ExternalFetcher may bypass robots.txt, and its crawler page offers no published list we could find for it. Perplexity's user-agent file listed only 4 ranges. For agents like these, decide in advance how you treat a request you cannot verify, and write the decision down.

Do the engines tell people to check?

Perplexity's answer to a question we track, verbatim. It says to filter logs by user-agent string and stops there: no IP list, no DNS lookup. Followed as written, it counts every request that borrowed a crawler's name as the crawler.

Answer · Perplexityasked

Question: how to see which AI bots crawl my website

Perplexity answered: Open your server access logs and filter by known AI bot user-agent strings (e.g., GPTBot, ClaudeBot, PerplexityBot, OAI-SearchBot) to see which crawlers have visited, when, and what they fetched. JavaScript analytics won't show these visits because crawlers don't execute scripts. You can also review robots.txt to see which AI crawlers are allowed or blocked.

Sources cited

  1. 1workers.cloudflare.com
  2. 2centium.ai
  3. 3otterly.ai
  4. 4indexly.ai
  5. 5xseek.io
  6. 6seoptimer.com
  7. +2 more

Not namedAttensira is missing from this Perplexity answer.

Analyst agentAnalyst · reads this workspace's answersattensira.com workspace, Attensira MCP · · excerpt, sample 2 of 3 that day

How big are the lists, and how often do they change?

Big enough to need a script, and they change often enough that you should fetch them on a schedule. As fetched on 4 October 2026:

  • openai.com/gptbot.json

    Ranges listed
    18
    Generated
    22 September 2026
  • openai.com/searchbot.json

    Ranges listed
    39
    Generated
  • openai.com/chatgpt-user.json

    Ranges listed
    230
    Generated
    25 September 2026
  • claude.com/crawling/bots.json

    Ranges listed
    28
    Generated
    2 October 2026
  • perplexity.com/perplexitybot.json

    Ranges listed
    8
    Generated
  • perplexity.com/perplexity-user.json

    Ranges listed
    4
    Generated
  • index.commoncrawl.org/ccbot.json

    Ranges listed
    5
    Generated
  • Google common-crawlers.json

    Ranges listed
    317
    Generated
    2 October 2026

Three of these files had been regenerated in the two weeks before we fetched them. A copy you downloaded last quarter will reject real requests and accept nothing new. Fetch daily, cache for a day at most, and keep the last good copy in case a fetch fails.

How do you verify at scale?

Not one request at a time. A practical setup:

  1. Fetch every operator's list daily into one table of ranges, labelled by operator and agent.
  2. Match each crawler-looking request against the ranges for the agent it claims to be. A claim that does not match is spoofed.
  3. Cache reverse DNS results for operators that use it, keyed by IP, for a day. Never run a lookup inline on every request.
  4. Label your counts as verified, spoofed or unverifiable, and keep the three apart in reports.
  5. Alert on a sudden change in the share of spoofed requests for one token. It usually means a scraper has started borrowing that name.

Many CDNs and bot-management products maintain verified-bot lists for you. If you use one, check which agents it covers; the AI operators add agents faster than most lists are updated.

How should you report crawler traffic you have not verified?

Honestly labelled, in three columns rather than one. Verified requests are evidence of what an operator's crawler did. Spoofed requests are evidence of a scraper, and belong in a security view, not a visibility one. Unverifiable requests, from operators that publish no list, are a claim you cannot check, and should be reported as a claim.

If you cannot verify at all, which is where most teams start, say so on the chart. Our own crawler tables in this guide carry the line "counted by user agent, not verified" for exactly this reason. A request count that mixes all three is still useful as a rough measure of coverage: which sections get fetched, and how often. It is not useful for deciding that one operator values your site more than another, and it should never be presented as an audited record of who visited.

The label costs nothing, and it stops a spoofer's traffic being read as a sign that an AI company has taken an interest in you.

What should you do with a request that fails verification?

Treat it as what it is: an unknown client using a false name. Three reasonable responses, depending on the load it puts on you:

  • Ignore it in your analytics. Do not count it as the crawler it claims to be.
  • Rate-limit it like any other unknown client.
  • Block it at the firewall if it is heavy or hostile.

What you should not do is change robots.txt because of it. A spoofer does not read robots.txt, and a rule aimed at the name it borrowed will only affect the real crawler.

Is it ever a mistake to verify by blocking IPs?

Yes, when the goal is an opt-out. Anthropic warns that blocking its IP addresses may stop it reading your robots.txt, so an IP block may not reliably opt you out of its crawling. If you want an operator's real crawler to stay away, say so in robots.txt to its token. Use IP rules for traffic you want gone entirely, and use verification to tell the two apart.

What can verification not tell you?

Two things.

What a verified crawler will do with the page. A real OAI-SearchBot fetch tells you the page can be in ChatGPT's search index. It does not tell you the page will be retrieved for any question, or cited. That is the subject of the AI search visibility guide.

Whether an unverifiable agent is honest. Some agents, such as Bytespider on our own site, come from operators that publish no documentation we could cite. You cannot verify them, only decide how much unverified traffic you are willing to serve.

The next chapter, on llms.txt, turns from who is reading your site to what you hand them when they arrive.

What else do people ask?

How do I verify that a request from GPTBot is really from OpenAI?
Check the request's IP address against openai.com/gptbot.json, the list OpenAI publishes for GPTBot. OAI-SearchBot and ChatGPT-User have their own files. If the IP is in no range in the file for the agent it claims to be, the request is not from that OpenAI agent, whatever its user-agent header says.
How do I verify Googlebot?
Google documents two ways. Run a reverse DNS lookup on the IP and check the name ends in googlebot.com, google.com or googleusercontent.com, then run a forward lookup on that name and check it returns the same IP. Or match the IP against Google's published JSON range files.
Why can't I trust the user-agent string?
Because the client writes it. Any script can send 'GPTBot' or 'Googlebot' in its header, and scrapers do. Common Crawl says it is aware of crawlers falsely identifying themselves as CCBot. The IP address is much harder to fake for a full exchange, which is why every operator's verification method relies on it.
How often do the published IP lists change?
Often enough that you should fetch them automatically. When we fetched them on 4 October 2026, OpenAI's ChatGPT-User file had been regenerated on 25 September and Anthropic's on 2 October. Cache them for a day at most, and keep your previous copy in case a fetch fails.
Does Attensira verify the crawlers it counts?
No, and it says so. Attensira counts crawler visits by user agent at the edge and reports them as directional evidence of coverage, not as verified visits, because a user agent is self-reported. Our own AI traffic for attensira.com shows no request as verified.

Where do these facts come from?

11 sources, 13 statements: each statement with the page it came from and the day it was checked.

  1. Google documents verifying its crawlers by running a reverse DNS lookup on the accessing IP, checking the domain is googlebot.com, google.com or googleusercontent.com, running a forward DNS lookup on that name, and checking it returns the original IP, or by matching the IP against its published JSON range files.

    developers.google.com · retrieved

  2. OpenAI publishes a separate IP list for each agent at openai.com/gptbot.json, openai.com/searchbot.json, openai.com/chatgpt-user.json and openai.com/adsbot.json.

    developers.openai.com · retrieved

  3. Anthropic publishes its bots' IP ranges at claude.com/crawling/bots.json and warns that blocking its IPs may not reliably opt a site out because it impedes reading robots.txt.

    support.claude.com · retrieved

  4. Perplexity publishes IP lists for PerplexityBot at perplexity.com/perplexitybot.json and for Perplexity-User at perplexity.com/perplexity-user.json.

    docs.perplexity.ai · retrieved

  5. Apple documents that Applebot traffic is generally identified by reverse DNS in the applebot.apple.com domain, and publishes Applebot IP CIDRs in a JSON file.

    support.apple.com · retrieved

  6. Common Crawl states it is aware of crawlers falsely identifying themselves as CCBot, and supports verification by reverse DNS or its IP range file at index.commoncrawl.org/ccbot.json.

    commoncrawl.org · retrieved

  7. Amazon publishes Amazonbot's IP addresses at developer.amazon.com/amazonbot/ip-addresses.

    developer.amazon.com · retrieved

  8. Attensira documents that it does not claim to prove a request came from a specific named crawler, because user agents are self-reported and trivially spoofed, and treats crawler data as directional evidence about coverage.

    docs.attensira.com · retrieved

  9. Run on 4 October 2026: a reverse DNS lookup of 66.249.66.1 returned crawl-66-249-66-1.googlebot.com, whose forward lookup returned 66.249.66.1; a reverse lookup of 17.241.219.1 returned 17-241-219-1.applebot.apple.com; 132.196.86.5 fell inside a range in openai.com/gptbot.json and 8.8.8.8 did not.

    developers.google.com · retrieved

  10. Fetched 4 October 2026: openai.com/gptbot.json listed 18 prefixes (generated 22 September 2026), searchbot.json 39, chatgpt-user.json 230 (generated 25 September 2026), perplexitybot.json 8, perplexity-user.json 4, claude.com/crawling/bots.json 28 (generated 2 October 2026), ccbot.json 5 and Google's common-crawlers.json 317.

    openai.com · retrieved

  11. Read over the Attensira MCP on 4 October 2026: Attensira's AI traffic board for attensira.com counted about 120,000 AI crawler requests in 30 days by user agent and reported none of them as verified.

    docs.attensira.com · retrieved

  12. Meta's crawler documentation recommends allowlisting either its crawlers' user agent strings or their IP addresses and calls using IP addresses more secure, without publishing a specific IP list in that document.

    developers.facebook.com · retrieved

  13. Read over the Attensira MCP on 5 October 2026 (attensira.com workspace): one of Perplexity's three answers on 3 October 2026 to the tracked question 'how to see which AI bots crawl my website' advised filtering server logs by user-agent string and did not mention checking IP lists or DNS.

    attensira.com workspace, read over the Attensira MCP on

Want software that does your AI-search visibility work, with you in control of every change?

7 days free · card required