A request that calls itself Googlebot is real only if its IP address sits inside a range Google published. 10 operators publish such ranges: 18 JSON files hold 3,084 entries, and Amazon puts three more lists on its own pages. The table gives every address with its entry count and the date inside the file, all opened on 2026-11-08. The download is the same table as a CSV plus a short script that checks one IP against all 18 files.
- dataset
- script
Official crawler IP ranges: 18 lists and an IP checker
Where search and AI crawlers publish their IP ranges: 18 JSON lists with entry counts and dates, Amazon's three pages, and a script that checks an IP address.
- v1.0
- updated 8 November 2026
- MIT
- Vladislav Krivorutško
10
operators publish their ranges
18
JSON lists, 3,084 entries
3
Amazon pages instead of files
2026-11-08
date every address was opened
Files in this resource
2 files · or all in one zipThe 18 JSON lists
Every file has the same shape: a prefixes array whose items hold an ipv4Prefix or an ipv6Prefix.
| Operator | Bots | Class | List | IPv4 | IPv6 | File dated |
|---|---|---|---|---|---|---|
| Googlebot and other common Google crawlers | search and crawl | developers.google.com/static/crawling/ipranges/common-crawlers.json | 170 | 147 | 2026-11-06 | |
| Google special-case crawlers (AdsBot and others) | special-case (ads and others) | developers.google.com/static/crawling/ipranges/special-crawlers.json | 136 | 136 | 2026-11-06 | |
| Google user-triggered fetchers | user-triggered | developers.google.com/static/crawling/ipranges/user-triggered-fetchers.json | 544 | 544 | 2026-11-06 | |
| Google user-triggered fetchers (google.com addresses) | user-triggered | developers.google.com/static/crawling/ipranges/user-triggered-fetchers-google.json | 252 | 252 | 2026-11-06 | |
| Google user-triggered agents | user-triggered | developers.google.com/static/crawling/ipranges/user-triggered-agents.json | 12 | 8 | 2026-11-06 | |
| Microsoft Bing | Bingbot | search | www.bing.com/toolbox/bingbot.json | 29 | 0 | 2024-01-03 |
| Apple | Applebot | search | search.developer.apple.com/applebot.json | 24 | 0 | 2026-09-15 |
| OpenAI | GPTBot | training | openai.com/gptbot.json | 18 | 0 | 2026-09-22 |
| OpenAI | OAI-SearchBot | search | openai.com/searchbot.json | 39 | 0 | 2026-01-02 |
| OpenAI | ChatGPT-User | user-triggered | openai.com/chatgpt-user.json | 237 | 0 | 2026-11-06 |
| Perplexity | PerplexityBot | search | www.perplexity.ai/perplexitybot.json | 13 | 0 | 2026-10-28 |
| Perplexity | Perplexity-User | user-triggered | www.perplexity.ai/perplexity-user.json | 10 | 0 | 2026-10-28 |
| Anthropic | ClaudeBot, Claude-SearchBot, Claude-User | training, search and user-triggered | claude.com/crawling/bots.json | 14 | 0 | 2026-10-20 |
| OpenAI | OAI-AdsBot | ads | openai.com/adsbot.json | 2 | 0 | 2026-05-12 |
| Common Crawl | CCBot | dataset crawl | index.commoncrawl.org/ccbot.json | 4 | 1 | 2026-08-11 |
| DuckDuckGo | DuckAssistBot | search | duckduckgo.com/duckassistbot.json | 486 | 0 | 2026-09-01 |
| Mistral AI | MistralAI-Index | search | mistral.ai/mistralai-index-ips.json | 2 | 0 | 2026-04-19 |
| Mistral AI | MistralAI-User | user-triggered | mistral.ai/mistralai-user-ips.json | 4 | 0 | 2025-02-19 |
The date is the timestamp the operator put inside the file. Bing's file carries 2024-01-03 and still holds 29 ranges on 2026-11-08, so read the date as "last stamped by the operator", not as proof that a list is current.
Amazon: three pages, not JSON files
Amazon lists its addresses on three pages of its developer site. Each page embeds the data as JSON text, and the pages use different field names (ipv4Prefix for single addresses, ip_prefix for CIDR blocks), so the script does not read them. The counts are the number of entries found in the page text on 2026-11-08.
| Bot | Class | Page | Entries | Dated |
|---|---|---|---|---|
| Amazonbot | training | developer.amazon.com/amazonbot/ip-addresses/ | 1,292 | 2026-09-08 |
| Amzn-SearchBot | search | developer.amazon.com/amazonbot/searchbot-ip-addresses/ | 816 | 2026-09-08 |
| Amzn-User | user-triggered | developer.amazon.com/amazonbot/live-ip-addresses/ | 1,023 | 2025-11-04 |
Who publishes no list
- Meta: the crawler page gives user agent strings for meta-externalagent, meta-externalfetcher, Meta-WebIndexer and facebookexternalhit but no list of IP ranges (checked 2026-11-08). Requests that call themselves Meta can only be judged by their user agent.
- ByteDance (Bytespider) and MistralAI-Training: no list documented on the date above.
- Google-Extended and Applebot-Extended are robots.txt control tokens. They do not crawl, so they have no IP ranges.
Check one IP
python check_ip.py 66.249.66.1 2001:4860:4801:10::1 132.196.86.1 8.8.8.8
The script downloads the 18 lists listed in the CSV and prints the matching list for each address. Output from the run on 2026-11-08:
66.249.66.1 google-common (Googlebot and other common Google crawlers)
2001:4860:4801:10::1 google-common (Googlebot and other common Google crawlers)
132.196.86.1 openai-gptbot (GPTBot)
8.8.8.8 no match in 18 lists
Run it on the IPs behind a suspicious user agent in your own log. An address that calls itself Googlebot and matches nothing is not Google. In one 30-day audit of a single site, 531 of 2,278 requests that called themselves Google came from 21 IP addresses outside Google's published ranges.
Rather have this done for you?
Send the site address and what you want to know. We run the audit and send the report.
Keep it fresh
Operators change these files, and some addresses move. The CSV is a snapshot of 2026-11-08. check_ip.py downloads the lists on every run, so only the counts and dates in the CSV age. The log audit kit does the same download for 13 of these lists before it classifies a log.
Limits
An IP inside a published range shows who runs the machine, not why the request was made. Google documents a second check as well, a reverse DNS lookup of the address; the lists are the faster one when you have thousands of log lines. The lists are for verifying requests that already reached you. Do not turn them into firewall rules without testing: operators add and drop ranges, and the CSV is a snapshot.
Tested on
On 2026-11-08 all 18 JSON addresses and the three Amazon pages answered HTTP 200 and were parsed with Python 3.13. check_ip.py ran against four addresses: an IPv4 and an IPv6 address inside Google's common crawler list, one inside OpenAI's GPTBot list, and 8.8.8.8, which matched nothing. The five operator pages below also answered 200.
Sources
| Operator | Page | Checked |
|---|---|---|
| Verifying requests from Google crawlers | 2026-11-08 | |
| Bing | Verify Bingbot | 2026-11-08 |
| Apple | About Applebot | 2026-11-08 |
| OpenAI | Crawlers and user agents | 2026-11-08 |
| Perplexity | Perplexity crawlers | 2026-11-08 |
| Amazon | Amazonbot | 2026-11-08 |
Files are provided as is: run them on your own data and check the result.
Want an audit like this on your site?
If you would rather have it done for you, send a request and describe the site.