Blog / Four OpenAI crawler IP lists, opened and counted

Four OpenAI crawler IP lists, opened and counted

OpenAI publishes a JSON file of IP address ranges for each of its four crawlers. Read on 29 July 2026, the ChatGPT-User file covered 37,328 IPv4 addresses against GPTBot's 3,472, and it is the one crawler OpenAI says robots.txt rules may not apply to.

In short

  • OpenAI publishes a separate JSON file of IP address ranges for each of its four crawlers, and read on 29 July 2026 those files carried 21 prefixes for GPTBot, 35 for OAI-SearchBot, 2 for OAI-AdsBot and 286 for ChatGPT-User.
  • The ChatGPT-User file read on 29 July 2026 covered 37,328 IPv4 addresses, more than ten times the 3,472 covered by the GPTBot file, and OpenAI's crawler documentation states that because ChatGPT-User actions are initiated by a user, robots.txt rules may not apply.
  • All four OpenAI crawler IP files carried IPv4 prefixes only, with no IPv6 prefix in any of them when read on 29 July 2026.
  • OpenAI's crawler documentation states that OpenAI may add a robots.txt marker to the user agent string when fetching robots.txt, so the string a site logs for a robots.txt fetch is not the string it logs for a page fetch.
  • Lantad's crawler registry in core/src/bots.ts stores GPTBot/1.2 and OAI-SearchBot/1.0 while OpenAI's documentation showed GPTBot/1.4 and OAI-SearchBot/1.4 on 29 July 2026, and the registry holds no OAI-AdsBot row at all.

OpenAI publishes a file of IP address ranges for each crawler it runs. There are four of them, one per crawler, each linked from OpenAI's crawler documentation, and they are the only mechanism that page documents for telling a genuine OpenAI crawler from a request that merely says it is one. We opened all four on 29 July 2026 and counted what was inside.

The counts are lopsided in a direction the robots.txt conversation would not predict. The largest published fleet by an order of magnitude belongs to ChatGPT-User, which is the one OpenAI crawler its own documentation says robots.txt rules may not apply to. The smallest belongs to OAI-AdsBot, which the documentation says only visits pages an advertiser submitted. This post is a reading of published vendor files, nothing more. It is not a measurement of traffic to your site or to ours, and the gap between those two things is large enough that the second section below is entirely about what these numbers cannot support.

  • ChatGPT-User 37328IPv4 addresses 286 prefixes. File creationTime 2026-07-23. The crawler robots.txt may not govern.
  • GPTBot 3472IPv4 addresses 21 prefixes. File creationTime 2025-10-30, the oldest of the four.
  • OAI-SearchBot 2496IPv4 addresses 35 prefixes. File creationTime 2026-01-02.
  • OAI-AdsBot 256IPv4 addresses 2 prefixes. File creationTime 2026-05-12. Documented as visiting only pages submitted as ads.
IPv4 addresses covered by each published OpenAI crawler range file, read on 29 July 2026 from openai.com/gptbot.json, searchbot.json, adsbot.json and chatgpt-user.json. Address capacity, not observed requests.

The four files, and what is actually inside them

Each file is small JSON with the same two keys: a creationTime string and an array called prefixes, where every entry is an object carrying a single ipv4Prefix in CIDR notation. There is no version field, no expiry, and no signature. Read on 29 July 2026, the four looked like this.

The GPTBot range file carried 21 prefixes covering 3,472 IPv4 addresses, with a creationTime of 2025-10-30. The OAI-SearchBot file carried 35 prefixes covering 2,496 addresses, creationTime 2026-01-02. The OAI-AdsBot file carried 2 prefixes covering 256 addresses, creationTime 2026-05-12, and both of those prefixes are a /25. The ChatGPT-User file carried 286 prefixes covering 37,328 addresses, with a creationTime of 2026-07-23T02:02:53, six days before we read it and by some distance the freshest of the four.

Two things are worth noticing before any interpretation. The first is that prefix count and address count do not move together. OAI-SearchBot publishes more prefixes than GPTBot, 35 against 21, while covering fewer addresses, 2,496 against 3,472, because the OAI-SearchBot list is made of smaller blocks. Anyone building a containment test cares about addresses; anyone eyeballing a file for a sense of scale sees prefixes, and the two answers disagree.

The second is that not one of the four files contained an IPv6 prefix. All 344 entries across all four files were IPv4. That is a fact about the published lists rather than a claim about what OpenAI's infrastructure can do, but it has a direct operational consequence: a site reached over IPv6 by something claiming to be an OpenAI crawler cannot be verified against these files at all, because there is nothing in them to match against. That is not a hypothetical for a site behind a modern CDN.

