{"openapi":"3.1.0","info":{"title":"Noddle Board","version":"0.1.0"},"paths":{"/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"}}}}}}},"/api/auth/register":{"post":{"tags":["auth"],"summary":"Register","operationId":"register_api_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Register Api Auth Register Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Login Api Auth Login Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/change-password":{"post":{"tags":["auth"],"summary":"Change Password","description":"Rotate the account password. Wrong current password → 401; new password\nshorter than 8 chars → 400. Every OTHER session is revoked (the caller's\nown cookie stays valid); the event is audit-logged.","operationId":"change_password_api_auth_change_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Change Password Api Auth Change Password Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","operationId":"logout_api_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Logout Api Auth Logout Post"}}}}}}},"/api/auth/oidc/status":{"get":{"tags":["auth"],"summary":"Oidc Status","description":"The UI shows the SSO button only when a provider is configured. The\nissuer lets the client label the button (\"Continue with Google\" vs a\ngeneric \"Sign in with SSO\") — it is public discovery info, not a secret.","operationId":"oidc_status_api_auth_oidc_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Oidc Status Api Auth Oidc Status Get"}}}}}}},"/api/auth/oidc/login":{"get":{"tags":["auth"],"summary":"Oidc Login","operationId":"oidc_login_api_auth_oidc_login_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/oidc/callback":{"get":{"tags":["auth"],"summary":"Oidc Callback","operationId":"oidc_callback_api_auth_oidc_callback_get","parameters":[{"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/me":{"get":{"tags":["auth"],"summary":"Me","operationId":"me_api_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Me Api Me Get"}}}}}},"patch":{"tags":["auth"],"summary":"Patch Me","operationId":"patch_me_api_me_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Patch Me Api Me Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/storage":{"get":{"tags":["auth"],"summary":"My Storage","description":"REAL per-user byte accounting (#23): bytes at rest across boards this\naccount owns (svg + diagram/comments sidecars + version snapshots).","operationId":"my_storage_api_me_storage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response My Storage Api Me Storage Get"}}}}}}},"/api/ai-settings":{"get":{"tags":["auth"],"summary":"Get Ai Settings","operationId":"get_ai_settings_api_ai_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Ai Settings Api Ai Settings Get"}}}}}},"put":{"tags":["auth"],"summary":"Put Ai Settings","operationId":"put_ai_settings_api_ai_settings_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AISettingsBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Ai Settings Api Ai Settings Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/usage":{"get":{"tags":["auth"],"summary":"My Usage","description":"Provider-dashboard-style AI usage: per-day series + per-action/model\nbreakdowns + window totals + recent calls (from the append-only ledger).","operationId":"my_usage_api_me_usage_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response My Usage Api Me Usage Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai-settings/byok":{"post":{"tags":["auth"],"summary":"Add Byok Profile","operationId":"add_byok_profile_api_ai_settings_byok_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ByokProfileBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Add Byok Profile Api Ai Settings Byok Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai-settings/byok/{pid}":{"patch":{"tags":["auth"],"summary":"Update Byok Profile","operationId":"update_byok_profile_api_ai_settings_byok__pid__patch","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ByokProfilePatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Byok Profile Api Ai Settings Byok  Pid  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["auth"],"summary":"Delete Byok Profile","operationId":"delete_byok_profile_api_ai_settings_byok__pid__delete","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Byok Profile Api Ai Settings Byok  Pid  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai-settings/byok/{pid}/activate":{"post":{"tags":["auth"],"summary":"Activate Byok Profile","description":"Make this profile the one byok-mode calls resolve against AND flip the\naccount into byok mode (so \"Use this one\" is a single action).","operationId":"activate_byok_profile_api_ai_settings_byok__pid__activate_post","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Activate Byok Profile Api Ai Settings Byok  Pid  Activate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai-settings/byok/{pid}/test":{"post":{"tags":["auth"],"summary":"Test Byok Profile","description":"Fire a minimal chat at the profile's provider to prove the key works.\n\nALWAYS answers 200 with ``{ok, message}`` — a failing key is a normal\noutcome the UI renders inline, not an HTTP error (only an unknown profile\nis a 404). No credits are involved (BYOK bills the user's own account).","operationId":"test_byok_profile_api_ai_settings_byok__pid__test_post","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Test Byok Profile Api Ai Settings Byok  Pid  Test Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tokens":{"get":{"tags":["auth"],"summary":"List Tokens","operationId":"list_tokens_api_tokens_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Tokens Api Tokens Get"}}}}}},"post":{"tags":["auth"],"summary":"Create Token","operationId":"create_token_api_tokens_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Token Api Tokens Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tokens/scopes":{"get":{"tags":["auth"],"summary":"Token Scopes","description":"The scope vocabulary + plain-English descriptions (for the token UI).","operationId":"token_scopes_api_tokens_scopes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Token Scopes Api Tokens Scopes Get"}}}}}}},"/api/tokens/{token_id}":{"delete":{"tags":["auth"],"summary":"Delete Token","operationId":"delete_token_api_tokens__token_id__delete","parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"string","title":"Token Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/teams":{"get":{"tags":["auth"],"summary":"My Teams","operationId":"my_teams_api_teams_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response My Teams Api Teams Get"}}}}}},"post":{"tags":["auth"],"summary":"Create Team","operationId":"create_team_api_teams_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Team Api Teams Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/teams/{team_id}/members":{"post":{"tags":["auth"],"summary":"Add Member","operationId":"add_member_api_teams__team_id__members_post","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Member Api Teams  Team Id  Members Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/password-reset/request":{"post":{"tags":["password-reset"],"summary":"Request Reset","operationId":"request_reset_api_auth_password_reset_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestResetBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Request Reset Api Auth Password Reset Request Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/password-reset/confirm":{"post":{"tags":["password-reset"],"summary":"Confirm Reset","operationId":"confirm_reset_api_auth_password_reset_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmResetBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Confirm Reset Api Auth Password Reset Confirm Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/teams/{team_id}/audit":{"get":{"tags":["activity"],"summary":"Team Audit","operationId":"team_audit_api_teams__team_id__audit_get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Team Audit Api Teams  Team Id  Audit Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/activity":{"get":{"tags":["activity"],"summary":"My Activity","description":"My own recent audit trail + activity signals (Profile tab).","operationId":"my_activity_api_me_activity_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response My Activity Api Me Activity Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents":{"get":{"tags":["documents"],"summary":"List Documents","operationId":"list_documents_api_documents_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/DocMeta"},"type":"array","title":"Response List Documents Api Documents Get"}}}}}},"post":{"tags":["documents"],"summary":"Upload Document","operationId":"upload_document_api_documents_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_document_api_documents_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocMeta"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/new":{"post":{"tags":["documents"],"summary":"Create Document","description":"JSON create: blank board, template instance, or AI diagram.","operationId":"create_document_api_documents_new_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDocBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocMeta"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/import":{"post":{"tags":["documents"],"summary":"Import Document","description":"Import a foreign diagram file as a NEW editable board.\n\nSupported today: draw.io / diagrams.net (``.drawio`` / ``.xml`` — plain or\ndeflate-compressed, multi-page → noddle pages). Mermaid ``.mmd`` files are\nhandled client-side through the existing text→diagram AI path; ``.vsdx``\nis a spike (docs/spikes). A preview SVG is baked so the dashboard card\nisn't blank before the first open+save.","operationId":"import_document_api_documents_import_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_import_document_api_documents_import_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocMeta"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/shared":{"get":{"tags":["documents"],"summary":"List Shared With Me","description":"Boards someone ELSE owns that this user can access by name (per-user\nshare or team) — the \"Shared with me\" table. Registered *before*\n``/{doc_id}`` so the literal path wins; guests get an empty list.","operationId":"list_shared_with_me_api_documents_shared_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Shared With Me Api Documents Shared Get"}}}}}}},"/api/documents/{doc_id}":{"get":{"tags":["documents"],"summary":"Get Document","operationId":"get_document_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":{"$ref":"#/components/schemas/DocumentOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["documents"],"summary":"Save Document","operationId":"save_document_api_documents__doc_id__put","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocMeta"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["documents"],"summary":"Patch Document","description":"Rename / move-to-folder need \"edit\"; sharing knobs (link_policy,\nteam_id) need \"manage\".","operationId":"patch_document_api_documents__doc_id__patch","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchDocBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocMeta"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["documents"],"summary":"Delete Document","operationId":"delete_document_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/audit":{"get":{"tags":["documents"],"summary":"Doc Audit","description":"Owner-visible audit trail (#22): who created/imported/deleted/shared.","operationId":"doc_audit_api_documents__doc_id__audit_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 Doc Audit Api Documents  Doc Id  Audit Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/export.svg":{"get":{"tags":["documents"],"summary":"Export Svg","operationId":"export_svg_api_documents__doc_id__export_svg_get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}},{"name":"fit","in":"query","required":false,"schema":{"type":"string","default":"","title":"Fit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/versions":{"get":{"tags":["documents"],"summary":"List Versions","description":"Snapshot metadata, newest first. Needs \"view\" (like reading the board).","operationId":"list_versions_api_documents__doc_id__versions_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 List Versions Api Documents  Doc Id  Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/versions/{version_id}":{"get":{"tags":["documents"],"summary":"Get Version","description":"One full snapshot (svg + diagram) for preview/restore. Restore itself is\nclient-driven: the frontend PUTs this payload back as a normal save.","operationId":"get_version_api_documents__doc_id__versions__version_id__get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}},{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Version Api Documents  Doc Id  Versions  Version Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/shares":{"get":{"tags":["documents"],"summary":"List Shares","operationId":"list_shares_api_documents__doc_id__shares_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 List Shares Api Documents  Doc Id  Shares Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["documents"],"summary":"Add Share","operationId":"add_share_api_documents__doc_id__shares_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/ShareBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Share Api Documents  Doc Id  Shares Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/shares/{user_id}":{"delete":{"tags":["documents"],"summary":"Remove Share","operationId":"remove_share_api_documents__doc_id__shares__user_id__delete","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/comments":{"get":{"tags":["comments"],"summary":"List Comments","operationId":"list_comments_api_documents__doc_id__comments_get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["comments"],"summary":"Create Comment","operationId":"create_comment_api_documents__doc_id__comments_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/CommentIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/comments/{comment_id}":{"patch":{"tags":["comments"],"summary":"Patch Comment","operationId":"patch_comment_api_documents__doc_id__comments__comment_id__patch","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}},{"name":"comment_id","in":"path","required":true,"schema":{"type":"string","title":"Comment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["comments"],"summary":"Delete Comment","operationId":"delete_comment_api_documents__doc_id__comments__comment_id__delete","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}},{"name":"comment_id","in":"path","required":true,"schema":{"type":"string","title":"Comment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/mentions":{"get":{"tags":["comments"],"summary":"My Mentions","description":"Comments that @mention the signed-in user, across every board they can\nstill view — newest first, capped. \"Seen\" state is CLIENT-side (a badge\naid, not durable inbox state), so this endpoint stays a pure read.","operationId":"my_mentions_api_me_mentions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response My Mentions Api Me Mentions Get"}}}}}}},"/api/me/notifications":{"get":{"tags":["notifications"],"summary":"My Notifications","operationId":"my_notifications_api_me_notifications_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response My Notifications Api Me Notifications Get"}}}}}}},"/api/folders":{"get":{"tags":["folders"],"summary":"List Folders","operationId":"list_folders_api_folders_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/FolderOut"},"type":"array","title":"Response List Folders Api Folders Get"}}}}}},"post":{"tags":["folders"],"summary":"Create Folder","operationId":"create_folder_api_folders_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/folders/{folder_id}":{"patch":{"tags":["folders"],"summary":"Rename Folder","operationId":"rename_folder_api_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/FolderBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["folders"],"summary":"Delete Folder","operationId":"delete_folder_api_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/checkout":{"post":{"tags":["payments"],"summary":"Create Checkout","description":"Create a hosted Lemon Squeezy checkout for the signed-in user.","operationId":"create_checkout_api_payments_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Checkout Api Payments Checkout Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/lemonsqueezy/webhook":{"post":{"tags":["payments"],"summary":"Lemonsqueezy Webhook","description":"Lemon Squeezy event sink. Signature-verified, idempotent by event id.","operationId":"lemonsqueezy_webhook_api_payments_lemonsqueezy_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Lemonsqueezy Webhook Api Payments Lemonsqueezy Webhook Post"}}}}}}},"/api/me/subscription":{"get":{"tags":["payments"],"summary":"My Subscription","description":"The caller's effective plan (guests see the free tier) — powers the\nplan badge + upgrade buttons in the Account modal.","operationId":"my_subscription_api_me_subscription_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response My Subscription Api Me Subscription Get"}}}}}}},"/api/me/billing-events":{"get":{"tags":["payments"],"summary":"My Billing Events","description":"The caller's OWN billing history, newest first (webhook-recorded:\npayments with amount + ✦ granted, subscription lifecycle changes).\nEmpty list when billing was never configured — never an error.","operationId":"my_billing_events_api_me_billing_events_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response My Billing Events Api Me Billing Events Get"}}}}}}},"/api/ai/image-to-svg":{"post":{"tags":["ai"],"summary":"Image To Svg","operationId":"image_to_svg_api_ai_image_to_svg_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_image_to_svg_api_ai_image_to_svg_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SvgOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/jobs/image-to-svg":{"post":{"tags":["ai"],"summary":"Submit Image Job","operationId":"submit_image_job_api_ai_jobs_image_to_svg_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_submit_image_job_api_ai_jobs_image_to_svg_post"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Submit Image Job Api Ai Jobs Image To Svg Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/jobs":{"get":{"tags":["ai"],"summary":"List Image Jobs","operationId":"list_image_jobs_api_ai_jobs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Image Jobs Api Ai Jobs Get"}}}}}}},"/api/ai/jobs/{job_id}":{"get":{"tags":["ai"],"summary":"Get Image Job","operationId":"get_image_job_api_ai_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Image Job Api Ai Jobs  Job Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["ai"],"summary":"Delete Image Job","operationId":"delete_image_job_api_ai_jobs__job_id__delete","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Image Job Api Ai Jobs  Job Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/text-to-diagram":{"post":{"tags":["ai"],"summary":"Text To Diagram","operationId":"text_to_diagram_api_ai_text_to_diagram_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiagramBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Text To Diagram Api Ai Text To Diagram Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/edit-diagram":{"post":{"tags":["ai"],"summary":"Edit Diagram","description":"Live co-editing: apply a chat instruction to the current board.\n\nAn optional ``model`` in the body selects the pool model for this chat\nsession; the service whitelists it (claude-*; legacy databricks-* values\nare mapped) and otherwise falls back to the edit default.\n\n``mode`` (\"edit\" default | \"ask\") picks co-editing vs consultant answers.\nBoth flow through the SAME up-front ✦ charge below (action\n\"edit_diagram\", effort multiplier included) — ask mode must never become\na free bypass of the credit wallet.","operationId":"edit_diagram_api_ai_edit_diagram_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditDiagramBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Edit Diagram Api Ai Edit Diagram Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/ai-usage/summary":{"get":{"tags":["ai-usage"],"summary":"My Ai Usage Summary","operationId":"my_ai_usage_summary_api_me_ai_usage_summary_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"24h | 7d | 30d | 90d","title":"Period"},"description":"24h | 7d | 30d | 90d"},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"epoch seconds (inclusive)","title":"Start"},"description":"epoch seconds (inclusive)"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"epoch seconds (exclusive)","title":"End"},"description":"epoch seconds (exclusive)"},{"name":"model","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}},{"name":"mode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"tz","in":"query","required":false,"schema":{"type":"integer","maximum":840,"minimum":-840,"default":0,"title":"Tz"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response My Ai Usage Summary Api Me Ai Usage Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/ai-usage/generations":{"get":{"tags":["ai-usage"],"summary":"My Ai Generations","operationId":"my_ai_generations_api_me_ai_usage_generations_get","parameters":[{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"24h | 7d | 30d | 90d","title":"Period"},"description":"24h | 7d | 30d | 90d"},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"epoch seconds (inclusive)","title":"Start"},"description":"epoch seconds (inclusive)"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"epoch seconds (exclusive)","title":"End"},"description":"epoch seconds (exclusive)"},{"name":"model","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}},{"name":"mode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response My Ai Generations Api Me Ai Usage Generations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/ai-usage/export.csv":{"get":{"tags":["ai-usage"],"summary":"My Ai Usage Csv","operationId":"my_ai_usage_csv_api_me_ai_usage_export_csv_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"24h | 7d | 30d | 90d","title":"Period"},"description":"24h | 7d | 30d | 90d"},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"epoch seconds (inclusive)","title":"Start"},"description":"epoch seconds (inclusive)"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"epoch seconds (exclusive)","title":"End"},"description":"epoch seconds (exclusive)"},{"name":"model","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}},{"name":"mode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/teams/{team_id}/ai-usage":{"get":{"tags":["ai-usage"],"summary":"Team Ai Usage","operationId":"team_ai_usage_api_teams__team_id__ai_usage_get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"24h | 7d | 30d | 90d","title":"Period"},"description":"24h | 7d | 30d | 90d"},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"epoch seconds (inclusive)","title":"Start"},"description":"epoch seconds (inclusive)"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"epoch seconds (exclusive)","title":"End"},"description":"epoch seconds (exclusive)"},{"name":"model","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}},{"name":"mode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"tz","in":"query","required":false,"schema":{"type":"integer","maximum":840,"minimum":-840,"default":0,"title":"Tz"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Team Ai Usage Api Teams  Team Id  Ai Usage Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/oembed":{"get":{"tags":["embeds"],"summary":"Oembed","operationId":"oembed_api_oembed_get","parameters":[{"name":"url","in":"query","required":false,"schema":{"type":"string","default":"","title":"Url"}},{"name":"maxwidth","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Maxwidth"}},{"name":"maxheight","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Maxheight"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"json","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/preview.png":{"get":{"tags":["embeds"],"summary":"Preview Png","description":"1200×630 PNG card (Slack/Teams/LinkedIn/X need a raster og:image).","operationId":"preview_png_api_documents__doc_id__preview_png_get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}},{"name":"t","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/preview.svg":{"get":{"tags":["embeds"],"summary":"Preview Svg","description":"Full-fidelity vector preview (fine for browsers; unfurlers ignore SVG).","operationId":"preview_svg_api_documents__doc_id__preview_svg_get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}},{"name":"t","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/embed-links":{"get":{"tags":["embeds"],"summary":"List Embed Links","operationId":"list_embed_links_api_documents__doc_id__embed_links_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 List Embed Links Api Documents  Doc Id  Embed Links Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["embeds"],"summary":"Create Embed Link","operationId":"create_embed_link_api_documents__doc_id__embed_links_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/EmbedLinkBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Embed Link Api Documents  Doc Id  Embed Links Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/embed-links/{link_id}":{"delete":{"tags":["embeds"],"summary":"Revoke Embed Link","operationId":"revoke_embed_link_api_documents__doc_id__embed_links__link_id__delete","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}},{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Revoke Embed Link Api Documents  Doc Id  Embed Links  Link Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/embed/{doc_id}":{"get":{"tags":["embeds"],"summary":"Read Embedded","operationId":"read_embedded_api_embed__doc_id__get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}},{"name":"t","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/cloud-storage":{"get":{"tags":["integrations"],"summary":"Cloud Storage Overview","operationId":"cloud_storage_overview_api_integrations_cloud_storage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Cloud Storage Overview Api Integrations Cloud Storage Get"}}}}}}},"/api/documents/{doc_id}/sync":{"get":{"tags":["integrations"],"summary":"Board Sync Overview","operationId":"board_sync_overview_api_documents__doc_id__sync_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 Board Sync Overview Api Documents  Doc Id  Sync Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/google-drive/status":{"get":{"tags":["integrations"],"summary":"Google Drive Status","operationId":"google_drive_status_api_integrations_google_drive_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Google Drive Status Api Integrations Google Drive Status Get"}}}}}}},"/api/integrations/google-drive/connect":{"get":{"tags":["integrations"],"summary":"Google Drive Connect","operationId":"google_drive_connect_api_integrations_google_drive_connect_get","parameters":[{"name":"doc","in":"query","required":false,"schema":{"type":"string","default":"","title":"Doc"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/google-drive/callback":{"get":{"tags":["integrations"],"summary":"Google Drive Callback","operationId":"google_drive_callback_api_integrations_google_drive_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/google-drive/disconnect":{"post":{"tags":["integrations"],"summary":"Google Drive Disconnect","operationId":"google_drive_disconnect_api_integrations_google_drive_disconnect_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Google Drive Disconnect Api Integrations Google Drive Disconnect Post"}}}}}}},"/api/documents/{doc_id}/sync/google-drive":{"get":{"tags":["integrations"],"summary":"Board Sync Status Google Drive 0","operationId":"board_sync_status_google_drive_0_api_documents__doc_id__sync_google_drive_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 Board Sync Status Google Drive 0 Api Documents  Doc Id  Sync Google Drive Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["integrations"],"summary":"Board Sync Push Google Drive 0","operationId":"board_sync_push_google_drive_0_api_documents__doc_id__sync_google_drive_post","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 Board Sync Push Google Drive 0 Api Documents  Doc Id  Sync Google Drive Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["integrations"],"summary":"Board Sync Auto Google Drive 0","operationId":"board_sync_auto_google_drive_0_api_documents__doc_id__sync_google_drive_put","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoSyncBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Board Sync Auto Google Drive 0 Api Documents  Doc Id  Sync Google Drive Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/drive-sync":{"get":{"tags":["integrations"],"summary":"Board Sync Status Google Drive 1","operationId":"board_sync_status_google_drive_1_api_documents__doc_id__drive_sync_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 Board Sync Status Google Drive 1 Api Documents  Doc Id  Drive Sync Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["integrations"],"summary":"Board Sync Push Google Drive 1","operationId":"board_sync_push_google_drive_1_api_documents__doc_id__drive_sync_post","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 Board Sync Push Google Drive 1 Api Documents  Doc Id  Drive Sync Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["integrations"],"summary":"Board Sync Auto Google Drive 1","operationId":"board_sync_auto_google_drive_1_api_documents__doc_id__drive_sync_put","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoSyncBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Board Sync Auto Google Drive 1 Api Documents  Doc Id  Drive Sync Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/onedrive/status":{"get":{"tags":["integrations"],"summary":"Onedrive Status","operationId":"onedrive_status_api_integrations_onedrive_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Onedrive Status Api Integrations Onedrive Status Get"}}}}}}},"/api/integrations/onedrive/connect":{"get":{"tags":["integrations"],"summary":"Onedrive Connect","operationId":"onedrive_connect_api_integrations_onedrive_connect_get","parameters":[{"name":"doc","in":"query","required":false,"schema":{"type":"string","default":"","title":"Doc"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/onedrive/callback":{"get":{"tags":["integrations"],"summary":"Onedrive Callback","operationId":"onedrive_callback_api_integrations_onedrive_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/onedrive/disconnect":{"post":{"tags":["integrations"],"summary":"Onedrive Disconnect","operationId":"onedrive_disconnect_api_integrations_onedrive_disconnect_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Onedrive Disconnect Api Integrations Onedrive Disconnect Post"}}}}}}},"/api/documents/{doc_id}/sync/onedrive":{"get":{"tags":["integrations"],"summary":"Board Sync Status Onedrive 0","operationId":"board_sync_status_onedrive_0_api_documents__doc_id__sync_onedrive_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 Board Sync Status Onedrive 0 Api Documents  Doc Id  Sync Onedrive Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["integrations"],"summary":"Board Sync Push Onedrive 0","operationId":"board_sync_push_onedrive_0_api_documents__doc_id__sync_onedrive_post","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 Board Sync Push Onedrive 0 Api Documents  Doc Id  Sync Onedrive Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["integrations"],"summary":"Board Sync Auto Onedrive 0","operationId":"board_sync_auto_onedrive_0_api_documents__doc_id__sync_onedrive_put","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoSyncBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Board Sync Auto Onedrive 0 Api Documents  Doc Id  Sync Onedrive Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/dropbox/status":{"get":{"tags":["integrations"],"summary":"Dropbox Status","operationId":"dropbox_status_api_integrations_dropbox_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Dropbox Status Api Integrations Dropbox Status Get"}}}}}}},"/api/integrations/dropbox/connect":{"get":{"tags":["integrations"],"summary":"Dropbox Connect","operationId":"dropbox_connect_api_integrations_dropbox_connect_get","parameters":[{"name":"doc","in":"query","required":false,"schema":{"type":"string","default":"","title":"Doc"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/dropbox/callback":{"get":{"tags":["integrations"],"summary":"Dropbox Callback","operationId":"dropbox_callback_api_integrations_dropbox_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/dropbox/disconnect":{"post":{"tags":["integrations"],"summary":"Dropbox Disconnect","operationId":"dropbox_disconnect_api_integrations_dropbox_disconnect_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Dropbox Disconnect Api Integrations Dropbox Disconnect Post"}}}}}}},"/api/documents/{doc_id}/sync/dropbox":{"get":{"tags":["integrations"],"summary":"Board Sync Status Dropbox 0","operationId":"board_sync_status_dropbox_0_api_documents__doc_id__sync_dropbox_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 Board Sync Status Dropbox 0 Api Documents  Doc Id  Sync Dropbox Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["integrations"],"summary":"Board Sync Push Dropbox 0","operationId":"board_sync_push_dropbox_0_api_documents__doc_id__sync_dropbox_post","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 Board Sync Push Dropbox 0 Api Documents  Doc Id  Sync Dropbox Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["integrations"],"summary":"Board Sync Auto Dropbox 0","operationId":"board_sync_auto_dropbox_0_api_documents__doc_id__sync_dropbox_put","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoSyncBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Board Sync Auto Dropbox 0 Api Documents  Doc Id  Sync Dropbox Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks":{"get":{"tags":["webhooks"],"summary":"List Webhooks","operationId":"list_webhooks_api_webhooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Webhooks Api Webhooks Get"}}}}}},"post":{"tags":["webhooks"],"summary":"Create Webhook","operationId":"create_webhook_api_webhooks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Webhook Api Webhooks Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks/{sub_id}":{"patch":{"tags":["webhooks"],"summary":"Patch Webhook","operationId":"patch_webhook_api_webhooks__sub_id__patch","parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string","title":"Sub Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Webhook Api Webhooks  Sub Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["webhooks"],"summary":"Delete Webhook","operationId":"delete_webhook_api_webhooks__sub_id__delete","parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string","title":"Sub Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Webhook Api Webhooks  Sub Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks/{sub_id}/test":{"post":{"tags":["webhooks"],"summary":"Test Webhook","operationId":"test_webhook_api_webhooks__sub_id__test_post","parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string","title":"Sub Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Test Webhook Api Webhooks  Sub Id  Test Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks/{sub_id}/rotate-secret":{"post":{"tags":["webhooks"],"summary":"Rotate Secret","operationId":"rotate_secret_api_webhooks__sub_id__rotate_secret_post","parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string","title":"Sub Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Rotate Secret Api Webhooks  Sub Id  Rotate Secret Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks/{sub_id}/deliveries":{"get":{"tags":["webhooks"],"summary":"List Deliveries","operationId":"list_deliveries_api_webhooks__sub_id__deliveries_get","parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string","title":"Sub Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Deliveries Api Webhooks  Sub Id  Deliveries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me":{"get":{"tags":["v1"],"summary":"Who am I","description":"The authenticated identity. For an agent token: its id, name, effective\nscopes and its owner's public name (no email — least privilege).","operationId":"me_api_v1_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeOut"}}}}}}},"/api/v1/boards":{"get":{"tags":["v1"],"summary":"List boards","description":"Boards the caller can list (owned, shared with them, team) — newest\nfirst, cursor-paginated.","operationId":"list_boards_api_v1_boards_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"description":"Name substring filter.","title":"Q"},"description":"Name substring filter."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["v1"],"summary":"Create a board","description":"New PRIVATE board owned by the caller (an agent's boards belong to its\nowner). Free-plan board limits apply (402). Supports ``Idempotency-Key``.","operationId":"create_board_api_v1_boards_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardCreateIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/boards/{doc_id}":{"get":{"tags":["v1"],"summary":"Get a board","description":"Metadata + the editable diagram. The ``ETag`` header (also ``etag`` in\nthe body) is what ``If-Match`` on PATCH compares against.","operationId":"get_board_api_v1_boards__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":{"$ref":"#/components/schemas/BoardDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["v1"],"summary":"Update a board","description":"Rename / move, and/or change the diagram — either REPLACE it\n(``diagram``) or PATCH it (``ops``, atomic). Send ``If-Match: <etag>`` to\nget 412 instead of overwriting a collaborator's newer edit. A version\nsnapshot is kept on every diagram change.","operationId":"update_board_api_v1_boards__doc_id__patch","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardPatchIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["v1"],"summary":"Delete a board","description":"Owner (or team admin) only.","operationId":"delete_board_api_v1_boards__doc_id__delete","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/boards/{doc_id}/export.svg":{"get":{"tags":["v1"],"summary":"Export SVG","operationId":"export_board_svg_api_v1_boards__doc_id__export_svg_get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}},{"name":"fit","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"'content' crops to the shapes.","title":"Fit"},"description":"'content' crops to the shapes."}],"responses":{"200":{"description":"Successful Response","content":{"image/svg+xml":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/boards/{doc_id}/comments":{"get":{"tags":["v1"],"summary":"List comments","description":"Oldest first (roots and replies; replies carry ``parent_id``).","operationId":"list_board_comments_api_v1_boards__doc_id__comments_get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["v1"],"summary":"Add a comment","description":"Comment as the caller. Pin to ONE of node_id / edge_id / parent_id\n(reply) / a point (x, y). Open editors update live. Supports\n``Idempotency-Key``.","operationId":"create_board_comment_api_v1_boards__doc_id__comments_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/CommentCreateIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/games/leaderboard":{"get":{"summary":"Leaderboard","operationId":"leaderboard_api_games_leaderboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Leaderboard Api Games Leaderboard Get"}}}}}}},"/api/games/active":{"get":{"summary":"Active Games","description":"Live snapshot of ALL in-memory game rooms across the three games (for the\n'Playing now' panel). Each game keeps its own manager; we aggregate them here.\nLazy imports avoid any module-load cycle.","operationId":"active_games_api_games_active_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Active Games Api Games Active Get"}}}}}}},"/api/games/rooms/{room_id}/kill":{"post":{"summary":"Kill Room","description":"Close a game room. Allowed for the room HOST (via the host token handed\nto the creator, or their signed-in account) — a normal player gets 403. The\nops admin key is honored as an override.","operationId":"kill_room_api_games_rooms__room_id__kill_post","parameters":[{"name":"room_id","in":"path","required":true,"schema":{"type":"string","title":"Room Id"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}},{"name":"x-host-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Host-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Kill Room Api Games Rooms  Room Id  Kill Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/games/rooms/kill-all":{"post":{"summary":"Kill All Rooms","description":"Ops-only sweep of every live room (admin key required — never host).","operationId":"kill_all_rooms_api_games_rooms_kill_all_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Kill All Rooms Api Games Rooms Kill All Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/d/{doc_id}":{"get":{"summary":" Spa Document","operationId":"_spa_document_d__doc_id__get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/embed/{doc_id}":{"get":{"summary":" Spa Embed","description":"Read-only iframe view — the SPA hides all chrome for /embed/*.\nThis route is exempt from the frame-ancestors lockdown below.","operationId":"_spa_embed_embed__doc_id__get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/play/{room_id}":{"get":{"summary":" Spa Game","operationId":"_spa_game_play__room_id__get","parameters":[{"name":"room_id","in":"path","required":true,"schema":{"type":"string","title":"Room Id"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/play/{game_type}/{room_id}":{"get":{"summary":" Spa Game Typed","operationId":"_spa_game_typed_play__game_type___room_id__get","parameters":[{"name":"game_type","in":"path","required":true,"schema":{"type":"string","title":"Game Type"}},{"name":"room_id","in":"path","required":true,"schema":{"type":"string","title":"Room Id"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/reset-password":{"get":{"summary":" Spa Dash","operationId":"_spa_dash_reset_password_get","responses":{"200":{"description":"Successful Response"}}}},"/settings":{"get":{"summary":" Spa Dash","operationId":"_spa_dash_settings_get","responses":{"200":{"description":"Successful Response"}}}},"/games":{"get":{"summary":" Spa Dash","operationId":"_spa_dash_games_get","responses":{"200":{"description":"Successful Response"}}}},"/shared":{"get":{"summary":" Spa Dash","operationId":"_spa_dash_shared_get","responses":{"200":{"description":"Successful Response"}}}},"/templates":{"get":{"summary":" Spa Dash","operationId":"_spa_dash_templates_get","responses":{"200":{"description":"Successful Response"}}}},"/folder/{folder_id}":{"get":{"summary":" Spa Folder","operationId":"_spa_folder_folder__folder_id__get","parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AISettingsBody":{"properties":{"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"api_base":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Base"}},"type":"object","title":"AISettingsBody","description":"PUT /api/ai-settings. Omitted fields are left unchanged; a non-empty\n``api_key`` sets the BYOK key (stored obfuscated), empty/None keeps it.\n``model`` is the BYOK model override: ``\"\"`` clears back to the provider\ndefault, ``None`` keeps the current value."},"AutoSyncBody":{"properties":{"auto_sync":{"type":"boolean","title":"Auto Sync"}},"type":"object","required":["auto_sync"],"title":"AutoSyncBody"},"BoardCreateIn":{"properties":{"name":{"type":"string","maxLength":300,"minLength":1,"title":"Name"},"diagram":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Diagram","description":"{pages:[…]} or legacy {nodes,edges}"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}},"additionalProperties":false,"type":"object","required":["name"],"title":"BoardCreateIn"},"BoardDetailOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"url":{"type":"string","title":"Url"},"created_at":{"type":"string","title":"Created At","description":"ISO-8601 UTC"},"updated_at":{"type":"string","title":"Updated At","description":"ISO-8601 UTC"},"etag":{"type":"string","title":"Etag","description":"Opaque version tag; send as If-Match to update safely."},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"owner_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Id"},"team_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Id"},"link_policy":{"type":"string","title":"Link Policy","default":"private"},"my_role":{"type":"string","title":"My Role","description":"owner | editor | viewer"},"diagram":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Diagram","description":"Editable board JSON: {pages:[{id,name,nodes,edges}]}"}},"type":"object","required":["id","name","url","created_at","updated_at","etag","my_role"],"title":"BoardDetailOut"},"BoardListOut":{"properties":{"data":{"items":{"$ref":"#/components/schemas/BoardOut"},"type":"array","title":"Data"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Pass back as ?cursor= for the next page."}},"type":"object","required":["data"],"title":"BoardListOut"},"BoardOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"url":{"type":"string","title":"Url"},"created_at":{"type":"string","title":"Created At","description":"ISO-8601 UTC"},"updated_at":{"type":"string","title":"Updated At","description":"ISO-8601 UTC"},"etag":{"type":"string","title":"Etag","description":"Opaque version tag; send as If-Match to update safely."},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"owner_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Id"},"team_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Id"},"link_policy":{"type":"string","title":"Link Policy","default":"private"}},"type":"object","required":["id","name","url","created_at","updated_at","etag"],"title":"BoardOut"},"BoardPatchIn":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":300,"minLength":1},{"type":"null"}],"title":"Name"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id","description":"Move into a folder; null = root."},"diagram":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Diagram","description":"Replace the WHOLE diagram."},"ops":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Ops","description":"Patch instead of replace (atomic). Ops: {op:'add'|'update', node|edge:{id,…}}, {op:'delete', id}, {op:'add_page', page:{id,name}}, {op:'rename_page', page_id, name}; each may carry page_id (default: first page). update MERGES fields."}},"additionalProperties":false,"type":"object","title":"BoardPatchIn"},"Body_image_to_svg_api_ai_image_to_svg_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"prompt":{"type":"string","title":"Prompt","default":""},"backend":{"type":"string","title":"Backend","default":""}},"type":"object","required":["file"],"title":"Body_image_to_svg_api_ai_image_to_svg_post"},"Body_import_document_api_documents_import_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_import_document_api_documents_import_post"},"Body_submit_image_job_api_ai_jobs_image_to_svg_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"prompt":{"type":"string","title":"Prompt","default":""},"backend":{"type":"string","title":"Backend","default":""},"thumb":{"type":"string","title":"Thumb","default":""},"effort":{"type":"string","title":"Effort","default":""},"palette":{"type":"string","title":"Palette","default":"board"}},"type":"object","required":["file"],"title":"Body_submit_image_job_api_ai_jobs_image_to_svg_post"},"Body_upload_document_api_documents_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_document_api_documents_post"},"ByokProfileBody":{"properties":{"name":{"type":"string","title":"Name","default":""},"provider":{"type":"string","title":"Provider","default":"claude"},"api_key":{"type":"string","title":"Api Key","default":""},"model":{"type":"string","title":"Model","default":""},"api_base":{"type":"string","title":"Api Base","default":""}},"type":"object","title":"ByokProfileBody","description":"POST /api/ai-settings/byok. ``name`` ≤ 40 chars, ``provider`` ∈\nclaude|openai|gemini|openrouter|custom. The raw ``api_key`` is stored\nobfuscated and only ever echoed back masked."},"ByokProfilePatch":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"api_base":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Base"}},"type":"object","title":"ByokProfilePatch","description":"PATCH /api/ai-settings/byok/{id}. Omitted fields keep their value; a\nnon-empty ``api_key`` replaces the stored key. ``model``/``api_base`` clear\non ``\"\"`` and keep on ``None``."},"ChangePasswordBody":{"properties":{"current_password":{"type":"string","title":"Current Password"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["current_password","new_password"],"title":"ChangePasswordBody"},"CheckoutBody":{"properties":{"variant":{"type":"string","title":"Variant"},"seats":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seats"}},"type":"object","required":["variant"],"title":"CheckoutBody"},"CommentCreateIn":{"properties":{"body":{"type":"string","maxLength":5000,"minLength":1,"title":"Body"},"page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Id"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Reply to this root comment."},"node_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Node Id","description":"Pin to a node (follows it)."},"edge_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Edge Id","description":"Pin to an edge."},"x":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"X"},"y":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Y"},"mentions":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Mentions"}},"additionalProperties":false,"type":"object","required":["body"],"title":"CommentCreateIn"},"CommentIn":{"properties":{"body":{"type":"string","title":"Body"},"page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Id"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"},"anchor":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Anchor"},"mentions":{"items":{"type":"string"},"type":"array","title":"Mentions"},"guest_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guest Name"}},"type":"object","required":["body"],"title":"CommentIn"},"CommentListOut":{"properties":{"data":{"items":{"$ref":"#/components/schemas/CommentOut"},"type":"array","title":"Data"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["data"],"title":"CommentListOut"},"CommentOut":{"properties":{"id":{"type":"string","title":"Id"},"body":{"type":"string","title":"Body"},"author_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Id"},"author_name":{"type":"string","title":"Author Name"},"author_color":{"type":"string","title":"Author Color"},"page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Id"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"},"anchor":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Anchor"},"mentions":{"items":{"type":"string"},"type":"array","title":"Mentions"},"resolved":{"type":"boolean","title":"Resolved"},"created_at":{"type":"number","title":"Created At"},"updated_at":{"type":"number","title":"Updated At"}},"type":"object","required":["id","body","author_id","author_name","author_color","page_id","parent_id","anchor","mentions","resolved","created_at","updated_at"],"title":"CommentOut"},"CommentPatch":{"properties":{"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"},"resolved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Resolved"}},"type":"object","title":"CommentPatch"},"CommentsOut":{"properties":{"comments":{"items":{"$ref":"#/components/schemas/CommentOut"},"type":"array","title":"Comments"},"people":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"People"}},"type":"object","required":["comments"],"title":"CommentsOut"},"ConfirmResetBody":{"properties":{"token":{"type":"string","title":"Token"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["token","new_password"],"title":"ConfirmResetBody"},"CreateBody":{"properties":{"kind":{"type":"string","enum":["generic","slack","teams"],"title":"Kind"},"url":{"type":"string","maxLength":2048,"title":"Url"},"events":{"items":{"type":"string"},"type":"array","maxItems":7,"title":"Events"},"name":{"type":"string","maxLength":120,"title":"Name","default":""},"team_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Team Id"}},"type":"object","required":["kind","url","events"],"title":"CreateBody"},"CreateDocBody":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Name"},"svg":{"anyOf":[{"type":"string","maxLength":15000000},{"type":"null"}],"title":"Svg"},"diagram":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Diagram"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}},"type":"object","title":"CreateDocBody","description":"Request body for POST /api/documents/new (blank board / template / AI)."},"DiagramBody":{"properties":{"text":{"type":"string","title":"Text"},"format":{"type":"string","enum":["text","mermaid"],"title":"Format","default":"text"},"effort":{"type":"string","title":"Effort","default":""},"backend":{"type":"string","title":"Backend","default":""},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image"},"palette":{"type":"string","title":"Palette","default":"board"},"doc_id":{"type":"string","title":"Doc Id","default":""}},"type":"object","required":["text"],"title":"DiagramBody","description":"Request body for POST /api/ai/text-to-diagram."},"DocMeta":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"created_at":{"type":"number","title":"Created At"},"updated_at":{"type":"number","title":"Updated At"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"owner_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Id"},"team_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Id"},"link_policy":{"type":"string","title":"Link Policy","default":"private"}},"type":"object","required":["id","name","created_at","updated_at"],"title":"DocMeta","description":"Document metadata as returned to clients."},"DocumentOut":{"properties":{"meta":{"$ref":"#/components/schemas/DocMeta"},"svg":{"type":"string","title":"Svg"},"diagram":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Diagram"},"my_role":{"type":"string","title":"My Role","default":"editor"},"owner":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Owner"}},"type":"object","required":["meta","svg"],"title":"DocumentOut","description":"Full document (metadata + sanitized SVG + optional editable diagram).\n\n``my_role`` is the CALLER's effective role (owner|editor|viewer) so the\nfrontend can lock the UI without re-deriving ACLs client-side.\n``owner`` is the board owner's public profile ({id,name,color,avatar,…})\nso the editor can show a subtle \"Owned by …\" chip to every viewer."},"EditDiagramBody":{"properties":{"instruction":{"type":"string","title":"Instruction"},"diagram":{"additionalProperties":true,"type":"object","title":"Diagram"},"history":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"History","default":[]},"mode":{"type":"string","enum":["edit","ask"],"title":"Mode","default":"edit"},"palette":{"type":"string","title":"Palette","default":"board"},"doc_id":{"type":"string","title":"Doc Id","default":""},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image"}},"type":"object","required":["instruction","diagram"],"title":"EditDiagramBody","description":"Request body for POST /api/ai/edit-diagram (live co-editing).\n\n``history`` is the recent conversation (role user|assistant, text only —\nthe CURRENT diagram is always sent fresh, never stale snapshots), so\nfollow-ups like \"change it to blue\" resolve their referents."},"EmbedLinkBody":{"properties":{"expires_in_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires In Days"},"label":{"type":"string","title":"Label","default":""}},"type":"object","title":"EmbedLinkBody"},"FolderBody":{"properties":{"name":{"type":"string","title":"Name"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"}},"type":"object","required":["name"],"title":"FolderBody","description":"Request body for POST/PATCH /api/folders."},"FolderOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"color":{"type":"string","title":"Color"},"created_at":{"type":"number","title":"Created At"},"count":{"type":"integer","title":"Count","default":0}},"type":"object","required":["id","name","color","created_at"],"title":"FolderOut","description":"Folder as returned to clients (with live document count)."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LoginBody":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginBody"},"MeOut":{"properties":{"kind":{"type":"string","title":"Kind","description":"user | agent"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes"},"owner":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Owner"}},"type":"object","required":["kind"],"title":"MeOut"},"MemberBody":{"properties":{"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role","default":"member"}},"type":"object","required":["email"],"title":"MemberBody"},"PatchBody":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Name"},"events":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":7},{"type":"null"}],"title":"Events"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Url"}},"type":"object","title":"PatchBody"},"PatchDocBody":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"link_policy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link Policy"},"team_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Id"}},"type":"object","title":"PatchDocBody","description":"PATCH /api/documents/{id}: rename/move (\"edit\") + sharing knobs (\"manage\")."},"ProfileBody":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar"}},"type":"object","title":"ProfileBody","description":"PATCH /api/me. ``avatar`` is tri-state: omitted → keep, ``null`` →\nremove, string → data:image/(png|jpeg|webp);base64 URL (validated in the\nservice). ``title`` is the user-card job title (≤ 80 chars)."},"RegisterBody":{"properties":{"email":{"type":"string","title":"Email"},"name":{"type":"string","title":"Name","default":""},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"RegisterBody"},"RequestResetBody":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"RequestResetBody"},"SaveBody":{"properties":{"svg":{"type":"string","maxLength":15000000,"title":"Svg"},"diagram":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Diagram"}},"type":"object","required":["svg"],"title":"SaveBody","description":"Request body for PUT /api/documents/{id}.\n\n``diagram`` semantics: omitted → keep stored; null → clear; object → replace."},"ShareBody":{"properties":{"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role","default":"editor"}},"type":"object","required":["email"],"title":"ShareBody"},"SvgOut":{"properties":{"svg":{"type":"string","title":"Svg"}},"type":"object","required":["svg"],"title":"SvgOut","description":"Response for POST /api/ai/image-to-svg."},"TeamBody":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"TeamBody"},"TokenBody":{"properties":{"name":{"type":"string","title":"Name"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes","default":["boards:read","boards:write","comments:read","comments:write"]},"expires_in_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires In Days"}},"type":"object","required":["name"],"title":"TokenBody"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}