Core Summary

AI crawler governance is an access-policy problem, not a list of bots to copy once. A site should distinguish search indexing, model training, and user-directed Agent access, then combine machine-readable preferences with verified identity, enforceable controls, logs, and a content-licensing decision. robots.txt is important, but RFC 9309 explicitly says it is not authorization.

Three Purposes That Need Different Policies

One operator may publish several product tokens because the requests serve different jobs. OpenAI, for example, documents GPTBot for potential model training, OAI-SearchBot for ChatGPT search, and ChatGPT-User for certain user-triggered requests. Anthropic documents a similar split among ClaudeBot, Claude-SearchBot, and Claude-User. Google documents Google-Extended as a control token rather than a separate HTTP User-Agent.

Purpose Typical benefit Primary risk Default question
Search indexing Discovery, links, excerpts crawl load and unwanted snippets Do we want this surface discoverable?
AI input or grounding Citation or answer-engine visibility answer substitution and content exposure Which pages may be used at request time?
Model training Possible ecosystem reach durable reuse with weak attribution Is this use licensed or reserved?
User-directed Agent A user can complete a task automated actions, abuse, and side effects Is the route designed for automation?

Do not infer purpose from the word "AI" in a crawler name. Check the operator's current documentation, because product tokens, use descriptions, and verification methods change.

What robots.txt Actually Guarantees

The Robots Exclusion Protocol defines how a crawler selects a matching User-agent group and applies Allow and Disallow rules. The most specific path match wins; matching groups for the same product token are combined. A 4xx response can be treated as no rules, while an unreachable robots.txt caused by a 5xx or network error is treated as complete disallow for a reasonably long period.

The protocol does not authenticate a crawler and does not protect confidential URLs. A disallowed path remains reachable unless another control denies it. Never place secrets in robots.txt; the file is public and may reveal paths.

A purpose-aware policy example

This example allows documented search crawlers, blocks documented training crawlers, and leaves user-directed agents to application controls:

text
User-agent: OAI-SearchBot
Allow: /

User-agent: GPTBot
Disallow: /

User-agent: Claude-SearchBot
Allow: /

User-agent: ClaudeBot
Disallow: /

User-agent: Google-Extended
Disallow: /

User-agent: *
Disallow: /account/
Disallow: /admin/

The wildcard rules do not replace authentication for /account/ or /admin/. Each subdomain needs its own policy at its own /robots.txt endpoint. Test the response status, media type, encoding, redirects, and rule matching after every deployment.

Separate crawling preference from indexing controls

robots.txt controls crawling, not every downstream use. Search-specific noindex, snippet, or cache directives have their own semantics. Proposed directives such as noai, noimageai, or vendor-specific fields are not part of RFC 9309; do not present them as universally honored standards.

Content Signals is one extension that expresses search, ai-input, and ai-train preferences. It can make intent more granular, but the project itself warns that automated systems may disregard those signals and that courts may not treat them as enforceable obligations. Record it as a policy declaration, not as proof of compliance.

Verify Identity Before Enforcing a Named-Bot Rule

The HTTP User-Agent header is self-asserted. A malicious scraper can send Googlebot, GPTBot, or any other string. Where an operator publishes IP ranges or reverse-DNS verification instructions, use them; then combine identity with behavior and route policy.

A useful request classification record contains:

json
{
  "observed_user_agent": "OAI-SearchBot/1.4",
  "claimed_product_token": "OAI-SearchBot",
  "verified_operator": "openai",
  "purpose": "search",
  "route_class": "public_article",
  "decision": "allow",
  "policy_revision": "crawler-policy-v7"
}

Do not log full query strings, cookies, authorization headers, or private page content. Keep enough evidence to explain the decision and detect changes in crawl behavior.

Build an Enforceable Control Plane

The control plane should receive a verified identity and a classified purpose from trusted infrastructure. The application policy can then make a deterministic decision:

go
package main

import "fmt"

type Purpose string

const (
	PurposeSearch   Purpose = "search"
	PurposeTraining Purpose = "training"
	PurposeAgent    Purpose = "agent"
)

type Request struct {
	Operator       string
	ProductToken   string
	Purpose        Purpose
	IdentityProven bool
	RequestsMinute int
}

func decide(request Request) (string, string) {
	if !request.IdentityProven {
		return "challenge", "crawler identity is unverified"
	}

	switch request.Purpose {
	case PurposeTraining:
		return "deny", "training is not licensed by this policy"
	case PurposeSearch:
		return "allow", "verified search crawler on public content"
	case PurposeAgent:
		if request.RequestsMinute > 20 {
			return "rate_limit", "user-directed automation exceeded its budget"
		}
		return "allow_with_application_auth", "route policy still applies"
	default:
		return "deny", "unknown purpose"
	}
}