If the vocabulary here is unfamiliar, what an AI crawler is is the reference entry, and the free AI crawler reference lists the tokens Lantad evaluates.

  • gptbot.json 21 prefixes, 3,472 IPv4 addresses, creationTime 2025-10-30. Oldest file of the four.
  • searchbot.json 35 prefixes, 2,496 IPv4 addresses, creationTime 2026-01-02. More prefixes than GPTBot, fewer addresses.
  • adsbot.json 2 prefixes, 256 IPv4 addresses, creationTime 2026-05-12. Both entries are a /25.
  • chatgpt-user.json 286 prefixes, 37,328 IPv4 addresses, creationTime 2026-07-23T02:02:53. Freshest file of the four.
  • Any IPv6 prefix, in any of the four None. All 344 entries across the four files are IPv4, so an IPv6 request has nothing to be checked against.
The four published OpenAI range files as read on 29 July 2026. Prefix counts and creationTime values are copied from the files; address counts are the sum of each CIDR block's size.

What an OpenAI crawler IP range count does not prove

A published address range is capacity, not activity. It says where requests from a crawler may originate, and it says nothing whatever about how many requests any of them sends, how often, or to whom. ChatGPT-User publishing more than ten times GPTBot's address space is not evidence that ChatGPT-User fetches more pages than GPTBot, and we have not measured that. We have opened four files and added up the blocks in them.

There are ordinary infrastructure reasons a range can be large without the traffic being large. A fleet spread across more regions needs more blocks. A provider that allocates in small units publishes more of them. A list that has grown by accretion since 2025 can carry ranges no longer in service, because none of these files carries an expiry and nothing in the format marks a prefix as retired. The ChatGPT-User file being both the largest and the most recently regenerated is consistent with a fleet that is actually expanding, and it is equally consistent with a list that is simply maintained more actively than the other three. Nothing in the file distinguishes those.

What the files do support is precisely one operation, and it is the one they exist for: given a request that claims to be an OpenAI crawler, you can test whether its source address falls inside the published blocks for that crawler, and a request from outside them is not that crawler whatever its header says. That is a containment test against a list you refresh on a schedule, which is cheap. We argued the general case for it in a user agent is a claim, not an identity, and what is new here is only that the lists have now been opened and counted rather than described.

The honest statement of Lantad's own position has not changed since that post. Lantad does not verify crawler identity by IP today, every per-crawler figure it shows is labelled as a count of requests claiming that crawler, and the reason it is not built is ordering rather than difficulty. That labelling convention is not specific to crawlers: it is the rule applied to every AI visibility figure the product prints, because a number whose provenance goes unstated is a number a reader will over-read. Our scanner identifies itself as LantadBot and the page explaining what our bot does says so. Cloudflare's bot documentation covers the managed alternative for sites already behind it, and OpenAI is not unusual in publishing ranges at all: Perplexity's bots guide publishes them too.

  • Where may an OpenAI crawler request originate Answered That is exactly what the four files state, and the whole reason they are published.
  • Is a given request really that crawler Answered, negatively A source address outside the published blocks is not that crawler, whatever the user agent header says.
  • Which OpenAI crawler fetches the most pages Not answered Address capacity is not request volume. No traffic was observed for this post, on any site.
  • Are any of these ranges still in service Not answered No file carries an expiry and no format field marks a prefix as retired.
Four questions a reader might ask of these counts, and whether opening the files answers them.

OpenAI applies robots.txt to two of the four crawlers

The crawler overview opens by naming which tokens the file is for, and the sentence is narrower than the four-crawler table underneath it. It reads: "OpenAI uses OAI-SearchBot and GPTBot robots.txt tags to enable webmasters to manage how their sites and content work with AI." Two tokens, not four. The page then adds that the settings are independent of each other, so a site can allow OAI-SearchBot to appear in ChatGPT search while disallowing GPTBot to keep its content out of foundation model training.

Read the per-crawler rows and the asymmetry holds. GPTBot carries a plain statement that "Disallowing GPTBot indicates a site's content should not be used in training generative AI foundation models". OAI-SearchBot carries a recommendation to allow it in robots.txt, plus a consequence worth quoting because it is routinely overstated in both directions: "Sites that are opted out of OAI-SearchBot will not be shown in ChatGPT search answers, though can still appear as navigational links". Opting out of the search crawler removes you from the answer, not from the interface.

