{"openapi":"3.1.0","info":{"title":"be — Hungarian Legal AI","version":"0.1.0"},"paths":{"/pricing":{"get":{"summary":"Landing","description":"Public marketing landing page + pricing. The chat app lives at /app.","operationId":"landing_pricing_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/":{"get":{"summary":"Landing","description":"Public marketing landing page + pricing. The chat app lives at /app.","operationId":"landing__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/auth":{"get":{"summary":"Index","operationId":"index_auth_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/app/auth":{"get":{"summary":"Index","operationId":"index_app_auth_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/app":{"get":{"summary":"Index","operationId":"index_app_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/settings":{"get":{"summary":"Settings Page","description":"User settings — API keys CRUD + user templates CRUD + theme/provider\npreference. Static HTML that calls the existing endpoints.","operationId":"settings_page_settings_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/docs":{"get":{"summary":"Docs Page","description":"Developer documentation — REST API + Python SDK + JS/TS SDK + MCP\n+ x402 payment scheme. Single-file HTML with copy-paste examples for\nevery endpoint. Public — no auth required to read the docs.","operationId":"docs_page_docs_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/account":{"get":{"summary":"Account Page","description":"Account / profile page — shows email, plan/tier, quota, links to\nsettings, logout, and the GDPR delete-account flow. Static HTML\npowered by existing /api/auth/me and /api/auth/me/export endpoints.","operationId":"account_page_account_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin":{"get":{"summary":"Admin Page","description":"Tiny single-file admin dashboard. Reads /api/metrics (admin-only),\nrenders charts via chart.js (CDN). Same shell + theme as the main app\nso the cornered design + serif type carry through.","operationId":"admin_page_admin_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/audit":{"get":{"summary":"Admin Audit Page","description":"Admin-only audit log viewer — reads /api/admin/audit (admin-gated)\nand renders the redacted turn records as a scrollable table with\ninline expand.","operationId":"admin_audit_page_admin_audit_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/templates":{"get":{"summary":"Templates Browser Page","description":"Document templates browser — card grid with inline preview/copy/save.","operationId":"templates_browser_page_templates_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api/admin/audit":{"get":{"summary":"Admin Audit Endpoint","description":"List redacted audit rows for the admin viewer. Admin-only.","operationId":"admin_audit_endpoint_api_admin_audit_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}},{"name":"conversation_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conversation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Admin Audit Endpoint Api Admin Audit Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/c/{conv_id}":{"get":{"summary":"Index Conv","operationId":"index_conv_c__conv_id__get","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"string","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/app.js":{"get":{"summary":"App Js","operationId":"app_js_app_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/styles.css":{"get":{"summary":"Styles","operationId":"styles_styles_css_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/chat":{"post":{"summary":"Chat","operationId":"chat_api_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/feedback":{"post":{"summary":"Feedback","operationId":"feedback_api_feedback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Response Feedback Api Feedback Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/conversations/trashed":{"get":{"summary":"Conversations Trashed Route","description":"List soft-deleted conversations for the trash view.\n\nRegistered BEFORE `/api/conversations/{conv_id}` because FastAPI matches\nroutes in registration order — without this, the path param would\nswallow \"trashed\".","operationId":"conversations_trashed_route_api_conversations_trashed_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Conversations Trashed Route Api Conversations Trashed Get"}}}}}}},"/api/conversations":{"get":{"summary":"Conversations","operationId":"conversations_api_conversations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Conversations Api Conversations Get"}}}}}}},"/api/conversations/{conv_id}":{"get":{"summary":"Conversation","operationId":"conversation_api_conversations__conv_id__get","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"string","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Conversation Api Conversations  Conv Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Conversation Delete","description":"Soft-delete by default — the conversation lands in trash and can be\nrestored. Pass `?hard=true` to permanently remove the file (used by the\ntrash view's \"purge\" button).","operationId":"conversation_delete_api_conversations__conv_id__delete","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"string","title":"Conv Id"}},{"name":"hard","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Hard"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Conversation Delete Api Conversations  Conv Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/conversations/{conv_id}/export.pdf":{"get":{"summary":"Conversation Export Pdf","description":"Render the conversation as a printable PDF — the lawyer's record of\nthe consultation. Uses the same weasyprint pipeline as document export.","operationId":"conversation_export_pdf_api_conversations__conv_id__export_pdf_get","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"string","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/conversations/{conv_id}/export.docx":{"get":{"summary":"Conversation Export Docx","description":"Render the conversation as a DOCX — parity with the PDF export.\n\nUses the same `documents/export.py::markdown_to_docx` pipeline as\ndocument generation, so the styling matches anything else the lawyer\nhas downloaded. 503 if python-docx isn't installed.","operationId":"conversation_export_docx_api_conversations__conv_id__export_docx_get","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"string","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/conversations/{conv_id}/share":{"post":{"summary":"Conversation Share Create","description":"Mint (or re-use) a public share token for this conversation.","operationId":"conversation_share_create_api_conversations__conv_id__share_post","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"string","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Conversation Share Create Api Conversations  Conv Id  Share Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Conversation Share Revoke","operationId":"conversation_share_revoke_api_conversations__conv_id__share_delete","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"string","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Conversation Share Revoke Api Conversations  Conv Id  Share Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/share/{token}":{"get":{"summary":"Conversation Share View","description":"Public read-only fetch — no auth, returns the shared conversation.","operationId":"conversation_share_view_api_share__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Conversation Share View Api Share  Token  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/share/{token}":{"get":{"summary":"Share Page","description":"Static viewer page — fetches the conversation via /api/share/{token}.","operationId":"share_page_share__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/conversations/{conv_id}/restore":{"post":{"summary":"Conversation Restore","operationId":"conversation_restore_api_conversations__conv_id__restore_post","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"string","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Conversation Restore Api Conversations  Conv Id  Restore Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/conversations/{conv_id}/pin":{"patch":{"summary":"Conversation Pin","description":"Toggle the pin flag — pinned conversations sort to the top of the\nsidebar regardless of their `updated_at` recency.","operationId":"conversation_pin_api_conversations__conv_id__pin_patch","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"string","title":"Conv Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConvPinRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Conversation Pin Api Conversations  Conv Id  Pin Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/conversations/{conv_id}/notes":{"patch":{"summary":"Conversation Notes","description":"Save a private notes pad on the conversation.\n\nThe notes are stored alongside the conversation JSON and surfaced to\nthe user in the sidebar / right panel, but are NEVER sent to the LLM\n— the chat history that goes upstream is built from `messages[]`\nonly. This is the lawyer's private scratchpad for facts, action\nitems, and confidential observations.","operationId":"conversation_notes_api_conversations__conv_id__notes_patch","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"string","title":"Conv Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConvNotesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Conversation Notes Api Conversations  Conv Id  Notes Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/presets":{"get":{"summary":"Presets List","description":"List the available practice-area presets so the composer can render\na dropdown. No auth required — the same set is shown to anonymous and\nauthed users.","operationId":"presets_list_api_presets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Presets List Api Presets Get"}}}}}}},"/api/templates":{"get":{"summary":"Templates","operationId":"templates_api_templates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Response Templates Api Templates Get"}}}}}},"post":{"summary":"Templates Create","description":"Save a user-owned template under the current user's namespace.\n\nBuilt-in template keys (Ptk szerződés stb.) can't be overwritten — the\nuser-saved version lives under the `user:<slug>` namespace.","operationId":"templates_create_api_templates_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Templates Create Api Templates Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/templates/{key}":{"delete":{"summary":"Templates Delete","operationId":"templates_delete_api_templates__key__delete","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Templates Delete Api Templates  Key  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Templates Get","description":"Fetch a template's markdown body so the UI can pre-fill the editor.","operationId":"templates_get_api_templates__key__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Templates Get Api Templates  Key  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/{fmt}":{"get":{"summary":"Download Document","operationId":"download_document_api_documents__doc_id___fmt__get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}},{"name":"fmt","in":"path","required":true,"schema":{"type":"string","title":"Fmt"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/statute":{"get":{"summary":"Statute","description":"Exact statute text for a citation — powers the UI 'view §' side-panel.","operationId":"statute_api_statute_get","parameters":[{"name":"law","in":"query","required":true,"schema":{"type":"string","title":"Law"}},{"name":"section","in":"query","required":true,"schema":{"type":"string","title":"Section"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Statute Api Statute Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/upload":{"post":{"summary":"Upload","description":"Accept a single document/image, extract its text, return a `mention`\nblock the UI prepends to the next user message.\n\nPDF + DOCX + TXT/MD are extracted server-side. Images are stored but not\nOCR'd — the UI tells the user to describe the image instead.","operationId":"upload_api_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_api_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Upload Api Upload Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/import":{"post":{"summary":"Documents Import","description":"Import an uploaded PDF/DOCX/TXT/MD as an EDITABLE document.\n\nExtracts the text, converts it to markdown, and registers it through the\nsame generator the agent uses — so the imported file then lives in the\nDocuments tab and supports the full edit pipeline (by hand in the side\npanel, by AI via load_document→generate_document, and download as md/html/\npdf/docx). Images and unsupported types are rejected (nothing to edit).","operationId":"documents_import_api_documents_import_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_documents_import_api_documents_import_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Documents Import Api Documents Import Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents":{"get":{"summary":"Documents List","description":"List the current user's generated documents, newest first.\n\nEach entry: {doc_id, title (== filename stem, lowercased), updated_at,\nformats (which renderings exist on disk)}. The sidebar uses this to\nshow the user a quick jump-list to anything they've created.","operationId":"documents_list_api_documents_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Documents List Api Documents Get"}}}}}}},"/api/documents/save":{"post":{"summary":"Documents Save","description":"Save edits the user made in the side-panel back to the document.\n\nRe-renders all configured formats from the new markdown so md/html/pdf/docx\nstay in sync. The doc_id remains stable so prior download links keep\nworking (the regen overwrites them in place).","operationId":"documents_save_api_documents_save_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocSaveRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Documents Save Api Documents Save Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/doc-versions/{doc_id}":{"get":{"summary":"Documents Versions","description":"List saved revisions of a document (newest first), with a short preview.\nDistinct prefix so it can't collide with the /{doc_id}/{fmt} download route.","operationId":"documents_versions_api_doc_versions__doc_id__get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Documents Versions Api Doc Versions  Doc Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/doc-versions/{doc_id}/restore/{version}":{"post":{"summary":"Documents Restore","description":"Restore a prior revision as the current document (re-renders all formats;\nthe version being replaced is itself snapshotted first).","operationId":"documents_restore_api_doc_versions__doc_id__restore__version__post","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}},{"name":"version","in":"path","required":true,"schema":{"type":"string","title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Documents Restore Api Doc Versions  Doc Id  Restore  Version  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}":{"get":{"summary":"Documents Load","description":"Read the current markdown of a previously generated document.","operationId":"documents_load_api_documents__doc_id__get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Documents Load Api Documents  Doc Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Documents Delete","description":"Delete a generated document and every rendering on disk (md/html/pdf/\ndocx) plus its sidecar meta + folder assignment. Path-traversal-safe.","operationId":"documents_delete_api_documents__doc_id__delete","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Documents Delete Api Documents  Doc Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/doc/{doc_id}":{"get":{"summary":"Doc View","description":"Human-facing document link target (what an inline answer link points to).\n\nServes the rendered HTML (falls back to markdown). Per-user: the auth\nmiddleware binds the session's user so documents_dir resolves to theirs.\nTolerant match so a slightly-off slug (accents/case) from a model-written\nlink still resolves to the right document.","operationId":"doc_view_doc__doc_id__get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/doc-tree":{"get":{"summary":"Doc Tree Get","description":"Folders + documents (each tagged with its folder_id) for the sidebar tree.","operationId":"doc_tree_get_api_doc_tree_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Doc Tree Get Api Doc Tree Get"}}}}}}},"/api/doc-folders":{"post":{"summary":"Doc Folder Create","operationId":"doc_folder_create_api_doc_folders_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Doc Folder Create Api Doc Folders Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/doc-folders/{folder_id}":{"patch":{"summary":"Doc Folder Update","operationId":"doc_folder_update_api_doc_folders__folder_id__patch","parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Doc Folder Update Api Doc Folders  Folder Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Doc Folder Delete","operationId":"doc_folder_delete_api_doc_folders__folder_id__delete","parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Doc Folder Delete Api Doc Folders  Folder Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/move":{"post":{"summary":"Document Move","operationId":"document_move_api_documents__doc_id__move_post","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocMoveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Document Move Api Documents  Doc Id  Move Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/memory":{"get":{"summary":"Memory Get","operationId":"memory_get_api_memory_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Memory Get Api Memory Get"}}}}}},"post":{"summary":"Memory Add","operationId":"memory_add_api_memory_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemoryAddRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Memory Add Api Memory Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Memory Set Shared","operationId":"memory_set_shared_api_memory_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemorySharedRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Memory Set Shared Api Memory Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/memory/{item_id}":{"delete":{"summary":"Memory Delete","operationId":"memory_delete_api_memory__item_id__delete","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Memory Delete Api Memory  Item Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storage-mode":{"get":{"summary":"Storage Mode Get","description":"Current user's storage mode + whether the decentralized backend is live.","operationId":"storage_mode_get_api_storage_mode_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Storage Mode Get Api Storage Mode Get"}}}}}},"post":{"summary":"Storage Mode Set","description":"Toggle between central and blockchain (decentralized) storage.","operationId":"storage_mode_set_api_storage_mode_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StorageModeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Storage Mode Set Api Storage Mode Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/privacy-mode":{"get":{"summary":"Privacy Mode Get","description":"Whether PII tokenization is on for this user + whether the deploy enables it.","operationId":"privacy_mode_get_api_privacy_mode_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Privacy Mode Get Api Privacy Mode Get"}}}}}},"post":{"summary":"Privacy Mode Set","description":"Toggle PII tokenization (pseudonymize personal data before the LLM).","operationId":"privacy_mode_set_api_privacy_mode_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrivacyModeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Privacy Mode Set Api Privacy Mode Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wallet":{"get":{"summary":"Wallet Status","operationId":"wallet_status_api_wallet_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Wallet Status Api Wallet Get"}}}}}}},"/api/wallet/create":{"post":{"summary":"Wallet Create","description":"Create a new key vault. Returns the seed phrase ONCE — the client must\nshow it to the user to write down; it is never returned again.","operationId":"wallet_create_api_wallet_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Wallet Create Api Wallet Create Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wallet/unlock":{"post":{"summary":"Wallet Unlock","operationId":"wallet_unlock_api_wallet_unlock_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletUnlockRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Wallet Unlock Api Wallet Unlock Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wallet/recover":{"post":{"summary":"Wallet Recover","description":"Recover access from the 15 words and set a new password.","operationId":"wallet_recover_api_wallet_recover_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletRecoverRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Wallet Recover Api Wallet Recover Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wallet/password":{"post":{"summary":"Wallet Change Password","operationId":"wallet_change_password_api_wallet_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Wallet Change Password Api Wallet Password Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wallet/lock":{"post":{"summary":"Wallet Lock","operationId":"wallet_lock_api_wallet_lock_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Wallet Lock Api Wallet Lock Post"}}}}}}},"/api/audit/export":{"get":{"summary":"Audit Export","description":"Export the user's audit trail (PII-redacted at write time) for compliance.\n`format=csv` (default) or `json`. Covers the last `days` days.","operationId":"audit_export_api_audit_export_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":90,"title":"Days"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"csv","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clauses":{"get":{"summary":"Clauses List","description":"Reusable HU legal boilerplate clauses for the document editor's\ninsert-clause picker. (Defaults; per-user custom clauses can extend this.)","operationId":"clauses_list_api_clauses_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Response Clauses List Api Clauses Get"}}}}}}},"/api/calc":{"post":{"summary":"Calc","description":"Verifiable legal calculator (deadlines with HU holidays + törvénykezési\nszünet, késedelmi kamat) — the same pure-Python engine the agent uses, so\nthe UI calculator never guesses.","operationId":"calc_api_calc_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalcRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Calc Api Calc Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/news":{"get":{"summary":"Law News","description":"Recent law changes across enabled jurisdictions — the in-app news feed.\nPublic (no quota): it's read-only metadata, not an LLM call.","operationId":"law_news_api_news_get","parameters":[{"name":"jurisdiction","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jurisdiction"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"interesting","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Interesting"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Law News Api News Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/caselaw":{"get":{"summary":"Caselaw Search","description":"Related Kúria/BH precedents for a query — a SEPARATE path from the statute\nanswer (precedents never displace the governing §). Powers the 'Kapcsolódó\nbírói gyakorlat' panel. Public read-only (no LLM call).","operationId":"caselaw_search_api_caselaw_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","title":"Q"}},{"name":"k","in":"query","required":false,"schema":{"type":"integer","default":5,"title":"K"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Caselaw Search Api Caselaw Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts":{"get":{"summary":"Law Alerts","description":"Law changes touching a law the CURRENT user has cited. Empty for anon.","operationId":"law_alerts_api_alerts_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Law Alerts Api Alerts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/team":{"get":{"summary":"Team Get","description":"The current user's team (with members + my role), or {team: null}.","operationId":"team_get_api_team_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Team Get Api Team Get"}}}}}},"post":{"summary":"Team Create","operationId":"team_create_api_team_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Team Create Api Team Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/team/members":{"post":{"summary":"Team Add Member","operationId":"team_add_member_api_team_members_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberAdd"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Team Add Member Api Team Members Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/team/members/{member_id}":{"delete":{"summary":"Team Remove Member","operationId":"team_remove_member_api_team_members__member_id__delete","parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Team Remove Member Api Team Members  Member Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/explain":{"post":{"summary":"Explain Clause","description":"Explain a selected clause/passage grounded in the HATÁLYOS law: retrieve\nthe governing §-s for the selection and produce a short, source-cited\nexplanation. Powers the editor's 'Mit jelent?' inline action.\n\nMetered like a chat turn (it makes an LLM call), so it can't be an unbounded\ncost/abuse vector — over-quota actors get 429.","operationId":"explain_clause_api_explain_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExplainRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Explain Clause Api Explain Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clients/{client_id}/matter":{"get":{"summary":"Client Matter","description":"Matter/case overview: everything bundled under one client — the\nconversations, generated documents, and deadlines that belong to them.","operationId":"client_matter_api_clients__client_id__matter_get","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Client Matter Api Clients  Client Id  Matter Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/plan":{"get":{"summary":"Plan Get","description":"Current plan + caps + the full tier catalog (for the pricing UI).","operationId":"plan_get_api_plan_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Plan Get Api Plan Get"}}}}}}},"/api/plan/select":{"post":{"summary":"Plan Select","description":"Switch plan. Enterprise is always sales-managed (never self-select).\nbasic/pro self-select is allowed only when tier_self_select_enabled (the\nhook where real billing — Stripe / x402 crypto checkout — plugs in).","operationId":"plan_select_api_plan_select_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanSelectRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Plan Select Api Plan Select Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/register":{"post":{"summary":"Auth Register Endpoint","operationId":"auth_register_endpoint_api_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthCredsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"summary":"Auth Login Endpoint","operationId":"auth_login_endpoint_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthCredsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login/2fa":{"post":{"summary":"Auth Login 2Fa","description":"Second step of a 2FA login: re-verify the password + the TOTP code.","operationId":"auth_login_2fa_api_auth_login_2fa_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoFALoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/2fa":{"get":{"summary":"Twofa Status","operationId":"twofa_status_api_auth_2fa_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Twofa Status Api Auth 2Fa Get"}}}}}}},"/api/auth/2fa/enroll":{"post":{"summary":"Twofa Enroll","description":"Start enrollment: returns the secret + otpauth:// URI to scan. Not yet\nactive until confirmed with a code.","operationId":"twofa_enroll_api_auth_2fa_enroll_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Twofa Enroll Api Auth 2Fa Enroll Post"}}}}}}},"/api/auth/2fa/confirm":{"post":{"summary":"Twofa Confirm","operationId":"twofa_confirm_api_auth_2fa_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoFACodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Twofa Confirm Api Auth 2Fa Confirm Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/sso":{"get":{"summary":"Sso Providers","description":"Configured SSO providers (so the login UI renders the right buttons).","operationId":"sso_providers_api_auth_sso_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Sso Providers Api Auth Sso Get"}}}}}}},"/api/auth/sso/{provider}/start":{"get":{"summary":"Sso Start","description":"Redirect the browser to the IdP's authorization page.","operationId":"sso_start_api_auth_sso__provider__start_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/sso/{provider}/callback":{"get":{"summary":"Sso Callback","description":"IdP redirect target: exchange the code, find-or-create the user, issue a\nsession cookie, and bounce to /app.","operationId":"sso_callback_api_auth_sso__provider__callback_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/2fa/disable":{"post":{"summary":"Twofa Disable","description":"Disable 2FA — requires a valid current code (so a hijacked session\ncan't silently turn it off).","operationId":"twofa_disable_api_auth_2fa_disable_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoFACodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Twofa Disable Api Auth 2Fa Disable Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/logout":{"post":{"summary":"Auth Logout Endpoint","operationId":"auth_logout_endpoint_api_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/me":{"get":{"summary":"Auth Me","description":"Always returns 200 — the UI calls this to detect login state.\n`user: null` means anonymous. Includes the current quota so the UI can\nshow a \"2/3 üzenet\" hint and trigger the register prompt when needed.","operationId":"auth_me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Auth Me Api Auth Me Get"}}}}}},"delete":{"summary":"Auth Delete Account","description":"GDPR right to erasure: permanently delete the current user's account\nand all per-user data on disk. Requires re-typing the password AND the\nliteral confirmation phrase \"TÖRLÉS\" so it can't fire on a stray click.\n\nAdmins are intentionally NOT allowed to delete themselves through this\nendpoint — they have to be removed from BEAI_ADMIN_EMAILS first\n(otherwise a misclick takes the only admin offline).","operationId":"auth_delete_account_api_auth_me_delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDeleteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Auth Delete Account Api Auth Me Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/x402/settle":{"post":{"summary":"X402 Settle","description":"Stub settlement receiver.\n\nReal deployments swap this for the chosen settlement provider's flow\n(e.g. Coinbase x402 facilitator, custom signed-receipt verifier).\nThe stub responds with the price + a TODO so integrators see the\ncontract surface.","operationId":"x402_settle_api_x402_settle_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402SettleRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response X402 Settle Api X402 Settle Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/me/export":{"get":{"summary":"Auth Export Account","description":"GDPR data portability: ZIP of everything we have for the current\nuser (conversations, documents, clients, deadlines, audit, uploads).\n\nStream-friendly: builds the archive in-memory and returns it.\nAnyone authenticated can pull their own data; admins can't pull\nsomeone else's via this endpoint.","operationId":"auth_export_account_api_auth_me_export_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/search":{"get":{"summary":"Search Endpoint","description":"Cross-resource search: conversations + documents in the current user's\nnamespace. Empty `q` returns an empty list.\nOptional `kind` and `since_days` filters narrow the result set.","operationId":"search_endpoint_api_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}},{"name":"since_days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Since Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Search Endpoint Api Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/keys":{"get":{"summary":"Api Keys List","operationId":"api_keys_list_api_auth_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Api Keys List Api Auth Keys Get"}}}}}},"post":{"summary":"Api Keys Create","description":"Mint a new personal API key. Returns the secret in plaintext ONCE.","operationId":"api_keys_create_api_auth_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Keys Create Api Auth Keys Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/keys/{key_id}":{"delete":{"summary":"Api Keys Revoke","operationId":"api_keys_revoke_api_auth_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Api Keys Revoke Api Auth Keys  Key Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clients":{"get":{"summary":"Clients List","operationId":"clients_list_api_clients_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Clients List Api Clients Get"}}}}}},"post":{"summary":"Clients Create","operationId":"clients_create_api_clients_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Clients Create Api Clients Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clients/{client_id}":{"delete":{"summary":"Clients Delete","operationId":"clients_delete_api_clients__client_id__delete","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Clients Delete Api Clients  Client Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/deadlines":{"get":{"summary":"Deadlines List","description":"Upcoming deadlines for the current user. Sorted by due date ascending.","operationId":"deadlines_list_api_deadlines_get","parameters":[{"name":"include_dismissed","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Dismissed"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Deadlines List Api Deadlines Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Deadlines Create","description":"Manual entry — the lawyer adds a deadline that the auto-extractor\nmissed (or for matters that haven't been discussed yet).","operationId":"deadlines_create_api_deadlines_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeadlineCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Deadlines Create Api Deadlines Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/deadlines/{deadline_id}":{"delete":{"summary":"Deadlines Delete","operationId":"deadlines_delete_api_deadlines__deadline_id__delete","parameters":[{"name":"deadline_id","in":"path","required":true,"schema":{"type":"string","title":"Deadline Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Deadlines Delete Api Deadlines  Deadline Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/deadlines/{deadline_id}/dismiss":{"post":{"summary":"Deadlines Dismiss","operationId":"deadlines_dismiss_api_deadlines__deadline_id__dismiss_post","parameters":[{"name":"deadline_id","in":"path","required":true,"schema":{"type":"string","title":"Deadline Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Deadlines Dismiss Api Deadlines  Deadline Id  Dismiss Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/deadlines.ics":{"get":{"summary":"Deadlines Ics","description":"Calendar-importable ICS of the user's active deadlines.","operationId":"deadlines_ics_api_deadlines_ics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/conversations/{conv_id}/client":{"patch":{"summary":"Conversation Assign Client","operationId":"conversation_assign_client_api_conversations__conv_id__client_patch","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"string","title":"Conv Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConvAssignRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Conversation Assign Client Api Conversations  Conv Id  Client Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/conversations/{conv_id}/title":{"patch":{"summary":"Conversation Rename","description":"Apply a sticky title to a conversation (manual rename).","operationId":"conversation_rename_api_conversations__conv_id__title_patch","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"string","title":"Conv Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConvTitleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Conversation Rename Api Conversations  Conv Id  Title Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/conversations/{conv_id}/title/auto":{"post":{"summary":"Conversation Autotitle","description":"Generate a short Hungarian title via the cheap tool_model and persist\nit sticky on the conversation. Idempotent: if a sticky title already\nexists, returns it without regenerating.","operationId":"conversation_autotitle_api_conversations__conv_id__title_auto_post","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"string","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Conversation Autotitle Api Conversations  Conv Id  Title Auto Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/metrics":{"get":{"summary":"Metrics Endpoint","description":"Per-turn telemetry rollup. Admin-only by default; pass `mine=true` to\nget just the caller's own turns (works for any authenticated user).","operationId":"metrics_endpoint_api_metrics_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Days"}},{"name":"mine","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Mine"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Metrics Endpoint Api Metrics Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/health":{"get":{"summary":"Health","operationId":"health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Api Health Get"}}}}}}}},"components":{"schemas":{"AccountDeleteRequest":{"properties":{"password":{"type":"string","title":"Password"},"confirm":{"type":"string","title":"Confirm"}},"type":"object","required":["password","confirm"],"title":"AccountDeleteRequest"},"ApiKeyCreateRequest":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"ApiKeyCreateRequest"},"AuthCredsRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"AuthCredsRequest"},"Body_documents_import_api_documents_import_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_documents_import_api_documents_import_post"},"Body_upload_api_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_api_upload_post"},"CalcRequest":{"properties":{"operation":{"type":"string","title":"Operation"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"},"n_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"N Days"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"},"principal":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Principal"},"rate_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rate Pct"},"rate_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rate Mode"}},"type":"object","required":["operation"],"title":"CalcRequest"},"ChatAttachment":{"properties":{"kind":{"type":"string","title":"Kind"},"url":{"type":"string","title":"Url"},"media_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Type"}},"type":"object","required":["kind","url"],"title":"ChatAttachment"},"ChatRequest":{"properties":{"messages":{"items":{"$ref":"#/components/schemas/ChatTurn"},"type":"array","title":"Messages"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"conversation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conversation Id"},"preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset"},"interactive":{"type":"boolean","title":"Interactive","default":false},"reasoning_depth":{"type":"string","title":"Reasoning Depth","default":"normal"},"response_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Language"}},"type":"object","required":["messages"],"title":"ChatRequest"},"ChatTurn":{"properties":{"role":{"type":"string","title":"Role"},"content":{"type":"string","title":"Content"},"attachments":{"items":{"$ref":"#/components/schemas/ChatAttachment"},"type":"array","title":"Attachments","default":[]},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","required":["role","content"],"title":"ChatTurn"},"ClientCreateRequest":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"ClientCreateRequest"},"ConvAssignRequest":{"properties":{"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}},"type":"object","title":"ConvAssignRequest"},"ConvNotesRequest":{"properties":{"notes":{"type":"string","title":"Notes","default":""}},"type":"object","title":"ConvNotesRequest"},"ConvPinRequest":{"properties":{"pinned":{"type":"boolean","title":"Pinned"}},"type":"object","required":["pinned"],"title":"ConvPinRequest"},"ConvTitleRequest":{"properties":{"title":{"type":"string","title":"Title"}},"type":"object","required":["title"],"title":"ConvTitleRequest"},"DeadlineCreateRequest":{"properties":{"due_date":{"type":"string","title":"Due Date"},"label":{"type":"string","title":"Label"},"conv_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conv Id"}},"type":"object","required":["due_date","label"],"title":"DeadlineCreateRequest"},"DocMoveRequest":{"properties":{"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}},"type":"object","title":"DocMoveRequest"},"DocSaveRequest":{"properties":{"doc_id":{"type":"string","title":"Doc Id"},"markdown":{"type":"string","title":"Markdown"},"formats":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Formats"}},"type":"object","required":["doc_id","markdown"],"title":"DocSaveRequest"},"ExplainRequest":{"properties":{"text":{"type":"string","title":"Text"}},"type":"object","required":["text"],"title":"ExplainRequest"},"FeedbackRequest":{"properties":{"audit_id":{"type":"string","title":"Audit Id"},"vote":{"type":"integer","title":"Vote"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"}},"type":"object","required":["audit_id","vote"],"title":"FeedbackRequest"},"FolderRequest":{"properties":{"name":{"type":"string","title":"Name"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"}},"type":"object","required":["name"],"title":"FolderRequest"},"FolderUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"},"move":{"type":"boolean","title":"Move","default":false}},"type":"object","title":"FolderUpdateRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"MemberAdd":{"properties":{"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role","default":"member"}},"type":"object","required":["email"],"title":"MemberAdd"},"MemoryAddRequest":{"properties":{"text":{"type":"string","title":"Text"}},"type":"object","required":["text"],"title":"MemoryAddRequest"},"MemorySharedRequest":{"properties":{"shared":{"type":"boolean","title":"Shared"}},"type":"object","required":["shared"],"title":"MemorySharedRequest"},"PlanSelectRequest":{"properties":{"plan":{"type":"string","title":"Plan"}},"type":"object","required":["plan"],"title":"PlanSelectRequest"},"PrivacyModeRequest":{"properties":{"pii":{"type":"boolean","title":"Pii"}},"type":"object","required":["pii"],"title":"PrivacyModeRequest"},"StorageModeRequest":{"properties":{"mode":{"type":"string","title":"Mode"}},"type":"object","required":["mode"],"title":"StorageModeRequest"},"TeamCreate":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"TeamCreate"},"TemplateCreateRequest":{"properties":{"key":{"type":"string","title":"Key"},"title":{"type":"string","title":"Title"},"markdown":{"type":"string","title":"Markdown"}},"type":"object","required":["key","title","markdown"],"title":"TemplateCreateRequest"},"TwoFACodeRequest":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"TwoFACodeRequest"},"TwoFALoginRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"code":{"type":"string","title":"Code"}},"type":"object","required":["email","password","code"],"title":"TwoFALoginRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WalletCreateRequest":{"properties":{"password":{"type":"string","title":"Password"},"words":{"type":"integer","title":"Words","default":15}},"type":"object","required":["password"],"title":"WalletCreateRequest"},"WalletPasswordRequest":{"properties":{"old_password":{"type":"string","title":"Old Password"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["old_password","new_password"],"title":"WalletPasswordRequest"},"WalletRecoverRequest":{"properties":{"mnemonic":{"type":"string","title":"Mnemonic"},"password":{"type":"string","title":"Password"}},"type":"object","required":["mnemonic","password"],"title":"WalletRecoverRequest"},"WalletUnlockRequest":{"properties":{"password":{"type":"string","title":"Password"}},"type":"object","required":["password"],"title":"WalletUnlockRequest"},"X402SettleRequest":{"properties":{"payload":{"additionalProperties":true,"type":"object","title":"Payload","default":{}}},"type":"object","title":"X402SettleRequest"}}}}