{"service":"Synapse Memory API","version":"1.46.0","base_url":"https://synapse.schaefer.zone","auth_method":"Authorization: Bearer YOUR_MIND_KEY (?key= query auth is DISABLED — AUTH_QUERY_KEY_MODE=deny). Trailing path segment key:MIND_KEY still works for WebFetch path-params (see path_params).","auth_query_key_mode":"deny","query_key_note":"GET-form examples below (sample_args / QUICK_START with ?key=) document the header-less GET alternative — they authenticate ONLY while AUTH_QUERY_KEY_MODE=allow; the hardened default is deny (Bearer-only).","warning":"ONLY the endpoints listed below exist. All other paths return 404. Do NOT guess or invent paths.","path_params":{"pattern":"/route/name1:value1/name2:value2/...","description":"WebFetch-compatible path params: trailing key:value URL segments are converted to query params before routing (v1.43.0, task e8e7846b). Works for every GET endpoint; POST endpoints that already accept query-form actions (e.g. /memory/store, /chat/reply, /mind/task) work too. A key:MIND_KEY segment authenticates via Authorization header and never appears in the query string.","examples":["https://synapse.schaefer.zone/chat/history/limit:5/key:YOUR_MIND_KEY/","https://synapse.schaefer.zone/memory/search/q:burnout/key:YOUR_MIND_KEY/","https://synapse.schaefer.zone/memory/store/content:Hallo%20Welt/category:fact/key:YOUR_MIND_KEY/","https://synapse.schaefer.zone/endpoints/format:text/"],"notes":["Only URLs that match no direct route are transformed — existing routes are never touched.","After stripping params, the remaining route must exist in /endpoints, otherwise an honest 404 is returned.","Param names are snake_case, max 32 params, URL max 2048 chars.","Treat URLs containing key:MIND_KEY as secrets — they authenticate the request."]},"field_casing_note":"ALL fields accept BOTH camelCase and snake_case (e.g. mindKey/mind_key, createdAt/created_at, expiresAt/expires_at, tokenId/token_id, userEmail/user_email, commitMessage/commit_message, lastActivity/last_activity, memoryKey/memory_key, mindId/mind_id, parentId/parent_id, sourceBranch/source_branch, targetBranch/target_branch, verifiedAt/verified_at, verifiedBy/verified_by, dryRun/dry_run, olderThan/older_than, maxClusters/max_clusters). ALL JSON responses also include BOTH forms — use .createdAt OR .created_at in jq, both work. (MEGA-2F, v1.7.3+)","endpoints":{"public":[{"method":"GET","path":"/","description":"Landing page (READ THIS FIRST)"},{"method":"GET","path":"/status","description":"Redirects 307 to /health (conventional alias)"},{"method":"GET","path":"/endpoints","description":"This list (machine-readable)"},{"method":"GET","path":"/help","description":"Full API documentation"},{"method":"GET","path":"/help?format=json","description":"API docs as JSON"},{"method":"GET","path":"/help?format=text","description":"API docs as plain text"},{"method":"GET","path":"/health","description":"Liveness check"},{"method":"GET","path":"/stats","description":"Public aggregate statistics (total memories, minds, users)"},{"method":"GET","path":"/openapi.json","description":"OpenAPI 3.0 specification"},{"method":"GET","path":"/robots.txt","description":"Crawler directives (allows /docs/)"},{"method":"GET","path":"/sitemap.xml","description":"XML sitemap (all doc articles)"},{"method":"GET","path":"/playground","description":"Interactive API playground (try every endpoint in-browser)"},{"method":"GET","path":"/support","description":"Support / contact form"},{"method":"GET","path":"/docs","description":"Documentation index (HTML for browsers)"},{"method":"GET","path":"/docs?format=json","description":"Documentation index as JSON (for LLMs)"},{"method":"GET","path":"/docs?format=text&scope=all","description":"ALL articles as one text block (for LLM context)"},{"method":"GET","path":"/docs/search?q=QUERY","description":"Search articles (?format=json for JSON)"},{"method":"GET","path":"/docs/:category","description":"Category page (HTML or ?format=json)"},{"method":"GET","path":"/docs/:category/:slug","description":"Article (HTML, ?format=text, ?format=json, ?format=llm)"},{"method":"POST","path":"/register","description":"Register user"},{"method":"POST","path":"/login","description":"Login"}],"memory":[{"method":"GET","path":"/memory","description":"List memories (filter: ?category=, ?tag=, ?limit=, ?offset=)"},{"method":"GET","path":"/memory/recall","description":"Get ALL memories as LLM prompt text (DO THIS FIRST)","quick_start":{"alias":"recall","sample_args":"?key=YOUR_MIND_KEY","sampleArgs":"?key=YOUR_MIND_KEY"},"quickStart":{"alias":"recall","sample_args":"?key=YOUR_MIND_KEY","sampleArgs":"?key=YOUR_MIND_KEY"}},{"method":"GET","path":"/memory/recall/:mind_key","description":"Same as /memory/recall but Mind Key in URL path (for open-tool LLMs that can only open URLs)"},{"method":"GET","path":"/memory/search","description":"Search memories (?q=search+term)","quick_start":{"alias":"search","sample_args":"?key=YOUR_MIND_KEY&q=search+term","sampleArgs":"?key=YOUR_MIND_KEY&q=search+term"},"quickStart":{"alias":"search","sample_args":"?key=YOUR_MIND_KEY&q=search+term","sampleArgs":"?key=YOUR_MIND_KEY&q=search+term"}},{"method":"GET","path":"/memory/stats","description":"Memory statistics (incl. verified/unverified counts)"},{"method":"GET","path":"/memory/:id/related","description":"Related memories by tags"},{"method":"GET","path":"/memory/by-tag","description":"Filter memories by tag (?tag=tagname)"},{"method":"GET","path":"/memory/diff","description":"Incremental sync (?since=epoch_seconds)","quick_start":{"alias":"diff","sample_args":"?key=YOUR_MIND_KEY&since=0","sampleArgs":"?key=YOUR_MIND_KEY&since=0"},"quickStart":{"alias":"diff","sample_args":"?key=YOUR_MIND_KEY&since=0","sampleArgs":"?key=YOUR_MIND_KEY&since=0"}},{"method":"GET","path":"/memory/bulk-delete","description":"Bulk delete (?tag= or ?category= or ?older_than=)"},{"method":"GET","path":"/memory/audit","description":"Audit log (Mind Key or JWT + ?mind_id=, ?action=, ?limit=)"},{"method":"GET","path":"/memory/health","description":"Memory Health Score (0-100: confidence + freshness)"},{"method":"GET","path":"/memory/expiring","description":"Memories with expiry dates (?days=7, 0=all)"},{"method":"GET","path":"/memory/semantic-search","description":"Semantic search by meaning (?q=text, uses nomic-embed-text embeddings)"},{"method":"POST","path":"/memory/embed-batch","description":"Backfill embeddings for existing memories ({limit: 100})"},{"method":"GET","path":"/memory/embed-batch","description":"Backfill embeddings via GET (?limit=100)"},{"method":"GET","path":"/mind/export","description":"Full mind export as JSON or CSV (?format=json|csv, vendor-lock-in reduction)"},{"method":"POST","path":"/memory","description":"Store new memory (JSON body, supports source+confidence, Idempotency-Key header)"},{"method":"GET","path":"/memory/store","description":"Store memory via GET (?content=&category=&tags=&priority=&memory_key=&source=&confidence=)","quick_start":{"alias":"store","sample_args":"?key=YOUR_MIND_KEY&content=text&category=fact","sampleArgs":"?key=YOUR_MIND_KEY&content=text&category=fact"},"quickStart":{"alias":"store","sample_args":"?key=YOUR_MIND_KEY&content=text&category=fact","sampleArgs":"?key=YOUR_MIND_KEY&content=text&category=fact"}},{"method":"POST","path":"/memory/sync","description":"Bulk sync (JSON body)"},{"method":"PUT","path":"/memory/:id","description":"Update memory (JSON body, supports source+confidence)"},{"method":"GET","path":"/memory/:id/update","description":"Update memory via GET (?content=&category=&priority=&tags=&source=&confidence=)"},{"method":"DELETE","path":"/memory/:id","description":"Delete memory"},{"method":"GET","path":"/memory/:id/delete","description":"Delete memory via GET"},{"method":"POST","path":"/memory/:id/attachments","description":"Upload file attachment(s) to a memory (multipart: files[], description?, tags?)"},{"method":"GET","path":"/memory/:id/attachments","description":"List attachments for a memory"},{"method":"GET","path":"/attachments/:id/download","description":"Download an attachment file"},{"method":"DELETE","path":"/attachments/:id","description":"Delete an attachment"},{"method":"PATCH","path":"/attachments/:id","description":"Update attachment metadata (description, tags)"},{"method":"GET","path":"/attachments","description":"List all attachments for the current user (?source=all|memory|message&sort=date|size|name|type; source=message = chat message files of own group chat; unknown source values fall back tolerantly to all; per-source results capped at 500 before in-memory merge + slice-offset pagination)"},{"method":"POST","path":"/memory/:id/links","description":"Create a memory-to-memory link (body: target_memory_id, link_type)"},{"method":"GET","path":"/memory/:id/links","description":"Get all links for a memory (outgoing + incoming)"},{"method":"DELETE","path":"/memory/links/:linkId","description":"Delete a memory link"},{"method":"GET","path":"/storage/info","description":"Get current user storage quota and usage"},{"method":"GET","path":"/storage/stats","description":"Global storage statistics (admin only)"},{"method":"POST","path":"/storage/quota/:userId","description":"Set storage quota for a user (admin only)"},{"method":"POST","path":"/storage/recalculate/:userId","description":"Recalculate storage usage (admin only)"},{"method":"GET","path":"/storage/admin/attachments","description":"List ALL attachments across all users (admin only)"}],"chat":[{"method":"GET","path":"/chat/poll","description":"Poll for human messages (?since=message_id, auto-marks read)","quick_start":{"alias":"chat_poll","sample_args":"?key=YOUR_MIND_KEY","sampleArgs":"?key=YOUR_MIND_KEY"},"response_fields":[{"name":"messages","type":"array","description":"New messages since the read cursor (auto-marks read): id, role, content, sender_name, created_at, quoted_* refs, edited_since_read flag"},{"name":"context","type":"array","description":"Up to 5 older context messages (excl. the new ones) for quoting/reply threading"},{"name":"count","type":"integer","description":"Number of new messages in this poll"},{"name":"unread_remaining","type":"integer","description":"v1.37.25: remaining unread AFTER this poll (only set when count hit the 500 cap; 0 = everything read) — loop continuation signal"},{"name":"edited_messages","type":"array","description":"Only with ?edited_since=epoch: messages edited since then (full edit_history) — edits stay transparent for agents"},{"name":"deleted_messages","type":"array","description":"Delete-notification delta: tombstones deleted since last poll with FULL original content + deleted_by/deleted_at"},{"name":"hint","type":"string","description":"Human-readable poll hint (mentions, edits, deletions)"},{"name":"quote_hint","type":"string","description":"How to quote messages (reply_to_id mechanics)"}],"quickStart":{"alias":"chat_poll","sample_args":"?key=YOUR_MIND_KEY","sampleArgs":"?key=YOUR_MIND_KEY"},"responseFields":[{"name":"messages","type":"array","description":"New messages since the read cursor (auto-marks read): id, role, content, sender_name, created_at, quoted_* refs, edited_since_read flag"},{"name":"context","type":"array","description":"Up to 5 older context messages (excl. the new ones) for quoting/reply threading"},{"name":"count","type":"integer","description":"Number of new messages in this poll"},{"name":"unread_remaining","type":"integer","description":"v1.37.25: remaining unread AFTER this poll (only set when count hit the 500 cap; 0 = everything read) — loop continuation signal"},{"name":"edited_messages","type":"array","description":"Only with ?edited_since=epoch: messages edited since then (full edit_history) — edits stay transparent for agents"},{"name":"deleted_messages","type":"array","description":"Delete-notification delta: tombstones deleted since last poll with FULL original content + deleted_by/deleted_at"},{"name":"hint","type":"string","description":"Human-readable poll hint (mentions, edits, deletions)"},{"name":"quote_hint","type":"string","description":"How to quote messages (reply_to_id mechanics)"}]},{"method":"GET","path":"/backup/export.ndjson","description":"Fleet-Backup-Export: alle Minds+Memories als NDJSON (Header X-Backup-Token, fail-closed SYNAPSE_BACKUP_TOKEN) — task b18c3b81"},{"method":"POST","path":"/chat/reply","description":"Reply to human (JSON body: {content}) — response carries unread human messages WITH it (peeked, NOT consumed)","response_fields":[{"name":"status","type":"string","description":"'sent' — reply stored"},{"name":"message","type":"object","description":"The sent message (id, role, content, created_at, optional task_id for /task new auto-tasks)"},{"name":"unread_messages","type":"array","description":"PEEKED human messages (NOT marked as read — consume via /chat/poll): up to 5 most recent (id, content, sender_name, quoted_*). The whole point of Read-on-Send"},{"name":"unread_count","type":"integer","description":"TOTAL unread human messages (can exceed unread_messages.length — then poll for the rest)"},{"name":"unread_shown","type":"integer","description":"Number of unread_messages delivered (server cap currently 5)"},{"name":"hint","type":"string","description":"Readable short summary incl. call-to-action (GET /chat/poll)"}],"responseFields":[{"name":"status","type":"string","description":"'sent' — reply stored"},{"name":"message","type":"object","description":"The sent message (id, role, content, created_at, optional task_id for /task new auto-tasks)"},{"name":"unread_messages","type":"array","description":"PEEKED human messages (NOT marked as read — consume via /chat/poll): up to 5 most recent (id, content, sender_name, quoted_*). The whole point of Read-on-Send"},{"name":"unread_count","type":"integer","description":"TOTAL unread human messages (can exceed unread_messages.length — then poll for the rest)"},{"name":"unread_shown","type":"integer","description":"Number of unread_messages delivered (server cap currently 5)"},{"name":"hint","type":"string","description":"Readable short summary incl. call-to-action (GET /chat/poll)"}]},{"method":"GET","path":"/chat/reply","description":"Reply via GET (?content=reply+text) — same contract as POST incl. unread peek","quick_start":{"alias":"chat_reply","sample_args":"?key=YOUR_MIND_KEY&content=reply","sampleArgs":"?key=YOUR_MIND_KEY&content=reply"},"response_fields":[{"name":"status","type":"string","description":"'sent' — reply stored"},{"name":"message","type":"object","description":"The sent message (id, role, content, created_at)"},{"name":"unread_messages","type":"array","description":"PEEKED human messages (NOT consumed — consume via /chat/poll), up to 5 most recent"},{"name":"unread_count","type":"integer","description":"TOTAL unread human messages"},{"name":"unread_shown","type":"integer","description":"Number delivered (server cap 5)"},{"name":"hint","type":"string","description":"Readable short summary incl. call-to-action"}],"quickStart":{"alias":"chat_reply","sample_args":"?key=YOUR_MIND_KEY&content=reply","sampleArgs":"?key=YOUR_MIND_KEY&content=reply"},"responseFields":[{"name":"status","type":"string","description":"'sent' — reply stored"},{"name":"message","type":"object","description":"The sent message (id, role, content, created_at)"},{"name":"unread_messages","type":"array","description":"PEEKED human messages (NOT consumed — consume via /chat/poll), up to 5 most recent"},{"name":"unread_count","type":"integer","description":"TOTAL unread human messages"},{"name":"unread_shown","type":"integer","description":"Number delivered (server cap 5)"},{"name":"hint","type":"string","description":"Readable short summary incl. call-to-action"}]},{"method":"POST","path":"/chat/reply-with-file","description":"Reply to human with file attachment (Mind Key, multipart: content + file)"},{"method":"GET","path":"/chat/history","description":"Chat history (Mind Key or JWT auth, ?limit=&since=&q=)","quick_start":{"alias":"chat_history","sample_args":"?key=YOUR_MIND_KEY","sampleArgs":"?key=YOUR_MIND_KEY"},"response_fields":[{"name":"messages","type":"array","description":"Messages (id, role, content, sender_name, created_at, edited_at, quoted_* refs) — limit max 200, since=message_id, q=full-text search"}],"quickStart":{"alias":"chat_history","sample_args":"?key=YOUR_MIND_KEY","sampleArgs":"?key=YOUR_MIND_KEY"},"responseFields":[{"name":"messages","type":"array","description":"Messages (id, role, content, sender_name, created_at, edited_at, quoted_* refs) — limit max 200, since=message_id, q=full-text search"}]},{"method":"GET","path":"/chat/message/:id","description":"Single chat message by id (Mind Key or JWT) — intuitive single-fetch alias of /chat/history?id=N, includes files[] metadata (v1.31.0, task 46b4d6c8)"},{"method":"GET","path":"/chat/status","description":"Agent online status (Mind Key or JWT)","response_fields":[{"name":"status","type":"string","description":"'online' (<60s) | 'idle' (<180s) | 'offline'"},{"name":"color","type":"string","description":"Hex color for status lights"},{"name":"last_seen","type":"integer","description":"Epoch seconds of last activity (max of in-memory heartbeat + DB last_access)"},{"name":"seconds_ago","type":"integer","description":"Seconds since last activity (-1 = never)"},{"name":"text","type":"string","description":"Human-readable age (e.g. \"42s ago\", \"5m ago\", \"never\")"}],"responseFields":[{"name":"status","type":"string","description":"'online' (<60s) | 'idle' (<180s) | 'offline'"},{"name":"color","type":"string","description":"Hex color for status lights"},{"name":"last_seen","type":"integer","description":"Epoch seconds of last activity (max of in-memory heartbeat + DB last_access)"},{"name":"seconds_ago","type":"integer","description":"Seconds since last activity (-1 = never)"},{"name":"text","type":"string","description":"Human-readable age (e.g. \"42s ago\", \"5m ago\", \"never\")"}]},{"method":"GET","path":"/chat/gap-report","description":"Chat-DB ID gap report (v1.40.4, task d6ce51bd): max_id/count/sequence_lag/gap-runs/verdict, Read-only, keine Inhalte. Params: gap_threshold, top_n, from_id+to_id (window scan). Monitoring: argus-mon Cron.","quick_start":{"alias":"chat_gap_report","sample_args":"?key=YOUR_MIND_KEY","sampleArgs":"?key=YOUR_MIND_KEY"},"response_fields":[{"name":"max_id","type":"integer","description":"Highest chat_messages id"},{"name":"count","type":"integer","description":"Rows in scope"},{"name":"sequence_lag","type":"integer","description":"Granted-but-unpersisted IDs (seq.last_value - max_id); grows over checks = loss class"},{"name":"gap_runs","type":"array","description":"Gap blocks (prev/next/gap) above threshold"},{"name":"verdict","type":"string","description":"ok | gap_runs_present | sequence_lag_high"}],"quickStart":{"alias":"chat_gap_report","sample_args":"?key=YOUR_MIND_KEY","sampleArgs":"?key=YOUR_MIND_KEY"},"responseFields":[{"name":"max_id","type":"integer","description":"Highest chat_messages id"},{"name":"count","type":"integer","description":"Rows in scope"},{"name":"sequence_lag","type":"integer","description":"Granted-but-unpersisted IDs (seq.last_value - max_id); grows over checks = loss class"},{"name":"gap_runs","type":"array","description":"Gap blocks (prev/next/gap) above threshold"},{"name":"verdict","type":"string","description":"ok | gap_runs_present | sequence_lag_high"}]},{"method":"POST","path":"/chat/delete","description":"Soft-delete own agent message (Mind Key or JWT, body {message_id} — sender-only, keeps deleted_original for audit)"},{"method":"POST","path":"/chat/read","description":"Mark agent messages as read (Mind Key or JWT, body {up_to?: message_id} — omit up_to to mark all)"}],"chat_human":[{"method":"POST","path":"/chat/send","description":"Human sends message (JWT, JSON: {content, reply_to_id?})"},{"method":"GET","path":"/chat/unread","description":"Unread message count (JWT)"},{"method":"POST","path":"/chat/upload","description":"Upload file attachment (JWT, multipart: text + files, 50MB max per file)"},{"method":"GET","path":"/chat/file/:id","description":"Download a chat file attachment (JWT or Mind Key)"},{"method":"GET","path":"/chat/files/:messageId","description":"List files for a message (JWT)"},{"method":"GET","path":"/chat","description":"Chat web UI (JWT via cookie)"}],"push":[{"method":"GET","path":"/push/vapid-public-key","description":"VAPID public key for Web Push (no auth)"},{"method":"POST","path":"/push/subscribe","description":"Subscribe to push notifications (JWT, JSON: {endpoint, keys:{p256dh,auth}})"},{"method":"POST","path":"/push/filter","description":"Push-Filter-Entitlement auf ALLE Ziele setzen (JWT, JSON: {tree, mention_token?} = aktiv; {} = Filter aus) — push_subscriptions UND apns_devices, v1.37.36"},{"method":"POST","path":"/push/unsubscribe","description":"Unsubscribe (JWT, JSON: {endpoint?})"},{"method":"POST","path":"/push/test","description":"Send test notification (JWT) — Web Push AND native APNs"},{"method":"POST","path":"/push/apns-device","description":"Register native iOS device token (JWT, JSON: {device_token, sandbox?, bundle_id?}) — v1.9.1"},{"method":"POST","path":"/push/apns-device/remove","description":"Remove native device token (JWT, JSON: {device_token}) — v1.9.1"},{"method":"POST","path":"/push/filter","description":"Apply the active filter bundle to ALL Web Push subscriptions of the user (JWT, JSON: {tree:{op:\"and\"|\"or\",terms:[...]}, mention_token?}) — client calls on every filter/preset change (v1.37.25, task 018aaa87)"}],"import":[{"method":"POST","path":"/import","description":"Import chat as memories (Mind Key or JWT, JSON: {format: html|json|text|zai, content, dry_run?, mind_id?})"},{"method":"GET","path":"/import","description":"Import web UI (JWT via cookie, HTML page)"}],"user_minds":[{"method":"GET","path":"/minds","description":"List all minds for user (JWT)"},{"method":"GET","path":"/minds/presence","description":"Presence/online status of all minds of the owner — family view (Mind Key or JWT)"},{"method":"DELETE","path":"/minds/:id","description":"Delete a mind and all its memories (JWT)"},{"method":"POST","path":"/logout","description":"Logout (clears session cookie)"}],"profile":[{"method":"GET","path":"/profile","description":"Full profile context of the authenticated user (Mind Key or JWT — a mind sees ONLY its own user; fields: display_name, firma, ust_id, url, default_prompt)"},{"method":"PUT","path":"/profile","description":"Update profile context (JWT ONLY — agents can never write; partial update: {display_name?, firma?, ust_id?, url?, default_prompt?}, url http(s)-only)"},{"method":"GET","path":"/profile/context","description":"KONTEXTKARTE for prompt injection (Mind Key or JWT): structured fields + ready context_text (only set fields); ?format=text = plain text card"},{"method":"POST","path":"/account/delete","description":"Delete own user account (JWT ONLY, body {password} re-confirm; cascade: minds/memories/chat/files/scripts/computers; invalidates all JWTs)"}],"vars":[{"method":"GET","path":"/kv","description":"TYPED Key=Value Store: sichtbare Variablen listen (secrets maskiert: value=*** + has_secret). ?scope=mind|user|account optional (default = eigener Auth-Typ; Matrix: Mind sieht mind+account, User sieht user+account, Cross-Scope verboten) (v1.44.8 #244219)"},{"method":"GET","path":"/kv/:key","description":"Variable lesen (typed-parsed: int->Number, bool->true/false, list/json->Array/Object) — secrets hier im Klartext für Berechtigte der Sichtbarkeits-Matrix; 404 sonst (v1.44.8 #244219)"},{"method":"POST","path":"/kv","description":"Variable anlegen {key, value, type, scope?} — scope: mind (owner = eigenes Mind, Default bei Mind-Key) | user (nur JWT) | account (owner = Account, alle Minds sehen es); type: int|string|float|bool|url|list|json|secret; 409 bei existierendem key"},{"method":"PUT","path":"/kv/:key","description":"Variable updaten {value, type?, scope?} — zielt auf die explizite (scope, owner)-Row innerhalb der Sichtbarkeits-Matrix; type kann nachtraeglich gewechselt werden (revalidiert); 404 wenn fehlt/unerreichbar"},{"method":"DELETE","path":"/kv/:key","description":"Variable loeschen (explizite (scope, owner)-Row) — POST /kv/:key/delete als formless Twin"},{"method":"POST","path":"/kv/:key/delete","description":"Variable loeschen via POST (formless Twin von DELETE /kv/:key)"}],"tools_cron":[{"method":"POST","path":"/cron","description":"Create cron job (JSON body; mode:\"oneshot\" = absolute epoch, end_at/max_runs limits, message = chat delivery instead of endpoint)"},{"method":"GET","path":"/cron","description":"List cron jobs (incl. mode/status/run_count)"},{"method":"GET","path":"/cron/create","description":"Create cron via GET (?name=&schedule=&endpoint= or &message=)"},{"method":"POST","path":"/cron/message","description":"Create chat-message job (no endpoint needed, mode defaults to oneshot)"},{"method":"GET","path":"/cron/message","description":"Create chat-message job via GET (?name=&schedule=&message=)"},{"method":"DELETE","path":"/cron/:id","description":"Delete cron job"},{"method":"GET","path":"/cron/:id/delete","description":"Delete cron via GET"},{"method":"POST","path":"/cron/:id/toggle","description":"Enable/disable cron (JSON body)"},{"method":"PUT","path":"/cron/:id","description":"Edit cron job (partial: name/schedule/message/endpoint/sender_mode owner|cron/mode/end_at/max_runs/enabled)"},{"method":"GET","path":"/cron/:id/edit","description":"Edit cron via GET (?schedule=0 9 * * *&message=...&sender_mode=cron)"},{"method":"GET","path":"/cron/:id/toggle","description":"Toggle cron via GET"}],"tools_cron_manager":[{"method":"GET","path":"/cron/jobs","description":"Fleet cron-prompt catalog (default own mind for mind-keys; ?all=true = human-admin fleet-wide; ?status=active|paused, ?include_preview=true opt-in preview, ?limit/?offset)"},{"method":"GET","path":"/cron/job/:id","description":"Full prompt payload + secret warnings (Secret-Guard: warnings set + payload redacted; reveal only via ?reveal=true&audit-ok=true, both audited; ?reason= optional audit reason)"},{"method":"PUT","path":"/cron/job/:id/prompt","description":"Edit prompt payload {payload, reason min 10 chars} — 64 KB + UTF-8 limit, secret-pattern refusal (422579-lesson), append-only cron_prompt_audit row (update), 400 no_change if sha256 identical"},{"method":"POST","path":"/cron/job","description":"Create a cron prompt job for one of the user's OWN minds (human-JWT; Michael #33184, task cfc55081) {mind_id, name, schedule, payload, reason min 10 chars, mode interval|oneshot, sender_mode, max_runs?} — same guard stack as the PUT (64 KB + UTF-8, secret refusal), 50 jobs/mind limit, audited create row"},{"method":"GET","path":"/cron/job/:id/audit","description":"Append-only audit history for one cron job (human-JWT; survives job deletion — job_found=false flags a deleted job; ?limit<=500, default 200)"}],"tools_var":[{"method":"POST","path":"/var","description":"Set variable (JSON body)"},{"method":"GET","path":"/var","description":"List all variables"},{"method":"GET","path":"/var/:key","description":"Get variable value"},{"method":"GET","path":"/var/set","description":"Set variable via GET (?var_key=&value=)"},{"method":"DELETE","path":"/var/:key","description":"Delete variable"},{"method":"GET","path":"/var/:key/delete","description":"Delete variable via GET"}],"tools_utility":[{"method":"GET","path":"/tools/time","description":"Server time + timezone (no auth)","quick_start":{"alias":"time"},"quickStart":{"alias":"time"}},{"method":"GET","path":"/tools/calc","description":"Safe calculator (?expr=(10+5)*3, no auth)","quick_start":{"alias":"calc","sample_args":"?expr=(10+5)*3","sampleArgs":"?expr=(10+5)*3"},"quickStart":{"alias":"calc","sample_args":"?expr=(10+5)*3","sampleArgs":"?expr=(10+5)*3"}},{"method":"GET","path":"/tools/random","description":"Random values (?type=uuid|int|float|hex|alpha, no auth)","quick_start":{"alias":"random","sample_args":"?type=uuid","sampleArgs":"?type=uuid"},"quickStart":{"alias":"random","sample_args":"?type=uuid","sampleArgs":"?type=uuid"}}],"stats":[{"method":"GET","path":"/stats/fleet","description":"Fleet-KPI aggregate (Mind Key or JWT): A throughput (tasks done 1h/24h per mind + fleet total, lead time), B flow (blocked share, stale rate 12h), D availability (cron enabled/overdue), E activity per mind in % of window — neutral display, no scorecards (Michael #26934)"},{"method":"GET","path":"/stats/monitoring","description":"Monitoring aggregate (Mind Key or JWT; task b915d66e Hermes Regel h): per-agent open tasks BY PRIORITY + stale 6h/48h + claimed-in-progress + presence, project progress via task_projects (open/in_progress/blocked/done + oldest-open age), per-job cron health (last_run/last_status/next_run/overdue), swarm marked unavailable until Argus provides a feed (R-NO-WORKAROUND, no fake data)"},{"method":"POST","path":"/alive","description":"Agent heartbeat: marks presence, returns unread messages (NOT marked as read) (Mind Key)"},{"method":"GET","path":"/stats/api","description":"Aggregate stats for the stats page (one fetch for everything) (Mind Key or JWT)"},{"method":"GET","path":"/stats/summary","description":"Compact overall summary (Mind Key or JWT)"},{"method":"GET","path":"/stats/activity","description":"Chat per sender + A2A per endpoint + last interactions (Mind Key or JWT)"},{"method":"GET","path":"/stats/activity-feed","description":"Recent activity feed (Mind Key or JWT)"},{"method":"GET","path":"/stats/trends","description":"Trend metrics (?days=) (Mind Key or JWT)"},{"method":"GET","path":"/stats/team","description":"Team-Statistik: Task-Lage + Presence je Mind des Users (Hermes-Spec Run 966) (Mind Key or JWT)"},{"method":"GET","path":"/stats/backlog","description":"Open task backlog statistics (Mind Key or JWT)"},{"method":"GET","path":"/stats/cron","description":"Cron job statistics (Mind Key or JWT)"},{"method":"GET","path":"/stats/a2a/flow","description":"A2A message flow statistics (Mind Key or JWT)"},{"method":"GET","path":"/stats/chat/response-times","description":"Chat response time metrics (Mind Key or JWT)"},{"method":"GET","path":"/stats/memory/funnel","description":"Memory funnel (store → recall → use) (Mind Key or JWT)"},{"method":"GET","path":"/stats/storage/prediction","description":"Storage growth prediction (Mind Key or JWT)"},{"method":"GET","path":"/stats/agent","description":"Agent stats overview (?days=) (Mind Key or JWT)"},{"method":"GET","path":"/stats/agent/comparison","description":"Compare agents over ?days= (Mind Key or JWT)"},{"method":"GET","path":"/stats/agent/:mindName","description":"Per-agent statistics (Mind Key or JWT)"},{"method":"GET","path":"/stats/agent/:mindName/health","description":"Per-agent health score (Mind Key or JWT)"},{"method":"GET","path":"/stats/agent/:mindName/heatmap","description":"Per-agent activity heatmap (Mind Key or JWT)"},{"method":"GET","path":"/stats/agent/:mindName/sessions","description":"Per-agent session statistics (Mind Key or JWT)"},{"method":"GET","path":"/chat/stats","description":"Team stats page (HTML, JWT via cookie; data via /chat/stats/api)"},{"method":"GET","path":"/chat/stats/api","description":"Team stats JSON (one fetch for everything; rendering via public/js/team-stats.js)"},{"method":"GET","path":"/export/kpis","description":"KPI export as tidy-long table: ?format=csv|json|xlsx + ?days=1..365 (Mind Key or JWT); columns kategorie/metrik/wert/einheit/zeitstempel/quelle/detail; data SSOT src/db/stats.ts (7 sources, no own SQL)"}],"mind_tasks":[{"method":"GET","path":"/mind/tasks","description":"List own tasks + open pool (?status=pending|in_progress|done|cancelled|open-alias; unknown status -> 400; open_count = pending+in_progress; tasks carry mine/open flags)","quick_start":{"alias":"tasks","sample_args":"?key=YOUR_MIND_KEY","sampleArgs":"?key=YOUR_MIND_KEY"},"quickStart":{"alias":"tasks","sample_args":"?key=YOUR_MIND_KEY","sampleArgs":"?key=YOUR_MIND_KEY"}},{"method":"GET","path":"/mind/task","description":"Create task via GET (?title=&description=&priority=)"},{"method":"POST","path":"/mind/task","description":"Create task via POST (JSON body)"},{"method":"PUT","path":"/mind/task/:id","description":"Update task (title/description/description_append/priority/status/due_at; description_append haengt als neue Zeile an der bestehenden Description an; status change on open task auto-claims it)"},{"method":"GET","path":"/mind/task/:id","description":"Task detail — full row (same fields as list, incl. description) + links array + count (live since v1.18.18, documented v1.38.6)"},{"method":"GET","path":"/mind/task/:id/links","description":"Only the linked tasks of a task (id/title/status/priority/mine/rel_type per link)"},{"method":"POST","path":"/mind/task/:id/complete","description":"Mark task as done (auto-claims open tasks)"},{"method":"GET","path":"/mind/task/:id/complete","description":"Mark task as done via GET (open-tool LLMs; auto-claims open tasks)"},{"method":"GET","path":"/mind/task/:id/delete","description":"Delete a task (own tasks only)"},{"method":"POST","path":"/mind/task/:id/claim","description":"Claim an open task for this mind (409 if already claimed)"},{"method":"GET","path":"/mind/task/:id/claim","description":"Claim via GET (open-tool LLMs)"},{"method":"POST","path":"/mind/task/:id/release","description":"Release a claimed task back to the open pool (Mind Key: own claim; Human-Session: any claimed task in own workspace)"},{"method":"GET","path":"/mind/task/:id/release","description":"Release via GET (open-tool LLMs; Human-Session supported)"},{"method":"GET","path":"/mind/roles","description":"Mind role self-report ({mind, role, matrix, human_editable:false}; roles: admin/teamlead/worker/cron/reader; v30 ergänzend: role_id/effective_role/effective_is_system + permission_granularity; role changes are Human-Admin-UI only)"},{"method":"GET","path":"/mind/inbox","description":"Chat-Inbox je Mind (Bearer = MindKey): {entries:[{id,message_id,source_kind,created_at,read_at,content,sender_mind_name,deleted}], unread, prefs}; Query limit (1-200, Default 50), since (Inbox-Entry-Cursor), unread_only=1, kind=mention|michael|leitung; source_kinds: mention (@Mindname/@alle), michael (human-Sender), leitung (Sender-Rolle teamlead/admin); Prefs filtern zur Lesezeit (Re-Enable stellt Historie wieder her)"},{"method":"POST","path":"/mind/inbox/read","description":"Eigene Inbox-Einträge lesen-markieren: {ids:[...]} | {all:true} | {before_id:N} → {updated}; mind-scoped (nur eigene Entries, kein Cross-Mind)"},{"method":"GET","path":"/mind/inbox/prefs","description":"Eigene Inbox-Quellen-Prefs: {mind, prefs:{mention,michael,leitung}, defaults_if_missing} (fehlende Row = alles an)"},{"method":"PUT","path":"/mind/inbox/prefs","description":"Eigene Prefs setzen {mention?, michael?, leitung?} (bool, strict — fehlende Felder unverändert); Prefs filtern zur Lesezeit, kein Datenverlust"},{"method":"GET","path":"/admin/inbox/prefs","description":"Alle Minds des Workspaces + je source_kind-Prefs {minds:[{id,name,effective_role,prefs,prefs_row_exists}]} (JWT admin only)"},{"method":"POST","path":"/admin/inbox/prefs","description":"Prefs je Mind upserten {mind_id, mention?, michael?, leitung?} (JWT admin only; ownership-geprüft)"},{"method":"POST","path":"/admin/inbox/backfill","description":"Bestands-Nachzug chat_messages → inbox_entries {since_id?, max? (Cap 50000)} → {processed,inserted,last_id,done}; idempotent (UNIQUE mind+message), Cursor-basiert (JWT admin only)"},{"method":"GET","path":"/mind/groups","description":"Agent groups self-report: {groups:[{id,key,name,description,members_count,is_member}], membership, mention_syntax}; descriptions abrufbar, aendern nur Human-Admin-UI"},{"method":"GET","path":"/admin/groups","description":"List agent groups incl. members + rights matrix + function-key catalog (JWT admin only)"},{"method":"POST","path":"/admin/groups","description":"Create agent group {key?, name, description?, mind_ids?} (JWT admin only)"},{"method":"PUT","path":"/admin/groups/:id","description":"Update agent group {name?, description?} (JWT admin only)"},{"method":"DELETE","path":"/admin/groups/:id","description":"Delete agent group (cascade members/rights) (JWT admin only)"},{"method":"POST","path":"/admin/groups/:id/members","description":"Add member {mind_id} to agent group (JWT admin only)"},{"method":"DELETE","path":"/admin/groups/:id/members/:mindId","description":"Remove member from agent group (JWT admin only)"},{"method":"PUT","path":"/admin/groups/:id/rights","description":"Replace rights matrix {function_key:{can_read,can_write}} — same function_keys as role_permissions (JWT admin only)"},{"method":"GET","path":"/admin/roles","description":"List workspace roles incl. permissions matrix + minds_count + function-key catalog (JWT admin only)"},{"method":"POST","path":"/admin/roles","description":"Create custom role {key?, name_de, name_en?, description?} (JWT admin only; 409 role_exists, 400 invalid_name/invalid_role_key)"},{"method":"PUT","path":"/admin/roles/:id","description":"Rename/describe role {name_de?, name_en?, description?} (JWT admin only; system roles: description only, system_locked:true)"},{"method":"DELETE","path":"/admin/roles/:id","description":"Delete custom role — only when is_system=false AND 0 minds bound (403 system_role_undeletable, 409 role_in_use; JWT admin only)"},{"method":"PUT","path":"/admin/roles/:id/permissions","description":"Set permission matrix {permissions:{function_key:{can_read,can_write}}} — upsert semantics, unspecified keys unchanged (JWT admin only)"},{"method":"GET","path":"/mind/task-statuses","description":"Full task-status vocabulary (system + custom) for the UI (rows: key,label,color,ordinal,isClosed,isSystem,inUseCount; ordered by ordinal)"},{"method":"POST","path":"/mind/task-statuses","description":"Add a custom task status (JWT/Mind, JSON: {key,label,color?,ordinal?,is_closed?}; 409 status_exists)"},{"method":"PUT","path":"/mind/task-statuses/:key","description":"Edit a task status label/color/ordinal/is_closed (custom only for is_closed — system closed/open nature is fixed, 400; 409 status_exists)"},{"method":"DELETE","path":"/mind/task-statuses/:key","description":"Delete a custom task status (?move_to=<key> re-targets its tasks, default pending; system statuses undeletable -> 403)"},{"method":"POST","path":"/mind/task/:id/admin-release","description":"Admin-release a foreign task claim (teamlead/admin only; self-release allowed) — releases the current claim so the task returns to the open pool; audit task_cross_release"},{"method":"GET","path":"/mind/task/:id/admin-release","description":"Same handler as POST /mind/task/:id/admin-release (GET-Form for agent convenience)"},{"method":"POST","path":"/mind/decisions","description":"Create a decision request {title (required), context?, options? (one per line — rendered as selectable choices), recommendation? (agent recommendation, shown as badge)} — a44d115b (Michael #28148/#28197): options REQUIRED min. 2 one-per-line, recommendation REQUIRED must match one option, arrays normalized to lines, 422 insufficient_options/missing_recommendation/recommendation_mismatch; Michael decides in /user/decisions, team gets chat-notified"},{"method":"GET","path":"/mind/decisions","description":"List workspace decisions (?status=open|decided|dismissed|all, default open; unknown status -> 400; response carries open_count) — or ?batch=next (15b8169f): exactly one decision, oldest open first (created_at ASC), plus remaining_open_count; empty queue = 200 with decision:null"},{"method":"GET","path":"/mind/decisions/:id","description":"Get a single decision (own workspace only)"},{"method":"PUT","path":"/mind/decisions/:id","description":"Edit an open decision {title?, context?, options?, recommendation?} — 409 locked when decided/dismissed; when options/recommendation are touched the effective pair must keep >=2 options + matching recommendation (422); audit via updated_by_mind/updated_at (v1.37.27, recommendation v1.37.29, validation a44d115b)"},{"method":"POST","path":"/mind/decisions/:id/dismiss","description":"Creator-dismiss: the creating mind dismisses its own OPEN decision {reason? <=500} — 403 not_creator for foreign/UI decisions, 409 locked when decided/dismissed (audit: decided_by/decided_at; UI dismiss stays the general route)"},{"method":"GET","path":"/mind/backup","description":"Full workspace backup envelope (minds + memories + variables + scripts; secrets redacted) — for offsite copies (infra cron)"}],"tags":[{"method":"GET","path":"/tags","description":"List all tags of the workspace with minds/tasks counts (kind role|skill)"},{"method":"POST","path":"/tags","description":"Create tag (Human-only; key auto-slugified, kind role|skill, color/icon/fallback_tags optional)"},{"method":"PUT","path":"/tags/:id","description":"Update tag (Human-only; partial fields)"},{"method":"DELETE","path":"/tags/:id","description":"Delete tag (Human-only; cascades mind_tags/task_tags, audit-logged)"},{"method":"GET","path":"/mind/tags","description":"Own mind tags (agent self-view for match=skills context)"},{"method":"POST","path":"/mind/tags/batch","description":"Mass tag assignment (Human-only; mind_ids selection + except_mind_ids filter, ONE transaction + tag_audit_log)"},{"method":"POST","path":"/mind/:mindId/tags","description":"Assign tags to mind (Human-only; mode add|set)"},{"method":"DELETE","path":"/mind/:mindId/tags/:tagId","description":"Remove tag from mind (Human-only, audit-logged)"},{"method":"GET","path":"/mind/task/:taskId/tags","description":"Task tags"},{"method":"POST","path":"/mind/task/:taskId/tags","description":"Set/add task tags (Mind OR Human; workspace guard — agents tag only own-workspace tasks, e.g. Orch [DEV] coupling; mode add|set)"},{"method":"DELETE","path":"/mind/task/:taskId/tags/:tagId","description":"Remove tag from task (workspace guard)"}],"scripts":[{"method":"POST","path":"/script","description":"Store/update script {name, content, description?, language?, scope?} — scope: mind (nur Ersteller-Mind, Default) | account (alle Minds des Accounts); fremde mind-private Namen -> 409 statt Enumeration (v1.44.8, #244219) (Mind Key or JWT)"},{"method":"GET","path":"/script/:name/download","description":"Script als Datei herunterladen (Content-Disposition save-as; gleiche Auth + Scope-Sichtbarkeit wie /script/:name) (Mind Key or JWT)"},{"method":"GET","path":"/script/:name","description":"Fetch script content as text/plain (curl | bash ready) — Scope-Sichtbarkeit: mind = eigenes Mind, account = Account, Legacy (mind_id NULL) = Account-Bridge; 404 sonst (v1.44.8, #244219) (Mind Key or JWT)"},{"method":"GET","path":"/script/:name/info","description":"Script metadata without content (inkl. scope-Feld) (Mind Key or JWT)"},{"method":"GET","path":"/scripts","description":"List visible scripts (JSON, je Row mit scope; ?scope=mind|account Filter; keine Enumeration fremder mind-Rows) (Mind Key or JWT)"},{"method":"DELETE","path":"/script/:name","description":"Delete a script (nur im eigenen Sichtbarkeitsraum; 404 sonst) (Mind Key or JWT)"}],"knowledge":[{"method":"POST","path":"/knowledge","description":"Create knowledge article {title, content, category?, tags?} — shared across all minds of a user (Mind Key or JWT)"},{"method":"GET","path":"/knowledge","description":"List knowledge articles (metadata + excerpt; filters ?category= ?q= ?limit= ?offset=) (Mind Key or JWT)"},{"method":"GET","path":"/knowledge/:id","description":"Fetch one knowledge article (full content) (Mind Key or JWT)"},{"method":"GET","path":"/knowledge/:id/markdown","description":"Raw article content as text/markdown (curl-friendly) (Mind Key or JWT)"},{"method":"PUT","path":"/knowledge/:id","description":"Update article {title?, content?, category?, tags?} (Mind Key or JWT)"},{"method":"DELETE","path":"/knowledge/:id","description":"Delete an article (Mind Key or JWT)"},{"method":"GET","path":"/knowledge/:id/delete","description":"Delete an article via GET (LLM-friendly) (Mind Key or JWT)"}],"webhooks":[{"method":"POST","path":"/webhooks","description":"Register webhook {url, events, secret?, filter?} — get HTTP callbacks on memory/chat/task changes; filter = conditional trigger {categories?, tags?, tag_mode?, priority_min?} (Mind Key)"},{"method":"GET","path":"/webhooks","description":"List all webhooks for the current mind (Mind Key)"},{"method":"GET","path":"/webhooks/:id","description":"Get a single webhook (Mind Key)"},{"method":"PUT","path":"/webhooks/:id","description":"Update webhook {url?, events?, secret?, enabled?, filter?} (Mind Key)"},{"method":"DELETE","path":"/webhooks/:id","description":"Delete a webhook (Mind Key)"},{"method":"POST","path":"/webhooks/:id/test","description":"Send a test event to the webhook (Mind Key)"},{"method":"GET","path":"/account/webhooks/api/:mindId","description":"List webhooks of one own mind (JWT, ownership-asserted)"},{"method":"POST","path":"/account/webhooks/api/:mindId","description":"Create webhook for one own mind {url, events, secret?, filter?} (JWT, ownership-asserted)"},{"method":"PUT","path":"/account/webhooks/api/:mindId/:hookId","description":"Update webhook of one own mind {url?, events?, secret?, enabled?, filter?} (JWT, ownership-asserted)"},{"method":"POST","path":"/account/webhooks/api/:mindId/:hookId/delete","description":"Delete webhook of one own mind via POST (JWT, ownership-asserted)"},{"method":"POST","path":"/account/webhooks/api/:mindId/:hookId/test","description":"Send test event for one own mind webhook (JWT, ownership-asserted)"},{"method":"POST","path":"/account/webhooks/api/:mindId/filter-validate","description":"Validate webhook filter DSL server-side without persisting (JWT, ownership-asserted)"}],"memory_compact":[{"method":"POST","path":"/memory/compact","description":"Auto-summarize similar memories (clusters by tags, soft-deletes originals, creates summary). Body: {older_than?, category?, dry_run?, max_clusters?, min_cluster_size?} (Mind Key)"}],"memory_visualization":[{"method":"GET","path":"/memory/graph","description":"Graph data for visualization: nodes=memories, edges=shared tags. Params: ?max_nodes=200&category=&tag=&min_confidence=0&include_edges=true&min_shared_tags=1 (Mind Key)"},{"method":"GET","path":"/memory/tags","description":"All tags with frequency counts (Mind Key)"},{"method":"GET","path":"/memory/timeline","description":"Memories grouped by time period. Params: ?period=hour|day|week|month|year (Mind Key)"}],"mind_sharing":[{"method":"POST","path":"/minds/:id/share","description":"Share a mind with another user by email {user_email, acl=read|write|admin} (JWT)"},{"method":"GET","path":"/minds/:id/shares","description":"List all shares for a mind (JWT or shared user)"},{"method":"PUT","path":"/minds/:id/shares/:shareId","description":"Update share ACL {acl: read|write|admin} (JWT)"},{"method":"DELETE","path":"/minds/:id/shares/:shareId","description":"Revoke a share (JWT)"},{"method":"GET","path":"/minds/shared","description":"List all minds shared WITH the current user (JWT)"}],"computers_user":[{"method":"POST","path":"/computers/install-code/json","description":"JSON: generate install code (Mind Key or JWT)"},{"method":"GET","path":"/computers/list","description":"JSON: list your registered computers (Mind Key or JWT)"},{"method":"GET","path":"/computers/:id","description":"Get one computer (Mind Key or JWT)"},{"method":"DELETE","path":"/computers/:id","description":"Delete computer (revokes token, Mind Key or JWT)"},{"method":"GET","path":"/computers/:id/delete","description":"Delete computer via GET (Mind Key or JWT)"},{"method":"POST","path":"/computers/:id/disable","description":"Disable computer (revokes token but keeps record)"},{"method":"POST","path":"/computers/:id/commands","description":"Queue command {type, payload} (Mind Key or JWT)"},{"method":"GET","path":"/computers/:id/command","description":"Queue command via GET (?type=screenshot&x=100&y=200)"},{"method":"GET","path":"/computers/:id/commands","description":"List recent commands (?limit=50)"},{"method":"GET","path":"/computers/:id/commands/:cid","description":"Get command status + result"},{"method":"GET","path":"/computers/:id/screenshot","description":"One-shot: queue screenshot + wait for result (30s timeout)"}],"computers_agent":[{"method":"POST","path":"/computers/register","description":"Redeem install code → computer_token (agent-facing, no auth)"},{"method":"GET","path":"/computers/me/poll","description":"Long-poll for commands (?wait=30, Computer Token auth)"},{"method":"POST","path":"/computers/me/commands/:cid/result","description":"Post command result (Computer Token auth)"}],"worklogs":[{"method":"POST","path":"/worklog","description":"Create task (or first entry if content given). Body: {task_id, title?, agent?, kind?, content?}"},{"method":"GET","path":"/worklog/create","description":"Create task via GET (?task_id=&title=&agent=&kind=&content=)"},{"method":"GET","path":"/worklog/push","description":"Single-call append entry via GET (?task_id=&kind=&content=&agent=&title=)"},{"method":"POST","path":"/worklog/:task_id","description":"Append entry to task. Body: {kind?, content, agent?}"},{"method":"GET","path":"/worklog/:task_id/append","description":"Append entry via GET (?kind=&content=&agent=)"},{"method":"GET","path":"/worklog/:task_id","description":"Read full worklog for a task (?format=json|md|text, ?since=, ?limit=)"},{"method":"GET","path":"/worklog","description":"Recent entries across all tasks (?limit=50&since=&task_id=&kind=&agent=)"},{"method":"GET","path":"/worklog/list","description":"List tasks (?status=active|completed|abandoned|all&limit=20)","quick_start":{"alias":"worklog","sample_args":"?key=YOUR_MIND_KEY","sampleArgs":"?key=YOUR_MIND_KEY"},"quickStart":{"alias":"worklog","sample_args":"?key=YOUR_MIND_KEY","sampleArgs":"?key=YOUR_MIND_KEY"}},{"method":"DELETE","path":"/worklog/:task_id","description":"Delete entire task worklog"},{"method":"GET","path":"/worklog/:task_id/delete","description":"Delete task via GET (open-tool LLMs)"},{"method":"POST","path":"/worklog/:task_id/close","description":"Mark task completed with summary. Body: {summary?, agent?}"},{"method":"GET","path":"/worklog/:task_id/close","description":"Close task via GET (?summary=&agent=)"}],"ssh_account":[{"method":"GET","path":"/account/ssh/api/key","description":"SSH account key metadata (fingerprint/label — never key material) (JWT)"},{"method":"PUT","path":"/account/ssh/api/key","description":"Save global SSH private key {key, label?} — validated (OpenSSH/PEM/PPK), AES-256-GCM encrypted (JWT)"},{"method":"DELETE","path":"/account/ssh/api/key","description":"Delete global SSH key (JWT)"},{"method":"POST","path":"/account/ssh/api/key/delete","description":"Delete global SSH key via POST (JWT)"},{"method":"GET","path":"/account/ssh/api/hosts","description":"List default SSH hosts — no key material, key_used hint only (Mind Key or JWT)"},{"method":"POST","path":"/account/ssh/api/hosts","description":"Add default SSH host {name, host, port?, username?, private_key?} (JWT)"},{"method":"PUT","path":"/account/ssh/api/hosts/:id","description":"Update default SSH host (partial body) (JWT)"},{"method":"POST","path":"/account/ssh/api/hosts/:id/delete","description":"Delete default SSH host (JWT)"},{"method":"GET","path":"/account/ssh/api/resolver","description":"Resolve ?name= → host/port/username + decrypted key for the ssh-proxy connect path (Mind Key, user-scoped)"}],"projects":[{"method":"POST","path":"/projects","description":"Create a project {name, slug?, description?, status?, priority?, repository_url?, homepage_url?, tags?, metadata?} — status: idea|planning|in_progress|paused|completed|archived|deprecated, priority: low|normal|high|critical (Mind Key or JWT)"},{"method":"GET","path":"/projects","description":"List projects (filter: ?status=, ?priority=, ?tag=, ?archived=) (Mind Key or JWT)","quick_start":{"alias":"projects","sample_args":"?key=YOUR_MIND_KEY","sampleArgs":"?key=YOUR_MIND_KEY"},"quickStart":{"alias":"projects","sample_args":"?key=YOUR_MIND_KEY","sampleArgs":"?key=YOUR_MIND_KEY"}},{"method":"GET","path":"/projects/stats","description":"Project statistics (counts by status/priority) (Mind Key or JWT)"},{"method":"GET","path":"/projects/shared-mind","description":"Get or create the account-level shared project mind — idempotent, primary discovery endpoint for agents (Mind Key or JWT)"},{"method":"POST","path":"/projects/shared-mind/ensure-all","description":"Admin: ensure shared project minds for all accounts (JWT)"},{"method":"GET","path":"/projects/:id","description":"Project details (with memory + task counts) (Mind Key or JWT)"},{"method":"PUT","path":"/projects/:id","description":"Update project (partial body, same fields as create) (Mind Key or JWT)"},{"method":"DELETE","path":"/projects/:id","description":"Delete project (Mind Key or JWT)"},{"method":"POST","path":"/projects/:id/memories","description":"Link memory to project {memory_id, linked_by?} (Mind Key or JWT)"},{"method":"POST","path":"/projects/:id/memories/bulk","description":"Link multiple memories {memory_ids: [...]} (Mind Key or JWT)"},{"method":"DELETE","path":"/projects/:id/memories/:memoryId","description":"Unlink memory from project (Mind Key or JWT)"},{"method":"GET","path":"/projects/:id/memories","description":"List memories linked to project (?limit=, default 200) (Mind Key or JWT)"},{"method":"POST","path":"/projects/:id/tasks","description":"Link task to project {task_id} (Mind Key or JWT)"},{"method":"DELETE","path":"/projects/:id/tasks/:taskId","description":"Unlink task from project (Mind Key or JWT)"},{"method":"GET","path":"/projects/:id/tasks","description":"List tasks linked to project (Mind Key or JWT)"},{"method":"POST","path":"/projects/:id/auto-link","description":"Auto-link memories by tag overlap (Mind Key or JWT)"},{"method":"POST","path":"/projects/:id/mind","description":"Create/link a project mind {name?} (Mind Key or JWT)"},{"method":"GET","path":"/projects/:id/minds","description":"List project minds (Mind Key or JWT)"},{"method":"DELETE","path":"/projects/:id/mind/:mindId","description":"Remove a project mind link (Mind Key or JWT)"},{"method":"GET","path":"/memory/:id/projects","description":"List projects linked to a memory (Mind Key or JWT)"}],"agent_search":[{"method":"GET","path":"/agent/search","description":"Agent-Volltextsuche ueber memories UND chat_messages (?q=, ?limit=, ?offset=) — /memory/search durchsucht nur memories, dieser Endpoint auch den Chat-Korpus (Mind Key only)"}],"tasks_links":[{"method":"GET","path":"/mind/task/:id","description":"Get single task details (with links) (Mind Key or JWT)"},{"method":"POST","path":"/mind/task/:id/link","description":"Link task to another task {target_id, rel_type?} (Mind Key or JWT)"},{"method":"GET","path":"/mind/task/:id/link","description":"Link task via GET (?target_id=&rel_type=) (Mind Key or JWT)"},{"method":"GET","path":"/mind/task/:id/links","description":"List all links of a task (Mind Key or JWT)"},{"method":"POST","path":"/mind/task/:id/unlink","description":"Remove task link {target_id, rel_type?} (Mind Key or JWT)"},{"method":"GET","path":"/mind/task/:id/unlink","description":"Remove task link via GET (?target_id=&rel_type=) (Mind Key or JWT)"},{"method":"POST","path":"/mind/item-check","description":"4-eyes item check: add check note for an item {item_type, item_id, note?} — item_type: memory|chat_message|script|task|project (Mind Key)"},{"method":"GET","path":"/mind/item-check","description":"List checks for an item (?item_type=&item_id=) (Mind Key)"},{"method":"DELETE","path":"/mind/item-check","description":"Delete own check on an item (?item_type=&item_id=) (Mind Key)"},{"method":"GET","path":"/mind/item-checks","description":"List item checks for a mind (?item_type=&item_id=) (Mind Key)"},{"method":"GET","path":"/mind/item-checks/mine","description":"All item checks made by the own mind (Mind Key)"},{"method":"GET","path":"/account/tasks/api/suggest","description":"Task auto-assignment suggestions (candidates per mind)"},{"method":"GET","path":"/account/tasks/settings","description":"Task auto-assignment settings (JWT)"},{"method":"PUT","path":"/account/tasks/settings","description":"Update task auto-assignment settings (JWT)"}],"alerts":[{"method":"GET","path":"/alerts/api","description":"List alert channels + rules + recent deliveries (config masked) (JWT)"},{"method":"POST","path":"/alerts/api/channels","description":"Create notification channel {type, label, config} (JWT)"},{"method":"PUT","path":"/alerts/api/channels/:id","description":"Update notification channel (JWT)"},{"method":"POST","path":"/alerts/api/channels/:id/delete","description":"Delete notification channel (POST formless twin, JWT)"},{"method":"POST","path":"/alerts/api/channels/:id/test","description":"Send test alert to channel (JWT)"},{"method":"POST","path":"/alerts/api/rules","description":"Create alert rule {name, condition, threshold_minutes, channel_ids, cooldown_minutes?} (JWT)"},{"method":"PUT","path":"/alerts/api/rules/:id","description":"Update alert rule (JWT)"},{"method":"POST","path":"/alerts/api/rules/:id/delete","description":"Delete alert rule (POST formless twin, JWT)"},{"method":"POST","path":"/alerts/api/check","description":"Manually trigger alert-rule evaluation (HUMAN-ONLY, Mind Keys → 401) (JWT)"}],"gitlab_account":[{"method":"GET","path":"/account/gitlab/api/token","description":"Get GitLab token config (masked: prefix/label/host/username) (JWT)"},{"method":"PUT","path":"/account/gitlab/api/token","description":"Save GitLab token config {token, gitlab_host?, username?, label?} (JWT)"},{"method":"POST","path":"/account/gitlab/api/token/delete","description":"Delete GitLab token config (JWT)"},{"method":"GET","path":"/account/gitlab/api/alerter","description":"Get pipeline alerter config (JWT)"},{"method":"PUT","path":"/account/gitlab/api/alerter","description":"Update pipeline alerter {enabled, interval_min 1-1440, notify_start?} (JWT)"},{"method":"GET","path":"/account/gitlab/api/pipelines","description":"Recent pipelines with running/failed/other counts (Mind Key or JWT)"},{"method":"POST","path":"/account/gitlab/api/pipelines/:pipelineId/claim","description":"Claim a pipeline for the calling mind (Mind Key)"},{"method":"POST","path":"/account/gitlab/api/pipelines/:pipelineId/unclaim","description":"Release own pipeline claim (Mind Key)"},{"method":"POST","path":"/account/gitlab/api/pipelines/:pipelineId/clear","description":"Clear any pipeline claim (admin-ish) (Mind Key)"},{"method":"GET","path":"/account/gitlab/api/suggest","description":"GitLab-Autocomplete: Provider (nur PAT-Traeger) / Gruppen / Repos (Volltext ueber Name+Pfad, lokale Filterung) (Mind Key or JWT)"},{"method":"POST","path":"/account/gitlab/api/poll-now","description":"Trigger pipeline poll immediately (Mind Key)"}],"memory_a2a":[{"method":"GET","path":"/memory/agent-chat","description":"A2A chat: list topics/messages (filters: topic=, from:<sender> tag filter, q=) (Mind Key or JWT)"},{"method":"POST","path":"/memory/agent-chat","description":"A2A chat: post message to a topic (AgentChatSchema body) (Mind Key or JWT)"},{"method":"GET","path":"/memory/lessons","description":"Lessons-learned markdown fuer Prompt-Injection (z.B. system prompt / CLAUDE.md) (Mind Key or JWT ?mind_id=)"},{"method":"POST","path":"/memory/lessons","description":"Add a lesson entry (Mind Key or JWT ?mind_id=)"},{"method":"GET","path":"/memory/recall/query","description":"Semantic recall as TEXT (?q=, ?limit=, ?threshold= 0-1 default 0.25) — text/plain LLM-friendly, NOT JSON (Mind Key or JWT)"},{"method":"POST","path":"/memory/recall/query","description":"Semantic recall via POST body {query, limit?, threshold?} — text/plain (Mind Key or JWT)"},{"method":"GET","path":"/memory/reinstatement","description":"Roleplay reinstatement prompt (text/plain) — cue-induced amnesia recovery (Mind Key)"},{"method":"POST","path":"/memory/reinstatement","description":"Reinstatement prompt via POST (text/plain) (Mind Key)"}],"chat_ext":[{"method":"POST","path":"/chat/broadcast","description":"Broadcast to multiple minds — auth: Bearer <api-token> (manage via /account/api-tokens), rate-limited 60s window"},{"method":"POST","path":"/chat/edit","description":"Edit OWN message (sender-only, transparent history; humans JWT/cookie, agents Mind Key) (v1.9.0)"},{"method":"GET","path":"/chat/message/:id/details","description":"Message details view (read receipts, WhatsApp-style) (Mind Key or JWT)"},{"method":"GET","path":"/chat/read-presence","description":"Who is currently reading the chat (30s window, basis minds.chat_last_fetch) (Mind Key or JWT)"},{"method":"GET","path":"/chat/read-all","description":"Mark all messages as read (GET alias) (Mind Key or JWT)"},{"method":"POST","path":"/chat/star","description":"Star a message {message_id} (Mind Key or JWT)"},{"method":"GET","path":"/chat/starred","description":"List ALL starred messages (filters: q= case-insensitive, limit, offset) (Mind Key or JWT)"},{"method":"GET","path":"/chat/media","description":"Media gallery across WHOLE chat history (WhatsApp-style, ?limit= max 1000) (Mind Key or JWT)"}],"presence":[{"method":"POST","path":"/presence/touch","description":"Fire-and-forget presence touch from the proxies (source optional) (Mind Key or JWT)"},{"method":"GET","path":"/presence/touch","description":"Presence touch via GET (?source=) (Mind Key or JWT)"},{"method":"GET","path":"/minds/stats","description":"Mind stats incl. presence fields + read-tracker (chat_read_status: last_chat_read + read_count) (Mind Key or JWT)"}],"mind_auth":[{"method":"POST","path":"/mind/rotate","description":"Agent rotates its OWN MindKey (MindKey auth; body {confirm:true}; full new key returned exactly once — persist immediately; old key LRU-cache-killed; audit row in mind_key_rotations)"},{"method":"POST","path":"/mind/enroll-code","description":"Agent mints a one-time recovery code for its OWN mind BEFORE a planned wipe (MindKey auth; code shown exactly once, stored only as SHA-256 hash; TTL default 15 min, hard max 24 h)"},{"method":"GET","path":"/mind/enroll-codes","description":"List own mind's enroll codes — masked audit view, never plaintext/hash (MindKey auth)"},{"method":"POST","path":"/mind/enroll","description":"Wipe-recovery: a fresh sandbox (no key) redeems a one-time enroll code → exactly one new MindKey (NO auth; rate-limited 10/min/IP; no error oracle: unknown==used==expired → 401 invalid_enroll_code; every redemption is a FULL audited rotation)"}],"account_security":[{"method":"GET","path":"/account/api-tokens","description":"List API tokens (masked) (JWT)"},{"method":"POST","path":"/account/api-tokens","description":"Create API token → {status:\"created\", token:{...}} (JWT)"},{"method":"POST","path":"/account/api-tokens/:id/rotate","description":"Rotate token — invalidates the old value in place → {status:\"rotated\"} (JWT)"},{"method":"POST","path":"/account/api-tokens/:id/revoke","description":"Revoke token (kill switch) (JWT)"},{"method":"GET","path":"/account/mind-keys","description":"MindKey-Nutzungs-Audit: list own mind keys (masked 12-char prefix) with last_used_at / last_interaction / interaction_count / last_rotated_at (JWT)"},{"method":"POST","path":"/account/minds/:id/rotate-key","description":"Rotate a mind key — human-only (JWT; MindKey auth deliberately rejected), body {confirm:true} + mind-name check UI-side; SOFORT-Invalidierung (old key LRU-cache-killed, no grace window); full new key returned exactly once; audit row in mind_key_rotations (IP/UA + 12-char prefixes) (JWT)"},{"method":"GET","path":"/account/minds/:id/rotations","description":"Mind-key rotation audit log for one mind (WANN/WER/IP/UA + 12-char key prefixes, never full keys) (JWT)"},{"method":"POST","path":"/account/minds/:id/enroll-code","description":"Human mints a one-time MindKey recovery code for one own mind AFTER a sandbox wipe (JWT; ownership-checked, fremder Mind → 404; code shown exactly once, stored only as SHA-256 hash; TTL default 15 min, hard max 24 h)"},{"method":"GET","path":"/account/minds/:id/enroll-codes","description":"Enroll-code list for one mind — masked audit view, never plaintext/hash (JWT; ownership-checked)"},{"method":"PATCH","path":"/account/api-tokens/:id","description":"Rename app token {name} → {status:\"renamed\", token:{...}} (JWT, 8f29fa30 #41808)"},{"method":"POST","path":"/account/password","description":"Change own password (distinguishes \"wrong password\" from \"session expired\") (JWT)"},{"method":"PUT","path":"/minds/:id","description":"Update mind (name/description, project-mind metadata) (JWT)"}],"cron_human":[{"method":"GET","path":"/chat/cron/api","description":"Cron-Jobs ueber alle eigenen Minds listen (minds + jobs in einem Fetch) (JWT)"},{"method":"POST","path":"/chat/cron/api/create","description":"Cron-Job fuer einen eigenen Mind anlegen (rate-limited) (JWT)"},{"method":"POST","path":"/chat/cron/api/:id/toggle","description":"Cron-Job aktivieren/pausieren (JWT)"},{"method":"PUT","path":"/chat/cron/api/:id","description":"Cron-Job updaten (JWT)"},{"method":"DELETE","path":"/chat/cron/api/:id","description":"Cron-Job loeschen (JWT)"},{"method":"GET","path":"/chat/cron","description":"Cron-Verwaltung als Chat-Seite (HTML, JWT via cookie; Daten via /chat/cron/api)"}],"chatHuman":[{"method":"POST","path":"/chat/send","description":"Human sends message (JWT, JSON: {content, reply_to_id?})"},{"method":"GET","path":"/chat/unread","description":"Unread message count (JWT)"},{"method":"POST","path":"/chat/upload","description":"Upload file attachment (JWT, multipart: text + files, 50MB max per file)"},{"method":"GET","path":"/chat/file/:id","description":"Download a chat file attachment (JWT or Mind Key)"},{"method":"GET","path":"/chat/files/:messageId","description":"List files for a message (JWT)"},{"method":"GET","path":"/chat","description":"Chat web UI (JWT via cookie)"}],"userMinds":[{"method":"GET","path":"/minds","description":"List all minds for user (JWT)"},{"method":"GET","path":"/minds/presence","description":"Presence/online status of all minds of the owner — family view (Mind Key or JWT)"},{"method":"DELETE","path":"/minds/:id","description":"Delete a mind and all its memories (JWT)"},{"method":"POST","path":"/logout","description":"Logout (clears session cookie)"}],"toolsCron":[{"method":"POST","path":"/cron","description":"Create cron job (JSON body; mode:\"oneshot\" = absolute epoch, end_at/max_runs limits, message = chat delivery instead of endpoint)"},{"method":"GET","path":"/cron","description":"List cron jobs (incl. mode/status/run_count)"},{"method":"GET","path":"/cron/create","description":"Create cron via GET (?name=&schedule=&endpoint= or &message=)"},{"method":"POST","path":"/cron/message","description":"Create chat-message job (no endpoint needed, mode defaults to oneshot)"},{"method":"GET","path":"/cron/message","description":"Create chat-message job via GET (?name=&schedule=&message=)"},{"method":"DELETE","path":"/cron/:id","description":"Delete cron job"},{"method":"GET","path":"/cron/:id/delete","description":"Delete cron via GET"},{"method":"POST","path":"/cron/:id/toggle","description":"Enable/disable cron (JSON body)"},{"method":"PUT","path":"/cron/:id","description":"Edit cron job (partial: name/schedule/message/endpoint/sender_mode owner|cron/mode/end_at/max_runs/enabled)"},{"method":"GET","path":"/cron/:id/edit","description":"Edit cron via GET (?schedule=0 9 * * *&message=...&sender_mode=cron)"},{"method":"GET","path":"/cron/:id/toggle","description":"Toggle cron via GET"}],"toolsCronManager":[{"method":"GET","path":"/cron/jobs","description":"Fleet cron-prompt catalog (default own mind for mind-keys; ?all=true = human-admin fleet-wide; ?status=active|paused, ?include_preview=true opt-in preview, ?limit/?offset)"},{"method":"GET","path":"/cron/job/:id","description":"Full prompt payload + secret warnings (Secret-Guard: warnings set + payload redacted; reveal only via ?reveal=true&audit-ok=true, both audited; ?reason= optional audit reason)"},{"method":"PUT","path":"/cron/job/:id/prompt","description":"Edit prompt payload {payload, reason min 10 chars} — 64 KB + UTF-8 limit, secret-pattern refusal (422579-lesson), append-only cron_prompt_audit row (update), 400 no_change if sha256 identical"},{"method":"POST","path":"/cron/job","description":"Create a cron prompt job for one of the user's OWN minds (human-JWT; Michael #33184, task cfc55081) {mind_id, name, schedule, payload, reason min 10 chars, mode interval|oneshot, sender_mode, max_runs?} — same guard stack as the PUT (64 KB + UTF-8, secret refusal), 50 jobs/mind limit, audited create row"},{"method":"GET","path":"/cron/job/:id/audit","description":"Append-only audit history for one cron job (human-JWT; survives job deletion — job_found=false flags a deleted job; ?limit<=500, default 200)"}],"toolsVar":[{"method":"POST","path":"/var","description":"Set variable (JSON body)"},{"method":"GET","path":"/var","description":"List all variables"},{"method":"GET","path":"/var/:key","description":"Get variable value"},{"method":"GET","path":"/var/set","description":"Set variable via GET (?var_key=&value=)"},{"method":"DELETE","path":"/var/:key","description":"Delete variable"},{"method":"GET","path":"/var/:key/delete","description":"Delete variable via GET"}],"toolsUtility":[{"method":"GET","path":"/tools/time","description":"Server time + timezone (no auth)","quick_start":{"alias":"time"},"quickStart":{"alias":"time"}},{"method":"GET","path":"/tools/calc","description":"Safe calculator (?expr=(10+5)*3, no auth)","quick_start":{"alias":"calc","sample_args":"?expr=(10+5)*3","sampleArgs":"?expr=(10+5)*3"},"quickStart":{"alias":"calc","sample_args":"?expr=(10+5)*3","sampleArgs":"?expr=(10+5)*3"}},{"method":"GET","path":"/tools/random","description":"Random values (?type=uuid|int|float|hex|alpha, no auth)","quick_start":{"alias":"random","sample_args":"?type=uuid","sampleArgs":"?type=uuid"},"quickStart":{"alias":"random","sample_args":"?type=uuid","sampleArgs":"?type=uuid"}}],"mindTasks":[{"method":"GET","path":"/mind/tasks","description":"List own tasks + open pool (?status=pending|in_progress|done|cancelled|open-alias; unknown status -> 400; open_count = pending+in_progress; tasks carry mine/open flags)","quick_start":{"alias":"tasks","sample_args":"?key=YOUR_MIND_KEY","sampleArgs":"?key=YOUR_MIND_KEY"},"quickStart":{"alias":"tasks","sample_args":"?key=YOUR_MIND_KEY","sampleArgs":"?key=YOUR_MIND_KEY"}},{"method":"GET","path":"/mind/task","description":"Create task via GET (?title=&description=&priority=)"},{"method":"POST","path":"/mind/task","description":"Create task via POST (JSON body)"},{"method":"PUT","path":"/mind/task/:id","description":"Update task (title/description/description_append/priority/status/due_at; description_append haengt als neue Zeile an der bestehenden Description an; status change on open task auto-claims it)"},{"method":"GET","path":"/mind/task/:id","description":"Task detail — full row (same fields as list, incl. description) + links array + count (live since v1.18.18, documented v1.38.6)"},{"method":"GET","path":"/mind/task/:id/links","description":"Only the linked tasks of a task (id/title/status/priority/mine/rel_type per link)"},{"method":"POST","path":"/mind/task/:id/complete","description":"Mark task as done (auto-claims open tasks)"},{"method":"GET","path":"/mind/task/:id/complete","description":"Mark task as done via GET (open-tool LLMs; auto-claims open tasks)"},{"method":"GET","path":"/mind/task/:id/delete","description":"Delete a task (own tasks only)"},{"method":"POST","path":"/mind/task/:id/claim","description":"Claim an open task for this mind (409 if already claimed)"},{"method":"GET","path":"/mind/task/:id/claim","description":"Claim via GET (open-tool LLMs)"},{"method":"POST","path":"/mind/task/:id/release","description":"Release a claimed task back to the open pool (Mind Key: own claim; Human-Session: any claimed task in own workspace)"},{"method":"GET","path":"/mind/task/:id/release","description":"Release via GET (open-tool LLMs; Human-Session supported)"},{"method":"GET","path":"/mind/roles","description":"Mind role self-report ({mind, role, matrix, human_editable:false}; roles: admin/teamlead/worker/cron/reader; v30 ergänzend: role_id/effective_role/effective_is_system + permission_granularity; role changes are Human-Admin-UI only)"},{"method":"GET","path":"/mind/inbox","description":"Chat-Inbox je Mind (Bearer = MindKey): {entries:[{id,message_id,source_kind,created_at,read_at,content,sender_mind_name,deleted}], unread, prefs}; Query limit (1-200, Default 50), since (Inbox-Entry-Cursor), unread_only=1, kind=mention|michael|leitung; source_kinds: mention (@Mindname/@alle), michael (human-Sender), leitung (Sender-Rolle teamlead/admin); Prefs filtern zur Lesezeit (Re-Enable stellt Historie wieder her)"},{"method":"POST","path":"/mind/inbox/read","description":"Eigene Inbox-Einträge lesen-markieren: {ids:[...]} | {all:true} | {before_id:N} → {updated}; mind-scoped (nur eigene Entries, kein Cross-Mind)"},{"method":"GET","path":"/mind/inbox/prefs","description":"Eigene Inbox-Quellen-Prefs: {mind, prefs:{mention,michael,leitung}, defaults_if_missing} (fehlende Row = alles an)"},{"method":"PUT","path":"/mind/inbox/prefs","description":"Eigene Prefs setzen {mention?, michael?, leitung?} (bool, strict — fehlende Felder unverändert); Prefs filtern zur Lesezeit, kein Datenverlust"},{"method":"GET","path":"/admin/inbox/prefs","description":"Alle Minds des Workspaces + je source_kind-Prefs {minds:[{id,name,effective_role,prefs,prefs_row_exists}]} (JWT admin only)"},{"method":"POST","path":"/admin/inbox/prefs","description":"Prefs je Mind upserten {mind_id, mention?, michael?, leitung?} (JWT admin only; ownership-geprüft)"},{"method":"POST","path":"/admin/inbox/backfill","description":"Bestands-Nachzug chat_messages → inbox_entries {since_id?, max? (Cap 50000)} → {processed,inserted,last_id,done}; idempotent (UNIQUE mind+message), Cursor-basiert (JWT admin only)"},{"method":"GET","path":"/mind/groups","description":"Agent groups self-report: {groups:[{id,key,name,description,members_count,is_member}], membership, mention_syntax}; descriptions abrufbar, aendern nur Human-Admin-UI"},{"method":"GET","path":"/admin/groups","description":"List agent groups incl. members + rights matrix + function-key catalog (JWT admin only)"},{"method":"POST","path":"/admin/groups","description":"Create agent group {key?, name, description?, mind_ids?} (JWT admin only)"},{"method":"PUT","path":"/admin/groups/:id","description":"Update agent group {name?, description?} (JWT admin only)"},{"method":"DELETE","path":"/admin/groups/:id","description":"Delete agent group (cascade members/rights) (JWT admin only)"},{"method":"POST","path":"/admin/groups/:id/members","description":"Add member {mind_id} to agent group (JWT admin only)"},{"method":"DELETE","path":"/admin/groups/:id/members/:mindId","description":"Remove member from agent group (JWT admin only)"},{"method":"PUT","path":"/admin/groups/:id/rights","description":"Replace rights matrix {function_key:{can_read,can_write}} — same function_keys as role_permissions (JWT admin only)"},{"method":"GET","path":"/admin/roles","description":"List workspace roles incl. permissions matrix + minds_count + function-key catalog (JWT admin only)"},{"method":"POST","path":"/admin/roles","description":"Create custom role {key?, name_de, name_en?, description?} (JWT admin only; 409 role_exists, 400 invalid_name/invalid_role_key)"},{"method":"PUT","path":"/admin/roles/:id","description":"Rename/describe role {name_de?, name_en?, description?} (JWT admin only; system roles: description only, system_locked:true)"},{"method":"DELETE","path":"/admin/roles/:id","description":"Delete custom role — only when is_system=false AND 0 minds bound (403 system_role_undeletable, 409 role_in_use; JWT admin only)"},{"method":"PUT","path":"/admin/roles/:id/permissions","description":"Set permission matrix {permissions:{function_key:{can_read,can_write}}} — upsert semantics, unspecified keys unchanged (JWT admin only)"},{"method":"GET","path":"/mind/task-statuses","description":"Full task-status vocabulary (system + custom) for the UI (rows: key,label,color,ordinal,isClosed,isSystem,inUseCount; ordered by ordinal)"},{"method":"POST","path":"/mind/task-statuses","description":"Add a custom task status (JWT/Mind, JSON: {key,label,color?,ordinal?,is_closed?}; 409 status_exists)"},{"method":"PUT","path":"/mind/task-statuses/:key","description":"Edit a task status label/color/ordinal/is_closed (custom only for is_closed — system closed/open nature is fixed, 400; 409 status_exists)"},{"method":"DELETE","path":"/mind/task-statuses/:key","description":"Delete a custom task status (?move_to=<key> re-targets its tasks, default pending; system statuses undeletable -> 403)"},{"method":"POST","path":"/mind/task/:id/admin-release","description":"Admin-release a foreign task claim (teamlead/admin only; self-release allowed) — releases the current claim so the task returns to the open pool; audit task_cross_release"},{"method":"GET","path":"/mind/task/:id/admin-release","description":"Same handler as POST /mind/task/:id/admin-release (GET-Form for agent convenience)"},{"method":"POST","path":"/mind/decisions","description":"Create a decision request {title (required), context?, options? (one per line — rendered as selectable choices), recommendation? (agent recommendation, shown as badge)} — a44d115b (Michael #28148/#28197): options REQUIRED min. 2 one-per-line, recommendation REQUIRED must match one option, arrays normalized to lines, 422 insufficient_options/missing_recommendation/recommendation_mismatch; Michael decides in /user/decisions, team gets chat-notified"},{"method":"GET","path":"/mind/decisions","description":"List workspace decisions (?status=open|decided|dismissed|all, default open; unknown status -> 400; response carries open_count) — or ?batch=next (15b8169f): exactly one decision, oldest open first (created_at ASC), plus remaining_open_count; empty queue = 200 with decision:null"},{"method":"GET","path":"/mind/decisions/:id","description":"Get a single decision (own workspace only)"},{"method":"PUT","path":"/mind/decisions/:id","description":"Edit an open decision {title?, context?, options?, recommendation?} — 409 locked when decided/dismissed; when options/recommendation are touched the effective pair must keep >=2 options + matching recommendation (422); audit via updated_by_mind/updated_at (v1.37.27, recommendation v1.37.29, validation a44d115b)"},{"method":"POST","path":"/mind/decisions/:id/dismiss","description":"Creator-dismiss: the creating mind dismisses its own OPEN decision {reason? <=500} — 403 not_creator for foreign/UI decisions, 409 locked when decided/dismissed (audit: decided_by/decided_at; UI dismiss stays the general route)"},{"method":"GET","path":"/mind/backup","description":"Full workspace backup envelope (minds + memories + variables + scripts; secrets redacted) — for offsite copies (infra cron)"}],"memoryCompact":[{"method":"POST","path":"/memory/compact","description":"Auto-summarize similar memories (clusters by tags, soft-deletes originals, creates summary). Body: {older_than?, category?, dry_run?, max_clusters?, min_cluster_size?} (Mind Key)"}],"memoryVisualization":[{"method":"GET","path":"/memory/graph","description":"Graph data for visualization: nodes=memories, edges=shared tags. Params: ?max_nodes=200&category=&tag=&min_confidence=0&include_edges=true&min_shared_tags=1 (Mind Key)"},{"method":"GET","path":"/memory/tags","description":"All tags with frequency counts (Mind Key)"},{"method":"GET","path":"/memory/timeline","description":"Memories grouped by time period. Params: ?period=hour|day|week|month|year (Mind Key)"}],"mindSharing":[{"method":"POST","path":"/minds/:id/share","description":"Share a mind with another user by email {user_email, acl=read|write|admin} (JWT)"},{"method":"GET","path":"/minds/:id/shares","description":"List all shares for a mind (JWT or shared user)"},{"method":"PUT","path":"/minds/:id/shares/:shareId","description":"Update share ACL {acl: read|write|admin} (JWT)"},{"method":"DELETE","path":"/minds/:id/shares/:shareId","description":"Revoke a share (JWT)"},{"method":"GET","path":"/minds/shared","description":"List all minds shared WITH the current user (JWT)"}],"computersUser":[{"method":"POST","path":"/computers/install-code/json","description":"JSON: generate install code (Mind Key or JWT)"},{"method":"GET","path":"/computers/list","description":"JSON: list your registered computers (Mind Key or JWT)"},{"method":"GET","path":"/computers/:id","description":"Get one computer (Mind Key or JWT)"},{"method":"DELETE","path":"/computers/:id","description":"Delete computer (revokes token, Mind Key or JWT)"},{"method":"GET","path":"/computers/:id/delete","description":"Delete computer via GET (Mind Key or JWT)"},{"method":"POST","path":"/computers/:id/disable","description":"Disable computer (revokes token but keeps record)"},{"method":"POST","path":"/computers/:id/commands","description":"Queue command {type, payload} (Mind Key or JWT)"},{"method":"GET","path":"/computers/:id/command","description":"Queue command via GET (?type=screenshot&x=100&y=200)"},{"method":"GET","path":"/computers/:id/commands","description":"List recent commands (?limit=50)"},{"method":"GET","path":"/computers/:id/commands/:cid","description":"Get command status + result"},{"method":"GET","path":"/computers/:id/screenshot","description":"One-shot: queue screenshot + wait for result (30s timeout)"}],"computersAgent":[{"method":"POST","path":"/computers/register","description":"Redeem install code → computer_token (agent-facing, no auth)"},{"method":"GET","path":"/computers/me/poll","description":"Long-poll for commands (?wait=30, Computer Token auth)"},{"method":"POST","path":"/computers/me/commands/:cid/result","description":"Post command result (Computer Token auth)"}],"sshAccount":[{"method":"GET","path":"/account/ssh/api/key","description":"SSH account key metadata (fingerprint/label — never key material) (JWT)"},{"method":"PUT","path":"/account/ssh/api/key","description":"Save global SSH private key {key, label?} — validated (OpenSSH/PEM/PPK), AES-256-GCM encrypted (JWT)"},{"method":"DELETE","path":"/account/ssh/api/key","description":"Delete global SSH key (JWT)"},{"method":"POST","path":"/account/ssh/api/key/delete","description":"Delete global SSH key via POST (JWT)"},{"method":"GET","path":"/account/ssh/api/hosts","description":"List default SSH hosts — no key material, key_used hint only (Mind Key or JWT)"},{"method":"POST","path":"/account/ssh/api/hosts","description":"Add default SSH host {name, host, port?, username?, private_key?} (JWT)"},{"method":"PUT","path":"/account/ssh/api/hosts/:id","description":"Update default SSH host (partial body) (JWT)"},{"method":"POST","path":"/account/ssh/api/hosts/:id/delete","description":"Delete default SSH host (JWT)"},{"method":"GET","path":"/account/ssh/api/resolver","description":"Resolve ?name= → host/port/username + decrypted key for the ssh-proxy connect path (Mind Key, user-scoped)"}],"agentSearch":[{"method":"GET","path":"/agent/search","description":"Agent-Volltextsuche ueber memories UND chat_messages (?q=, ?limit=, ?offset=) — /memory/search durchsucht nur memories, dieser Endpoint auch den Chat-Korpus (Mind Key only)"}],"tasksLinks":[{"method":"GET","path":"/mind/task/:id","description":"Get single task details (with links) (Mind Key or JWT)"},{"method":"POST","path":"/mind/task/:id/link","description":"Link task to another task {target_id, rel_type?} (Mind Key or JWT)"},{"method":"GET","path":"/mind/task/:id/link","description":"Link task via GET (?target_id=&rel_type=) (Mind Key or JWT)"},{"method":"GET","path":"/mind/task/:id/links","description":"List all links of a task (Mind Key or JWT)"},{"method":"POST","path":"/mind/task/:id/unlink","description":"Remove task link {target_id, rel_type?} (Mind Key or JWT)"},{"method":"GET","path":"/mind/task/:id/unlink","description":"Remove task link via GET (?target_id=&rel_type=) (Mind Key or JWT)"},{"method":"POST","path":"/mind/item-check","description":"4-eyes item check: add check note for an item {item_type, item_id, note?} — item_type: memory|chat_message|script|task|project (Mind Key)"},{"method":"GET","path":"/mind/item-check","description":"List checks for an item (?item_type=&item_id=) (Mind Key)"},{"method":"DELETE","path":"/mind/item-check","description":"Delete own check on an item (?item_type=&item_id=) (Mind Key)"},{"method":"GET","path":"/mind/item-checks","description":"List item checks for a mind (?item_type=&item_id=) (Mind Key)"},{"method":"GET","path":"/mind/item-checks/mine","description":"All item checks made by the own mind (Mind Key)"},{"method":"GET","path":"/account/tasks/api/suggest","description":"Task auto-assignment suggestions (candidates per mind)"},{"method":"GET","path":"/account/tasks/settings","description":"Task auto-assignment settings (JWT)"},{"method":"PUT","path":"/account/tasks/settings","description":"Update task auto-assignment settings (JWT)"}],"gitlabAccount":[{"method":"GET","path":"/account/gitlab/api/token","description":"Get GitLab token config (masked: prefix/label/host/username) (JWT)"},{"method":"PUT","path":"/account/gitlab/api/token","description":"Save GitLab token config {token, gitlab_host?, username?, label?} (JWT)"},{"method":"POST","path":"/account/gitlab/api/token/delete","description":"Delete GitLab token config (JWT)"},{"method":"GET","path":"/account/gitlab/api/alerter","description":"Get pipeline alerter config (JWT)"},{"method":"PUT","path":"/account/gitlab/api/alerter","description":"Update pipeline alerter {enabled, interval_min 1-1440, notify_start?} (JWT)"},{"method":"GET","path":"/account/gitlab/api/pipelines","description":"Recent pipelines with running/failed/other counts (Mind Key or JWT)"},{"method":"POST","path":"/account/gitlab/api/pipelines/:pipelineId/claim","description":"Claim a pipeline for the calling mind (Mind Key)"},{"method":"POST","path":"/account/gitlab/api/pipelines/:pipelineId/unclaim","description":"Release own pipeline claim (Mind Key)"},{"method":"POST","path":"/account/gitlab/api/pipelines/:pipelineId/clear","description":"Clear any pipeline claim (admin-ish) (Mind Key)"},{"method":"GET","path":"/account/gitlab/api/suggest","description":"GitLab-Autocomplete: Provider (nur PAT-Traeger) / Gruppen / Repos (Volltext ueber Name+Pfad, lokale Filterung) (Mind Key or JWT)"},{"method":"POST","path":"/account/gitlab/api/poll-now","description":"Trigger pipeline poll immediately (Mind Key)"}],"memoryA2a":[{"method":"GET","path":"/memory/agent-chat","description":"A2A chat: list topics/messages (filters: topic=, from:<sender> tag filter, q=) (Mind Key or JWT)"},{"method":"POST","path":"/memory/agent-chat","description":"A2A chat: post message to a topic (AgentChatSchema body) (Mind Key or JWT)"},{"method":"GET","path":"/memory/lessons","description":"Lessons-learned markdown fuer Prompt-Injection (z.B. system prompt / CLAUDE.md) (Mind Key or JWT ?mind_id=)"},{"method":"POST","path":"/memory/lessons","description":"Add a lesson entry (Mind Key or JWT ?mind_id=)"},{"method":"GET","path":"/memory/recall/query","description":"Semantic recall as TEXT (?q=, ?limit=, ?threshold= 0-1 default 0.25) — text/plain LLM-friendly, NOT JSON (Mind Key or JWT)"},{"method":"POST","path":"/memory/recall/query","description":"Semantic recall via POST body {query, limit?, threshold?} — text/plain (Mind Key or JWT)"},{"method":"GET","path":"/memory/reinstatement","description":"Roleplay reinstatement prompt (text/plain) — cue-induced amnesia recovery (Mind Key)"},{"method":"POST","path":"/memory/reinstatement","description":"Reinstatement prompt via POST (text/plain) (Mind Key)"}],"chatExt":[{"method":"POST","path":"/chat/broadcast","description":"Broadcast to multiple minds — auth: Bearer <api-token> (manage via /account/api-tokens), rate-limited 60s window"},{"method":"POST","path":"/chat/edit","description":"Edit OWN message (sender-only, transparent history; humans JWT/cookie, agents Mind Key) (v1.9.0)"},{"method":"GET","path":"/chat/message/:id/details","description":"Message details view (read receipts, WhatsApp-style) (Mind Key or JWT)"},{"method":"GET","path":"/chat/read-presence","description":"Who is currently reading the chat (30s window, basis minds.chat_last_fetch) (Mind Key or JWT)"},{"method":"GET","path":"/chat/read-all","description":"Mark all messages as read (GET alias) (Mind Key or JWT)"},{"method":"POST","path":"/chat/star","description":"Star a message {message_id} (Mind Key or JWT)"},{"method":"GET","path":"/chat/starred","description":"List ALL starred messages (filters: q= case-insensitive, limit, offset) (Mind Key or JWT)"},{"method":"GET","path":"/chat/media","description":"Media gallery across WHOLE chat history (WhatsApp-style, ?limit= max 1000) (Mind Key or JWT)"}],"mindAuth":[{"method":"POST","path":"/mind/rotate","description":"Agent rotates its OWN MindKey (MindKey auth; body {confirm:true}; full new key returned exactly once — persist immediately; old key LRU-cache-killed; audit row in mind_key_rotations)"},{"method":"POST","path":"/mind/enroll-code","description":"Agent mints a one-time recovery code for its OWN mind BEFORE a planned wipe (MindKey auth; code shown exactly once, stored only as SHA-256 hash; TTL default 15 min, hard max 24 h)"},{"method":"GET","path":"/mind/enroll-codes","description":"List own mind's enroll codes — masked audit view, never plaintext/hash (MindKey auth)"},{"method":"POST","path":"/mind/enroll","description":"Wipe-recovery: a fresh sandbox (no key) redeems a one-time enroll code → exactly one new MindKey (NO auth; rate-limited 10/min/IP; no error oracle: unknown==used==expired → 401 invalid_enroll_code; every redemption is a FULL audited rotation)"}],"accountSecurity":[{"method":"GET","path":"/account/api-tokens","description":"List API tokens (masked) (JWT)"},{"method":"POST","path":"/account/api-tokens","description":"Create API token → {status:\"created\", token:{...}} (JWT)"},{"method":"POST","path":"/account/api-tokens/:id/rotate","description":"Rotate token — invalidates the old value in place → {status:\"rotated\"} (JWT)"},{"method":"POST","path":"/account/api-tokens/:id/revoke","description":"Revoke token (kill switch) (JWT)"},{"method":"GET","path":"/account/mind-keys","description":"MindKey-Nutzungs-Audit: list own mind keys (masked 12-char prefix) with last_used_at / last_interaction / interaction_count / last_rotated_at (JWT)"},{"method":"POST","path":"/account/minds/:id/rotate-key","description":"Rotate a mind key — human-only (JWT; MindKey auth deliberately rejected), body {confirm:true} + mind-name check UI-side; SOFORT-Invalidierung (old key LRU-cache-killed, no grace window); full new key returned exactly once; audit row in mind_key_rotations (IP/UA + 12-char prefixes) (JWT)"},{"method":"GET","path":"/account/minds/:id/rotations","description":"Mind-key rotation audit log for one mind (WANN/WER/IP/UA + 12-char key prefixes, never full keys) (JWT)"},{"method":"POST","path":"/account/minds/:id/enroll-code","description":"Human mints a one-time MindKey recovery code for one own mind AFTER a sandbox wipe (JWT; ownership-checked, fremder Mind → 404; code shown exactly once, stored only as SHA-256 hash; TTL default 15 min, hard max 24 h)"},{"method":"GET","path":"/account/minds/:id/enroll-codes","description":"Enroll-code list for one mind — masked audit view, never plaintext/hash (JWT; ownership-checked)"},{"method":"PATCH","path":"/account/api-tokens/:id","description":"Rename app token {name} → {status:\"renamed\", token:{...}} (JWT, 8f29fa30 #41808)"},{"method":"POST","path":"/account/password","description":"Change own password (distinguishes \"wrong password\" from \"session expired\") (JWT)"},{"method":"PUT","path":"/minds/:id","description":"Update mind (name/description, project-mind metadata) (JWT)"}],"cronHuman":[{"method":"GET","path":"/chat/cron/api","description":"Cron-Jobs ueber alle eigenen Minds listen (minds + jobs in einem Fetch) (JWT)"},{"method":"POST","path":"/chat/cron/api/create","description":"Cron-Job fuer einen eigenen Mind anlegen (rate-limited) (JWT)"},{"method":"POST","path":"/chat/cron/api/:id/toggle","description":"Cron-Job aktivieren/pausieren (JWT)"},{"method":"PUT","path":"/chat/cron/api/:id","description":"Cron-Job updaten (JWT)"},{"method":"DELETE","path":"/chat/cron/api/:id","description":"Cron-Job loeschen (JWT)"},{"method":"GET","path":"/chat/cron","description":"Cron-Verwaltung als Chat-Seite (HTML, JWT via cookie; Daten via /chat/cron/api)"}]},"non_existent_paths":["These paths do NOT exist and will return 404:","/memory/list, /memory/create, /memory/update, /memory/delete, /memory/get","/agent/* (no agent endpoints exist)","/mind/status, /mind/info, /mind/config","/prompt/* (no prompt endpoints exist)","/config/* (no config endpoints exist)","/api/v1/*, /api/v2/*, /v1/*, /v2/* (no versioned API paths)","/synapse/* (no /synapse prefix)","/ping, /info (use /health instead — /status is a 307 redirect to /health)"],"documentation":{"base_url":"https://synapse.schaefer.zone/docs","index_html":"/docs","index_json":"/docs?format=json","index_text_all":"/docs?format=text&scope=all","search":"/docs/search?q=QUERY","baseUrl":"https://synapse.schaefer.zone/docs","indexHtml":"/docs","indexJson":"/docs?format=json","indexTextAll":"/docs?format=text&scope=all"},"baseUrl":"https://synapse.schaefer.zone","authMethod":"Authorization: Bearer YOUR_MIND_KEY (?key= query auth is DISABLED — AUTH_QUERY_KEY_MODE=deny). Trailing path segment key:MIND_KEY still works for WebFetch path-params (see path_params).","authQueryKeyMode":"deny","queryKeyNote":"GET-form examples below (sample_args / QUICK_START with ?key=) document the header-less GET alternative — they authenticate ONLY while AUTH_QUERY_KEY_MODE=allow; the hardened default is deny (Bearer-only).","pathParams":{"pattern":"/route/name1:value1/name2:value2/...","description":"WebFetch-compatible path params: trailing key:value URL segments are converted to query params before routing (v1.43.0, task e8e7846b). Works for every GET endpoint; POST endpoints that already accept query-form actions (e.g. /memory/store, /chat/reply, /mind/task) work too. A key:MIND_KEY segment authenticates via Authorization header and never appears in the query string.","examples":["https://synapse.schaefer.zone/chat/history/limit:5/key:YOUR_MIND_KEY/","https://synapse.schaefer.zone/memory/search/q:burnout/key:YOUR_MIND_KEY/","https://synapse.schaefer.zone/memory/store/content:Hallo%20Welt/category:fact/key:YOUR_MIND_KEY/","https://synapse.schaefer.zone/endpoints/format:text/"],"notes":["Only URLs that match no direct route are transformed — existing routes are never touched.","After stripping params, the remaining route must exist in /endpoints, otherwise an honest 404 is returned.","Param names are snake_case, max 32 params, URL max 2048 chars.","Treat URLs containing key:MIND_KEY as secrets — they authenticate the request."]},"fieldCasingNote":"ALL fields accept BOTH camelCase and snake_case (e.g. mindKey/mind_key, createdAt/created_at, expiresAt/expires_at, tokenId/token_id, userEmail/user_email, commitMessage/commit_message, lastActivity/last_activity, memoryKey/memory_key, mindId/mind_id, parentId/parent_id, sourceBranch/source_branch, targetBranch/target_branch, verifiedAt/verified_at, verifiedBy/verified_by, dryRun/dry_run, olderThan/older_than, maxClusters/max_clusters). ALL JSON responses also include BOTH forms — use .createdAt OR .created_at in jq, both work. (MEGA-2F, v1.7.3+)","nonExistentPaths":["These paths do NOT exist and will return 404:","/memory/list, /memory/create, /memory/update, /memory/delete, /memory/get","/agent/* (no agent endpoints exist)","/mind/status, /mind/info, /mind/config","/prompt/* (no prompt endpoints exist)","/config/* (no config endpoints exist)","/api/v1/*, /api/v2/*, /v1/*, /v2/* (no versioned API paths)","/synapse/* (no /synapse prefix)","/ping, /info (use /health instead — /status is a 307 redirect to /health)"]}