BlogFindings

Detect GPTBot: 0 of 2,344 addresses OpenAI publishes answered a reverse DNS lookup

Google's own verification page tells site owners that a crawler identifies itself three ways: the user agent header, the source IP, and the reverse DNS hostname of that IP. Lantad read every machine readable crawler address list nine AI crawler vendors publish on 12 October 2026, then asked a public resolver for a PTR record on 11,362 of the addresses in them. 8,510 answered and 8,468 of those forward confirmed. Not one of the 2,344 addresses sampled from OpenAI's four published files answered at all, so for GPTBot the IP list is the only published check a server can run.

18 min read Lantad

This run measured the second and third of them across the whole field. Lantad opened the crawler documentation of all nine vendors behind the fifteen tokens in this scanner's crawler registry on 12 October 2026, followed every link each page gives to a machine readable list of its own addresses, and read the fifteen files that produced. It then asked a public resolver for a PTR record on 11,362 distinct addresses out of those files, and for every PTR that came back it ran a forward lookup on the name to see whether it pointed at the address again. Nothing here is a scan of anybody's website and no AI crawler was observed arriving anywhere: this is a measurement of what the operators publish about themselves and what the public DNS says about the addresses they name.

In short

  • To detect GPTBot by reverse DNS a server needs a PTR record on the connecting address, and on 12 October 2026 Lantad asked for one on 2,344 addresses sampled from the 293 prefixes OpenAI publishes across gptbot.json, searchbot.json, chatgpt-user.json and adsbot.json. Every single query returned NXDOMAIN, on two independent public resolvers.
  • Across six vendors that publish a machine readable address list, Lantad asked 11,362 distinct published addresses for a PTR record on 12 October 2026. 8,510 answered, 8,468 of those resolved forward to the same address, and 2,852 had no PTR record at all.
  • Of the 8,510 addresses that answered, 5,812 resolved to a hostname the crawler's own operator controls, such as crawl-66-249-66-1.googlebot.com or 17-241-208-161.applebot.apple.com, and 2,698 resolved to a generic cloud hostname that names the hosting provider and not the crawler.
  • All 12 addresses Perplexity publishes and 29 of the 32 exact addresses in Anthropic's list resolved to generic cloud names, ec2 compute and bc.googleusercontent.com respectively, so a forward confirmed lookup on those addresses proves which cloud sent the request and nothing about which company did.
  • The 15 published lists carry creationTime values between 3 and 612 days old as of 12 October 2026: Google's four were stamped 9 October 2026, OpenAI's searchbot.json 2 January 2026, Amazon's Amzn-User page 4 November 2025, and perplexitybot.json 7 February 2025.
StageCountWhat it covers
Vendors whose crawler docs were read9The operators behind the 15 tokens in this scanner's registry
Vendors publishing a machine readable address list6OpenAI, Anthropic, Perplexity, Apple, Google, Amazon
Published lists read15Four from OpenAI and Google, three from Amazon, two from Perplexity, one each from Anthropic and Apple
IPv4 prefixes in those lists4,589Covering 85,627 IPv4 addresses
IPv6 prefixes in those lists1,068All 1,068 are Google's
Addresses asked for a PTR record11,362Every exact address published, plus sampled addresses from each block
Answered with a PTR record8,5108,468 of them resolved forward to the same address
No PTR record2,8522,344 of those are OpenAI's
PTR names controlled by the crawler's operator5,812Google, Apple, and 524 of Amazon's
PTR names belonging to a cloud provider2,698Proves the hosting provider, not the crawler
What was read and asked on 12 October 2026. The address lists were fetched over HTTPS from the URLs each vendor's own crawler documentation links to. The PTR and forward lookups ran against Cloudflare's public DNS over HTTPS resolver with Google's public resolver as the retry path, from one network location. Measured by Lantad.

How do you detect GPTBot in your own server logs?

Three checks exist and they are not interchangeable. The first is to match the User-Agent header against the string the vendor publishes, which fails as proof for the obvious reason that any client can send any header, and fails in a second way this blog has already counted: of the fifteen tokens in the registry, only six carry a complete published User-Agent string to match against, because a robots.txt product token and an HTTP header are different strings and vendors do not always publish both. Matching what is left is also an ordered problem rather than a lookup, and every failure mode in that ordering returns a confident wrong label rather than an error.

