A user agent is a claim, not an identity
Every request that reaches a web server carries a line of text saying what sent it. For a browser it says Chrome or Safari; for a crawler it says Googlebot or GPTBot. That line is written by whoever makes the request, and nothing on the internet checks it. Copying it takes one keystroke.
Microsoft states the consequence plainly in its own documentation: a bot using exactly the same user agent as Bingbot does not thereby become Bingbot. So the string is useful for reading logs and useless for making decisions. Anything that grants access, skips a rate limit, or exempts a request from a rule has to be based on something the sender cannot choose — and the only thing a sender cannot choose is the address the packets actually come from.
That is the entire subject of this page: turning a name into an address you can check.
Five kinds of bot, and they are not interchangeable
Server logs mix them all together, which is why "bot traffic" as a single number tells you almost nothing. They differ in what they take and what they give back:
| Kind | What it does | What it gives you |
|---|---|---|
| Search | Walks the site to index it | Readers, later, from search results |
| AI — training | Collects text into a training corpus | Nothing measurable. No visits, no citation |
| AI — retrieval | Builds the index an assistant quotes from | Citations, and the traffic that follows them |
| Link preview | Fetches one page to draw a card in a chat | A link that looks like something instead of a bare URL |
| SEO / analytics | Builds a commercial link index | Nothing, unless you are a paying customer of that product |
The AI row is the one most often collapsed by mistake. A training crawler and a retrieval crawler belong to the same company, arrive from similar addresses, and want completely different things. Blocking training costs you nothing visible. Blocking retrieval removes you from the answers that assistant gives — and that is now a real share of how people find anything.
There is a fourth thing in the logs that is not a bot at all: port scanners and vulnerability tools. They never read robots.txt, they are not crawling, and they belong in a different conversation from the one on this page.
Path one: build the list yourself, from the source
This is the slower path and the one worth understanding, because it does not depend on anyone — including this page — being honest or up to date.
Method one: the published range file
Most large operators publish the addresses their crawlers use, as a JSON file at a fixed URL. The format settled into a common shape: a creationTime and a list of ipv4Prefix and ipv6Prefix entries in CIDR notation. You fetch the file, you check whether the address in your log falls inside one of the prefixes, and you have an answer that cannot be faked.
Three rules make the difference between doing this correctly and doing it badly:
- Treat it as a feed, not as a constant. These files change. Pasting today's contents into a firewall rule produces something that is quietly wrong in a month. Refresh on a schedule and keep the previous copy if a fetch fails.
- Never substitute the hosting network for the published file. It is tempting, because the network number is easy to look up and covers everything. It is also wrong: the same cloud network hosts the crawler and every attacker who rented a machine next to it. "Verified by network number" is an answer that is confident and false.
- Use the right file for the right bot. Operators split their crawlers across several files precisely because the crawlers do different jobs. Checking a training crawler against the search crawler's file conflates two things you may want to treat differently.
One more caution that costs people hours: an address that is in the file proves the bot is genuine, but an address that is not in the file proves very little. User-triggered fetchers — the ones that run because a person asked an assistant about a specific link — legitimately come from ordinary cloud addresses outside the crawler ranges.
Method two: forward-confirmed reverse DNS
Several major search engines — Yandex, Baidu, Naver, Seznam and others — publish no range file at all, and their documentation says so explicitly: verify us by reverse DNS instead. The check has three steps and all three are required:
- Ask what hostname the address claims:
dig -x 66.249.66.1 +short - Check that the hostname ends in the operator's domain at a dot boundary.
- Resolve that hostname forward —
dig crawl-66-249-66-1.googlebot.com +short— and confirm the answer contains the address you started with.
Step three is what makes it "forward-confirmed", and skipping it makes the whole check worthless: anyone who controls the reverse zone for their own addresses can point it at any name they like. Only the round trip proves the operator's own DNS agrees.
Step two hides a trap that is easy to write and hard to see. Testing whether the hostname merely ends with googlebot.com also accepts evilgooglebot.com. The comparison has to be against .googlebot.com with the leading dot, or against the bare domain itself. This is a one-character bug that turns a verification into a rubber stamp.
A missing reverse record is not evidence either way. It means "not confirmed", never "confirmed fake" — plenty of legitimate infrastructure has no reverse DNS at all.
Who publishes what
The addresses below are the operators' own pages. They are printed as plain text on purpose: copy the one you need and open it yourself, so that what you end up trusting is the vendor's file rather than anyone's transcription of it — including ours.
Search engines
They send readers. Blocking one removes you from that search engine, and nothing tells you it happened.
| Bot | What it does | How its owner says to verify it |
|---|---|---|
GooglebotGooglebot | Indexes pages for Google Search; the same file also covers Googlebot-Image, -News and -Video. | Published range file:https://developers.google.com/static/crawling/ipranges/common-crawlers.jsonReverse DNS ends in googlebot.comDocumentation: https://developers.google.com/search/docs/crawling-indexing/verifying-googlebot |
AdsBot · Mediapartners-Google · Google-InspectionToolMediapartners-Google | Special-purpose fetchers: ad quality checks, AdSense content matching, and the URL Inspection tool. | Published range file:https://developers.google.com/static/crawling/ipranges/special-crawlers.jsonReverse DNS ends in google.comDocumentation: https://developers.google.com/search/docs/crawling-indexing/google-common-crawlers |
Google user-triggered fetchersGoogle-Site-Verification | Fetches a page because a person asked a Google product to — site verification, feed reading, safety checks. | Published range file:https://developers.google.com/static/crawling/ipranges/user-triggered-fetchers.jsonDocumentation: https://developers.google.com/search/docs/crawling-indexing/google-user-triggered-fetchers |
| Bingbot Microsoft bingbot | Indexes pages for Bing, and through Bing for a number of other search products. | Published range file:https://www.bing.com/toolbox/bingbot.jsonReverse DNS ends in search.msn.comDocumentation: https://www.bing.com/webmasters/help/how-to-verify-bingbot-3905dc26 |
| DuckDuckBot DuckDuckGo DuckDuckBot | Crawls for DuckDuckGo; the published file lists individual addresses, not wide ranges. | Published range file:https://duckduckgo.com/duckduckbot.jsonReverse DNS ends in duckduckgo.comDocumentation: https://duckduckgo.com/duckduckgo-help-pages/results/duckduckbot/ |
| Applebot Apple Applebot | Feeds Siri, Spotlight and Safari Suggestions; blocking it removes the site from all three. | Published range file:https://search.developer.apple.com/applebot.jsonReverse DNS ends in applebot.apple.comDocumentation: https://support.apple.com/en-us/119829 |
| YandexBot Yandex YandexBot | Indexes for Yandex Search. No range file exists: the documentation asks for reverse DNS instead. | Reverse DNS ends in yandex.ruDocumentation: https://yandex.com/support/webmaster/robot-workings/check-yandex-robots.html |
| Baiduspider Baidu Baiduspider | The main crawler of the largest Chinese search engine; verified by reverse DNS only. | Reverse DNS ends in baidu.comDocumentation: https://help.baidu.com/question?prod_id=99&class=0&id=3001 |
| Sogou Spider Sogou Sogou | Chinese search crawler with a long-standing reputation for crawling harder than its traffic justifies. | Reverse DNS ends in crawl.sogou.comDocumentation: https://www.sogou.com/docs/help/webmasters.htm |
| SeznamBot Seznam.cz SeznamBot | The crawler of the Czech search engine Seznam — meaningful traffic if you have Czech readers. | Reverse DNS ends in seznam.czDocumentation: https://napoveda.seznam.cz/en/full-text-search/seznambot-crawler/ |
| Yeti (NaverBot) Naver Yeti | The dominant search engine in South Korea; reverse DNS is the documented check. | Reverse DNS ends in naver.comDocumentation: https://searchadvisor.naver.com/guide/seo-basic-robots |
| CocCocBot Coc Coc coccocbot | Vietnamese search engine and browser; relevant only if you have Vietnamese readers. | Reverse DNS ends in coccoc.comDocumentation: https://coccoc.com/searchengine |
| Yahoo! Slurp Yahoo Slurp | Much smaller than it once was, but still active; reverse DNS is the only check. | Reverse DNS ends in crawl.yahoo.netDocumentation: https://help.yahoo.com/kb/SLN22600.html |
| PetalBot Huawei PetalBot | Crawler of Huawei Petal Search; a real search engine, but frequently named in complaints about crawl volume. | Reverse DNS ends in petalsearch.comDocumentation: https://webmaster.petalsearch.com/site/petalbot |
| Mail.RU_Bot VK Mail.RU_Bot | Search and link-preview crawler of the Mail.ru group. | Reverse DNS ends in mail.ruDocumentation: https://help.mail.ru/webmaster/indexing/robots |
AI crawlers
Three different jobs under one label: collecting training data, building the index an assistant cites, and fetching one page because a person asked.
| Bot | What it does | How its owner says to verify it |
|---|---|---|
Google user-triggered agentsGoogle-CloudVertexBot | The newest of the five Google range files: agents acting on behalf of a specific user request. | Published range file:https://developers.google.com/static/crawling/ipranges/user-triggered-agents.jsonDocumentation: https://developers.google.com/search/docs/crawling-indexing/google-common-crawlers |
| GPTBot OpenAI GPTBot | Collects content for model training. Sends no visitors and produces no citations. | Published range file:https://openai.com/gptbot.jsonDocumentation: https://platform.openai.com/docs/bots |
| OAI-SearchBot OpenAI OAI-SearchBot | Builds the index ChatGPT search cites from. This is the one that decides whether you can be cited at all. | Published range file:https://openai.com/searchbot.jsonDocumentation: https://platform.openai.com/docs/bots |
| ChatGPT-User OpenAI ChatGPT-User | Fetches one page because a live person asked the assistant about that exact link. | Published range file:https://openai.com/chatgpt-user.jsonDocumentation: https://platform.openai.com/docs/bots |
| OAI-AdsBot OpenAI OAI-AdsBot | Checks pages in the context of advertising products. | Published range file:https://openai.com/adsbot.jsonDocumentation: https://platform.openai.com/docs/bots |
| ClaudeBot · Claude-User · Claude-SearchBot Anthropic ClaudeBot | One published file covers the training crawler, the user-triggered fetcher and the search crawler. | Published range file:https://claude.com/crawling/bots.jsonDocumentation: https://support.claude.com/en/articles/8896518 |
| PerplexityBot Perplexity PerplexityBot | Indexing crawler, not a training one — Perplexity does not build foundation models. | Published range file:https://www.perplexity.ai/perplexitybot.jsonDocumentation: https://docs.perplexity.ai/guides/bots |
| Perplexity-User Perplexity Perplexity-User | Fetches a page on the spot because a person asked about it. | Published range file:https://www.perplexity.ai/perplexity-user.jsonDocumentation: https://docs.perplexity.ai/guides/bots |
| CCBot Common Crawl CCBot | A non-profit archive whose corpus is the raw material for a large share of public model training. | Published range file:https://index.commoncrawl.org/ccbot.jsonDocumentation: https://commoncrawl.org/ccbot |
| Amazonbot Amazon Amazonbot | Amazon publishes three separate files; this one is the general crawler. | Published range file:https://developer.amazon.com/amazonbot/ip-addresses/Documentation: https://developer.amazon.com/amazonbot |
| Amzn-SearchBot Amazon Amzn-SearchBot | Builds the search index behind Amazon products. | Published range file:https://developer.amazon.com/amazonbot/searchbot-ip-addresses/Documentation: https://developer.amazon.com/amazonbot |
| Amzn-User Amazon Amzn-User | A live fetch started by a person inside an Amazon assistant. | Published range file:https://developer.amazon.com/amazonbot/live-ip-addresses/Documentation: https://developer.amazon.com/amazonbot |
| Meta-ExternalAgent · Meta-ExternalFetcher Meta meta-externalagent | Meta publishes no range file: the documented check is that the address belongs to its network AS32934. | Reverse DNS ends in facebook.comDocumentation: https://developers.facebook.com/documentation/sharing/webmasters/web-crawlers |
Google-ExtendedGoogle-Extended | Not a crawler and has no addresses of its own: a robots.txt token that opts you out of Gemini training without touching Search. | No published ranges and no reverse DNS — the user agent is all there is. Documentation: https://developers.google.com/search/docs/crawling-indexing/overview-google-crawlers |
| Applebot-Extended Apple Applebot-Extended | The same idea as Google-Extended: opts out of Apple Intelligence training while keeping Siri and Spotlight. | No published ranges and no reverse DNS — the user agent is all there is. Documentation: https://support.apple.com/en-us/119829 |
Link previews
Not crawls at all. One request, made because a human pasted your link into a chat.
| Bot | What it does | How its owner says to verify it |
|---|---|---|
| TelegramBot Telegram TelegramBot | Draws the link card when someone sends your URL in a chat. One request, no crawl. | Published range file:https://core.telegram.org/resources/cidr.txtDocumentation: https://core.telegram.org/bots/faq |
| facebookexternalhit Meta facebookexternalhit | Link previews for Facebook, Instagram and Messenger. Blocking it makes shared links look broken. | Reverse DNS ends in facebook.comDocumentation: https://developers.facebook.com/documentation/sharing/webmasters/web-crawlers |
| Twitterbot X Twitterbot | Renders the card for links posted on X. | Reverse DNS ends in twitter.comDocumentation: https://developer.x.com/en/docs/x-for-websites/cards/guides/troubleshooting-cards |
LinkedInBotLinkedInBot | Link previews inside LinkedIn posts and messages. | Reverse DNS ends in linkedin.comDocumentation: https://www.linkedin.com/help/linkedin/answer/a522991 |
PinterestbotPinterestbot | Fetches pages behind saved pins. | Reverse DNS ends in pinterest.comDocumentation: https://help.pinterest.com/en/business/article/pinterest-crawler |
| Discordbot Discord Discordbot | Link previews in Discord. No published ranges and no reverse DNS — user agent is all there is. | No published ranges and no reverse DNS — the user agent is all there is. Documentation: https://discord.com/developers/docs/reference |
| Slackbot-LinkExpanding Slack Slackbot-LinkExpanding | Unfurls links posted in Slack channels. | No published ranges and no reverse DNS — the user agent is all there is. Documentation: https://api.slack.com/robots |
SEO and analytics
Commercial link indexes. They can be verified like anyone else — the question is not whether they are real, but whether they are worth the bandwidth.
| Bot | What it does | How its owner says to verify it |
|---|---|---|
| AhrefsBot Ahrefs AhrefsBot | Builds a commercial backlink index. Brings no visitors; the data is sold to whoever buys it, including competitors. | Reverse DNS ends in ahrefs.comDocumentation: https://help.ahrefs.com/en/articles/78658-what-is-the-list-of-your-ip-ranges |
| SemrushBot Semrush SemrushBot | Same purpose as AhrefsBot. No machine-readable list is published; the operator points at its own network number instead. | Reverse DNS ends in semrush.comDocumentation: https://www.semrush.com/bot/ |
| DataForSeoBot DataForSEO DataForSeoBot | Collects SEO data resold through an API. | No published ranges and no reverse DNS — the user agent is all there is. Documentation: https://dataforseo.com/dataforseo-bot |
Path two: take the list that is already assembled
The reference above is the honest way to do it and the slow way to do it. If you need the ranges today, here they are: one snapshot, rebuilt daily, containing every range that verification actually confirmed — from the published files above and from forward-confirmed reverse DNS for the operators who publish no files.
Snapshot built 2026-08-25T02:15:02Z (UTC). Crawler addresses change; a copy older than a week or two is already wrong at the edges.
All ranges (.txt)With bot names (.csv)Manifest (.json)
| Bot | Ranges | File |
|---|---|---|
| Applebot Apple | 383 IPv4 383 · IPv6 0 | crawlers-applebot.txt |
| Baiduspider Baidu | 248 IPv4 248 · IPv6 0 | crawlers-baidu.txt |
| Bingbot Microsoft | 1 220 IPv4 1 220 · IPv6 0 | crawlers-bingbot.txt |
| CCBot Common Crawl | 5 IPv4 4 · IPv6 1 | crawlers-ccbot.txt |
| ChatGPT-User OpenAI | 204 IPv4 204 · IPv6 0 | crawlers-chatgpt-user.txt |
| ClaudeBot · Claude-User · Claude-SearchBot Anthropic | 26 IPv4 26 · IPv6 0 | crawlers-claudebot.txt |
| DuckDuckBot DuckDuckGo | 481 IPv4 481 · IPv6 0 | crawlers-duckduckbot.txt |
| Google user-triggered agents | 20 IPv4 12 · IPv6 8 | crawlers-google-agents.txt |
| AdsBot · Mediapartners-Google · Google-InspectionTool | 270 IPv4 135 · IPv6 135 | crawlers-google-special.txt |
| Google user-triggered fetchers | 1 550 IPv4 775 · IPv6 775 | crawlers-google-user.txt |
| Googlebot | 638 IPv4 492 · IPv6 146 | crawlers-googlebot.txt |
| GPTBot OpenAI | 21 IPv4 21 · IPv6 0 | crawlers-gptbot.txt |
| OAI-AdsBot OpenAI | 2 IPv4 2 · IPv6 0 | crawlers-oai-adsbot.txt |
| OAI-SearchBot OpenAI | 35 IPv4 35 · IPv6 0 | crawlers-oai-searchbot.txt |
| Perplexity-User Perplexity | 4 IPv4 4 · IPv6 0 | crawlers-perplexity-user.txt |
| PerplexityBot Perplexity | 8 IPv4 8 · IPv6 0 | crawlers-perplexitybot.txt |
| PetalBot Huawei | 2 IPv4 2 · IPv6 0 | crawlers-petalbot.txt |
| Sogou Spider Sogou | 31 IPv4 31 · IPv6 0 | crawlers-sogou.txt |
| TelegramBot Telegram | 14 IPv4 9 · IPv6 5 | crawlers-telegram-preview.txt |
| YandexBot Yandex | 9 IPv4 9 · IPv6 0 | crawlers-yandex.txt |
Three plain-text formats, because they get used differently. The single .txt is what you feed to a firewall or an ipset. The .csv adds the column the flat file cannot have — whose range each line is — and without it you cannot treat a search crawler differently from a training crawler. The .json is the manifest: counts per crawler and the build timestamp, for scripts that want to check freshness before trusting anything.
What being on this list means: that address really does belong to that crawler. What it does not mean: that you should let it through. Those are two different questions and only the first one has a factual answer. The second depends on what your site is for, and nobody else's list knows that.
What is deliberately missing
Some well-known bots cannot appear in any address list that is honest about its sources:
- Meta's crawlers (
facebookexternalhit,Meta-ExternalAgent) publish no range file. The documented check is that the address belongs to Meta's own network, AS32934, which you can query from a routing registry — a different kind of check with different failure modes. - Discord, WhatsApp and several other preview fetchers publish neither ranges nor reverse DNS. There is nothing to verify against. WhatsApp in particular usually draws its preview on the sender's own device, so the request arrives from an ordinary person's address and never looks like a bot at all.
- Bytespider, Cohere and most of the newer AI crawlers run from general cloud addresses with nothing published. A log line naming them is a claim and stays a claim.
Listing them anyway, with ranges guessed from observation, would be the single most damaging thing this page could do: an allow-list built on a guess is a hole that looks like diligence.
Bots people usually limit, and why
"Bad bot" flattens three unrelated problems together, and the treatment differs for each.
| Bot | Why it is usually limited | Kind |
|---|---|---|
BytespiderByteDance | Collects training data for ByteDance models. Widely reported to ignore robots.txt and to crawl far harder than search engines do. | ignores robots.txt |
MJ12botMajestic | Backlink index for a paid SEO product. Distributed across volunteer machines, so its addresses are all over the place. | costs more than it gives |
BLEXBotWebMeUp | Another backlink crawler; appears in most published block lists. | costs more than it gives |
DotBotMoz | Feeds the Moz link index. Useful if you pay for Moz; otherwise you are indexing yourself for competitors. | costs more than it gives |
BarkrowlerBabbar.tech | Link graph crawler; a regular entry in hosting providers own block lists. | costs more than it gives |
SEOkicksSEOkicks | Backlink database, mostly of interest in the German-speaking market. | costs more than it gives |
SerpstatBotSerpstat | Commercial SEO crawler with the same trade-off as the rest of this group. | costs more than it gives |
ZoominfoBotZoomInfo | Harvests company and contact data for a sales database. | costs more than it gives |
ia_archiver | Historically Alexa, now mostly impersonated: no verification method exists, so a log line proves nothing. The real Internet Archive agent is archive.org_bot. | name without an owner |
masscan · zgrab · nuclei · sqlmap · nikto · wpscan | Not crawlers at all: port scanners and vulnerability tools. They never read robots.txt, so the only answer is a server rule. | not a crawler at all |
Googlebot (підроблений) | The single most common bot on the web that is not what it says. Copying the user agent costs nothing, which is exactly why the address check below exists. | not a crawler at all |
For the first group — the ones that behave, but cost more than they return — robots.txt is the right tool, because they read it:
robots.txt — asking the polite ones to leave
User-agent: MJ12bot Disallow: / User-agent: BLEXBot Disallow: / User-agent: DotBot Disallow: / User-agent: Barkrowler Disallow: / User-agent: SEOkicks Disallow: / User-agent: SerpstatBot Disallow: / User-agent: ZoominfoBot Disallow: /
For the second group, robots.txt is a note left for someone who does not read notes. Enforcement has to happen at the server or the edge. The rule below also repeats the names above, for the case where asking politely produced nothing:
A server rule, for when asking did not work
map $http_user_agent $bad_bot {
default 0;
"~*bytespider" 1;
"~*mj12bot" 1;
"~*blexbot" 1;
"~*dotbot" 1;
"~*barkrowler" 1;
"~*seokicks" 1;
"~*serpstatbot" 1;
"~*zoominfobot" 1;
}
server {
if ($bad_bot) { return 403; }
}
Neither snippet helps against the last group, and it is worth being clear about why: a rule that matches on the user agent only stops the bots that tell the truth about themselves. Something pretending to be Googlebot will call itself a browser the moment the first rule bites. That is not a gap in the snippet — it is the reason the whole first half of this page exists.
Do not paste that list without reading it. facebookexternalhit appears in many published block lists, and blocking it makes every link to your site look broken in Facebook, Instagram and Messenger. Applebot is another: block it and you leave Siri, Spotlight and Safari Suggestions at the same time. The most expensive block-list entries are the ones copied without knowing what they do.
Three mistakes that cost more than the bots
- Allowing a whole hosting network instead of a published range
- The crawler and every attacker who rented a virtual machine beside it share that network number. Allowing it launders an impostor into a guest.
- Treating "not in the list" as proof of a fake
- It is not. Ranges get added; user-triggered fetchers arrive from ordinary cloud addresses by design; your copy of the file may simply be old. In range is proof of genuine. Out of range is only a reason to look closer.
- Copying a list from a blog post and calling it verification
- Second-hand lists are frozen at the moment someone pasted them, and they go stale without ever saying so. If the address you check against did not come from a file the operator publishes, you have not verified anything — you have agreed with a stranger.
The underlying principle is short enough to keep: a name in a log is something the sender chose, and an address is something they could not. Decide on the second one.