# Elnora — Developer Documentation (full text) Complete developer documentation for the Elnora platform. Base API URL: https://platform.elnora.ai/api/v1 (header auth: X-API-Key). MCP endpoint: https://mcp.elnora.ai/mcp. --- # REST API reference Source: https://docs.elnora.ai/docs/api > The Elnora core REST API — base URL, authentication, conventions, and the full resource catalog. The Elnora **core REST API** is the programmatic surface behind the CLI, the MCP server, and the app. Everything you can do in the dashboard, you can do over HTTP. - **Base URL:** `https://platform.elnora.ai/api/v1` - **Format:** JSON request and response bodies. Resource ids are UUIDs. - **Auth:** an API key in the `X-API-Key` header (see [Authentication](/docs/get-started/authentication)). Every endpoint has a reference page under **API → Endpoints** with its parameters, request/response, and a copy-paste `curl` example — generated from the API's OpenAPI specification, so it always matches production. ## Authentication Send your API key on every request: ```bash curl https://platform.elnora.ai/api/v1/tasks \ -H "X-API-Key: $ELNORA_API_KEY" ``` You can equivalently send `Authorization: Bearer `. Interactive clients (including the MCP server) may use OAuth 2.1 instead. Requests act on your **active organization**; some endpoints accept an explicit organization id to target another org you belong to. ## Conventions - **Pagination** — list endpoints take `page` and `pageSize` (max 100); message history uses cursor pagination (`Cursor` / `Limit`). - **Versioning** — the API is versioned in the path (`/api/v1`). ### Errors Errors use standard HTTP status codes with a consistent JSON body: ```json { "errorCode": "NOT_FOUND", "messages": ["Task not found."], "correlationId": "b1f2…" } ``` `errorCode` is a stable machine-readable string (e.g. `BAD_REQUEST`, `UNAUTHORIZED`, `FORBIDDEN`, `NOT_FOUND`, `VERSION_CONFLICT`, `RATE_LIMIT_EXCEEDED`); `messages` is safe to show a user; `correlationId` identifies the request in our logs — include it when contacting support. Common statuses: `401` unauthenticated, `403` not permitted for your role, `404` not found, `409` a version conflict (re-read and retry), `422` validation error. ### Rate limits The API is rate limited per client. When you exceed a limit you get `429 Too Many Requests` with a `Retry-After` header (seconds to wait) and the error body above with `errorCode: "RATE_LIMIT_EXCEEDED"`. Back off and retry after the indicated delay; for bulk work, prefer batch endpoints and a modest concurrency. ## A first request Check connectivity and build provenance (no auth required): ```bash curl https://platform.elnora.ai/api/v1/version ``` Create a task and send the agent a message: ```bash # 1. Create a task curl -X POST https://platform.elnora.ai/api/v1/tasks \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "title": "Optimize transfection" }' # 2. Send a message; the agent works on it asynchronously curl -X POST https://platform.elnora.ai/api/v1/tasks//messages \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "content": "Optimize a HEK293 transfection protocol for higher yield" }' # 3. Read the reply — poll the task's messages until the agent responds. # Cursor pagination: pass ?Cursor=&Limit=50 to page. curl https://platform.elnora.ai/api/v1/tasks//messages \ -H "X-API-Key: $ELNORA_API_KEY" # Any files the agent produced are listed on the task's attachments. curl https://platform.elnora.ai/api/v1/tasks//attachments \ -H "X-API-Key: $ELNORA_API_KEY" ``` ## Resources | Resource | What it covers | | --- | --- | | **Account** | Your profile, email confirmation, sign-in, and account deletion. | | **API keys** | Create, list, and revoke keys; read and set your org's key policy. | | **Organizations** | List and switch orgs, members and roles, invitations, exports, billing status. | | **Invitations** | Look up and accept an invitation to join an organization. | | **Files** | Upload, download, share, move, and version files; working copies, fork, promote. | | **Folders** | Create, rename, move, archive, and share folders. | | **Library** | Your organization's shared collection of reusable content. | | **Tasks & messages** | Drive the agent — create tasks, send messages, read attachments. | | **Search** | Search across tasks, files, file content, and your knowledge base. | | **Audit log** | Read your organization's audit trail (org admins). | | **Feedback** | Submit product feedback. | | **Version** | Build and release provenance. | Per-endpoint pages are listed under **API → Endpoints** in the sidebar, grouped by resource. They are generated from the OpenAPI spec and regenerated automatically whenever the API changes, so they never drift from production. --- # Account Source: https://docs.elnora.ai/docs/api/reference/account > Account endpoints of the Elnora REST API. Base URL `https://platform.elnora.ai/api/v1`. Authenticate every request with the `X-API-Key` header — see [Authentication](/docs/get-started/authentication). ## `POST` /account/ConfirmEmail ```bash curl -X POST https://platform.elnora.ai/api/v1/account/ConfirmEmail \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ ... }' ``` **Request body** | Field | Type | Required | | --- | --- | --- | | `email` | string | no | | `token` | string | no | **Responses**: `200` · `404` ## `POST` /account/ExternalLogin Third party login and signup. ```bash curl -X POST https://platform.elnora.ai/api/v1/account/ExternalLogin \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" ``` **Responses**: `200` ## `GET` /account/ExternalLoginCallback For third party login and signup. ```bash curl https://platform.elnora.ai/api/v1/account/ExternalLoginCallback \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `returnUrl` | query | string | no | | `signup` | query | boolean | no | **Responses**: `200` ## `POST` /account/MagicLink/CompleteRegistration Complete registration for new user after magic link verification ```bash curl -X POST https://platform.elnora.ai/api/v1/account/MagicLink/CompleteRegistration \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "email": "user@example.com", "code": "...", "firstName": "...", "lastName": "...", "termsConditions": true, "privacyPolicy": true }' ``` **Request body** | Field | Type | Required | | --- | --- | --- | | `email` | email | yes | | `code` | string | yes | | `firstName` | string | yes | | `lastName` | string | yes | | `displayName` | string | no | | `termsConditions` | boolean | yes | | `privacyPolicy` | boolean | yes | | `marketingConsent` | boolean | no | | `invitationToken` | string | no | **Responses**: `200` · `400` ## `POST` /account/MagicLink/Request Request a magic link for passwordless authentication ```bash curl -X POST https://platform.elnora.ai/api/v1/account/MagicLink/Request \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "email": "user@example.com" }' ``` **Request body** | Field | Type | Required | | --- | --- | --- | | `email` | email | yes | **Responses**: `200` · `400` ## `POST` /account/MagicLink/Verify Verify a magic link token and authenticate existing user ```bash curl -X POST https://platform.elnora.ai/api/v1/account/MagicLink/Verify \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "email": "user@example.com", "code": "..." }' ``` **Request body** | Field | Type | Required | | --- | --- | --- | | `email` | email | yes | | `code` | string | yes | **Responses**: `200` · `400` ## `DELETE` /account/me Self-delete: authenticated user deletes their own account. ```bash curl -X DELETE https://platform.elnora.ai/api/v1/account/me \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Responses**: `200` · `400` · `409` ## `GET` /account/sso-callback Cognito redirect target after the IdP round-trip. ```bash curl https://platform.elnora.ai/api/v1/account/sso-callback \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `code` | query | string | no | | `state` | query | string | no | | `error` | query | string | no | **Responses**: `200` ## `GET` /account/sso/start Initiate an enterprise SSO sign-in. ```bash curl https://platform.elnora.ai/api/v1/account/sso/start \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `email` | query | string | no | | `returnUrl` | query | string | no | | `test` | query | boolean | no | **Responses**: `200` ## `GET` /account/user/{appUserId} For user to get their own aggregated information ```bash curl https://platform.elnora.ai/api/v1/account/user/{appUserId} \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `appUserId` | path | int32 | yes | **Responses**: `200` · `404` ## `PUT` /account/user/{appUserId} For user to update their own information ```bash curl -X PUT https://platform.elnora.ai/api/v1/account/user/{appUserId} \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ ... }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `appUserId` | path | int32 | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `displayName` | string | no | | `firstName` | string | no | | `lastName` | string | no | | `currentPosition` | string | no | | `currentEmployer` | string | no | | `hopes` | string | no | | `useCase` | string | no | | `referralCode` | string | no | | `acceptedTermsAndConditions` | uuid | no | | `acceptedPrivacyPolicy` | uuid | no | | `marketingConsent` | boolean | no | **Responses**: `200` · `404` --- # API keys Source: https://docs.elnora.ai/docs/api/reference/api-keys > API keys endpoints of the Elnora REST API. Base URL `https://platform.elnora.ai/api/v1`. Authenticate every request with the `X-API-Key` header — see [Authentication](/docs/get-started/authentication). ## `GET` /api-keys List API keys. ```bash curl https://platform.elnora.ai/api/v1/api-keys \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `scope` | query | string | no | **Responses**: `200` · `403` ## `POST` /api-keys Create a new API key for the user's active organization. ```bash curl -X POST https://platform.elnora.ai/api/v1/api-keys \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "..." }' ``` **Request body** | Field | Type | Required | | --- | --- | --- | | `name` | string | yes | | `expiresAt` | date-time | no | **Responses**: `200` · `403` ## `DELETE` /api-keys/{id} Revoke an API key. ```bash curl -X DELETE https://platform.elnora.ai/api/v1/api-keys/{id} \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `204` · `404` ## `GET` /api-keys/policy Get the API key creation policy for the organization. ```bash curl https://platform.elnora.ai/api/v1/api-keys/policy \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Responses**: `200` ## `PUT` /api-keys/policy Set the API key creation policy for the organization (Owner/Admin only). ```bash curl -X PUT https://platform.elnora.ai/api/v1/api-keys/policy \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ ... }' ``` **Request body** | Field | Type | Required | | --- | --- | --- | | `policy` | string | no | **Responses**: `204` · `403` --- # Audit log Source: https://docs.elnora.ai/docs/api/reference/audit > Audit log endpoints of the Elnora REST API. Base URL `https://platform.elnora.ai/api/v1`. Authenticate every request with the `X-API-Key` header — see [Authentication](/docs/get-started/authentication). ## `GET` /organizations/{orgId}/audit-log Query audit log for the organization. ```bash curl https://platform.elnora.ai/api/v1/organizations/{orgId}/audit-log \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `orgId` | path | uuid | yes | | `ActorType` | query | string | no | | `Action` | query | string | no | | `ResourceType` | query | string | no | | `ResourceId` | query | uuid | no | | `UserId` | query | int32 | no | | `AgentName` | query | string | no | | `DateFrom` | query | date-time | no | | `DateTo` | query | date-time | no | | `Page` | query | int32 | no | | `PageSize` | query | int32 | no | | `SortBy` | query | string | no | | `SortDirection` | query | string | no | **Responses**: `200` · `403` --- # Feedback Source: https://docs.elnora.ai/docs/api/reference/feedback > Feedback endpoints of the Elnora REST API. Base URL `https://platform.elnora.ai/api/v1`. Authenticate every request with the `X-API-Key` header — see [Authentication](/docs/get-started/authentication). ## `POST` /feedback Submit user feedback (bug report or feature request) to Linear ```bash curl -X POST https://platform.elnora.ai/api/v1/feedback \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "type": 0, "title": "...", "description": "..." }' ``` **Request body** | Field | Type | Required | | --- | --- | --- | | `type` | FeedbackType | yes | | `title` | string | yes | | `description` | string | yes | | `context` | string | no | | `url` | string | no | | `pageType` | string | no | | `screenSize` | string | no | | `viewportSize` | string | no | | `deviceType` | string | no | | `environment` | string | no | | `protocolId` | string | no | | `protocolTitle` | string | no | | `protocolStatus` | string | no | | `acquisitionMethod` | string | no | | `activeTab` | string | no | | `versionIteration` | int32 | no | **Responses**: `200` · `401` · `403` · `404` --- # Files Source: https://docs.elnora.ai/docs/api/reference/files > Files endpoints of the Elnora REST API. Base URL `https://platform.elnora.ai/api/v1`. Authenticate every request with the `X-API-Key` header — see [Authentication](/docs/get-started/authentication). ## `GET` /attachments/search Search the org's rendered agent exports (task attachments) by name for the @-mention picker. ```bash curl https://platform.elnora.ai/api/v1/attachments/search \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `q` | query | string | no | | `limit` | query | int32 | no | **Responses**: `200` ## `POST` /files Create a file (markdown/document). ```bash curl -X POST https://platform.elnora.ai/api/v1/files \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "...", "fileType": "..." }' ``` **Request body** | Field | Type | Required | | --- | --- | --- | | `name` | string | yes | | `description` | string | no | | `fileType` | string | yes | | `contentType` | string | no | | `folderId` | uuid | no | | `tags` | string[] | no | | `content` | string | no | **Responses**: `201` · `400` ## `GET` /files/{id} Get file detail with version info. ```bash curl https://platform.elnora.ai/api/v1/files/{id} \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `200` · `400` ## `PUT` /files/{id} Update file metadata. ```bash curl -X PUT https://platform.elnora.ai/api/v1/files/{id} \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ ... }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `name` | string | no | | `description` | string | no | | `folderId` | uuid | no | | `clearFolder` | boolean | no | | `tags` | string[] | no | **Responses**: `200` · `400` ## `DELETE` /files/{id} Soft-delete a file. ```bash curl -X DELETE https://platform.elnora.ai/api/v1/files/{id} \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `204` · `403` · `404` ## `GET` /files/{id}/access "Who has access" (KB Sharing v3): the full EFFECTIVE access list for a file — every principal who can reach it, each labelled direct (granted on the file) or inherited (from its folder). ```bash curl https://platform.elnora.ai/api/v1/files/{id}/access \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `200` · `403` · `404` ## `POST` /files/{id}/commit Commit working copy changes to the original published file. ```bash curl -X POST https://platform.elnora.ai/api/v1/files/{id}/commit \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `201` · `400` ## `GET` /files/{id}/content Get file content (presigned download URL). ```bash curl https://platform.elnora.ai/api/v1/files/{id}/content \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `200` · `400` ## `GET` /files/{id}/download Stream file download through the backend. ```bash curl https://platform.elnora.ai/api/v1/files/{id}/download \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `200` · `400` ## `POST` /files/{id}/fork Fork a file to another project. ```bash curl -X POST https://platform.elnora.ai/api/v1/files/{id}/fork \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ ... }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `newName` | string | no | | `targetFolderId` | uuid | no | **Responses**: `201` · `400` ## `PATCH` /files/{id}/move Move a file to a new workspace-model parent folder. ```bash curl -X PATCH https://platform.elnora.ai/api/v1/files/{id}/move \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "parentFolderId": "00000000-0000-0000-0000-000000000000" }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `parentFolderId` | uuid | yes | **Responses**: `200` · `400` · `403` · `404` ## `POST` /files/{id}/promote Promote file visibility. ```bash curl -X POST https://platform.elnora.ai/api/v1/files/{id}/promote \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "visibility": "..." }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `visibility` | string | yes | | `orgFolderId` | uuid | no | **Responses**: `200` · `400` ## `POST` /files/{id}/share Share a file with a specific user, a team, or the whole org (default role: editor). ```bash curl -X POST https://platform.elnora.ai/api/v1/files/{id}/share \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "role": "..." }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `userId` | int32 | no | | `teamId` | uuid | no | | `isOrgWide` | boolean | no | | `role` | string | yes | **Responses**: `201` · `400` · `403` · `404` ## `DELETE` /files/{id}/share/{aceId} Revoke a file share by ace id. ```bash curl -X DELETE https://platform.elnora.ai/api/v1/files/{id}/share/{aceId} \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | | `aceId` | path | uuid | yes | **Responses**: `204` · `403` · `404` ## `GET` /files/{id}/shares List the current shares on a file (with resolved principal name/email). ```bash curl https://platform.elnora.ai/api/v1/files/{id}/shares \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `200` · `403` · `404` ## `POST` /files/{id}/upload/confirm Confirm upload completed. ```bash curl -X POST https://platform.elnora.ai/api/v1/files/{id}/upload/confirm \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | | `versionId` | query | uuid | no | **Responses**: `200` · `400` ## `GET` /files/{id}/versions List version history. ```bash curl https://platform.elnora.ai/api/v1/files/{id}/versions \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `200` · `400` ## `POST` /files/{id}/versions Create a new version (manual edit). ```bash curl -X POST https://platform.elnora.ai/api/v1/files/{id}/versions \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "content": "..." }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `content` | string | yes | | `changeSummary` | string | no | | `changeSource` | string | no | | `baseVersionId` | uuid | no | **Responses**: `201` · `400` ## `GET` /files/{id}/versions/{versionId}/content Get specific version content (presigned download URL). ```bash curl https://platform.elnora.ai/api/v1/files/{id}/versions/{versionId}/content \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | | `versionId` | path | uuid | yes | **Responses**: `200` · `400` ## `POST` /files/{id}/versions/{versionId}/restore Restore a previous version (creates new version with old content). ```bash curl -X POST https://platform.elnora.ai/api/v1/files/{id}/versions/{versionId}/restore \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | | `versionId` | path | uuid | yes | **Responses**: `201` · `400` ## `POST` /files/{id}/working-copy Create a working copy of a published file for editing within a task. ```bash curl -X POST https://platform.elnora.ai/api/v1/files/{id}/working-copy \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | | `taskId` | query | uuid | no | **Responses**: `201` · `400` ## `GET` /files/search Search the org's files by name (KB + task inputs/results) for the @-mention picker. ```bash curl https://platform.elnora.ai/api/v1/files/search \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `q` | query | string | no | | `limit` | query | int32 | no | **Responses**: `200` ## `POST` /files/upload Initiate a file upload (get presigned URL). ```bash curl -X POST https://platform.elnora.ai/api/v1/files/upload \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "fileName": "...", "contentType": "...", "fileSizeBytes": "..." }' ``` **Request body** | Field | Type | Required | | --- | --- | --- | | `fileName` | string | yes | | `contentType` | string | yes | | `fileSizeBytes` | int64 | yes | | `folderId` | uuid | no | | `taskId` | uuid | no | **Responses**: `200` · `400` ## `POST` /files/upload/batch Batch initiate uploads for multiple files (max 50). ```bash curl -X POST https://platform.elnora.ai/api/v1/files/upload/batch \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "items": [] }' ``` **Request body** | Field | Type | Required | | --- | --- | --- | | `items` | InitiateUpload[] | yes | **Responses**: `400` ## `GET` /organizations/{orgId}/files List ALL files across projects (org admin compliance view). ```bash curl https://platform.elnora.ai/api/v1/organizations/{orgId}/files \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `orgId` | path | uuid | yes | | `Page` | query | int32 | no | | `PageSize` | query | int32 | no | | `SortBy` | query | string | no | | `SortDirection` | query | string | no | **Responses**: `200` ## `POST` /tasks/{taskId}/files/rendered User-initiated rendered file write (e.g. ```bash curl -X POST https://platform.elnora.ai/api/v1/tasks/{taskId}/files/rendered \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ ... }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `taskId` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `fileName` | string | no | | `contentType` | string | no | | `sizeBytes` | int64 | no | | `sourceFileId` | uuid | no | | `sourceVersionId` | uuid | no | **Responses**: `201` · `400` ## `POST` /tasks/{taskId}/files/rendered/{id}/confirm Confirm a user-initiated rendered file version after the presigned PUT completed. ```bash curl -X POST https://platform.elnora.ai/api/v1/tasks/{taskId}/files/rendered/{id}/confirm \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ ... }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `taskId` | path | uuid | yes | | `id` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `versionId` | uuid | no | **Responses**: `200` · `400` --- # Folders Source: https://docs.elnora.ai/docs/api/reference/folders > Folders endpoints of the Elnora REST API. Base URL `https://platform.elnora.ai/api/v1`. Authenticate every request with the `X-API-Key` header — see [Authentication](/docs/get-started/authentication). ## `POST` /folders Create a folder. ```bash curl -X POST https://platform.elnora.ai/api/v1/folders \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "...", "visibility": "..." }' ``` **Request body** | Field | Type | Required | | --- | --- | --- | | `name` | string | yes | | `parentFolderId` | uuid | no | | `visibility` | string | yes | | `kind` | string | no | **Responses**: `201` · `400` · `403` ## `GET` /folders/{id} Folder metadata plus breadcrumbs (root → folder), walked via the closure table. ```bash curl https://platform.elnora.ai/api/v1/folders/{id} \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `200` · `403` · `404` ## `PATCH` /folders/{id} Rename and/or move a folder. ```bash curl -X PATCH https://platform.elnora.ai/api/v1/folders/{id} \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ ... }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `name` | string | no | | `parentFolderId` | uuid | no | | `moveToRoot` | boolean | no | **Responses**: `200` · `400` · `403` · `404` ## `GET` /folders/{id}/access "Who has access" (KB Sharing v3): the full EFFECTIVE access list for a folder — every principal who can reach it, each labelled direct (granted on this folder) or inherited (cascaded from an ancestor). ```bash curl https://platform.elnora.ai/api/v1/folders/{id}/access \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `200` · `403` ## `POST` /folders/{id}/archive Soft-delete (archive) a folder. ```bash curl -X POST https://platform.elnora.ai/api/v1/folders/{id}/archive \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `204` · `403` · `404` ## `POST` /folders/{id}/break-inheritance Stops a folder from inheriting ACEs from its ancestor scope, copying the currently-effective ACEs onto the folder first. ```bash curl -X POST https://platform.elnora.ai/api/v1/folders/{id}/break-inheritance \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `204` · `403` · `404` ## `GET` /folders/{id}/children Direct children of id visible to the current user. ```bash curl https://platform.elnora.ai/api/v1/folders/{id}/children \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `200` · `403` ## `GET` /folders/{id}/contained-overrides Warn-on-narrow (KB Sharing v3): files inside this folder that are shared MORE widely than the folder — they carry their own share that would survive a narrowing. ```bash curl https://platform.elnora.ai/api/v1/folders/{id}/contained-overrides \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `200` · `403` ## `GET` /folders/{id}/files Paged list of files directly placed under workspace-model folder id. ```bash curl https://platform.elnora.ai/api/v1/folders/{id}/files \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | | `page` | query | int32 | no | | `pageSize` | query | int32 | no | **Responses**: `200` · `403` ## `POST` /folders/{id}/files/upload Initiate a single file upload into the workspace-model folder id. ```bash curl -X POST https://platform.elnora.ai/api/v1/folders/{id}/files/upload \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "fileName": "...", "contentType": "...", "fileSizeBytes": "..." }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `fileName` | string | yes | | `contentType` | string | yes | | `fileSizeBytes` | int64 | yes | | `taskId` | uuid | no | **Responses**: `200` · `400` · `403` ## `POST` /folders/{id}/files/upload/batch Batch initiate uploads for multiple files (max 50) all landing under the workspace-model folder id. ```bash curl -X POST https://platform.elnora.ai/api/v1/folders/{id}/files/upload/batch \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "items": [] }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `items` | InitiateFolderUpload[] | yes | **Responses**: `200` · `400` · `403` ## `PATCH` /folders/{id}/move Dedicated folder-reparent endpoint backing the workspace tree's drag-and-drop UX. ```bash curl -X PATCH https://platform.elnora.ai/api/v1/folders/{id}/move \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ ... }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `parentFolderId` | uuid | no | **Responses**: `200` · `400` · `403` · `404` ## `POST` /folders/{id}/narrow-cascade Explicit, previewed narrow-cascade (KB Sharing v3): clears the audience-widening shares on the listed contained files. ```bash curl -X POST https://platform.elnora.ai/api/v1/folders/{id}/narrow-cascade \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ ... }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `fileIds` | uuid[] | no | **Responses**: `200` · `403` ## `POST` /folders/{id}/share Adds a folder ACE. ```bash curl -X POST https://platform.elnora.ai/api/v1/folders/{id}/share \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "role": "..." }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `userId` | int32 | no | | `teamId` | uuid | no | | `isOrgWide` | boolean | no | | `role` | string | yes | **Responses**: `201` · `400` · `403` · `404` ## `DELETE` /folders/{id}/share/{aceId} Removes a folder ACE by id. ```bash curl -X DELETE https://platform.elnora.ai/api/v1/folders/{id}/share/{aceId} \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | | `aceId` | path | uuid | yes | **Responses**: `204` · `403` · `404` ## `GET` /folders/{id}/shares List the current shares on a folder (with resolved principal name/email). ```bash curl https://platform.elnora.ai/api/v1/folders/{id}/shares \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `200` · `403` ## `POST` /folders/drafts-user Eagerly seed the per-user drafts folder `uploads/<U>/_drafts/` for the CURRENT user and return its id. ```bash curl -X POST https://platform.elnora.ai/api/v1/folders/drafts-user \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" ``` **Responses**: `200` · `400` · `401` ## `POST` /folders/ensure-user-kb-folder Eagerly seed the per-user personal subfolder `knowledge-base/<DisplayName>/` for the CURRENT user and return both the user-folder id and the KB root id. ```bash curl -X POST https://platform.elnora.ai/api/v1/folders/ensure-user-kb-folder \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ ... }' ``` **Request body** | Field | Type | Required | | --- | --- | --- | | `displayName` | string | no | **Responses**: `200` · `400` · `401` ## `GET` /folders/files Flat list of files visible to the current user across every folder in the active organization. ```bash curl https://platform.elnora.ai/api/v1/folders/files \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `q` | query | string | no | **Responses**: `200` ## `GET` /folders/roots Top-level folders in the current user's organization that the user can read. ```bash curl https://platform.elnora.ai/api/v1/folders/roots \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Responses**: `200` ## `GET` /folders/sharing-drift Org sharing-drift report (KB Sharing v3, ): files whose audience is wider than their folder, org-wide. ```bash curl https://platform.elnora.ai/api/v1/folders/sharing-drift \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Responses**: `200` · `403` ## `POST` /folders/uploads-task/{taskId} Eagerly seed the per-task uploads folder `uploads/<U>/<taskId>/` for the CURRENT user and return its id. ```bash curl -X POST https://platform.elnora.ai/api/v1/folders/uploads-task/{taskId} \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `taskId` | path | uuid | yes | **Responses**: `200` · `400` · `401` --- # Invitations Source: https://docs.elnora.ai/docs/api/reference/invitations > Invitations endpoints of the Elnora REST API. Base URL `https://platform.elnora.ai/api/v1`. Authenticate every request with the `X-API-Key` header — see [Authentication](/docs/get-started/authentication). ## `GET` /invitations/{token} Get invitation details by token (public endpoint for invitation page) ```bash curl https://platform.elnora.ai/api/v1/invitations/{token} \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `token` | path | string | yes | **Responses**: `200` · `404` ## `POST` /invitations/{token}/accept Accept an invitation and join the organization ```bash curl -X POST https://platform.elnora.ai/api/v1/invitations/{token}/accept \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `token` | path | string | yes | **Responses**: `200` · `400` · `401` ## `GET` /organizations/{organizationId}/invitations Get all unaccepted invitations for the organization (both pending and expired). ```bash curl https://platform.elnora.ai/api/v1/organizations/{organizationId}/invitations \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `organizationId` | path | uuid | yes | **Responses**: `200` · `403` ## `POST` /organizations/{organizationId}/invitations Create and send an invitation to join the organization ```bash curl -X POST https://platform.elnora.ai/api/v1/organizations/{organizationId}/invitations \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "email": "user@example.com" }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `organizationId` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `email` | email | yes | | `role` | string | no | **Responses**: `200` · `400` · `403` ## `DELETE` /organizations/{organizationId}/invitations/{invitationId} Cancel a pending invitation ```bash curl -X DELETE https://platform.elnora.ai/api/v1/organizations/{organizationId}/invitations/{invitationId} \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `organizationId` | path | uuid | yes | | `invitationId` | path | uuid | yes | **Responses**: `200` · `400` · `403` ## `POST` /organizations/{organizationId}/invitations/{invitationId}/resend Resend an invitation email. ```bash curl -X POST https://platform.elnora.ai/api/v1/organizations/{organizationId}/invitations/{invitationId}/resend \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `organizationId` | path | uuid | yes | | `invitationId` | path | uuid | yes | **Responses**: `200` · `400` · `403` --- # Library Source: https://docs.elnora.ai/docs/api/reference/library > Library endpoints of the Elnora REST API. Base URL `https://platform.elnora.ai/api/v1`. Authenticate every request with the `X-API-Key` header — see [Authentication](/docs/get-started/authentication). ## `GET` /organizations/{orgId}/library/files List published files in the organization library. ```bash curl https://platform.elnora.ai/api/v1/organizations/{orgId}/library/files \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `orgId` | path | uuid | yes | | `folderId` | query | uuid | no | | `Page` | query | int32 | no | | `PageSize` | query | int32 | no | | `SortBy` | query | string | no | | `SortDirection` | query | string | no | **Responses**: `200` ## `GET` /organizations/{orgId}/library/folders Get org library folder tree. ```bash curl https://platform.elnora.ai/api/v1/organizations/{orgId}/library/folders \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `orgId` | path | uuid | yes | **Responses**: `200` ## `POST` /organizations/{orgId}/library/folders Create an org library folder (admin only). ```bash curl -X POST https://platform.elnora.ai/api/v1/organizations/{orgId}/library/folders \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "..." }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `orgId` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `name` | string | yes | | `parentFolderId` | uuid | no | **Responses**: `201` ## `PUT` /organizations/{orgId}/library/folders/{id} Rename an org library folder (admin only). ```bash curl -X PUT https://platform.elnora.ai/api/v1/organizations/{orgId}/library/folders/{id} \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "..." }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `orgId` | path | uuid | yes | | `id` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `name` | string | yes | **Responses**: `200` ## `DELETE` /organizations/{orgId}/library/folders/{id} Delete an org library folder (admin only). ```bash curl -X DELETE https://platform.elnora.ai/api/v1/organizations/{orgId}/library/folders/{id} \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `orgId` | path | uuid | yes | | `id` | path | uuid | yes | **Responses**: `204` --- # Organizations Source: https://docs.elnora.ai/docs/api/reference/organizations > Organizations endpoints of the Elnora REST API. Base URL `https://platform.elnora.ai/api/v1`. Authenticate every request with the `X-API-Key` header — see [Authentication](/docs/get-started/authentication). ## `GET` /organizations Get current user's organizations ```bash curl https://platform.elnora.ai/api/v1/organizations \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Responses**: `200` ## `GET` /organizations/{organizationId} Get organization by ID ```bash curl https://platform.elnora.ai/api/v1/organizations/{organizationId} \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `organizationId` | path | uuid | yes | **Responses**: `200` · `403` · `404` ## `PUT` /organizations/{organizationId} Update organization ```bash curl -X PUT https://platform.elnora.ai/api/v1/organizations/{organizationId} \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ ... }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `organizationId` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `name` | string | no | **Responses**: `200` · `403` · `404` ## `GET` /organizations/{organizationId}/billing-status Get billing status for an organization ```bash curl https://platform.elnora.ai/api/v1/organizations/{organizationId}/billing-status \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `organizationId` | path | uuid | yes | **Responses**: `200` · `403` · `404` ## `POST` /organizations/{organizationId}/exports Request an org-wide data export (JSON + CSV + original file formats + AI memory). ```bash curl -X POST https://platform.elnora.ai/api/v1/organizations/{organizationId}/exports \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `organizationId` | path | uuid | yes | **Responses**: `202` · `403` ## `GET` /organizations/{organizationId}/exports/{jobId} Get the status of an export job. ```bash curl https://platform.elnora.ai/api/v1/organizations/{organizationId}/exports/{jobId} \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `organizationId` | path | uuid | yes | | `jobId` | path | uuid | yes | **Responses**: `200` · `404` ## `GET` /organizations/{organizationId}/exports/{jobId}/download Download a completed export bundle — redirects to a freshly signed, short-lived S3 URL. ```bash curl https://platform.elnora.ai/api/v1/organizations/{organizationId}/exports/{jobId}/download \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `organizationId` | path | uuid | yes | | `jobId` | path | uuid | yes | **Responses**: `302` · `404` ## `PATCH` /organizations/{organizationId}/kb-autotidy Toggle the org's self-managing-KB autonomous curation (on-upload ingest + weekly sweep). ```bash curl -X PATCH https://platform.elnora.ai/api/v1/organizations/{organizationId}/kb-autotidy \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ ... }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `organizationId` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `enabled` | boolean | no | **Responses**: `200` · `403` · `404` ## `GET` /organizations/{organizationId}/members Get organization members ```bash curl https://platform.elnora.ai/api/v1/organizations/{organizationId}/members \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `organizationId` | path | uuid | yes | **Responses**: `200` · `403` ## `DELETE` /organizations/{organizationId}/members/{membershipId} Remove a member from an organization ```bash curl -X DELETE https://platform.elnora.ai/api/v1/organizations/{organizationId}/members/{membershipId} \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `organizationId` | path | uuid | yes | | `membershipId` | path | uuid | yes | **Responses**: `204` · `400` · `403` ## `PUT` /organizations/{organizationId}/members/{membershipId}/role Update a member's role within an organization ```bash curl -X PUT https://platform.elnora.ai/api/v1/organizations/{organizationId}/members/{membershipId}/role \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ ... }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `organizationId` | path | uuid | yes | | `membershipId` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `role` | string | no | **Responses**: `204` · `400` · `403` ## `GET` /organizations/{organizationId}/members/directory Member-accessible directory for the Share modal typeahead (KB Access V2 / ). ```bash curl https://platform.elnora.ai/api/v1/organizations/{organizationId}/members/directory \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `organizationId` | path | uuid | yes | | `q` | query | string | no | **Responses**: `200` · `403` ## `PUT` /organizations/{organizationId}/set-default Set an organization as the user's default (loaded on login). ```bash curl -X PUT https://platform.elnora.ai/api/v1/organizations/{organizationId}/set-default \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `organizationId` | path | uuid | yes | **Responses**: `204` · `400` · `403` ## `POST` /organizations/{organizationId}/switch Switch the user's active organization and return a new JWT. ```bash curl -X POST https://platform.elnora.ai/api/v1/organizations/{organizationId}/switch \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `organizationId` | path | uuid | yes | **Responses**: `200` · `403` --- # Projects Source: https://docs.elnora.ai/docs/api/reference/projects > Projects endpoints of the Elnora REST API. Base URL `https://platform.elnora.ai/api/v1`. Authenticate every request with the `X-API-Key` header — see [Authentication](/docs/get-started/authentication). ## `GET` /projects List user's projects in the active organization. ```bash curl https://platform.elnora.ai/api/v1/projects \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `Page` | query | int32 | no | | `PageSize` | query | int32 | no | | `SortBy` | query | string | no | | `SortDirection` | query | string | no | **Responses**: `200` · `400` ## `POST` /projects Create a new project. ```bash curl -X POST https://platform.elnora.ai/api/v1/projects \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "..." }' ``` **Request body** | Field | Type | Required | | --- | --- | --- | | `name` | string | yes | | `description` | string | no | | `icon` | string | no | **Responses**: `201` · `400` ## `GET` /projects/{id} Get project details. ```bash curl https://platform.elnora.ai/api/v1/projects/{id} \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `200` ## `PUT` /projects/{id} Update a project. ```bash curl -X PUT https://platform.elnora.ai/api/v1/projects/{id} \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ ... }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `name` | string | no | | `description` | string | no | | `icon` | string | no | **Responses**: `200` ## `DELETE` /projects/{id} Archive a project. ```bash curl -X DELETE https://platform.elnora.ai/api/v1/projects/{id} \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `204` ## `POST` /projects/{id}/leave Leave a project (self-removal). ```bash curl -X POST https://platform.elnora.ai/api/v1/projects/{id}/leave \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `204` ## `GET` /projects/{id}/members List project members. ```bash curl https://platform.elnora.ai/api/v1/projects/{id}/members \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `200` ## `POST` /projects/{id}/members Add a member to the project. ```bash curl -X POST https://platform.elnora.ai/api/v1/projects/{id}/members \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "userId": "..." }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `userId` | int32 | yes | | `role` | string | no | **Responses**: `201` ## `PUT` /projects/{id}/members/{memberUserId} Update a member's role. ```bash curl -X PUT https://platform.elnora.ai/api/v1/projects/{id}/members/{memberUserId} \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "role": "..." }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | | `memberUserId` | path | int32 | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `role` | string | yes | **Responses**: `204` ## `DELETE` /projects/{id}/members/{memberUserId} Remove a member from the project. ```bash curl -X DELETE https://platform.elnora.ai/api/v1/projects/{id}/members/{memberUserId} \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | | `memberUserId` | path | int32 | yes | **Responses**: `204` --- # Search Source: https://docs.elnora.ai/docs/api/reference/search > Search endpoints of the Elnora REST API. Base URL `https://platform.elnora.ai/api/v1`. Authenticate every request with the `X-API-Key` header — see [Authentication](/docs/get-started/authentication). ## `GET` /search Search everything (tasks + files). ```bash curl https://platform.elnora.ai/api/v1/search \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `q` | query | string | no | | `Page` | query | int32 | no | | `PageSize` | query | int32 | no | | `SortBy` | query | string | no | | `SortDirection` | query | string | no | **Responses**: `200` ## `GET` /search/file-content Search file content via full-text search. ```bash curl https://platform.elnora.ai/api/v1/search/file-content \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `q` | query | string | no | | `Page` | query | int32 | no | | `PageSize` | query | int32 | no | | `SortBy` | query | string | no | | `SortDirection` | query | string | no | **Responses**: `200` ## `GET` /search/files Search files by name. ```bash curl https://platform.elnora.ai/api/v1/search/files \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `q` | query | string | no | | `Page` | query | int32 | no | | `PageSize` | query | int32 | no | | `SortBy` | query | string | no | | `SortDirection` | query | string | no | **Responses**: `200` ## `GET` /search/tasks Search across user's task messages. ```bash curl https://platform.elnora.ai/api/v1/search/tasks \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `q` | query | string | no | | `Page` | query | int32 | no | | `PageSize` | query | int32 | no | | `SortBy` | query | string | no | | `SortDirection` | query | string | no | **Responses**: `200` --- # Tasks & messages Source: https://docs.elnora.ai/docs/api/reference/tasks > Tasks & messages endpoints of the Elnora REST API. Base URL `https://platform.elnora.ai/api/v1`. Authenticate every request with the `X-API-Key` header — see [Authentication](/docs/get-started/authentication). ## `GET` /tasks List all user's tasks across projects. ```bash curl https://platform.elnora.ai/api/v1/tasks \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `Page` | query | int32 | no | | `PageSize` | query | int32 | no | | `SortBy` | query | string | no | | `SortDirection` | query | string | no | | `status` | query | string | no | **Responses**: `200` · `400` ## `POST` /tasks Create a new task. ```bash curl -X POST https://platform.elnora.ai/api/v1/tasks \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ ... }' ``` **Request body** | Field | Type | Required | | --- | --- | --- | | `title` | string | no | | `initialMessage` | string | no | | `contextFileIds` | uuid[] | no | | `referencedFileIds` | uuid[] | no | **Responses**: `201` · `400` ## `GET` /tasks/{id} Get task with messages. ```bash curl https://platform.elnora.ai/api/v1/tasks/{id} \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `200` ## `PUT` /tasks/{id} Update task (title, status). ```bash curl -X PUT https://platform.elnora.ai/api/v1/tasks/{id} \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ ... }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `title` | string | no | | `status` | string | no | **Responses**: `200` ## `DELETE` /tasks/{id} Archive a task. ```bash curl -X DELETE https://platform.elnora.ai/api/v1/tasks/{id} \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `204` ## `GET` /tasks/{id}/messages Get messages for a task with cursor pagination. ```bash curl https://platform.elnora.ai/api/v1/tasks/{id}/messages \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | | `Cursor` | query | string | no | | `Limit` | query | int32 | no | **Responses**: `200` ## `POST` /tasks/{id}/messages Send a message in a task. ```bash curl -X POST https://platform.elnora.ai/api/v1/tasks/{id}/messages \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "content": "..." }' ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Request body** | Field | Type | Required | | --- | --- | --- | | `content` | string | yes | | `attachmentIds` | uuid[] | no | | `contextFileIds` | uuid[] | no | | `referencedFileIds` | uuid[] | no | | `openFileReference` | OpenFileReference | no | **Responses**: `201` ## `POST` /tasks/{id}/unarchive Unarchive a task — flips status back to `Active` so it reappears in default listings. ```bash curl -X POST https://platform.elnora.ai/api/v1/tasks/{id}/unarchive \ -H "X-API-Key: $ELNORA_API_KEY" \ -H "Content-Type: application/json" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `id` | path | uuid | yes | **Responses**: `204` ## `GET` /tasks/{taskId}/attachments List a task's attachments (agent-generated deliverables + chat attachments). ```bash curl https://platform.elnora.ai/api/v1/tasks/{taskId}/attachments \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `taskId` | path | uuid | yes | **Responses**: `200` ## `DELETE` /tasks/{taskId}/attachments/{attachmentId} Delete a task attachment (removes the S3 object + DB row). ```bash curl -X DELETE https://platform.elnora.ai/api/v1/tasks/{taskId}/attachments/{attachmentId} \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `taskId` | path | uuid | yes | | `attachmentId` | path | uuid | yes | **Responses**: `204` · `404` ## `GET` /tasks/{taskId}/attachments/{attachmentId}/content Get a presigned download URL for a task attachment. ```bash curl https://platform.elnora.ai/api/v1/tasks/{taskId}/attachments/{attachmentId}/content \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Parameters** | Name | In | Type | Required | | --- | --- | --- | --- | | `taskId` | path | uuid | yes | | `attachmentId` | path | uuid | yes | **Responses**: `200` · `404` --- # Version Source: https://docs.elnora.ai/docs/api/reference/version > Version endpoints of the Elnora REST API. Base URL `https://platform.elnora.ai/api/v1`. Authenticate every request with the `X-API-Key` header — see [Authentication](/docs/get-started/authentication). ## `GET` /version ```bash curl https://platform.elnora.ai/api/v1/version \ -H "X-API-Key: $ELNORA_API_KEY" ``` **Responses**: `200` --- # CLI reference Source: https://docs.elnora.ai/docs/cli > Install the elnora CLI, authenticate, and explore every command — generated from the CLI's own command registry. The `elnora` CLI gives you scriptable access to the Elnora platform. It ships **109 commands** across **16 groups** (plus standalone utilities below). Every page here is generated directly from the CLI's command registry, so it always matches the installed version. ## Install ```bash npm install -g @elnora-ai/cli # or: brew install elnora-ai/tap/elnora ``` ## Authenticate ```bash elnora auth login ``` ## Global flags These apply to every command: | Flag | Description | | --- | --- | | `--output ` | Output format (e.g. `json`, `table`). | | `--json` | Shorthand for `--output json`. | | `--compact` | Compact output. | | `--fields ` | Limit output to specific fields. | | `--profile ` | Use a named auth profile. | ## Utility commands | Command | Description | | --- | --- | | `elnora setup` | Interactive first-time setup. | | `elnora doctor` | Diagnose your environment and auth. | | `elnora whoami` | Show the current authenticated identity. | | `elnora open` | Open Elnora resources in the browser. | | `elnora mcp` | Run the local MCP server. | | `elnora update` | Update the CLI to the latest version. | | `elnora completion` | Generate shell completions. | ## Command groups - [`account`](/docs/cli/account) — Manage your account profile and legal agreements. - [`api-keys`](/docs/cli/api-keys) — Create, list, and revoke API keys for programmatic access. - [`audit`](/docs/cli/audit) — Read your organization's audit log. - [`auth`](/docs/cli/auth) — Authenticate the CLI and manage profiles (CLI-only). - [`feedback`](/docs/cli/feedback) — Submit product feedback. - [`files`](/docs/cli/files) — Upload, manage, and organize workspace files. - [`flags`](/docs/cli/flags) — Read feature flags. - [`folders`](/docs/cli/folders) — Create and manage folders. - [`health`](/docs/cli/health) — Check platform and service health. - [`library`](/docs/cli/library) — Manage your organization's shared library. - [`orgs`](/docs/cli/orgs) — Manage organizations, members, and invitations. - [`projects`](/docs/cli/projects) — Create and manage projects and their members. - [`protocols`](/docs/cli/protocols) — Generate and optimize bioprotocols. - [`review`](/docs/cli/review) — Approve or reject Knowledge Base auto-tidy proposals. - [`search`](/docs/cli/search) — Search across your knowledge base and content. - [`tasks`](/docs/cli/tasks) — Drive the Elnora agent — create tasks and exchange messages. > Most of these operations are also available over the hosted MCP server. See **MCP & integrations** for the tool catalog and connection steps. --- # Account Source: https://docs.elnora.ai/docs/cli/account > Manage your account profile and legal agreements. Manage your account profile and legal agreements. ## elnora account acceptTerms Accept a user agreement / terms of service ```bash elnora account acceptTerms [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `documentVersionId` | string | yes | Document version ID to accept | ## elnora account agreements List user agreements *Read-only* ```bash elnora account agreements ``` ## elnora account delete Delete your own account *Destructive* ```bash elnora account delete [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `yes` | boolean | no | Skip confirmation prompt Default: `false`. | ## elnora account get Get account details for a user *Read-only* ```bash elnora account get [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `userId` | string | yes | User ID | ## elnora account update Update account details for a user ```bash elnora account update [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `firstName` | string | no | First name | | `lastName` | string | no | Last name | | `userId` | string | yes | User ID | --- # Api Keys Source: https://docs.elnora.ai/docs/cli/api-keys > Create, list, and revoke API keys for programmatic access. Create, list, and revoke API keys for programmatic access. ## elnora api-keys create Create a new API key ```bash elnora api-keys create [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `name` | string | yes | API key name | | `scopes` | string | no | Comma-separated list of scopes | ## elnora api-keys getPolicy Get the API key creation policy *Read-only* ```bash elnora api-keys getPolicy ``` ## elnora api-keys list List all API keys *Read-only* ```bash elnora api-keys list ``` ## elnora api-keys revoke Revoke an API key *Destructive* ```bash elnora api-keys revoke [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `keyId` | uuid | yes | API key ID to revoke | ## elnora api-keys setPolicy Set the API key creation policy ```bash elnora api-keys setPolicy [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `policy` | enum | yes | API key creation policy One of: `all_members`, `admins_only`. | --- # Audit Source: https://docs.elnora.ai/docs/cli/audit > Read your organization's audit log. Read your organization's audit log. ## elnora audit list List audit log entries for an organization *Read-only* ```bash elnora audit list [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `action` | string | no | Filter by action type | | `orgId` | uuid | yes | Organization ID | | `page` | integer | no | Page number Default: `1`. | | `pageSize` | integer | no | Results per page Default: `25`. | | `userId` | string | no | Filter by user ID | --- # Auth Source: https://docs.elnora.ai/docs/cli/auth > Authenticate the CLI and manage profiles (CLI-only). Authenticate the CLI and manage profiles (CLI-only). ## elnora auth login Set up authentication by saving an API key to a profile *CLI-only* ```bash elnora auth login [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `apiKey` | string | no | Elnora API key (elnora_live_...) | | `apiKeyStdin` | boolean | no | Read the API key from stdin instead of an argument Default: `false`. | | `profile` | string | no | Profile name to save key under Default: `default`. | ## elnora auth logout Remove saved credentials *Destructive · CLI-only* ```bash elnora auth logout [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `all` | boolean | no | Remove all profiles Default: `false`. | | `profile` | string | no | Profile name to remove (default: 'default') | ## elnora auth profiles List all configured profiles *Read-only · CLI-only* ```bash elnora auth profiles ``` ## elnora auth status Verify API key and show connection info *Read-only · CLI-only* ```bash elnora auth status ``` ## elnora auth validate Validate a JWT or API key token *CLI-only* ```bash elnora auth validate [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `token` | string | no | Token to validate (defaults to current API key) | --- # Feedback Source: https://docs.elnora.ai/docs/cli/feedback > Submit product feedback. Submit product feedback. ## elnora feedback submit Submit feedback ```bash elnora feedback submit [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `description` | string | yes | Feedback description | | `title` | string | yes | Feedback title | --- # Files Source: https://docs.elnora.ai/docs/cli/files > Upload, manage, and organize workspace files. Upload, manage, and organize workspace files. ## elnora files archive Archive (delete) a file *Destructive* ```bash elnora files archive [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | uuid | yes | File ID to archive | ## elnora files commit Commit a file's working copy ```bash elnora files commit [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | uuid | yes | File ID to commit | ## elnora files confirmUpload Confirm a file upload ```bash elnora files confirmUpload [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | uuid | yes | File ID to confirm upload | ## elnora files content Get the raw content of a file *Read-only* ```bash elnora files content [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | uuid | yes | File ID | ## elnora files create Create a new file ```bash elnora files create [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `folder` | uuid | no | Folder ID | | `name` | string | yes | File name | | `project` | uuid | no | Project ID (optional; defaults to your workspace) | | `type` | string | yes | File type | ## elnora files createVersion Create a new version of a file ```bash elnora files createVersion [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `content` | string | no | Version content | | `fileId` | uuid | yes | File ID | ## elnora files download Download a file *Read-only* ```bash elnora files download [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | uuid | yes | File ID to download | ## elnora files fork Fork a file to another project ```bash elnora files fork [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | uuid | yes | File ID to fork | | `targetProject` | uuid | no | Target project ID (optional; defaults to your workspace) | ## elnora files get Get details of a specific file *Read-only* ```bash elnora files get [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | uuid | yes | File ID | ## elnora files list List files in a project *Read-only* ```bash elnora files list [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `page` | integer | no | Page number Default: `1`. | | `pageSize` | integer | no | Results per page Default: `25`. | | `project` | uuid | no | Project ID (optional; defaults to your workspace) | ## elnora files move Move a file to a different Knowledge Base folder *Idempotent* ```bash elnora files move [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | uuid | yes | File ID to move | | `parentFolderId` | uuid | yes | Destination Knowledge Base folder ID | ## elnora files promote Promote a file to a new visibility level ```bash elnora files promote [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | uuid | yes | File ID | | `visibility` | string | yes | Visibility level | ## elnora files restore Restore a file to a specific version ```bash elnora files restore [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | uuid | yes | File ID | | `versionId` | uuid | yes | Version ID to restore | ## elnora files searchContent Search file content across projects *Read-only* ```bash elnora files searchContent [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `page` | integer | no | Page number Default: `1`. | | `pageSize` | integer | no | Results per page Default: `25`. | | `project` | uuid | no | Project ID to scope search | | `query` | string | yes | Search query | ## elnora files share Share a file with a user or the whole organization (default role: editor) ```bash elnora files share [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | uuid | yes | File ID to share | | `orgWide` | boolean | no | Share with everyone in the organization Default: `false`. | | `role` | enum | no | Access role to grant One of: `viewer`, `editor`, `admin`. Default: `editor`. | | `userId` | integer | no | User ID to share with (omit when using --org-wide) | ## elnora files shares List the current shares on a file *Read-only* ```bash elnora files shares [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | uuid | yes | File ID | ## elnora files unshare Revoke a file share by its ACE id *Destructive · Idempotent* ```bash elnora files unshare [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `aceId` | uuid | yes | Share (ACE) ID to revoke | | `fileId` | uuid | yes | File ID | ## elnora files update Update a file's metadata *Idempotent* ```bash elnora files update [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | uuid | yes | File ID | | `folder` | uuid | no | New folder ID | | `name` | string | no | New file name | ## elnora files upload Upload a file to a project (three-stage: presign, PUT, confirm) ```bash elnora files upload [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `contentType` | string | no | MIME content type | | `fileName` | string | no | Override file name | | `filePath` | string | yes | Local file path to upload | | `project` | uuid | no | Project ID (optional; defaults to your workspace) | ## elnora files uploadBatch Upload multiple files to a project (max 50) ```bash elnora files uploadBatch [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `filePaths` | string | yes | Comma-separated local file paths to upload | | `folder` | uuid | no | Folder ID | | `project` | uuid | no | Project ID (optional; defaults to your workspace) | ## elnora files versionContent Get the raw content of a specific file version *Read-only* ```bash elnora files versionContent [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | uuid | yes | File ID | | `versionId` | uuid | yes | Version ID | ## elnora files versions List versions of a file *Read-only* ```bash elnora files versions [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | uuid | yes | File ID | | `page` | integer | no | Page number Default: `1`. | | `pageSize` | integer | no | Results per page Default: `25`. | ## elnora files workingCopy Create a working copy of a file ```bash elnora files workingCopy [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | uuid | yes | File ID | | `task` | uuid | no | Task ID | --- # Flags Source: https://docs.elnora.ai/docs/cli/flags > Read feature flags. Read feature flags. ## elnora flags get Get a feature flag by key *Read-only* ```bash elnora flags get [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `key` | string | yes | Feature flag key | ## elnora flags list List all feature flags *Read-only* ```bash elnora flags list ``` ## elnora flags set Set a feature flag value ```bash elnora flags set [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `key` | string | yes | Feature flag key | | `value` | enum | yes | Feature flag value One of: `true`, `false`. | | `yes` | boolean | no | Skip confirmation prompt Default: `false`. | --- # Folders Source: https://docs.elnora.ai/docs/cli/folders > Create and manage folders. Create and manage folders. ## elnora folders children List the child folders of a Knowledge Base folder *Read-only* ```bash elnora folders children [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `folderId` | uuid | yes | Folder ID | ## elnora folders create Create a Knowledge Base folder. (The legacy project-scoped path via `project` is deprecated and no longer supported.) ```bash elnora folders create [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `name` | string | yes | Folder name | | `parentId` | uuid | no | Parent folder ID (for nesting) | | `project` | uuid | no | [DEPRECATED] Legacy project-scoped folders were removed; this option is a no-op. | ## elnora folders delete Delete a folder (Knowledge Base folders are archived) *Destructive* ```bash elnora folders delete [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `folderId` | uuid | yes | Folder ID to delete | | `legacy` | boolean | no | Hard-delete a legacy project folder instead of archiving a Knowledge Base folder Default: `false`. | ## elnora folders files List files placed directly in a Knowledge Base folder *Read-only* ```bash elnora folders files [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `folderId` | uuid | yes | Folder ID | | `page` | integer | no | Page number Default: `1`. | | `pageSize` | integer | no | Results per page Default: `25`. | ## elnora folders get Get a Knowledge Base folder's details and breadcrumb path *Read-only* ```bash elnora folders get [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `folderId` | uuid | yes | Folder ID | ## elnora folders list [DEPRECATED] List folders in a project — projects were removed. Use `folders roots` and `folders children` to browse the Knowledge Base. *Read-only* ```bash elnora folders list [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `projectId` | uuid | yes | Project ID | ## elnora folders move Move a folder to a new parent (or to root) ```bash elnora folders move [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `folderId` | uuid | yes | Folder ID to move | | `legacy` | boolean | no | Move a legacy project folder instead of a Knowledge Base folder Default: `false`. | | `parentId` | string | yes | Target parent folder ID, or 'root' to move to the top level | ## elnora folders rename Rename a folder *Idempotent* ```bash elnora folders rename [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `folderId` | uuid | yes | Folder ID | | `legacy` | boolean | no | Rename a legacy project folder instead of a Knowledge Base folder Default: `false`. | | `name` | string | yes | New folder name | ## elnora folders roots List the top-level Knowledge Base folders you can access *Read-only* ```bash elnora folders roots ``` ## elnora folders share Share a folder with a user or the whole organization (default role: editor) ```bash elnora folders share [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `folderId` | uuid | yes | Folder ID to share | | `orgWide` | boolean | no | Share with everyone in the organization Default: `false`. | | `role` | enum | no | Access role to grant One of: `viewer`, `editor`, `admin`. Default: `editor`. | | `userId` | integer | no | User ID to share with (omit when using --org-wide) | ## elnora folders shares List the current shares on a folder *Read-only* ```bash elnora folders shares [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `folderId` | uuid | yes | Folder ID | ## elnora folders unshare Revoke a folder share by its ACE id *Destructive · Idempotent* ```bash elnora folders unshare [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `aceId` | uuid | yes | Share (ACE) ID to revoke | | `folderId` | uuid | yes | Folder ID | --- # Health Source: https://docs.elnora.ai/docs/cli/health > Check platform and service health. Check platform and service health. ## elnora health check Check Elnora API health status *Read-only* ```bash elnora health check ``` --- # Library Source: https://docs.elnora.ai/docs/cli/library > Manage your organization's shared library. Manage your organization's shared library. ## elnora library createFolder Create a folder in the organization library ```bash elnora library createFolder [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `name` | string | yes | Folder name | | `orgId` | uuid | yes | Organization ID | | `parent` | uuid | no | Parent folder ID | ## elnora library deleteFolder Delete a folder from the organization library *Destructive* ```bash elnora library deleteFolder [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `folderId` | uuid | yes | Folder ID to delete | | `orgId` | uuid | yes | Organization ID | ## elnora library files List files in the organization library *Read-only* ```bash elnora library files [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `orgId` | uuid | yes | Organization ID | | `page` | integer | no | Page number Default: `1`. | | `pageSize` | integer | no | Results per page Default: `25`. | ## elnora library folders List folders in the organization library *Read-only* ```bash elnora library folders [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `orgId` | uuid | yes | Organization ID | ## elnora library renameFolder Rename a folder in the organization library ```bash elnora library renameFolder [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `folderId` | uuid | yes | Folder ID to rename | | `name` | string | yes | New folder name | | `orgId` | uuid | yes | Organization ID | --- # Orgs Source: https://docs.elnora.ai/docs/cli/orgs > Manage organizations, members, and invitations. Manage organizations, members, and invitations. ## elnora orgs acceptInvite Accept an organization invitation by token ```bash elnora orgs acceptInvite [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `token` | string | yes | Invitation token | ## elnora orgs billing Get billing status for an organization *Read-only* ```bash elnora orgs billing [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `orgId` | uuid | yes | Organization ID | ## elnora orgs cancelInvite Cancel a pending organization invitation *Destructive* ```bash elnora orgs cancelInvite [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `invitationId` | uuid | yes | Invitation ID to cancel | | `orgId` | uuid | yes | Organization ID | ## elnora orgs create Create a new organization ```bash elnora orgs create [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `description` | string | no | Organization description | | `name` | string | yes | Organization name | ## elnora orgs delete Delete an organization *Destructive* ```bash elnora orgs delete [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `orgId` | uuid | yes | Organization ID to delete | | `yes` | boolean | no | Skip confirmation prompt Default: `false`. | ## elnora orgs directory Search organization members by name or email (Share-modal typeahead) *Read-only* ```bash elnora orgs directory [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `orgId` | uuid | yes | Organization ID | | `query` | string | yes | Name or email substring to match (minimum 2 characters) | ## elnora orgs files List files belonging to an organization *Read-only* ```bash elnora orgs files [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `orgId` | uuid | yes | Organization ID | | `page` | integer | no | Page number Default: `1`. | | `pageSize` | integer | no | Results per page Default: `25`. | ## elnora orgs get Get details of a specific organization ```bash elnora orgs get [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `orgId` | uuid | yes | Organization ID | ## elnora orgs invitationInfo Get information about an invitation by token *Read-only* ```bash elnora orgs invitationInfo [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `token` | string | yes | Invitation token | ## elnora orgs invitations List pending invitations for an organization *Read-only* ```bash elnora orgs invitations [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `orgId` | uuid | yes | Organization ID | ## elnora orgs invite Invite a user to an organization by email *Idempotent* ```bash elnora orgs invite [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `email` | email | yes | Email address to invite | | `orgId` | uuid | yes | Organization ID | | `role` | string | no | Role to assign (default: Member) Default: `Member`. | ## elnora orgs list List all organizations the current user belongs to *Read-only* ```bash elnora orgs list ``` ## elnora orgs members List members of an organization *Read-only* ```bash elnora orgs members [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `orgId` | uuid | yes | Organization ID | ## elnora orgs removeMember Remove a member from an organization *Destructive* ```bash elnora orgs removeMember [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `membershipId` | uuid | yes | Membership ID of the member to remove | | `orgId` | uuid | yes | Organization ID | ## elnora orgs resendInvite Resend an organization invitation email. Regenerates the token and extends the expiry by 7 days. Works on both pending and expired invitations, preserves the invitation ID. *Idempotent* ```bash elnora orgs resendInvite [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `invitationId` | uuid | yes | Invitation ID to resend | | `orgId` | uuid | yes | Organization ID | ## elnora orgs setAutotidy Enable or disable Knowledge Base auto-tidy for an organization *Idempotent* ```bash elnora orgs setAutotidy [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `enabled` | boolean | no | Enable Knowledge Base auto-tidy (omit to disable) Default: `false`. | | `orgId` | uuid | yes | Organization ID | ## elnora orgs setDefault Set an organization as the default *Idempotent* ```bash elnora orgs setDefault [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `orgId` | uuid | yes | Organization ID to set as default | ## elnora orgs setStripe Set the Stripe customer ID for an organization *Idempotent* ```bash elnora orgs setStripe [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `orgId` | uuid | yes | Organization ID | | `stripeCustomerId` | string | yes | Stripe customer ID (e.g. cus_xxx) | ## elnora orgs update Update an existing organization *Idempotent* ```bash elnora orgs update [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `description` | string | no | New organization description | | `name` | string | no | New organization name | | `orgId` | uuid | yes | Organization ID | ## elnora orgs updateRole Update an organization member's role *Idempotent* ```bash elnora orgs updateRole [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `membershipId` | uuid | yes | Membership ID of the member | | `orgId` | uuid | yes | Organization ID | | `role` | string | yes | New role to assign | --- # Projects Source: https://docs.elnora.ai/docs/cli/projects > Create and manage projects and their members. Create and manage projects and their members. ## elnora projects addMember [DEPRECATED] Add a member to a project — projects were removed; this is a no-op. ```bash elnora projects addMember [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `projectId` | uuid | yes | Project ID | | `role` | string | no | Role to assign (default: Member) Default: `Member`. | | `userId` | uuid | yes | User ID to add | ## elnora projects archive [DEPRECATED] Archive (delete) a project — projects were removed; this is a no-op. *Destructive* ```bash elnora projects archive [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `projectId` | uuid | yes | Project ID to archive | ## elnora projects create [DEPRECATED] Create a new project — projects were removed; this is a no-op. ```bash elnora projects create [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `description` | string | no | Project description | | `icon` | string | no | Project icon | | `name` | string | yes | Project name | ## elnora projects get [DEPRECATED] Get details of a specific project — projects were removed; this is a no-op. *Read-only* ```bash elnora projects get [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `projectId` | uuid | yes | Project ID | ## elnora projects leave [DEPRECATED] Leave a project — projects were removed; this is a no-op. *Destructive* ```bash elnora projects leave [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `projectId` | uuid | yes | Project ID to leave | ## elnora projects list [DEPRECATED] List all projects accessible to the current user — projects were removed; this is a no-op. *Read-only* ```bash elnora projects list [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `page` | integer | no | Page number Default: `1`. | | `pageSize` | integer | no | Results per page Default: `25`. | ## elnora projects members [DEPRECATED] List members of a project — projects were removed; this is a no-op. *Read-only* ```bash elnora projects members [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `projectId` | uuid | yes | Project ID | ## elnora projects removeMember [DEPRECATED] Remove a member from a project — projects were removed; this is a no-op. *Destructive* ```bash elnora projects removeMember [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `projectId` | uuid | yes | Project ID | | `userId` | uuid | yes | User ID to remove | ## elnora projects update [DEPRECATED] Update an existing project — projects were removed; this is a no-op. *Idempotent* ```bash elnora projects update [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `description` | string | no | New project description | | `icon` | string | no | New project icon | | `name` | string | no | New project name | | `projectId` | uuid | yes | Project ID | ## elnora projects updateRole [DEPRECATED] Update a project member's role — projects were removed; this is a no-op. *Idempotent* ```bash elnora projects updateRole [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `projectId` | uuid | yes | Project ID | | `role` | string | yes | New role to assign | | `userId` | uuid | yes | User ID of the member | --- # Protocols Source: https://docs.elnora.ai/docs/cli/protocols > Generate and optimize bioprotocols. Generate and optimize bioprotocols. ## elnora protocols generate Generate a bioprotocol — creates a task and sends the description in one call. Returns the task and the queued user message, NOT the AI response; the agent processes asynchronously. To get the generated protocol, poll elnora_tasks_messages with the returned task id every 5-10s until the last message has role 'assistant' with metadata.status 'completed'. Timeout after 5 min. ```bash elnora protocols generate [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `description` | string | yes | Protocol description | | `project` | uuid | no | Project UUID to associate with | | `title` | string | no | Task title (defaults to first 100 chars of description) | --- # Review Source: https://docs.elnora.ai/docs/cli/review > Approve or reject Knowledge Base auto-tidy proposals. Approve or reject Knowledge Base auto-tidy proposals. ## elnora review approve Approve a Knowledge Base review item, applying its proposed change ```bash elnora review approve [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `itemId` | uuid | yes | Review item ID | ## elnora review list List the Knowledge Base review queue (auto-tidy proposals awaiting approval) *Read-only* ```bash elnora review list [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `status` | enum | no | Filter by review status ('all' lists every state) One of: `pending`, `applied`, `rejected`, `all`. Default: `pending`. | ## elnora review reject Reject a Knowledge Base review item without applying its change ```bash elnora review reject [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `itemId` | uuid | yes | Review item ID | --- # Search Source: https://docs.elnora.ai/docs/cli/search > Search across your knowledge base and content. Search across your knowledge base and content. ## elnora search all Search across all entities *Read-only* ```bash elnora search all [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `page` | integer | no | Page number Default: `1`. | | `pageSize` | integer | no | Results per page Default: `25`. | | `query` | string | yes | Search query | ## elnora search fileContent Search within file contents *Read-only* ```bash elnora search fileContent [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `page` | integer | no | Page number Default: `1`. | | `pageSize` | integer | no | Results per page Default: `25`. | | `projectId` | uuid | no | Filter by project ID | | `query` | string | yes | Search query | ## elnora search files Search files by query *Read-only* ```bash elnora search files [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `page` | integer | no | Page number Default: `1`. | | `pageSize` | integer | no | Results per page Default: `25`. | | `query` | string | yes | Search query | ## elnora search tasks Search tasks by query *Read-only* ```bash elnora search tasks [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `page` | integer | no | Page number Default: `1`. | | `pageSize` | integer | no | Results per page Default: `25`. | | `query` | string | yes | Search query | --- # Tasks Source: https://docs.elnora.ai/docs/cli/tasks > Drive the Elnora agent — create tasks and exchange messages. Drive the Elnora agent — create tasks and exchange messages. ## elnora tasks archive Archive (delete) a task *Destructive* ```bash elnora tasks archive [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `taskId` | uuid | yes | Task ID to archive | ## elnora tasks attachmentContent Get the content of a task attachment *Read-only* ```bash elnora tasks attachmentContent [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `attachmentId` | uuid | yes | Attachment ID | | `taskId` | uuid | yes | Task ID | ## elnora tasks attachments List the files attached to a task *Read-only* ```bash elnora tasks attachments [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `taskId` | uuid | yes | Task ID | ## elnora tasks create Create a new task in a project. If a message is provided it is queued, but the AI response is NOT returned — the agent processes asynchronously. Poll elnora_tasks_messages every 5-10s until the last message has role 'assistant' with metadata.status 'completed'. Timeout after 5 min. ```bash elnora tasks create [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `message` | string | no | Initial message | | `project` | uuid | no | Project ID (optional; defaults to your workspace) | | `stream` | boolean | no | Stream agent response in real-time (SSE) Default: `false`. | | `title` | string | no | Task title | | `wait` | boolean | no | Wait for agent response (polling) Default: `false`. | ## elnora tasks get Get details of a specific task *Read-only* ```bash elnora tasks get [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `taskId` | uuid | yes | Task ID | ## elnora tasks list List tasks, optionally filtered by project or lifecycle status *Read-only* ```bash elnora tasks list [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `page` | integer | no | Page number Default: `1`. | | `pageSize` | integer | no | Results per page Default: `25`. | | `project` | uuid | no | Project ID to filter by | | `status` | enum | no | Lifecycle filter: active (default), archived, or all One of: `active`, `archived`, `all`. | ## elnora tasks messages List messages for a task *Read-only* ```bash elnora tasks messages [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `cursor` | string | no | Pagination cursor | | `limit` | integer | no | Results per page Default: `50`. | | `taskId` | uuid | yes | Task ID | ## elnora tasks send Send a message to a task. Returns the created user message immediately — the agent processes asynchronously. To get the AI response, poll elnora_tasks_messages until the last message has role 'assistant' with metadata.status 'completed'. Poll every 5-10s, timeout after 5 min. ```bash elnora tasks send [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileRefs` | string | no | Comma-separated file reference UUIDs | | `message` | string | yes | Message content | | `stream` | boolean | no | Stream agent response in real-time (SSE) Default: `false`. | | `taskId` | uuid | yes | Task ID | | `wait` | boolean | no | Wait for agent response (polling) Default: `false`. | ## elnora tasks unarchive Unarchive a task so it reappears in the default task list *Idempotent* ```bash elnora tasks unarchive [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `taskId` | uuid | yes | Task ID to unarchive | ## elnora tasks update Update an existing task *Idempotent* ```bash elnora tasks update [required options] [options] ``` | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `status` | string | no | New task status | | `taskId` | uuid | yes | Task ID | | `title` | string | no | New task title | --- # Welcome to Elnora Source: https://docs.elnora.ai/docs/get-started > The developer platform for Elnora — the REST API, the elnora CLI, the MCP server, and plugins. Built for developers and AI agents. Elnora is an AI agent for automated preclinical lab work. This portal documents the **developer surface**: integrate over the REST API, script with the CLI, connect any AI tool over the MCP server, or drop in the plugins. Everything you can do in the dashboard, you can do programmatically. ```bash # Authenticate with your API key and make your first call. curl https://platform.elnora.ai/api/v1/tasks \ -H "X-API-Key: $ELNORA_API_KEY" ``` ## Start here ## Build with any surface ## Built for AI agents The whole portal is machine-readable. Point your agent at [llms.txt](/llms.txt) for a map of the docs (or [llms-full.txt](/llms-full.txt) for the full text), or connect over [MCP](/docs/mcp) to call the platform directly. --- # Authentication Source: https://docs.elnora.ai/docs/get-started/authentication > Authenticate to the Elnora API with an API key or OAuth. Every Elnora API request is authenticated. The base URL is: ``` https://platform.elnora.ai/api/v1 ``` ## API keys (recommended for scripts & servers) Create your first key in the dashboard under **Settings → API keys**. Once you have a key and the [CLI](/docs/cli) is authenticated, you can mint more from the terminal: ```bash elnora api-keys create --name ci ``` Send it in the `X-API-Key` header on every request (or as `Authorization: Bearer ` — both work): ```bash curl https://platform.elnora.ai/api/v1/tasks \ -H "X-API-Key: $ELNORA_API_KEY" ``` Keys are prefixed `elnora_live_` and are shown in full **only once**, at creation. A key inherits the roles of its creator and acts on the creator's organization. Your organization can set a policy for who may create keys — see the [API keys reference](/docs/api). Treat API keys like passwords. Store them in environment variables or a secrets manager — never commit them. Revoke a key anytime from the dashboard or with `elnora api-keys revoke`. ## OAuth (interactive clients & MCP) Interactive clients — including the [MCP server](/docs/mcp) — can authenticate with OAuth 2.1. The client opens a browser to authorize on first connect, then uses the issued bearer token automatically. ## Enterprise SSO Enterprise organizations can enable **single sign-on** so members sign in through their own identity provider (OIDC or SAML). SSO is configured per organization and is typically invite-only — an admin sets it up, and members sign in with their work identity. Once signed in, you create and use API keys exactly as above. ## Organizations Most resources are scoped to an **organization**. Requests act on your active organization by default; many endpoints also accept an explicit organization id to target a specific org. See [Core concepts](/docs/get-started/concepts). --- # Core concepts Source: https://docs.elnora.ai/docs/get-started/concepts > The building blocks of the Elnora platform — organizations, tasks, files, the knowledge base, and more. A quick tour of the objects you'll work with through the API, CLI, and MCP. ## Organizations An **organization** is the top-level container for your team's data. It has **members** (with roles) and **invitations**. Most resources belong to an org, and requests act on your active organization unless you specify another. ## Files & the knowledge base **Files** are your workspace documents (uploads and generated outputs), and **folders** organize them into a tree. Files live in your **knowledge base**, which is private to you by default. You choose what to share and with whom — with specific members or your whole organization — and a folder passes its sharing down to everything inside it, so you set access once. The **library** is your organization's shared collection of reusable content. ## Tasks & the agent A **task** is a conversation with the Elnora agent. You create a task, send **messages**, and the agent processes them asynchronously — generating and optimizing **protocols**, searching your knowledge base, and working with your files. Poll for messages (or stream) until the agent's reply completes. ## Search **Search** runs across your knowledge base and content, so the agent — and you — can ground work in your organization's data. ## Next steps - [Authentication](/docs/get-started/authentication) — get an API key and make your first call - [CLI reference](/docs/cli) — the same operations from your terminal - [MCP & integrations](/docs/mcp) — connect your AI tools --- # Quickstart Source: https://docs.elnora.ai/docs/get-started/quickstart > Create an account, get an API key, and make your first authenticated call to the Elnora API. Go from zero to your first authenticated request in a few minutes. ### Create your account Sign up at [platform.elnora.ai](https://platform.elnora.ai) with your work email. You'll land in an **organization** — your team's workspace. If a colleague already has one, ask them to invite you; otherwise you start your own. ### Create an API key In the dashboard, open **Settings → API keys → Create key**. Give it a name (and an optional expiry), and copy the key — it's shown **once**. A key inherits the roles of its creator, so it can do what you can. ```bash # Store it as an environment variable — never commit it. export ELNORA_API_KEY="elnora_live_..." ``` Prefer the terminal? Once the [CLI](/docs/cli) is authenticated you can also run `elnora api-keys create --name ci`. ### Make your first request Every request is authenticated with the `X-API-Key` header. Start with the public version endpoint, then list your tasks: ```bash curl https://platform.elnora.ai/api/v1/version curl https://platform.elnora.ai/api/v1/tasks \ -H "X-API-Key: $ELNORA_API_KEY" ``` ### Put the agent to work Elnora is an agent: you create a **task**, send it a message, and it works asynchronously. Read the reply back by polling the task's messages. ```bash # 1. Create a task TASK=$(curl -s -X POST https://platform.elnora.ai/api/v1/tasks \ -H "X-API-Key: $ELNORA_API_KEY" -H "Content-Type: application/json" \ -d '{ "title": "Optimize transfection" }') # 2. Send it a message (the agent starts working in the background) curl -X POST "https://platform.elnora.ai/api/v1/tasks//messages" \ -H "X-API-Key: $ELNORA_API_KEY" -H "Content-Type: application/json" \ -d '{ "content": "Optimize a HEK293 transfection protocol for higher yield" }' # 3. Read the reply — poll until the agent responds (cursor pagination) curl "https://platform.elnora.ai/api/v1/tasks//messages" \ -H "X-API-Key: $ELNORA_API_KEY" ``` Files the agent produces show up under the task's [attachments](/docs/api/reference/tasks). See the [API overview](/docs/api) for the full request/response shapes. ## Next steps Treat API keys like passwords. Store them in environment variables or a secrets manager, and revoke a key anytime from the dashboard or with `elnora api-keys revoke`. --- # MCP & integrations Source: https://docs.elnora.ai/docs/mcp > Connect Claude Code, Cursor, VS Code, and other AI tools to Elnora over the Model Context Protocol. The **Elnora MCP server** lets AI tools call the Elnora platform directly over the [Model Context Protocol](https://modelcontextprotocol.io). It exposes **101 tools** across 14 categories — the same operations as the REST API and CLI. - **Endpoint:** `https://mcp.elnora.ai/mcp` (remote, Streamable HTTP — nothing to install) - **Health:** `https://mcp.elnora.ai/health` ## Authentication Two options: 1. **OAuth 2.1** (default) — your client opens a browser to authorize on first connect. 2. **API key** — send your Elnora API key in the `X-API-Key` header (created in the dashboard). ## Connect your client ### Claude Code ```bash claude mcp add elnora --transport http --scope user https://mcp.elnora.ai/mcp ``` ### Cursor / VS Code / Codex (mcp.json) ```json { "mcpServers": { "elnora": { "url": "https://mcp.elnora.ai/mcp" } } } ``` ## Tool catalog - [Tasks](/docs/mcp/tasks) — Create tasks and drive the Elnora agent. (10 tools) - [Files](/docs/mcp/files) — Upload, manage, and organize workspace files. (23 tools) - [Protocols](/docs/mcp/protocols) — Generate and optimize bioprotocols. (1 tool) - [Projects](/docs/mcp/projects) — Create and manage projects and members. (10 tools) - [Organizations](/docs/mcp/orgs) — Manage organizations, members, and invitations. (20 tools) - [Folders](/docs/mcp/folders) — Create and manage folders. (12 tools) - [Library](/docs/mcp/library) — Manage your organization's shared library. (5 tools) - [Search](/docs/mcp/search) — Search across your knowledge base and content. (4 tools) - [API keys](/docs/mcp/api-keys) — Create, list, and revoke API keys. (5 tools) - [Audit](/docs/mcp/audit) — Read your organization's audit log. (1 tool) - [Account](/docs/mcp/account) — Manage your account profile and agreements. (5 tools) - [Feedback](/docs/mcp/feedback) — Submit product feedback. (1 tool) - [Feature flags](/docs/mcp/flags) — Read feature flags. (3 tools) - [Health](/docs/mcp/health) — Service health checks. (1 tool) --- # Account Source: https://docs.elnora.ai/docs/mcp/account > Manage your account profile and agreements. Manage your account profile and agreements. ## elnora_account_acceptTerms Accept a user agreement / terms of service | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `documentVersionId` | any | yes | Document version ID to accept | ## elnora_account_agreements List user agreements *Read-only · Idempotent* _No parameters._ ## elnora_account_delete Delete your own account *Destructive* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `yes` | any | yes | Skip confirmation (required true for MCP) | ## elnora_account_get Get account details for a user *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `userId` | any | yes | User numeric ID | ## elnora_account_update Update account details for a user *Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `firstName` | any | yes | First name | | `lastName` | any | yes | Last name | | `userId` | any | yes | User numeric ID | --- # API keys Source: https://docs.elnora.ai/docs/mcp/api-keys > Create, list, and revoke API keys. Create, list, and revoke API keys. ## elnora_api-keys_create Create a new API key | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `name` | any | yes | Key name | | `scopes` | any | yes | Optional scopes | ## elnora_api-keys_getPolicy Get the API key creation policy *Read-only · Idempotent* _No parameters._ ## elnora_api-keys_list List all API keys *Read-only · Idempotent* _No parameters._ ## elnora_api-keys_revoke Revoke an API key *Destructive · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `keyId` | any | yes | API key ID | ## elnora_api-keys_setPolicy Set the API key creation policy *Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `policy` | any | yes | Policy object | --- # Audit Source: https://docs.elnora.ai/docs/mcp/audit > Read your organization's audit log. Read your organization's audit log. ## elnora_audit_list List audit log entries for an organization *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `action` | any | yes | Filter by action type | | `orgId` | any | yes | Organization UUID | | `page` | any | yes | Page number | | `pageSize` | any | yes | Results per page | | `userId` | any | yes | Filter by user ID | --- # Feedback Source: https://docs.elnora.ai/docs/mcp/feedback > Submit product feedback. Submit product feedback. ## elnora_feedback_submit Submit feedback | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `description` | any | yes | Detailed description | | `title` | any | yes | Feedback title | --- # Files Source: https://docs.elnora.ai/docs/mcp/files > Upload, manage, and organize workspace files. Upload, manage, and organize workspace files. ## elnora_files_archive Archive (delete) a file *Destructive · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | any | yes | File UUID | ## elnora_files_commit Commit a file's working copy *Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | any | yes | File UUID | ## elnora_files_confirmUpload Confirm a file upload *Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | any | yes | File UUID from upload initiation | ## elnora_files_content Get the raw content of a file *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | any | yes | File UUID | ## elnora_files_create Create a new file | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `folder` | any | yes | Folder UUID | | `name` | any | yes | Filename | | `project` | any | yes | Project UUID (optional; defaults to your workspace) | | `type` | any | yes | File type | ## elnora_files_createVersion Create a new version of a file | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `content` | any | yes | Version content | | `fileId` | any | yes | File UUID | ## elnora_files_download Download a file *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | any | yes | File UUID | ## elnora_files_fork Fork a file to another project | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | any | yes | File UUID | | `targetProject` | any | yes | Target project UUID (optional; defaults to your workspace) | ## elnora_files_get Get details of a specific file *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | any | yes | File UUID | ## elnora_files_list List files in a project *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `page` | any | yes | Page number | | `pageSize` | any | yes | Results per page | | `project` | any | yes | Project UUID (optional; defaults to your workspace) | ## elnora_files_move Move a file to a different Knowledge Base folder *Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | any | yes | File ID to move | | `parentFolderId` | any | yes | Destination Knowledge Base folder ID | ## elnora_files_promote Promote a file to a new visibility level *Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | any | yes | File UUID | | `visibility` | any | yes | Target visibility level | ## elnora_files_restore Restore a file to a specific version *Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | any | yes | File UUID | | `versionId` | any | yes | Version UUID to restore | ## elnora_files_searchContent Search file content across projects *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `page` | any | yes | Page number | | `pageSize` | any | yes | Results per page | | `project` | any | yes | Restrict search to a project | | `query` | any | yes | Search query | ## elnora_files_share Share a file with a user or the whole organization (default role: editor) | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | any | yes | File ID to share | | `orgWide` | any | yes | Share with everyone in the organization | | `role` | any | yes | Access role to grant | | `userId` | any | yes | User ID to share with (omit when using orgWide) | ## elnora_files_shares List the current shares on a file *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | any | yes | File ID | ## elnora_files_unshare Revoke a file share by its ACE id *Destructive · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `aceId` | any | yes | Share (ACE) ID to revoke | | `fileId` | any | yes | File ID | ## elnora_files_update Update a file's metadata *Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | any | yes | File UUID | | `folder` | any | yes | New folder UUID | | `name` | any | yes | New name | ## elnora_files_upload Upload a file to a project (three-stage: presign, PUT, confirm) | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `contentType` | any | yes | MIME type | | `fileName` | any | yes | Override filename | | `filePath` | any | yes | Local file path (CLI only) | | `project` | any | yes | Project UUID (optional; defaults to your workspace) | ## elnora_files_uploadBatch Upload multiple files to a project (max 50) | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `filePaths` | any | yes | Local file paths (CLI only) | | `folder` | any | yes | Folder UUID | | `project` | any | yes | Project UUID (optional; defaults to your workspace) | ## elnora_files_versionContent Get the raw content of a specific file version *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | any | yes | File UUID | | `versionId` | any | yes | Version UUID | ## elnora_files_versions List versions of a file *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | any | yes | File UUID | | `page` | any | yes | Page number | | `pageSize` | any | yes | Results per page | ## elnora_files_workingCopy Create a working copy of a file | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileId` | any | yes | File UUID | | `task` | any | yes | Associated task UUID | --- # Feature flags Source: https://docs.elnora.ai/docs/mcp/flags > Read feature flags. Read feature flags. ## elnora_flags_get Get a feature flag by key *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `key` | any | yes | Feature flag key | ## elnora_flags_list List all feature flags *Read-only · Idempotent* _No parameters._ ## elnora_flags_set Set a feature flag value *Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `key` | any | yes | Feature flag key | | `value` | any | yes | Flag value | | `yes` | any | yes | Skip confirmation | --- # Folders Source: https://docs.elnora.ai/docs/mcp/folders > Create and manage folders. Create and manage folders. ## elnora_folders_children List the child folders of a Knowledge Base folder *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `folderId` | any | yes | Folder UUID | ## elnora_folders_create Create a Knowledge Base folder. (The legacy project-scoped path via `project` is deprecated and no longer supported.) | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `name` | any | yes | Folder name | | `parentId` | any | yes | Parent folder UUID for nesting | | `project` | any | yes | [DEPRECATED] Legacy project-scoped folders were removed; this option is a no-op. | ## elnora_folders_delete Delete a folder (Knowledge Base folders are archived) *Destructive · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `folderId` | any | yes | Folder UUID | | `legacy` | any | yes | Hard-delete a legacy project folder instead of archiving a Knowledge Base folder | ## elnora_folders_files List files placed directly in a Knowledge Base folder *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `folderId` | any | yes | Folder UUID | | `page` | any | yes | Page number | | `pageSize` | any | yes | Results per page | ## elnora_folders_get Get a Knowledge Base folder's details and breadcrumb path *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `folderId` | any | yes | Folder UUID | ## elnora_folders_list [DEPRECATED] List folders in a project — projects were removed. Use `folders roots` and `folders children` to browse the Knowledge Base. *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `projectId` | any | yes | Project UUID | ## elnora_folders_move Move a folder to a new parent (or to root) *Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `folderId` | any | yes | Folder UUID | | `legacy` | any | yes | Move a legacy project folder instead of a Knowledge Base folder | | `parentId` | any | yes | New parent folder UUID (omit for root) | ## elnora_folders_rename Rename a folder *Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `folderId` | any | yes | Folder UUID | | `legacy` | any | yes | Rename a legacy project folder instead of a Knowledge Base folder | | `name` | any | yes | New name | ## elnora_folders_roots List the top-level Knowledge Base folders you can access *Read-only · Idempotent* _No parameters._ ## elnora_folders_share Share a folder with a user or the whole organization (default role: editor) | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `folderId` | any | yes | Folder ID to share | | `orgWide` | any | yes | Share with everyone in the organization | | `role` | any | yes | Access role to grant | | `userId` | any | yes | User ID to share with (omit when using orgWide) | ## elnora_folders_shares List the current shares on a folder *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `folderId` | any | yes | Folder ID | ## elnora_folders_unshare Revoke a folder share by its ACE id *Destructive · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `aceId` | any | yes | Share (ACE) ID to revoke | | `folderId` | any | yes | Folder ID | --- # Health Source: https://docs.elnora.ai/docs/mcp/health > Service health checks. Service health checks. ## elnora_health_check Check Elnora API health status *Read-only · Idempotent* _No parameters._ --- # Library Source: https://docs.elnora.ai/docs/mcp/library > Manage your organization's shared library. Manage your organization's shared library. ## elnora_library_createFolder Create a folder in the organization library | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `name` | any | yes | Folder name | | `orgId` | any | yes | Organization ID | | `parent` | any | yes | Parent folder ID | ## elnora_library_deleteFolder Delete a folder from the organization library *Destructive · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `folderId` | any | yes | Folder UUID | | `orgId` | any | yes | Organization UUID | ## elnora_library_files List files in the organization library *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `orgId` | any | yes | Organization UUID | | `page` | any | yes | Page number | | `pageSize` | any | yes | Results per page | ## elnora_library_folders List folders in the organization library *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `orgId` | any | yes | Organization UUID | ## elnora_library_renameFolder Rename a folder in the organization library *Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `folderId` | any | yes | Folder UUID | | `name` | any | yes | New name | | `orgId` | any | yes | Organization UUID | --- # Organizations Source: https://docs.elnora.ai/docs/mcp/orgs > Manage organizations, members, and invitations. Manage organizations, members, and invitations. ## elnora_orgs_acceptInvite Accept an organization invitation by token | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `token` | any | yes | Invitation token | ## elnora_orgs_billing Get billing status for an organization *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `orgId` | any | yes | Organization UUID | ## elnora_orgs_cancelInvite Cancel a pending organization invitation *Destructive · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `invitationId` | any | yes | Invitation ID | | `orgId` | any | yes | Organization UUID | ## elnora_orgs_create Create a new organization | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `description` | any | yes | Description | | `name` | any | yes | Organization name | ## elnora_orgs_delete Delete an organization *Destructive · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `orgId` | any | yes | Organization UUID | | `yes` | any | yes | Skip confirmation (required true for MCP) | ## elnora_orgs_directory Search organization members by name or email (Share-modal typeahead) *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `orgId` | any | yes | Organization ID | | `query` | any | yes | Name or email substring to match (minimum 2 characters) | ## elnora_orgs_files List files belonging to an organization *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `orgId` | any | yes | Organization UUID | | `page` | any | yes | Page number | | `pageSize` | any | yes | Results per page | ## elnora_orgs_get Get details of a specific organization *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `orgId` | any | yes | Organization UUID | ## elnora_orgs_invitationInfo Get information about an invitation by token *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `token` | any | yes | Invitation token | ## elnora_orgs_invitations List pending invitations for an organization *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `orgId` | any | yes | Organization UUID | ## elnora_orgs_invite Invite a user to an organization by email | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `email` | any | yes | Email to invite | | `orgId` | any | yes | Organization UUID | | `role` | any | yes | Role for invitee | ## elnora_orgs_list List all organizations the current user belongs to *Read-only · Idempotent* _No parameters._ ## elnora_orgs_members List members of an organization *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `orgId` | any | yes | Organization UUID | ## elnora_orgs_removeMember Remove a member from an organization *Destructive · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `membershipId` | any | yes | Membership ID | | `orgId` | any | yes | Organization UUID | ## elnora_orgs_resendInvite Resend an organization invitation email. Regenerates the token and extends the expiry by 7 days. Works on both pending and expired invitations, preserves the invitation ID. | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `invitationId` | any | yes | Invitation ID | | `orgId` | any | yes | Organization UUID | ## elnora_orgs_setAutotidy Enable or disable Knowledge Base auto-tidy for an organization *Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `enabled` | any | yes | Enable Knowledge Base auto-tidy (omit to disable) | | `orgId` | any | yes | Organization UUID | ## elnora_orgs_setDefault Set an organization as the default *Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `orgId` | any | yes | Organization UUID | ## elnora_orgs_setStripe Set the Stripe customer ID for an organization *Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `orgId` | any | yes | Organization UUID | | `stripeCustomerId` | any | yes | Stripe customer ID | ## elnora_orgs_update Update an existing organization *Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `description` | any | yes | New description | | `name` | any | yes | New name | | `orgId` | any | yes | Organization UUID | ## elnora_orgs_updateRole Update an organization member's role *Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `membershipId` | any | yes | Membership ID | | `orgId` | any | yes | Organization UUID | | `role` | any | yes | New role | --- # Projects Source: https://docs.elnora.ai/docs/mcp/projects > Create and manage projects and members. Create and manage projects and members. ## elnora_projects_addMember [DEPRECATED] Add a member to a project — projects were removed; this is a no-op. | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `projectId` | any | yes | Project UUID | | `role` | any | yes | Role (default: Member) | | `userId` | any | yes | User ID to add | ## elnora_projects_archive [DEPRECATED] Archive (delete) a project — projects were removed; this is a no-op. *Destructive · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `projectId` | any | yes | Project UUID | ## elnora_projects_create [DEPRECATED] Create a new project — projects were removed; this is a no-op. | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `description` | any | yes | Project description | | `icon` | any | yes | Project icon | | `name` | any | yes | Project name | ## elnora_projects_get [DEPRECATED] Get details of a specific project — projects were removed; this is a no-op. *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `projectId` | any | yes | Project UUID | ## elnora_projects_leave [DEPRECATED] Leave a project — projects were removed; this is a no-op. *Destructive · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `projectId` | any | yes | Project UUID | ## elnora_projects_list [DEPRECATED] List all projects accessible to the current user — projects were removed; this is a no-op. *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `page` | any | yes | Page number | | `pageSize` | any | yes | Results per page | ## elnora_projects_members [DEPRECATED] List members of a project — projects were removed; this is a no-op. *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `projectId` | any | yes | Project UUID | ## elnora_projects_removeMember [DEPRECATED] Remove a member from a project — projects were removed; this is a no-op. *Destructive · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `projectId` | any | yes | Project UUID | | `userId` | any | yes | User ID to remove | ## elnora_projects_update [DEPRECATED] Update an existing project — projects were removed; this is a no-op. *Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `description` | any | yes | New description | | `icon` | any | yes | New icon | | `name` | any | yes | New name | | `projectId` | any | yes | Project UUID | ## elnora_projects_updateRole [DEPRECATED] Update a project member's role — projects were removed; this is a no-op. *Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `projectId` | any | yes | Project UUID | | `role` | any | yes | New role | | `userId` | any | yes | User ID | --- # Protocols Source: https://docs.elnora.ai/docs/mcp/protocols > Generate and optimize bioprotocols. Generate and optimize bioprotocols. ## elnora_protocols_generate Generate a bioprotocol — creates a task and sends the description in one call. Returns the task and the queued user message, NOT the AI response; the agent processes asynchronously. To get the generated protocol, poll elnora_tasks_messages with the returned task id every 5-10s until the last message has role 'assistant' with metadata.status 'completed'. Timeout after 5 min. | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `description` | any | yes | Protocol description | | `project` | any | yes | Project UUID to associate with | | `title` | any | yes | Task title (defaults to first 100 chars of description) | --- # Search Source: https://docs.elnora.ai/docs/mcp/search > Search across your knowledge base and content. Search across your knowledge base and content. ## elnora_search_all Search across all entities *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `page` | any | yes | Page number | | `pageSize` | any | yes | Results per page | | `query` | any | yes | Search query | ## elnora_search_fileContent Search within file contents *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `page` | any | yes | Page number | | `pageSize` | any | yes | Results per page | | `projectId` | any | yes | Restrict search to a project | | `query` | any | yes | Search query (searches inside file content) | ## elnora_search_files Search files by query *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `page` | any | yes | Page number | | `pageSize` | any | yes | Results per page | | `query` | any | yes | Search query | ## elnora_search_tasks Search tasks by query *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `page` | any | yes | Page number | | `pageSize` | any | yes | Results per page | | `query` | any | yes | Search query | --- # Tasks Source: https://docs.elnora.ai/docs/mcp/tasks > Create tasks and drive the Elnora agent. Create tasks and drive the Elnora agent. ## elnora_tasks_archive Archive (delete) a task *Destructive · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `taskId` | any | yes | Task UUID | ## elnora_tasks_attachmentContent Get the content of a task attachment *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `attachmentId` | any | yes | Attachment UUID | | `taskId` | any | yes | Task UUID | ## elnora_tasks_attachments List the files attached to a task *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `taskId` | any | yes | Task UUID | ## elnora_tasks_create Create a new task in a project. If a message is provided it is queued, but the AI response is NOT returned — the agent processes asynchronously. Poll elnora_tasks_messages every 5-10s until the last message has role 'assistant' with metadata.status 'completed'. Timeout after 5 min. | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `message` | any | yes | Initial message | | `project` | any | yes | Project UUID (optional; defaults to your workspace) | | `stream` | any | yes | CLI-only: stream agent response (no-op over MCP) | | `title` | any | yes | Task title | | `wait` | any | yes | CLI-only: wait for agent response (no-op over MCP) | ## elnora_tasks_get Get details of a specific task *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `taskId` | any | yes | Task UUID | ## elnora_tasks_list List tasks, optionally filtered by project or lifecycle status *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `page` | any | yes | Page number | | `pageSize` | any | yes | Results per page | | `project` | any | yes | Filter by project UUID | | `status` | any | yes | Lifecycle filter: active (default), archived, or all | ## elnora_tasks_messages List messages for a task *Read-only · Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `cursor` | any | yes | Cursor for pagination | | `limit` | any | yes | Max messages | | `taskId` | any | yes | Task UUID | ## elnora_tasks_send Send a message to a task. Returns the created user message immediately — the agent processes asynchronously. To get the AI response, poll elnora_tasks_messages until the last message has role 'assistant' with metadata.status 'completed'. Poll every 5-10s, timeout after 5 min. | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `fileRefs` | any | yes | File IDs to attach | | `message` | any | yes | Message content (markdown supported) | | `stream` | any | yes | CLI-only: stream agent response (no-op over MCP) | | `taskId` | any | yes | Task UUID | | `wait` | any | yes | CLI-only: wait for agent response (no-op over MCP) | ## elnora_tasks_unarchive Unarchive a task so it reappears in the default task list *Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `taskId` | any | yes | Task UUID to unarchive | ## elnora_tasks_update Update an existing task *Idempotent* | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `status` | any | yes | New status | | `taskId` | any | yes | Task UUID | | `title` | any | yes | New title | --- # Plugins Source: https://docs.elnora.ai/docs/plugins > Install Elnora in Claude Code, Cursor, and 30+ AI tools with one plugin — an MCP connection, skills, and a /protocol command. The **Elnora plugin** packages everything an AI coding tool needs to work with the Elnora platform: a connection to the hosted [MCP server](/docs/mcp), a set of skills that teach agents how to use it, and an `/elnora:protocol` command. It is open source (Apache-2.0) at [github.com/Elnora-AI/elnora-plugins](https://github.com/Elnora-AI/elnora-plugins). ## Install in Claude Code ```bash claude plugin marketplace add https://github.com/Elnora-AI/elnora-plugins.git claude plugin install elnora@elnora-plugins ``` Claude Code connects to `https://mcp.elnora.ai/mcp` and prompts you to authorize on first use. For every other tool — Cursor, Codex, VS Code, Gemini CLI, or any MCP client — see [Install & connect](/docs/plugins/install). ## What you get ## How Elnora is organized A quick mental model for the objects you'll work with: - An **organization** is your team's top-level container. It has members and roles. - A **task** is a conversation with the Elnora agent. You send messages; the agent generates and optimizes protocols, searches your knowledge base, and works with files. - **Files** are your documents and generated outputs, with full version history. They live in your **knowledge base**, private to you by default and shareable when you choose. See [Core concepts](/docs/get-started/concepts) for the complete picture. ## Authentication The plugin authenticates the same way as the MCP server — **OAuth 2.1** (a browser prompt on first connect) or an **API key**. See [Authentication](/docs/get-started/authentication) to create and manage keys. The plugin talks to the same public platform as the API and CLI, so anything you do through it respects your organization's roles and permissions. --- # Install & connect Source: https://docs.elnora.ai/docs/plugins/install > Connect Elnora to Claude Code, Cursor, OpenAI Codex, VS Code, Gemini CLI, or any MCP client. Every integration connects to the same hosted MCP server — `https://mcp.elnora.ai/mcp` — so there is nothing to run or host yourself. Pick your tool below. On first connect, your client opens a browser to authorize with **OAuth 2.1**. Prefer a key? See [Authentication](/docs/get-started/authentication) to create one and send it as an `X-API-Key` (or `Authorization: Bearer`) header. Install the plugin (recommended — it also adds skills and the `/elnora:protocol` command): ```bash claude plugin marketplace add https://github.com/Elnora-AI/elnora-plugins.git claude plugin install elnora@elnora-plugins ``` Or add just the MCP server: ```bash claude mcp add elnora --transport http --scope user https://mcp.elnora.ai/mcp ``` Add to `.cursor/mcp.json` in your project (or your global Cursor config): ```json { "mcpServers": { "elnora": { "url": "https://mcp.elnora.ai/mcp" } } } ``` To also install the skills, copy them into your project: ```bash git clone https://github.com/Elnora-AI/elnora-plugins.git cp -r elnora-plugins/elnora/skills/* .cursor/skills/ ``` ```bash codex mcp add elnora -- https://mcp.elnora.ai/mcp ``` Add to `.vscode/mcp.json`: ```json { "servers": { "elnora": { "type": "http", "url": "https://mcp.elnora.ai/mcp" } } } ``` Add Elnora to your Gemini CLI MCP settings: ```json { "mcpServers": { "elnora": { "httpUrl": "https://mcp.elnora.ai/mcp" } } } ``` Elnora speaks the standard [Model Context Protocol](https://modelcontextprotocol.io) over Streamable HTTP. Point any compliant client at: ```json { "mcpServers": { "elnora": { "type": "http", "url": "https://mcp.elnora.ai/mcp" } } } ``` Health check: `https://mcp.elnora.ai/health`. ## Verify the connection Once connected, ask your assistant to list your tasks, or run the protocol command in Claude Code: ```text /elnora:protocol Optimize a HEK293 transfection protocol for higher yield ``` If the tools don't appear, confirm you authorized the connection and that your account has an active organization. See the full tool catalog under [MCP & integrations](/docs/mcp).