func main() {
	requests := []Request{
		{Operator: "openai", ProductToken: "OAI-SearchBot", Purpose: PurposeSearch, IdentityProven: true, RequestsMinute: 4},
		{Operator: "openai", ProductToken: "GPTBot", Purpose: PurposeTraining, IdentityProven: true, RequestsMinute: 4},
		{Operator: "unknown", ProductToken: "Googlebot", Purpose: PurposeSearch, IdentityProven: false, RequestsMinute: 200},
		{Operator: "anthropic", ProductToken: "Claude-User", Purpose: PurposeAgent, IdentityProven: true, RequestsMinute: 27},
	}

	for _, request := range requests {
		action, reason := decide(request)
		fmt.Printf("%s/%s -> %s (%s)\n", request.Operator, request.ProductToken, action, reason)
	}
}

Expected output:

text
openai/OAI-SearchBot -> allow (verified search crawler on public content)
openai/GPTBot -> deny (training is not licensed by this policy)
unknown/Googlebot -> challenge (crawler identity is unverified)
anthropic/Claude-User -> rate_limit (user-directed automation exceeded its budget)

In production, add route classification, tenant boundaries, abuse signals, an emergency bypass, and a decision cache with short expiry. Unknown clients should not inherit the privileges of a claimed operator.

Enforcement Layers and Their Limits

Layer What it does What it cannot prove
robots.txt publishes path-level crawl preferences identity, authorization, or compliance
Content Signals publishes intended use by category adoption or legal enforceability
IP/rDNS verification increases confidence in operator identity the exact downstream use of content
WAF/CDN rule blocks or challenges matching traffic that all evasive crawlers are detected
application authentication controls private routes and objects public-content licensing terms
rate limit and quota protects capacity purpose or copyright status
access log and analytics provides operational evidence complete training-dataset provenance

Use defense in depth, but do not call every crawler hostile. Rate limits should reflect route cost and abuse tolerance, not a fixed global request count.

AI Labyrinth Is a Honeypot, Not a Firewall

Cloudflare documents AI Labyrinth as invisible nofollow links that non-compliant crawlers may follow. Cloudflare records two relevant events: links were served, or a crawler entered the maze. The documentation explicitly says these actions are not mitigations; the request is not blocked or challenged.

That makes AI Labyrinth useful for detection and behavior intelligence. It should not be described as proof that a bot is trapped forever, that a training corpus is poisoned, or that real content was protected. If the requirement is denial, pair a preference signal with an enforcement feature and verify it through logs.

Technical controls and legal rights are related but not interchangeable. The EU AI Act includes obligations for providers of general-purpose AI models, including a copyright-compliance policy and a sufficiently detailed public summary of training content. The text-and-data-mining rights reservation under the EU Digital Single Market Directive is a separate legal mechanism. Neither statement means every robots.txt rule automatically creates the same legal result in every jurisdiction.

Avoid turning pending litigation, settlements, or vendor licensing deals into universal precedent. A sound operating record is more durable:

  • publish clear terms and machine-readable preferences;
  • identify content owners and license status;
  • retain policy revisions and relevant access evidence;
  • provide a contact and dispute process;
  • obtain legal advice for jurisdiction-specific enforcement;
  • separate public discovery from authenticated data access.

Rollout and Measurement

Start in observe-only mode. Classify traffic for a full business cycle before blocking:

  1. inventory routes and data classes;
  2. map current crawler tokens to documented purposes;
  3. verify operator identity where possible;
  4. measure requests, bytes, status codes, cache impact, referrals, and citations;
  5. simulate proposed decisions against historical logs;
  6. deploy by route and purpose with a rollback switch;
  7. alert on unknown high-volume clients and policy drift;
  8. review the policy when an operator changes its crawler contract.

The success metric is not "blocked bots." It is the combination of protected capacity, intended discoverability, policy compliance, low false positives, and evidence sufficient to explain each decision.

Frequently Asked Questions

Does robots.txt prevent an AI crawler from accessing a site?

No. It is a crawl-preference protocol, not access control. Use authentication or network enforcement for private data and a WAF or CDN policy for traffic denial.

No. Decide separately for search, AI input, training, and user-directed Agent traffic. Blanket blocking may remove a page from useful discovery or break user-requested workflows.

Can User-Agent identify a crawler?

Not by itself. Verify published IP ranges or reverse DNS when available, then combine that evidence with request behavior and route policy.

Does AI Labyrinth block or poison a crawler?

Cloudflare describes it as a honeypot and says its events are not mitigations. Treat claims about guaranteed trapping or training-data poisoning as unsupported unless independently measured.

Is a machine-readable opt-out legally binding?

Its effect depends on the mechanism, jurisdiction, contract, and facts. Publish a clear preference, keep evidence, and seek legal advice instead of treating a technical directive as a universal legal judgment.

Primary Sources