{
 "$comment": "The API reference as data: every endpoint this host serves, with the curl that calls it. It is the machine copy of https://www.pathwren.workers.dev/reference and is served at /docs, /documentation, /api and /api/docs as well, each with a canonical link home. GENERATED from the same OpenAPI object that writes /openapi.json, so the two cannot disagree. If you want the formal specification rather than this index, fetch /openapi.json — this document exists because a reference is asked for by name at these paths, not because the spec was missing.",
 "name": "API reference — AI Crawler Index",
 "url": "https://www.pathwren.workers.dev/reference",
 "canonical": "https://www.pathwren.workers.dev/reference",
 "also_served_at": [
  "https://www.pathwren.workers.dev/docs",
  "https://www.pathwren.workers.dev/documentation",
  "https://www.pathwren.workers.dev/api",
  "https://www.pathwren.workers.dev/api/docs"
 ],
 "human_readable": "https://www.pathwren.workers.dev/reference",
 "modified": "2026-09-01",
 "generated_at": "2026-09-01T19:26:24+00:00",
 "summary": "11 documented REST paths plus 5 JSON-RPC protocol endpoints, all keyless, read-only, CORS-open and CC0.",
 "base_url": "https://www.pathwren.workers.dev",
 "specifications": {
  "openapi_3_1": "https://www.pathwren.workers.dev/openapi.json",
  "openapi_3_1_yaml": "https://www.pathwren.workers.dev/openapi.yaml",
  "swagger_2_0": "https://www.pathwren.workers.dev/swagger.json",
  "note": "This document is generated from the OpenAPI 3.1 object above. Where a client can read OpenAPI, read that instead: it is the same API described formally."
 },
 "authentication": {
  "required": false,
  "type": "none",
  "note": "There is no key, no token, no signup and no account. Send the GET."
 },
 "rate_limits": {
  "per_client_limit": null,
  "note": "None imposed by this API: every path is a static file on an edge cache, and no request is rejected for being frequent. The host's free plan allows 100,000 requests a day across the whole site, so the only real limit is that one — please fetch /data/agents.json once (about 300 KB, everything in it) rather than 56 per-crawler files, and remember the data changes at most every six hours, which /status.json tells you exactly.",
  "conditional_requests": "Every response carries an ETag and honours If-None-Match with a 304. There is no Last-Modified header, so If-Modified-Since is ignored — revalidate on the ETag.",
  "cors": "Access-Control-Allow-Origin: * on everything — callable straight from a browser."
 },
 "methods": {
  "read": [
   "GET",
   "HEAD",
   "OPTIONS"
  ],
  "write": [],
  "note": "Nothing on this host is written by a client. A non-read method answers 405 with an Allow header."
 },
 "endpoints": [
  {
   "method": "GET",
   "path": "/data/agents.csv",
   "url": "https://www.pathwren.workers.dev/data/agents.csv",
   "example_url": "https://www.pathwren.workers.dev/data/agents.csv",
   "operation_id": "listCrawlersCsv",
   "summary": "The same table as CSV",
   "description": null,
   "tags": [
    "bulk"
   ],
   "parameters": [],
   "response_media_types": [
    "text/csv"
   ],
   "status_codes": [
    "200"
   ],
   "authentication": "none",
   "curl": "curl -s https://www.pathwren.workers.dev/data/agents.csv"
  },
  {
   "method": "GET",
   "path": "/data/agents.json",
   "url": "https://www.pathwren.workers.dev/data/agents.json",
   "example_url": "https://www.pathwren.workers.dev/data/agents.json",
   "operation_id": "listCrawlers",
   "summary": "Every crawler record, plus categories and an endpoint map",
   "description": null,
   "tags": [
    "bulk"
   ],
   "parameters": [],
   "response_media_types": [
    "application/json"
   ],
   "status_codes": [
    "200"
   ],
   "authentication": "none",
   "curl": "curl -s https://www.pathwren.workers.dev/data/agents.json"
  },
  {
   "method": "GET",
   "path": "/data/ua-regex.json",
   "url": "https://www.pathwren.workers.dev/data/ua-regex.json",
   "example_url": "https://www.pathwren.workers.dev/data/ua-regex.json",
   "operation_id": "getUserAgentRegex",
   "summary": "Pre-escaped user-agent regexes, whole-list and per category",
   "description": null,
   "tags": [
    "bulk"
   ],
   "parameters": [],
   "response_media_types": [
    "application/json"
   ],
   "status_codes": [
    "200"
   ],
   "authentication": "none",
   "curl": "curl -s https://www.pathwren.workers.dev/data/ua-regex.json"
  },
  {
   "method": "GET",
   "path": "/data/ip-sources.json",
   "url": "https://www.pathwren.workers.dev/data/ip-sources.json",
   "example_url": "https://www.pathwren.workers.dev/data/ip-sources.json",
   "operation_id": "listIpSources",
   "summary": "Which operators publish verifiable IP ranges, and where",
   "description": null,
   "tags": [
    "ip-ranges"
   ],
   "parameters": [],
   "response_media_types": [
    "application/json"
   ],
   "status_codes": [
    "200"
   ],
   "authentication": "none",
   "curl": "curl -s https://www.pathwren.workers.dev/data/ip-sources.json"
  },
  {
   "method": "GET",
   "path": "/ip-ranges/all.json",
   "url": "https://www.pathwren.workers.dev/ip-ranges/all.json",
   "example_url": "https://www.pathwren.workers.dev/ip-ranges/all.json",
   "operation_id": "getAllIpRanges",
   "summary": "Union of every operator-published prefix, grouped by source",
   "description": null,
   "tags": [
    "ip-ranges"
   ],
   "parameters": [],
   "response_media_types": [
    "application/json"
   ],
   "status_codes": [
    "200"
   ],
   "authentication": "none",
   "curl": "curl -s https://www.pathwren.workers.dev/ip-ranges/all.json"
  },
  {
   "method": "GET",
   "path": "/ip-ranges/all.txt",
   "url": "https://www.pathwren.workers.dev/ip-ranges/all.txt",
   "example_url": "https://www.pathwren.workers.dev/ip-ranges/all.txt",
   "operation_id": "getAllIpRangesText",
   "summary": "The same prefixes, one CIDR per line",
   "description": null,
   "tags": [
    "ip-ranges"
   ],
   "parameters": [],
   "response_media_types": [
    "text/plain"
   ],
   "status_codes": [
    "200"
   ],
   "authentication": "none",
   "curl": "curl -s https://www.pathwren.workers.dev/ip-ranges/all.txt"
  },
  {
   "method": "GET",
   "path": "/ip-ranges/{source}.json",
   "url": "https://www.pathwren.workers.dev/ip-ranges/{source}.json",
   "example_url": "https://www.pathwren.workers.dev/ip-ranges/openai-gptbot.json",
   "operation_id": "getIpRangeSource",
   "summary": "One operator's published prefix list, normalised",
   "description": null,
   "tags": [
    "ip-ranges"
   ],
   "parameters": [
    {
     "name": "source",
     "in": "path",
     "required": true,
     "description": "Source slug, from /data/ip-sources.json",
     "values": [
      "openai-gptbot",
      "openai-searchbot",
      "openai-chatgpt-user",
      "google-googlebot",
      "google-special",
      "google-user-triggered",
      "google-user-triggered-google",
      "bing-bingbot",
      "apple-applebot",
      "duckduckgo-duckduckbot",
      "perplexity-bot",
      "perplexity-user"
     ]
    }
   ],
   "response_media_types": [
    "application/json"
   ],
   "status_codes": [
    "200",
    "404"
   ],
   "authentication": "none",
   "curl": "curl -s https://www.pathwren.workers.dev/ip-ranges/openai-gptbot.json"
  },
  {
   "method": "GET",
   "path": "/policy/{policy}.json",
   "url": "https://www.pathwren.workers.dev/policy/{policy}.json",
   "example_url": "https://www.pathwren.workers.dev/policy/allow-all.json",
   "operation_id": "getPolicy",
   "summary": "A policy with its rationale and the crawlers it names",
   "description": null,
   "tags": [
    "robots"
   ],
   "parameters": [
    {
     "name": "policy",
     "in": "path",
     "required": true,
     "description": null,
     "values": [
      "allow-all",
      "block-ai-training",
      "block-all-ai",
      "block-datasets",
      "allow-ai-search-only",
      "block-seo-tools",
      "block-disputed",
      "maximum-ai-visibility"
     ]
    }
   ],
   "response_media_types": [
    "application/json"
   ],
   "status_codes": [
    "200"
   ],
   "authentication": "none",
   "curl": "curl -s https://www.pathwren.workers.dev/policy/allow-all.json"
  },
  {
   "method": "GET",
   "path": "/robots/{policy}.txt",
   "url": "https://www.pathwren.workers.dev/robots/{policy}.txt",
   "example_url": "https://www.pathwren.workers.dev/robots/allow-all.txt",
   "operation_id": "getRobotsPolicy",
   "summary": "A ready-made robots.txt policy file",
   "description": null,
   "tags": [
    "robots"
   ],
   "parameters": [
    {
     "name": "policy",
     "in": "path",
     "required": true,
     "description": null,
     "values": [
      "allow-all",
      "block-ai-training",
      "block-all-ai",
      "block-datasets",
      "allow-ai-search-only",
      "block-seo-tools",
      "block-disputed",
      "maximum-ai-visibility"
     ]
    }
   ],
   "response_media_types": [
    "text/plain"
   ],
   "status_codes": [
    "200"
   ],
   "authentication": "none",
   "curl": "curl -s https://www.pathwren.workers.dev/robots/allow-all.txt"
  },
  {
   "method": "GET",
   "path": "/feed.json",
   "url": "https://www.pathwren.workers.dev/feed.json",
   "example_url": "https://www.pathwren.workers.dev/feed.json",
   "operation_id": "getFeed",
   "summary": "JSON Feed 1.1 of what changed",
   "description": null,
   "tags": [
    "status"
   ],
   "parameters": [],
   "response_media_types": [
    "application/feed+json"
   ],
   "status_codes": [
    "200"
   ],
   "authentication": "none",
   "curl": "curl -s https://www.pathwren.workers.dev/feed.json"
  },
  {
   "method": "GET",
   "path": "/status.json",
   "url": "https://www.pathwren.workers.dev/status.json",
   "example_url": "https://www.pathwren.workers.dev/status.json",
   "operation_id": "getStatus",
   "summary": "Freshness and health of every upstream IP-range endpoint",
   "description": null,
   "tags": [
    "status"
   ],
   "parameters": [],
   "response_media_types": [
    "application/json"
   ],
   "status_codes": [
    "200"
   ],
   "authentication": "none",
   "curl": "curl -s https://www.pathwren.workers.dev/status.json"
  }
 ],
 "protocol_endpoints": [
  {
   "path": "/mcp",
   "url": "https://www.pathwren.workers.dev/mcp",
   "transport": "streamable-http",
   "protocol": "mcp",
   "method": "POST",
   "authentication": "none",
   "documentation": "https://www.pathwren.workers.dev/mcp.html"
  },
  {
   "path": "/mcp/doctor",
   "url": "https://www.pathwren.workers.dev/mcp/doctor",
   "transport": "streamable-http",
   "protocol": "mcp",
   "method": "POST",
   "authentication": "none",
   "documentation": "https://www.pathwren.workers.dev/mcp-doctor.html"
  },
  {
   "path": "/mcp/netcheck",
   "url": "https://www.pathwren.workers.dev/mcp/netcheck",
   "transport": "streamable-http",
   "protocol": "mcp",
   "method": "POST",
   "authentication": "none",
   "documentation": "https://www.pathwren.workers.dev/mcp-netcheck.html"
  },
  {
   "path": "/mcp/robots",
   "url": "https://www.pathwren.workers.dev/mcp/robots",
   "transport": "streamable-http",
   "protocol": "mcp",
   "method": "POST",
   "authentication": "none",
   "documentation": "https://www.pathwren.workers.dev/mcp-robots.html"
  },
  {
   "path": "/mcp/triage",
   "url": "https://www.pathwren.workers.dev/mcp/triage",
   "transport": "streamable-http",
   "protocol": "mcp",
   "method": "POST",
   "authentication": "none",
   "documentation": "https://www.pathwren.workers.dev/mcp-triage.html"
  }
 ],
 "discovery_documents": [
  {
   "path": "/llms.txt",
   "url": "https://www.pathwren.workers.dev/llms.txt",
   "what": "The map of this site for a model: what is here and where."
  },
  {
   "path": "/llms-full.txt",
   "url": "https://www.pathwren.workers.dev/llms-full.txt",
   "what": "The whole index as one markdown file."
  },
  {
   "path": "/openapi.json",
   "url": "https://www.pathwren.workers.dev/openapi.json",
   "what": "OpenAPI 3.1 — every endpoint above, described formally."
  },
  {
   "path": "/openapi.yaml",
   "url": "https://www.pathwren.workers.dev/openapi.yaml",
   "what": "The same document as YAML, from the same object."
  },
  {
   "path": "/swagger.json",
   "url": "https://www.pathwren.workers.dev/swagger.json",
   "what": "Mechanical Swagger 2.0 conversion, served only while it stays faithful."
  },
  {
   "path": "/apis.json",
   "url": "https://www.pathwren.workers.dev/apis.json",
   "what": "APIs.json collection entry for this host."
  },
  {
   "path": "/sitemap.xml",
   "url": "https://www.pathwren.workers.dev/sitemap.xml",
   "what": "Every page."
  },
  {
   "path": "/index.json",
   "url": "https://www.pathwren.workers.dev/index.json",
   "what": "The host in one object, with the machine entry points listed."
  },
  {
   "path": "/.well-known/api-catalog",
   "url": "https://www.pathwren.workers.dev/.well-known/api-catalog",
   "what": "RFC 9727 service catalog."
  },
  {
   "path": "/.well-known/api-onboarding",
   "url": "https://www.pathwren.workers.dev/.well-known/api-onboarding",
   "what": "How access works, machine-readable."
  },
  {
   "path": "/.well-known/security.txt",
   "url": "https://www.pathwren.workers.dev/.well-known/security.txt",
   "what": "RFC 9116 contact and policy."
  },
  {
   "path": "/security.json",
   "url": "https://www.pathwren.workers.dev/security.json",
   "what": "What this host runs, and why each probed path is a genuine 404."
  },
  {
   "path": "/terms.json",
   "url": "https://www.pathwren.workers.dev/terms.json",
   "what": "Terms, machine-readable."
  },
  {
   "path": "/privacy.json",
   "url": "https://www.pathwren.workers.dev/privacy.json",
   "what": "What is logged and what is not."
  },
  {
   "path": "/feed.json",
   "url": "https://www.pathwren.workers.dev/feed.json",
   "what": "JSON Feed of what changed."
  },
  {
   "path": "/feed.xml",
   "url": "https://www.pathwren.workers.dev/feed.xml",
   "what": "The same as RSS."
  },
  {
   "path": "/register",
   "url": "https://www.pathwren.workers.dev/register",
   "what": "Access, keys and sign-up: there are none."
  }
 ],
 "credentialed_endpoints": [
  {
   "path": "/hits.json",
   "url": "https://www.pathwren.workers.dev/hits.json",
   "requires": "an export key, as ?key= or Authorization: Bearer",
   "status_without_it": 401,
   "self_service": false,
   "why_not": "The rows are other visitors' requests, including salted address hashes. The aggregate is public at https://www.pathwren.workers.dev/stats.json and needs nothing.",
   "public_alternative": "https://www.pathwren.workers.dev/stats.json"
  }
 ],
 "javascript_required": false,
 "docs_platform": "none — generated static HTML, no framework, no client-side rendering",
 "asked_by": {
  "user_agent": "AgentDisco/1.0 (+https://agentdisco.io/bot)",
  "paths": [
   "/docs",
   "/documentation",
   "/api",
   "/api/docs",
   "/reference",
   "/developers"
  ],
  "requests": "6 per path, one address, Accept: */*",
  "first_seen": "2026-09-01T02:28:34+00:00",
  "last_seen": "2026-09-01T17:02:43+00:00",
  "took": "404 on 30 of the 36, before this document existed",
  "their_check": "https://agentdisco.io/checks/docs.platform",
  "their_words": "Probes the conventional docs paths (/docs, /documentation, /api, /api/docs, /reference, /developers) and fingerprints the first hit. Recognises Mintlify, GitBook, Docusaurus, ReadTheDocs, Redoc, Stoplight and Swagger UI — all crawler-friendly. Downgrades to warn when the docs page needs JS to render content."
 },
 "license": {
  "document": "CC0-1.0",
  "url": "https://creativecommons.org/publicdomain/zero/1.0/"
 },
 "who_runs_it": "An independent, non-commercial automated project: it is run by software rather than by a person, and it says so wherever it introduces itself. It is not affiliated with, endorsed by or operated by any of the crawler operators it documents, nor by any other company. The category and cost-of-blocking fields are its own assessment and are labelled as such; every other field is cited to the operator's own documentation."
}