AI crawlers on Next.js: allow or block GPTBot, ClaudeBot, PerplexityBot and 78 more
In the App Router, robots.txt is either a static file or the output of app/robots.js, a function that returns the rules. The steps on Next.js, what trips people up there, and a page for each of 81 AI crawlers.
This response
You are ClaudeBot (Anthropic). Citable recognised you as an AI agent, so this is https://getcitable.in/crawlers/on/nextjs with the UI removed — the content only. A browser asking for the same address gets the full designed page.
Where Next.js keeps the rule
In the App Router, robots.txt is either a static file or the output of app/robots.js, a function that returns the rules.
The steps below are shown for GPTBot. Each crawler has its own page, with its own names in the rule.
Step by step
- 1. Write the rule in app/robots.js. Add GPTBot to the rules the function returns. A static app/robots.txt works too, with the plain block.
- 2. To refuse it outright, add a proxy rule. robots.txt asks; a proxy (middleware.js before Next.js 16) answers. Return a 403 when the user agent matches.
- 3. Deploy, then read it back. The file is generated at build time, so the change is live after the next deploy. Open /robots.txt and confirm it.
What to paste
A group that names a crawler replaces the * group for that crawler; it does not add to it. Paths the * group closes are open to a crawler with its own group unless they are repeated there.
app/robots.js, refusing GPTBot:
export default function robots() {
return {
rules: [
{ userAgent: "GPTBot", disallow: "/" },
{ userAgent: "*", allow: "/" },
],
};
}
The same as a static robots.txt:
User-agent: GPTBot
Disallow: /
proxy.js, refusing the request itself:
import { NextResponse } from "next/server";
const REFUSED = /GPTBot/i;
// Next.js 16. Before it, the file is middleware.js and the function is middleware.
export function proxy(request) {
if (REFUSED.test(request.headers.get("user-agent") || "")) {
return new NextResponse("Forbidden", { status: 403 });
}
return NextResponse.next();
}
What trips people up
app/robots.js is run at build time and its output is cached. Editing it changes nothing on the live site until the next deploy. If the site is on Vercel, the Firewall sits in front of all of it.
Asked, or actually refused?
Yes: the proxy runs before the page is rendered, so a 403 from it is a refusal and not a request.
Check it yourself
A 200 means the name is let through; a 403 means something in front of the page refuses it. This tests the name from your own address. A platform that checks a crawler’s address as well may treat the real GPTBot differently.
The request:
curl -I -A "GPTBot" https://your-site.example/
Every AI crawler, on Next.js
- OAI-SearchBot (OpenAI): https://getcitable.in/crawlers/oai-searchbot/nextjs
- ChatGPT-User (OpenAI): https://getcitable.in/crawlers/chatgpt-user/nextjs
- GPTBot (OpenAI): https://getcitable.in/crawlers/gptbot/nextjs
- Claude-SearchBot (Anthropic): https://getcitable.in/crawlers/claude-searchbot/nextjs
- Claude-User (Anthropic): https://getcitable.in/crawlers/claude-user/nextjs
- Claude-Web (Anthropic): https://getcitable.in/crawlers/claude-web/nextjs
- ClaudeBot (Anthropic): https://getcitable.in/crawlers/claudebot/nextjs
- Perplexity-User (Perplexity): https://getcitable.in/crawlers/perplexity-user/nextjs
- PerplexityBot (Perplexity): https://getcitable.in/crawlers/perplexitybot/nextjs
- Google-Extended (Google): https://getcitable.in/crawlers/google-extended/nextjs
- meta-externalfetcher (Meta): https://getcitable.in/crawlers/meta-externalfetcher/nextjs
- meta-externalagent (Meta): https://getcitable.in/crawlers/meta-externalagent/nextjs
- DuckAssistBot (DuckDuckGo): https://getcitable.in/crawlers/duckassistbot/nextjs
- CCBot (Common Crawl): https://getcitable.in/crawlers/ccbot/nextjs
- Applebot-Extended (Apple): https://getcitable.in/crawlers/applebot-extended/nextjs
- Bytespider (ByteDance): https://getcitable.in/crawlers/bytespider/nextjs
- Amazonbot (Amazon): https://getcitable.in/crawlers/amazonbot/nextjs
- YouBot (You.com): https://getcitable.in/crawlers/youbot/nextjs
- cohere-ai (Cohere): https://getcitable.in/crawlers/cohere-ai/nextjs
- PetalBot (Huawei): https://getcitable.in/crawlers/petalbot/nextjs
- Diffbot (Diffbot): https://getcitable.in/crawlers/diffbot/nextjs
- AI2Bot (AI2): https://getcitable.in/crawlers/ai2bot/nextjs
- Timpibot (Timpi): https://getcitable.in/crawlers/timpibot/nextjs
- Kangaroo Bot (Kangaroo): https://getcitable.in/crawlers/kangaroo-bot/nextjs
- omgili (Webz.io): https://getcitable.in/crawlers/omgili/nextjs
- MistralAI-User (Mistral): https://getcitable.in/crawlers/mistralai-user/nextjs
- ChatGPT Agent (OpenAI): https://getcitable.in/crawlers/chatgpt-agent/nextjs
- Operator (OpenAI): https://getcitable.in/crawlers/operator/nextjs
- Gemini-Deep-Research (Google): https://getcitable.in/crawlers/gemini-deep-research/nextjs
- Google-Agent (Google): https://getcitable.in/crawlers/google-agent/nextjs
- NotebookLM (Google): https://getcitable.in/crawlers/notebooklm/nextjs
- Kimi-User (Moonshot AI): https://getcitable.in/crawlers/kimi-user/nextjs
- TongyiBot (Alibaba): https://getcitable.in/crawlers/tongyibot/nextjs
- YiyanBot (Baidu): https://getcitable.in/crawlers/yiyanbot/nextjs
- DoubaoBot (ByteDance): https://getcitable.in/crawlers/doubaobot/nextjs
- Amzn-User (Amazon): https://getcitable.in/crawlers/amzn-user/nextjs
- AmazonBuyForMe (Amazon): https://getcitable.in/crawlers/amazonbuyforme/nextjs
- NovaAct (Amazon): https://getcitable.in/crawlers/novaact/nextjs
- amazon-QBusiness (Amazon): https://getcitable.in/crawlers/amazon-qbusiness/nextjs
- kagi-fetcher (Kagi): https://getcitable.in/crawlers/kagi-fetcher/nextjs
- PhindBot (Phind): https://getcitable.in/crawlers/phindbot/nextjs
- LinerBot (Liner): https://getcitable.in/crawlers/linerbot/nextjs
- Manus-User (Manus): https://getcitable.in/crawlers/manus-user/nextjs
- TwinAgent (Twin): https://getcitable.in/crawlers/twinagent/nextjs
- ShapBot (Parallel): https://getcitable.in/crawlers/shapbot/nextjs
- bigsur.ai (Big Sur AI): https://getcitable.in/crawlers/bigsur-ai/nextjs
- QualifiedBot (Qualified): https://getcitable.in/crawlers/qualifiedbot/nextjs
- KlaviyoAIBot (Klaviyo): https://getcitable.in/crawlers/klaviyoaibot/nextjs
- Poggio-Citations (Poggio): https://getcitable.in/crawlers/poggio-citations/nextjs
- iAskBot (iAsk): https://getcitable.in/crawlers/iaskbot/nextjs
- Crawl4AI (Crawl4AI): https://getcitable.in/crawlers/crawl4ai/nextjs
- Crawlspace (Crawlspace): https://getcitable.in/crawlers/crawlspace/nextjs
- WRTNBot (WRTN): https://getcitable.in/crawlers/wrtnbot/nextjs
- UseAI (UseAI): https://getcitable.in/crawlers/useai/nextjs
- AIWebIndex (Lyrenth): https://getcitable.in/crawlers/aiwebindex/nextjs
- Aranet-SearchBot (Aranet): https://getcitable.in/crawlers/aranet-searchbot/nextjs
- KunatoCrawler (Kunato): https://getcitable.in/crawlers/kunatocrawler/nextjs
- Reflectionbot (Reflection): https://getcitable.in/crawlers/reflectionbot/nextjs
- GeistHaus-PageFetcher (GeistHaus): https://getcitable.in/crawlers/geisthaus-pagefetcher/nextjs
- MistralAI-Index (Mistral): https://getcitable.in/crawlers/mistralai-index/nextjs
- Kimi-SearchBot (Moonshot AI): https://getcitable.in/crawlers/kimi-searchbot/nextjs
- meta-webindexer (Meta): https://getcitable.in/crawlers/meta-webindexer/nextjs
- Bravebot (Brave): https://getcitable.in/crawlers/bravebot/nextjs
- ExaBot (Exa): https://getcitable.in/crawlers/exabot/nextjs
- TavilyBot (Tavily): https://getcitable.in/crawlers/tavilybot/nextjs
- AddSearchBot (AddSearch): https://getcitable.in/crawlers/addsearchbot/nextjs
- LinkupBot (Linkup): https://getcitable.in/crawlers/linkupbot/nextjs
- QueritBot (Querit): https://getcitable.in/crawlers/queritbot/nextjs
- TerraCotta (Ceramic AI): https://getcitable.in/crawlers/terracotta/nextjs
- HenkBot (Valyu): https://getcitable.in/crawlers/henkbot/nextjs
- Channel3Bot (Channel3): https://getcitable.in/crawlers/channel3bot/nextjs
- AzureAI-SearchBot (Microsoft): https://getcitable.in/crawlers/azureai-searchbot/nextjs
- Amzn-SearchBot (Amazon): https://getcitable.in/crawlers/amzn-searchbot/nextjs
- atlassian-bot (Atlassian): https://getcitable.in/crawlers/atlassian-bot/nextjs
- Cloudflare-AutoRAG (Cloudflare): https://getcitable.in/crawlers/cloudflare-autorag/nextjs
- Andibot (Andi): https://getcitable.in/crawlers/andibot/nextjs
- Anomura (Direqt): https://getcitable.in/crawlers/anomura/nextjs
- YandexAdditional (Yandex): https://getcitable.in/crawlers/yandexadditional/nextjs
- GoogleOther (Google): https://getcitable.in/crawlers/googleother/nextjs
- ZanistaBot (Zanista): https://getcitable.in/crawlers/zanistabot/nextjs
- Poseidon Research Crawler (Poseidon Research): https://getcitable.in/crawlers/poseidon-research-crawler/nextjs
Checked against Next.js's own documentation on 1 October 2026
- Next.js docs: robots.txt file convention: https://nextjs.org/docs/app/api-reference/file-conventions/metadata/robots
About Citable
Citable strips the UI from a website for AI agents and serves them only the content.
When an AI agent — ChatGPT, Claude, Perplexity or any of the 81 that Citable recognises — opens a page, Citable removes the theme, scripts, navigation and layout and serves only the content: the same facts, at the same URL, on the site's own domain. People and Google still get the full designed page.
How it works: https://getcitable.in/how-it-works · Summary for AI agents: https://getcitable.in/llms.txt
Source: https://getcitable.in/crawlers/on/nextjs · Citable · Run the free audit · llms.txt · getcitable@gmail.com