The second check is to compare the source address against a list the vendor publishes. That is a real check, because the list lives on a host the vendor controls, and it is the check OpenAI's own documentation points site owners at: the page recommends allowing OAI-SearchBot in robots.txt "and allowing requests from our published IP ranges below". The third is the forward confirmed reverse DNS lookup, which Google's page on verifying requests from its crawlers, last updated 2026-03-20 UTC, sets out as two command line steps: run a reverse lookup on the address, confirm the name sits in a domain the operator owns, then run a forward lookup on that name and confirm it returns the address you started with. The second step is what makes it proof, because a PTR record can be set by whoever controls the address block while the forward record can only be set by whoever controls the domain.

None of this is visible from outside a site, which is why this blog has reported the mechanism before without measuring it: when Cloudflare rebuilt its bot submission form, the finding was that its automated review fetches an IP list, confirms reverse DNS or validates a signature while taking the operator's description of its own behaviour on trust, and that post said in its own takeaways that Lantad had measured none of it. What can be measured, and is measured here for the first time, is whether the two checkable signals actually work on the addresses the vendors name. Note what is not in this list: robots.txt is not a detection mechanism at all. RFC 9309 governs what a well behaved crawler should not fetch rather than who is allowed to ask, and its own section 3 says so in one line, that "the Robots Exclusion Protocol is not a substitute for valid content security measures".

The three identification signals named on Google's crawling overview page, last updated 2026-06-12 UTC, and what each one settles. Reported from published documentation, not a Lantad measurement.

Which AI crawler vendors publish a list of their addresses?

Six of the nine do, across fifteen files holding 4,589 IPv4 prefixes and 1,068 IPv6 prefixes between them. OpenAI's crawler documentation links four files, one per crawler. Anthropic's help centre article links one file at claude.com/crawling/bots.json covering all of its bots together, which is the same single list arrangement this blog found when it read the file that cannot tell Anthropic's three named bots apart, now stamped 7 October 2026 and holding 38 prefixes rather than 26. Perplexity's bots page links two, Apple's support article links one, Google's crawling documentation links four, and Amazon's crawler page links three.

The three that publish nothing a machine can read are worth stating precisely, because the reasons differ. Meta's web crawlers page carries one instruction on the subject, reading "Add to your allow list either the user agent strings or the IP addresses (more secure) used by the crawler", and it makes the words "user agent strings or the IP addresses" a link to the anchor identify on the same page. That anchor is declared on four separate headings in the page source, and the page carries no IPv4 literal anywhere in it, no CIDR block and no reference to a whois record or an autonomous system number. ByteDance's Bytespider page at zhanzhang.toutiao.com/docs/intro/26899 answered HTTP 200 and delivered a document whose only readable text was its title, with the body requiring JavaScript, so Bytespider is recorded here as not assessed rather than as publishing nothing. That is the same crawler whose robots.txt treatment this blog counted yesterday, when 130 of 1,077 files named Bytespider and 70 shut it out at the root.

Common Crawl's CCBot page is the third and the most frustrating. It documents reverse DNS properly, states that the crawler "is now run on dedicated IP address ranges with reverse DNS", gives a worked dig example, and says the ranges "are also provided as JSON at https://index.commoncrawl.org/ccbot.json". Three requests to that URL from this network location on 12 October 2026 were each cut off before any HTTP response arrived, twice with a connection reset and once with an empty reply, so the file was not read and nothing is claimed about its contents. That is a gap in this measurement rather than a finding about Common Crawl.

Amazon is the only vendor that publishes the same thing three different ways. All three of its lists are a JSON object embedded in an HTML page rather than served as JSON, and the schema is not consistent between them: the Amzn-SearchBot page uses the key ip_prefix with a /32 suffix on every value, which is AWS's own shape, while the Amazonbot and Amzn-User pages use the key ipv4Prefix with bare addresses carrying no prefix length at all. A parser written against any one of those three rejects the other two.

VendorListcreationTimeAge in daysIPv4 prefixesIPv6 prefixes
Googlecommon-crawlers.json2026-10-093170147
Googlespecial-crawlers.json2026-10-093136136
Googleuser-triggered-fetchers-google.json2026-10-093251251
Googleuser-triggered-fetchers.json2026-10-093534534
OpenAIchatgpt-user.json2026-10-0752340
Anthropicbots.json2026-10-075380
OpenAIgptbot.json2026-09-2220180
Appleapplebot.json2026-09-1527240
AmazonAmazonbot IP page2026-09-08341,2920
AmazonAmzn-SearchBot IP page2026-09-08348160
OpenAIadsbot.json2026-05-1215320
OpenAIsearchbot.json2026-01-02283390
AmazonAmzn-User IP page2025-11-043421,0230
Perplexityperplexity-user.json2025-10-1736040
Perplexityperplexitybot.json2025-02-0761280
Every machine readable crawler address list the nine vendors' own documentation links to, read by Lantad on 12 October 2026. creationTime is the value inside each file. Age is measured against 12 October 2026.

