{
 "$comment": "The API version root. Served at /api/v1 (and at this address). Generated from /openapi.json by surfaces/ai-crawler-index/build.py::build_api_versions() in the same pass that writes the API, so it cannot name an endpoint this host does not serve.",
 "api": "AI Crawler Index",
 "version": "v1",
 "status": "current",
 "is_the_only_version": true,
 "base_url": "https://www.pathwren.workers.dev/api/v1",
 "unprefixed_base_url": "https://www.pathwren.workers.dev",
 "same_api_as": "https://www.pathwren.workers.dev",
 "how_versioning_works": "This interface is not versioned in its paths and never has been. /openapi.json carries a DATED version (2026-09-05, the build date) because the DATA behind it changes every six hours while the shape of the API does not. `v1` names that shape: the first and only major version this host has published. It gains a v2 only if the shape is ever broken incompatibly, and on that day /api/versions says so before anything moves.",
 "the_prefix_is_an_address": "Every path on this host is also addressable under /api/v1/. GET /api/v1/data/agents.json returns the same bytes, the same ETag and the same Last-Modified as GET /data/agents.json, with Link: rel=\"canonical\" naming the unprefixed address. The prefix is stripped in the edge before any route is matched, so there is one implementation and never two: a path that 404s unprefixed still 404s here, and a path that is refused unprefixed is refused here with the same body.",
 "openapi_version": "2026-09-05",
 "summary": "Every AI crawler on the web, what it is for, what blocking it costs you, and the IP ranges its operator publishes — as JSON, CSV, robots.txt and regex.",
 "access": {
  "auth": "none",
  "api_key": "none",
  "account": "none",
  "rate_limit": "none",
  "cors": "*",
  "methods": "GET, HEAD, OPTIONS — every endpoint is a public read of a static document. The only paths that take a POST are the JSON-RPC ones (/mcp, /a2a); there is no write API at any version."
 },
 "license": {
  "document": "CC0-1.0",
  "url": "https://creativecommons.org/publicdomain/zero/1.0/"
 },
 "describes": {
  "openapi": "https://www.pathwren.workers.dev/openapi.json",
  "openapi_yaml": "https://www.pathwren.workers.dev/openapi.yaml",
  "human_reference": "https://www.pathwren.workers.dev/reference",
  "reference_json": "https://www.pathwren.workers.dev/reference.json",
  "map_for_models": "https://www.pathwren.workers.dev/llms.txt",
  "version_history": "https://www.pathwren.workers.dev/api/versions",
  "change_feed": "https://www.pathwren.workers.dev/changes.json?since=0"
 },
 "endpoints": [
  {
   "path": "/changes.json",
   "url": "https://www.pathwren.workers.dev/api/v1/changes.json",
   "unprefixed": "https://www.pathwren.workers.dev/changes.json",
   "returns": "What changed since your cursor"
  },
  {
   "path": "/data/agents.csv",
   "url": "https://www.pathwren.workers.dev/api/v1/data/agents.csv",
   "unprefixed": "https://www.pathwren.workers.dev/data/agents.csv",
   "returns": "The same table as CSV"
  },
  {
   "path": "/data/agents.json",
   "url": "https://www.pathwren.workers.dev/api/v1/data/agents.json",
   "unprefixed": "https://www.pathwren.workers.dev/data/agents.json",
   "returns": "Every crawler record, plus categories and an endpoint map"
  },
  {
   "path": "/data/ip-sources.json",
   "url": "https://www.pathwren.workers.dev/api/v1/data/ip-sources.json",
   "unprefixed": "https://www.pathwren.workers.dev/data/ip-sources.json",
   "returns": "Which operators publish verifiable IP ranges, and where"
  },
  {
   "path": "/data/ua-regex.json",
   "url": "https://www.pathwren.workers.dev/api/v1/data/ua-regex.json",
   "unprefixed": "https://www.pathwren.workers.dev/data/ua-regex.json",
   "returns": "Pre-escaped user-agent regexes, whole-list and per category"
  },
  {
   "path": "/documents.json",
   "url": "https://www.pathwren.workers.dev/api/v1/documents.json",
   "unprefixed": "https://www.pathwren.workers.dev/documents.json",
   "returns": "The document ledger: every URL here, its ETag and its last-modified"
  },
  {
   "path": "/documents.txt",
   "url": "https://www.pathwren.workers.dev/api/v1/documents.txt",
   "unprefixed": "https://www.pathwren.workers.dev/documents.txt",
   "returns": "The same ledger as TSV: path, kind, bytes, etag, last-modified"
  },
  {
   "path": "/feed.json",
   "url": "https://www.pathwren.workers.dev/api/v1/feed.json",
   "unprefixed": "https://www.pathwren.workers.dev/feed.json",
   "returns": "JSON Feed 1.1 of what changed"
  },
  {
   "path": "/ip-ranges/all.json",
   "url": "https://www.pathwren.workers.dev/api/v1/ip-ranges/all.json",
   "unprefixed": "https://www.pathwren.workers.dev/ip-ranges/all.json",
   "returns": "Union of every operator-published prefix, grouped by source"
  },
  {
   "path": "/ip-ranges/all.txt",
   "url": "https://www.pathwren.workers.dev/api/v1/ip-ranges/all.txt",
   "unprefixed": "https://www.pathwren.workers.dev/ip-ranges/all.txt",
   "returns": "The same prefixes, one CIDR per line"
  },
  {
   "path": "/status.json",
   "url": "https://www.pathwren.workers.dev/api/v1/status.json",
   "unprefixed": "https://www.pathwren.workers.dev/status.json",
   "returns": "Freshness and health of every upstream IP-range endpoint"
  },
  {
   "path": "/tools/ai-access",
   "url": "https://www.pathwren.workers.dev/api/v1/tools/ai-access",
   "unprefixed": "https://www.pathwren.workers.dev/tools/ai-access",
   "returns": "Which AI crawlers does this file actually stop?"
  },
  {
   "path": "/tools/classify-ua",
   "url": "https://www.pathwren.workers.dev/api/v1/tools/classify-ua",
   "unprefixed": "https://www.pathwren.workers.dev/tools/classify-ua",
   "returns": "What is this user-agent?"
  },
  {
   "path": "/tools/example",
   "url": "https://www.pathwren.workers.dev/api/v1/tools/example",
   "unprefixed": "https://www.pathwren.workers.dev/tools/example",
   "returns": "A worked example, run for real — no arguments"
  },
  {
   "path": "/tools/robots-allowed",
   "url": "https://www.pathwren.workers.dev/api/v1/tools/robots-allowed",
   "unprefixed": "https://www.pathwren.workers.dev/tools/robots-allowed",
   "returns": "Would this crawler fetch this path?"
  },
  {
   "path": "/tools/robots-lint",
   "url": "https://www.pathwren.workers.dev/api/v1/tools/robots-lint",
   "unprefixed": "https://www.pathwren.workers.dev/tools/robots-lint",
   "returns": "Lint a robots.txt"
  },
  {
   "path": "/tools/verification-methods",
   "url": "https://www.pathwren.workers.dev/api/v1/tools/verification-methods",
   "unprefixed": "https://www.pathwren.workers.dev/tools/verification-methods",
   "returns": "Can this crawler be verified at all, and how?"
  },
  {
   "path": "/tools/verify-crawler",
   "url": "https://www.pathwren.workers.dev/api/v1/tools/verify-crawler",
   "unprefixed": "https://www.pathwren.workers.dev/tools/verify-crawler",
   "returns": "Does this address really belong to the crawler it claims to be?"
  },
  {
   "path": "/tools/whoami",
   "url": "https://www.pathwren.workers.dev/api/v1/tools/whoami",
   "unprefixed": "https://www.pathwren.workers.dev/tools/whoami",
   "returns": "Who is calling? — the one endpoint that needs nothing from you"
  }
 ],
 "templates": [
  {
   "path": "/crawler/{slug}.json",
   "url": "https://www.pathwren.workers.dev/api/v1/crawler/{slug}.json"
  },
  {
   "path": "/ip-ranges/{source}.json",
   "url": "https://www.pathwren.workers.dev/api/v1/ip-ranges/{source}.json"
  },
  {
   "path": "/policy/{policy}.json",
   "url": "https://www.pathwren.workers.dev/api/v1/policy/{policy}.json"
  },
  {
   "path": "/robots/{policy}.txt",
   "url": "https://www.pathwren.workers.dev/api/v1/robots/{policy}.txt"
  }
 ],
 "endpoint_count": 173,
 "start_here": [
  "curl -s https://www.pathwren.workers.dev/api/v1 | jq .endpoints[].path",
  "curl -s https://www.pathwren.workers.dev/api/v1/data/agents.json | jq '.crawlers | length'",
  "curl -sI https://www.pathwren.workers.dev/api/v1/data/agents.json | grep -i '^link'"
 ],
 "versions": {
  "v1": "current",
  "v2": "does not exist — see /api/versions",
  "v3": "does not exist — see /api/versions"
 },
 "asked_for_by": {
  "client": "NotHumanSearch/1.0 (+https://nothumansearch.ai/about)",
  "at": [
   "2026-09-03T04:55:44+00:00",
   "2026-09-03T05:06:47+00:00"
  ],
  "took": "404 on /api/v1, /api/v2 and /api/v3",
  "note": "Their `structured_api` signal already passed on /api. This document exists because the question behind the probe had no answer here, not because the score did."
 },
 "generated_at": "2026-09-05T22:29:56+00:00",
 "independent": true
}