Skip to content
Leadee
Tutorial · ChatGPT

How to Find ChatGPT Bots in Your Server Logs

Search your web server or CDN access log for the three OpenAI user-agent tokens (OAI-SearchBot, ChatGPT-User and GPTBot), then check each request's IP address against the IP lists OpenAI publishes for that bot. Only requests from those ranges are really OpenAI. Then count visits by bot, page and status code. Plan about 30 minutes with a week of logs.

By the Netbase JSC team · Updated

Key facts

OpenAI, 2026
OpenAI runs separate bots with their own user-agent tokens: OAI-SearchBot for ChatGPT search, ChatGPT-User for user actions in ChatGPT and Custom GPTs, and GPTBot for model training, and it publishes an IP list for each. (OpenAI, 2026)
Leadee test, Nov 2026
On 2026-11-09 OpenAI's lists held 39 IPv4 prefixes for OAI-SearchBot, 18 for GPTBot and 237 for ChatGPT-User; the ChatGPT-User file had been regenerated three days earlier. (Leadee test, Nov 2026)
Leadee test, Nov 2026
Requests we sent from our own server with the OAI-SearchBot and ChatGPT-User user agents got HTTP 200 on 8 of 8 Netbase JSC sites. In a log they look exactly like OpenAI; only the IP address gives them away. (Leadee test, Nov 2026)
OpenAI, 2026
OpenAI says that because ChatGPT-User actions are started by a user, robots.txt rules may not apply to them. (OpenAI, 2026)

Can OpenAI's bots reach your site at all?

Before you read your logs, check that robots.txt and your firewall let OpenAI's bots in. If a bot is blocked, you will see few or no visits from it — or a row of 403s. The test reads robots.txt and fetches your homepage as each bot. Free, no account.

Leadee is not affiliated with, endorsed by, or sponsored by OpenAI. “ChatGPT”, “GPTBot” and the other names on this page are OpenAI's own, used only to describe what this tool measures.

What did we find in OpenAI's published IP lists?

On 2026-11-09 we downloaded the three IP-range files OpenAI links from its bot documentation. Each file is a small JSON document with a creationTime and a list of prefixes. All three contained IPv4 prefixes only. The ChatGPT-User list is much longer than the other two and was only three days old when we fetched it, so these lists change. Download them fresh each time you check; do not copy ranges from a blog post, including this one.

Leadee's own bot catalogue (the list our log import and audits use) marks OAI-SearchBot, GPTBot, ChatGPT-User and OAI-AdsBot as verifiable by these IP lists. Two other OpenAI-related entries it carries, "ChatGPT Agent" and "OpenAI", come from a community list and have no published IP list we could check them against.

Why the IP check matters: in an earlier test the same day we requested the homepages of 8 Netbase-owned sites (the 7 sites of Netbase JSC plus leadee.ai, which is part of Netbase JSC) with the OAI-SearchBot and ChatGPT-User user agents, from our own server. All 8 answered HTTP 200. Anyone can do the same. In those sites' access logs, our requests would carry the same user agent as OpenAI's real bots; only the IP address, which is not in OpenAI's ranges, shows they were not OpenAI.

OpenAI's published IP-range files, fetched 2026-11-09
FileBotcreationTime in the fileIPv4 prefixesIPv6 prefixes
openai.com/searchbot.jsonOAI-SearchBot2026-01-02390
openai.com/gptbot.jsonGPTBot2026-09-22180
openai.com/chatgpt-user.jsonChatGPT-User2026-11-062370

Step 1: Get your raw access logs

You need the raw request log, not Google Analytics. Bots do not run analytics scripts, so they never appear there. Where to find the log:

If your site sits behind a CDN or proxy (Cloudflare, a load balancer), the client IP in your origin server's log is usually the proxy's address, not the bot's. Use the CDN's own logs, or a log format that records the forwarded client IP. Otherwise the IP check in Step 3 will mark every request as unverified.

  • Apache or Nginx on your own server: usually /var/log/apache2/access.log or /var/log/nginx/access.log, with older days rotated into .gz files. The default "combined" format holds the IP, date, request, status code, referrer and user agent.
  • Shared hosting: look for "Raw access logs" or "Logs" in cPanel or your host's control panel.
  • Cloudflare: HTTP request logs (Logpush, or Logpull on plans that have it) as JSON lines with fields such as ClientIP, ClientRequestPath, EdgeResponseStatus and ClientRequestUserAgent.
  • Take at least 7 days. Search crawlers do not visit every day, and one day of log can easily show nothing.