How old is the list you are checking against?

Every one of the fifteen files carries a creationTime, and the spread between them is the first thing that decides how much the IP check is worth. Google's four were all stamped 2026-10-09, three days before they were read. Anthropic's and OpenAI's chatgpt-user.json were five days old. At the other end, perplexitybot.json carried 2025-02-07T16:56:00, which is 612 days before this measurement, and the file holds eight prefixes covering eighteen addresses in total. Perplexity's smaller perplexity-user.json was stamped 360 days earlier, Amazon's Amzn-User page 342 days, and OpenAI's searchbot.json 283 days.

Staleness cuts in a specific direction and it is worth being exact about which. A list that has not changed is not necessarily wrong: a crawler fleet that has not moved needs no new file, and OpenAI's searchbot.json may be accurate at 283 days old. What a long gap does is remove the site owner's ability to tell the two cases apart, because a list that is never updated and a list that needs no update produce the identical file. The cost lands asymmetrically: an address the vendor has added since the stamp will be refused by a server allowlisting from that file, and the crawler is turned away with no error anybody will read. This blog has looked at the other half of that problem before, finding that these files answer the question of when they last changed twice, and on six of thirteen the two answers differed by between 13 and 942 days, because the creationTime inside the file and the Last-Modified header on the response are set by different things.

The sizes have also moved since this blog last counted them. When OpenAI's four files were opened and counted on 29 July 2026, chatgpt-user.json covered 37,328 IPv4 addresses against GPTBot's 3,472. On 12 October 2026 the same two files cover 36,496 and 2,704. The direction is worth noticing: both shrank, and gptbot.json now holds eighteen prefixes. The user triggered fetcher is still the largest list OpenAI publishes, covering 36,496 addresses against 2,704 in the next largest and 5,520 across the other three together.

  • perplexitybot.json 612 days old Stamped 2025-02-07, 8 prefixes
  • perplexity-user.json 360 days old Stamped 2025-10-17, 4 prefixes
  • Amzn-User IP page 342 days old Stamped 2025-11-04, 1,023 addresses
  • searchbot.json 283 days old Stamped 2026-01-02, 39 prefixes
  • adsbot.json 153 days old Stamped 2026-05-12, 2 prefixes
  • Amazonbot IP pages 34 days old Stamped 2026-09-08, two of the three lists
  • applebot.json 27 days old Stamped 2026-09-15, 24 prefixes
  • gptbot.json 20 days old Stamped 2026-09-22, 18 prefixes
  • chatgpt-user.json 5 days old Stamped 2026-10-07, 234 prefixes
  • claude.com bots.json 5 days old Stamped 2026-10-07, 38 prefixes
  • Google's four files 3 days old All stamped 2026-10-09
Days between the creationTime inside each published list and 12 October 2026, when Lantad read it. Google's four files share one stamp and are shown once.

Does a reverse DNS lookup work on the addresses vendors publish?

For four of the six publishers it works almost everywhere, and for one it does not work at all. Lantad asked 11,362 distinct published addresses for a PTR record. Every address published as an exact single address was asked directly, which covers Amazon's 3,131, the 32 exact entries in Anthropic's file and eight of Perplexity's twelve. For every address published as a block, the first usable address was asked, and for OpenAI's 293 blocks, Anthropic's six and all 24 of Apple's, up to eight further addresses per block were asked as well, Apple's exhaustively.

The results split cleanly. All 3,131 of Amazon's addresses answered with a PTR record and all 3,131 forward confirmed. 4,641 of Apple's 4,704 addresses answered and every one of those forward confirmed, leaving 63 without a record. All twelve of Perplexity's answered and confirmed. Google's four lists answered on 694 of 1,091 addresses asked, and 652 of those forward confirmed. Anthropic's file answered on its 32 exact addresses and on none of the 48 addresses sampled from its six blocks. OpenAI's four files answered on nothing: 2,344 addresses asked, 2,344 NXDOMAIN responses, which is 144 for GPTBot, 312 for OAI-SearchBot, 1,872 for ChatGPT-User and 16 for OAI-AdsBot. Three of those addresses were then re-checked by hand against two independent public resolvers, which agreed.

