{ "openapi": "3.1.0", "info": { "title": "EdgeEver API", "version": "0.1.0", "description": "REST API for EdgeEver notebooks, memos, resources, API tokens, and Agent integrations." }, "servers": [ { "url": "/" } ], "security": [ { "bearerAuth": [] }, { "cookieAuth": [] } ], "paths": { "/api/health": { "get": { "summary": "Health check", "security": [], "responses": { "200": { "description": "Runtime health", "content": { "application/json": { "schema": { "type": "object", "properties": { "ok": { "type": "boolean" }, "name": { "type": "string" }, "runtime": { "type": "string" }, "authMode": { "type": "string", "enum": ["required", "disabled"] } }, "required": ["ok", "name", "runtime", "authMode"] } } } }, "503": { "$ref": "#/components/responses/Error" } } } }, "/api/openapi.json": { "get": { "summary": "OpenAPI schema", "security": [], "responses": { "200": { "description": "OpenAPI 3.1 schema" } } } }, "/api/v1/auth/session": { "get": { "summary": "Read interactive session", "security": [], "responses": { "200": { "description": "Current session", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AuthSession" } } } }, "503": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/auth/sessions": { "get": { "summary": "List the current user's active login sessions", "responses": { "200": { "description": "Active login sessions ordered by latest activity", "content": { "application/json": { "schema": { "type": "object", "properties": { "sessions": { "type": "array", "items": { "$ref": "#/components/schemas/LoginDeviceSession" } } }, "required": ["sessions"] } } } }, "401": { "$ref": "#/components/responses/Error" } } }, "delete": { "summary": "Revoke all login sessions except the current session", "responses": { "200": { "description": "Other sessions revoked", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Ok" } } } }, "401": { "$ref": "#/components/responses/Error" } } }, "patch": { "summary": "Update a login device label", "parameters": [ { "name": "sessionId", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "label": { "type": ["string", "null"], "maxLength": 80 } }, "required": ["label"] } } } }, "responses": { "200": { "description": "Device label updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Ok" } } } }, "401": { "$ref": "#/components/responses/Error" }, "404": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/auth/sessions/{sessionId}": { "delete": { "summary": "Revoke one of the current user's other login sessions", "parameters": [ { "name": "sessionId", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Session revoked", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Ok" } } } }, "400": { "$ref": "#/components/responses/Error" }, "401": { "$ref": "#/components/responses/Error" }, "404": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/auth/login": { "post": { "summary": "Create interactive session", "security": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LoginInput" } } } }, "responses": { "200": { "description": "Authenticated session", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AuthSession" } } } }, "401": { "$ref": "#/components/responses/Error" }, "429": { "$ref": "#/components/responses/Error" }, "503": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/auth/change-password": { "post": { "summary": "Change the current user's password", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ChangePasswordInput" } } } }, "responses": { "200": { "description": "Password changed", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Ok" } } } }, "400": { "$ref": "#/components/responses/Error" }, "401": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/auth/logout": { "post": { "summary": "Revoke interactive session", "responses": { "200": { "description": "Logout result", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Ok" } } } } } } }, "/api/v1/users": { "get": { "summary": "List instance users (owner only)", "responses": { "200": { "description": "Instance user list", "content": { "application/json": { "schema": { "type": "object", "properties": { "users": { "type": "array", "items": { "$ref": "#/components/schemas/InstanceUser" } } }, "required": ["users"] } } } }, "403": { "$ref": "#/components/responses/Error" } } }, "post": { "summary": "Create an isolated user workspace (owner only)", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserCreateInput" } } } }, "responses": { "201": { "description": "Created user", "content": { "application/json": { "schema": { "type": "object", "properties": { "user": { "$ref": "#/components/schemas/InstanceUser" } }, "required": ["user"] } } } }, "403": { "$ref": "#/components/responses/Error" }, "409": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/users/{id}": { "patch": { "summary": "Update, disable, or reset a user (owner only)", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserUpdateInput" } } } }, "responses": { "200": { "description": "Updated user", "content": { "application/json": { "schema": { "type": "object", "properties": { "user": { "$ref": "#/components/schemas/InstanceUser" } }, "required": ["user"] } } } }, "403": { "$ref": "#/components/responses/Error" }, "404": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/notebooks": { "get": { "summary": "List notebooks", "responses": { "200": { "description": "Notebook list", "content": { "application/json": { "schema": { "type": "object", "properties": { "notebooks": { "type": "array", "items": { "$ref": "#/components/schemas/Notebook" } } }, "required": ["notebooks"] } } } } } }, "post": { "summary": "Create notebook", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotebookCreateInput" } } } }, "responses": { "201": { "$ref": "#/components/responses/NotebookResponse" } } } }, "/api/v1/notebooks/{id}": { "parameters": [ { "$ref": "#/components/parameters/NotebookId" } ], "patch": { "summary": "Update notebook", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotebookUpdateInput" } } } }, "responses": { "200": { "$ref": "#/components/responses/NotebookResponse" }, "409": { "$ref": "#/components/responses/Error" } } }, "delete": { "summary": "Soft-delete empty notebook", "responses": { "200": { "$ref": "#/components/responses/Ok" }, "409": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/tags": { "get": { "summary": "List tag summaries", "responses": { "200": { "description": "Tag summaries", "content": { "application/json": { "schema": { "type": "object", "properties": { "tags": { "type": "array", "items": { "$ref": "#/components/schemas/TagSummary" } } }, "required": ["tags"] } } } } } } }, "/api/v1/tags/{tag}": { "parameters": [ { "name": "tag", "in": "path", "required": true, "schema": { "type": "string" } } ], "patch": { "summary": "Rename tag across active memos", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TagRenameInput" } } } }, "responses": { "200": { "$ref": "#/components/responses/UpdatedCount" } } }, "delete": { "summary": "Remove tag across active memos", "responses": { "200": { "$ref": "#/components/responses/UpdatedCount" } } } }, "/api/v1/api-tokens": { "get": { "summary": "List API tokens", "responses": { "200": { "description": "API token list", "content": { "application/json": { "schema": { "type": "object", "properties": { "apiTokens": { "type": "array", "items": { "$ref": "#/components/schemas/ApiToken" } }, "availableScopes": { "type": "array", "items": { "type": "string" } } }, "required": ["apiTokens", "availableScopes"] } } } } } }, "post": { "summary": "Create API token", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiTokenCreateInput" } } } }, "responses": { "201": { "description": "Created token; plaintext token is shown once", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreatedApiToken" } } } } } } }, "/api/v1/api-tokens/{id}": { "parameters": [ { "$ref": "#/components/parameters/ApiTokenId" } ], "delete": { "summary": "Revoke API token", "responses": { "200": { "$ref": "#/components/responses/Ok" } } } }, "/api/v1/memos": { "get": { "summary": "List or search memos", "parameters": [ { "name": "notebookId", "in": "query", "schema": { "type": "string" } }, { "name": "includeDescendants", "in": "query", "description": "Include memos from all descendant notebooks when notebookId is set.", "schema": { "type": "string", "enum": ["1"] } }, { "name": "q", "in": "query", "schema": { "type": "string" } }, { "name": "trash", "in": "query", "schema": { "type": "string", "enum": ["1"] } }, { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 200, "default": 100 } }, { "name": "cursor", "in": "query", "schema": { "type": "string" } }, { "name": "sort", "in": "query", "schema": { "type": "string", "enum": ["updated-desc", "created-desc", "title-asc"], "default": "updated-desc" } }, { "name": "filter", "in": "query", "schema": { "type": "string", "enum": ["all", "tagged", "untagged", "pinned"], "default": "all" } } ], "responses": { "200": { "description": "Memo summaries", "content": { "application/json": { "schema": { "type": "object", "properties": { "memos": { "type": "array", "items": { "$ref": "#/components/schemas/MemoSummary" } }, "totalCount": { "type": "integer", "minimum": 0 }, "nextCursor": { "type": ["string", "null"] } }, "required": ["memos", "totalCount", "nextCursor"] } } } } } }, "post": { "summary": "Create memo", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MemoCreateInput" } } } }, "responses": { "201": { "$ref": "#/components/responses/MemoResponse" } } } }, "/api/v1/memos/batch/move": { "post": { "summary": "Move memos to notebook", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MoveMemosInput" } } } }, "responses": { "200": { "description": "Move result", "content": { "application/json": { "schema": { "type": "object", "properties": { "ok": { "type": "boolean" }, "moved": { "type": "integer" } }, "required": ["ok", "moved"] } } } } } } }, "/api/v1/memos/batch/delete": { "post": { "summary": "Delete memos", "description": "Soft-deletes active memos, or permanently deletes trashed memos when permanent is true.", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeleteMemosInput" } } } }, "responses": { "200": { "description": "Delete result", "content": { "application/json": { "schema": { "type": "object", "properties": { "ok": { "type": "boolean" }, "deleted": { "type": "integer" } }, "required": ["ok", "deleted"] } } } } } } }, "/api/v1/memos/trash/empty": { "delete": { "summary": "Empty trash", "description": "Permanently deletes all trashed memos and their remaining resource objects.", "responses": { "200": { "description": "Empty trash result", "content": { "application/json": { "schema": { "type": "object", "properties": { "ok": { "type": "boolean" }, "deleted": { "type": "integer" } }, "required": ["ok", "deleted"] } } } } } } }, "/api/v1/memos/merge": { "post": { "summary": "Merge memos", "description": "Creates a new memo, joins source Markdown with separators, soft-deletes source memos, and re-points resources to the new memo.", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MergeMemosInput" } } } }, "responses": { "201": { "$ref": "#/components/responses/MemoResponse" } } } }, "/api/v1/memos/{id}": { "parameters": [ { "$ref": "#/components/parameters/MemoId" } ], "get": { "summary": "Get memo detail", "parameters": [ { "name": "includeDeleted", "in": "query", "schema": { "type": "string", "enum": ["1"] } } ], "responses": { "200": { "$ref": "#/components/responses/MemoResponse" } } }, "patch": { "summary": "Update memo", "description": "Use expectedRevision for optimistic concurrency. A mismatch returns revision_conflict.", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MemoUpdateInput" } } } }, "responses": { "200": { "$ref": "#/components/responses/MemoResponse" }, "409": { "$ref": "#/components/responses/Error" } } }, "delete": { "summary": "Soft-delete or permanently delete memo", "parameters": [ { "name": "permanent", "in": "query", "schema": { "type": "string", "enum": ["1"] } } ], "responses": { "200": { "$ref": "#/components/responses/Ok" } } } }, "/api/v1/memos/{id}/edit-sessions": { "parameters": [ { "$ref": "#/components/parameters/MemoId" } ], "post": { "summary": "Start a bound memo edit session", "description": "Binds an edit session to the memo id, current revision, current content hash, and authenticated actor.", "responses": { "200": { "description": "Bound edit session", "content": { "application/json": { "schema": { "type": "object", "properties": { "editSession": { "$ref": "#/components/schemas/MemoEditSession" } }, "required": ["editSession"] } } } } } } }, "/api/v1/memos/{id}/restore": { "parameters": [ { "$ref": "#/components/parameters/MemoId" } ], "post": { "summary": "Restore memo from trash", "responses": { "200": { "$ref": "#/components/responses/MemoResponse" } } } }, "/api/v1/memos/{id}/revisions": { "parameters": [ { "$ref": "#/components/parameters/MemoId" } ], "get": { "summary": "List memo revisions", "parameters": [ { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 50 } } ], "responses": { "200": { "description": "Memo revisions", "content": { "application/json": { "schema": { "type": "object", "properties": { "revisions": { "type": "array", "items": { "$ref": "#/components/schemas/MemoRevision" } } }, "required": ["revisions"] } } } } } } }, "/api/v1/memos/{id}/revisions/{revisionId}/restore": { "parameters": [ { "$ref": "#/components/parameters/MemoId" }, { "name": "revisionId", "in": "path", "required": true, "schema": { "type": "string" } } ], "post": { "summary": "Restore a memo revision", "responses": { "200": { "$ref": "#/components/responses/MemoResponse" } } } }, "/api/v1/memos/{id}/resources": { "parameters": [ { "$ref": "#/components/parameters/MemoId" } ], "post": { "summary": "Upload an image or attachment resource for a memo", "description": "Uploads an image or attachment resource for a memo. Images are stored as provided; server-side compression is disabled.", "requestBody": { "required": true, "content": { "multipart/form-data": { "schema": { "type": "object", "properties": { "file": { "type": "string", "format": "binary" } }, "required": ["file"] } } } }, "responses": { "201": { "description": "Uploaded resource", "content": { "application/json": { "schema": { "type": "object", "properties": { "resource": { "$ref": "#/components/schemas/Resource" } }, "required": ["resource"] } } } } } } }, "/api/v1/exports/markdown": { "get": { "summary": "Read a page of Markdown export data", "description": "Returns active memo details and their resource metadata for browser-side Markdown ZIP generation. Requires read:memos and read:resources scopes.", "parameters": [ { "name": "offset", "in": "query", "schema": { "type": "integer", "minimum": 0, "default": 0 } }, { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 50 } } ], "responses": { "200": { "description": "A page of active memos and related resources", "content": { "application/json": { "schema": { "type": "object", "properties": { "memos": { "type": "array", "items": { "$ref": "#/components/schemas/MemoDetail" } }, "resources": { "type": "array", "items": { "$ref": "#/components/schemas/Resource" } }, "totalCount": { "type": "integer" }, "nextOffset": { "type": ["integer", "null"] } }, "required": ["memos", "resources", "totalCount", "nextOffset"] } } } } } } }, "/api/v1/backups/json": { "get": { "summary": "Read a page of EdgeEver ZIP recovery data", "description": "Returns active memo details, revision history, and resource metadata for browser-side EdgeEver ZIP generation. The resulting archive also contains human-readable Markdown. Trash is excluded.", "parameters": [ { "name": "offset", "in": "query", "schema": { "type": "integer", "minimum": 0, "default": 0 } }, { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 50, "default": 25 } } ], "responses": { "200": { "description": "A page of logical backup data", "content": { "application/json": { "schema": { "type": "object", "properties": { "memos": { "type": "array", "items": { "$ref": "#/components/schemas/MemoDetail" } }, "resources": { "type": "array", "items": { "$ref": "#/components/schemas/Resource" } }, "revisions": { "type": "array", "items": { "type": "object", "additionalProperties": true } }, "totalCount": { "type": "integer" }, "nextOffset": { "type": ["integer", "null"] } }, "required": ["memos", "resources", "revisions", "totalCount", "nextOffset"] } } } } } } }, "/api/v1/restores/json/notebooks": { "post": { "summary": "Import a batch of notebooks from an EdgeEver ZIP", "description": "Interactive-user-only merge restore. Matching EdgeEver notebook IDs are overwritten.", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "notebooks": { "type": "array", "minItems": 1, "maxItems": 100, "items": { "type": "object", "additionalProperties": true } } }, "required": ["notebooks"] } } } }, "responses": { "200": { "$ref": "#/components/responses/Ok" } } } }, "/api/v1/restores/json/memos": { "post": { "summary": "Import a batch of memos from an EdgeEver ZIP", "description": "Interactive-user-only merge restore, including current content and revision history. Matching EdgeEver memo IDs are overwritten.", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "memos": { "type": "array", "minItems": 1, "maxItems": 10, "items": { "type": "object", "additionalProperties": true } } }, "required": ["memos"] } } } }, "responses": { "200": { "$ref": "#/components/responses/Ok" } } } }, "/api/v1/restores/json/resources/{id}": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ], "put": { "summary": "Import one resource from an EdgeEver ZIP", "description": "Interactive-user-only resource import. The multipart metadata field contains the structured EdgeEver ZIP resource record.", "requestBody": { "required": true, "content": { "multipart/form-data": { "schema": { "type": "object", "properties": { "metadata": { "type": "string" }, "file": { "type": "string", "format": "binary" } }, "required": ["metadata", "file"] } } } }, "responses": { "200": { "$ref": "#/components/responses/Ok" } } } }, "/api/v1/resources": { "get": { "summary": "List resources and storage summary", "parameters": [ { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 500, "default": 500 } } ], "responses": { "200": { "description": "Resource list", "content": { "application/json": { "schema": { "type": "object", "properties": { "resources": { "type": "array", "items": { "$ref": "#/components/schemas/ResourceListItem" } }, "summary": { "$ref": "#/components/schemas/ResourceStorageSummary" } }, "required": ["resources", "summary"] } } } } } } }, "/api/v1/resources/{id}/blob": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ], "get": { "summary": "Read resource bytes", "responses": { "200": { "description": "Resource blob" } } } }, "/mcp": { "get": { "summary": "Describe MCP endpoint", "security": [], "responses": { "200": { "description": "MCP endpoint metadata" } } }, "post": { "summary": "MCP Streamable HTTP JSON-RPC endpoint", "description": "Supports initialize, tools/list, tools/call, notifications/initialized, and batch requests.", "requestBody": { "required": true, "content": { "application/json": { "schema": { "oneOf": [ { "$ref": "#/components/schemas/JsonRpcRequest" }, { "type": "array", "items": { "$ref": "#/components/schemas/JsonRpcRequest" } } ] } } } }, "responses": { "200": { "description": "JSON-RPC response" }, "204": { "description": "Notification accepted" } } } } }, "components": { "securitySchemes": { "bearerAuth": { "type": "http", "scheme": "bearer" }, "cookieAuth": { "type": "apiKey", "in": "cookie", "name": "edgeever_session" } }, "parameters": { "NotebookId": { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }, "MemoId": { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }, "ApiTokenId": { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } }, "responses": { "Ok": { "description": "OK", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Ok" } } } }, "Error": { "description": "API error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } } }, "NotebookResponse": { "description": "Notebook response", "content": { "application/json": { "schema": { "type": "object", "properties": { "notebook": { "$ref": "#/components/schemas/Notebook" } }, "required": ["notebook"] } } } }, "MemoResponse": { "description": "Memo response", "content": { "application/json": { "schema": { "type": "object", "properties": { "memo": { "$ref": "#/components/schemas/MemoDetail" } }, "required": ["memo"] } } } }, "UpdatedCount": { "description": "Updated count", "content": { "application/json": { "schema": { "type": "object", "properties": { "ok": { "type": "boolean" }, "updated": { "type": "integer" } }, "required": ["ok", "updated"] } } } } }, "schemas": { "Ok": { "type": "object", "properties": { "ok": { "type": "boolean" } }, "required": ["ok"] }, "ApiError": { "type": "object", "properties": { "error": { "type": "object", "properties": { "code": { "type": "string" }, "message": { "type": "string" }, "details": {} }, "required": ["code", "message"] } }, "required": ["error"] }, "AuthSession": { "type": "object", "properties": { "authRequired": { "type": "boolean" }, "authenticated": { "type": "boolean" }, "demoMode": { "type": "boolean" }, "user": { "oneOf": [ { "$ref": "#/components/schemas/AuthUser" }, { "type": "null" } ] } }, "required": ["authRequired", "authenticated", "demoMode", "user"] }, "LoginDeviceSession": { "type": "object", "properties": { "id": { "type": "string" }, "userAgent": { "type": ["string", "null"] }, "label": { "type": ["string", "null"] }, "ipAddress": { "type": ["string", "null"] }, "ipCountry": { "type": ["string", "null"] }, "ipRegion": { "type": ["string", "null"] }, "isCurrent": { "type": "boolean" }, "createdAt": { "type": "string", "format": "date-time" }, "lastSeenAt": { "type": "string", "format": "date-time" }, "expiresAt": { "type": "string", "format": "date-time" } }, "required": ["id", "userAgent", "label", "ipAddress", "ipCountry", "ipRegion", "isCurrent", "createdAt", "lastSeenAt", "expiresAt"] }, "AuthUser": { "type": "object", "properties": { "id": { "type": "string" }, "username": { "type": "string" }, "displayName": { "type": ["string", "null"] }, "role": { "type": "string", "enum": ["owner", "member"] } }, "required": ["id", "username", "displayName", "role"] }, "InstanceUser": { "allOf": [ { "$ref": "#/components/schemas/AuthUser" }, { "type": "object", "properties": { "isDisabled": { "type": "boolean" }, "lastLoginAt": { "type": ["string", "null"], "format": "date-time" }, "createdAt": { "type": "string", "format": "date-time" } }, "required": ["isDisabled", "lastLoginAt", "createdAt"] } ] }, "UserCreateInput": { "type": "object", "properties": { "username": { "type": "string", "minLength": 1, "maxLength": 80 }, "displayName": { "type": ["string", "null"], "maxLength": 80 }, "password": { "type": "string", "minLength": 8, "maxLength": 512 } }, "required": ["username", "password"] }, "UserUpdateInput": { "type": "object", "properties": { "displayName": { "type": ["string", "null"], "maxLength": 80 }, "password": { "type": "string", "minLength": 8, "maxLength": 512 }, "isDisabled": { "type": "boolean" } }, "minProperties": 1 }, "LoginInput": { "type": "object", "properties": { "username": { "type": "string" }, "password": { "type": "string" }, "deviceId": { "type": "string", "minLength": 16, "maxLength": 160, "description": "Stable client installation identifier used to replace older sessions from the same device" } }, "required": ["username", "password"] }, "ChangePasswordInput": { "type": "object", "properties": { "currentPassword": { "type": "string", "minLength": 1, "maxLength": 512 }, "newPassword": { "type": "string", "minLength": 8, "maxLength": 512 }, "confirmPassword": { "type": "string", "minLength": 8, "maxLength": 512 } }, "required": ["currentPassword", "newPassword", "confirmPassword"] }, "Notebook": { "type": "object", "properties": { "id": { "type": "string" }, "parentId": { "type": ["string", "null"] }, "name": { "type": "string" }, "slug": { "type": ["string", "null"] }, "icon": { "type": ["string", "null"] }, "color": { "type": ["string", "null"] }, "sortOrder": { "type": "integer" }, "memoCount": { "type": "integer" }, "lastMemoUpdatedAt": { "type": ["string", "null"], "format": "date-time" }, "createdAt": { "type": "string", "format": "date-time" }, "updatedAt": { "type": "string", "format": "date-time" } }, "required": ["id", "parentId", "name", "slug", "icon", "color", "sortOrder", "memoCount", "lastMemoUpdatedAt", "createdAt", "updatedAt"] }, "NotebookCreateInput": { "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 80 }, "parentId": { "type": ["string", "null"] } }, "required": ["name"] }, "NotebookUpdateInput": { "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 80 }, "parentId": { "type": ["string", "null"] }, "sortOrder": { "type": "integer" } } }, "MemoSummary": { "type": "object", "properties": { "id": { "type": "string" }, "notebookId": { "type": "string" }, "title": { "type": ["string", "null"] }, "excerpt": { "type": "string" }, "tags": { "type": "array", "items": { "type": "string" } }, "isPinned": { "type": "boolean" }, "isArchived": { "type": "boolean" }, "isDeleted": { "type": "boolean" }, "revision": { "type": "integer" }, "createdAt": { "type": "string", "format": "date-time" }, "updatedAt": { "type": "string", "format": "date-time" }, "deletedAt": { "type": ["string", "null"], "format": "date-time" } }, "required": ["id", "notebookId", "title", "excerpt", "tags", "isPinned", "isArchived", "isDeleted", "revision", "createdAt", "updatedAt", "deletedAt"] }, "MemoDetail": { "allOf": [ { "$ref": "#/components/schemas/MemoSummary" }, { "type": "object", "properties": { "contentJson": { "$ref": "#/components/schemas/TiptapDoc" }, "contentMarkdown": { "type": "string" }, "contentText": { "type": "string" }, "contentHash": { "type": "string", "minLength": 64, "maxLength": 64 }, "sourceMemoIds": { "type": "array", "items": { "type": "string" } }, "mergeSourceCount": { "type": "integer" }, "mergedIntoMemoId": { "type": ["string", "null"] } }, "required": ["contentJson", "contentMarkdown", "contentText", "contentHash", "sourceMemoIds", "mergeSourceCount", "mergedIntoMemoId"] } ] }, "MemoCreateInput": { "type": "object", "properties": { "notebookId": { "type": "string" }, "title": { "type": "string", "maxLength": 160 }, "contentMarkdown": { "type": "string" }, "tags": { "type": "array", "items": { "type": "string" } } }, "required": ["notebookId"] }, "MemoUpdateInput": { "type": "object", "properties": { "expectedRevision": { "type": "integer", "minimum": 0 }, "expectedContentHash": { "type": "string", "minLength": 64, "maxLength": 64 }, "editSessionId": { "type": "string" }, "notebookId": { "type": "string" }, "title": { "type": "string", "maxLength": 160 }, "isPinned": { "type": "boolean" }, "contentJson": { "$ref": "#/components/schemas/TiptapDoc" }, "contentMarkdown": { "type": "string" }, "tags": { "type": "array", "items": { "type": "string" } } } }, "MemoEditSession": { "type": "object", "properties": { "id": { "type": "string" }, "memoId": { "type": "string" }, "baseRevision": { "type": "integer", "minimum": 0 }, "baseContentHash": { "type": "string", "minLength": 64, "maxLength": 64 }, "expiresAt": { "type": "string", "format": "date-time" } }, "required": ["id", "memoId", "baseRevision", "baseContentHash", "expiresAt"] }, "MoveMemosInput": { "type": "object", "properties": { "memoIds": { "type": "array", "minItems": 1, "maxItems": 100, "items": { "type": "string" } }, "notebookId": { "type": "string" } }, "required": ["memoIds", "notebookId"] }, "DeleteMemosInput": { "type": "object", "properties": { "memoIds": { "type": "array", "minItems": 1, "maxItems": 100, "items": { "type": "string" } }, "permanent": { "type": "boolean" } }, "required": ["memoIds"] }, "MergeMemosInput": { "type": "object", "properties": { "memoIds": { "type": "array", "minItems": 2, "maxItems": 50, "items": { "type": "string" } }, "notebookId": { "type": "string" }, "title": { "type": "string", "maxLength": 160 } }, "required": ["memoIds"] }, "MemoRevision": { "type": "object", "properties": { "id": { "type": "string" }, "memoId": { "type": "string" }, "revision": { "type": "integer" }, "title": { "type": ["string", "null"] }, "tags": { "type": "array", "items": { "type": "string" } }, "contentMarkdown": { "type": "string" }, "contentText": { "type": "string" }, "contentHash": { "type": "string" }, "createdBy": { "type": "string" }, "createdAt": { "type": "string", "format": "date-time" } }, "required": ["id", "memoId", "revision", "title", "tags", "contentMarkdown", "contentText", "contentHash", "createdBy", "createdAt"] }, "TagSummary": { "type": "object", "properties": { "name": { "type": "string" }, "memoCount": { "type": "integer" }, "updatedAt": { "type": ["string", "null"], "format": "date-time" } }, "required": ["name", "memoCount", "updatedAt"] }, "TagRenameInput": { "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 80 } }, "required": ["name"] }, "ApiToken": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "token": { "type": ["string", "null"] }, "scopes": { "type": "array", "items": { "type": "string" } }, "lastUsedAt": { "type": ["string", "null"], "format": "date-time" }, "expiresAt": { "type": ["string", "null"], "format": "date-time" }, "isRevoked": { "type": "boolean" }, "createdAt": { "type": "string", "format": "date-time" } }, "required": ["id", "name", "token", "scopes", "lastUsedAt", "expiresAt", "isRevoked", "createdAt"] }, "ApiTokenCreateInput": { "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 80 }, "scopes": { "type": "array", "minItems": 1, "maxItems": 32, "items": { "type": "string" } }, "expiresAt": { "type": ["string", "null"], "format": "date-time" } }, "required": ["name", "scopes"] }, "CreatedApiToken": { "type": "object", "properties": { "token": { "type": "string" }, "apiToken": { "$ref": "#/components/schemas/ApiToken" } }, "required": ["token", "apiToken"] }, "Resource": { "type": "object", "properties": { "id": { "type": "string" }, "memoId": { "type": "string" }, "originalMemoId": { "type": ["string", "null"] }, "kind": { "type": "string", "enum": ["image", "attachment"] }, "mimeType": { "type": ["string", "null"] }, "filename": { "type": ["string", "null"] }, "byteSize": { "type": "integer" }, "sha256": { "type": ["string", "null"] }, "width": { "type": ["integer", "null"] }, "height": { "type": ["integer", "null"] }, "createdAt": { "type": "string", "format": "date-time" }, "updatedAt": { "type": "string", "format": "date-time" }, "url": { "type": "string" } }, "required": ["id", "memoId", "originalMemoId", "kind", "mimeType", "filename", "byteSize", "sha256", "width", "height", "createdAt", "updatedAt", "url"] }, "ResourceListItem": { "allOf": [ { "$ref": "#/components/schemas/Resource" }, { "type": "object", "properties": { "memoTitle": { "type": ["string", "null"] }, "memoExcerpt": { "type": ["string", "null"] }, "memoDeleted": { "type": "boolean" } }, "required": ["memoTitle", "memoExcerpt", "memoDeleted"] } ] }, "ResourceStorageSummary": { "type": "object", "properties": { "totalCount": { "type": "integer" }, "totalBytes": { "type": "integer" }, "imageCount": { "type": "integer" }, "attachmentCount": { "type": "integer" } }, "required": ["totalCount", "totalBytes", "imageCount", "attachmentCount"] }, "TiptapDoc": { "type": "object", "additionalProperties": true, "properties": { "type": { "type": "string", "const": "doc" }, "content": { "type": "array", "items": { "type": "object", "additionalProperties": true } } }, "required": ["type", "content"] }, "JsonRpcRequest": { "type": "object", "properties": { "jsonrpc": { "type": "string", "const": "2.0" }, "id": { "type": ["string", "number", "null"] }, "method": { "type": "string" }, "params": {} }, "required": ["jsonrpc", "method"] } } } }