{"endpoints":[{"method":"GET","path":"/bible/list_books","description":"List all Bible books"},{"method":"GET","path":"/bible/list_chapters/{book}","description":"List chapters in a book"},{"method":"GET","path":"/bible/{book}","description":"List chapters in a book"},{"method":"GET","path":"/bible/{book}/{chapter}","description":"Get all verses in a chapter"},{"method":"GET","path":"/bible/{book}/{chapter}/{verse}","description":"Get specific verse"},{"method":"GET","path":"/bible/{book}/{chapter}/{start-end}","description":"Get verse range"},{"method":"GET","path":"/bible/search?q={query}","description":"Search Bible text"},{"method":"GET","path":"/bible/random_verse","description":"Get random verse"},{"method":"GET","path":"/bible/v2/search?q={query}\u0026match={any|all|phrase}\u0026case_sensitive={true|false}","description":"OpenSearch full-text search. match defaults to any; case_sensitive defaults to false and requires the case-preserving index mapping."},{"method":"GET","path":"/bible/v2/suggest?q={prefix}","description":"Predictive suggestions"},{"method":"PUT","path":"/bible/v2/synonyms/{set}","description":"Replace synonym set","auth":"JWT (scope: synonyms:write)"},{"method":"POST","path":"/bible/v2/synonyms/{set}","description":"Append to synonym set","auth":"JWT (scope: synonyms:write)"},{"method":"DELETE","path":"/bible/v2/synonyms/{set}","description":"Remove from synonym set","auth":"JWT (scope: synonyms:write)"},{"method":"POST","path":"/auth/google/token","description":"Exchange Google ID token for app JWT + session"},{"method":"GET","path":"/auth/config","description":"Auth configuration (Google client id)"},{"method":"GET","path":"/auth/me","description":"Get current session token"},{"method":"POST","path":"/auth/logout","description":"Clear session"},{"method":"POST","path":"/admin/token","description":"Mint token with X-Internal-Secret","auth":"X-Internal-Secret header"},{"method":"GET","path":"/admin/rate-limit/{ip}","description":"Check IP rate limit status"},{"method":"POST","path":"/admin/block-ip","description":"Manually block an IP"},{"method":"DELETE","path":"/admin/unblock-ip/{ip}","description":"Unblock an IP"},{"method":"GET","path":"/admin/blocked-ips","description":"List blocked IPs"},{"method":"GET","path":"/health","description":"Readiness probe (ops loopback :8000/health; GET /health/live for liveness)"},{"method":"GET","path":"/v2","description":"Web UI (Google login + search/suggest)"},{"method":"GET","path":"/docs","description":"API documentation (HTML)"},{"method":"GET","path":"/docs.json","description":"API documentation (JSON)"}],"status":"ok"}
