llm-fetch — fetch a web page as Markdown. POST /api/auth {"code": "123456"} -> {"token": "...", ...} POST /api/read {"url": "https://..."} -> {"markdown": "...", ...} GET /api/session -> remaining quota POST /api/logout -> drop the session Authentication (required): Ask the operator for the current 6-digit TOTP code, POST it to /api/auth, then send `Authorization: Bearer ` on every later call. The session lasts 300 s and is extended by each request, up to 7200 s total. A code can be traded for a session exactly once. /api/read body: url required, http(s), public hosts only need "text" (default) or "live" — "live" skips straight to a real browser max_stage 1 plain, 2 browser-TLS, 3 extraction API, 4 headless Chromium, 5 archive max_chars truncate the Markdown (default 40000, 0 = no limit) The response reports which stage produced the text and what the earlier ones failed with, so a caller can tell "the page is empty" from "the page blocked us". Errors: 401 no/expired session, 403 URL rejected by the SSRF guard, 429 quota exhausted or too many failed codes, 502 every stage failed. This page is the whole protocol. /api/docs and /openapi.json are LAN-only.