{"service":"Synapse Memory API","version":"1.29.4","base_url":"https://synapse.schaefer.zone","auth_method":"Authorization: Bearer YOUR_MIND_KEY OR ?key=YOUR_MIND_KEY","warning":"ONLY the endpoints listed below exist. All other paths return 404. Do NOT guess or invent paths.","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)"},{"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)"},{"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)"},{"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=)"},{"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 (?sort=date|size|name|type)"},{"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)"},{"method":"POST","path":"/chat/reply","description":"Reply to human (JSON body: {content})"},{"method":"GET","path":"/chat/reply","description":"Reply via GET (?content=reply+text)"},{"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=)"},{"method":"GET","path":"/chat/status","description":"Agent online status (Mind Key or JWT)"}],"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/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"}],"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":"POST","path":"/minds","description":"Create a new Mind → returns mind_key (JWT, JSON: {name, description?})"},{"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"}],"vars":[{"method":"GET","path":"/kv","description":"TYPED Key=Value Store: eigene Variablen listen (secrets maskiert: value=*** + has_secret). ?scope=mind|user optional (default = eigener Auth-Typ; Cross-Scope verboten)"},{"method":"GET","path":"/kv/:key","description":"Variable lesen (typed-parsed: int->Number, bool->true/false, list/json->Array/Object) — secrets nur hier im Klartext (owner-only)"},{"method":"POST","path":"/kv","description":"Variable anlegen {key, value, type, scope?} — type: int|string|float|bool|url|list|json|secret (typed-validated); 409 bei existierendem key"},{"method":"PUT","path":"/kv/:key","description":"Variable updaten {value, type?} — type kann nachtraeglich gewechselt werden (revalidiert); 404 wenn fehlt"},{"method":"DELETE","path":"/kv/:key","description":"Variable loeschen — POST /kv/:key/delete als formless Twin"}],"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_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)"},{"method":"GET","path":"/tools/calc","description":"Safe calculator (?expr=(10+5)*3, no auth)"},{"method":"GET","path":"/tools/random","description":"Random values (?type=uuid|int|float|hex|alpha, no auth)"}],"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)"},{"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/priority/status/due_at; status change on open task auto-claims it)"},{"method":"GET","path":"/mind/task/:id/complete","description":"Mark task as done (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 my task back to the open pool"},{"method":"GET","path":"/mind/task/:id/release","description":"Release via GET (open-tool LLMs)"}],"scripts":[{"method":"POST","path":"/script","description":"Store/update script {name, content, description?, language?} (Mind Key or JWT)"},{"method":"GET","path":"/script/:name","description":"Fetch script content as text/plain (curl | bash ready, Mind Key or JWT)"},{"method":"GET","path":"/script/:name/info","description":"Script metadata without content (Mind Key or JWT)"},{"method":"GET","path":"/scripts","description":"List all scripts (JSON, Mind Key or JWT)"},{"method":"DELETE","path":"/script/:name","description":"Delete a script (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)"}],"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)"},{"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)"}],"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":"POST","path":"/minds","description":"Create a new Mind → returns mind_key (JWT, JSON: {name, description?})"},{"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"}],"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)"},{"method":"GET","path":"/tools/calc","description":"Safe calculator (?expr=(10+5)*3, no auth)"},{"method":"GET","path":"/tools/random","description":"Random values (?type=uuid|int|float|hex|alpha, no auth)"}],"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)"},{"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/priority/status/due_at; status change on open task auto-claims it)"},{"method":"GET","path":"/mind/task/:id/complete","description":"Mark task as done (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 my task back to the open pool"},{"method":"GET","path":"/mind/task/:id/release","description":"Release via GET (open-tool LLMs)"}],"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)"}]},"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 OR ?key=YOUR_MIND_KEY","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)"]}