Step 2: Find the OpenAI user-agent tokens

Each OpenAI bot puts its name in its user-agent string, as listed on OpenAI's bot page (checked 2026-11-09). For example, ChatGPT-User sends Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot. The version numbers change, so search for the name only: OAI-SearchBot, ChatGPT-User, GPTBot and, if you run ChatGPT ads, OAI-AdsBot.

These commands work on a combined-format log on Linux or macOS. Use zgrep instead of grep for rotated .gz files.

  • Count requests per bot: grep -oE "OAI-SearchBot|ChatGPT-User|GPTBot|OAI-AdsBot" access.log | sort | uniq -c
  • Show the raw lines for one bot: grep "OAI-SearchBot" access.log | less
  • Cloudflare JSON lines, with jq: jq -r 'select(.ClientRequestUserAgent | test("OAI-SearchBot|ChatGPT-User|GPTBot")) | [.ClientIP, .EdgeResponseStatus, .ClientRequestPath, .ClientRequestUserAgent] | @tsv' cloudflare.json

Step 3: Check the IP addresses against OpenAI's lists

A matching user agent proves nothing on its own, as our test above shows. Check every IP against the list for that bot: OAI-SearchBot against https://openai.com/searchbot.json, GPTBot against https://openai.com/gptbot.json, ChatGPT-User against https://openai.com/chatgpt-user.json.

This short Python 3 script (standard library only) downloads the three lists and reads a combined-format log from standard input. Save the five lines as check_openai.py and run python3 check_openai.py < access.log. It prints one line per OpenAI-looking request: the bot, the IP, and whether that IP is inside the bot's published ranges. We tested it on a sample log on 2026-11-09. It expects the user agent to be the last quoted field. If your log format adds a field after it (some Nginx setups append the forwarded-for address), adjust the script first.

  • import ipaddress, json, sys, urllib.request
  • LISTS = {'OAI-SearchBot': 'https://openai.com/searchbot.json', 'GPTBot': 'https://openai.com/gptbot.json', 'ChatGPT-User': 'https://openai.com/chatgpt-user.json'}
  • NETS = {bot: [ipaddress.ip_network(p.get('ipv4Prefix') or p['ipv6Prefix']) for p in json.load(urllib.request.urlopen(url))['prefixes']] for bot, url in LISTS.items()}
  • def verified(bot, ip): return any(ipaddress.ip_address(ip) in net for net in NETS[bot])
  • for line in sys.stdin: ip, ua = line.split()[0], line.rsplit('"', 2)[-2]; bot = next((b for b in NETS if b in ua), None); bot and print(bot, ip, 'verified' if verified(bot, ip) else 'NOT in the list')

Step 4: Count visits by bot and page

Once you know which lines are real, see which pages each bot reads. In the combined format the requested path is field 7 and the status code is field 9. If Step 3 showed spoofed requests, filter those IPs out first.

Look for your important pages: pricing, service and product pages, the pages you want ChatGPT to quote. If OAI-SearchBot keeps fetching old blog posts and never your main service page, check your internal links and sitemap. Our guide to writing pages ChatGPT can quote covers what to put on those pages once the bot reaches them.

  • Top pages for one bot: grep "OAI-SearchBot" access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -20
  • Visits per day: grep "OAI-SearchBot" access.log | awk '{print substr($4, 2, 11)}' | uniq -c
  • Is a bot fetching robots.txt or llms.txt? grep -E "OAI-SearchBot|GPTBot" access.log | grep -E "GET /(robots|llms)\.txt"

Step 5: Check the status codes for blocks

A bot that visits but gets an error has not read your page. Count the status codes per bot: grep "ChatGPT-User" access.log | awk '{print $9}' | sort | uniq -c.

What the codes usually mean: 200 is a normal read; 301/302 is a redirect (fine if it leads to a 200); 403 means something refused the bot, often a firewall, CDN bot rule or security plugin; 429 means rate limiting; 5xx means your server failed. A row of 403s for a verified OpenAI IP is the case to fix. Allow-list that bot in the firewall or CDN, not only in robots.txt.

If the bot does not appear at all, the block may sit in front of your server where your log never sees it, or robots.txt tells it not to come. Check robots.txt with the ChatGPT Bot Access Test above, and see robots.txt rules for AI crawlers for the exact rules.

Step 6: Read what each bot's visits mean

