# https://www.robotstxt.org/robotstxt.html
#
# Content-Signal declares the permitted *use* of what a crawler fetches, independently of whether
# it may fetch at all: this site may be indexed for search and used as input to an AI answer
# (grounding/RAG), but its content is not offered for model training.
# https://contentsignals.org
User-agent: *
Content-Signal: search=yes, ai-input=yes, ai-train=no
# Sign-in endpoints 302 to the identity provider with a new session id on every request.
# Crawling them spends budget on URLs that are never pages. Other /api paths (the published
# JSON and llms.txt documents below) stay allowed.
Disallow: /api/auth/
Sitemap: https://layer.ai/sitemap-index.xml
# /docs is a separate Astro build behind the same origin, so it emits its own sitemap. Both
# are listed here: robots.txt is the only place a crawler is told a sitemap exists, and the
# root index covers the marketing build alone.
Sitemap: https://layer.ai/docs/sitemap-index.xml
# ── AI crawlers ──
#
# robots.txt groups do not merge: a crawler that matches a named group ignores the `*` group
# entirely. Every group below therefore repeats Content-Signal, or these agents would see no
# signal at all.
# Crawlers behind an answer engine, and the user-triggered fetchers that back "open this page"
# in an assistant. Allowed: being absent from ChatGPT, Claude, and Perplexity costs Layer more
# than any crawl budget. Training remains unpermitted — that is what Content-Signal says, and it
# applies to these agents too.
User-agent: GPTBot
User-agent: OAI-SearchBot
User-agent: ChatGPT-User
User-agent: ClaudeBot
User-agent: Claude-SearchBot
User-agent: Claude-User
User-agent: PerplexityBot
User-agent: Perplexity-User
User-agent: Google-Extended
User-agent: Applebot-Extended
Content-Signal: search=yes, ai-input=yes, ai-train=no
Allow: /
# Repeated from the `*` group: a named group does not inherit it.
Disallow: /api/auth/
# Crawlers that build training corpora and surface Layer in no answer engine, so there is nothing
# to lose by declining them. Disallowed as well as signaled, because a signal is a request and a
# disallow is an instruction.
User-agent: CCBot
User-agent: Bytespider
Content-Signal: search=yes, ai-input=yes, ai-train=no
Disallow: /
# LLM-readable content indexes (https://llmstxt.org)
# https://layer.ai/llms.txt
# https://layer.ai/llms-full.txt
# https://layer.ai/docs/llms.txt
# Agent mode for the home page — the same facts as / in a dense, machine-first form
# https://layer.ai/?mode=agent (also /agent, /agent.md)
# Machine-readable API surface
# https://layer.ai/.well-known/api-catalog (RFC 9727 API catalog)
# https://layer.ai/.well-known/mcp (Layer MCP servers + tool lists)
# https://layer.ai/.well-known/ard.json (ARD manifest: every callable Layer resource)
# https://layer.ai/.well-known/ai-catalog.json (APIs + readable content surface, for AI clients)
# https://layer.ai/.well-known/agent-skills/index.json (Agent Skills index: one SKILL.md per capability)
# https://layer.ai/openapi.json (Layer REST API, OpenAPI 3.1)
# https://layer.ai/api/index.json (REST + MCP entry points, auth, limits, policy)
# https://layer.ai/api/onboarding.json (self-serve signup, credentials, zero-auth URLs)
# OAuth 2.0 discovery — these paths redirect to the authoritative host, which is where RFC 8414
# and RFC 9728 require the metadata to be served from.
# https://layer.ai/.well-known/oauth-authorization-server -> https://auth.app.layer.ai/...
# https://layer.ai/.well-known/oauth-protected-resource -> https://mcp.app.layer.ai/...
# Developer documentation
# https://layer.ai/docs (Layer developer documentation)
# https://layer.ai/docs/authentication (Layer API authentication)
# https://layer.ai/docs/rate-limits (Layer API rate limits)
# https://layer.ai/docs/versioning (Layer API versioning)
# https://layer.ai/docs/deprecation (Layer API deprecation policy)
# Markdown variants: append .md to any page path, or send `Accept: text/markdown`
# (https://acceptmarkdown.com)