openapi: 3.1.0 info: title: Internal Trilium API version: 0.99.3 description: | This is the internal API used by the Trilium Notes client application. **Important:** This API is primarily intended for internal use by the Trilium client. For external integrations, please use the [ETAPI (External Trilium API)](https://github.com/TriliumNext/Trilium/blob/main/docs/User%20Guide/User%20Guide/Advanced%20Usage/ETAPI%20(REST%20API).md#etapi-rest-api) instead. ## Authentication Most endpoints require session-based authentication. You can authenticate using: - **Password login**: POST to `/api/login` with password - **Token authentication**: Generate a token via `/api/login/token` - **Sync authentication**: Use document secret for sync operations ## Rate Limiting Authentication endpoints are rate-limited to prevent brute force attacks. ## CSRF Protection State-changing operations require CSRF tokens when using session authentication. contact: name: Trilium Notes Team email: contact@eliandoran.me url: https://triliumnotes.org license: name: GNU Affero General Public License v3.0 only url: https://www.gnu.org/licenses/agpl-3.0.en.html servers: - url: http://localhost:8080 description: Default local server - url: https://your-trilium-server.com description: Your Trilium server tags: - name: Authentication description: Login, logout, and session management - name: Notes description: Core note operations - name: Tree description: Note tree structure and branches - name: Attributes description: Note attributes and metadata - name: Attachments description: File attachments - name: Revisions description: Note revision history - name: Search description: Search and discovery - name: Import/Export description: Import and export operations - name: Sync description: Synchronization between instances - name: Scripting description: Script execution and automation - name: Configuration description: System options and settings - name: Database description: Database operations - name: LLM description: AI/LLM integration - name: Security description: Security features (2FA, tokens) - name: Special Notes description: Special note types (calendar, inbox) - name: Visualization description: Maps and visualizations - name: External description: External integrations (clipper, sender) - name: Utilities description: Miscellaneous utilities security: - sessionAuth: [] - tokenAuth: [] paths: # Authentication endpoints /api/login: post: tags: [Authentication] summary: Login with password operationId: login security: [] requestBody: required: true content: application/x-www-form-urlencoded: schema: type: object required: [password] properties: password: type: string format: password totpToken: type: string description: TOTP token if 2FA is enabled responses: '200': description: Login successful headers: Set-Cookie: schema: type: string example: trilium.sid=s%3A... '401': description: Invalid credentials or TOTP token /api/login/token: post: tags: [Authentication] summary: Generate API token operationId: generateToken security: [] requestBody: required: true content: application/json: schema: type: object required: [password] properties: password: type: string format: password tokenName: type: string description: Optional name for the token responses: '201': description: Token created content: application/json: schema: type: object properties: authToken: type: string description: API authentication token /api/login/sync: post: tags: [Authentication, Sync] summary: Sync login using document secret operationId: loginSync security: [] requestBody: required: true content: application/json: schema: type: object required: [timestamp, hash, syncVersion] properties: timestamp: type: string format: date-time hash: type: string description: HMAC hash of document secret and timestamp syncVersion: type: integer responses: '200': description: Login successful content: application/json: schema: type: object properties: instanceId: type: string maxEntityChangeId: type: string /api/login/protected: post: tags: [Authentication, Security] summary: Enter protected session operationId: enterProtectedSession requestBody: required: true content: application/json: schema: type: object required: [password] properties: password: type: string format: password responses: '200': description: Protected session entered '401': description: Invalid password /api/logout/protected: post: tags: [Authentication, Security] summary: Exit protected session operationId: exitProtectedSession responses: '204': description: Protected session exited /api/login/protected/touch: post: tags: [Authentication, Security] summary: Keep protected session alive operationId: touchProtectedSession responses: '204': description: Session refreshed # OAuth endpoints /api/oauth/status: get: tags: [Authentication] summary: Get OAuth status operationId: getOAuthStatus responses: '200': description: OAuth status content: application/json: schema: type: object properties: enabled: type: boolean configured: type: boolean providers: type: array items: type: string /api/oauth/validate: get: tags: [Authentication] summary: Validate OAuth configuration operationId: validateOAuth responses: '200': description: OAuth validation result content: application/json: schema: type: object properties: valid: type: boolean errors: type: array items: type: string # App Info /api/app-info: get: tags: [Configuration] summary: Get application information operationId: getAppInfo responses: '200': description: Application information content: application/json: schema: $ref: '#/components/schemas/AppInfo' # Setup endpoints /api/setup/status: get: tags: [Configuration] summary: Get setup status operationId: getSetupStatus security: [] responses: '200': description: Setup status content: application/json: schema: type: object properties: isInitialized: type: boolean schemaExists: type: boolean syncVersion: type: integer /api/setup/new-document: post: tags: [Configuration] summary: Initialize new document operationId: initNewDocument security: [] requestBody: required: true content: application/json: schema: type: object required: [password] properties: password: type: string format: password theme: type: string responses: '201': description: Document initialized /api/setup/sync-from-server: post: tags: [Configuration, Sync] summary: Setup sync from server operationId: setupSyncFromServer security: [] requestBody: required: true content: application/json: schema: type: object required: [syncServerHost, password] properties: syncServerHost: type: string format: uri syncProxy: type: string password: type: string format: password responses: '200': description: Sync setup successful /api/setup/sync-seed: get: tags: [Configuration, Sync] summary: Get sync seed for setup operationId: getSyncSeed security: [] responses: '200': description: Sync seed information content: application/json: schema: type: object properties: syncVersion: type: integer schemaVersion: type: integer documentSecret: type: string maxSyncId: type: integer # Note operations /api/notes/{noteId}: get: tags: [Notes] summary: Get note metadata operationId: getNote parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: Note metadata content: application/json: schema: $ref: '#/components/schemas/Note' '404': description: Note not found delete: tags: [Notes] summary: Delete note operationId: deleteNote parameters: - $ref: '#/components/parameters/noteId' - name: taskId in: query required: true schema: type: string - name: eraseNotes in: query schema: type: boolean default: false - name: last in: query required: true schema: type: boolean responses: '204': description: Note deleted '404': description: Note not found /api/notes/{noteId}/blob: get: tags: [Notes] summary: Get note content operationId: getNoteContent parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: Note content content: text/html: schema: type: string text/plain: schema: type: string application/json: schema: type: object application/octet-stream: schema: type: string format: binary '404': description: Note not found /api/notes/{noteId}/data: put: tags: [Notes] summary: Update note content operationId: updateNoteContent parameters: - $ref: '#/components/parameters/noteId' requestBody: required: true content: application/json: schema: type: object required: [content] properties: content: type: string attachments: type: array items: $ref: '#/components/schemas/Attachment' responses: '204': description: Content updated '404': description: Note not found /api/notes/{noteId}/metadata: get: tags: [Notes] summary: Get note timestamps operationId: getNoteMetadata parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: Note timestamps content: application/json: schema: $ref: '#/components/schemas/Timestamps' '404': description: Note not found /api/notes/{noteId}/title: put: tags: [Notes] summary: Change note title operationId: updateNoteTitle parameters: - $ref: '#/components/parameters/noteId' requestBody: required: true content: application/json: schema: type: object required: [title] properties: title: type: string responses: '204': description: Title updated '404': description: Note not found /api/notes/{noteId}/type: put: tags: [Notes] summary: Change note type and MIME operationId: updateNoteType parameters: - $ref: '#/components/parameters/noteId' requestBody: required: true content: application/json: schema: type: object required: [type, mime] properties: type: $ref: '#/components/schemas/NoteType' mime: type: string responses: '204': description: Type updated '404': description: Note not found /api/notes/{noteId}/protect/{isProtected}: put: tags: [Notes, Security] summary: Protect or unprotect note operationId: protectNote parameters: - $ref: '#/components/parameters/noteId' - name: isProtected in: path required: true schema: type: boolean - name: subtree in: query schema: type: boolean default: false responses: '204': description: Protection status updated '404': description: Note not found /api/notes/{noteId}/undelete: put: tags: [Notes] summary: Undelete note operationId: undeleteNote parameters: - $ref: '#/components/parameters/noteId' responses: '204': description: Note undeleted '404': description: Note not found /api/notes/{parentNoteId}/children: post: tags: [Notes, Tree] summary: Create new note operationId: createNote parameters: - name: parentNoteId in: path required: true schema: type: string - name: target in: query schema: type: string enum: [after, into] - name: targetBranchId in: query schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateNoteRequest' responses: '201': description: Note created content: application/json: schema: type: object properties: note: $ref: '#/components/schemas/Note' branch: $ref: '#/components/schemas/Branch' /api/notes/{noteId}/duplicate/{parentNoteId}: post: tags: [Notes, Tree] summary: Duplicate note subtree operationId: duplicateNote parameters: - $ref: '#/components/parameters/noteId' - name: parentNoteId in: path required: true schema: type: string responses: '201': description: Note duplicated content: application/json: schema: $ref: '#/components/schemas/Note' /api/notes/{noteId}/revision: post: tags: [Notes, Revisions] summary: Force save revision operationId: saveRevision parameters: - $ref: '#/components/parameters/noteId' responses: '201': description: Revision saved content: application/json: schema: $ref: '#/components/schemas/Revision' /api/notes/{noteId}/sort-children: put: tags: [Notes, Tree] summary: Sort child notes operationId: sortChildren parameters: - $ref: '#/components/parameters/noteId' requestBody: required: true content: application/json: schema: type: object properties: sortBy: type: string enum: [title, dateCreated, dateModified] sortDirection: type: string enum: [asc, desc] foldersFirst: type: boolean sortNatural: type: boolean sortLocale: type: string responses: '204': description: Children sorted /api/notes/{noteId}/convert-to-attachment: post: tags: [Notes, Attachments] summary: Convert note to attachment operationId: convertToAttachment parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: Note converted to attachment content: application/json: schema: $ref: '#/components/schemas/Attachment' # File operations /api/notes/{noteId}/file: put: tags: [Notes] summary: Upload file to note operationId: uploadFileToNote parameters: - $ref: '#/components/parameters/noteId' requestBody: required: true content: multipart/form-data: schema: type: object properties: upload: type: string format: binary responses: '204': description: File uploaded /api/notes/{noteId}/open: get: tags: [Notes] summary: Open file note operationId: openFileNote parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: File content content: application/octet-stream: schema: type: string format: binary /api/notes/download/{noteId}: get: tags: [Notes] summary: Download file note operationId: downloadFileNote parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: File content headers: Content-Disposition: schema: type: string example: attachment; filename="document.pdf" content: application/octet-stream: schema: type: string format: binary /api/notes/{noteId}/download: get: tags: [Notes] summary: Download file note (alternative path) operationId: downloadFileNoteAlt parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: File content headers: Content-Disposition: schema: type: string example: attachment; filename="document.pdf" content: application/octet-stream: schema: type: string format: binary /api/attachments/{attachmentId}/open-partial: get: tags: [Attachments] summary: Stream file with partial content support operationId: openPartialFileAttachment parameters: - name: attachmentId in: path required: true schema: type: string - name: Range in: header schema: type: string example: bytes=0-1023 responses: '206': description: Partial content headers: Content-Range: schema: type: string example: bytes 0-1023/146515 content: application/octet-stream: schema: type: string format: binary /api/notes/{noteId}/save-to-tmp-dir: post: tags: [Notes] summary: Save note to temp directory operationId: saveToTmpDir parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: File saved to temp directory content: application/json: schema: type: object properties: filePath: type: string /api/notes/{noteId}/upload-modified-file: post: tags: [Notes] summary: Update note from modified temp file operationId: uploadModifiedFile parameters: - $ref: '#/components/parameters/noteId' requestBody: required: true content: application/json: schema: type: object required: [filePath] properties: filePath: type: string responses: '204': description: Note updated from file # Tree and branch operations /api/tree: get: tags: [Tree] summary: Get tree structure operationId: getTree parameters: - name: subTreeNoteId in: query schema: type: string description: Limit tree to this note and descendants responses: '200': description: Tree structure content: application/json: schema: type: object properties: notes: type: array items: $ref: '#/components/schemas/Note' branches: type: array items: $ref: '#/components/schemas/Branch' attributes: type: array items: $ref: '#/components/schemas/Attribute' /api/tree/load: post: tags: [Tree] summary: Load specific notes operationId: loadNotes requestBody: required: true content: application/json: schema: type: object required: [noteIds] properties: noteIds: type: array items: type: string responses: '200': description: Loaded notes content: application/json: schema: type: object properties: notes: type: array items: $ref: '#/components/schemas/Note' branches: type: array items: $ref: '#/components/schemas/Branch' attributes: type: array items: $ref: '#/components/schemas/Attribute' /api/branches/{branchId}: delete: tags: [Tree] summary: Delete branch operationId: deleteBranch parameters: - name: branchId in: path required: true schema: type: string - name: taskId in: query required: true schema: type: string - name: eraseNotes in: query schema: type: boolean - name: last in: query required: true schema: type: boolean responses: '200': description: Branch deleted content: application/json: schema: type: object properties: noteDeleted: type: boolean /api/branches/{branchId}/move-to/{parentBranchId}: put: tags: [Tree] summary: Move branch to new parent operationId: moveBranchToParent parameters: - name: branchId in: path required: true schema: type: string - name: parentBranchId in: path required: true schema: type: string responses: '204': description: Branch moved /api/branches/{branchId}/move-before/{beforeBranchId}: put: tags: [Tree] summary: Move branch before another operationId: moveBranchBefore parameters: - name: branchId in: path required: true schema: type: string - name: beforeBranchId in: path required: true schema: type: string responses: '204': description: Branch moved /api/branches/{branchId}/move-after/{afterBranchId}: put: tags: [Tree] summary: Move branch after another operationId: moveBranchAfter parameters: - name: branchId in: path required: true schema: type: string - name: afterBranchId in: path required: true schema: type: string responses: '204': description: Branch moved /api/branches/{branchId}/expanded/{expanded}: put: tags: [Tree] summary: Set branch expanded state operationId: setBranchExpanded parameters: - name: branchId in: path required: true schema: type: string - name: expanded in: path required: true schema: type: boolean responses: '204': description: Expanded state updated /api/branches/{branchId}/expanded-subtree/{expanded}: put: tags: [Tree] summary: Set subtree expanded state operationId: setSubtreeExpanded parameters: - name: branchId in: path required: true schema: type: string - name: expanded in: path required: true schema: type: boolean responses: '204': description: Subtree expanded state updated /api/branches/{branchId}/set-prefix: put: tags: [Tree] summary: Set branch prefix operationId: setBranchPrefix parameters: - name: branchId in: path required: true schema: type: string requestBody: required: true content: application/json: schema: type: object properties: prefix: type: string nullable: true responses: '204': description: Prefix updated # Cloning operations /api/notes/{noteId}/clone-to-branch/{parentBranchId}: put: tags: [Tree, Notes] summary: Clone note to branch operationId: cloneToBranch parameters: - $ref: '#/components/parameters/noteId' - name: parentBranchId in: path required: true schema: type: string responses: '200': description: Note cloned content: application/json: schema: $ref: '#/components/schemas/Branch' /api/notes/{noteId}/clone-to-note/{parentNoteId}: put: tags: [Tree, Notes] summary: Clone note to parent note operationId: cloneToNote parameters: - $ref: '#/components/parameters/noteId' - name: parentNoteId in: path required: true schema: type: string responses: '200': description: Note cloned content: application/json: schema: $ref: '#/components/schemas/Branch' /api/notes/{noteId}/clone-after/{afterBranchId}: put: tags: [Tree, Notes] summary: Clone note after branch operationId: cloneAfterBranch parameters: - $ref: '#/components/parameters/noteId' - name: afterBranchId in: path required: true schema: type: string responses: '200': description: Note cloned content: application/json: schema: $ref: '#/components/schemas/Branch' /api/notes/{noteId}/toggle-in-parent/{parentNoteId}/{present}: put: tags: [Tree, Notes] summary: Toggle note presence in parent operationId: toggleInParent parameters: - $ref: '#/components/parameters/noteId' - name: parentNoteId in: path required: true schema: type: string - name: present in: path required: true schema: type: boolean responses: '204': description: Presence toggled # Attributes /api/notes/{noteId}/attributes: get: tags: [Attributes] summary: Get effective note attributes operationId: getNoteAttributes parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: Note attributes content: application/json: schema: type: array items: $ref: '#/components/schemas/Attribute' post: tags: [Attributes] summary: Add note attribute operationId: addNoteAttribute parameters: - $ref: '#/components/parameters/noteId' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Attribute' responses: '201': description: Attribute added content: application/json: schema: $ref: '#/components/schemas/Attribute' put: tags: [Attributes] summary: Update all note attributes operationId: updateNoteAttributes parameters: - $ref: '#/components/parameters/noteId' requestBody: required: true content: application/json: schema: type: array items: $ref: '#/components/schemas/Attribute' responses: '204': description: Attributes updated /api/notes/{noteId}/attributes/{attributeId}: delete: tags: [Attributes] summary: Delete attribute operationId: deleteAttribute parameters: - $ref: '#/components/parameters/noteId' - name: attributeId in: path required: true schema: type: string responses: '204': description: Attribute deleted /api/notes/{noteId}/attribute: put: tags: [Attributes] summary: Update single attribute operationId: updateAttribute parameters: - $ref: '#/components/parameters/noteId' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Attribute' responses: '204': description: Attribute updated /api/notes/{noteId}/set-attribute: put: tags: [Attributes] summary: Set attribute value operationId: setAttribute parameters: - $ref: '#/components/parameters/noteId' requestBody: required: true content: application/json: schema: type: object required: [type, name, value] properties: type: type: string enum: [label, relation] name: type: string value: type: string responses: '204': description: Attribute set /api/notes/{noteId}/relations/{name}/to/{targetNoteId}: put: tags: [Attributes] summary: Create relation operationId: createRelation parameters: - $ref: '#/components/parameters/noteId' - name: name in: path required: true schema: type: string - name: targetNoteId in: path required: true schema: type: string responses: '204': description: Relation created delete: tags: [Attributes] summary: Delete relation operationId: deleteRelation parameters: - $ref: '#/components/parameters/noteId' - name: name in: path required: true schema: type: string - name: targetNoteId in: path required: true schema: type: string responses: '204': description: Relation deleted /api/attribute-names: get: tags: [Attributes] summary: Get attribute name suggestions operationId: getAttributeNames parameters: - name: type in: query required: true schema: type: string enum: [label, relation] - name: query in: query schema: type: string responses: '200': description: Attribute names content: application/json: schema: type: array items: type: string /api/attribute-values/{attributeName}: get: tags: [Attributes] summary: Get values for attribute operationId: getAttributeValues parameters: - name: attributeName in: path required: true schema: type: string responses: '200': description: Attribute values content: application/json: schema: type: array items: type: string # Attachments /api/notes/{noteId}/attachments: get: tags: [Attachments] summary: Get note attachments operationId: getNoteAttachments parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: Note attachments content: application/json: schema: type: array items: $ref: '#/components/schemas/Attachment' post: tags: [Attachments] summary: Save attachment operationId: saveAttachment parameters: - $ref: '#/components/parameters/noteId' - name: matchBy in: query schema: type: string enum: [attachmentId, title] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Attachment' responses: '201': description: Attachment saved content: application/json: schema: $ref: '#/components/schemas/Attachment' /api/notes/{noteId}/attachments/upload: post: tags: [Attachments] summary: Upload attachment file operationId: uploadAttachment parameters: - $ref: '#/components/parameters/noteId' requestBody: required: true content: multipart/form-data: schema: type: object properties: upload: type: string format: binary responses: '201': description: Attachment uploaded content: application/json: schema: $ref: '#/components/schemas/Attachment' /api/attachments/{attachmentId}: get: tags: [Attachments] summary: Get attachment metadata operationId: getAttachment parameters: - name: attachmentId in: path required: true schema: type: string responses: '200': description: Attachment metadata content: application/json: schema: $ref: '#/components/schemas/Attachment' delete: tags: [Attachments] summary: Delete attachment operationId: deleteAttachment parameters: - name: attachmentId in: path required: true schema: type: string responses: '204': description: Attachment deleted /api/attachments/{attachmentId}/blob: get: tags: [Attachments] summary: Get attachment content operationId: getAttachmentBlob parameters: - name: attachmentId in: path required: true schema: type: string - name: preview in: query schema: type: boolean responses: '200': description: Attachment content content: application/octet-stream: schema: type: string format: binary /api/attachments/{attachmentId}/rename: put: tags: [Attachments] summary: Rename attachment operationId: renameAttachment parameters: - name: attachmentId in: path required: true schema: type: string requestBody: required: true content: application/json: schema: type: object required: [title] properties: title: type: string responses: '204': description: Attachment renamed /api/attachments/{attachmentId}/convert-to-note: post: tags: [Attachments, Notes] summary: Convert attachment to note operationId: convertAttachmentToNote parameters: - name: attachmentId in: path required: true schema: type: string responses: '200': description: Attachment converted to note content: application/json: schema: $ref: '#/components/schemas/Note' /api/attachments/{attachmentId}/file: put: tags: [Attachments] summary: Update attachment file operationId: updateAttachmentFile parameters: - name: attachmentId in: path required: true schema: type: string requestBody: required: true content: multipart/form-data: schema: type: object properties: upload: type: string format: binary responses: '204': description: Attachment file updated /api/attachments/{attachmentId}/open: get: tags: [Attachments] summary: Open attachment operationId: openAttachment parameters: - name: attachmentId in: path required: true schema: type: string responses: '200': description: Attachment content content: application/octet-stream: schema: type: string format: binary /api/attachments/download/{attachmentId}: get: tags: [Attachments] summary: Download attachment operationId: downloadAttachment parameters: - name: attachmentId in: path required: true schema: type: string responses: '200': description: Attachment content headers: Content-Disposition: schema: type: string example: attachment; filename="document.pdf" content: application/octet-stream: schema: type: string format: binary /api/attachments/{attachmentId}/download: get: tags: [Attachments] summary: Download attachment (alternative path) operationId: downloadAttachmentAlt parameters: - name: attachmentId in: path required: true schema: type: string responses: '200': description: Attachment content headers: Content-Disposition: schema: type: string example: attachment; filename="document.pdf" content: application/octet-stream: schema: type: string format: binary /api/attachments/{attachmentId}/all: get: tags: [Attachments] summary: Get all attachment information operationId: getAllAttachmentInfo parameters: - name: attachmentId in: path required: true schema: type: string responses: '200': description: Complete attachment information content: application/json: schema: type: object properties: attachmentId: type: string title: type: string mime: type: string isProtected: type: boolean position: type: integer contentLength: type: integer ownerId: type: string dateCreated: type: string format: date-time dateModified: type: string format: date-time /api/attachments/{attachmentId}/save-to-tmp-dir: post: tags: [Attachments] summary: Save attachment to temporary directory operationId: saveAttachmentToTmpDir parameters: - name: attachmentId in: path required: true schema: type: string responses: '200': description: Attachment saved to temporary directory content: application/json: schema: type: object properties: tmpPath: type: string description: Path to temporary file success: type: boolean /api/attachments/{attachmentId}/upload-modified-file: post: tags: [Attachments] summary: Upload modified attachment file operationId: uploadModifiedAttachmentFile parameters: - name: attachmentId in: path required: true schema: type: string requestBody: required: true content: multipart/form-data: schema: type: object properties: upload: type: string format: binary responses: '200': description: Modified file uploaded content: application/json: schema: type: object properties: success: type: boolean # Revisions /api/notes/{noteId}/revisions: get: tags: [Revisions] summary: Get note revisions operationId: getNoteRevisions parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: Note revisions content: application/json: schema: type: array items: $ref: '#/components/schemas/Revision' delete: tags: [Revisions] summary: Erase all note revisions operationId: eraseNoteRevisions parameters: - $ref: '#/components/parameters/noteId' responses: '204': description: Revisions erased /api/revisions/{revisionId}: get: tags: [Revisions] summary: Get revision details operationId: getRevision parameters: - name: revisionId in: path required: true schema: type: string responses: '200': description: Revision details content: application/json: schema: $ref: '#/components/schemas/Revision' delete: tags: [Revisions] summary: Erase revision operationId: eraseRevision parameters: - name: revisionId in: path required: true schema: type: string responses: '204': description: Revision erased /api/revisions/{revisionId}/blob: get: tags: [Revisions] summary: Get revision content operationId: getRevisionBlob parameters: - name: revisionId in: path required: true schema: type: string - name: preview in: query schema: type: boolean responses: '200': description: Revision content content: text/html: schema: type: string text/plain: schema: type: string application/octet-stream: schema: type: string format: binary /api/revisions/{revisionId}/restore: post: tags: [Revisions, Notes] summary: Restore revision operationId: restoreRevision parameters: - name: revisionId in: path required: true schema: type: string responses: '200': description: Revision restored content: application/json: schema: $ref: '#/components/schemas/Note' /api/revisions/{revisionId}/download: get: tags: [Revisions] summary: Download revision operationId: downloadRevision parameters: - name: revisionId in: path required: true schema: type: string responses: '200': description: Revision content headers: Content-Disposition: schema: type: string content: application/octet-stream: schema: type: string format: binary /api/revisions/erase-all-excess-revisions: post: tags: [Revisions] summary: Cleanup old revisions operationId: eraseExcessRevisions responses: '204': description: Excess revisions erased /api/edited-notes/{date}: get: tags: [Revisions] summary: Get notes edited on date operationId: getEditedNotes parameters: - name: date in: path required: true schema: type: string format: date example: '2024-01-15' responses: '200': description: Edited notes content: application/json: schema: type: array items: $ref: '#/components/schemas/Note' # Search /api/search/{searchString}: get: tags: [Search] summary: Full text search operationId: search parameters: - name: searchString in: path required: true schema: type: string responses: '200': description: Search results content: application/json: schema: type: array items: $ref: '#/components/schemas/SearchResult' /api/quick-search/{searchString}: get: tags: [Search] summary: Quick search with highlighting operationId: quickSearch parameters: - name: searchString in: path required: true schema: type: string responses: '200': description: Quick search results content: application/json: schema: type: array items: $ref: '#/components/schemas/SearchResult' /api/search-note/{noteId}: get: tags: [Search] summary: Execute search note operationId: executeSearchNote parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: Search results content: application/json: schema: type: array items: $ref: '#/components/schemas/SearchResult' /api/search-and-execute-note/{noteId}: post: tags: [Search, Scripting] summary: Search and execute actions operationId: searchAndExecute parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: Execution results /api/search-related: post: tags: [Search] summary: Find related notes by attributes operationId: searchRelated requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Attribute' responses: '200': description: Related notes content: application/json: schema: type: array items: $ref: '#/components/schemas/Note' /api/search-templates: get: tags: [Search] summary: Search template notes operationId: searchTemplates responses: '200': description: Template notes content: application/json: schema: type: array items: $ref: '#/components/schemas/Note' /api/autocomplete: get: tags: [Search] summary: Get autocomplete suggestions operationId: autocomplete parameters: - name: query in: query required: true schema: type: string - name: fastSearch in: query schema: type: boolean - name: activeNoteId in: query schema: type: string responses: '200': description: Autocomplete suggestions content: application/json: schema: type: array items: type: object properties: noteId: type: string title: type: string path: type: string /api/autocomplete/notesCount: get: tags: [Search] summary: Get total notes count operationId: getNotesCount responses: '200': description: Notes count content: application/json: schema: type: object properties: count: type: integer /api/similar-notes/{noteId}: get: tags: [Search] summary: Find similar notes operationId: findSimilarNotes parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: Similar notes content: application/json: schema: type: array items: type: object properties: noteId: type: string title: type: string similarity: type: number # Images /api/images/{noteId}/{filename}: get: tags: [Notes] summary: Get image from note operationId: getNoteImage parameters: - $ref: '#/components/parameters/noteId' - name: filename in: path required: true schema: type: string responses: '200': description: Image content content: image/*: schema: type: string format: binary /api/images/{noteId}: put: tags: [Notes] summary: Update image note operationId: updateImageNote parameters: - $ref: '#/components/parameters/noteId' requestBody: required: true content: multipart/form-data: schema: type: object properties: upload: type: string format: binary responses: '204': description: Image updated /api/attachments/{attachmentId}/image/{filename}: get: tags: [Attachments] summary: Get attached image operationId: getAttachmentImage parameters: - name: attachmentId in: path required: true schema: type: string - name: filename in: path required: true schema: type: string responses: '200': description: Image content content: image/*: schema: type: string format: binary /api/revisions/{revisionId}/image/{filename}: get: tags: [Revisions] summary: Get image from revision operationId: getRevisionImage parameters: - name: revisionId in: path required: true schema: type: string - name: filename in: path required: true schema: type: string responses: '200': description: Image content content: image/*: schema: type: string format: binary # Import/Export /api/branches/{branchId}/export/{type}/{format}/{version}/{taskId}: get: tags: [Import/Export] summary: Export branch operationId: exportBranch parameters: - name: branchId in: path required: true schema: type: string - name: type in: path required: true schema: type: string enum: [subtree, single] - name: format in: path required: true schema: type: string enum: [html, markdown, opml] - name: version in: path required: true schema: type: string - name: taskId in: path required: true schema: type: string responses: '200': description: Exported content content: application/octet-stream: schema: type: string format: binary /api/notes/{parentNoteId}/notes-import: post: tags: [Import/Export] summary: Import notes operationId: importNotes parameters: - name: parentNoteId in: path required: true schema: type: string requestBody: required: true content: multipart/form-data: schema: type: object properties: upload: type: string format: binary safeImport: type: boolean shrinkImages: type: boolean textImportedAsText: type: boolean codeImportedAsCode: type: boolean explodeArchives: type: boolean replaceUnderscoresWithSpaces: type: boolean responses: '200': description: Import results content: application/json: schema: type: object properties: noteId: type: string note: $ref: '#/components/schemas/Note' /api/notes/{parentNoteId}/attachments-import: post: tags: [Import/Export, Attachments] summary: Import attachments operationId: importAttachments parameters: - name: parentNoteId in: path required: true schema: type: string requestBody: required: true content: multipart/form-data: schema: type: object properties: upload: type: array items: type: string format: binary responses: '200': description: Import results # Options /api/options: get: tags: [Configuration] summary: Get system options operationId: getOptions responses: '200': description: System options content: application/json: schema: type: object additionalProperties: type: string put: tags: [Configuration] summary: Update multiple options operationId: updateOptions requestBody: required: true content: application/json: schema: type: object additionalProperties: type: string responses: '204': description: Options updated /api/options/{name}/{value}: put: tags: [Configuration] summary: Update single option operationId: updateOption parameters: - name: name in: path required: true schema: type: string - name: value in: path required: true schema: type: string responses: '204': description: Option updated /api/options/user-themes: get: tags: [Configuration] summary: Get user-defined themes operationId: getUserThemes responses: '200': description: User themes content: application/json: schema: type: array items: type: object properties: name: type: string label: type: string /api/options/locales: get: tags: [Configuration] summary: Get supported locales operationId: getLocales responses: '200': description: Supported locales content: application/json: schema: type: array items: type: object properties: code: type: string name: type: string # Password management /api/password/change: post: tags: [Security] summary: Change password operationId: changePassword requestBody: required: true content: application/json: schema: type: object required: [new_password] properties: current_password: type: string format: password new_password: type: string format: password responses: '204': description: Password changed /api/password/reset: post: tags: [Security] summary: Reset password (destructive) operationId: resetPassword parameters: - name: really in: query required: true schema: type: string example: yesIReallyWantToResetMyPassword responses: '204': description: Password reset # Sync /api/sync/test: post: tags: [Sync] summary: Test sync connection operationId: testSync responses: '200': description: Sync test results /api/sync/now: post: tags: [Sync] summary: Trigger sync now operationId: syncNow responses: '200': description: Sync started /api/sync/check: get: tags: [Sync] summary: Get sync status operationId: checkSync responses: '200': description: Sync status content: application/json: schema: type: object properties: synced: type: boolean lastSyncedPush: type: string format: date-time lastSyncedPull: type: string format: date-time /api/sync/changed: get: tags: [Sync] summary: Get sync changes operationId: getSyncChanges parameters: - name: instanceId in: query required: true schema: type: string - name: lastEntityChangeId in: query required: true schema: type: integer - name: logMarkerId in: query required: true schema: type: string responses: '200': description: Sync changes content: application/json: schema: type: object properties: entityChanges: type: array items: $ref: '#/components/schemas/EntityChange' lastEntityChangeId: type: integer outstandingPullCount: type: integer /api/sync/update: put: tags: [Sync] summary: Push sync changes operationId: pushSyncChanges parameters: - name: logMarkerId in: query required: true schema: type: string - name: pageCount in: header required: true schema: type: integer - name: pageIndex in: header required: true schema: type: integer - name: requestId in: header schema: type: string requestBody: required: true content: application/json: schema: type: object properties: instanceId: type: string entities: type: array items: $ref: '#/components/schemas/EntityChange' responses: '200': description: Changes processed /api/sync/finished: post: tags: [Sync] summary: Mark sync as finished operationId: finishSync responses: '204': description: Sync finished /api/sync/stats: get: tags: [Sync] summary: Get sync statistics operationId: getSyncStats security: [] responses: '200': description: Sync statistics content: application/json: schema: type: object properties: initialized: type: boolean stats: type: object /api/sync/fill-entity-changes: post: tags: [Sync] summary: Fill entity changes operationId: fillEntityChanges responses: '204': description: Entity changes filled /api/sync/force-full-sync: post: tags: [Sync] summary: Force full sync operationId: forceFullSync responses: '204': description: Full sync forced /api/sync/check-entity-changes: post: tags: [Sync] summary: Check entity changes consistency operationId: checkEntityChanges responses: '200': description: Consistency check results /api/sync/queue-sector/{entityName}/{sector}: post: tags: [Sync] summary: Queue sector for sync operationId: queueSyncSector parameters: - name: entityName in: path required: true schema: type: string - name: sector in: path required: true schema: type: string responses: '204': description: Sector queued # Scripting /api/script/exec: post: tags: [Scripting] summary: Execute script operationId: executeScript requestBody: required: true content: application/json: schema: type: object required: [script] properties: script: type: string params: type: array items: type: string startNoteId: type: string currentNoteId: type: string originEntityName: type: string originEntityId: type: string transactional: type: boolean responses: '200': description: Script execution results content: application/json: schema: type: object /api/script/run/{noteId}: post: tags: [Scripting] summary: Run script note operationId: runScriptNote parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: Script execution results /api/script/startup: get: tags: [Scripting] summary: Get startup script bundles operationId: getStartupScripts parameters: - name: mobile in: query schema: type: boolean responses: '200': description: Startup scripts content: application/json: schema: type: array items: $ref: '#/components/schemas/ScriptBundle' /api/script/widgets: get: tags: [Scripting] summary: Get widget script bundles operationId: getWidgetScripts responses: '200': description: Widget scripts content: application/json: schema: type: array items: $ref: '#/components/schemas/ScriptBundle' /api/script/bundle/{noteId}: post: tags: [Scripting] summary: Get script bundle for note operationId: getScriptBundle parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: Script bundle content: application/json: schema: $ref: '#/components/schemas/ScriptBundle' /api/script/relation/{noteId}/{relationName}: get: tags: [Scripting] summary: Get relation script bundles operationId: getRelationScripts parameters: - $ref: '#/components/parameters/noteId' - name: relationName in: path required: true schema: type: string responses: '200': description: Relation scripts content: application/json: schema: type: array items: $ref: '#/components/schemas/ScriptBundle' # Database /api/sql/schema: get: tags: [Database] summary: Get database schema operationId: getDatabaseSchema responses: '200': description: Database schema content: text/plain: schema: type: string /api/sql/execute/{noteId}: post: tags: [Database] summary: Execute SQL from note operationId: executeSql parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: SQL execution results content: application/json: schema: type: array items: type: object /api/database/backup-database: post: tags: [Database] summary: Create database backup operationId: backupDatabase responses: '204': description: Backup created /api/database/backups: get: tags: [Database] summary: List existing backups operationId: listBackups responses: '200': description: Backup list content: application/json: schema: type: array items: type: string /api/database/vacuum-database: post: tags: [Database] summary: Vacuum database operationId: vacuumDatabase responses: '204': description: Database vacuumed /api/database/anonymize/{type}: post: tags: [Database] summary: Anonymize database operationId: anonymizeDatabase parameters: - name: type in: path required: true schema: type: string enum: [save-as-file, save-and-send] responses: '200': description: Anonymization results /api/database/anonymized-databases: get: tags: [Database] summary: List anonymized databases operationId: listAnonymizedDatabases responses: '200': description: Anonymized database list content: application/json: schema: type: array items: type: string /api/database/find-and-fix-consistency-issues: post: tags: [Database] summary: Fix consistency issues operationId: fixConsistencyIssues responses: '200': description: Consistency check results /api/database/check-integrity: get: tags: [Database] summary: Check database integrity operationId: checkIntegrity responses: '200': description: Integrity check results content: application/json: schema: type: object properties: results: type: array items: type: string # System /api/metrics: get: tags: [Utilities] summary: Get system metrics operationId: getMetrics parameters: - name: format in: query schema: type: string enum: [prometheus, json] default: json responses: '200': description: System metrics content: application/json: schema: type: object text/plain: schema: type: string /api/system-checks: get: tags: [Utilities] summary: Run system diagnostics operationId: runSystemChecks responses: '200': description: System check results content: application/json: schema: type: array items: type: object properties: name: type: string status: type: string enum: [pass, fail] message: type: string /api/health-check: get: tags: [Utilities] summary: Health check endpoint operationId: healthCheck security: [] responses: '200': description: Service is healthy content: text/plain: schema: type: string example: OK /api/backend-log: get: tags: [Utilities] summary: Get backend log operationId: getBackendLog responses: '200': description: Backend log entries content: application/json: schema: type: array items: type: object properties: timestamp: type: string format: date-time level: type: string message: type: string # Bulk operations /api/bulk-action/execute: post: tags: [Notes] summary: Execute bulk action operationId: executeBulkAction requestBody: required: true content: application/json: schema: type: object properties: action: type: string noteIds: type: array items: type: string responses: '200': description: Bulk action results /api/bulk-action/affected-notes: post: tags: [Notes] summary: Get affected notes count operationId: getAffectedNotesCount requestBody: required: true content: application/json: schema: type: object properties: action: type: string noteIds: type: array items: type: string responses: '200': description: Affected notes count content: application/json: schema: type: object properties: count: type: integer /api/delete-notes-preview: post: tags: [Notes] summary: Preview note deletion operationId: previewNoteDeletion requestBody: required: true content: application/json: schema: type: object properties: branchIdsToDelete: type: array items: type: string deleteAllClones: type: boolean responses: '200': description: Deletion preview content: application/json: schema: type: object properties: notesToDelete: type: array items: type: string /api/notes/erase-deleted-notes-now: post: tags: [Notes] summary: Erase deleted notes operationId: eraseDeletedNotes responses: '204': description: Deleted notes erased /api/notes/erase-unused-attachments-now: post: tags: [Attachments] summary: Erase unused attachments operationId: eraseUnusedAttachments responses: '204': description: Unused attachments erased # Special notes /api/special-notes/inbox/{date}: get: tags: [Special Notes] summary: Get/create inbox note operationId: getInboxNote parameters: - name: date in: path required: true schema: type: string format: date responses: '200': description: Inbox note content: application/json: schema: $ref: '#/components/schemas/Note' /api/special-notes/days/{date}: get: tags: [Special Notes] summary: Get/create day note operationId: getDayNote parameters: - name: date in: path required: true schema: type: string format: date responses: '200': description: Day note content: application/json: schema: $ref: '#/components/schemas/Note' /api/special-notes/weeks/{week}: get: tags: [Special Notes] summary: Get/create week note operationId: getWeekNote parameters: - name: week in: path required: true schema: type: string pattern: ^\d{4}-\d{2}$ example: '2024-03' responses: '200': description: Week note content: application/json: schema: $ref: '#/components/schemas/Note' /api/special-notes/months/{month}: get: tags: [Special Notes] summary: Get/create month note operationId: getMonthNote parameters: - name: month in: path required: true schema: type: string pattern: ^\d{4}-\d{2}$ example: '2024-01' responses: '200': description: Month note content: application/json: schema: $ref: '#/components/schemas/Note' /api/special-notes/years/{year}: get: tags: [Special Notes] summary: Get/create year note operationId: getYearNote parameters: - name: year in: path required: true schema: type: string pattern: ^\d{4}$ example: '2024' responses: '200': description: Year note content: application/json: schema: $ref: '#/components/schemas/Note' /api/special-notes/sql-console: post: tags: [Special Notes, Database] summary: Create SQL console note operationId: createSqlConsole responses: '201': description: SQL console created content: application/json: schema: $ref: '#/components/schemas/Note' /api/special-notes/search-note: post: tags: [Special Notes, Search] summary: Create search note operationId: createSearchNote responses: '201': description: Search note created content: application/json: schema: $ref: '#/components/schemas/Note' /api/special-notes/launchers/{parentNoteId}/{launcherType}: post: tags: [Special Notes] summary: Create launcher operationId: createLauncher parameters: - name: parentNoteId in: path required: true schema: type: string - name: launcherType in: path required: true schema: type: string responses: '201': description: Launcher created content: application/json: schema: $ref: '#/components/schemas/Note' /api/special-notes/notes-for-month/{month}: get: tags: [Special Notes] summary: Get notes for specific month operationId: getNotesForMonth parameters: - name: month in: path required: true schema: type: string example: "2024-03" responses: '200': description: Notes for the month content: application/json: schema: type: array items: $ref: '#/components/schemas/Note' /api/special-notes/quarters/{quarter}: get: tags: [Special Notes] summary: Get quarter note operationId: getQuarter parameters: - name: quarter in: path required: true schema: type: string example: "2024-Q1" responses: '200': description: Quarter note content: application/json: schema: $ref: '#/components/schemas/Note' /api/special-notes/week-first-day/{date}: get: tags: [Special Notes] summary: Get first day of week for date operationId: getWeekFirstDay parameters: - name: date in: path required: true schema: type: string format: date example: "2024-03-15" responses: '200': description: First day of week content: application/json: schema: type: object properties: date: type: string format: date /api/special-notes/launchers/{noteId}/reset: post: tags: [Special Notes] summary: Reset launcher note operationId: resetLauncher parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: Launcher reset content: application/json: schema: $ref: '#/components/schemas/Note' /api/special-notes/save-search-note: post: tags: [Special Notes] summary: Save search note operationId: saveSearchNote requestBody: required: true content: application/json: schema: type: object properties: query: type: string title: type: string responses: '201': description: Search note saved content: application/json: schema: $ref: '#/components/schemas/Note' /api/special-notes/save-sql-console: post: tags: [Special Notes] summary: Save SQL console note operationId: saveSqlConsole requestBody: required: true content: application/json: schema: type: object properties: sql: type: string title: type: string responses: '201': description: SQL console saved content: application/json: schema: $ref: '#/components/schemas/Note' /api/special-notes/api-script-launcher: put: tags: [Special Notes] summary: Update API script launcher operationId: updateApiScriptLauncher requestBody: required: true content: application/json: schema: type: object properties: code: type: string description: Script code responses: '200': description: API script launcher updated content: application/json: schema: $ref: '#/components/schemas/Note' # Maps /api/note-map/{noteId}/tree: post: tags: [Visualization] summary: Get tree map operationId: getTreeMap parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: Tree map data content: application/json: schema: type: object /api/note-map/{noteId}/link: post: tags: [Visualization] summary: Get link map operationId: getLinkMap parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: Link map data content: application/json: schema: type: object /api/note-map/{noteId}/backlinks: get: tags: [Visualization] summary: Get backlinks operationId: getBacklinks parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: Backlinks content: application/json: schema: type: array items: type: object properties: noteId: type: string title: type: string /api/note-map/{noteId}/backlink-count: get: tags: [Visualization] summary: Get backlink count for note operationId: getBacklinkCount parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: Backlink count content: application/json: schema: type: object properties: count: type: integer description: Number of backlinks to this note /api/relation-map: post: tags: [Visualization] summary: Get relation map data operationId: getRelationMap requestBody: required: true content: application/json: schema: type: object properties: noteId: type: string maxDepth: type: integer excludeArchived: type: boolean responses: '200': description: Relation map data content: application/json: schema: type: object # External integrations /api/clipper/handshake: get: tags: [External] summary: Clipper handshake operationId: clipperHandshake responses: '200': description: Handshake successful content: application/json: schema: type: object properties: protocolVersion: type: string /api/clipper/clippings: post: tags: [External] summary: Add web clipping operationId: addClipping requestBody: required: true content: application/json: schema: type: object properties: title: type: string content: type: string url: type: string responses: '201': description: Clipping created content: application/json: schema: $ref: '#/components/schemas/Note' /api/clipper/notes: post: tags: [External] summary: Create clipper note operationId: createClipperNote requestBody: required: true content: application/json: schema: type: object properties: title: type: string content: type: string parentNoteId: type: string responses: '201': description: Note created content: application/json: schema: $ref: '#/components/schemas/Note' /api/clipper/open/{noteId}: post: tags: [External] summary: Open note in clipper operationId: openNoteInClipper parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: Note opened in clipper content: application/json: schema: type: object properties: success: type: boolean url: type: string description: URL to open in clipper /api/sender/login: post: tags: [External] summary: Sender login operationId: senderLogin security: [] requestBody: required: true content: application/json: schema: type: object required: [username, password] properties: username: type: string password: type: string responses: '200': description: Login successful content: application/json: schema: type: object properties: token: type: string /api/sender/image: post: tags: [External] summary: Upload image from sender operationId: uploadSenderImage requestBody: required: true content: multipart/form-data: schema: type: object properties: upload: type: string format: binary responses: '201': description: Image uploaded content: application/json: schema: $ref: '#/components/schemas/Note' /api/sender/note: post: tags: [External] summary: Save note from sender operationId: saveSenderNote requestBody: required: true content: application/json: schema: type: object properties: title: type: string content: type: string responses: '201': description: Note saved content: application/json: schema: $ref: '#/components/schemas/Note' # LLM endpoints /api/llm/chat: post: tags: [LLM] summary: Create new chat session operationId: createChatSession requestBody: required: true content: application/json: schema: type: object properties: title: type: string systemPrompt: type: string temperature: type: number minimum: 0 maximum: 1 maxTokens: type: integer model: type: string provider: type: string enum: [openai, anthropic, ollama] contextNoteId: type: string responses: '201': description: Chat session created content: application/json: schema: $ref: '#/components/schemas/ChatSession' get: tags: [LLM] summary: List all chat sessions operationId: listChatSessions responses: '200': description: Chat sessions content: application/json: schema: type: array items: $ref: '#/components/schemas/ChatSession' /api/llm/chat/{sessionId}: get: tags: [LLM] summary: Get specific chat session operationId: getChatSession parameters: - name: sessionId in: path required: true schema: type: string responses: '200': description: Chat session details content: application/json: schema: $ref: '#/components/schemas/ChatSession' patch: tags: [LLM] summary: Update chat session operationId: updateChatSession parameters: - name: sessionId in: path required: true schema: type: string requestBody: required: true content: application/json: schema: type: object properties: title: type: string systemPrompt: type: string temperature: type: number maxTokens: type: integer model: type: string provider: type: string contextNoteId: type: string responses: '200': description: Session updated content: application/json: schema: $ref: '#/components/schemas/ChatSession' /api/llm/chat/{chatNoteId}: delete: tags: [LLM] summary: Delete chat session operationId: deleteChatSession parameters: - name: chatNoteId in: path required: true schema: type: string responses: '204': description: Session deleted /api/llm/chat/{chatNoteId}/messages: post: tags: [LLM] summary: Send message to LLM operationId: sendChatMessage parameters: - name: sessionId in: path required: true schema: type: string requestBody: required: true content: application/json: schema: type: object required: [message] properties: message: type: string options: type: object properties: temperature: type: number maxTokens: type: integer model: type: string provider: type: string includeContext: type: boolean useNoteContext: type: boolean responses: '200': description: LLM response content: application/json: schema: type: object properties: response: type: string sources: type: array items: type: object properties: noteId: type: string title: type: string similarity: type: number /api/llm/chat/{chatNoteId}/messages/stream: post: tags: [LLM] summary: Stream message to LLM operationId: streamChatMessage parameters: - name: sessionId in: path required: true schema: type: string requestBody: required: true content: application/json: schema: type: object required: [content] properties: content: type: string useAdvancedContext: type: boolean showThinking: type: boolean mentions: type: array items: type: string responses: '200': description: Streaming started /api/llm/providers/ollama/models: get: tags: [LLM] summary: List Ollama models operationId: listOllamaModels parameters: - name: baseUrl in: query schema: type: string responses: '200': description: Ollama models content: application/json: schema: type: object properties: success: type: boolean models: type: array items: type: object /api/llm/providers/openai/models: get: tags: [LLM] summary: List OpenAI models operationId: listOpenAIModels responses: '200': description: OpenAI models content: application/json: schema: type: object properties: success: type: boolean chatModels: type: array items: type: object properties: id: type: string name: type: string type: type: string embeddingModels: type: array items: type: object properties: id: type: string name: type: string type: type: string /api/llm/providers/anthropic/models: get: tags: [LLM] summary: List Anthropic models operationId: listAnthropicModels responses: '200': description: Anthropic models content: application/json: schema: type: object properties: success: type: boolean chatModels: type: array items: type: object properties: id: type: string name: type: string type: type: string # TOTP/2FA /api/totp/generate: get: tags: [Security] summary: Generate TOTP secret operationId: generateTotpSecret responses: '200': description: TOTP secret generated content: application/json: schema: type: object properties: secret: type: string qrCode: type: string /api/totp/status: get: tags: [Security] summary: Get TOTP status operationId: getTotpStatus responses: '200': description: TOTP status content: application/json: schema: type: object properties: enabled: type: boolean /api/totp/get: get: tags: [Security] summary: Get TOTP configuration operationId: getTotpConfig responses: '200': description: TOTP configuration content: application/json: schema: type: object properties: secret: type: string qrCode: type: string backupCodes: type: array items: type: string /api/totp_recovery/enabled: get: tags: [Security] summary: Check if TOTP recovery is enabled operationId: isTotpRecoveryEnabled responses: '200': description: TOTP recovery status content: application/json: schema: type: object properties: enabled: type: boolean /api/totp_recovery/generate: get: tags: [Security] summary: Generate TOTP recovery codes operationId: generateTotpRecoveryCodes responses: '200': description: Generated recovery codes content: application/json: schema: type: object properties: codes: type: array items: type: string /api/totp_recovery/used: get: tags: [Security] summary: Get used TOTP recovery codes operationId: getUsedTotpRecoveryCodes responses: '200': description: Used recovery codes content: application/json: schema: type: object properties: usedCodes: type: array items: type: string /api/totp_recovery/set: post: tags: [Security] summary: Set TOTP recovery codes operationId: setTotpRecoveryCodes requestBody: required: true content: application/json: schema: type: object properties: codes: type: array items: type: string responses: '200': description: Recovery codes set content: application/json: schema: type: object properties: success: type: boolean /api/totp_recovery/verify: post: tags: [Security] summary: Verify TOTP recovery code operationId: verifyTotpRecoveryCode requestBody: required: true content: application/json: schema: type: object properties: code: type: string responses: '200': description: Verification result content: application/json: schema: type: object properties: valid: type: boolean # ETAPI tokens /api/etapi-tokens: get: tags: [Security] summary: List ETAPI tokens operationId: listEtapiTokens responses: '200': description: ETAPI tokens content: application/json: schema: type: array items: $ref: '#/components/schemas/EtapiToken' post: tags: [Security] summary: Create ETAPI token operationId: createEtapiToken requestBody: required: true content: application/json: schema: type: object required: [name] properties: name: type: string responses: '201': description: Token created content: application/json: schema: $ref: '#/components/schemas/EtapiToken' /api/etapi-tokens/{etapiTokenId}: patch: tags: [Security] summary: Update ETAPI token operationId: updateEtapiToken parameters: - name: etapiTokenId in: path required: true schema: type: string requestBody: required: true content: application/json: schema: type: object properties: name: type: string responses: '200': description: Token updated content: application/json: schema: $ref: '#/components/schemas/EtapiToken' delete: tags: [Security] summary: Delete ETAPI token operationId: deleteEtapiToken parameters: - name: etapiTokenId in: path required: true schema: type: string responses: '204': description: Token deleted # Other utilities /api/stats/note-size/{noteId}: get: tags: [Utilities] summary: Get note size operationId: getNoteSize parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: Note size content: application/json: schema: type: object properties: size: type: integer /api/stats/subtree-size/{noteId}: get: tags: [Utilities] summary: Get subtree size operationId: getSubtreeSize parameters: - $ref: '#/components/parameters/noteId' responses: '200': description: Subtree size content: application/json: schema: type: object properties: size: type: integer /api/keyboard-actions: get: tags: [Utilities] summary: Get keyboard actions operationId: getKeyboardActions responses: '200': description: Keyboard actions content: application/json: schema: type: array items: type: object properties: actionName: type: string shortcut: type: string description: type: string /api/keyboard-shortcuts-for-notes: get: tags: [Utilities] summary: Get keyboard shortcuts for notes operationId: getKeyboardShortcutsForNotes responses: '200': description: Keyboard shortcuts for notes content: application/json: schema: type: array items: type: object properties: noteId: type: string shortcut: type: string title: type: string /api/fonts: get: tags: [Utilities] summary: Get font CSS operationId: getFonts responses: '200': description: Font CSS content: text/css: schema: type: string /api/recent-notes: post: tags: [Utilities] summary: Add recent note operationId: addRecentNote requestBody: required: true content: application/json: schema: type: object required: [noteId] properties: noteId: type: string responses: '204': description: Note added to recent /api/recent-changes/{ancestorNoteId}: get: tags: [Utilities] summary: Get recent changes operationId: getRecentChanges parameters: - name: ancestorNoteId in: path required: true schema: type: string responses: '200': description: Recent changes content: application/json: schema: type: array items: type: object properties: noteId: type: string title: type: string dateModified: type: string format: date-time /api/other/icon-usage: get: tags: [Utilities] summary: Get icon usage statistics operationId: getIconUsage responses: '200': description: Icon usage stats content: application/json: schema: type: object additionalProperties: type: integer /api/other/render-markdown: post: tags: [Utilities] summary: Render markdown to HTML operationId: renderMarkdown requestBody: required: true content: application/json: schema: type: object required: [markdownContent] properties: markdownContent: type: string responses: '200': description: Rendered HTML content: text/html: schema: type: string components: securitySchemes: sessionAuth: type: apiKey in: cookie name: trilium.sid description: Session cookie obtained from login tokenAuth: type: apiKey in: header name: Authorization description: API token in format "Bearer {token}" parameters: noteId: name: noteId in: path required: true schema: type: string description: 12-character note ID schemas: Note: type: object required: - noteId - title - type - mime - isProtected properties: noteId: type: string description: 12-character note ID example: ur11rSfHkzeV title: type: string description: Note title type: $ref: '#/components/schemas/NoteType' mime: type: string description: MIME type example: text/html isProtected: type: boolean description: Whether note is protected blobId: type: string description: ID of content blob dateCreated: type: string format: date-time dateModified: type: string format: date-time utcDateCreated: type: string format: date-time utcDateModified: type: string format: date-time NoteType: type: string enum: - text - code - render - file - image - search - relationMap - book - noteMap - mermaid - canvas - webView - launcher - doc - contentWidget - mindMap - geoMap Branch: type: object required: - branchId - noteId - parentNoteId - notePosition properties: branchId: type: string description: Branch ID (parentNoteId_noteId) noteId: type: string parentNoteId: type: string notePosition: type: integer prefix: type: string nullable: true isExpanded: type: boolean Attribute: type: object required: - attributeId - noteId - type - name - value properties: attributeId: type: string noteId: type: string type: type: string enum: [label, relation] name: type: string value: type: string position: type: integer isInheritable: type: boolean Attachment: type: object required: - attachmentId - ownerId - role - mime - title properties: attachmentId: type: string ownerId: type: string role: type: string enum: [image, file] mime: type: string title: type: string blobId: type: string dateModified: type: string format: date-time utcDateModified: type: string format: date-time Revision: type: object properties: revisionId: type: string noteId: type: string title: type: string type: $ref: '#/components/schemas/NoteType' mime: type: string dateCreated: type: string format: date-time utcDateCreated: type: string format: date-time SearchResult: type: object properties: noteId: type: string title: type: string path: type: string score: type: number highlights: type: array items: type: string EntityChange: type: object properties: entityChange: type: object properties: entityName: type: string changeId: type: string entity: type: object Timestamps: type: object properties: dateCreated: type: string format: date-time dateModified: type: string format: date-time utcDateCreated: type: string format: date-time utcDateModified: type: string format: date-time CreateNoteRequest: type: object required: - title - type properties: title: type: string content: type: string type: $ref: '#/components/schemas/NoteType' mime: type: string isProtected: type: boolean isExpanded: type: boolean notePosition: type: integer prefix: type: string parentNoteId: type: string templateNoteId: type: string ScriptBundle: type: object properties: noteId: type: string script: type: string html: type: string css: type: string AppInfo: type: object properties: appVersion: type: string example: 0.91.6 dbVersion: type: integer example: 228 nodeVersion: type: string syncVersion: type: integer example: 34 buildDate: type: string format: date-time buildRevision: type: string dataDirectory: type: string clipperProtocolVersion: type: string utcDateTime: type: string format: date-time ChatSession: type: object properties: sessionId: type: string title: type: string messages: type: array items: type: object properties: role: type: string enum: [user, assistant, system] content: type: string timestamp: type: string format: date-time createdAt: type: string format: date-time lastActive: type: string format: date-time messageCount: type: integer EtapiToken: type: object properties: etapiTokenId: type: string name: type: string token: type: string dateCreated: type: string format: date-time isDeleted: type: boolean