{"openapi":"3.0.3","info":{"title":"marginalia public API","version":"0.1.0","description":"Public read + chat API for marginalia (https://marginalia.polycode.co.uk). No auth today; the API is public. Generated from route-descriptors.mjs.","license":{"name":"AGPL-3.0-only"}},"servers":[{"url":"https://marginalia.polycode.co.uk","description":"production"},{"url":"https://ci-{slug}.marginalia.polycode.co.uk","description":"CI branch","variables":{"slug":{"default":"main"}}}],"paths":{"/api/graphs/default":{"get":{"operationId":"getDefaultGraph","summary":"Resolve the current default graph id.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/graphs":{"get":{"operationId":"listGraphs","summary":"List memory graphs (past + current). `?all=1` bypasses the margin cap.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}},"parameters":[{"name":"all","in":"query","required":false,"schema":{"type":"string"}}]}},"/api/status":{"get":{"operationId":"getStatus","summary":"Deployment status: caps, default graph, bedrock_enabled, mode, wssUrl, version.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/usage":{"get":{"operationId":"getUsage","summary":"Bedrock usage drill-down for a scope.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}},"parameters":[{"name":"scope","in":"query","required":false,"schema":{"type":"string"}},{"name":"scopeId","in":"query","required":false,"schema":{"type":"string"}}]}},"/api/usage/all":{"get":{"operationId":"getUsageAll","summary":"Every LLM call or web search in a calendar month.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}},"parameters":[{"name":"kind","in":"query","required":false,"schema":{"type":"string"}},{"name":"month","in":"query","required":false,"schema":{"type":"string"}}]}},"/api/budget":{"get":{"operationId":"getBudget","summary":"Today + month-to-date spend vs caps, plus Tavily credits.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}},"parameters":[{"name":"graphId","in":"query","required":false,"schema":{"type":"string"}},{"name":"sessionUuid","in":"query","required":false,"schema":{"type":"string"}}]}},"/api/graph/{graphId}/activity":{"get":{"operationId":"getActivity","summary":"Recent synth turns for a graph.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}},"parameters":[{"name":"graphId","in":"path","required":true,"schema":{"type":"string"}}]}},"/api/graph/{graphId}/session/{sessionUuid}/history":{"get":{"operationId":"getSessionHistory","summary":"Turn history for a session.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}},"parameters":[{"name":"graphId","in":"path","required":true,"schema":{"type":"string"}},{"name":"sessionUuid","in":"path","required":true,"schema":{"type":"string"}}]}},"/api/graph/{graphId}/session/{sessionUuid}/meta":{"get":{"operationId":"getSessionMeta","summary":"Session meta (introduction, searchability).","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}},"parameters":[{"name":"graphId","in":"path","required":true,"schema":{"type":"string"}},{"name":"sessionUuid","in":"path","required":true,"schema":{"type":"string"}}]}},"/api/graph/{graphId}/insights":{"get":{"operationId":"getInsights","summary":"Latest hourly insights for a graph.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}},"parameters":[{"name":"graphId","in":"path","required":true,"schema":{"type":"string"}}]}},"/api/graph/{graphId}/turn/{turnId}":{"get":{"operationId":"getTurn","summary":"A single turn by id.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}},"parameters":[{"name":"graphId","in":"path","required":true,"schema":{"type":"string"}},{"name":"turnId","in":"path","required":true,"schema":{"type":"string"}}]}},"/api/sessions":{"get":{"operationId":"getSessionsSearch","summary":"Full-text search across session introductions.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}},"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"string"}}]}},"/api/visitor/{visitorId}":{"get":{"operationId":"getVisitor","summary":"Pseudonymous visitor meta (label, creation time).","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}},"parameters":[{"name":"visitorId","in":"path","required":true,"schema":{"type":"string"}}]}},"/api/projects":{"get":{"operationId":"getProjects","summary":"List a graph's projects (default: the current graph).","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}},"parameters":[{"name":"graph","in":"query","required":false,"schema":{"type":"string"}}]}},"/api/projects/{projectId}":{"get":{"operationId":"getProjectDetail","summary":"Project detail: file map, log, suggestions.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}},"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}}]}},"/api/projects/{projectId}/file":{"get":{"operationId":"getProjectFile","summary":"Read a project file by relpath.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}},"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}},{"name":"relpath","in":"query","required":false,"schema":{"type":"string"}}]}},"/api/openapi.json":{"get":{"operationId":"getOpenapi","summary":"This OpenAPI document.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/chat":{"post":{"operationId":"postChat","summary":"Synchronous one-turn chat (same path as the WSS handler).","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["userMessage"],"properties":{"graphId":{"type":"string","description":"Target graph id; omit for the default graph."},"sessionUuid":{"type":"string"},"userMessage":{"type":"string"},"volatile":{"type":"boolean","default":false},"visitorId":{"type":"string","description":"Optional pseudonymous visitor id."}}}}}}}},"/api/flag":{"post":{"operationId":"postFlag","summary":"Flag a memory node for operator review.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"target":{"type":"string"},"reason":{"type":"string"},"note":{"type":"string"}}}}}}}},"/api/visitor/{visitorId}/label":{"post":{"operationId":"postVisitorLabel","summary":"Set a visitor's screened, unverified label.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request"}},"parameters":[{"name":"visitorId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["label"],"properties":{"label":{"type":"string"}}}}}}}},"/api/graph/{graphId}/session/{sessionUuid}/introduction":{"post":{"operationId":"postSessionIntroduction","summary":"Set a visitor's session introduction.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request"}},"parameters":[{"name":"graphId","in":"path","required":true,"schema":{"type":"string"}},{"name":"sessionUuid","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"introduction":{"type":"string"},"searchable":{"type":"boolean"}}}}}}}},"/api/graph/{graphId}/export":{"post":{"operationId":"postExport","summary":"Export a graph (stub).","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request"}},"parameters":[{"name":"graphId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}}}}