The three bots do different jobs, so their visits mean different things. The full comparison is in OAI-SearchBot vs GPTBot vs ChatGPT-User.

  • OAI-SearchBot: OpenAI's search crawler, used to show sites in ChatGPT's search features. Regular visits to your key pages are what you want. A visit does not mean ChatGPT will cite the page.
  • ChatGPT-User: fetches a page when a ChatGPT or Custom GPT user's action needs it. A hit is a sign that a real conversation pulled your page, but the log does not show the question or whether you were cited.
  • GPTBot: collects training data. Its visits have nothing to do with a live ChatGPT answer. Blocking it is a policy choice, not a visibility problem.
  • OAI-AdsBot: only checks pages submitted as ChatGPT ads. If you do not advertise there, you should not see it.

How do you check whether the visits lead to mentions?

Logs show that OpenAI read your pages. They do not show what ChatGPT said. For that, ask the buyer questions you care about several times and count how often your brand is named and your page cited. Our guides on checking if ChatGPT mentions your brand and keeping a prompt tracking sheet show how.

If you want the bot counts without the command line, Leadee's AI Traffic module imports Apache/Nginx combined logs (also with a trailing forwarded-for field) and Cloudflare JSON lines, and counts AI bot hits by bot, page and status code. It drops client IPs while parsing and does not store them. It matches bots by user agent only, so it does not do the IP check from Step 3. Run that check yourself if spoofed requests matter to you. Where these logs fit in the wider picture is on the ChatGPT SEO overview.

What have we not verified?

  • We did not analyse a real server log for this guide. The commands and the script were tested on a short sample log we wrote ourselves, not on a site's real traffic.
  • We did not check how often OpenAI's bots visit a typical site, so this guide gives no "normal" visit count.
  • The IP lists change (the ChatGPT-User file was 3 days old when we fetched it). Prefix counts here are a snapshot from 2026-11-09.
  • We do not know whether OpenAI ever crawls from addresses outside the published lists. A "not in the list" result is very likely spoofed, not proven spoofed.
  • Our spoofed requests reached 8 Netbase JSC sites. We did not test whether those sites' firewalls would treat the real OpenAI IPs any differently.

Check this on your site

Run the ChatGPT Bot Access Test to see the robots.txt rule and a live fetch result for OAI-SearchBot, ChatGPT-User and GPTBot.

Tools & technical readiness

ChatGPT Bot Access Test

Answers: Check robots.txt and a live fetch for OpenAI's three bots — OAI-SearchBot, ChatGPT-User and GPTBot — to see which one is blocked and by what.

No sign-upTest bot access — ChatGPT Bot Access Test

Questions

Why don't ChatGPT's bots show up in Google Analytics?

Analytics tools count visitors that run their JavaScript tag. Crawlers such as OAI-SearchBot and GPTBot fetch the HTML without running it, so they only appear in server or CDN logs. Visits from people who click a link in ChatGPT can appear in analytics as referral traffic.

Is a request with "ChatGPT-User" in the user agent always from OpenAI?

No. Anyone can send that header; our own test requests did. Check the IP address against openai.com/chatgpt-user.json before you count it.

I see GPTBot but never OAI-SearchBot. Is that a problem?

It can be. GPTBot is for training; OAI-SearchBot is the one tied to ChatGPT search. Check that robots.txt and your firewall allow OAI-SearchBot, and give it at least a few weeks of logs before you draw a conclusion.

Should I block bots whose IP is not in OpenAI's lists?

You can rate-limit or block them like any other unknown scraper. Be careful with rules based only on the user agent: blocking by name also blocks the real bot. Firewall rules that check the published IP ranges are the safer option.

Can GEO guarantee results?

No. AI answer engines change their output frequently, and no vendor — including Leadee — can guarantee a ranking or a mention. Leadee publishes confidence intervals on every metric so you can see how much a result can vary run to run.

How does Leadee measure AI visibility?

Leadee runs your prompt set against each AI engine on a weekly to daily schedule, depending on plan, through official vendor APIs (OpenAI, Gemini, Perplexity, Anthropic, DataForSEO) — never by scraping consumer chat interfaces — and reports mention rate, citation rate, average position, share of voice and sentiment with a 95% confidence interval.

Who do I talk to?

Email support@leadee.ai or use Talk to an expert at https://leadee.ai/contact-sales — the Netbase JSC team behind Leadee replies by email or WhatsApp — or WhatsApp the CEO directly at https://wa.me/84937869689.

See where your own site stands

Run a free scan to check this (and everything else Leadee tracks) on your own site.