ChatGPT-User carries the opposite kind of statement. The page says it "is not used for crawling the web in an automatic fashion", and then: "Because these actions are initiated by a user, robots.txt rules may not apply." That is the token with 286 published prefixes behind it. The page also states that ChatGPT-User is not used to determine whether content may appear in Search, and directs anyone managing search opt outs to OAI-SearchBot instead.

OAI-AdsBot says nothing about robots.txt at all. The row describes what the crawler does, that it "only visits pages submitted as ads", and that the data it collects "is not used to train generative AI foundation models". There is no sentence about disallowing it and no sentence about honouring a disallow. Third party write ups of OAI-AdsBot published this month assert both that it honours robots.txt and that OpenAI has not confirmed whether it does, which is a good reason to read the vendor page rather than a summary of it. The absence is the finding: on 29 July 2026 the documentation stated a robots.txt consequence for three of its four crawlers and none for the fourth.

None of that is unusual for the protocol. RFC 9309 specifies how a crawler that chooses to consult robots.txt should parse and apply it, and specifies nothing that compels anyone to consult it. The edge layer, not the file, is where refusal is actually enforced, which is the argument in two layers decide whether AI can read your site. One more detail from the same page is worth carrying into any before and after test: OpenAI states that for search results "it can take ~24 hours from a site's robots.txt update for our systems to adjust", so a change checked ten minutes later has been checked too early. Our free robots.txt tester evaluates your file against each token immediately, which answers what the file says rather than what OpenAI has ingested.

  • GPTBot Disallow is meaningful Disallowing it indicates content should not be used in training generative AI foundation models.
  • OAI-SearchBot Disallow is meaningful Opted out sites are not shown in ChatGPT search answers, though can still appear as navigational links.
  • ChatGPT-User May not apply Because the actions are initiated by a user, the page states robots.txt rules may not apply.
  • OAI-AdsBot Not stated The row describes purpose and training use only. No sentence about robots.txt appears either way.
What OpenAI's crawler documentation states about robots.txt for each of its four crawlers, read on 29 July 2026. Quotations are from that page.

OpenAI sends a different user agent when it fetches robots.txt

Buried in the OAI-SearchBot row is a detail with more operational consequence than its placement suggests. OpenAI publishes two user agent strings for that crawler, not one. The ordinary string ends "compatible; OAI-SearchBot/1.4; +https://openai.com/searchbot". The string used when fetching robots.txt has an extra segment: "compatible; OAI-SearchBot/1.4; robots.txt; +https://openai.com/searchbot". The page gives the reason plainly, that the marker "helps site owners more easily distinguish requests for the robots.txt file from requests for other resources, especially when their logs do not include paths". The GPTBot row carries the same note without printing the variant string.

This is a considerate piece of engineering and it is also a trap for anything doing exact string comparison. A log filter written against the published page fetch string will not match the robots.txt fetch, so a site counting OpenAI requests by exact match undercounts by exactly the robots.txt fetches, which are the ones that tell you whether your file is being read at all. A matcher that tests for the substring OAI-SearchBot catches both. A matcher that tests for equality with a documented string catches one. If you want to see what your own page returns to a crawler user agent rather than to a browser, what GPTBot sees on your page performs exactly that fetch and shows the response.

The general failure this belongs to is that turning a user agent string into a crawler label is an ordering and matching problem with named ways to be confidently wrong, which is set out in AI crawler detection is an ordering problem. The specific lesson here is narrower and easy to act on: match on the product token, never on the whole string, because the vendor reserves the right to change everything around the token and has now documented a case where it does so within a single crawler.

It is also worth being clear about what the marker is not. It is not a robots.txt directive, not a second product token, and not something to add to your file. There is nothing to configure. It exists so that a site whose access logs omit the request path can still tell which requests were for robots.txt, and a site whose logs do include paths already had that information.

Two requests from one crawler

  • GET /pricing compatible; OAI-SearchBot/1.4; +https://openai.com/searchbot matches the documented string
  • GET /robots.txt compatible; OAI-SearchBot/1.4; robots.txt; +https://openai.com/searchbot does not match, extra segment
  • Filter on the substring OAI-SearchBot matches both
  • Filter on equality with the published page string misses every robots.txt fetch
The two user agent strings OpenAI publishes for OAI-SearchBot, quoted from its crawler documentation on 29 July 2026, and what an exact match filter does with each.

Our own copies of these strings are out of date

Reading a vendor page carefully invites the same reading of your own files, so here is what the comparison found. Lantad's crawler registry is a single array called BOT_REGISTRY in core/src/bots.ts. It holds fifteen tokens, three of them OpenAI's: GPTBot, OAI-SearchBot and ChatGPT-User. There is no OAI-AdsBot row, so no Lantad surface prints a robots.txt verdict for it.