One methodological point belongs in the post rather than in a footnote, because getting it wrong would have produced a published falsehood. Asking only the first usable address of each block said that 3 of Apple's 24 blocks had reverse DNS. Asking all 4,704 addresses in those same blocks said 4,641 did. The first address of a block is very often the one nobody has assigned, so sampling the edge of a range understates PTR coverage badly, and that is why the Apple figure here comes from an exhaustive pass and why OpenAI's zero is reported against 2,344 addresses rather than 293. It is also why the honest claim about OpenAI is bounded: its blocks cover 42,016 addresses and 2,344 of them were asked, so what is measured is that no sampled address has a PTR record, consistent with there being no reverse DNS scheme rather than proving one cannot exist. The same bounding applies to anything a reader checks with the crawler view tool or reads in the methodology: a measurement states its sample.

VendorAddresses askedAnswered with a PTRForward confirmedNo PTR record
Amazon3,1313,1313,1310
Apple4,7044,6414,64163
Perplexity1212120
Google1,091694652397
Anthropic80323248
OpenAI2,344002,344
All six11,3628,5108,4682,852
PTR lookups on published crawler addresses, run by Lantad on 12 October 2026 through Cloudflare's public DNS over HTTPS resolver with Google's as the retry path. Forward confirmed means the PTR name resolved back to the same address. Every query returned an answer; none errored.

What does the reverse DNS hostname actually prove?

A PTR record that forward confirms proves that whoever controls the domain in the name also controls the address. It does not say who that is, and the names divide into two populations that are worth very different amounts. 5,812 of the 8,510 answering addresses resolved into a domain the crawler's own operator holds: 4,641 under applebot.apple.com, which is exactly the mask Apple's support article describes, 165 under googlebot.com, 387 under google.com, 95 under gae.googleusercontent.com, and 524 under crawl.amazonbot.amazon, a name inside Amazon's own top level domain. On any of those, the lookup settles identity. A server seeing crawl-66-249-66-1.googlebot.com resolve back to the address that sent the request knows it is talking to Google.

The other 2,698 resolve to the hosting provider. All twelve of Perplexity's published addresses resolve to a name of the form ec2-107-20-236-150.compute-1.amazonaws.com, which identifies an EC2 instance and nothing further; the same name shape would be returned for any Amazon Web Services customer's machine. 29 of Anthropic's 32 exact addresses resolve under bc.googleusercontent.com and the remaining three under the same EC2 pattern. 2,607 of Amazon's own 3,131 resolve to the EC2 name rather than to crawl.amazonbot.amazon, which makes Amazon the one vendor whose fleet is split across both populations: 524 addresses provably Amazonbot, 2,607 provably an EC2 instance.

There is a sharper consequence in the Anthropic case and it is nobody's fault. Google's verification instructions tell a site owner to run the reverse lookup and then "verify that the domain name is either googlebot.com, google.com, or googleusercontent.com". Anthropic's addresses resolve under bc.googleusercontent.com, which is a subdomain of the third of those. An implementation that follows those instructions as a domain suffix test, which is how they are written, will forward confirm Anthropic's crawler and conclude it has verified a Google request. The narrower masks in the same page's table, which specify gae.googleusercontent.com for the fetchers that use that domain, do not have the problem; the prose instruction does. For AI visibility work this is the practical upshot: a generic cloud name is a fact about hosting, and treating it as identity is how a wrong allow decision gets made. It is also why the signature based alternative matters, and when this blog counted who had deployed it, 2 of 9 vendors published a Web Bot Auth key directory. The user agent swap measurement that found 103 of 1,089 sites served an unknown bot and refused GPTBot is the view of the same problem from outside the server.

  • applebot.apple.com 4641 addresses Apple, the mask its own article documents
  • crawl.amazonbot.amazon 524 addresses Amazon, 524 of its 3,131
  • google.com 387 addresses Google special-case and user-triggered fetchers
  • googlebot.com 165 addresses Google common crawlers
  • gae.googleusercontent.com 95 addresses Google user-triggered fetchers on GCP
  • ec2 compute.amazonaws.com 2622 addresses 2,607 Amazon, 12 Perplexity, 3 Anthropic
  • bc.googleusercontent.com 76 addresses 29 Anthropic, 47 Google
Addresses whose PTR name sits in a domain the crawler's operator controls, against those resolving to a hosting provider's generic name. Counted by Lantad on 12 October 2026 across the 8,510 published addresses that answered a PTR query.

IPv6, and the gap between the documentation and the measurement

Three of the nine vendors document reverse DNS as a way to identify their crawler. Google sets out the masks and the two step check. Apple's support article, carrying a published date of 4 September 2026, says traffic from Applebot "is generally identified by using reverse DNS in the *.applebot.apple.com domain" and gives the host commands. Common Crawl's page documents it, and adds the one caveat nobody else states: the ranges carry reverse DNS "except over IPv6 where reverse DNS is not yet supported". The crawler documentation of OpenAI, Anthropic, Perplexity and Amazon contains the string DNS zero times, and Perplexity's page instead advises combining "both User-Agent string matching and IP address verification".

