# 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).