{
 "$comment": "What this host RUNS, at the path a site scanner asks for it. Machine copy of https://www.pathwren.workers.dev/services. Every entry is a live public endpoint and the list is generated from the same structures that build them. The six things a services page usually sells are refused by name in `not_offered`; nothing here is for sale and there is nobody to hire.",
 "name": "AI Crawler Index",
 "url": "https://www.pathwren.workers.dev/services",
 "canonical": "https://www.pathwren.workers.dev/services",
 "human_readable": "https://www.pathwren.workers.dev/services",
 "modified": "2026-09-05",
 "summary": "12 public services — a 150-record AI crawler index, an operator IP-range mirror, an HTTP API, 6 MCP servers, 7 A2A agents, feeds and a since-cursor change feed. All free, all keyless, all CC0.",
 "price": {
  "amount": 0,
  "currency": "USD",
  "document": "https://www.pathwren.workers.dev/pricing.json"
 },
 "authentication": {
  "required": false,
  "api_key": false,
  "account": false,
  "note": "One endpoint, /hits.json, takes an export key and is not sold; everything in `services` is open."
 },
 "services": [
  {
   "id": "crawler-index",
   "name": "AI crawler index — 150 records, 74 operators",
   "description": "One record per crawler and AI user agent: robots.txt token, user-agent string, how its operator says to verify it, and what blocking it costs you. 9 categories.",
   "price": 0,
   "authentication": "none",
   "endpoints": [
    {
     "url": "https://www.pathwren.workers.dev/crawler/",
     "media_type": "text/html"
    },
    {
     "url": "https://www.pathwren.workers.dev/data/agents.json",
     "media_type": "application/json"
    },
    {
     "url": "https://www.pathwren.workers.dev/data/agents.csv",
     "media_type": "text/csv"
    }
   ]
  },
  {
   "id": "ip-ranges",
   "name": "Operator IP-range mirror — 1987 IPv4 + 1062 IPv6 prefixes",
   "description": "15 operator-published range endpoints normalised into one schema, each with the upstream timestamp and a SHA-256 of the bytes received. Re-fetched every six hours; a stale source says so rather than disappearing.",
   "price": 0,
   "authentication": "none",
   "endpoints": [
    {
     "url": "https://www.pathwren.workers.dev/ip-ranges/",
     "media_type": "text/html"
    },
    {
     "url": "https://www.pathwren.workers.dev/ip-ranges/all.json",
     "media_type": "application/json"
    },
    {
     "url": "https://www.pathwren.workers.dev/ip-ranges/all.txt",
     "media_type": "text/plain"
    },
    {
     "url": "https://www.pathwren.workers.dev/status.json",
     "media_type": "application/json"
    }
   ]
  },
  {
   "id": "robots-policies",
   "name": "Eight ready-made robots.txt files",
   "description": "Each names every relevant crawler explicitly, so a later change is a one-line diff. Pick the trade-off, curl the file, append it.",
   "price": 0,
   "authentication": "none",
   "endpoints": [
    {
     "url": "https://www.pathwren.workers.dev/policy/",
     "media_type": "text/html"
    },
    {
     "url": "https://www.pathwren.workers.dev/robots/block-ai-training.txt",
     "media_type": "text/plain"
    },
    {
     "url": "https://www.pathwren.workers.dev/robots/allow-ai-search-only.txt",
     "media_type": "text/plain"
    }
   ]
  },
  {
   "id": "snippets",
   "name": "Five generated config snippets",
   "description": "The same policies as nginx, Caddy, Cloudflare and .htaccess rules, generated from the index rather than typed.",
   "price": 0,
   "authentication": "none",
   "endpoints": [
    {
     "url": "https://www.pathwren.workers.dev/snippet/",
     "media_type": "text/html"
    }
   ]
  },
  {
   "id": "http-api",
   "name": "HTTP API, described formally",
   "description": "Every read endpoint in OpenAPI 3.1 (and Swagger 2.0, and YAML), with a human reference beside it. No key, no account, CORS open.",
   "price": 0,
   "authentication": "none",
   "endpoints": [
    {
     "url": "https://www.pathwren.workers.dev/openapi.json",
     "media_type": "application/json"
    },
    {
     "url": "https://www.pathwren.workers.dev/reference",
     "media_type": "text/html"
    },
    {
     "url": "https://www.pathwren.workers.dev/api/v1",
     "media_type": "application/json"
    }
   ]
  },
  {
   "id": "get-tools",
   "name": "8 keyless GET tools",
   "description": "The read-only tools of this host as plain GET endpoints — verify a crawler, lint a robots.txt, classify a user-agent — for a client that cannot speak JSON-RPC.",
   "price": 0,
   "authentication": "none",
   "endpoints": [
    {
     "url": "https://www.pathwren.workers.dev/tools/",
     "media_type": "text/html"
    },
    {
     "url": "https://www.pathwren.workers.dev/tools/whoami",
     "media_type": "application/json"
    },
    {
     "url": "https://www.pathwren.workers.dev/tools/example",
     "media_type": "application/json"
    },
    {
     "url": "https://www.pathwren.workers.dev/tools/verify-crawler",
     "media_type": "application/json"
    }
   ]
  },
  {
   "id": "mcp",
   "name": "Six MCP servers",
   "description": "Model Context Protocol over JSON-RPC (POST), no key and no quota: /mcp, /mcp/doctor, /mcp/lint, /mcp/netcheck, /mcp/robots, /mcp/triage.",
   "price": 0,
   "authentication": "none",
   "endpoints": [
    {
     "url": "https://www.pathwren.workers.dev/mcp",
     "media_type": "application/json"
    },
    {
     "url": "https://www.pathwren.workers.dev/mcp/doctor",
     "media_type": "application/json"
    },
    {
     "url": "https://www.pathwren.workers.dev/mcp/lint",
     "media_type": "application/json"
    },
    {
     "url": "https://www.pathwren.workers.dev/mcp/netcheck",
     "media_type": "application/json"
    },
    {
     "url": "https://www.pathwren.workers.dev/mcp/robots",
     "media_type": "application/json"
    },
    {
     "url": "https://www.pathwren.workers.dev/mcp/triage",
     "media_type": "application/json"
    }
   ]
  },
  {
   "id": "a2a",
   "name": "Seven A2A agents",
   "description": "The same capabilities as Agent2Agent skills, each with a published agent card at /.well-known/agent-card.json.",
   "price": 0,
   "authentication": "none",
   "endpoints": [
    {
     "url": "https://www.pathwren.workers.dev/a2a",
     "media_type": "application/json"
    },
    {
     "url": "https://www.pathwren.workers.dev/.well-known/agent-card.json",
     "media_type": "application/json"
    }
   ]
  },
  {
   "id": "changes",
   "name": "Since-cursor change feed",
   "description": "Poll instead of re-crawling: send back the cursor you were given and get only what moved. It advances only on a real change, so an unchanged answer is proof rather than luck.",
   "price": 0,
   "authentication": "none",
   "endpoints": [
    {
     "url": "https://www.pathwren.workers.dev/changes.json",
     "media_type": "application/json"
    },
    {
     "url": "https://www.pathwren.workers.dev/feed.xml",
     "media_type": "application/rss+xml"
    },
    {
     "url": "https://www.pathwren.workers.dev/feed.json",
     "media_type": "application/feed+json"
    }
   ]
  },
  {
   "id": "client-dossiers",
   "name": "Observed-client dossiers",
   "description": "One page per named client that has actually asked this host for something: what it fetched, when it was first and last seen, how many addresses it came from. It says \"not observed\" rather than guessing.",
   "price": 0,
   "authentication": "none",
   "endpoints": [
    {
     "url": "https://www.pathwren.workers.dev/bot/",
     "media_type": "text/html"
    },
    {
     "url": "https://www.pathwren.workers.dev/data/observed-clients.json",
     "media_type": "application/json"
    },
    {
     "url": "https://www.pathwren.workers.dev/data/observed-clients.csv",
     "media_type": "text/csv"
    }
   ]
  },
  {
   "id": "discovery",
   "name": "Machine discovery documents",
   "description": "llms.txt, AGENTS.md, the document ledger with a strong ETag per file, the sitemap, and the .well-known family — so an agent can map this host in one request.",
   "price": 0,
   "authentication": "none",
   "endpoints": [
    {
     "url": "https://www.pathwren.workers.dev/llms.txt",
     "media_type": "text/plain"
    },
    {
     "url": "https://www.pathwren.workers.dev/documents.json",
     "media_type": "application/json"
    },
    {
     "url": "https://www.pathwren.workers.dev/AGENTS.md",
     "media_type": "text/markdown"
    },
    {
     "url": "https://www.pathwren.workers.dev/sitemap.xml",
     "media_type": "application/xml"
    }
   ]
  },
  {
   "id": "writing",
   "name": "Writing",
   "description": "Long-form pieces about crawler and agent traffic, and what it costs to block it.",
   "price": 0,
   "authentication": "none",
   "endpoints": [
    {
     "url": "https://www.pathwren.workers.dev/blog/",
     "media_type": "text/html"
    },
    {
     "url": "https://www.pathwren.workers.dev/blog/index.json",
     "media_type": "application/json"
    }
   ]
  }
 ],
 "not_offered": [
  {
   "asked_for": "Consulting, contracting or an agency engagement",
   "answer": "There is no company here and nobody to hire. This is software that runs by itself; there is no person to book, no rate card and no statement of work."
  },
  {
   "asked_for": "A managed service, hosting or anything installed for you",
   "answer": "Every service above is a public read endpoint. Nothing is deployed on your behalf and nothing runs inside your infrastructure."
  },
  {
   "asked_for": "An SLA, a support contract or a paid support tier",
   "answer": "Best effort, and stated as such. The edge serves static files and the index rebuilds every six hours; when an upstream source fails, /status.json says so rather than hiding it. There is no ticket queue and no promise of a response time."
  },
  {
   "asked_for": "Custom development, integrations or data work for hire",
   "answer": "Not offered at any price. The data is CC0 — build the integration yourself, or fork the whole dataset, which is one JSON file."
  },
  {
   "asked_for": "Accounts, API keys, seats or quota",
   "answer": "None exist. Nothing here is metered per client and no request is refused for being frequent. See /register for the full access answer."
  },
  {
   "asked_for": "A sales route, an enterprise tier or a demo",
   "answer": "Nothing on this host is for sale, so there is nothing to demonstrate and nobody to talk to about buying it. Corrections and questions go to /contact."
  }
 ],
 "support": {
  "sla": null,
  "support_contract": false,
  "best_effort": true,
  "note": "Best effort and stated as such: static files at the edge, an index rebuilt every six hours, and /status.json says out loud when an upstream source last answered.",
  "contact": "https://www.pathwren.workers.dev/contact",
  "security": "https://www.pathwren.workers.dev/.well-known/security.txt"
 },
 "license": {
  "documents": "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.",
 "why_this_document_exists": "Mozilla/5.0 (compatible; ForgeScanner/2.0) and its Puppeteer twin asked for /services at 2026-09-05T21:45:38Z and took a 404, in the same walk that fetched /pricing, /about and /contact with a 200. The services existed; the address did not.",
 "links": [
  {
   "rel": "self",
   "href": "https://www.pathwren.workers.dev/services.json",
   "type": "application/json"
  },
  {
   "rel": "changes",
   "href": "https://www.pathwren.workers.dev/changes.json?since=120",
   "type": "application/json",
   "title": "What changed since your cursor — poll this instead of re-downloading this document",
   "cursor_param": "since",
   "head_cursor": 120,
   "min_poll_seconds": 21600,
   "how": "Read `cursor` from the response and send it back as `since`. It advances only when something really changed, so an unchanged answer is proof rather than luck — about 2.5 KB, or a 304 with no body if you send back the ETag."
  },
  {
   "rel": "related",
   "href": "https://www.pathwren.workers.dev/pricing.json",
   "type": "application/json"
  },
  {
   "rel": "related",
   "href": "https://www.pathwren.workers.dev/openapi.json",
   "type": "application/json",
   "title": "Every read endpoint, described formally"
  },
  {
   "rel": "service-desc",
   "href": "https://www.pathwren.workers.dev/openapi.json",
   "type": "application/json",
   "title": "Every read endpoint, described formally"
  }
 ]
}