Two of those four are then contradicted by the measurement in opposite directions. Amazon documents no reverse DNS and all 3,131 of its published addresses have a forward confirming PTR record, 524 of them under a name that says Amazonbot: a site owner who read only the documentation would not know the strongest check available to them exists. Apple documents reverse DNS and 63 of its 4,704 addresses have no record, which is a small enough share to be unremarkable except for the direction, since a documented mechanism that silently misses an address is worse than an undocumented one that works.

IPv6 is the hole that matters most and it is not close. Of the 1,068 IPv6 prefixes in all fifteen files, every single one is Google's. OpenAI, Anthropic, Perplexity, Apple and Amazon publish 4,589 IPv4 prefixes and not one IPv6 prefix between them. A site reached over IPv6, which is most sites behind a modern CDN, therefore has no published list to check a connection from any of those five against, and no documented reverse DNS mask either. That leaves the User-Agent header, which is the string this whole post started by discarding. Checking what your own file says to each token is a separate job and the robots.txt tester does it, but it answers a different question: robots.txt decides what a crawler should fetch, and none of it decides who is asking. Lantad publishes its own crawler's identity and contact at the bot page, which is the same courtesy measured here and the cheapest one a crawler operator can extend.

VendorDocuments reverse DNSPublishes an address listIPv6 prefixes publishedPTR records found
GoogleYes, with masksFour files1,068694 of 1,091
AppleYesOne file04,641 of 4,704
Common CrawlYes, not over IPv6Documented, not retrievedNot readNot measured
AmazonNo mention of DNSThree HTML pages03,131 of 3,131
AnthropicNo mention of DNSOne file032 of 80
PerplexityNo mention of DNSTwo files012 of 12
OpenAINo mention of DNSFour files00 of 2,344
MetaNoLink points at an anchor with no addresses0Not measured
ByteDancePage needs JavaScriptPage needs JavaScriptNot readNot measured
What each vendor's own crawler documentation says about identifying its crawler, opened by Lantad on 12 October 2026, set against what the PTR lookups found. Only Google's and Apple's pages carry a date.

Written by

Lantad

Published .

A server that wants to detect GPTBot has one piece of evidence to start from and it is the weakest one in the request: a User-Agent header, which is a string the client chose to send. Everything beyond that is a question about where the connection came from. Google's overview of its own web crawling, last updated 2026-06-12 UTC, sets out the full set in one sentence, saying its crawlers "identify themselves in three ways" which it lists as "the HTTP user-agent request header", "the source IP address of the request" and "the reverse DNS hostname of the source IP". Two of those three are checkable against something the operator controls rather than something the client claims.

Common questions

How do I detect GPTBot on my server?

Match the User-Agent header to spot the claim, then check the source address against the prefixes in openai.com/gptbot.json to test it. Reverse DNS is not available for this crawler: Lantad asked 2,344 addresses sampled from the 293 prefixes across OpenAI's four published files on 12 October 2026 and every query returned NXDOMAIN, so there is no PTR record to confirm. The IP list is the only published check, and the file was stamped 2026-09-22 when read.

What is a forward confirmed reverse DNS lookup?

Two lookups rather than one. First a reverse lookup on the connecting address returns a hostname, then a forward lookup on that hostname must return the same address. The second step is what makes it proof, because a PTR record is set by whoever controls the address block while the matching forward record can only be set by whoever controls the domain. Google's verification page, last updated 2026-03-20 UTC, sets out both steps with worked examples.

Does a reverse DNS lookup prove which company sent a request?

Only if the hostname sits in a domain that company controls. Of the 8,510 published crawler addresses that answered a PTR query on 12 October 2026, 5,812 resolved into an operator's own domain such as applebot.apple.com or googlebot.com, and 2,698 resolved to a generic cloud name such as ec2-107-20-236-150.compute-1.amazonaws.com, which identifies the hosting provider and could belong to any of its customers.

Can I verify an AI crawler that reaches my site over IPv6?

For five of the six vendors that publish a list, no. All 1,068 IPv6 prefixes across the fifteen files Lantad read on 12 October 2026 are Google's. OpenAI, Anthropic, Perplexity, Apple and Amazon published 4,589 IPv4 prefixes and no IPv6 prefix at all, and none of their pages documents an IPv6 reverse DNS mask. Common Crawl's page states plainly that its own reverse DNS is not yet supported over IPv6.

See what AI can read on your site

Run a free scan and get a graded report of exactly what AI crawlers can and cannot read, with ranked fixes.