The stored user agent strings have drifted. Our GPTBot entry records GPTBot/1.2 against the documented GPTBot/1.4. Our OAI-SearchBot entry records OAI-SearchBot/1.0, and it has drifted further than a version number: the documented string is now a full browser style user agent beginning "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" and carrying a Chrome token, where ours is the older short form with no browser segment at all. Our ChatGPT-User entry matches the documented string exactly. The docsUrl on all three entries points at platform.openai.com/docs/bots, which returned a 301 redirect to developers.openai.com/api/docs/bots when we requested it on 29 July 2026.

The consequence is real but smaller than it first looks, and overstating it would be the same error as ignoring it. That stored string is sent as the request user agent by the differential probe in core/src/pipeline.ts, the step that fetches a page as a named crawler to see whether the site treats it differently. Since almost any site-side rule keys on the product token rather than the full string, a stale version number is unlikely to change a probe result. What it does mean is that a file whose comment describes it as the vendor's published request user agent no longer holds the vendor's published request user agent, and that is worth fixing before it matters rather than after.

The missing OAI-AdsBot row is the more interesting gap, because adding it is not a one line data change. BOT_PURPOSES in the same file has exactly three members: training, search and user_agent. Validating a landing page an advertiser submitted is none of those three. The purpose classes are load bearing rather than descriptive, since PENALIZED_PURPOSES names the classes whose disallow costs a site points in the Access sub-score, and the mapping from purpose to audience is written to be total, so adding a fourth class is a deliberate compile error until somebody decides what the report would say about it. That is the same design that stopped a Googlebot gap being papered over, described in the one crawler our scanner does not model.

Two of those four gaps are corrections and two are decisions, which is why this post reports them rather than quietly shipping a patch alongside it. The scoring rules are published on our methodology page, the principle that a number we cannot explain does not ship is in why we will not grade a page we could not measure, and if you want the platform specific version of all this, how to get cited by ChatGPT is the evergreen page underneath this dated argument.

Documented by OpenAI

  • GPTBot/1.4, training
  • OAI-SearchBot/1.4, browser style string
  • ChatGPT-User/1.0, user initiated
  • OAI-AdsBot/1.0, ad landing page validation
  • Four published IP range files

Stored in core/src/bots.ts

  • GPTBot/1.2, two versions behind
  • OAI-SearchBot/1.0, short form, no browser segment
  • ChatGPT-User/1.0, matches exactly
  • No OAI-AdsBot row, and no purpose class for one
  • docsUrl points at a URL that now redirects
OpenAI's documented OpenAI crawler set against Lantad's stored registry, both read on 29 July 2026.

Related

Common questions

Where does OpenAI publish its crawler IP ranges?

In four separate JSON files, one per crawler, linked from the crawler overview at developers.openai.com/api/docs/bots: openai.com/gptbot.json, openai.com/searchbot.json, openai.com/adsbot.json and openai.com/chatgpt-user.json. Each contains a creationTime string and an array of CIDR prefixes. Read on 29 July 2026 they carried 21, 35, 2 and 286 prefixes respectively, and every entry in all four was IPv4.

Does a larger published IP range mean a crawler is fetching more pages?

No, and nothing in these files supports that reading. A published range states where requests may originate, not how many are sent. A fleet spread across more regions needs more blocks, a provider allocating in small units publishes more of them, and none of the four files carries an expiry or marks a prefix as retired, so an old range may no longer be in service. Answering the volume question requires observing traffic, which this post did not do.

Does robots.txt stop ChatGPT-User from fetching my page?

OpenAI's crawler documentation states that because ChatGPT-User actions are initiated by a user, robots.txt rules may not apply, and that ChatGPT-User is not used for crawling the web in an automatic fashion. The same page directs site owners managing search opt outs to OAI-SearchBot instead. If you need refusal rather than a request, robots.txt is the wrong layer for it: RFC 9309 describes a protocol a crawler chooses to consult, and enforcement lives at your edge or origin.

Should I block OAI-AdsBot?

That is a business decision rather than a visibility one, and the documentation is thinner here than for the other three. OpenAI states that OAI-AdsBot only visits pages submitted as ads on ChatGPT, that it may check those landing pages against OpenAI's ad policies, and that the data it collects is not used to train generative AI foundation models. It states nothing about how the crawler treats robots.txt. If your organisation runs ads on ChatGPT, the pages this crawler visits are pages you submitted yourself.

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.