{
 "$comment": "This host runs no inference. Generated by surfaces/ai-crawler-index/build.py on every rebuild; the refusal itself is served by the worker at each path below and says the same thing.",
 "name": "AI Crawler Index",
 "canonical": "https://www.pathwren.workers.dev/inference.json",
 "human_readable": "https://www.pathwren.workers.dev/inference.html",
 "generated_at": "2026-09-01T13:57:24+00:00",
 "runs_a_model": false,
 "proxies_a_model": false,
 "is_an_openai_compatible_endpoint": false,
 "is_an_anthropic_compatible_endpoint": false,
 "accepts_an_api_key": false,
 "affiliated_with_any_model_provider": false,
 "independent": true,
 "answer_at_every_path_below": {
  "status": 404,
  "content_type": "application/json; charset=utf-8",
  "every_method": "GET, HEAD, POST, PUT, PATCH, DELETE — 404 for all of them; OPTIONS is a 204 preflight",
  "allow_header": null,
  "body": "a valid OpenAI ErrorResponse (or Anthropic's error envelope on Anthropic's paths), so the client that asked can read the refusal without special-casing"
 },
 "refused_paths": [
  {
   "path": "/v1/chat/completions",
   "method_observed": "POST",
   "status": 404,
   "refused_by_decision": true,
   "reason": "no_model_is_hosted_or_proxied_here",
   "evidence": "observed 2026-09-01T02:49:43Z"
  },
  {
   "path": "/chat/completions",
   "method_observed": "POST",
   "status": 404,
   "refused_by_decision": true,
   "reason": "no_model_is_hosted_or_proxied_here",
   "evidence": "observed 2026-09-01T02:49:45Z"
  },
  {
   "path": "/openai/v1/chat/completions",
   "method_observed": "POST",
   "status": 404,
   "refused_by_decision": true,
   "reason": "no_model_is_hosted_or_proxied_here",
   "evidence": "observed 2026-09-01T02:49:46Z"
  },
  {
   "path": "/v1/models",
   "method_observed": "GET",
   "status": 404,
   "refused_by_decision": true,
   "reason": "no_model_is_hosted_or_proxied_here",
   "evidence": "observed 2026-09-01T02:49:36Z"
  },
  {
   "path": "/openai/v1/models",
   "method_observed": "GET",
   "status": 404,
   "refused_by_decision": true,
   "reason": "no_model_is_hosted_or_proxied_here",
   "evidence": "observed 2026-09-01T02:49:38Z"
  },
  {
   "path": "/api/v1/models",
   "method_observed": "GET",
   "status": 404,
   "refused_by_decision": true,
   "reason": "no_model_is_hosted_or_proxied_here",
   "evidence": "observed 2026-09-01T02:49:40Z"
  },
  {
   "path": "/models",
   "method_observed": "GET",
   "status": 404,
   "refused_by_decision": true,
   "reason": "no_model_is_hosted_or_proxied_here",
   "evidence": "observed 2026-09-01T02:49:41Z"
  },
  {
   "path": "/v1/completions",
   "method_observed": "POST",
   "status": 404,
   "refused_by_decision": true,
   "reason": "no_model_is_hosted_or_proxied_here",
   "evidence": "same probe, answered by extension"
  },
  {
   "path": "/v1/embeddings",
   "method_observed": "POST",
   "status": 404,
   "refused_by_decision": true,
   "reason": "no_model_is_hosted_or_proxied_here",
   "evidence": "same probe, answered by extension"
  },
  {
   "path": "/v1/responses",
   "method_observed": "POST",
   "status": 404,
   "refused_by_decision": true,
   "reason": "no_model_is_hosted_or_proxied_here",
   "evidence": "same probe, answered by extension"
  },
  {
   "path": "/v1/messages",
   "method_observed": "POST",
   "status": 404,
   "refused_by_decision": true,
   "reason": "no_model_is_hosted_or_proxied_here",
   "evidence": "Anthropic spelling, answered by extension"
  },
  {
   "path": "/v1/complete",
   "method_observed": "POST",
   "status": 404,
   "refused_by_decision": true,
   "reason": "no_model_is_hosted_or_proxied_here",
   "evidence": "Anthropic spelling, answered by extension"
  }
 ],
 "why_not_an_empty_model_list": "Returning 200 with {\"object\":\"list\",\"data\":[]} at /v1/models would be schema-valid and is still refused. x402 answers a question about RESOURCES (\"does anything here require payment?\") where \"none\" is true and useful, so it is served as 200. /v1/models answers a question about the SERVER (\"which models do you serve?\") where 200 asserts the API is implemented at this origin. An empty model list is also exactly what a misconfigured gateway returns, so a 200 would make this host indistinguishable from a broken LLM proxy and get it catalogued as inference infrastructure. 404 is truer and more useful.",
 "why_404_and_not_405": {
  "was": "POST returned 405 with a zero-byte body until 2026-09-01T12:06Z — the static asset handler's method check, not a decision.",
  "rfc_9110_15_5_6": "405 'indicates that the method received in the request-line is known by the origin server but not supported by the target resource. The origin server MUST generate an Allow header field in a 405 response...' — it asserted a resource exists here, and carried no Allow header, so it broke the MUST too.",
  "rfc_9110_15_5_5": "404 'indicates that the origin server did not find a current representation for the target resource' — true here for every method, so every method returns it."
 },
 "observed_asking": [
  {
   "ua": "Mozilla/5.0",
   "named_itself": false,
   "note": "The user-agent is the string `Mozilla/5.0` and nothing else — no product, no version, no +https:// URL — so this host records it as observed rather than identifying it.",
   "window": "2026-09-01T02:49:36Z/2026-09-01T02:49:46Z",
   "requests": 7,
   "distinct_addresses": 3,
   "accept": [
    "application/json (the model lists)",
    "*/* (the completions)"
   ]
  }
 ],
 "endpoints_that_do_answer": {
  "https://www.pathwren.workers.dev/mcp": "MCP over JSON-RPC 2.0: classify a user-agent, look up a crawler",
  "https://www.pathwren.workers.dev/mcp/triage": "MCP: bulk-triage a log file's user-agents",
  "https://www.pathwren.workers.dev/mcp/doctor": "MCP: which agent-discovery documents a host serves",
  "https://www.pathwren.workers.dev/openapi.json": "OpenAPI 3.1 for the read-only HTTP API",
  "https://www.pathwren.workers.dev/data/agents.json": "the whole dataset in one fetch, CC0-1.0",
  "https://www.pathwren.workers.dev/stats.json": "this host's own external traffic, last 24h",
  "https://www.pathwren.workers.dev/llms.txt": "the map, for machines"
 },
 "for_other_hosts_getting_this_probe": "If you DO run an OpenAI-compatible gateway and any of those paths answered 200 without a credential, that is what the sweep is looking for: an open endpoint somebody else can spend your compute through. Test it unauthenticated from off your network. If you do not run one, do not add a stub to tidy the 404 — an empty model list reads as a broken gateway, and a 405 on POST tells the scanner a resource is there. Answer 404 for every method and put the reason in the error envelope the caller already parses.",
 "license": "CC0-1.0"
}