# Overview (/docs) Nurama is a collaborative asset-review platform: workspaces contain projects, projects contain assets, folders, boards, tasks and chats, and every change fans out to the people watching it in real time. This site documents how to build on it. ## Pick a credential first [#pick-a-credential-first] Integrations never sign in with a person's email and password. Each way of connecting has its own credential, and the credential decides what the connection can do. | You are building | Use | Acts as | | ------------------------------------------------------------ | -------------------------------------------------------------------------------------- | ------------------------------------------------------------- | | An AI assistant integration (Claude, Cursor, any MCP client) | The hosted [MCP server](/docs/guides/mcp) with OAuth sign-in | The person who signed in, limited to the scopes they approved | | A script or automation that should act as you | A [personal access token](/docs/getting-started/authentication#personal-access-tokens) | You, limited to the scopes on the token | | A shared service, bot or team automation | A [bot API key](/docs/guides/bots) | A dedicated bot user with its own memberships and scopes | All three are scoped, revocable and cannot touch billing, account security or token management. ## The surfaces [#the-surfaces] ## Machine-readable sources [#machine-readable-sources] Everything on this site is generated from documents you can consume directly: * OpenAPI 3.0: [`/openapi.json`](/openapi.json) or [`/openapi.yaml`](/openapi.yaml) * AsyncAPI 3.0: [`/asyncapi.json`](/asyncapi.json) or [`/asyncapi.yaml`](/asyncapi.yaml) * MCP tool catalogue: [`/mcp-tools.json`](/mcp-tools.json) * This site as text for language models: [`/llms.txt`](/llms.txt) (index) and [`/llms-full.txt`](/llms-full.txt) (everything). Every page also has a Markdown variant, reachable from the copy button at the top of the page. The [build manifest](/manifest.json) records which platform release the documents were generated from. # Authentication (/docs/getting-started/authentication) Every request to the REST API carries a bearer credential: ``` Authorization: Bearer ``` Three credentials are available to integrations. They differ in whose identity actions are attributed to and in which host accepts them. | Credential | Prefix | Acts as | Obtain it | Use against | | --------------------- | ---------- | ----------------------- | -------------------------------------------------------------- | ------------------- | | Personal access token | `nrm_pat_` | The user who created it | Nurama web app, **Settings → Tokens** | `api.nurama.com` | | Bot API key | `nrm_bot_` | A dedicated bot user | Workspace settings, **Bots** tab (workspace admins) | `bot.nurama.com` | | MCP OAuth connection | — | The user who signed in | Automatically, when an MCP client connects to `mcp.nurama.com` | The MCP server only | Email-and-password sessions exist for the Nurama apps and are not part of the public API. The endpoints behind them are not documented here. ## Personal access tokens [#personal-access-tokens] A personal access token is a long-lived credential that acts as you within the scopes you chose. Create it under **Settings → Tokens** in the web app, name it, pick scopes, and copy the secret once. Revoke it from the same screen. Tokens cannot create or manage other tokens, so a compromised token cannot widen its own access. Use one for scripts, local automations and CI jobs that should run as you. If several people or a production system will depend on the integration, create a bot instead so it does not stop working when you leave a workspace. ## Bot API keys [#bot-api-keys] A bot is a user account owned by a workspace. A workspace owner or admin creates it from the workspace's **Bots** tab, choosing its display name and scopes, then adds it to the projects it should see. The key is shown once and can be rotated from the same place. Bots appear in chats under their own name and avatar, and audit trails attribute their actions to the bot. Bot keys are only accepted on the bot gateway: `bot.nurama.com` for HTTP and `bot-ws.nurama.com` for Socket.IO. See [Building a bot](/docs/guides/bots) for the workflow, and the [SDK guide](/docs/guides/sdk) for `BotClient`. ## MCP connections [#mcp-connections] When an MCP client such as Claude connects to `https://mcp.nurama.com/mcp`, it is sent through an OAuth 2.1 sign-in in the browser. The person signs in to Nurama, approves a read-only (`nurama.read`) or read-and-write (`nurama.write`) grant, and the client receives a token it uses for that connection. Nothing is copied or stored by hand, and the grant can be revoked from the Nurama account. A personal access token can be used instead of the OAuth flow for headless clients; see the [MCP guide](/docs/guides/mcp). ## Scopes [#scopes] Personal access tokens and bot keys carry scopes from this list. An MCP grant maps `nurama.read` to the read scopes and `nurama.write` to all of them except `webhooks:manage`, which only a personal access token can carry. | Scope | Allows | | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `workspaces:read` | Read workspace metadata and your own memberships | | `projects:read` | Read project metadata and membership | | `assets:read` | Read asset metadata and request signed download URLs | | `assets:write` | Upload, update, publish and tag assets | | `chat:read` | Read chats, messages and message attachments | | `chat:write` | Post messages, edit your own messages, attach files | | `tasks:read` | Read boards, tasks, task events and task relations | | `tasks:write` | Create, update, move, assign and link tasks | | `webhooks:manage` | Create, update, pause and delete webhook subscriptions, rotate their secrets, test and replay deliveries. Personal access tokens only, and the token's owner must be a workspace admin. | A request to a scope-gated endpoint without the matching scope fails with `403`, even when the underlying user has permission. Scopes are fixed when the credential is created; make a new one to change them. Whatever the scopes, none of the three credentials can reach billing, subscriptions, credits, account security or token management. Those surfaces are reserved for the Nurama apps. ## WebSocket handshake [#websocket-handshake] Socket.IO connections authenticate with the same personal access token or bot key, passed as `token` in the handshake query. Public release channels (`/public/{token}`) need no credential. Details are in the [WebSocket guide](/docs/guides/websocket). Treat tokens and bot keys as secrets. Never embed them in client-side code or share one credential between people; each person should hold their own token, and shared automations should run as a bot. # Conventions (/docs/getting-started/conventions) ## Identifiers [#identifiers] Resources are identified by UUIDs. Path parameters are named after the resource they identify (`workspaceId`, `projectId`, `chatId`, `messageId`); the schemas in the reference say which are required. ## Visibility tiers [#visibility-tiers] Projects have three audiences: `creator`, `reviewer` and `public`. Assets, folders, chats and notifications exist per tier, and many list endpoints take the tier as a path segment or query parameter. A caller only sees the tiers their role allows, and reads never cross tiers. When you reply to something, use the tier it came from. ## Pagination [#pagination] List endpoints return a paginated envelope and accept: | Parameter | Meaning | | ---------- | ---------------------------------------------------------------------------------------- | | `limit` | Page size. Most endpoints cap it at 20. | | `paginate` | `cursor` (default for streams such as messages and feeds) or `index` (fixed-size lists). | | `cursor` | Opaque cursor from the previous page, for cursor pagination. | | `page` | Page number, for index pagination. | | `sort` | Field and direction, where the endpoint documents it. | Cursor responses include the cursor for the next page; index responses include total counts. The SDK's `PaginatedResponse` type covers both shapes. ## Errors [#errors] Errors share one shape: ```json { "code": 403, "message": "forbidden", "errorKey": "forbidden" } ``` `errorKey` is stable and is the value to switch on; `message` is for people. Beyond the responses listed for each operation, any authenticated endpoint may return `400` (validation), `401` (missing or expired credential) or `403` (no permission, missing scope, or a feature the workspace's plan does not include). Validation errors describe the offending field in `message`. ## Rate limits [#rate-limits] Requests are rate limited per credential. Bot keys share one bucket per key (120 requests per minute); user credentials have per-route limits. A `429` response carries a `Retry-After` header. ## File uploads [#file-uploads] Files are never posted to the API. You create the asset (or message attachment) first, receive pre-signed upload URLs in the response, upload the bytes directly to storage, then call the matching `complete-upload` endpoint. The SDK wraps the whole sequence; see the `asset` namespace in the [SDK reference](/docs/reference/sdk/routes/asset). ## Dates and times [#dates-and-times] Timestamps are ISO 8601 strings in UTC. Durations and media positions are in milliseconds unless a field says otherwise. # Quick start (/docs/getting-started) The fastest way to try the API is a personal access token: a scoped credential that acts as you. Shared or production automations should use a [bot](/docs/guides/bots) instead, and AI assistants should connect through the [MCP server](/docs/guides/mcp). ## Base URLs [#base-urls] | Purpose | URL | | ---------------------------------- | --------------------------------------- | | REST API (personal access tokens) | `https://api.nurama.com/v1` | | REST API (bot API keys) | `https://bot.nurama.com/v1` | | WebSocket (personal access tokens) | `https://ws.nurama.com` (Socket.IO) | | WebSocket (bot API keys) | `https://bot-ws.nurama.com` (Socket.IO) | | MCP server | `https://mcp.nurama.com/mcp` | All REST paths in this documentation are relative to the `/v1` prefix. Requests and responses are JSON unless an operation says otherwise. ## 1. Create a token [#1-create-a-token] In the Nurama web app open **Settings → Tokens → New token**. Give it a name and pick the scopes it needs. For a first look, `workspaces:read` and `projects:read` are enough. The token starts with `nrm_pat_` and is shown once; store it like a password. ## 2. Make a request [#2-make-a-request] ```bash curl -s https://api.nurama.com/v1/workspaces \ -H "Authorization: Bearer $NURAMA_TOKEN" ``` The response lists the workspaces you belong to. A request outside the token's scopes fails with `403` and the error key `forbidden`; see [Conventions](/docs/getting-started/conventions) for the error shape. ## 3. The same thing with the SDK [#3-the-same-thing-with-the-sdk] ```bash pnpm add @nurama/sdk ``` ```ts import NuramaClient from '@nurama/sdk'; const client = new NuramaClient('https://api.nurama.com', { apiKey: process.env.NURAMA_TOKEN, }); const workspaces = await client.workspace.listWorkspaces(); ``` With `apiKey` set, the client sends the token on every request and skips session handling entirely. Continue with the [SDK guide](/docs/guides/sdk). ## Where to go next [#where-to-go-next] # Building a bot (/docs/guides/bots) A bot is a workspace-owned user with its own API key. It appears in chats under its own name and avatar, holds project memberships like any member, and is limited by the scopes on its key. ## 1. Create the bot [#1-create-the-bot] A workspace owner or admin creates the bot from the workspace's **Bots** tab in the Nurama web app, choosing a display name and the scopes the key should carry, then adds it to the projects it should see. The same can be done over the API with `POST /workspaces/{workspaceId}/bots` and the membership endpoints under it. The raw `nrm_bot_…` key is shown once. ## 2. Connect [#2-connect] ```ts import BotClient from '@nurama/sdk/bot'; const bot = new BotClient(process.env.NURAMA_BOT_API_KEY); const { user } = await bot.membership.getMyMemberships(); ``` `BotClient` targets `bot.nurama.com` and `bot-ws.nurama.com`. It exposes the same namespaces as the user client minus account, billing, device and bot administration. ## 3. Listen for mentions [#3-listen-for-mentions] Subscribe to the bot's own user channel and react to `chatMention`: ```ts await bot.socket.subscribe(`/user/${botUserId}`, 'notification', async (event) => { if (event.type !== 'chatMention') return; const { chatId, messageId } = event.tokens; await bot.socket.emit(`/user/${botUserId}`, 'typing:start', { chatId }); const history = await bot.chat.getMessages(chatId, { limit: 20, sort: { createdAt: -1 }, excludeReplies: true }); const reply = await decide(history); await bot.chat.createMessage(chatId, { content: reply, replyToId: messageId }); await bot.socket.emit(`/user/${botUserId}`, 'typing:stop', { chatId }); }); ``` To see every message in a project rather than only mentions, subscribe to `/project/{projectId}/creator` and `/project/{projectId}/reviewer` and handle `chatCreateMessage`. Reply in the tier the message came from. ## Useful methods [#useful-methods] | Goal | Method | | ----------------------------- | ------------------------------------------------------------------------------------ | | Chat the bot was mentioned in | `bot.chat.getChat(chatId)` | | Recent history | `bot.chat.getMessages(chatId, params)` | | Post a reply | `bot.chat.createMessage(chatId, { content, replyToId?, assetMentions?, mentions? })` | | Active assets in a project | `bot.project.getHomeFeed(projectId, visibility, params)` | | Project members | `bot.membership.getProjectMemberships(projectId, params)` | | Create a task | `bot.task.createTask(data)` | The full list with read/mutate flags is the [method index](/docs/reference/sdk/method-index). ## Good behaviour [#good-behaviour] * Default to read-only methods; only write when that is the bot's purpose. * Rate limits are per key (120 requests per minute). Batch reads and cache memberships. * Render asset references as `{{assetMention:UUID}}` tokens and pass the ids in `assetMentions` so they become clickable. * Never log the API key. Rotate it with `POST /workspaces/{workspaceId}/bots/{botId}/rotate-key` if it leaks. If your bot is an AI assistant, consider running the [MCP server](/docs/guides/mcp) instead of writing the tool layer yourself. # MCP server (/docs/guides/mcp) Nurama runs a hosted [Model Context Protocol](https://modelcontextprotocol.io) server at `https://mcp.nurama.com/mcp`. An assistant connected to it can read projects, chats, assets, boards and tasks, and, when allowed, post messages and create or update tasks, all as the person who signed in and within the scopes they approved. ## Connect [#connect] Add the server to your client and sign in when the browser opens. Nurama asks whether to grant read-only (`nurama.read`) or read-and-write (`nurama.write`) access. **Claude Code** ```bash claude mcp add --transport http nurama https://mcp.nurama.com/mcp ``` **Claude desktop and claude.ai**: add a custom connector with the URL `https://mcp.nurama.com/mcp`. **Cursor and other clients**: add an entry to the client's MCP configuration. ```json { "mcpServers": { "nurama": { "url": "https://mcp.nurama.com/mcp" } } } ``` Ask the assistant which Nurama tools it has to confirm the connection. The [tool catalogue](/docs/reference/mcp) lists every tool with its input schema; the raw list, identical to the server's `tools/list` response, is at [`/mcp-tools.json`](/mcp-tools.json). ## Headless clients [#headless-clients] Where a browser sign-in is not possible, for example in CI or a server-side agent, send a [personal access token](/docs/getting-started/authentication#personal-access-tokens) as a bearer header instead of using OAuth: ``` Authorization: Bearer nrm_pat_… ``` The connection then acts as the token's owner within the token's scopes. Bot API keys are not accepted by the MCP server; they are a service identity for the REST and WebSocket APIs, not a personal credential for an assistant. ## What the assistant can do [#what-the-assistant-can-do] Read tools cover memberships, project feeds, chats, messages, boards and tasks. Write tools, such as sending a message or creating a task, are flagged as mutating in the catalogue and only work under a read-and-write grant or a token with the matching write scopes. Nothing the assistant does can reach billing, account security, token management or webhook subscriptions, whatever it is asked. Grant the narrowest access that does the job: a read-only connection cannot be talked into writing, whatever the prompt says. ## Revoking access [#revoking-access] Revoke an OAuth grant or a personal access token from your Nurama account settings. Connections using it stop working immediately. # Using the SDK (/docs/guides/sdk) `@nurama/sdk` is a TypeScript client for the REST API and the Socket.IO layer. It ships ESM and CommonJS builds for Node 18+ and a browser bundle, and depends on `@nurama/types` for every request and response type. ```bash pnpm add @nurama/sdk ``` Source and issues live in the public mirror at [github.com/nurama-team/nurama-sdk](https://github.com/nurama-team/nurama-sdk); the package is Apache-2.0. ## Two clients [#two-clients] | Client | Import | Credential | Reaches | | -------------- | ----------------- | --------------------------------------- | ---------------------------------------- | | `NuramaClient` | `@nurama/sdk` | Personal access token (`apiKey` option) | The API, within the token's scopes | | `BotClient` | `@nurama/sdk/bot` | Bot API key | The bot gateway, within the key's scopes | ```ts import NuramaClient from '@nurama/sdk'; const client = new NuramaClient('https://api.nurama.com', { apiKey: process.env.NURAMA_TOKEN, // nrm_pat_… websocketURL: 'https://ws.nurama.com', // optional, defaults to the API host }); ``` With `apiKey` set, the client sends the token on every request and never touches session handling. The `auth` namespace and the session flow it drives exist for the Nurama apps; integrations should not sign in with a password. ```ts import BotClient from '@nurama/sdk/bot'; const bot = new BotClient(process.env.NURAMA_BOT_API_KEY); const memberships = await bot.membership.getMyMemberships(); ``` Both expose the same namespaces (`client.chat`, `bot.chat`, …); `BotClient` simply omits the ones a bot key cannot use. ## Conventions [#conventions] * **Method names repeat the noun.** `asset.getAsset`, `board.createBoard`, `supportTicket.listSupportTickets`. Methods close over the client rather than `this`, so you can destructure a namespace (`const { getAsset, updateAsset } = client.asset`) and names never collide across namespaces. * **Namespaces follow the URL.** `/tasks/{id}/links` is `task.getTaskLinks`; `/public-download/{token}` is `public.resolvePublicDownload`. * **Visibility is an argument.** Reads that differ by tier take `visibility: 'creator' | 'reviewer'`, for example `project.getAssets(projectId, 'reviewer')`. * **Pagination is a params object.** Methods returning `PaginatedResponse` accept `{ limit, paginate: 'cursor' | 'index', cursor?, page? }`. * **Required identifiers throw when missing**, before any request is made. The [method index](/docs/reference/sdk/method-index) lists every bot-reachable method grouped by namespace with a read/mutate flag, and the [SDK reference](/docs/reference/sdk) has full signatures and types. ## Real-time events [#real-time-events] The `socket` namespace manages Socket.IO connections per channel and re-authenticates when a token is refreshed: ```ts await client.socket.subscribe(`/project/${projectId}/creator`, 'notification', (event) => { if (event.type === 'chatCreateMessage') { // event.changes.create[0].resource is the message } }); ``` Channel names and event payloads are documented under [WebSocket events](/docs/reference/websocket). ## Versioning [#versioning] The SDK follows semantic versioning. Removed or renamed methods only ship in a major version, and the [changelog](https://github.com/nurama-team/nurama-sdk/releases) on the mirror lists them. Pin a minor range in production. # Webhooks (/docs/guides/webhooks) A webhook subscription tells Nurama to `POST` a signed JSON payload to a URL you control whenever a matching event happens in a workspace. Use webhooks when a server you run needs to react to changes without holding a WebSocket connection open. ## Create a subscription [#create-a-subscription] Workspace admins create subscriptions from the workspace's **Webhooks** tab in the Nurama web app, or over the API with a personal access token that belongs to an admin and carries the `webhooks:manage` scope: ```bash curl -s https://api.nurama.com/v1/workspaces/$WORKSPACE_ID/webhooks \ -H "Authorization: Bearer $NURAMA_TOKEN" \ -H 'Content-Type: application/json' \ -d '{ "name": "Task sync", "url": "https://example.com/hooks/nurama", "events": ["task.created", "task.updated"] }' ``` The response includes `signingSecret`. It is shown once, so store it with your other secrets before you do anything else. Rules: * The URL must be HTTPS and publicly reachable. Private and loopback addresses are refused. * Choose events from the [event catalogue](/docs/reference/api/webhook-events). Unknown names are rejected. * A workspace can hold 25 subscriptions that are not failed out. * Only the app or a personal access token with `webhooks:manage` can manage subscriptions. Bot API keys and MCP connections cannot, so a compromised bot or a misled assistant can never register a receiver for your events. * Set `expiresAt` for a temporary integration and the subscription stops delivering after that time. The same operations are available in the SDK under `client.webhook`: `createWebhook`, `listWebhooks`, `updateWebhook`, `rotateWebhookSecret`, `testWebhook`, `listWebhookDeliveries` and `replayWebhookDelivery`. ## What a delivery looks like [#what-a-delivery-looks-like] Each delivery is an HTTP `POST` with a JSON body and these headers: | Header | Meaning | | -------------------------- | ------------------------------------------------------------------------------ | | `X-Nurama-Event-Type` | The event name, for example `task.created` | | `X-Nurama-Event-Id` | Identifies the event. Retries and replays of the same event carry the same id. | | `X-Nurama-Delivery-Id` | Identifies this attempt. | | `X-Nurama-Subscription-Id` | The subscription being delivered to. | | `X-Nurama-Timestamp` | When the request was signed, as Unix seconds. | | `X-Nurama-Signature-256` | `sha256=`, the signature described below. | | `User-Agent` | `Nurama-Webhook/1.0` | The body is an envelope around the same notification the WebSocket API emits: ```json { "id": "0192…", "type": "task.created", "createdAt": "2026-09-23T10:15:04.512Z", "workspace": { "id": "…", "slug": "acme" }, "initiatorId": "…", "initiatorType": "user", "resourceId": "…", "resourceType": "task", "tokens": { "…": "…" }, "changes": { "create": [{ "resourceType": "task", "resource": { "…": "…" } }] } } ``` `type` is the webhook event name. `tokens` and `changes` are shaped exactly as documented for the underlying notification; the [event catalogue](/docs/reference/api/webhook-events) links each event to those pages. Payloads are at most 256 KB and additive-only: fields may be added over time, never removed or renamed, so ignore fields you do not recognise. ## Respond quickly [#respond-quickly] Return any `2xx` status within 10 seconds. Redirects are not followed and count as failures. Do the real work after responding, for example by putting the payload on a queue, so a slow downstream never causes retries. ## Verify the signature [#verify-the-signature] Every request is signed with the subscription's secret using HMAC-SHA256 over the timestamp header, a dot, and the raw request body: ``` signature = HMAC_SHA256(secret, ".") ``` Verify against the raw bytes you received, before parsing JSON, and compare in constant time. Reject requests whose timestamp is more than a few minutes old to defeat replays of captured requests. ```ts import { createHmac, timingSafeEqual } from 'node:crypto'; export function verifyNuramaWebhook(rawBody: Buffer, headers: Record, secret: string) { const timestamp = headers['x-nurama-timestamp']; const received = headers['x-nurama-signature-256'] ?? ''; if (!timestamp || Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false; const expected = 'sha256=' + createHmac('sha256', secret) .update(`${timestamp}.`) .update(rawBody) .digest('hex'); return expected.length === received.length && timingSafeEqual(Buffer.from(expected), Buffer.from(received)); } ``` In Express, mount the handler with `express.raw({ type: 'application/json' })` so the body arrives unparsed. ## Retries, dead letters and pausing [#retries-dead-letters-and-pausing] A delivery that gets a non-`2xx` response, a redirect or a timeout is retried with increasing delays: 1 minute, 5 minutes, 15 minutes, 1 hour, 6 hours, then 24 hours, for up to 8 attempts in total. After the last failure the delivery is dead-lettered and can be inspected and replayed from the deliveries endpoint. If 50 consecutive deliveries to one subscription dead-letter, the subscription is automatically paused with status `failedOut`. Fix the receiver, then set the status back to `active` with a `PATCH`; deliveries that were skipped while paused are not sent. You can also pause a subscription yourself by setting status `paused`. Handle duplicates: a retry or replay carries the same `X-Nurama-Event-Id`, so keep the ids you have processed and skip repeats. Deliveries can arrive out of order. ## Testing and debugging [#testing-and-debugging] * `POST /workspaces/{workspaceId}/webhooks/{webhookId}/test` queues a `webhook.test` delivery to that subscription, regardless of its event list. * `GET /workspaces/{workspaceId}/webhooks/{webhookId}/deliveries` lists attempts with their status (`pending`, `inflight`, `succeeded`, `failed`, `dlq`), the response code and any error. * `POST /workspaces/{workspaceId}/webhooks/{webhookId}/deliveries/{attemptId}/replay` queues a fresh attempt for a past delivery. ## Rotating the secret [#rotating-the-secret] `POST /workspaces/{workspaceId}/webhooks/{webhookId}/rotate-secret` returns a new secret once. Deliveries signed from that moment use the new secret, including retries of earlier failures, so update the receiver immediately after rotating. Anything that fails verification during the switch is retried on the normal schedule. ## Reference [#reference] * [Webhook event catalogue](/docs/reference/api/webhook-events) * [Webhook Subscriptions endpoints](/docs/reference/api/webhook-subscriptions) * Raw catalogue: [`/webhook-events.json`](/webhook-events.json) # Real-time events (/docs/guides/websocket) The WebSocket server is a separate Socket.IO deployment. If a server you run needs to react to changes without holding a connection open, use [webhooks](/docs/guides/webhooks) instead. Connect with a Socket.IO client (the SDK's `socket` namespace, or `socket.io-client` directly), never with a raw WebSocket. ## Channels [#channels] A channel is a Socket.IO namespace named after the resource you want to watch: | Address | Delivers | | ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------- | | `/user/{userId}` | Everything addressed to one user: mentions, member chats, task assignments. You may only join your own. | | `/workspace/{workspaceId}` | Workspace-level changes. | | `/project/{projectId}` | Project-level changes for the default audience. | | `/project/{projectId}/{visibility}` | Changes scoped to `creator`, `reviewer` or `public`. Join both `creator` and `reviewer` if your role spans both. | | `/chat/{chatId}` | One chat's stream, plus the collab relay (cursors, drawing, presenter control). | | `/asset/{assetId}`, `/task/{taskId}`, `/submission/{submissionId}` | One resource's stream. | | `/public/{token}` | A public release, authenticated by the token in the address. | Joining requires the matching `canGet…Notifications` permission, direct or inherited; a refused handshake surfaces as `connect_error` with the message `forbidden`. ## Handshake [#handshake] Pass your credential as `token` in the handshake query: a personal access token against `ws.nurama.com`, or a bot API key against `bot-ws.nurama.com`. Public channels need no token. ```ts import { io } from 'socket.io-client'; const socket = io(`https://ws.nurama.com/project/${projectId}/creator`, { query: { token: process.env.NURAMA_TOKEN }, }); socket.on('notification', (event) => console.log(event.type, event)); ``` When a credential is revoked the server emits `tokenEvent` and disconnects shortly after. ## The notification envelope [#the-notification-envelope] Almost everything arrives as a single event named `notification`. Its `type` field names one of the [notification types](/docs/reference/websocket/notifications); `tokens` carries the identifiers the type documents, and `changes` lists created, updated and deleted resources: ```json { "type": "chatCreateMessage", "initiatorId": "…", "tokens": { "chatId": "…", "messageId": "…" }, "changes": { "create": [{ "resourceType": "chatMessage", "resource": { "…": "…" } }] } } ``` Switch on `type` and read the documented payload. Fields marked deprecated in a type's schema will disappear; prefer the `changes` array over legacy token fields. ## Other events [#other-events] Typing indicators (`typing:start`, `typing:stop`) are emitted by clients and relayed by the server, `ws:probe` checks liveness, and the `collab:*` family relays live-collaboration state on `/chat/{chatId}` namespaces. Each is documented under [Events](/docs/reference/websocket/events) with its direction and payload. The complete machine-readable description is the AsyncAPI document at [`/asyncapi.json`](/asyncapi.json). # REST API (/docs/reference/api) The pages in this section are generated from the platform's OpenAPI 3.0 document, which is itself derived from the API's validation schemas on every release. Each operation page shows the parameters and request body the server accepts, the documented responses, example requests in several languages, and a playground that calls the API with your own credential. * Base URL: `https://api.nurama.com/v1` (`https://bot.nurama.com/v1` for bot API keys) * Authentication: `Authorization: Bearer ` with a personal access token or bot API key; see [Authentication](/docs/getting-started/authentication). Endpoints reserved for the Nurama apps (sign-in, billing, account security) are not listed. * Shared behaviour: [Conventions](/docs/getting-started/conventions) * Source document: [`/openapi.json`](/openapi.json), [`/openapi.yaml`](/openapi.yaml) Only success and route-specific error responses are listed per operation. Any authenticated endpoint may also return `400`, `401` or `403` with the common `Error` body. # Webhook events (/docs/reference/api/webhook-events) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Subscribe to these event names with the [Webhook Subscriptions](/docs/reference/api/webhook-subscriptions) endpoints. Each delivery is a `{ workspace, type, data… }` envelope around the same notification the WebSocket API emits, so the payload fields are documented on the linked notification pages. See the [webhooks guide](/docs/guides/webhooks) for delivery, signatures and retries. Event names are not versioned. Payloads are additive-only: fields may be added, never removed or renamed. Receivers should ignore unknown fields. | Event | Built from notification | Notes | | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------- | | `task.created` | [`boardTaskCreate`](/docs/reference/websocket/notifications/boardtaskcreate) | | | `task.updated` | [`boardTaskUpdate`](/docs/reference/websocket/notifications/boardtaskupdate), [`boardTaskMove`](/docs/reference/websocket/notifications/boardtaskmove), [`boardTaskAssign`](/docs/reference/websocket/notifications/boardtaskassign) | Covers moves between columns, assignment changes and edits to the subject or description. | | `task.deleted` | [`boardTaskRemove`](/docs/reference/websocket/notifications/boardtaskremove) | | | `chat.message.created` | [`chatCreateMessage`](/docs/reference/websocket/notifications/chatcreatemessage) | | | `asset.published` | [`assetStatusUpdate`](/docs/reference/websocket/notifications/assetstatusupdate) | Fires only when an asset becomes active; other status changes are not delivered. | | `webhook.test` | [`webhookTest`](/docs/reference/websocket/notifications/webhooktest) | Synthetic event sent by the test endpoint to one subscription, regardless of its event list. | # Read aggregated access activity for one asset (/docs/reference/api/accessactivity/get-assets-assetid-access-activity) Returns totals per eventType, a top-N breakdown for one dimension, and a zero-filled daily series for the requested eventType. Gated by `canGetAccessActivity` — granted to the same roles that hold `canGetPublicLinks`. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /assets/{assetId}/access-activity Read aggregated access activity for one asset Returns totals per eventType, a top-N breakdown for one dimension, and a zero-filled daily series for the requested eventType. Gated by `canGetAccessActivity` — granted to the same roles that hold `canGetPublicLinks`. # Top-N assets in a project by access count (/docs/reference/api/accessactivity/get-projects-projectid-access-activity-top-assets) Returns `(assetId, count)` pairs ordered by total count of the requested `eventType` in the range. Only ids and counts are returned; fetch names and thumbnails through the asset endpoints. Requires `canGetAccessActivity`. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId}/access-activity/top-assets Top-N assets in a project by access count Returns `(assetId, count)` pairs ordered by total count of the requested `eventType` in the range. Only ids and counts are returned; fetch names and thumbnails through the asset endpoints. Requires `canGetAccessActivity`. # Record a play event from an authenticated player (/docs/reference/api/accessactivity/post-assets-assetid-access-activity) Reports a play event from an authenticated player. Events are de-duplicated per UTC day per session, so resuming from pause or replaying a region within one session counts once. `download` and `embed_resolved` are NOT accepted on this route — those are recorded by the API automatically to keep the counts authoritative. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /assets/{assetId}/access-activity Record a play event from an authenticated player Reports a play event from an authenticated player. Events are de-duplicated per UTC day per session, so resuming from pause or replaying a region within one session counts once. `download` and `embed_resolved` are NOT accepted on this route — those are recorded by the API automatically to keep the counts authoritative. # Record a play event from an embedded player (unauthenticated) (/docs/reference/api/accessactivity/post-public-download-token-access-activity) Reports a play event from an embedded (unauthenticated) player. The token is the 10-character public-link token and is the only credential — no bearer token is used. Events on this route are always recorded with `visibility: 'public'`; the body accepts no `visibility` field. Only recorded while the link is `active`: a missing or disabled link is rejected with 404 (deliberately indistinguishable), an expired one with 410. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /public-download/{token}/access-activity Record a play event from an embedded player (unauthenticated) Reports a play event from an embedded (unauthenticated) player. The token is the 10-character public-link token and is the only credential — no bearer token is used. Events on this route are always recorded with `visibility: 'public'`; the body accepts no `visibility` field. Only recorded while the link is `active`: a missing or disabled link is rejected with 404 (deliberately indistinguishable), an expired one with 410. # Record a play event from an embedded player (unauthenticated) (/docs/reference/api/publicassetlinks/post-public-download-token-access-activity) Reports a play event from an embedded (unauthenticated) player. The token is the 10-character public-link token and is the only credential — no bearer token is used. Events on this route are always recorded with `visibility: 'public'`; the body accepts no `visibility` field. Only recorded while the link is `active`: a missing or disabled link is rejected with 404 (deliberately indistinguishable), an expired one with 410. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /public-download/{token}/access-activity Record a play event from an embedded player (unauthenticated) Reports a play event from an embedded (unauthenticated) player. The token is the 10-character public-link token and is the only credential — no bearer token is used. Events on this route are always recorded with `visibility: 'public'`; the body accepts no `visibility` field. Only recorded while the link is `active`: a missing or disabled link is rejected with 404 (deliberately indistinguishable), an expired one with 410. # Delete an AI chat topic. (/docs/reference/api/ai/delete-ai-chat-topics-topicid) Soft-deletes the topic: the topic and every message in its chat move to `status: pendingDelete`, and an `aiChatTopicUpdate` notification with a `delete` change is emitted on the caller's user channel. Only the topic's creator may delete it. Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /ai/chat/topics/{topicId} Delete an AI chat topic. Soft-deletes the topic: the topic and every message in its chat move to `status: pendingDelete`, and an `aiChatTopicUpdate` notification with a `delete` change is emitted on the caller's user channel. Only the topic's creator may delete it. # Get the workspace's current Nurama Credit balance. (/docs/reference/api/ai/get-ai-balance) Returns the workspace's spendable Nurama Credit balance. Requires `canGetCreditBalance` on the workspace (workspace owner / admin, project owner / admin) and an active subscription; no per-feature gate. The balance is also returned as `balanceAfter` on every billable AI call, so clients can keep a balance display fresh without a separate fetch after every call. `balance` is the spendable total: `planBalance` (monthly plan grant, does not carry over) + `purchasedBalance` (top-ups, accumulates). `hasPriorTopUp` reports whether the workspace has ever made a manual credit purchase — the precondition for enabling auto top-up. Also available at `GET /credits/balance` (same response). Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /ai/balance Get the workspace's current Nurama Credit balance. Returns the workspace's spendable Nurama Credit balance. Requires `canGetCreditBalance` on the workspace (workspace owner / admin, project owner / admin) and an active subscription; no per-feature gate. The balance is also returned as `balanceAfter` on every billable AI call, so clients can keep a balance display fresh without a separate fetch after every call. `balance` is the spendable total: `planBalance` (monthly plan grant, does not carry over) + `purchasedBalance` (top-ups, accumulates). `hasPriorTopUp` reports whether the workspace has ever made a manual credit purchase — the precondition for enabling auto top-up. Also available at `GET /credits/balance` (same response). # Get a single AI chat topic. (/docs/reference/api/ai/get-ai-chat-topics-topicid) Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /ai/chat/topics/{topicId} Get a single AI chat topic. # List the caller's AI chat topics for a scope. (/docs/reference/api/ai/get-ai-chat-topics) Returns topics owned by the calling user, scoped to one workspace / project, or to "social" (personal) chats. Topics are ordered by `lastMessageAt` desc with nulls last. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /ai/chat/topics List the caller's AI chat topics for a scope. Returns topics owned by the calling user, scoped to one workspace / project, or to "social" (personal) chats. Topics are ordered by `lastMessageAt` desc with nulls last. # List polish tones available to the chat composer. (/docs/reference/api/ai/get-ai-tones) Returns the polish tone catalogue so clients can offer tone choices without hard-coding them. The list is currently fixed; workspace-scoped custom tones are planned. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /ai/tones List polish tones available to the chat composer. Returns the polish tone catalogue so clients can offer tone choices without hard-coding them. The list is currently fixed; workspace-scoped custom tones are planned. # Aggregated Nurama Credit usage report for a workspace. (/docs/reference/api/ai/get-ai-usage) Credit spend on AI features (and convos) in a time window, totalled and broken down by user and by integration point. Defaults to a rolling 30-day window ending now when no dates are passed. Filters apply uniformly: `userId` narrows the per-integration breakdown to that user's calls, and `integrationPoint` narrows the per-user breakdown to that feature. Requires `canGetCreditUsageReport` on the workspace (granted to the same roles as `canGetCreditBalance`) and an active subscription. Also available at `GET /credits/usage` (same response). Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /ai/usage Aggregated Nurama Credit usage report for a workspace. Credit spend on AI features (and convos) in a time window, totalled and broken down by user and by integration point. Defaults to a rolling 30-day window ending now when no dates are passed. Filters apply uniformly: `userId` narrows the per-integration breakdown to that user's calls, and `integrationPoint` narrows the per-user breakdown to that feature. Requires `canGetCreditUsageReport` on the workspace (granted to the same roles as `canGetCreditBalance`) and an active subscription. Also available at `GET /credits/usage` (same response). # Rename, archive, or set the context pins of an AI chat topic. (/docs/reference/api/ai/patch-ai-chat-topics-topicid) At least one of `title`, `archived`, or `contextItems` must be provided. Only the topic's creator may update it; any other caller receives `forbidden`. ## Context pins (`contextItems`) The items the user has pinned to Nu's Context column for this topic — assets, folders, people, submissions, and public collections that the conversation is "about". Persisted here rather than sent per message, so the column survives a page reload and a new session the way the conversation does. Sent and stored as **identity only** (`type` + `id`); the server normalises away any other field. Names, thumbnails, and content are never stored, and neither is any access decision. A pin is a **bookmark, not a grant**. Every entry is re-resolved from scratch on every turn, under the caller's live permissions: - an item deleted since it was pinned drops out of that turn; - an item the caller has since lost access to drops out; - visibility tiers are re-derived per turn — the stored pin carries none. Dropped entries are silently omitted from the model's context rather than reported, so the assistant never learns that something it cannot see exists. The stored list is left intact, so regaining access restores the pin without re-pinning. Sending `contextItems` replaces the topic's pins wholesale. An empty array clears them. Only project-scoped topics resolve pins at all; workspace- and social-scoped topics have no project to resolve against and ignore them. Machine-readable definition: https://docs.nurama.com/openapi.json ## PATCH /ai/chat/topics/{topicId} Rename, archive, or set the context pins of an AI chat topic. At least one of `title`, `archived`, or `contextItems` must be provided. Only the topic's creator may update it; any other caller receives `forbidden`. ## Context pins (`contextItems`) The items the user has pinned to Nu's Context column for this topic — assets, folders, people, submissions, and public collections that the conversation is "about". Persisted here rather than sent per message, so the column survives a page reload and a new session the way the conversation does. Sent and stored as **identity only** (`type` + `id`); the server normalises away any other field. Names, thumbnails, and content are never stored, and neither is any access decision. A pin is a **bookmark, not a grant**. Every entry is re-resolved from scratch on every turn, under the caller's live permissions: - an item deleted since it was pinned drops out of that turn; - an item the caller has since lost access to drops out; - visibility tiers are re-derived per turn — the stored pin carries none. Dropped entries are silently omitted from the model's context rather than reported, so the assistant never learns that something it cannot see exists. The stored list is left intact, so regaining access restores the pin without re-pinning. Sending `contextItems` replaces the topic's pins wholesale. An empty array clears them. Only project-scoped topics resolve pins at all; workspace- and social-scoped topics have no project to resolve against and ignore them. # Create a new (empty) AI chat topic. (/docs/reference/api/ai/post-ai-chat-topics) Creates a new, empty topic. Send the first message through `POST /v1/chats/{topic.chatId}/new-message`; the assistant's reply arrives asynchronously as an `aiChatMessageCreate` notification (see the AI overview). The balance check runs when a message is sent, so no credits are charged by this endpoint. The first user/assistant exchange triggers an auto-naming pass; the resulting title arrives via the `aiChatTopicUpdate` notification. Requires access to the scope (`canGetProject` / `canGetWorkspace` on `scopeId`; no check for `social`), an active subscription, the `ai` capability and `aiChatEnabled`. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /ai/chat/topics Create a new (empty) AI chat topic. Creates a new, empty topic. Send the first message through `POST /v1/chats/{topic.chatId}/new-message`; the assistant's reply arrives asynchronously as an `aiChatMessageCreate` notification (see the AI overview). The balance check runs when a message is sent, so no credits are charged by this endpoint. The first user/assistant exchange triggers an auto-naming pass; the resulting title arrives via the `aiChatTopicUpdate` notification. Requires access to the scope (`canGetProject` / `canGetWorkspace` on `scopeId`; no check for `social`), an active subscription, the `ai` capability and `aiChatEnabled`. # One turn of a Compose-with-Nu drafting conversation. (/docs/reference/api/ai/post-ai-compose) Nu helps the user draft a message for a specific chat. The client sends the drafting conversation so far (`messages`, oldest first); the server reads the target chat for context and tone and returns Nu's commentary (`text`) plus, when it has one, a `proposal` — the message Nu suggests posting. Nothing is posted; the user decides whether the proposal reaches their composer. Requires `canAiComposeMessage` on the workspace, an active subscription, the `ai` capability, `aiComposeEnabled` (and `aiComposeAllowReviewer` for reviewers) and sufficient balance — see the AI overview. The caller must also be able to read `chatId`, so you can only compose into a chat you can already read. Caps: 1–40 turns; each turn's `text` / `proposal` ≤ 4000 characters. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /ai/compose One turn of a Compose-with-Nu drafting conversation. Nu helps the user draft a message for a specific chat. The client sends the drafting conversation so far (`messages`, oldest first); the server reads the target chat for context and tone and returns Nu's commentary (`text`) plus, when it has one, a `proposal` — the message Nu suggests posting. Nothing is posted; the user decides whether the proposal reaches their composer. Requires `canAiComposeMessage` on the workspace, an active subscription, the `ai` capability, `aiComposeEnabled` (and `aiComposeAllowReviewer` for reviewers) and sufficient balance — see the AI overview. The caller must also be able to read `chatId`, so you can only compose into a chat you can already read. Caps: 1–40 turns; each turn's `text` / `proposal` ≤ 4000 characters. # Rate one assistant reply (Nu Feedback). (/docs/reference/api/ai/post-ai-feedback) Records a thumbs-up / thumbs-down on a single assistant reply, together with a **snapshot of the interaction that produced it**, for the Nurama team to review. **What gets stored.** The reply being rated, up to ten preceding turns of the conversation, and — when the client supplies them — the page context and pinned Context-column items that were in play at the time. Each captured message is truncated at 4,000 characters. Tell the user before submitting that context from the interaction will be shared with the Nurama team for review. The interaction is **snapshotted, not referenced**: the record captures what the assistant actually said at the time, and remains useful if the chat is later deleted or the topic rewritten. **Authorisation.** The caller must be able to read `chatId` — the same check the chat endpoints apply. A user can only rate a reply in a chat they can already read, so this endpoint cannot be used to capture someone else's conversation by guessing message ids. Failure is `403 forbidden`. This endpoint is **not** subject to the subscription, AI-feature or credit-balance checks that gate AI use: feedback can be submitted even when a workspace's AI add-on has been switched off. A snapshot that cannot be built does not fail the request — the rating is still recorded, with `context.snapshotError: true`. Losing a thumbs-down to a transcript read failure would be the wrong trade. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /ai/feedback Rate one assistant reply (Nu Feedback). Records a thumbs-up / thumbs-down on a single assistant reply, together with a **snapshot of the interaction that produced it**, for the Nurama team to review. **What gets stored.** The reply being rated, up to ten preceding turns of the conversation, and — when the client supplies them — the page context and pinned Context-column items that were in play at the time. Each captured message is truncated at 4,000 characters. Tell the user before submitting that context from the interaction will be shared with the Nurama team for review. The interaction is **snapshotted, not referenced**: the record captures what the assistant actually said at the time, and remains useful if the chat is later deleted or the topic rewritten. **Authorisation.** The caller must be able to read `chatId` — the same check the chat endpoints apply. A user can only rate a reply in a chat they can already read, so this endpoint cannot be used to capture someone else's conversation by guessing message ids. Failure is `403 forbidden`. This endpoint is **not** subject to the subscription, AI-feature or credit-balance checks that gate AI use: feedback can be submitted even when a workspace's AI add-on has been switched off. A snapshot that cannot be built does not fail the request — the rating is still recorded, with `context.snapshotError: true`. Losing a thumbs-down to a transcript read failure would be the wrong trade. # Polish a draft message in the requested tone. (/docs/reference/api/ai/post-ai-polish) Rewrites the user's draft message according to the requested tone while preserving meaning, intent, and any technical terms. In the Nurama web app this backs the chat composer's "Polish with Nu" button. Returns the rewritten text plus the credits actually billed and the workspace's balance after deduction. Caps: - `text` is capped at 4000 characters (~1000 input tokens). - Output is capped at ~600 tokens server-side. If the workspace has an `aiCustomPreprompt` configured it is prepended as additional system context (workspace-specific guidance to the model). Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /ai/polish Polish a draft message in the requested tone. Rewrites the user's draft message according to the requested tone while preserving meaning, intent, and any technical terms. In the Nurama web app this backs the chat composer's "Polish with Nu" button. Returns the rewritten text plus the credits actually billed and the workspace's balance after deduction. Caps: - `text` is capped at 4000 characters (~1000 input tokens). - Output is capped at ~600 tokens server-side. If the workspace has an `aiCustomPreprompt` configured it is prepended as additional system context (workspace-specific guidance to the model). # Mint a Scratch upload bundle for an image-revision source frame. (/docs/reference/api/ai/post-ai-revisions-source-upload) Returns signed multipart upload URLs the client uses to upload a source image (a captured video frame — always JPEG) directly to storage BEFORE calling `POST /ai/revisions` with `source.scratchId`. The bytes never pass through the API. After uploading the parts, complete the upload via `POST /v1/scratch/{scratchId}/complete-upload`. Same checks as `POST /ai/revisions` minus the balance check (staging is free): `canAiGenerateImageRevision`, an active subscription, the `ai` capability and `aiImageRevisionEnabled`. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /ai/revisions/source-upload Mint a Scratch upload bundle for an image-revision source frame. Returns signed multipart upload URLs the client uses to upload a source image (a captured video frame — always JPEG) directly to storage BEFORE calling `POST /ai/revisions` with `source.scratchId`. The bytes never pass through the API. After uploading the parts, complete the upload via `POST /v1/scratch/{scratchId}/complete-upload`. Same checks as `POST /ai/revisions` minus the balance check (staging is free): `canAiGenerateImageRevision`, an active subscription, the `ai` capability and `aiImageRevisionEnabled`. # Generate an AI image revision. (/docs/reference/api/ai/post-ai-revisions) Generate a variation of an existing image (or a captured video frame) guided by a free-text prompt. The result is staged as a temporary Scratch upload — call `POST /scratch/{id}/promote` to turn the chosen revision into a real asset on the destination project (there is no `/ai/revisions/promote` route). `source` must contain exactly one of `url` (public media URL), `scratchId` (an upload created via `POST /ai/revisions/source-upload` — the preferred path for video frames; it must belong to the caller and workspace and still be active), or `dataUrl` (deprecated legacy path for video frames). Requires `canAiGenerateImageRevision` on the workspace, an active subscription, the `ai` capability, the `aiImageRevisionEnabled` workspace/project setting (`aiImageRevisionAllowReviewer` for reviewers) and a worst-case credit pre-check (a flat estimate). Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /ai/revisions Generate an AI image revision. Generate a variation of an existing image (or a captured video frame) guided by a free-text prompt. The result is staged as a temporary Scratch upload — call `POST /scratch/{id}/promote` to turn the chosen revision into a real asset on the destination project (there is no `/ai/revisions/promote` route). `source` must contain exactly one of `url` (public media URL), `scratchId` (an upload created via `POST /ai/revisions/source-upload` — the preferred path for video frames; it must belong to the caller and workspace and still be active), or `dataUrl` (deprecated legacy path for video frames). Requires `canAiGenerateImageRevision` on the workspace, an active subscription, the `ai` capability, the `aiImageRevisionEnabled` workspace/project setting (`aiImageRevisionAllowReviewer` for reviewers) and a worst-case credit pre-check (a flat estimate). # Convert a chat message into one or more board-task drafts. (/docs/reference/api/ai/post-ai-task-generation) Generates a list of `{ subject, description }` task drafts from a chat message. In the Nurama web app this backs the "Generate with Nu" option in a message's create-task menu; the returned `tasks` array seeds the task creator's draft list. **Compound capability requirement.** Unlike Polish, this endpoint requires BOTH the `boards` capability (checked against the project) and the `ai` capability (checked against the workspace); both `workspaceId` and `projectId` must belong to an active subscription. Either capability missing returns `capabilityNotAvailable`. **Context window.** `contextMessages` is the preceding chat thread (oldest first). The server caps at 10 messages and each entry's `content` at 8000 characters; supply the messages immediately before the focal one so the model can resolve pronouns and references. **Permission.** Requires `canAiGenerateTasks` (held by all workspace/project admins and by the creator, reviewer and reviewerAdmin roles). **Pre-prompt.** If the workspace or project has `aiTaskGenerationPreprompt` configured, it is appended to the system prompt as an override block (project value wins per-key). Separate from `aiCustomPreprompt` so admins can tune task style without affecting Polish or Chat output. Caps: - `messageText` is capped at 8000 characters. - `contextMessages` is capped at 10 entries; each entry's `content` is capped at 8000 characters and `authorName` at 100. - At most 10 tasks are returned. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /ai/task-generation Convert a chat message into one or more board-task drafts. Generates a list of `{ subject, description }` task drafts from a chat message. In the Nurama web app this backs the "Generate with Nu" option in a message's create-task menu; the returned `tasks` array seeds the task creator's draft list. **Compound capability requirement.** Unlike Polish, this endpoint requires BOTH the `boards` capability (checked against the project) and the `ai` capability (checked against the workspace); both `workspaceId` and `projectId` must belong to an active subscription. Either capability missing returns `capabilityNotAvailable`. **Context window.** `contextMessages` is the preceding chat thread (oldest first). The server caps at 10 messages and each entry's `content` at 8000 characters; supply the messages immediately before the focal one so the model can resolve pronouns and references. **Permission.** Requires `canAiGenerateTasks` (held by all workspace/project admins and by the creator, reviewer and reviewerAdmin roles). **Pre-prompt.** If the workspace or project has `aiTaskGenerationPreprompt` configured, it is appended to the system prompt as an override block (project value wins per-key). Separate from `aiCustomPreprompt` so admins can tune task style without affecting Polish or Chat output. Caps: - `messageText` is capped at 8000 characters. - `contextMessages` is capped at 10 entries; each entry's `content` is capped at 8000 characters and `authorName` at 100. - At most 10 tasks are returned. # Remove the custom thumbnail from an asset (/docs/reference/api/assets/delete-assets-assetid-custom-thumbnail) Soft-deletes every active `customThumbnailOriginal` and `customThumbnail` file on the asset by setting their status to `inactive`, decrementing the asset's `sizeInBytes` and storage quota by the bytes that were active. Clients should fall back to the auto-generated `thumbnail` files. Broadcasts an `assetFileUpdate` WebSocket event so connected clients can re-render without a refetch. Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /assets/{assetId}/custom-thumbnail Remove the custom thumbnail from an asset Soft-deletes every active `customThumbnailOriginal` and `customThumbnail` file on the asset by setting their status to `inactive`, decrementing the asset's `sizeInBytes` and storage quota by the bytes that were active. Clients should fall back to the auto-generated `thumbnail` files. Broadcasts an `assetFileUpdate` WebSocket event so connected clients can re-render without a refetch. # Mark asset for deletion (/docs/reference/api/assets/delete-assets-assetid) Mark an asset as deleted. Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /assets/{assetId} Mark asset for deletion Mark an asset as deleted. # Get a signed inline-view URL for a document asset (/docs/reference/api/assets/get-assets-assetid-document-url) Returns a short-lived signed URL for rendering a `document` asset inline in the viewer. Serves the processed `media` derivative (an optimised PDF with permission flags stripped), not the original — downloads of the original go through `POST /assets/download`. Requires `canGetAsset`. The asset must be `active`, have `mediaType: 'document'`, and have an active `media` file (i.e. post-processing finished successfully); otherwise a 400 is returned and the document cannot be viewed inline. The `media` PDF is capped at a maximum page count, so `pagesTruncated`, `truncatedFrom` and `originalPageCount` tell the viewer whether and where pages are missing. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /assets/{assetId}/document-url Get a signed inline-view URL for a document asset Returns a short-lived signed URL for rendering a `document` asset inline in the viewer. Serves the processed `media` derivative (an optimised PDF with permission flags stripped), not the original — downloads of the original go through `POST /assets/download`. Requires `canGetAsset`. The asset must be `active`, have `mediaType: 'document'`, and have an active `media` file (i.e. post-processing finished successfully); otherwise a 400 is returned and the document cannot be viewed inline. The `media` PDF is capped at a maximum page count, so `pagesTruncated`, `truncatedFrom` and `originalPageCount` tell the viewer whether and where pages are missing. # Get file from asset (/docs/reference/api/assets/get-assets-assetid-file-fileid) Retrieve a specific file from an asset by asset ID and file ID. Requires `canGetAsset`. Private fields (`bucketName`, `tags`, `postProcessingTasks`) are stripped from the response. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /assets/{assetId}/file/{fileId} Get file from asset Retrieve a specific file from an asset by asset ID and file ID. Requires `canGetAsset`. Private fields (`bucketName`, `tags`, `postProcessingTasks`) are stripped from the response. # Get files by function type (/docs/reference/api/assets/get-assets-assetid-function-type-functiontype) Retrieve all files from an asset filtered by function type. Requires `canGetAsset`. Private fields (`bucketName`, `tags`, `postProcessingTasks`) are stripped from each file. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /assets/{assetId}/function-type/{functionType} Get files by function type Retrieve all files from an asset filtered by function type. Requires `canGetAsset`. Private fields (`bucketName`, `tags`, `postProcessingTasks`) are stripped from each file. # List every location an asset is referenced (/docs/reference/api/assets/get-assets-assetid-references) One asset can be referenced from many places at once — its own folder, the reviewer tree, any submission it was added to, any public release it was shared in. They all point at the same asset, which is why renaming it retitles it everywhere, and why deleting the last reference in its primary file system removes the rest. PRIMARY references are the asset's home file system; SECONDARY are everything else, grouped by collection. Only collections with at least one reference appear in `counts`. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /assets/{assetId}/references List every location an asset is referenced One asset can be referenced from many places at once — its own folder, the reviewer tree, any submission it was added to, any public release it was shared in. They all point at the same asset, which is why renaming it retitles it everywhere, and why deleting the last reference in its primary file system removes the rest. PRIMARY references are the asset's home file system; SECONDARY are everything else, grouped by collection. Only collections with at least one reference appear in `counts`. # Get asset information with optional chat data (/docs/reference/api/assets/get-assets-assetid) Retrieve information for a specific asset by ID. Optionally include chat data by specifying chatVisibility. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /assets/{assetId} Get asset information with optional chat data Retrieve information for a specific asset by ID. Optionally include chat data by specifying chatVisibility. # Get the page an asset would appear on in paginated results. (/docs/reference/api/assets/get-assets-page-assetid) Returns the 1-based page number the asset would appear on when listing assets of the same owner resource and media type with the given sort and page size. Requires `canGetAsset`. The asset must be `active`. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /assets/page/{assetId} Get the page an asset would appear on in paginated results. Returns the 1-based page number the asset would appear on when listing assets of the same owner resource and media type with the given sort and page size. Requires `canGetAsset`. The asset must be `active`. # Finalize the multipart upload of a custom thumbnail (/docs/reference/api/assets/post-assets-assetid-custom-thumbnail-complete-upload) Commits the multipart upload of a custom thumbnail. Background processing then generates the sized `customThumbnail` files and registers them on the asset. Unlike `/v1/assets/complete-upload`, this does not register an original file on the asset and does not trigger media transcoding. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /assets/{assetId}/custom-thumbnail/complete-upload Finalize the multipart upload of a custom thumbnail Commits the multipart upload of a custom thumbnail. Background processing then generates the sized `customThumbnail` files and registers them on the asset. Unlike `/v1/assets/complete-upload`, this does not register an original file on the asset and does not trigger media transcoding. # Mint a signed multipart upload URL for a custom thumbnail (/docs/reference/api/assets/post-assets-assetid-custom-thumbnail-upload-url) Returns a multipart upload URL set for a user-supplied custom thumbnail image. Once the upload is finalized via `POST /assets/{assetId}/custom-thumbnail/complete-upload`, background processing generates the sized `customThumbnail` files and registers them on the asset. Side effect: any prior active `customThumbnailOriginal` / `customThumbnail` files on the asset are set to `inactive` before the URL is issued so the new upload replaces them cleanly. If the upload is abandoned, the asset's auto-generated `thumbnail` files remain and should be displayed instead. Custom thumbnails are only supported for `video` and `audio` assets. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /assets/{assetId}/custom-thumbnail/upload-url Mint a signed multipart upload URL for a custom thumbnail Returns a multipart upload URL set for a user-supplied custom thumbnail image. Once the upload is finalized via `POST /assets/{assetId}/custom-thumbnail/complete-upload`, background processing generates the sized `customThumbnail` files and registers them on the asset. Side effect: any prior active `customThumbnailOriginal` / `customThumbnail` files on the asset are set to `inactive` before the URL is issued so the new upload replaces them cleanly. If the upload is abandoned, the asset's auto-generated `thumbnail` files remain and should be displayed instead. Custom thumbnails are only supported for `video` and `audio` assets. # Promote a chat-message attachment to a project asset (/docs/reference/api/assets/post-assets-assetid-promote-to-project) Copies a chat-message attachment (an asset with `ownerResourceType: 'chat'` and `functionType: 'attachment'`) into the destination project as a new, fully independent project asset. Deleting either side afterwards has no effect on the other. Permission is `canCreateAsset` on the destination project (`body.projectId`), which excludes reviewers. The source chat must live in the same workspace as the destination project. Idempotent: promoting the same source into the same project again returns the existing promoted asset with `deduped: true`. When post-processing is required the new asset is returned before it is `active`; the usual asset activation notifications fire when processing completes. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /assets/{assetId}/promote-to-project Promote a chat-message attachment to a project asset Copies a chat-message attachment (an asset with `ownerResourceType: 'chat'` and `functionType: 'attachment'`) into the destination project as a new, fully independent project asset. Deleting either side afterwards has no effect on the other. Permission is `canCreateAsset` on the destination project (`body.projectId`), which excludes reviewers. The source chat must live in the same workspace as the destination project. Idempotent: promoting the same source into the same project again returns the existing promoted asset with `deduped: true`. When post-processing is required the new asset is returned before it is `active`; the usual asset activation notifications fire when processing completes. # Complete multipart upload (/docs/reference/api/assets/post-assets-complete-upload) Complete a multipart upload for an asset file. This endpoint finalizes the multipart upload by combining all uploaded parts, registers the original file on the asset (`assetId` is required) and triggers asset completion and media post-processing. **Two-step workflow:** 1. Upload the file parts to the signed URLs returned when the asset was created 2. Call this endpoint with `assetId` to complete the upload and trigger processing Post-processing failures after the upload has been committed do not fail the request — they are reported via the optional `warning` field. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /assets/complete-upload Complete multipart upload Complete a multipart upload for an asset file. This endpoint finalizes the multipart upload by combining all uploaded parts, registers the original file on the asset (`assetId` is required) and triggers asset completion and media post-processing. **Two-step workflow:** 1. Upload the file parts to the signed URLs returned when the asset was created 2. Call this endpoint with `assetId` to complete the upload and trigger processing Post-processing failures after the upload has been committed do not fail the request — they are reported via the optional `warning` field. # Download assets (/docs/reference/api/assets/post-assets-download) Generate download links for the specified assets/files. Requires `canDownloadAssets`. Side effect: a `download` event is recorded in each asset's access activity with the `visibility` given in the request body (defaults to `creator`). Recording the activity never affects the download response. Note: the request body is currently accepted without validation; the limits below reflect the intended contract. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /assets/download Download assets Generate download links for the specified assets/files. Requires `canDownloadAssets`. Side effect: a `download` event is recorded in each asset's access activity with the `visibility` given in the request body (defaults to `creator`). Recording the activity never affects the download response. Note: the request body is currently accepted without validation; the limits below reflect the intended contract. # Bulk regenerate signed upload links for assets in status pendingUpload. (/docs/reference/api/assets/post-assets-repair) Marks every existing file on each asset `pendingDelete` and mints a fresh multipart upload URL set so the client can re-upload the original. Requires `canRepairAssets`. Per-asset failures are reported inline (`status: 'error'`) rather than failing the request. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /assets/repair Bulk regenerate signed upload links for assets in status pendingUpload. Marks every existing file on each asset `pendingDelete` and mints a fresh multipart upload URL set so the client can re-upload the original. Requires `canRepairAssets`. Per-asset failures are reported inline (`status: 'error'`) rather than failing the request. # Add tag to asset (/docs/reference/api/assets/put-assets-assetid-tag) Add a tag to an asset. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /assets/{assetId}/tag Add tag to asset Add a tag to an asset. # Remove tag from asset (/docs/reference/api/assets/put-assets-assetid-untag) Remove a tag from an asset. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /assets/{assetId}/untag Remove tag from asset Remove a tag from an asset. # Update asset (/docs/reference/api/assets/put-assets-assetid) Modify an existing asset (name, meta, sizeInBytes, status). Requires `canUpdateAsset`. `status` cannot be set to `pendingDelete` here — deletion goes through `DELETE /assets/{assetId}`. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /assets/{assetId} Update asset Modify an existing asset (name, meta, sizeInBytes, status). Requires `canUpdateAsset`. `status` cannot be set to `pendingDelete` here — deletion goes through `DELETE /assets/{assetId}`. # Delete a column (/docs/reference/api/board-columns/delete-boards-boardid-columns-columnid) Deletes a column and moves its tasks to `targetColumnId` when given, otherwise to the default column, otherwise to any remaining column. Deleting the last column is rejected (`invalidBoard`). Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /boards/{boardId}/columns/{columnId} Delete a column Deletes a column and moves its tasks to `targetColumnId` when given, otherwise to the default column, otherwise to any remaining column. Deleting the last column is rejected (`invalidBoard`). # Add a column to a board (/docs/reference/api/board-columns/post-boards-boardid-columns) Adds a new column to the board. If sortOrder is not provided, it is placed after the last column. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /boards/{boardId}/columns Add a column to a board Adds a new column to the board. If sortOrder is not provided, it is placed after the last column. # Update a column (/docs/reference/api/board-columns/put-boards-boardid-columns-columnid) Update column name, description, color, isDefault, taskStatus, sortOrder, or reviewersCanContribute. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /boards/{boardId}/columns/{columnId} Update a column Update column name, description, color, isDefault, taskStatus, sortOrder, or reviewersCanContribute. # Reorder columns (/docs/reference/api/board-columns/put-boards-boardid-columns-reorder) Updates the sortOrder of multiple columns at once. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /boards/{boardId}/columns/reorder Reorder columns Updates the sortOrder of multiple columns at once. # Follow a board (/docs/reference/api/board-following/put-boards-boardid-follow) Add the current user to the board's followers list. Idempotent — following again has no effect. Board followers receive email notifications when new tasks are created. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /boards/{boardId}/follow Follow a board Add the current user to the board's followers list. Idempotent — following again has no effect. Board followers receive email notifications when new tasks are created. # Unfollow a board (/docs/reference/api/board-following/put-boards-boardid-unfollow) Remove the current user from the board's followers list. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /boards/{boardId}/unfollow Unfollow a board Remove the current user from the board's followers list. # Remove a task from a board (/docs/reference/api/board-tasks/delete-boards-boardid-tasks-taskid) Unlinks a task from the board by setting boardId and columnId to null. The task itself is not deleted. Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /boards/{boardId}/tasks/{taskId} Remove a task from a board Unlinks a task from the board by setting boardId and columnId to null. The task itself is not deleted. # Get tasks for a board (/docs/reference/api/board-tasks/get-boards-boardid-tasks) Returns all tasks on a board, optionally filtered by column, status, assignee, search, or tags. Tasks are populated with creator, assignedTo, and project. API tokens need the `tasks:read` scope. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /boards/{boardId}/tasks Get tasks for a board Returns all tasks on a board, optionally filtered by column, status, assignee, search, or tags. Tasks are populated with creator, assignedTo, and project. API tokens need the `tasks:read` scope. # Search tasks across all boards in a project (/docs/reference/api/board-tasks/get-boards-project-projectid-tasks) Returns paginated tasks across all boards in a project. Supports search, board/status/assignee/tag filters. By default only tasks that belong to a board are returned; pass `boardId=unassigned` to get the orphaned (no board) tasks instead. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /boards/project/{projectId}/tasks Search tasks across all boards in a project Returns paginated tasks across all boards in a project. Supports search, board/status/assignee/tag filters. By default only tasks that belong to a board are returned; pass `boardId=unassigned` to get the orphaned (no board) tasks instead. # Add an existing task to a board (/docs/reference/api/board-tasks/post-boards-boardid-tasks-add) Links an existing project task to a board column. If the task does not have a taskNumber, one is assigned. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /boards/{boardId}/tasks/add Add an existing task to a board Links an existing project task to a board column. If the task does not have a taskNumber, one is assigned. # Create a task on a board (/docs/reference/api/board-tasks/post-boards-boardid-tasks) Creates a new task and places it on the board. If no columnId is specified, the task is placed in the default column. Auto-assigns an incrementing taskNumber. API tokens need the `tasks:write` scope. Reviewers can only create tasks in columns flagged `reviewersCanContribute` (403 `reviewerCannotContributeHere`); an assignee who cannot see the board's visibility is rejected (400 `invalidAssignee`). When `announce` is provided, an assistant reply carrying the new task is posted in `announce.chatId` as a reply to `announce.messageId`; announce failures never fail the request. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /boards/{boardId}/tasks Create a task on a board Creates a new task and places it on the board. If no columnId is specified, the task is placed in the default column. Auto-assigns an incrementing taskNumber. API tokens need the `tasks:write` scope. Reviewers can only create tasks in columns flagged `reviewersCanContribute` (403 `reviewerCannotContributeHere`); an assignee who cannot see the board's visibility is rejected (400 `invalidAssignee`). When `announce` is provided, an assistant reply carrying the new task is posted in `announce.chatId` as a reply to `announce.messageId`; announce failures never fail the request. # Move a task to a different column (or board) (/docs/reference/api/board-tasks/put-boards-boardid-tasks-taskid-move) Moves a task to a new column and optionally sets its position. Pass `targetBoardId` to move the task onto another board in the same project; `columnId` then defaults to the target board's default column and the caller must also hold `canMove*BoardTask` for the target board's visibility (403 otherwise). Without `targetBoardId`, `columnId` is required. If the destination column has a `taskStatus`, the task's `status` is set to that value; otherwise the status is left unchanged. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /boards/{boardId}/tasks/{taskId}/move Move a task to a different column (or board) Moves a task to a new column and optionally sets its position. Pass `targetBoardId` to move the task onto another board in the same project; `columnId` then defaults to the target board's default column and the caller must also hold `canMove*BoardTask` for the target board's visibility (403 otherwise). Without `targetBoardId`, `columnId` is required. If the destination column has a `taskStatus`, the task's `status` is set to that value; otherwise the status is left unchanged. # Delete a board (/docs/reference/api/boards/delete-boards-boardid) Deletes a board and its columns. The optional body controls what happens to tasks on the board: - `unassign` (default) — set `boardId` and `columnId` to null on each task. Tasks are kept. - `delete` — delete every task on the board, plus its TaskRelation, TaskLink, and TaskEvent rows. - `reassign` — move tasks to `targetBoardId` / `targetColumnId` (defaults to the target's default column). If the target column has a `taskStatus`, the task's `status` is updated to match. For `reassign`, the caller must also have Update access on the target board's tasks (`targetBoardRequired` when `targetBoardId` is missing, `targetBoardSameAsSource` when it equals the board being deleted). Requires `canDelete{Creator|Reviewer}Board`. Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /boards/{boardId} Delete a board Deletes a board and its columns. The optional body controls what happens to tasks on the board: - `unassign` (default) — set `boardId` and `columnId` to null on each task. Tasks are kept. - `delete` — delete every task on the board, plus its TaskRelation, TaskLink, and TaskEvent rows. - `reassign` — move tasks to `targetBoardId` / `targetColumnId` (defaults to the target's default column). If the target column has a `taskStatus`, the task's `status` is updated to match. For `reassign`, the caller must also have Update access on the target board's tasks (`targetBoardRequired` when `targetBoardId` is missing, `targetBoardSameAsSource` when it equals the board being deleted). Requires `canDelete{Creator|Reviewer}Board`. # Get a board with columns and tasks (/docs/reference/api/boards/get-boards-boardid) Returns a board with all its columns and tasks grouped by column. Tasks are populated with creator, assignedTo, and project. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /boards/{boardId} Get a board with columns and tasks Returns a board with all its columns and tasks grouped by column. Tasks are populated with creator, assignedTo, and project. # Get boards for a project (/docs/reference/api/boards/get-boards-project-projectid) Returns all active boards for a project, filtered by the user's visibility role. Each board includes its columns. Optional search and tags filters. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /boards/project/{projectId} Get boards for a project Returns all active boards for a project, filtered by the user's visibility role. Each board includes its columns. Optional search and tags filters. # Create a new board (/docs/reference/api/boards/post-boards) Creates a new kanban board for a project with default or custom columns. Default columns are Backlog, To Do, In Progress, In Review, and Done. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /boards Create a new board Creates a new kanban board for a project with default or custom columns. Default columns are Backlog, To Do, In Progress, In Review, and Done. # Tag a board (/docs/reference/api/boards/put-boards-boardid-tag) Add a project tag to a board. Idempotent — tagging again has no effect. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /boards/{boardId}/tag Tag a board Add a project tag to a board. Idempotent — tagging again has no effect. # Untag a board (/docs/reference/api/boards/put-boards-boardid-untag) Remove a project tag from a board. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /boards/{boardId}/untag Untag a board Remove a project tag from a board. # Update a board (/docs/reference/api/boards/put-boards-boardid) Update board name, description, visibility, status, or sort order. Requires `canUpdate{Creator|Reviewer}Board` for the board's visibility. Narrowing `visibility` when tasks, assignees or task relations depend on the removed tier returns 409 `boardVisibilityChangeBlocked`. Re-issue the request with `cascade: true` to apply the cleanup automatically (re-stamp tasks, unassign blocked assignees, delete blocked relations); the applied cleanup is reported in the response's `cascade` field. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /boards/{boardId} Update a board Update board name, description, visibility, status, or sort order. Requires `canUpdate{Creator|Reviewer}Board` for the board's visibility. Narrowing `visibility` when tasks, assignees or task relations depend on the removed tier returns 409 `boardVisibilityChangeBlocked`. Re-issue the request with `cascade: true` to apply the cleanup automatically (re-stamp tasks, unassign blocked assignees, delete blocked relations); the applied cleanup is reported in the response's `cascade` field. # Remove the bot from a project (/docs/reference/api/bots/delete-workspaces-workspaceid-bots-botid-memberships-project-projectid) Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /workspaces/{workspaceId}/bots/{botId}/memberships/project/{projectId} Remove the bot from a project # Delete a bot user (/docs/reference/api/bots/delete-workspaces-workspaceid-bots-botid) Revokes all API keys for the bot, removes the workspace membership, and marks the user `inactive`. Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /workspaces/{workspaceId}/bots/{botId} Delete a bot user Revokes all API keys for the bot, removes the workspace membership, and marks the user `inactive`. # List the bot's project memberships (/docs/reference/api/bots/get-workspaces-workspaceid-bots-botid-memberships) Project memberships of the bot, limited to projects that belong to this workspace. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /workspaces/{workspaceId}/bots/{botId}/memberships List the bot's project memberships Project memberships of the bot, limited to projects that belong to this workspace. # Get a single bot user (/docs/reference/api/bots/get-workspaces-workspaceid-bots-botid) Returns bot profile, workspace roles, and API key metadata (no secrets). Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /workspaces/{workspaceId}/bots/{botId} Get a single bot user Returns bot profile, workspace roles, and API key metadata (no secrets). # List bot users in a workspace (/docs/reference/api/bots/get-workspaces-workspaceid-bots) Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /workspaces/{workspaceId}/bots List bot users in a workspace # Set the bot's avatar (/docs/reference/api/bots/post-workspaces-workspaceid-bots-botid-avatar) Creates an avatar asset for the bot and returns signed multipart upload URLs; the caller then uploads the image bytes directly to those URLs. The returned `user` carries the new (still `pendingUpload`) avatar asset so the client can render it optimistically; the processed thumbnail arrives via the `userAvatarUpdate` WebSocket event. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /workspaces/{workspaceId}/bots/{botId}/avatar Set the bot's avatar Creates an avatar asset for the bot and returns signed multipart upload URLs; the caller then uploads the image bytes directly to those URLs. The returned `user` carries the new (still `pendingUpload`) avatar asset so the client can render it optimistically; the processed thumbnail arrives via the `userAvatarUpdate` WebSocket event. # Rotate the bot's API key (/docs/reference/api/bots/post-workspaces-workspaceid-bots-botid-rotate-key) Revokes the bot's current active API key and issues a new one. The new raw key is returned once. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /workspaces/{workspaceId}/bots/{botId}/rotate-key Rotate the bot's API key Revokes the bot's current active API key and issues a new one. The new raw key is returned once. # Create a bot user in a workspace (/docs/reference/api/bots/post-workspaces-workspaceid-bots) Creates a bot user, assigns workspace membership with the supplied roles, and issues a single API key. The raw key is returned **once** in the response and is never retrievable again — store it immediately. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /workspaces/{workspaceId}/bots Create a bot user in a workspace Creates a bot user, assigns workspace membership with the supplied roles, and issues a single API key. The raw key is returned **once** in the response and is never retrievable again — store it immediately. # Add the bot to a project or replace its project roles (/docs/reference/api/bots/put-workspaces-workspaceid-bots-botid-memberships-project-projectid) Upserts the bot's membership on the project. If a membership already exists its role list is replaced. `projectOwner` and `reviewerAdmin` cannot be granted to bots. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /workspaces/{workspaceId}/bots/{botId}/memberships/project/{projectId} Add the bot to a project or replace its project roles Upserts the bot's membership on the project. If a membership already exists its role list is replaced. `projectOwner` and `reviewerAdmin` cannot be granted to bots. # Update a bot user (/docs/reference/api/bots/put-workspaces-workspaceid-bots-botid) Update the bot's display name and/or color. At least one field must be supplied. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /workspaces/{workspaceId}/bots/{botId} Update a bot user Update the bot's display name and/or color. At least one field must be supplied. # Mark chat for deletion. Only chat creators may delete a chat. (/docs/reference/api/chats/delete-chats-chatid) Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /chats/{chatId} Mark chat for deletion. Only chat creators may delete a chat. # Mark member chat for deletion. From the user's perspective the chat will have been deleted. Only chat creators may delete a chat. (/docs/reference/api/chats/delete-chats-member-chatid) Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /chats/member/{chatId} Mark member chat for deletion. From the user's perspective the chat will have been deleted. Only chat creators may delete a chat. # Delete an array of members from a member chat by user ID. (/docs/reference/api/chats/delete-chats-member-members-chatid) Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /chats/member/members/{chatId} Delete an array of members from a member chat by user ID. # Remove an attachment from a message (/docs/reference/api/chats/delete-chats-message-messageid-attachment-assetid) Removes the asset from the message's attachments and marks the asset for deletion. If the message has no content and no attachments left afterwards, the message itself is marked for deletion and the deleted message is returned. Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /chats/message/{messageId}/attachment/{assetId} Remove an attachment from a message Removes the asset from the message's attachments and marks the asset for deletion. If the message has no content and no attachments left afterwards, the message itself is marked for deletion and the deleted message is returned. # Remove a user's reaction from a chat message (/docs/reference/api/chats/delete-chats-message-messageid-reaction) Removes the authenticated user's reaction from the specified chat message. Only the user who created the reaction can remove it. Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /chats/message/{messageId}/reaction Remove a user's reaction from a chat message Removes the authenticated user's reaction from the specified chat message. Only the user who created the reaction can remove it. # Delete a message (/docs/reference/api/chats/delete-chats-message-messageid) Marks the message for deletion. It is removed later by the cleanup service. Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /chats/message/{messageId} Delete a message Marks the message for deletion. It is removed later by the cleanup service. # Get mentionable assets for a chat with pagination (/docs/reference/api/chats/get-chats-chatid-mentionable-assets) Returns a paginated list of assets that can be mentioned in the specified chat. The assets returned depend on the chat type: - **Topic chat about a project**: Returns assets from that project with matching visibility - **Topic chat about an asset**: Returns assets from the asset's owner project with matching visibility - **Member chat with project scope**: Returns all assets from that project (all visibilities) - **Submission chat**: Returns all assets from the project (all visibilities) - **AI chat (Nu Chat)**: Returns assets from the topic's project, filtered to the **caller's own** visibility tiers. A workspace- or social-scoped topic has no project to resolve against and returns an empty array. Unlike every other chat type above, an AI chat has no meaningful visibility of its own to inherit — its backing `Chat` row is created with a fixed `creator` placeholder, identical for every user — so tiers are derived from the caller's inherited permissions instead. Owning the topic is not on its own evidence of creator-tier access to the project. - **Member chat with workspace/social scope**: Returns empty array (no assets are mentionable) Only active assets are returned. Supports both cursor-based and index-based pagination, plus name filtering. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /chats/{chatId}/mentionable/assets Get mentionable assets for a chat with pagination Returns a paginated list of assets that can be mentioned in the specified chat. The assets returned depend on the chat type: - **Topic chat about a project**: Returns assets from that project with matching visibility - **Topic chat about an asset**: Returns assets from the asset's owner project with matching visibility - **Member chat with project scope**: Returns all assets from that project (all visibilities) - **Submission chat**: Returns all assets from the project (all visibilities) - **AI chat (Nu Chat)**: Returns assets from the topic's project, filtered to the **caller's own** visibility tiers. A workspace- or social-scoped topic has no project to resolve against and returns an empty array. Unlike every other chat type above, an AI chat has no meaningful visibility of its own to inherit — its backing `Chat` row is created with a fixed `creator` placeholder, identical for every user — so tiers are derived from the caller's inherited permissions instead. Owning the topic is not on its own evidence of creator-tier access to the project. - **Member chat with workspace/social scope**: Returns empty array (no assets are mentionable) Only active assets are returned. Supports both cursor-based and index-based pagination, plus name filtering. # Get mentionable folders for a chat with pagination (/docs/reference/api/chats/get-chats-chatid-mentionable-folders) Returns a paginated list of folders that can be mentioned in the specified chat. The folders returned depend on the chat type: - **Topic chat about a project**: Returns folders from that project with matching visibility - **Topic chat about an asset**: Returns folders from the asset's owner project with matching visibility - **Member chat with project scope**: Returns all folders from that project (all visibilities) - **Submission chat**: Returns reviewer-visibility folders from the project - **AI chat (Nu Chat)**: Returns folders from the topic's project, filtered to the **caller's own** visibility tiers. A workspace- or social-scoped topic has no project to resolve against and returns an empty array. Unlike every other chat type above, an AI chat has no meaningful visibility of its own to inherit — its backing `Chat` row is created with a fixed `creator` placeholder, identical for every user — so tiers are derived from the caller's inherited permissions instead. Owning the topic is not on its own evidence of creator-tier access to the project. - **Member chat with workspace/social scope**: Returns empty array (no folders are mentionable) Only active folders are returned. Supports both cursor-based and index-based pagination, plus name filtering. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /chats/{chatId}/mentionable/folders Get mentionable folders for a chat with pagination Returns a paginated list of folders that can be mentioned in the specified chat. The folders returned depend on the chat type: - **Topic chat about a project**: Returns folders from that project with matching visibility - **Topic chat about an asset**: Returns folders from the asset's owner project with matching visibility - **Member chat with project scope**: Returns all folders from that project (all visibilities) - **Submission chat**: Returns reviewer-visibility folders from the project - **AI chat (Nu Chat)**: Returns folders from the topic's project, filtered to the **caller's own** visibility tiers. A workspace- or social-scoped topic has no project to resolve against and returns an empty array. Unlike every other chat type above, an AI chat has no meaningful visibility of its own to inherit — its backing `Chat` row is created with a fixed `creator` placeholder, identical for every user — so tiers are derived from the caller's inherited permissions instead. Owning the topic is not on its own evidence of creator-tier access to the project. - **Member chat with workspace/social scope**: Returns empty array (no folders are mentionable) Only active folders are returned. Supports both cursor-based and index-based pagination, plus name filtering. # Get mentionable public releases for a chat (/docs/reference/api/chats/get-chats-chatid-mentionable-publics) Returns a paginated list of active public releases (share links) owned by the chat's project that can be mentioned with `{{publicMention:token}}` tokens. The project is resolved from the chat the same way as for mentionable submissions. Chats without a project scope return an empty page. Index pagination only. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /chats/{chatId}/mentionable/publics Get mentionable public releases for a chat Returns a paginated list of active public releases (share links) owned by the chat's project that can be mentioned with `{{publicMention:token}}` tokens. The project is resolved from the chat the same way as for mentionable submissions. Chats without a project scope return an empty page. Index pagination only. # Get mentionable submissions for a chat (/docs/reference/api/chats/get-chats-chatid-mentionable-submissions) Returns a paginated list of active submissions in the chat's project that can be mentioned with `{{submissionMention:submissionId}}` tokens. The project is resolved from the chat (project/asset/task topic chats, project-scoped member chats, submission chats and project-scoped AI chats). Chats without a project scope return an empty page. Index pagination only. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /chats/{chatId}/mentionable/submissions Get mentionable submissions for a chat Returns a paginated list of active submissions in the chat's project that can be mentioned with `{{submissionMention:submissionId}}` tokens. The project is resolved from the chat (project/asset/task topic chats, project-scoped member chats, submission chats and project-scoped AI chats). Chats without a project scope return an empty page. Index pagination only. # Get mentionable board tasks for a chat with pagination (/docs/reference/api/chats/get-chats-chatid-mentionable-tasks) Returns a paginated list of board tasks that can be mentioned in the specified chat. Requires the workspace to have the `boards` capability. Scope/visibility rules: - **Topic chat about a project**: Tasks in that project on boards whose `visibility` array includes the chat's visibility. - **Topic chat about an asset**: Tasks in the asset's owner project on boards whose `visibility` array includes the chat's visibility. - **Topic chat about a task**: Sibling tasks in the parent task's project on boards whose `visibility` array includes the chat's visibility. - **Member chat with project scope**: All board tasks in that project (no visibility filter — mirrors asset/folder mention behaviour for this chat type). - **Submission chat**: Tasks in the submission's project on boards whose `visibility` array includes `'reviewer'`. - **Member chat with workspace/social scope**: Empty result — no tasks are mentionable. Legacy mention-only tasks (`boardId === null`) are never returned. The `nameSearch` query is OR-matched across `subject` substring, exact `taskNumber` (when numeric), and exact `id` (when a UUID). Returns `capabilityNotAvailable` / 403 when the workspace lacks the `boards` capability. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /chats/{chatId}/mentionable/tasks Get mentionable board tasks for a chat with pagination Returns a paginated list of board tasks that can be mentioned in the specified chat. Requires the workspace to have the `boards` capability. Scope/visibility rules: - **Topic chat about a project**: Tasks in that project on boards whose `visibility` array includes the chat's visibility. - **Topic chat about an asset**: Tasks in the asset's owner project on boards whose `visibility` array includes the chat's visibility. - **Topic chat about a task**: Sibling tasks in the parent task's project on boards whose `visibility` array includes the chat's visibility. - **Member chat with project scope**: All board tasks in that project (no visibility filter — mirrors asset/folder mention behaviour for this chat type). - **Submission chat**: Tasks in the submission's project on boards whose `visibility` array includes `'reviewer'`. - **Member chat with workspace/social scope**: Empty result — no tasks are mentionable. Legacy mention-only tasks (`boardId === null`) are never returned. The `nameSearch` query is OR-matched across `subject` substring, exact `taskNumber` (when numeric), and exact `id` (when a UUID). Returns `capabilityNotAvailable` / 403 when the workspace lacks the `boards` capability. # Get messages for a chat (/docs/reference/api/chats/get-chats-chatid-messages) Returns active messages for a chat with recent replies and populated attachments/mentions. API tokens require the `chat:read` scope (`tokenScopeMissing` / 403 otherwise). `createdBefore` / `createdAfter` are only accepted with index pagination. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /chats/{chatId}/messages Get messages for a chat Returns active messages for a chat with recent replies and populated attachments/mentions. API tokens require the `chat:read` scope (`tokenScopeMissing` / 403 otherwise). `createdBefore` / `createdAfter` are only accepted with index pagination. # Get topic chat by id. (/docs/reference/api/chats/get-chats-chatid) Returns a topic chat (project/asset/task/public) without messages. Member chats are served by `GET /chats/member/{chatId}`. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /chats/{chatId} Get topic chat by id. Returns a topic chat (project/asset/task/public) without messages. Member chats are served by `GET /chats/member/{chatId}`. # Get members addable to a NEW member chat, by scope, before the chat exists. (/docs/reference/api/chats/get-chats-member-addable) Populates the create-chat member picker. Unlike the raw membership-list endpoints, this is not admin-gated — any user permitted to create a member chat in the scope (including a plain workspaceChatMember) may call it, and only chat-eligible members are returned. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /chats/member/addable Get members addable to a NEW member chat, by scope, before the chat exists. Populates the create-chat member picker. Unlike the raw membership-list endpoints, this is not admin-gated — any user permitted to create a member chat in the scope (including a plain workspaceChatMember) may call it, and only chat-eligible members are returned. # Get member chat by id. (/docs/reference/api/chats/get-chats-member-chatid) Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /chats/member/{chatId} Get member chat by id. # Get a list of addable members to a member chat based on the chats scope and the users role in that scope. (/docs/reference/api/chats/get-chats-member-members-chatid) Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /chats/member/members/{chatId} Get a list of addable members to a member chat based on the chats scope and the users role in that scope. # Get a paginated list of member chats the user has created or is part of. (/docs/reference/api/chats/get-chats-member) Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /chats/member Get a paginated list of member chats the user has created or is part of. # Get messages where the user was mentioned (/docs/reference/api/chats/get-chats-mentions) Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /chats/mentions Get messages where the user was mentioned # Get replies for a message (/docs/reference/api/chats/get-chats-message-messageid-replies) Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /chats/message/{messageId}/replies Get replies for a message # Get message by ID (/docs/reference/api/chats/get-chats-message-messageid) Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /chats/message/{messageId} Get message by ID # Get chat by Topic ID (/docs/reference/api/chats/get-chats-topic-topicid) Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /chats/topic/{topicId} Get chat by Topic ID # Get every project topic chat the user can access in a workspace (/docs/reference/api/chats/get-chats-workspace-workspaceid-project-chats) Returns the creator/reviewer project topic chats across all projects in the workspace that the caller can read, with the latest message and message count for each. Access is derived per project from the caller's inherited permissions (`canGetCreatorChat` / `canGetReviewerChat`). Requires `canGetWorkspace` on the workspace. Results are ordered by most recent activity. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /chats/workspace/{workspaceId}/project-chats Get every project topic chat the user can access in a workspace Returns the creator/reviewer project topic chats across all projects in the workspace that the caller can read, with the latest message and message count for each. Access is derived per project from the caller's inherited permissions (`canGetCreatorChat` / `canGetReviewerChat`). Requires `canGetWorkspace` on the workspace. Results are ordered by most recent activity. # Create a new message in an asset chat, creating the chat if it doesn't exist (/docs/reference/api/chats/post-chats-asset-assetid-visibility-new-message) Creates a new message in an asset chat. If the chat doesn't exist for the specified visibility, it will be created automatically. Only works with media assets. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /chats/asset/{assetId}/{visibility}/new-message Create a new message in an asset chat, creating the chat if it doesn't exist Creates a new message in an asset chat. If the chat doesn't exist for the specified visibility, it will be created automatically. Only works with media assets. # Create a new message in the specified chat (/docs/reference/api/chats/post-chats-chatid-new-message) Creates a message in any chat type (topic, member, submission, AI, support). Either `content` or at least one attachment must be provided. API tokens require the `chat:write` scope (`tokenScopeMissing` / 403 otherwise). Mentioning users in topic/member/submission chats creates tasks and notifications for them. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /chats/{chatId}/new-message Create a new message in the specified chat Creates a message in any chat type (topic, member, submission, AI, support). Either `content` or at least one attachment must be provided. API tokens require the `chat:write` scope (`tokenScopeMissing` / 403 otherwise). Mentioning users in topic/member/submission chats creates tasks and notifications for them. # Create a new member chat. (/docs/reference/api/chats/post-chats-member) Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /chats/member Create a new member chat. # Attach a file to a message. (/docs/reference/api/chats/post-chats-message-messageid-attachment) Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /chats/message/{messageId}/attachment Attach a file to a message. # Create or update a reaction on a chat message (/docs/reference/api/chats/post-chats-message-messageid-reaction) Creates a new reaction or replaces an existing reaction from the same user on a chat message. Each user can only have one reaction per message. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /chats/message/{messageId}/reaction Create or update a reaction on a chat message Creates a new reaction or replaces an existing reaction from the same user on a chat message. Each user can only have one reaction per message. # Create a new topic chat (/docs/reference/api/chats/post-chats-topic) Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /chats/topic Create a new topic chat # Follow a chat to receive updates (/docs/reference/api/chats/put-chats-chatid-follow) Add the authenticated user to the chat's following list. Users in the following list receive notifications about new messages and updates. Works with all chat types (topic, member, submission). Following a chat multiple times is idempotent. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /chats/{chatId}/follow Follow a chat to receive updates Add the authenticated user to the chat's following list. Users in the following list receive notifications about new messages and updates. Works with all chat types (topic, member, submission). Following a chat multiple times is idempotent. # Unfollow a chat to stop receiving updates (/docs/reference/api/chats/put-chats-chatid-unfollow) Remove the authenticated user from the chat's following list. Users can unfollow a chat even if they no longer have access to it, allowing them to stop receiving notifications. Works with all chat types (topic, member, submission). Unfollowing a chat you're not following is idempotent. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /chats/{chatId}/unfollow Unfollow a chat to stop receiving updates Remove the authenticated user from the chat's following list. Users can unfollow a chat even if they no longer have access to it, allowing them to stop receiving notifications. Works with all chat types (topic, member, submission). Unfollowing a chat you're not following is idempotent. # Update chat subject. (/docs/reference/api/chats/put-chats-chatid) Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /chats/{chatId} Update chat subject. # Archive a member chat for the current user. (/docs/reference/api/chats/put-chats-member-chatid-archive) Adds the current user's ID to the chat's archivedBy array. Per-user archiving does not affect other members' view of the chat. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /chats/member/{chatId}/archive Archive a member chat for the current user. Adds the current user's ID to the chat's archivedBy array. Per-user archiving does not affect other members' view of the chat. # Upload and set member chat icon. (/docs/reference/api/chats/put-chats-member-chatid-icon) Creates an icon asset for the member chat and returns signed upload links for it. Any existing icon is marked for deletion. Requires member-chat management permission (`canManageMemberChat`). Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /chats/member/{chatId}/icon Upload and set member chat icon. Creates an icon asset for the member chat and returns signed upload links for it. Any existing icon is marked for deletion. Requires member-chat management permission (`canManageMemberChat`). # Unarchive a member chat for the current user. (/docs/reference/api/chats/put-chats-member-chatid-unarchive) Removes the current user's ID from the chat's archivedBy array. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /chats/member/{chatId}/unarchive Unarchive a member chat for the current user. Removes the current user's ID from the chat's archivedBy array. # Update member chat subject and/or color. (/docs/reference/api/chats/put-chats-member-chatid) Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /chats/member/{chatId} Update member chat subject and/or color. # Add an array of members to a member chat by user ID. (/docs/reference/api/chats/put-chats-member-members-chatid) Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /chats/member/members/{chatId} Add an array of members to a member chat by user ID. # Highlight a chat message (/docs/reference/api/chats/put-chats-message-messageid-highlight) Sets `highlighted = true` on the message and records the highlighter. For project and asset topic chats a system message is posted in the project chat of the same visibility, a `chatHighlightMessage` notification is sent and project members are emailed. Requires the `canHighlightMessage` permission on the chat. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /chats/message/{messageId}/highlight Highlight a chat message Sets `highlighted = true` on the message and records the highlighter. For project and asset topic chats a system message is posted in the project chat of the same visibility, a `chatHighlightMessage` notification is sent and project members are emailed. Requires the `canHighlightMessage` permission on the chat. # Remove the highlight from a chat message (/docs/reference/api/chats/put-chats-message-messageid-unhighlight) Sets `highlighted = false`, clears the highlighter fields and removes the associated system messages and notification. Requires the `canHighlightMessage` permission on the chat. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /chats/message/{messageId}/unhighlight Remove the highlight from a chat message Sets `highlighted = false`, clears the highlighter fields and removes the associated system messages and notification. Requires the `canHighlightMessage` permission on the chat. # Revise message by ID (/docs/reference/api/chats/put-chats-message-messageid) Revise a message by ID. If annotations are provided, they will replace current annotations not merged. If no annotations are provided, current annotations will be preserved. If an empty array is provided, all annotations will be removed. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /chats/message/{messageId} Revise message by ID Revise a message by ID. If annotations are provided, they will replace current annotations not merged. If no annotations are provided, current annotations will be preserved. If an empty array is provided, all annotations will be removed. # Get current platform configuration. (/docs/reference/api/config/get-config) Returns the current platform configuration: validation limits, approved colours, roles and their permissions, billable roles, supported / restricted file types, supported media types per asset function, and feature flags for convos and link previews. Public — no authentication required. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /config Get current platform configuration. Returns the current platform configuration: validation limits, approved colours, roles and their permissions, billable roles, supported / restricted file types, supported media types per asset function, and feature flags for convos and link previews. Public — no authentication required. # Cancel/delete a convo (/docs/reference/api/convos/delete-convos-convoid) Marks the convo as `cancelled`, clears the chat's active convo and posts a system message. Only the user who started the convo can delete it. Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /convos/{convoId} Cancel/delete a convo Marks the convo as `cancelled`, clears the chat's active convo and posts a system message. Only the user who started the convo can delete it. # Get all convos for a chat (/docs/reference/api/convos/get-chats-chatid-convos) Retrieve all convos (active, completed, or cancelled) for a specific chat. Results are sorted by creation time in descending order (newest first). Optionally filter by status. Requires read access to the chat (`canGetChat`) and an active workspace subscription. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /chats/{chatId}/convos Get all convos for a chat Retrieve all convos (active, completed, or cancelled) for a specific chat. Results are sorted by creation time in descending order (newest first). Optionally filter by status. Requires read access to the chat (`canGetChat`) and an active workspace subscription. # Get convo details (/docs/reference/api/convos/get-convos-convoid) Retrieve a convo with populated participants, starter, chat and scope. A convo that is still marked active but whose Daily.co room has gone is reaped on read and returned as `completed`. Requires read access to the convo's chat. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /convos/{convoId} Get convo details Retrieve a convo with populated participants, starter, chat and scope. A convo that is still marked active but whose Daily.co room has gone is reaped on read and returned as `completed`. Requires read access to the convo's chat. # Get convos for a project scope (paginated) (/docs/reference/api/convos/get-convos-scope-scopeid) Returns convos across all chats in a project, filtered to the requested chat visibilities. The caller must hold the chat-read permission for **every** requested visibility (`canGetCreatorChat` / `canGetReviewerChat`). Active convos are listed first, then newest first. `search` matches participant names and convo type and is applied to the current page after the query. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /convos/scope/{scopeId} Get convos for a project scope (paginated) Returns convos across all chats in a project, filtered to the requested chat visibilities. The caller must hold the chat-read permission for **every** requested visibility (`canGetCreatorChat` / `canGetReviewerChat`). Active convos are listed first, then newest first. `search` matches participant names and convo type and is applied to the current page after the query. # Get all convos for a project (Convos drawer) (/docs/reference/api/convos/get-projects-projectid-convos) Retrieve all convos across all chats within a project. Results are sorted by creation time in descending order (newest first). Optionally filter by visibility (creator/reviewer) and status. This endpoint is used for the "Convos drawer" feature to show all project convos in one place. Requires `canGetProject` and an active workspace subscription. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId}/convos Get all convos for a project (Convos drawer) Retrieve all convos across all chats within a project. Results are sorted by creation time in descending order (newest first). Optionally filter by visibility (creator/reviewer) and status. This endpoint is used for the "Convos drawer" feature to show all project convos in one place. Requires `canGetProject` and an active workspace subscription. # Update a convo's subject and/or notes (/docs/reference/api/convos/patch-convos-convoid) Updates `subject` and/or `notes`. Allowed regardless of convo status so notes can be added after the call ends. Only the user who started the convo can update it. At least one field must be provided. Machine-readable definition: https://docs.nurama.com/openapi.json ## PATCH /convos/{convoId} Update a convo's subject and/or notes Updates `subject` and/or `notes`. Allowed regardless of convo status so notes can be added after the call ends. Only the user who started the convo can update it. At least one field must be provided. # Start a new convo (/docs/reference/api/convos/post-convos) Start a new video or audio convo in a chat. If the chat already has an active convo it is auto-completed before the new one is created. Creates a Daily.co room and posts a system message in the chat. The starter automatically joins as an active participant and receives a meeting token. Gates (in order): convos feature flag (403 `featureDisabled`), active workspace subscription (400 `subscriptionNotActive`), the workspace `convos` capability (403 `capabilityNotAvailable`), a positive credit balance (400 `creditBalanceInsufficient`) and the same chat permission required to post a message in the chat (`canStartConvo`). Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /convos Start a new convo Start a new video or audio convo in a chat. If the chat already has an active convo it is auto-completed before the new one is created. Creates a Daily.co room and posts a system message in the chat. The starter automatically joins as an active participant and receives a meeting token. Gates (in order): convos feature flag (403 `featureDisabled`), active workspace subscription (400 `subscriptionNotActive`), the workspace `convos` capability (403 `capabilityNotAvailable`), a positive credit balance (400 `creditBalanceInsufficient`) and the same chat permission required to post a message in the chat (`canStartConvo`). # Complete a convo (/docs/reference/api/convos/put-convos-convoid-complete) Mark a convo as completed. Only the user who started the convo can complete it. Calculates `durationMinutes`, sets `endedAt` and creates a system message indicating the convo was completed. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /convos/{convoId}/complete Complete a convo Mark a convo as completed. Only the user who started the convo can complete it. Calculates `durationMinutes`, sets `endedAt` and creates a system message indicating the convo was completed. # Join an active convo (/docs/reference/api/convos/put-convos-convoid-join) Join an active convo. User must have access to the chat and the convo must be in active status. Returns a Daily.co meeting token for the user to join the room. User is added to both activeParticipants and allParticipants arrays. **Cross-device handover:** If the user is already an active participant (e.g. joining from a second device), the join still succeeds and returns a new meeting token. A `convoHandover` WebSocket notification is sent to the user's personal channel (`user/{userId}`) so the old device can close its convo window. The user is not duplicated in activeParticipants. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /convos/{convoId}/join Join an active convo Join an active convo. User must have access to the chat and the convo must be in active status. Returns a Daily.co meeting token for the user to join the room. User is added to both activeParticipants and allParticipants arrays. **Cross-device handover:** If the user is already an active participant (e.g. joining from a second device), the join still succeeds and returns a new meeting token. A `convoHandover` WebSocket notification is sent to the user's personal channel (`user/{userId}`) so the old device can close its convo window. The user is not duplicated in activeParticipants. # Leave an active convo (/docs/reference/api/convos/put-convos-convoid-leave) Leave an active convo. User must be an active participant. User is removed from activeParticipants but remains in allParticipants. Creates a system message indicating the user left the convo. If the last active participant leaves, the convo is auto-completed and returned with `status: completed`. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /convos/{convoId}/leave Leave an active convo Leave an active convo. User must be an active participant. User is removed from activeParticipants but remains in allParticipants. Creates a system message indicating the user left the convo. If the last active participant leaves, the convo is auto-completed and returned with `status: completed`. # Rejoin a convo (page refresh / reconnect) (/docs/reference/api/convos/put-convos-convoid-rejoin) Rejoin an active convo after a page refresh or reconnect. Only generates a new Daily.co meeting token if the user is already an active participant. No notifications are sent. This is a silent reconnect. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /convos/{convoId}/rejoin Rejoin a convo (page refresh / reconnect) Rejoin an active convo after a page refresh or reconnect. Only generates a new Daily.co meeting token if the user is already an active participant. No notifications are sent. This is a silent reconnect. # Get assets in a folder (not implemented) (/docs/reference/api/folders/get-folders-folderid-assets) Deprecated placeholder — this route is not implemented. Every request currently fails with `500 unknownError`; if it were reachable it would respond `501 Not Implemented`. Use `GET /projects/{projectId}/files/{visibility}/{path}` to list a folder's contents. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /folders/{folderId}/assets (deprecated) Get assets in a folder (not implemented) Deprecated placeholder — this route is not implemented. Every request currently fails with `500 unknownError`; if it were reachable it would respond `501 Not Implemented`. Use `GET /projects/{projectId}/files/{visibility}/{path}` to list a folder's contents. # Get folder details (/docs/reference/api/folders/get-folders-folderid) Returns a folder by ID. When the folder has an icon, the icon asset is populated on `icon`. Requires `canGetFolder` on the folder and a live subscription on the owning workspace. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /folders/{folderId} Get folder details Returns a folder by ID. When the folder has an icon, the icon asset is populated on `icon`. Requires `canGetFolder` on the folder and a live subscription on the owning workspace. # Update folder icon (/docs/reference/api/folders/put-folders-folderid-icon) Creates an icon asset for the folder and returns multipart upload URLs for it, mirroring the asset upload flow. Any existing icon asset is marked `pendingDelete`. Requires `canUpdateFolder` and a live subscription on the owning workspace. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /folders/{folderId}/icon Update folder icon Creates an icon asset for the folder and returns multipart upload URLs for it, mirroring the asset upload flow. Any existing icon asset is marked `pendingDelete`. Requires `canUpdateFolder` and a live subscription on the owning workspace. # Add a tag to a folder (/docs/reference/api/folders/put-folders-folderid-tag) Adds a project tag to a folder. The tag must belong to the project the folder inherits from, otherwise 404 `tagNotFound`. Requires `canTagFolder` and a live subscription on the owning workspace. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /folders/{folderId}/tag Add a tag to a folder Adds a project tag to a folder. The tag must belong to the project the folder inherits from, otherwise 404 `tagNotFound`. Requires `canTagFolder` and a live subscription on the owning workspace. # Remove a tag from a folder (/docs/reference/api/folders/put-folders-folderid-untag) Removes a tag from a folder. Requires `canUntagFolder` and a live subscription on the owning workspace. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /folders/{folderId}/untag Remove a tag from a folder Removes a tag from a folder. Requires `canUntagFolder` and a live subscription on the owning workspace. # Update folder name or colour (/docs/reference/api/folders/put-folders-folderid) Renames a folder, or updates its colour. The required permission depends on the collection the folder lives in, taken from its `ownerResourceType`: a project-owned folder (the creator and reviewer trees) needs `canUpdateFolder`; one owned by a submission needs `canAddSubmittionItems`; one owned by a public release needs `canUpdatePublicFileSystem`. A creator holds the first but not the latter two, matching the path-scoped routes for those collections. Requires a live subscription on the owning workspace. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /folders/{folderId} Update folder name or colour Renames a folder, or updates its colour. The required permission depends on the collection the folder lives in, taken from its `ownerResourceType`: a project-owned folder (the creator and reviewer trees) needs `canUpdateFolder`; one owned by a submission needs `canAddSubmittionItems`; one owned by a public release needs `canUpdatePublicFileSystem`. A creator holds the first but not the latter two, matching the path-scoped routes for those collections. Requires a live subscription on the owning workspace. # Accept an invitation to join a resource (deprecated alias; use POST) (/docs/reference/api/invites/acceptInvite) Joins the caller to the invited resource with the invite's role(s). Requires `canAcceptInvite` (the invite must be addressed to the caller's email). Existing members receive a member-join push; a billable role also triggers a subscription-update email to the workspace owner. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /invites/accept/{inviteId} (deprecated) Accept an invitation to join a resource (deprecated alias; use POST) Joins the caller to the invited resource with the invite's role(s). Requires `canAcceptInvite` (the invite must be addressed to the caller's email). Existing members receive a member-join push; a billable role also triggers a subscription-update email to the workspace owner. # Cancel invite (/docs/reference/api/invites/cancelInvite) Marks the invite `cancelled`. Requires `canDeleteInvite` on the invite's resource. Returns the cancelled invite record. Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /invites/{inviteId} Cancel invite Marks the invite `cancelled`. Requires `canDeleteInvite` on the invite's resource. Returns the cancelled invite record. # Get invites for a specific resource (/docs/reference/api/invites/get-invites-resource-resourceid) Requires the `canGetInvite` right on the resource; otherwise 403. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /invites/resource/{resourceId} Get invites for a specific resource Requires the `canGetInvite` right on the resource; otherwise 403. # Get specific invite (public) (/docs/reference/api/invites/getInvite) Public route — no authentication. Used by the invite landing page before the invitee has an account. Returns the invite with `inviter`, `invitee` and `resource` populated. An unknown id returns an empty body (the record is simply not found; no 404 is raised). Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /invites/{inviteId} Get specific invite (public) Public route — no authentication. Used by the invite landing page before the invitee has an account. Returns the invite with `inviter`, `invitee` and `resource` populated. An unknown id returns an empty body (the record is simply not found; no 404 is raised). # Get user's invites (/docs/reference/api/invites/getUsersInvites) Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /invites Get user's invites # Invite a user to a resource (/docs/reference/api/invites/inviteUserToResource) Creates an invite and emails the invitee. Requires the right to grant `role` (and every `additionalRoles` entry) on the resource — `canCreateInviteToResource`; otherwise 403. If the invitee already has an account the `inviteCreate` notification is also pushed to their user channel. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /invites Invite a user to a resource Creates an invite and emails the invitee. Requires the right to grant `role` (and every `additionalRoles` entry) on the resource — `canCreateInviteToResource`; otherwise 403. If the invitee already has an account the `inviteCreate` notification is also pushed to their user channel. # Resend an invite email to the invitee. (deprecated alias; use POST) (/docs/reference/api/invites/resendInvite) Re-sends the invitation email and refreshes the invite's expiry. Requires `canResendInvite` on the invite. Responds with an empty 200 body. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /invites/resend/{inviteId} (deprecated) Resend an invite email to the invitee. (deprecated alias; use POST) Re-sends the invitation email and refreshes the invite's expiry. Requires `canResendInvite` on the invite. Responds with an empty 200 body. # Fetch link previews for one or more URLs. (/docs/reference/api/link-preview/post-link-preview) Accepts an array of URLs and returns Open Graph / meta tag preview data for each. Each preview is signed with an HMAC-SHA256 signature that must be included when the preview is submitted with a chat message. Nurama verifies the signature when the message is created, to prevent spoofed preview data. Duplicate URLs are collapsed and URLs that fail validation, fetching or SSRF checks are silently omitted from `previews`, so the array may be shorter than the input. Rate limited to 30 requests per minute per IP. Requires authentication. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /link-preview Fetch link previews for one or more URLs. Accepts an array of URLs and returns Open Graph / meta tag preview data for each. Each preview is signed with an HMAC-SHA256 signature that must be included when the preview is submitted with a chat message. Nurama verifies the signature when the message is created, to prevent spoofed preview data. Duplicate URLs are collapsed and URLs that fail validation, fetching or SSRF checks are silently omitted from `previews`, so the array may be shorter than the input. Rate limited to 30 requests per minute per IP. Requires authentication. # Add role to membership record (/docs/reference/api/membership/addRoleToMembership) Requires `canAddMembershipRole` for the role on the membership's resource. Adding an additive role (e.g. `reviewerBoardManager`) auto-pairs its parent role. A billable role triggers a subscription-update email. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /memberships/add-role Add role to membership record Requires `canAddMembershipRole` for the role on the membership's resource. Adding an additive role (e.g. `reviewerBoardManager`) auto-pairs its parent role. A billable role triggers a subscription-update email. # User may delete their own membership record on a resource unless they are a resource owner. (/docs/reference/api/membership/delete-memberships-leave-resourceid) Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /memberships/leave/{resourceId} User may delete their own membership record on a resource unless they are a resource owner. # Delete membership record (/docs/reference/api/membership/delete-memberships-membershipid) Removes a member from a resource. Requires `canDeleteMember`. Owner records cannot be deleted. Responds with an empty 200 body. Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /memberships/{membershipId} Delete membership record Removes a member from a resource. Requires `canDeleteMember`. Owner records cannot be deleted. Responds with an empty 200 body. # Get mentionable users for a project based on visibility (/docs/reference/api/membership/get-memberships-mentionable-project-projectid-visibility) Requires `canGetProjectMentionableUsers`. Workspace admins of the parent workspace are always included; project roles included depend on `visibility`. Users appearing under several memberships are merged with their roles concatenated. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /memberships/mentionable/project/{projectId}/{visibility} Get mentionable users for a project based on visibility Requires `canGetProjectMentionableUsers`. Workspace admins of the parent workspace are always included; project roles included depend on `visibility`. Users appearing under several memberships are merged with their roles concatenated. # Return membership of a project. Membership retrieved are determined by a user's role in the project. For example, reviewers can only see reviewers. (/docs/reference/api/membership/get-memberships-project-projectid) Returns a paginated, per-user membership report for the project (same shape as the workspace report). Requires `canGetProjectMembership`; the roles visible depend on the caller's inherited permissions in the project. Only one of the name sorts may be used at a time. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /memberships/project/{projectId} Return membership of a project. Membership retrieved are determined by a user's role in the project. For example, reviewers can only see reviewers. Returns a paginated, per-user membership report for the project (same shape as the workspace report). Requires `canGetProjectMembership`; the roles visible depend on the caller's inherited permissions in the project. Only one of the name sorts may be used at a time. # Return membership of a workspace. User must have a workspace admin role to retrieve membership records. (/docs/reference/api/membership/get-memberships-workspace-workspaceid) Returns a paginated, per-user membership report covering the workspace and all of its active projects. Requires the `canGetWorkspaceMembers` right. `isBillable=true` restricts to billable roles. Only one of the name sorts (`firstName`, `lastName`, `displayName`) may be used at a time. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /memberships/workspace/{workspaceId} Return membership of a workspace. User must have a workspace admin role to retrieve membership records. Returns a paginated, per-user membership report covering the workspace and all of its active projects. Requires the `canGetWorkspaceMembers` right. `isBillable=true` restricts to billable roles. Only one of the name sorts (`firstName`, `lastName`, `displayName`) may be used at a time. # Get logged-in user's memberships (/docs/reference/api/membership/getUsersMemberships) Returns every membership record of the caller with `resource` (workspace or project) and public `user` populated. Ordered workspaces first, newest first. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /memberships Get logged-in user's memberships Returns every membership record of the caller with `resource` (workspace or project) and public `user` populated. Ordered workspaces first, newest first. # Get resource-specific last seen timestamps for multiple users in a project (/docs/reference/api/membership/post-memberships-project-projectid-last-seen) Returns last seen data for specified users within a project. Requires `canGetProjectMembership`. Unknown user ids are silently omitted from `results`; known users with no record get a null `lastSeen`. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /memberships/project/{projectId}/last-seen Get resource-specific last seen timestamps for multiple users in a project Returns last seen data for specified users within a project. Requires `canGetProjectMembership`. Unknown user ids are silently omitted from `results`; known users with no record get a null `lastSeen`. # Get resource-specific last seen timestamps for multiple users in a workspace (/docs/reference/api/membership/post-memberships-workspace-workspaceid-last-seen) Returns last seen data for specified users within a workspace. Requires the `canGetWorkspaceMembers` right. Unknown user ids are silently omitted from `results`; known users with no record get a null `lastSeen`. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /memberships/workspace/{workspaceId}/last-seen Get resource-specific last seen timestamps for multiple users in a workspace Returns last seen data for specified users within a workspace. Requires the `canGetWorkspaceMembers` right. Unknown user ids are silently omitted from `results`; known users with no record get a null `lastSeen`. # Remove role from membership record (/docs/reference/api/membership/removeRoleFromMembership) Requires `canRemoveMembershipRole`. Removing a parent role also strips its additive child roles. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /memberships/remove-role Remove role from membership record Requires `canRemoveMembershipRole`. Removing a parent role also strips its additive child roles. # Get bulk count of new notifications for specified channels and types (/docs/reference/api/notifications/post-notifications-count-bulk) Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /notifications/count/bulk Get bulk count of new notifications for specified channels and types # Get count of new notifications for specified channels and types. (/docs/reference/api/notifications/post-notifications-count) Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /notifications/count Get count of new notifications for specified channels and types. # Get user's last seen records for specified channels and types. (/docs/reference/api/notifications/post-notifications-last-seen) Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /notifications/last-seen Get user's last seen records for specified channels and types. # Get new notifications with pagination support (/docs/reference/api/notifications/post-notifications-new) Retrieves new notifications with support for both cursor and index-based pagination, optionally updating last seen records. Note that if a cursor is submitted this is essentially the same as calling the /notifications endpoint. Also, if a cursor is submitted you probably want to set the updateLastSeen to false. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /notifications/new Get new notifications with pagination support Retrieves new notifications with support for both cursor and index-based pagination, optionally updating last seen records. Note that if a cursor is submitted this is essentially the same as calling the /notifications endpoint. Also, if a cursor is submitted you probably want to set the updateLastSeen to false. # Get paginated notifications for specified channels and types (/docs/reference/api/notifications/post-notifications) Retrieves notifications with support for both cursor and index-based pagination Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /notifications Get paginated notifications for specified channels and types Retrieves notifications with support for both cursor and index-based pagination # Update user's last seen records for specified channels and types. (/docs/reference/api/notifications/put-notifications-last-seen) Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /notifications/last-seen Update user's last seen records for specified channels and types. # Delete items at specified paths within a project (deprecated alias; use PUT) (/docs/reference/api/projects/delete-projects-projectid-files-visibility-delete) Paths are relative to `project/{projectId}/{visibility}`. Requires `canDeleteCreatorItems` for `creator` and `canDeleteReviewerItems` for `reviewer`. Use `delete-preview` first to learn which secondary references the cascade will remove. Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /projects/{projectId}/files/{visibility}/delete (deprecated) Delete items at specified paths within a project (deprecated alias; use PUT) Paths are relative to `project/{projectId}/{visibility}`. Requires `canDeleteCreatorItems` for `creator` and `canDeleteReviewerItems` for `reviewer`. Use `delete-preview` first to learn which secondary references the cascade will remove. # Delete a public file system (/docs/reference/api/projects/delete-projects-projectid-public-publicid) Permanently deletes a public file system, its copied file-system entries and its inheritance node, and invalidates its access token. Requires `canDeletePublicFileSystem`; the record must belong to `projectId`. Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /projects/{projectId}/public/{publicId} Delete a public file system Permanently deletes a public file system, its copied file-system entries and its inheritance node, and invalidates its access token. Requires `canDeletePublicFileSystem`; the record must belong to `projectId`. # Mark a project for deletion. (/docs/reference/api/projects/delete-projects-projectid) Requires `canDeleteProject`. Holders are identical to `canUpdateProject` — which is what this route used to check — so no caller's access changed; the right that names the operation is now the one that gates it, so revoking it from a role actually blocks deletion. Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /projects/{projectId} Mark a project for deletion. Requires `canDeleteProject`. Holders are identical to `canUpdateProject` — which is what this route used to check — so no caller's access changed; the right that names the operation is now the one that gates it, so revoking it from a role actually blocks deletion. # Get assets for a project with specified visibility (/docs/reference/api/projects/get-projects-projectid-assets-visibility) Retrieves assets for a project filtered by visibility level, optionally with their chats, with support for both cursor and index-based pagination. Requires `canGetCreatorAssets` for `creator` and `canGetReviewerAssets` for `reviewer`. Cursor-only parameters are rejected with index pagination, and `page`, `createdBefore`, `createdAfter` are rejected with cursor pagination. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId}/assets/{visibility} Get assets for a project with specified visibility Retrieves assets for a project filtered by visibility level, optionally with their chats, with support for both cursor and index-based pagination. Requires `canGetCreatorAssets` for `creator` and `canGetReviewerAssets` for `reviewer`. Cursor-only parameters are rejected with index pagination, and `page`, `createdBefore`, `createdAfter` are rejected with cursor pagination. # Get highlighted messages across the project's creator-visible chats (/docs/reference/api/projects/get-projects-projectid-creator-highlighted-messages) Cursor-paginated list of active chat messages flagged `highlighted` whose scope is this project and whose scope visibility includes `creator`. Each message is populated (author, attachments, etc.) and carries its parent `chat`. Requires `canGetCreatorHighlights`. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId}/creator/highlighted-messages Get highlighted messages across the project's creator-visible chats Cursor-paginated list of active chat messages flagged `highlighted` whose scope is this project and whose scope visibility includes `creator`. Each message is populated (author, attachments, etc.) and carries its parent `chat`. Requires `canGetCreatorHighlights`. # Get project feed with assets and chats (/docs/reference/api/projects/get-projects-projectid-feed-visibility) Retrieves a paginated feed of assets and their associated chats for a project. Requires `canGetCreatorAssets` for `creator` and `canGetReviewerAssets` for `reviewer`. Index pagination is the default; pass `paginate=cursor` for cursor pagination. Cursor-only parameters (`cursor`, `paginateReverse`, `includeCounts`, `includeCursorRecord`, `startAt`, `includeStartAtRecord`) are rejected with index pagination, and `page`, `createdBefore`, `createdAfter` are rejected with cursor pagination. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId}/feed/{visibility} Get project feed with assets and chats Retrieves a paginated feed of assets and their associated chats for a project. Requires `canGetCreatorAssets` for `creator` and `canGetReviewerAssets` for `reviewer`. Index pagination is the default; pass `paginate=cursor` for cursor pagination. Cursor-only parameters (`cursor`, `paginateReverse`, `includeCounts`, `includeCursorRecord`, `startAt`, `includeStartAtRecord`) are rejected with index pagination, and `page`, `createdBefore`, `createdAfter` are rejected with cursor pagination. # Get items at a specific path within a project (/docs/reference/api/projects/get-projects-projectid-files-visibility-path) Same as the root listing, scoped to a folder path. Path segments may be folder slugs or IDs (IDs are resolved to slugs; an unknown segment returns `fileSystemPathNotFound`, 404). Virtual paths are supported: `Public` and `Submission` list one synthesized sub-folder per release / submission the caller may read (`canGetPublicFileSystem` / `canGetSubmission`), and `Public/{token}/...`, `Submission/{id}/...` and `Review/...` are translated to the underlying tree. Requires `canGetCreatorItems` for `creator` and `canGetReviewerItems` for `reviewer`. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId}/files/{visibility}/{path} Get items at a specific path within a project Same as the root listing, scoped to a folder path. Path segments may be folder slugs or IDs (IDs are resolved to slugs; an unknown segment returns `fileSystemPathNotFound`, 404). Virtual paths are supported: `Public` and `Submission` list one synthesized sub-folder per release / submission the caller may read (`canGetPublicFileSystem` / `canGetSubmission`), and `Public/{token}/...`, `Submission/{id}/...` and `Review/...` are translated to the underlying tree. Requires `canGetCreatorItems` for `creator` and `canGetReviewerItems` for `reviewer`. # Get items at the root path of a project (/docs/reference/api/projects/get-projects-projectid-files-visibility) Lists the items directly under `project/{projectId}/{visibility}`. Requires `canGetCreatorItems` for `creator` and `canGetReviewerItems` for `reviewer`. On the first page of an unfiltered listing the synthesized virtual roots (`Review`, `Public`, `Submission`) the caller may read are prepended to `results`. Index pagination is the default; pass `paginate=cursor` for cursor pagination (cursor-only parameters are rejected with index pagination and `page` is rejected with cursor pagination). `resourceIds` and `resourceSlugs` may not both be set (`invalidItemSearchParams`, 400). Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId}/files/{visibility} Get items at the root path of a project Lists the items directly under `project/{projectId}/{visibility}`. Requires `canGetCreatorItems` for `creator` and `canGetReviewerItems` for `reviewer`. On the first page of an unfiltered listing the synthesized virtual roots (`Review`, `Public`, `Submission`) the caller may read are prepended to `results`. Index pagination is the default; pass `paginate=cursor` for cursor pagination (cursor-only parameters are rejected with index pagination and `page` is rejected with cursor pagination). `resourceIds` and `resourceSlugs` may not both be set (`invalidItemSearchParams`, 400). # Get the public audit report for a project (/docs/reference/api/projects/get-projects-projectid-public-audit) Returns a paginated list of project assets that are or have been publicly exposed — either via a `PublicAssetLink` (direct download link) or via membership in a `Public` file system. Requires `canGetPublicAudit` (project/workspace owners and admins). Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId}/public-audit Get the public audit report for a project Returns a paginated list of project assets that are or have been publicly exposed — either via a `PublicAssetLink` (direct download link) or via membership in a `Public` file system. Requires `canGetPublicAudit` (project/workspace owners and admins). # Get public file system details (/docs/reference/api/projects/get-projects-projectid-public-publicid) Retrieves detailed information about a specific public file system by its ID. Requires `canGetPublicFileSystem`. The record must belong to `projectId`; a foreign or unknown id returns `publicFileSystemNotFound` (404). Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId}/public/{publicId} Get public file system details Retrieves detailed information about a specific public file system by its ID. Requires `canGetPublicFileSystem`. The record must belong to `projectId`; a foreign or unknown id returns `publicFileSystemNotFound` (404). # Get public asset with chat (authenticated management) (/docs/reference/api/projects/get-projects-projectid-public-token-assets-assetid) Retrieves an asset along with its public chat in the context of this public file system. The chat is returned in `chats.public` and will be null if no chat has been created yet. Unlike the unauthenticated `/public/{token}/assets/{assetId}` endpoint, this does NOT check token expiration. Requires `canGetPublicFileSystem` permission. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId}/public/{token}/assets/{assetId} Get public asset with chat (authenticated management) Retrieves an asset along with its public chat in the context of this public file system. The chat is returned in `chats.public` and will be null if no chat has been created yet. Unlike the unauthenticated `/public/{token}/assets/{assetId}` endpoint, this does NOT check token expiration. Requires `canGetPublicFileSystem` permission. # Get public chat messages (authenticated management) (/docs/reference/api/projects/get-projects-projectid-public-token-chat-chatid-messages) Retrieves paginated messages for a public chat (the release's main topic chat or one of its asset chats). Unlike the unauthenticated `/public/{token}/chat/{chatId}/messages` endpoint, this does NOT check token expiration. Requires `canGetPublicFileSystem` permission. A chat that does not belong to this release returns 403. Results are always cursor-paginated; `paginate=index` and `page` are accepted but have no effect. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId}/public/{token}/chat/{chatId}/messages Get public chat messages (authenticated management) Retrieves paginated messages for a public chat (the release's main topic chat or one of its asset chats). Unlike the unauthenticated `/public/{token}/chat/{chatId}/messages` endpoint, this does NOT check token expiration. Requires `canGetPublicFileSystem` permission. A chat that does not belong to this release returns 403. Results are always cursor-paginated; `paginate=index` and `page` are accepted but have no effect. # Get main public chat (authenticated management) (/docs/reference/api/projects/get-projects-projectid-public-token-chat) Retrieves the main topic chat for a public file system. Returns null if no main chat has been created yet (lazy creation pattern). Unlike the unauthenticated `/public/{token}/chat` endpoint, this does NOT check token expiration. Requires `canGetPublicFileSystem` permission. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId}/public/{token}/chat Get main public chat (authenticated management) Retrieves the main topic chat for a public file system. Returns null if no main chat has been created yet (lazy creation pattern). Unlike the unauthenticated `/public/{token}/chat` endpoint, this does NOT check token expiration. Requires `canGetPublicFileSystem` permission. # Get items at a path within a public file system (authenticated management) (/docs/reference/api/projects/get-projects-projectid-public-token-files-path) Same as the root listing, scoped to a folder path inside the release. Path segments may be folder slugs or IDs (IDs are resolved to slugs; an unknown segment returns `fileSystemPathNotFound`, 404). Requires `canGetPublicFileSystem`; does NOT check token expiration. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId}/public/{token}/files/{path} Get items at a path within a public file system (authenticated management) Same as the root listing, scoped to a folder path inside the release. Path segments may be folder slugs or IDs (IDs are resolved to slugs; an unknown segment returns `fileSystemPathNotFound`, 404). Requires `canGetPublicFileSystem`; does NOT check token expiration. # Get items at the root of a public file system (authenticated management) (/docs/reference/api/projects/get-projects-projectid-public-token-files) Lists the items directly under `public/{publicId}` for the release identified by `token`. This is the authenticated management view: unlike the unauthenticated `/public/{token}/files` endpoint it does NOT check token expiration or status, and it never populates chats. Requires `canGetPublicFileSystem`. The token must belong to `projectId`; otherwise `resourceNotFound` (400). Index pagination is the default; pass `paginate=cursor` for cursor pagination (cursor-only parameters are rejected with index pagination and `page` is rejected with cursor pagination). Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId}/public/{token}/files Get items at the root of a public file system (authenticated management) Lists the items directly under `public/{publicId}` for the release identified by `token`. This is the authenticated management view: unlike the unauthenticated `/public/{token}/files` endpoint it does NOT check token expiration or status, and it never populates chats. Requires `canGetPublicFileSystem`. The token must belong to `projectId`; otherwise `resourceNotFound` (400). Index pagination is the default; pass `paginate=cursor` for cursor pagination (cursor-only parameters are rejected with index pagination and `page` is rejected with cursor pagination). # Get public file systems for a project (/docs/reference/api/projects/get-projects-projectid-public) Retrieves a paginated list of public file systems for a project with support for search, filtering, and both cursor and index-based pagination. Requires `canGetPublicFileSystem`. Cursor-only parameters are rejected with index pagination and `page` is rejected with cursor pagination. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId}/public Get public file systems for a project Retrieves a paginated list of public file systems for a project with support for search, filtering, and both cursor and index-based pagination. Requires `canGetPublicFileSystem`. Cursor-only parameters are rejected with index pagination and `page` is rejected with cursor pagination. # Get highlighted messages across the project's reviewer-visible chats (/docs/reference/api/projects/get-projects-projectid-reviewer-highlighted-messages) Cursor-paginated list of active chat messages flagged `highlighted` whose scope is this project and whose scope visibility includes `reviewer`. Each message is populated (author, attachments, etc.) and carries its parent `chat`. Requires `canGetReviewerHighlights`. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId}/reviewer/highlighted-messages Get highlighted messages across the project's reviewer-visible chats Cursor-paginated list of active chat messages flagged `highlighted` whose scope is this project and whose scope visibility includes `reviewer`. Each message is populated (author, attachments, etc.) and carries its parent `chat`. Requires `canGetReviewerHighlights`. # Get file system items at a path within a submission (/docs/reference/api/projects/get-projects-projectid-submission-submissionid-files-path) Same as the root listing, scoped to a folder path inside the submission. Path segments may be folder slugs or IDs (IDs are resolved to slugs; an unknown segment returns `fileSystemPathNotFound`, 404). Requires `canGetSubmission`; the submission must belong to `projectId`. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId}/submission/{submissionId}/files/{path} Get file system items at a path within a submission Same as the root listing, scoped to a folder path inside the submission. Path segments may be folder slugs or IDs (IDs are resolved to slugs; an unknown segment returns `fileSystemPathNotFound`, 404). Requires `canGetSubmission`; the submission must belong to `projectId`. # Get file system items at the root of a submission (/docs/reference/api/projects/get-projects-projectid-submission-submissionid-files) Lists the items directly under `submission/{submissionId}`. Requires `canGetSubmission`; the submission must belong to `projectId`. Each item carries its populated `resource` and, for assets, the reviewer chat. Index pagination is the default; pass `paginate=cursor` for cursor pagination (cursor-only parameters are rejected with index pagination and `page` is rejected with cursor pagination). `resourceIds` and `resourceSlugs` may not both be set (`invalidItemSearchParams`, 400). Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId}/submission/{submissionId}/files Get file system items at the root of a submission Lists the items directly under `submission/{submissionId}`. Requires `canGetSubmission`; the submission must belong to `projectId`. Each item carries its populated `resource` and, for assets, the reviewer chat. Index pagination is the default; pass `paginate=cursor` for cursor pagination (cursor-only parameters are rejected with index pagination and `page` is rejected with cursor pagination). `resourceIds` and `resourceSlugs` may not both be set (`invalidItemSearchParams`, 400). # Get a specific submission for a project with recent messages. (/docs/reference/api/projects/get-projects-projectid-submission-submissionid) Note, submissions are a Chat model. Requires `canGetSubmission`. The submission must belong to `projectId`; a foreign or unknown id returns `submissionNotFound` (404). Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId}/submission/{submissionId} Get a specific submission for a project with recent messages. Note, submissions are a Chat model. Requires `canGetSubmission`. The submission must belong to `projectId`; a foreign or unknown id returns `submissionNotFound` (404). # Get submissions for a project (/docs/reference/api/projects/get-projects-projectid-submission) Requires `canGetSubmission`. Callers holding `canCreateSubmission` also see staged `unreleased` submissions; everyone else sees only `active` ones. Index pagination is the default; pass `paginate=cursor` for cursor pagination (cursor-only parameters are rejected with index pagination, and `page`, `createdBefore`, `createdAfter` are rejected with cursor pagination). Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId}/submission Get submissions for a project Requires `canGetSubmission`. Callers holding `canCreateSubmission` also see staged `unreleased` submissions; everyone else sees only `active` ones. Index pagination is the default; pass `paginate=cursor` for cursor pagination (cursor-only parameters are rejected with index pagination, and `page`, `createdBefore`, `createdAfter` are rejected with cursor pagination). # Get project details (/docs/reference/api/projects/get-projects-projectid) Requires `canGetProject`. The caller's roles on the project are attached to the response. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId} Get project details Requires `canGetProject`. The caller's roles on the project are attached to the response. # Get projects for the authenticated user (/docs/reference/api/projects/get-projects) Returns every active project the caller is a member of, with the caller's role attached to each project. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects Get projects for the authenticated user Returns every active project the caller is a member of, with the caller's role attached to each project. # Get project topic chat (creator or reviewer). (/docs/reference/api/projects/getProjectChat) Returns the project's topic chat for the given visibility with its most recent messages and replies. Requires `canGetCreatorChat` for `creator` and `canGetReviewerChat` for `reviewer`. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId}/chat/{visibility} Get project topic chat (creator or reviewer). Returns the project's topic chat for the given visibility with its most recent messages and replies. Requires `canGetCreatorChat` for `creator` and `canGetReviewerChat` for `reviewer`. # Update a single project setting (/docs/reference/api/projects/patch-projects-projectid-settings-name) Updates one key of the project's `settings` JSON column. Mirrors the workspace settings endpoint. Requires `canManageProjectSettings` (no subscription check on this route). At the project level every setting accepts `null`, meaning "inherit the workspace's value". Otherwise the type of `value` depends on `name`: - `allowAiFeatures`, `aiPolishEnabled`, `aiComposeEnabled`, `aiChatEnabled`, `aiAssistEnabled`, `aiTaskGenerationEnabled`, `aiImageRevisionEnabled`, `aiPolishAllowReviewer`, `aiComposeAllowReviewer`, `aiChatAllowReviewer`, `aiAssistAllowReviewer`, `aiTaskGenerationAllowReviewer`, `aiImageRevisionAllowReviewer` — boolean. - `aiAssistFollowUpWindow` — integer, 0–30. - `aiCustomPreprompt`, `aiTaskGenerationPreprompt` — string (may be empty; empty means "no preprompt", null means inherit). - `aiChatTools`, `aiAssistTools` — object mapping tool names (`^[a-z][a-z0-9_]*$`) to boolean or null. A `value` of the wrong type for the setting is a validation error (400). Machine-readable definition: https://docs.nurama.com/openapi.json ## PATCH /projects/{projectId}/settings/{name} Update a single project setting Updates one key of the project's `settings` JSON column. Mirrors the workspace settings endpoint. Requires `canManageProjectSettings` (no subscription check on this route). At the project level every setting accepts `null`, meaning "inherit the workspace's value". Otherwise the type of `value` depends on `name`: - `allowAiFeatures`, `aiPolishEnabled`, `aiComposeEnabled`, `aiChatEnabled`, `aiAssistEnabled`, `aiTaskGenerationEnabled`, `aiImageRevisionEnabled`, `aiPolishAllowReviewer`, `aiComposeAllowReviewer`, `aiChatAllowReviewer`, `aiAssistAllowReviewer`, `aiTaskGenerationAllowReviewer`, `aiImageRevisionAllowReviewer` — boolean. - `aiAssistFollowUpWindow` — integer, 0–30. - `aiCustomPreprompt`, `aiTaskGenerationPreprompt` — string (may be empty; empty means "no preprompt", null means inherit). - `aiChatTools`, `aiAssistTools` — object mapping tool names (`^[a-z][a-z0-9_]*$`) to boolean or null. A `value` of the wrong type for the setting is a validation error (400). # Create a new folder in a project (/docs/reference/api/projects/post-projects-projectid-files-visibility-create-folder) Creates a folder in the creator or reviewer tree. The required permission depends on `visibility`, as it does for move and copy: `creator` needs `canCreateFolder`; `reviewer` needs `canCreateReviewerFolder`, which only the workspace and project admin tiers hold. A creator can publish into the reviewer tree but not create folders there directly, matching the fact that they hold no reviewer move or copy right. Reserved names (`Review`, `Public`, `Submission`) are rejected (`reservedFolderName`, 400), as are base paths inside a virtual folder (`protectedBasePath`, 400). A `basePath` that does not exist returns `basePathNotFound` (404). Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects/{projectId}/files/{visibility}/create-folder Create a new folder in a project Creates a folder in the creator or reviewer tree. The required permission depends on `visibility`, as it does for move and copy: `creator` needs `canCreateFolder`; `reviewer` needs `canCreateReviewerFolder`, which only the workspace and project admin tiers hold. A creator can publish into the reviewer tree but not create folders there directly, matching the fact that they hold no reviewer move or copy right. Reserved names (`Review`, `Public`, `Submission`) are rejected (`reservedFolderName`, 400), as are base paths inside a virtual folder (`protectedBasePath`, 400). A `basePath` that does not exist returns `basePathNotFound` (404). # Preview what deleting items at these paths would reach (/docs/reference/api/projects/post-projects-projectid-files-visibility-delete-preview) Answers what a delete would remove beyond the rows named, without deleting anything. Takes the same body the delete takes and resolves it through the same cascade, so the preview cannot disagree with the outcome. Only SECONDARY references come back — the reviewer, submission and public-release copies that would go with the selection — not the rows the caller listed. Costs the same right as the delete itself (`canDeleteCreatorItems` / `canDeleteReviewerItems`). A cheaper preview would hand out the labels of submissions and public releases the caller cannot otherwise see. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects/{projectId}/files/{visibility}/delete-preview Preview what deleting items at these paths would reach Answers what a delete would remove beyond the rows named, without deleting anything. Takes the same body the delete takes and resolves it through the same cascade, so the preview cannot disagree with the outcome. Only SECONDARY references come back — the reviewer, submission and public-release copies that would go with the selection — not the rows the caller listed. Costs the same right as the delete itself (`canDeleteCreatorItems` / `canDeleteReviewerItems`). A cheaper preview would hand out the labels of submissions and public releases the caller cannot otherwise see. # Get items at a specific path within a project (filters in the body) (/docs/reference/api/projects/post-projects-projectid-files-visibility-path) Identical to the GET listing at a path, but the query options are sent as a JSON body instead of query-string parameters. Same permissions and response shapes as the GET. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects/{projectId}/files/{visibility}/{path} Get items at a specific path within a project (filters in the body) Identical to the GET listing at a path, but the query options are sent as a JSON body instead of query-string parameters. Same permissions and response shapes as the GET. # Get items at the root path of a project (filters in the body) (/docs/reference/api/projects/post-projects-projectid-files-visibility) Identical to the GET listing, but the query options are sent as a JSON body instead of query-string parameters — useful when the filter set (for example a long `resourceIds` list) would not fit in a URL. Same permissions and response shapes as the GET. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects/{projectId}/files/{visibility} Get items at the root path of a project (filters in the body) Identical to the GET listing, but the query options are sent as a JSON body instead of query-string parameters — useful when the filter set (for example a long `resourceIds` list) would not fit in a URL. Same permissions and response shapes as the GET. # Create or update project logo. (deprecated alias; use PUT) (/docs/reference/api/projects/post-projects-projectid-logo) Creates the logo asset and returns its signed upload link(s). POST and PUT run the same operation. Requires `canUpdateProject`. Returns `uploadRequestExceedsSubscription` (400) when the file would exceed the workspace's subscribed storage. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects/{projectId}/logo (deprecated) Create or update project logo. (deprecated alias; use PUT) Creates the logo asset and returns its signed upload link(s). POST and PUT run the same operation. Requires `canUpdateProject`. Returns `uploadRequestExceedsSubscription` (400) when the file would exceed the workspace's subscribed storage. # Add items to public file system (/docs/reference/api/projects/post-projects-projectid-public-publicid-add) Copies additional creator-tree items (assets or folders) into an existing public file system, marks the assets public and recomputes the release inventory. `itemPaths` are relative to `project/{projectId}/creator`. Requires `canAddPubicFileSystemItems`; the record must belong to `projectId`. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects/{projectId}/public/{publicId}/add Add items to public file system Copies additional creator-tree items (assets or folders) into an existing public file system, marks the assets public and recomputes the release inventory. `itemPaths` are relative to `project/{projectId}/creator`. Requires `canAddPubicFileSystemItems`; the record must belong to `projectId`. # Release a staged (unreleased) public file system (/docs/reference/api/projects/post-projects-projectid-public-publicid-release) Flips a public file system's status from `unreleased` to `active`, making it externally accessible via its public token and recomputing the `hasActivePublicFileSystem` flag on its assets. Requires `canUpdatePublicFileSystem`. Returns `publicNotUnreleased` (400) if the record isn't in the `unreleased` state. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects/{projectId}/public/{publicId}/release Release a staged (unreleased) public file system Flips a public file system's status from `unreleased` to `active`, making it externally accessible via its public token and recomputing the `hasActivePublicFileSystem` flag on its assets. Requires `canUpdatePublicFileSystem`. Returns `publicNotUnreleased` (400) if the record isn't in the `unreleased` state. # Create public asset chat message with lazy creation (authenticated management) (/docs/reference/api/projects/post-projects-projectid-public-token-assets-assetid-messages) Creates a message on an asset's public chat. If no public chat exists for the asset in this public file system, one is created automatically (lazy creation). Unlike the unauthenticated `/public/{token}/assets/{assetId}/messages` endpoint, this does NOT check token expiration. Use this for internal management of public file systems. Requires `canGetPublicFileSystem` permission. Attachments, mentions, asset mentions and quotes are not supported in public chats and are rejected. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects/{projectId}/public/{token}/assets/{assetId}/messages Create public asset chat message with lazy creation (authenticated management) Creates a message on an asset's public chat. If no public chat exists for the asset in this public file system, one is created automatically (lazy creation). Unlike the unauthenticated `/public/{token}/assets/{assetId}/messages` endpoint, this does NOT check token expiration. Use this for internal management of public file systems. Requires `canGetPublicFileSystem` permission. Attachments, mentions, asset mentions and quotes are not supported in public chats and are rejected. # Create public chat message (authenticated management) (/docs/reference/api/projects/post-projects-projectid-public-token-chat-chatid-messages) Creates a message in an existing public chat. Unlike the unauthenticated `/public/{token}/chat/{chatId}/messages` endpoint, this does NOT check token expiration. Use this for internal management of public file systems. Requires `canGetPublicFileSystem` permission. A chat that does not belong to this release returns 403. Attachments, mentions, asset mentions and quotes are not supported in public chats and are rejected. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects/{projectId}/public/{token}/chat/{chatId}/messages Create public chat message (authenticated management) Creates a message in an existing public chat. Unlike the unauthenticated `/public/{token}/chat/{chatId}/messages` endpoint, this does NOT check token expiration. Use this for internal management of public file systems. Requires `canGetPublicFileSystem` permission. A chat that does not belong to this release returns 403. Attachments, mentions, asset mentions and quotes are not supported in public chats and are rejected. # Create public topic chat message with lazy creation (authenticated management) (/docs/reference/api/projects/post-projects-projectid-public-token-chat-messages) Creates a message on the main public topic chat. If no main chat exists for this public file system, one is created automatically (lazy creation). Unlike the unauthenticated `/public/{token}/chat/messages` endpoint, this does NOT check token expiration. Use this for internal management of public file systems. Requires `canGetPublicFileSystem` permission. Attachments, mentions, asset mentions and quotes are not supported in public chats and are rejected. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects/{projectId}/public/{token}/chat/messages Create public topic chat message with lazy creation (authenticated management) Creates a message on the main public topic chat. If no main chat exists for this public file system, one is created automatically (lazy creation). Unlike the unauthenticated `/public/{token}/chat/messages` endpoint, this does NOT check token expiration. Use this for internal management of public file systems. Requires `canGetPublicFileSystem` permission. Attachments, mentions, asset mentions and quotes are not supported in public chats and are rejected. # Create a folder inside a public file system (/docs/reference/api/projects/post-projects-projectid-public-token-files-create-folder) Creates a folder at `public/{publicId}/{basePath}` (or the release root when `basePath` is omitted) and recomputes the release inventory. Requires `canCreatePublicFileSystemFolder`; the token must belong to `projectId`. A `basePath` that does not exist in the release returns `basePathNotFound` (404); a folder with the same name already at that address returns `folderExistsAtPath` (409). Does NOT check token expiration. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects/{projectId}/public/{token}/files/create-folder Create a folder inside a public file system Creates a folder at `public/{publicId}/{basePath}` (or the release root when `basePath` is omitted) and recomputes the release inventory. Requires `canCreatePublicFileSystemFolder`; the token must belong to `projectId`. A `basePath` that does not exist in the release returns `basePathNotFound` (404); a folder with the same name already at that address returns `folderExistsAtPath` (409). Does NOT check token expiration. # Create a public file system (/docs/reference/api/projects/post-projects-projectid-public) Creates a public file system (a "release") with a secure token for sharing project assets publicly without authentication. `itemPaths` are relative to `project/{projectId}/creator`. Requires `canCreatePublicFileSystem`. Gated by the `publicSharing` workspace capability — granted by every paid base plan and intentionally withheld from the Demo plan. Requests from workspaces without the capability return 403 `capabilityNotAvailable` with `errorData.capability = "publicSharing"`; clients can use this to prompt the user to upgrade their plan. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects/{projectId}/public Create a public file system Creates a public file system (a "release") with a secure token for sharing project assets publicly without authentication. `itemPaths` are relative to `project/{projectId}/creator`. Requires `canCreatePublicFileSystem`. Gated by the `publicSharing` workspace capability — granted by every paid base plan and intentionally withheld from the Demo plan. Requests from workspaces without the capability return 403 `capabilityNotAvailable` with `errorData.capability = "publicSharing"`; clients can use this to prompt the user to upgrade their plan. # Publish assets (/docs/reference/api/projects/post-projects-projectid-publish) Bulk publish an array of file-system items (assets or folders) into the project's reviewer tree. The caller must hold `canPublishItem` on every listed resource; otherwise 403 with the offending ids in `errorData`. Fires per-item and project-level publish notifications, system messages in the creator and reviewer chats and, when `sendEmailNotification` is true, the published-items email. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects/{projectId}/publish Publish assets Bulk publish an array of file-system items (assets or folders) into the project's reviewer tree. The caller must hold `canPublishItem` on every listed resource; otherwise 403 with the offending ids in `errorData`. Fires per-item and project-level publish notifications, system messages in the creator and reviewer chats and, when `sendEmailNotification` is true, the published-items email. # Add reviewer-tree items to an existing submission (/docs/reference/api/projects/post-projects-projectid-submission-submissionid-add) Copies items from the project's reviewer tree into the submission. `itemPaths` are relative to `project/{projectId}/reviewer` and `destinationPath` is relative to `submission/{submissionId}` (omit it to add at the submission root; a destination folder that does not exist returns 404). Marks the copied assets as belonging to the submission and recomputes its inventory. Requires `canAddSubmittionItems`; the submission must belong to `projectId`. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects/{projectId}/submission/{submissionId}/add Add reviewer-tree items to an existing submission Copies items from the project's reviewer tree into the submission. `itemPaths` are relative to `project/{projectId}/reviewer` and `destinationPath` is relative to `submission/{submissionId}` (omit it to add at the submission root; a destination folder that does not exist returns 404). Marks the copied assets as belonging to the submission and recomputes its inventory. Requires `canAddSubmittionItems`; the submission must belong to `projectId`. # Create a new folder within a submission (/docs/reference/api/projects/post-projects-projectid-submission-submissionid-files-create-folder) Requires `canCreateSubmissionFolder`; the submission must belong to `projectId`. Reserved names return `reservedFolderName` (400), a `basePath` inside a virtual folder returns `protectedBasePath` (400), and a `basePath` that does not exist in the submission returns `basePathNotFound` (404). Recomputes the submission's inventory. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects/{projectId}/submission/{submissionId}/files/create-folder Create a new folder within a submission Requires `canCreateSubmissionFolder`; the submission must belong to `projectId`. Reserved names return `reservedFolderName` (400), a `basePath` inside a virtual folder returns `protectedBasePath` (400), and a `basePath` that does not exist in the submission returns `basePathNotFound` (404). Recomputes the submission's inventory. # Re-release an already-released submission's side effects (/docs/reference/api/projects/post-projects-projectid-submission-submissionid-release-update) The "Release Update" action for a live (`active`) submission. Re-fires the reviewer-facing side effects — the submission-update email template, a `submissionUpdate` notification, and system messages in the creator + reviewer project chats — to announce that a released submission has changed. Does NOT change the submission's status. Requires `canUpdateSubmission`. Returns `submissionNotFound` if no active submission matches. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects/{projectId}/submission/{submissionId}/release-update Re-release an already-released submission's side effects The "Release Update" action for a live (`active`) submission. Re-fires the reviewer-facing side effects — the submission-update email template, a `submissionUpdate` notification, and system messages in the creator + reviewer project chats — to announce that a released submission has changed. Does NOT change the submission's status. Requires `canUpdateSubmission`. Returns `submissionNotFound` if no active submission matches. # Release a staged (unreleased) submission (/docs/reference/api/projects/post-projects-projectid-submission-submissionid-release) Flips a submission's status from `unreleased` to `active`, making it visible to reviewers and firing the deferred "new submission" side effects (project-member email, notification, push summary, and system messages in the creator + reviewer project chats). Requires `canUpdateSubmission`. Returns `submissionNotUnreleased` (400) if the submission isn't in the `unreleased` state. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects/{projectId}/submission/{submissionId}/release Release a staged (unreleased) submission Flips a submission's status from `unreleased` to `active`, making it visible to reviewers and firing the deferred "new submission" side effects (project-member email, notification, push summary, and system messages in the creator + reviewer project chats). Requires `canUpdateSubmission`. Returns `submissionNotUnreleased` (400) if the submission isn't in the `unreleased` state. # Add a tag to a submission (deprecated alias; use PUT) (/docs/reference/api/projects/post-projects-projectid-submission-submissionid-tag) Requires `canTagSubmission`. The submission must belong to `projectId`. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects/{projectId}/submission/{submissionId}/tag (deprecated) Add a tag to a submission (deprecated alias; use PUT) Requires `canTagSubmission`. The submission must belong to `projectId`. # Remove a tag from a submission (deprecated alias; use PUT) (/docs/reference/api/projects/post-projects-projectid-submission-submissionid-untag) Requires `canUntagSubmission`. The submission must belong to `projectId`. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects/{projectId}/submission/{submissionId}/untag (deprecated) Remove a tag from a submission (deprecated alias; use PUT) Requires `canUntagSubmission`. The submission must belong to `projectId`. # Create a new submission for a project (/docs/reference/api/projects/post-projects-projectid-submission) Note, submissions are a Chat model. Items are taken from the project's reviewer tree (`itemPaths` are relative to `project/{projectId}/reviewer`; already-prefixed paths are accepted as-is). Requires `canCreateSubmission`. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects/{projectId}/submission Create a new submission for a project Note, submissions are a Chat model. Items are taken from the project's reviewer tree (`itemPaths` are relative to `project/{projectId}/reviewer`; already-prefixed paths are accepted as-is). Requires `canCreateSubmission`. # Unpublish assets (/docs/reference/api/projects/post-projects-projectid-unpublish) Bulk unpublish an array of assets, removing their reviewer-tree references. Only assets can be unpublished (a folder is removed from the reviewer surface by deleting it there). The caller must hold `canUnpublishItem` on every listed resource; otherwise 403 with the offending ids in `errorData`. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects/{projectId}/unpublish Unpublish assets Bulk unpublish an array of assets, removing their reviewer-tree references. Only assets can be unpublished (a folder is removed from the reviewer surface by deleting it there). The caller must hold `canUnpublishItem` on every listed resource; otherwise 403 with the offending ids in `errorData`. # Create assets and signed upload links for a project. (/docs/reference/api/projects/post-projects-projectid) Creates assets in the project's creator tree and returns signed upload links. Requires `canCreateAsset`. When a submitted file's checksum matches an asset already in the project, no bytes are transferred: the platform adds another FileSystem reference to the existing asset and reports `status: success` with `referencesExistingAsset: true` and no signed URLs. In that case the response's `name` is the EXISTING asset's name, because that is what the new reference carries — `FileSystem.resourceName` is a denormalized copy of `Asset.name`, so the submitted name never lands. The submitted name is returned as `originalName`. Correlate results with requests positionally or by your own upload id, not by `name`. Returns `uploadRequestExceedsSubscription` (400) when the request would exceed the workspace's subscribed storage. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects/{projectId} Create assets and signed upload links for a project. Creates assets in the project's creator tree and returns signed upload links. Requires `canCreateAsset`. When a submitted file's checksum matches an asset already in the project, no bytes are transferred: the platform adds another FileSystem reference to the existing asset and reports `status: success` with `referencesExistingAsset: true` and no signed URLs. In that case the response's `name` is the EXISTING asset's name, because that is what the new reference carries — `FileSystem.resourceName` is a denormalized copy of `Asset.name`, so the submitted name never lands. The submitted name is returned as `originalName`. Correlate results with requests positionally or by your own upload id, not by `name`. Returns `uploadRequestExceedsSubscription` (400) when the request would exceed the workspace's subscribed storage. # Create a new project and topic chats with for both reviewers and creators. (/docs/reference/api/projects/post-projects) Requires `canCreateProject` on the target workspace and an active workspace subscription. Returns `maxProjectsPerWorkspace` (400) when the workspace has reached its plan's project cap and `projectNameTaken` (400) when a project with the same slug already exists in the workspace. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /projects Create a new project and topic chats with for both reviewers and creators. Requires `canCreateProject` on the target workspace and an active workspace subscription. Returns `maxProjectsPerWorkspace` (400) when the workspace has reached its plan's project cap and `projectNameTaken` (400) when a project with the same slug already exists in the workspace. # Copy items to a new path within a project (/docs/reference/api/projects/put-projects-projectid-files-visibility-copy) Paths are relative to `project/{projectId}/{visibility}`. Requires `canCopyCreatorItems` for `creator` and `canCopyReviewerItems` for `reviewer`. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /projects/{projectId}/files/{visibility}/copy Copy items to a new path within a project Paths are relative to `project/{projectId}/{visibility}`. Requires `canCopyCreatorItems` for `creator` and `canCopyReviewerItems` for `reviewer`. # Delete items at specified paths within a project (/docs/reference/api/projects/put-projects-projectid-files-visibility-delete) Paths are relative to `project/{projectId}/{visibility}`. Requires `canDeleteCreatorItems` for `creator` and `canDeleteReviewerItems` for `reviewer`. Use `delete-preview` first to learn which secondary references the cascade will remove. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /projects/{projectId}/files/{visibility}/delete Delete items at specified paths within a project Paths are relative to `project/{projectId}/{visibility}`. Requires `canDeleteCreatorItems` for `creator` and `canDeleteReviewerItems` for `reviewer`. Use `delete-preview` first to learn which secondary references the cascade will remove. # Move items to a new path within a project (/docs/reference/api/projects/put-projects-projectid-files-visibility-move) Paths are relative to `project/{projectId}/{visibility}`. Requires `canMoveCreatorItems` for `creator` and `canMoveReviewerItems` for `reviewer`. Items already in the destination folder are skipped (`count` may be 0). A destination inside a virtual folder is a copy, not a move, and costs the right of the matching add route: `Public/{token}/...` requires `canAddPubicFileSystemItems`, `Submission/{id}/...` requires `canAddSubmittionItems`, and dropping onto `Review/...` publishes the items (requires `canPublishAsset`). Those responses carry `virtualDestination: true` (and `published: true` plus `errors` for `Review/`). Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /projects/{projectId}/files/{visibility}/move Move items to a new path within a project Paths are relative to `project/{projectId}/{visibility}`. Requires `canMoveCreatorItems` for `creator` and `canMoveReviewerItems` for `reviewer`. Items already in the destination folder are skipped (`count` may be 0). A destination inside a virtual folder is a copy, not a move, and costs the right of the matching add route: `Public/{token}/...` requires `canAddPubicFileSystemItems`, `Submission/{id}/...` requires `canAddSubmittionItems`, and dropping onto `Review/...` publishes the items (requires `canPublishAsset`). Those responses carry `virtualDestination: true` (and `published: true` plus `errors` for `Review/`). # Create or update project logo. (/docs/reference/api/projects/put-projects-projectid-logo) Identical to `POST /projects/{projectId}/logo`. Requires `canUpdateProject`. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /projects/{projectId}/logo Create or update project logo. Identical to `POST /projects/{projectId}/logo`. Requires `canUpdateProject`. # Update public file system details (/docs/reference/api/projects/put-projects-projectid-public-publicid) Updates the title, description, validity and sharing flags of an existing public file system. Requires `canUpdatePublicFileSystem`; the record must belong to `projectId`. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /projects/{projectId}/public/{publicId} Update public file system details Updates the title, description, validity and sharing flags of an existing public file system. Requires `canUpdatePublicFileSystem`; the record must belong to `projectId`. # Copy items within public file system (/docs/reference/api/projects/put-projects-projectid-public-token-files-copy) Copies items to a new location within the public file system and recomputes the release inventory. Paths are relative to `public/{publicId}`. Requires `canCopyPublicFileSystemItems`; the token must belong to `projectId`. Does NOT check token expiration. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /projects/{projectId}/public/{token}/files/copy Copy items within public file system Copies items to a new location within the public file system and recomputes the release inventory. Paths are relative to `public/{publicId}`. Requires `canCopyPublicFileSystemItems`; the token must belong to `projectId`. Does NOT check token expiration. # Delete items from public file system (/docs/reference/api/projects/put-projects-projectid-public-token-files-delete) Deletes items from the public file system. Paths are relative to `public/{publicId}`. Requires `canDeletePublicFileSystemItems`; the token must belong to `projectId`. Does NOT check token expiration. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /projects/{projectId}/public/{token}/files/delete Delete items from public file system Deletes items from the public file system. Paths are relative to `public/{publicId}`. Requires `canDeletePublicFileSystemItems`; the token must belong to `projectId`. Does NOT check token expiration. # Move items within public file system (/docs/reference/api/projects/put-projects-projectid-public-token-files-move) Moves items to a new location within the public file system. Paths are relative to `public/{publicId}`. Items already in the destination folder are skipped (`count` may be 0). Requires `canMovePublicFileSystemItems`; the token must belong to `projectId`. Does NOT check token expiration. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /projects/{projectId}/public/{token}/files/move Move items within public file system Moves items to a new location within the public file system. Paths are relative to `public/{publicId}`. Items already in the destination folder are skipped (`count` may be 0). Requires `canMovePublicFileSystemItems`; the token must belong to `projectId`. Does NOT check token expiration. # Copy items within a submission (/docs/reference/api/projects/put-projects-projectid-submission-submissionid-files-copy) Paths are relative to `submission/{submissionId}`. Requires `canCopySubmissionItems`; the submission must belong to `projectId`. Recomputes the submission's inventory. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /projects/{projectId}/submission/{submissionId}/files/copy Copy items within a submission Paths are relative to `submission/{submissionId}`. Requires `canCopySubmissionItems`; the submission must belong to `projectId`. Recomputes the submission's inventory. # Delete items within a submission (/docs/reference/api/projects/put-projects-projectid-submission-submissionid-files-delete) Paths are relative to `submission/{submissionId}`. Requires `canDeleteSubmissionItems`; the submission must belong to `projectId`. Recomputes the submission's inventory. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /projects/{projectId}/submission/{submissionId}/files/delete Delete items within a submission Paths are relative to `submission/{submissionId}`. Requires `canDeleteSubmissionItems`; the submission must belong to `projectId`. Recomputes the submission's inventory. # Move items within a submission (/docs/reference/api/projects/put-projects-projectid-submission-submissionid-files-move) Paths are relative to `submission/{submissionId}`. Items already in the destination folder are skipped (`count` may be 0). Requires `canMoveSubmissionItems`; the submission must belong to `projectId`. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /projects/{projectId}/submission/{submissionId}/files/move Move items within a submission Paths are relative to `submission/{submissionId}`. Items already in the destination folder are skipped (`count` may be 0). Requires `canMoveSubmissionItems`; the submission must belong to `projectId`. # Add a tag to a submission (/docs/reference/api/projects/put-projects-projectid-submission-submissionid-tag) Requires `canTagSubmission`. The submission must belong to `projectId`. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /projects/{projectId}/submission/{submissionId}/tag Add a tag to a submission Requires `canTagSubmission`. The submission must belong to `projectId`. # Remove a tag from a submission (/docs/reference/api/projects/put-projects-projectid-submission-submissionid-untag) Requires `canUntagSubmission`. The submission must belong to `projectId`. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /projects/{projectId}/submission/{submissionId}/untag Remove a tag from a submission Requires `canUntagSubmission`. The submission must belong to `projectId`. # Update a submission (/docs/reference/api/projects/put-projects-projectid-submission-submissionid) Requires `canUpdateSubmission`. The submission must belong to `projectId`. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /projects/{projectId}/submission/{submissionId} Update a submission Requires `canUpdateSubmission`. The submission must belong to `projectId`. # Update project details (/docs/reference/api/projects/put-projects-projectid) Requires `canUpdateProject`. A `projectUpdate` notification is emitted only when the name actually changes. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /projects/{projectId} Update project details Requires `canUpdateProject`. A `projectUpdate` notification is emitted only when the name actually changes. # Full-text search across project content. (/docs/reference/api/projects/searchProject) Searches across assets, chat messages, and tasks within a project using full-text search. The query uses web-search syntax: unquoted words must all match, `"quoted text"` matches a phrase, `OR` matches either side and a leading `-` excludes a word. Results are ranked by relevance and respect the caller's visibility (creator / reviewer) permissions. Each hit includes a populated `record` shaped per the content type's native list view. Requires `canGetProject`. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /projects/{projectId}/search Full-text search across project content. Searches across assets, chat messages, and tasks within a project using full-text search. The query uses web-search syntax: unquoted words must all match, `"quoted text"` matches a phrase, `OR` matches either side and a leading `-` excludes a word. Results are ranked by relevance and respect the caller's visibility (creator / reviewer) permissions. Each hit includes a populated `record` shaped per the content type's native list view. Requires `canGetProject`. # Get asset with public chat (/docs/reference/api/public/get-public-token-assets-assetid) Retrieves an asset along with its public chat in the context of this public file system. The chat is returned in `chats.public` and will be null if no chat has been created yet. No authentication required for read access. When the release was created with `hideCreators: true`, the asset's creator fields are omitted. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /public/{token}/assets/{assetId} Get asset with public chat Retrieves an asset along with its public chat in the context of this public file system. The chat is returned in `chats.public` and will be null if no chat has been created yet. No authentication required for read access. When the release was created with `hideCreators: true`, the asset's creator fields are omitted. # Get public chat messages (/docs/reference/api/public/get-public-token-chat-chatid-messages) Retrieves paginated messages for a public chat. The chat must be the release's main topic chat or one of its asset public chats, otherwise 403 `forbidden` is returned. No authentication required for read access. Messages are always returned cursor-paginated. `paginate=index` and `page` are accepted by validation but are ignored by the handler. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /public/{token}/chat/{chatId}/messages Get public chat messages Retrieves paginated messages for a public chat. The chat must be the release's main topic chat or one of its asset public chats, otherwise 403 `forbidden` is returned. No authentication required for read access. Messages are always returned cursor-paginated. `paginate=index` and `page` are accepted by validation but are ignored by the handler. # Get main public file system chat (/docs/reference/api/public/get-public-token-chat) Retrieves the main topic chat for a public file system. Returns null if no main chat has been created yet (lazy creation pattern). No authentication required for read access. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /public/{token}/chat Get main public file system chat Retrieves the main topic chat for a public file system. Returns null if no main chat has been created yet (lazy creation pattern). No authentication required for read access. # Get public file system items at path (/docs/reference/api/public/get-public-token-files-path) Retrieves items (assets and folders) from a public file system at a specific folder path. No authentication required. Accepts the same query parameters as `GET /public/{token}/files`. When the release was created with `hideCreators: true`, each item's creator fields are omitted. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /public/{token}/files/{path} Get public file system items at path Retrieves items (assets and folders) from a public file system at a specific folder path. No authentication required. Accepts the same query parameters as `GET /public/{token}/files`. When the release was created with `hideCreators: true`, each item's creator fields are omitted. # Get public file system items (/docs/reference/api/public/get-public-token-files) Retrieves items (assets and folders) from a public file system at the root level. No authentication required. Supports index pagination (default) or cursor pagination via `paginate=cursor`; the cursor-only options are rejected with 400 when `paginate` is `index`, and `page` is rejected when `paginate` is `cursor`. Populated resources are reduced to the public allowlist before being returned. When the release was created with `hideCreators: true`, each item's `creator` / `resourceCreator` / `resourceCreatorId` fields are omitted. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /public/{token}/files Get public file system items Retrieves items (assets and folders) from a public file system at the root level. No authentication required. Supports index pagination (default) or cursor pagination via `paginate=cursor`; the cursor-only options are rejected with 400 when `paginate` is `index`, and `page` is rejected when `paginate` is `cursor`. Populated resources are reduced to the public allowlist before being returned. When the release was created with `hideCreators: true`, each item's `creator` / `resourceCreator` / `resourceCreatorId` fields are omitted. # Get public file system details (/docs/reference/api/public/get-public-token) Retrieves detailed information about a public file system using its access token. No authentication required. The token must resolve to an `active`, unexpired release. When the release was created with `hideCreators: true`, the `creator` and `creatorId` fields ("Shared by") are omitted from the response. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /public/{token} Get public file system details Retrieves detailed information about a public file system using its access token. No authentication required. The token must resolve to an `active`, unexpired release. When the release was created with `hideCreators: true`, the `creator` and `creatorId` fields ("Shared by") are omitted from the response. # Create message on asset's public chat (lazy creation) (/docs/reference/api/public/post-public-token-assets-assetid-messages) Creates a message on an asset's public chat. If no public chat exists for this asset in this public file system, one is created automatically (lazy creation pattern). **Authentication is optional.** A signed-in user posts with their real identity (`authorId`); an unauthenticated visitor may post anonymously by supplying `guestName` when the release has `allowAnonymousComments` enabled. See the `guestId` / `guestColor` notes on `POST /public/{token}/chat/{chatId}/messages`. Attachments, mentions, asset mentions and quotes are not supported in public chats and are rejected with 400. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /public/{token}/assets/{assetId}/messages Create message on asset's public chat (lazy creation) Creates a message on an asset's public chat. If no public chat exists for this asset in this public file system, one is created automatically (lazy creation pattern). **Authentication is optional.** A signed-in user posts with their real identity (`authorId`); an unauthenticated visitor may post anonymously by supplying `guestName` when the release has `allowAnonymousComments` enabled. See the `guestId` / `guestColor` notes on `POST /public/{token}/chat/{chatId}/messages`. Attachments, mentions, asset mentions and quotes are not supported in public chats and are rejected with 400. # Create message in public chat (/docs/reference/api/public/post-public-token-chat-chatid-messages) Creates a new message in an existing public chat. The chat must be the release's main topic chat or one of its asset public chats. **Authentication is optional.** A signed-in user posts with their real identity (`authorId`). An unauthenticated visitor may post anonymously by supplying a display name (`guestName`) — but only when the release has `allowAnonymousComments` enabled. The client should also send a stable `guestId` (a UUID it persists in localStorage per token) so two guests who type the same name stay distinct, plus an optional `guestColor`. Guest fields are ignored when the caller is authenticated. Attachments, mentions, asset mentions and quotes are not supported in public chats and are rejected with 400. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /public/{token}/chat/{chatId}/messages Create message in public chat Creates a new message in an existing public chat. The chat must be the release's main topic chat or one of its asset public chats. **Authentication is optional.** A signed-in user posts with their real identity (`authorId`). An unauthenticated visitor may post anonymously by supplying a display name (`guestName`) — but only when the release has `allowAnonymousComments` enabled. The client should also send a stable `guestId` (a UUID it persists in localStorage per token) so two guests who type the same name stay distinct, plus an optional `guestColor`. Guest fields are ignored when the caller is authenticated. Attachments, mentions, asset mentions and quotes are not supported in public chats and are rejected with 400. # Create message on the main public chat (lazy creation) (/docs/reference/api/public/post-public-token-chat-messages) Creates a message on the public file system's main topic chat. If the main chat does not exist yet it is created automatically (lazy creation pattern), using the release title as its subject. **Authentication is optional.** A signed-in user posts with their real identity (`authorId`); an unauthenticated visitor may post anonymously by supplying `guestName` when the release has `allowAnonymousComments` enabled. See the `guestId` / `guestColor` notes on `POST /public/{token}/chat/{chatId}/messages`. Attachments, mentions, asset mentions and quotes are not supported in public chats and are rejected with 400. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /public/{token}/chat/messages Create message on the main public chat (lazy creation) Creates a message on the public file system's main topic chat. If the main chat does not exist yet it is created automatically (lazy creation pattern), using the release title as its subject. **Authentication is optional.** A signed-in user posts with their real identity (`authorId`); an unauthenticated visitor may post anonymously by supplying `guestName` when the release has `allowAnonymousComments` enabled. See the `guestId` / `guestColor` notes on `POST /public/{token}/chat/{chatId}/messages`. Attachments, mentions, asset mentions and quotes are not supported in public chats and are rejected with 400. # Generate download links for assets (/docs/reference/api/public/post-public-token-download) Generates signed download URLs for the original files of assets in a public file system. No authentication required. Every requested asset must exist within the release's file-system path, otherwise the whole request is rejected with 400 `assetNotFound`. One result object is returned per requested asset; an individual entry may carry `status: fail` (with an `error` code) when its original file could not be signed. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /public/{token}/download Generate download links for assets Generates signed download URLs for the original files of assets in a public file system. No authentication required. Every requested asset must exist within the release's file-system path, otherwise the whole request is rejected with 400 `assetNotFound`. One result object is returned per requested asset; an individual entry may carry `status: fail` (with an `error` code) when its original file could not be signed. # List all public download links for an asset (/docs/reference/api/publicassetlinks/get-assets-assetid-public-links) Returns all public download links for an asset, including active, disabled, and expired links. Requires canGetPublicLinks permission. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /assets/{assetId}/public-links List all public download links for an asset Returns all public download links for an asset, including active, disabled, and expired links. Requires canGetPublicLinks permission. # List all public download links for an asset (/docs/reference/api/assets/get-assets-assetid-public-links) Returns all public download links for an asset, including active, disabled, and expired links. Requires canGetPublicLinks permission. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /assets/{assetId}/public-links List all public download links for an asset Returns all public download links for an asset, including active, disabled, and expired links. Requires canGetPublicLinks permission. # Get a signed download URL for a public download token (/docs/reference/api/publicassetlinks/get-public-download-token-download) Generates a signed download URL for the asset's original file. No authentication required. The URL is temporary and expires. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /public-download/{token}/download Get a signed download URL for a public download token Generates a signed download URL for the asset's original file. No authentication required. The URL is temporary and expires. # Resolve a public asset link to embed-player file paths (/docs/reference/api/publicassetlinks/get-public-download-token-embed-files) Returns the HLS streaming manifest keyPath and a fallback original-media keyPath for the asset behind a public download token. This is what the embeddable player at `/public/{token}/embed` uses. Resolve keyPaths against the base media URL. Play the `.m3u8` manifest with an HLS-capable player when `streamKeyPath` is present, falling back to the original media file otherwise. Only `video` and `audio` assets are meant to be embedded; the response still returns paths for other media types, but they should not be embedded. No authentication required. Returns minimal file info — never the full asset record (no `id`, `files`, `creatorId`, etc.). Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /public-download/{token}/embed-files Resolve a public asset link to embed-player file paths Returns the HLS streaming manifest keyPath and a fallback original-media keyPath for the asset behind a public download token. This is what the embeddable player at `/public/{token}/embed` uses. Resolve keyPaths against the base media URL. Play the `.m3u8` manifest with an HLS-capable player when `streamKeyPath` is present, falling back to the original media file otherwise. Only `video` and `audio` assets are meant to be embedded; the response still returns paths for other media types, but they should not be embedded. No authentication required. Returns minimal file info — never the full asset record (no `id`, `files`, `creatorId`, etc.). # Resolve a public download token (/docs/reference/api/publicassetlinks/get-public-download-token) Resolves a public download token to minimal file information for the download page. No authentication required. Returns fileName, mediaType, status, the link mode, and (for image assets) a `previewKeyPath` so the page can render an inline preview. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /public-download/{token} Resolve a public download token Resolves a public download token to minimal file information for the download page. No authentication required. Returns fileName, mediaType, status, the link mode, and (for image assets) a `previewKeyPath` so the page can render an inline preview. # Create a public download link for an asset (/docs/reference/api/publicassetlinks/post-assets-assetid-public-links) Creates a temporary public download link for an asset. The link can optionally have an expiration. Requires the `canCreatePublicLink` permission (project/workspace admin roles) AND the `publicSharing` workspace capability — granted by every paid base plan and intentionally withheld from the Demo plan. Workspaces without the capability receive 403 `capabilityNotAvailable` with `errorData.capability = "publicSharing"`, which clients can use to prompt for an upgrade. Sets `hasActivePublicLink`, `everPublic`, and `publicAssetLinkIds` on the asset. Sends a notification and email to workspace admins if the creator is a project-level admin. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /assets/{assetId}/public-links Create a public download link for an asset Creates a temporary public download link for an asset. The link can optionally have an expiration. Requires the `canCreatePublicLink` permission (project/workspace admin roles) AND the `publicSharing` workspace capability — granted by every paid base plan and intentionally withheld from the Demo plan. Workspaces without the capability receive 403 `capabilityNotAvailable` with `errorData.capability = "publicSharing"`, which clients can use to prompt for an upgrade. Sets `hasActivePublicLink`, `everPublic`, and `publicAssetLinkIds` on the asset. Sends a notification and email to workspace admins if the creator is a project-level admin. # Create a public download link for an asset (/docs/reference/api/assets/post-assets-assetid-public-links) Creates a temporary public download link for an asset. The link can optionally have an expiration. Requires the `canCreatePublicLink` permission (project/workspace admin roles) AND the `publicSharing` workspace capability — granted by every paid base plan and intentionally withheld from the Demo plan. Workspaces without the capability receive 403 `capabilityNotAvailable` with `errorData.capability = "publicSharing"`, which clients can use to prompt for an upgrade. Sets `hasActivePublicLink`, `everPublic`, and `publicAssetLinkIds` on the asset. Sends a notification and email to workspace admins if the creator is a project-level admin. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /assets/{assetId}/public-links Create a public download link for an asset Creates a temporary public download link for an asset. The link can optionally have an expiration. Requires the `canCreatePublicLink` permission (project/workspace admin roles) AND the `publicSharing` workspace capability — granted by every paid base plan and intentionally withheld from the Demo plan. Workspaces without the capability receive 403 `capabilityNotAvailable` with `errorData.capability = "publicSharing"`, which clients can use to prompt for an upgrade. Sets `hasActivePublicLink`, `everPublic`, and `publicAssetLinkIds` on the asset. Sends a notification and email to workspace admins if the creator is a project-level admin. # Disable a public download link (/docs/reference/api/publicassetlinks/put-assets-assetid-public-links-linkid-disable) Sets the link status to 'disabled'. The link can no longer be used for downloads. Updates hasActivePublicLink on the asset. Requires canUpdatePublicLink permission. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /assets/{assetId}/public-links/{linkId}/disable Disable a public download link Sets the link status to 'disabled'. The link can no longer be used for downloads. Updates hasActivePublicLink on the asset. Requires canUpdatePublicLink permission. # Reactivate a disabled or expired public download link (/docs/reference/api/publicassetlinks/put-assets-assetid-public-links-linkid-reactivate) Sets the link status back to 'active' with an optional new expiration. Updates hasActivePublicLink on the asset. Requires canUpdatePublicLink permission. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /assets/{assetId}/public-links/{linkId}/reactivate Reactivate a disabled or expired public download link Sets the link status back to 'active' with an optional new expiration. Updates hasActivePublicLink on the asset. Requires canUpdatePublicLink permission. # Update a public download link (/docs/reference/api/publicassetlinks/put-assets-assetid-public-links-linkid) Update a public link's expiration or status. At least one field must be provided. Requires canUpdatePublicLink permission. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /assets/{assetId}/public-links/{linkId} Update a public download link Update a public link's expiration or status. At least one field must be provided. Requires canUpdatePublicLink permission. # Finish a multipart upload for a scratch object. (/docs/reference/api/scratch/post-scratch-scratchid-complete-upload) Same body as `POST /v1/assets/complete-upload`. Commits the multipart upload, records the final object size against the workspace's storage usage, and moves the scratch object to `active`. Only the user who created the scratch object may call this (403 otherwise). Idempotent: calling it on an already-`active` object returns the same `{ id, url }` without changing anything. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /scratch/{scratchId}/complete-upload Finish a multipart upload for a scratch object. Same body as `POST /v1/assets/complete-upload`. Commits the multipart upload, records the final object size against the workspace's storage usage, and moves the scratch object to `active`. Only the user who created the scratch object may call this (403 otherwise). Idempotent: calling it on an already-`active` object returns the same `{ id, url }` without changing anything. # Promote a scratch object to a real Asset. (/docs/reference/api/scratch/post-scratch-scratchid-promote) Materialises an `active` scratch object as an Asset (`functionType: media`) in the workspace or project the scratch object was created in. The destination is derived from the scratch object itself — a project asset when it was created within a project, otherwise a workspace asset — and is **not** accepted from the request body, so a client cannot claim a scratch object belongs to a different workspace or project. Only the user who created the scratch object may promote it, and they must also hold `canCreateAsset` on the destination workspace or project. Idempotent: promoting an object that was already promoted returns the existing asset with `alreadyPromoted: true`, so a client can tell "freshly added" from "already added". To attach a scratch object to a chat message instead, pass it as a `{ scratchId, name? }` attachment when sending the message (`POST /v1/chats/{chatId}/messages`). Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /scratch/{scratchId}/promote Promote a scratch object to a real Asset. Materialises an `active` scratch object as an Asset (`functionType: media`) in the workspace or project the scratch object was created in. The destination is derived from the scratch object itself — a project asset when it was created within a project, otherwise a workspace asset — and is **not** accepted from the request body, so a client cannot claim a scratch object belongs to a different workspace or project. Only the user who created the scratch object may promote it, and they must also hold `canCreateAsset` on the destination workspace or project. Idempotent: promoting an object that was already promoted returns the existing asset with `alreadyPromoted: true`, so a client can tell "freshly added" from "already added". To attach a scratch object to a chat message instead, pass it as a `{ scratchId, name? }` attachment when sending the message (`POST /v1/chats/{chatId}/messages`). # Reset resource settings (/docs/reference/api/settings/delete-settings-resourcetype-resourceid) Remove all setting overrides for this resource Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /settings/{resourceType}/{resourceId} Reset resource settings Remove all setting overrides for this resource # Get effective settings for a resource (/docs/reference/api/settings/get-settings-resourcetype-resourceid-effective) Returns resolved settings with cascade from global (user preferences) → workspace → project. Only the caller's own settings are resolved. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /settings/{resourceType}/{resourceId}/effective Get effective settings for a resource Returns resolved settings with cascade from global (user preferences) → workspace → project. Only the caller's own settings are resolved. # Get raw resource settings (/docs/reference/api/settings/get-settings-resourcetype-resourceid) Returns only the caller's overrides for this specific resource (not cascaded). When no overrides exist a `{ message }` object is returned instead (still 200). Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /settings/{resourceType}/{resourceId} Get raw resource settings Returns only the caller's overrides for this specific resource (not cascaded). When no overrides exist a `{ message }` object is returned instead (still 200). # Get all resource settings (/docs/reference/api/settings/get-settings) Returns all resource-specific setting overrides for the current user Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /settings Get all resource settings Returns all resource-specific setting overrides for the current user # Update resource settings (/docs/reference/api/settings/put-settings-resourcetype-resourceid) Create or update the caller's setting overrides for a specific resource. Each supplied category is shallow-merged into the existing overrides for that resource; at least one category is required. No check is made that the caller is a member of the resource. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /settings/{resourceType}/{resourceId} Update resource settings Create or update the caller's setting overrides for a specific resource. Each supplied category is shallow-merged into the existing overrides for that resource; at least one category is required. No check is made that the caller is a member of the resource. # Resolve a short link (/docs/reference/api/shortlinks/get-shortlink-code) Resolves a short link code to its full deep link. This endpoint is publicly accessible and does not require authentication. The deep link can be used to navigate directly to a resource in the Nurama web app. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /shortlink/{code} Resolve a short link Resolves a short link code to its full deep link. This endpoint is publicly accessible and does not require authentication. The deep link can be used to navigate directly to a resource in the Nurama web app. # Create a short link for an asset (/docs/reference/api/shortlinks/post-assets-assetid-shortlink) Creates a short link for an asset. If a short link already exists for the asset with the same visibility setting, the existing short link is returned. Requires `canGetAsset` on the asset. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /assets/{assetId}/shortlink Create a short link for an asset Creates a short link for an asset. If a short link already exists for the asset with the same visibility setting, the existing short link is returned. Requires `canGetAsset` on the asset. # Create a short link for an asset (/docs/reference/api/assets/post-assets-assetid-shortlink) Creates a short link for an asset. If a short link already exists for the asset with the same visibility setting, the existing short link is returned. Requires `canGetAsset` on the asset. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /assets/{assetId}/shortlink Create a short link for an asset Creates a short link for an asset. If a short link already exists for the asset with the same visibility setting, the existing short link is returned. Requires `canGetAsset` on the asset. # Create a short link for a chat message (/docs/reference/api/shortlinks/post-chats-message-messageid-shortlink) Creates a short link for a chat message. If a short link already exists for the message, the existing short link is returned. Visibility is automatically inherited from the parent chat (e.g., 'creator' or 'reviewer' for topic chats, null for member chats). Requires `canCreateMessageShortLink` (read access to the message's chat). Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /chats/message/{messageId}/shortlink Create a short link for a chat message Creates a short link for a chat message. If a short link already exists for the message, the existing short link is returned. Visibility is automatically inherited from the parent chat (e.g., 'creator' or 'reviewer' for topic chats, null for member chats). Requires `canCreateMessageShortLink` (read access to the message's chat). # Create a short link for a chat message (/docs/reference/api/chats/post-chats-message-messageid-shortlink) Creates a short link for a chat message. If a short link already exists for the message, the existing short link is returned. Visibility is automatically inherited from the parent chat (e.g., 'creator' or 'reviewer' for topic chats, null for member chats). Requires `canCreateMessageShortLink` (read access to the message's chat). Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /chats/message/{messageId}/shortlink Create a short link for a chat message Creates a short link for a chat message. If a short link already exists for the message, the existing short link is returned. Visibility is automatically inherited from the parent chat (e.g., 'creator' or 'reviewer' for topic chats, null for member chats). Requires `canCreateMessageShortLink` (read access to the message's chat). # Get storage chart data (/docs/reference/api/storage/getStorageChart) Returns the average `sizeInBytes` of a resource's storage records per aggregation period between `startDate` and `endDate`, with missing periods filled from the previous value. Allowed when requesting your own user storage, or when you hold `canGet{ResourceType}Storage` (e.g. `canGetWorkspaceStorage`) on the resource. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /storage/chart/{resourceType}/{resourceId} Get storage chart data Returns the average `sizeInBytes` of a resource's storage records per aggregation period between `startDate` and `endDate`, with missing periods filled from the previous value. Allowed when requesting your own user storage, or when you hold `canGet{ResourceType}Storage` (e.g. `canGetWorkspaceStorage`) on the resource. # Get storage record (/docs/reference/api/storage/getStorageRecord) Returns the most recent storage record for a resource. Allowed when requesting your own user storage, or when you hold `canGet{ResourceType}Storage` on the resource. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /storage/{resourceType}/{resourceId} Get storage record Returns the most recent storage record for a resource. Allowed when requesting your own user storage, or when you hold `canGet{ResourceType}Storage` on the resource. # Delete a tag (/docs/reference/api/tags/delete-tags-tagid) Permanently deletes a tag. This action cannot be undone. Requires `canDeleteTag`. Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /tags/{tagId} Delete a tag Permanently deletes a tag. This action cannot be undone. Requires `canDeleteTag`. # Get tags for a resource (/docs/reference/api/tags/get-tags-ownerresourcetype-ownerresourceid) Retrieves all tags owned by a specific resource. Requires `canGetTags` on `ownerResourceId`. Currently only `ownerResourceType: project` is accepted. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /tags/{ownerResourceType}/{ownerResourceId} Get tags for a resource Retrieves all tags owned by a specific resource. Requires `canGetTags` on `ownerResourceId`. Currently only `ownerResourceType: project` is accepted. # Create a new tag (/docs/reference/api/tags/post-tags) Creates a new project-scoped tag. Tags can then be applied to the project's assets, folders, submissions, boards and tasks via their `/tag` endpoints. Requires `canCreateTag` on `ownerResourceId`. Currently only `ownerResourceType: project` is accepted. Tag names must be unique per owner (400 `tagSlugExists`). Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /tags Create a new tag Creates a new project-scoped tag. Tags can then be applied to the project's assets, folders, submissions, boards and tasks via their `/tag` endpoints. Requires `canCreateTag` on `ownerResourceId`. Currently only `ownerResourceType: project` is accepted. Tag names must be unique per owner (400 `tagSlugExists`). # Update a tag (/docs/reference/api/tags/put-tags-tagid) Updates an existing tag's name and/or color. When the name is changed, the slug is automatically regenerated. Requires `canUpdateTag`. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /tags/{tagId} Update a tag Updates an existing tag's name and/or color. When the name is changed, the slug is automatically regenerated. Requires `canUpdateTag`. # Update task details (/docs/reference/api/task-details/put-tasks-taskid-details) Update a task's subject, description, or assignee. Used for editing task content outside of board column operations. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /tasks/{taskId}/details Update task details Update a task's subject, description, or assignee. Used for editing task content outside of board column operations. # Unlink two tasks (/docs/reference/api/task-links/delete-tasks-taskid-links-linkedtaskid) Removes the link between two tasks in both directions. Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /tasks/{taskId}/links/{linkedTaskId} Unlink two tasks Removes the link between two tasks in both directions. # Get links for a task (/docs/reference/api/task-links/get-tasks-taskid-links) Returns all links for a task in both directions. Link types are normalized relative to the queried task (e.g., blocks/blockedBy are flipped when the task is in the linkedTaskId position). Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /tasks/{taskId}/links Get links for a task Returns all links for a task in both directions. Link types are normalized relative to the queried task (e.g., blocks/blockedBy are flipped when the task is in the linkedTaskId position). # Link two tasks (/docs/reference/api/task-links/post-tasks-taskid-links) Creates a relationship link between two tasks. Duplicate links are rejected. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /tasks/{taskId}/links Link two tasks Creates a relationship link between two tasks. Duplicate links are rejected. # Remove a task relation (/docs/reference/api/task-relations/delete-tasks-taskid-relations-relationid) Deletes the relation and notifies the board's project channels. Requires update access on the task's board. Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /tasks/{taskId}/relations/{relationId} Remove a task relation Deletes the relation and notifies the board's project channels. Requires update access on the task's board. # List task relations for a chat message (/docs/reference/api/task-relations/get-chat-messages-messageid-relations) Returns a page of relations whose resource is this chat message, populated like `GET /tasks/{taskId}/relations`. Requires read access to the message's chat. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /chat-messages/{messageId}/relations List task relations for a chat message Returns a page of relations whose resource is this chat message, populated like `GET /tasks/{taskId}/relations`. Requires read access to the message's chat. # List task relations for a chat (/docs/reference/api/task-relations/get-chats-chatid-relations) Returns a page of relations whose resource is this chat, populated like `GET /tasks/{taskId}/relations`. Requires read access to the chat. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /chats/{chatId}/relations List task relations for a chat Returns a page of relations whose resource is this chat, populated like `GET /tasks/{taskId}/relations`. Requires read access to the chat. # List task relations (/docs/reference/api/task-relations/get-tasks-taskid-relations) Returns a page of "Related To" entries for a task, populated with chat / message / asset / submission / public-link context and the user who created each relation. Rows whose chat the caller cannot read are filtered out (`totalResults` reflects the filtered page). Requires read access to the task's board. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /tasks/{taskId}/relations List task relations Returns a page of "Related To" entries for a task, populated with chat / message / asset / submission / public-link context and the user who created each relation. Rows whose chat the caller cannot read are filtered out (`totalResults` reflects the filtered page). Requires read access to the task's board. # Relate a chat or chat message to a task (/docs/reference/api/task-relations/post-tasks-taskid-relations) Creates a relation between a task and either a Chat or a single ChatMessage. The task must be on a board. Visibility rules are enforced server-side: - Submission and public chats can attach to any task. - Creator chats only attach to tasks on creator-visibility boards. - Reviewer chats only attach to tasks on reviewer-visibility boards. For chat messages the visibility is derived from the message's parent chat. Requires update access on the task's board plus read access to the chat / message being attached. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /tasks/{taskId}/relations Relate a chat or chat message to a task Creates a relation between a task and either a Chat or a single ChatMessage. The task must be on a board. Visibility rules are enforced server-side: - Submission and public chats can attach to any task. - Creator chats only attach to tasks on creator-visibility boards. - Reviewer chats only attach to tasks on reviewer-visibility boards. For chat messages the visibility is derived from the message's parent chat. Requires update access on the task's board plus read access to the chat / message being attached. # Delete a task (/docs/reference/api/tasks/delete-tasks-taskid) Permanently removes a single task. Requires `canRemove{Creator|Reviewer}BoardTask` for at least one visibility tier of the task's parent board, plus the `boards` workspace capability. Logs a `taskDeleted` event. Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /tasks/{taskId} Delete a task Permanently removes a single task. Requires `canRemove{Creator|Reviewer}BoardTask` for at least one visibility tier of the task's parent board, plus the `boards` workspace capability. Logs a `taskDeleted` event. # Get task event log (/docs/reference/api/tasks/get-tasks-taskid-events) Returns a paginated activity log for a task. Each event includes the actor (public user with avatar) and a structured `detail` object with the context needed to render a human-readable message. Event types: created, addedToBoard, moved, assigned, unassigned, updated, removedFromBoard, linked, unlinked, followed, unfollowed. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /tasks/{taskId}/events Get task event log Returns a paginated activity log for a task. Each event includes the actor (public user with avatar) and a structured `detail` object with the context needed to render a human-readable message. Event types: created, addedToBoard, moved, assigned, unassigned, updated, removedFromBoard, linked, unlinked, followed, unfollowed. # Get count of unacknowledged tasks for a project. (/docs/reference/api/tasks/get-tasks-unacknowledged-projectid) Counts the authenticated user's unacknowledged tasks in the project, split by visibility. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /tasks/unacknowledged/{projectId} Get count of unacknowledged tasks for a project. Counts the authenticated user's unacknowledged tasks in the project, split by visibility. # Get paginated list of tasks assigned to a user. (/docs/reference/api/tasks/get-tasks) Returns tasks where `assignedToId` is the authenticated user. Supports index (default) or cursor pagination; the cursor-only and index-only parameters are mutually exclusive with the other `paginate` mode. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /tasks Get paginated list of tasks assigned to a user. Returns tasks where `assignedToId` is the authenticated user. Supports index (default) or cursor pagination; the cursor-only and index-only parameters are mutually exclusive with the other `paginate` mode. # Create several board tasks in one request (/docs/reference/api/tasks/post-tasks-bulk-create) Single round-trip replacement for creating tasks one at a time. Every draft is created in order; per-draft failures are reported inline (`status: 'error'`) and do not abort the batch, so the response is always 200 once validation passes. Any logged-in user may call this; the per-board `canCreate{Creator|Reviewer}BoardTask` permission is checked for each draft (`no_permission`), as is that the board is active and belongs to `projectId` (`board_not_found`). Requires the `boards` workspace capability. Each created task gets the same side effects as `POST /boards/{boardId}/tasks` (event log, notification, `created` task event, topic chat) and, when `tagIds` is supplied, the tags are applied inline. When `announce` is provided and at least one task was created, a single assistant reply carrying every new task is posted in the source chat as a reply to `messageId`; announce failures never fail the request. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /tasks/bulk-create Create several board tasks in one request Single round-trip replacement for creating tasks one at a time. Every draft is created in order; per-draft failures are reported inline (`status: 'error'`) and do not abort the batch, so the response is always 200 once validation passes. Any logged-in user may call this; the per-board `canCreate{Creator|Reviewer}BoardTask` permission is checked for each draft (`no_permission`), as is that the board is active and belongs to `projectId` (`board_not_found`). Requires the `boards` workspace capability. Each created task gets the same side effects as `POST /boards/{boardId}/tasks` (event log, notification, `created` task event, topic chat) and, when `tagIds` is supplied, the tags are applied inline. When `announce` is provided and at least one task was created, a single assistant reply carrying every new task is posted in the source chat as a reply to `messageId`; announce failures never fail the request. # Acknowledge all of the current user's unacknowledged mention-tasks in a project. (/docs/reference/api/tasks/put-tasks-acknowledge-all-projectid) Sets `acknowledged: true` on every unacknowledged mention-task assigned to the authenticated user in the project. Idempotent — already-acknowledged tasks are left as-is and never re-counted. Scoped to the caller's own tasks; other users' tasks are untouched. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /tasks/acknowledge-all/{projectId} Acknowledge all of the current user's unacknowledged mention-tasks in a project. Sets `acknowledged: true` on every unacknowledged mention-task assigned to the authenticated user in the project. Idempotent — already-acknowledged tasks are left as-is and never re-counted. Scoped to the caller's own tasks; other users' tasks are untouched. # Toggle acknowledgement of a task. (/docs/reference/api/tasks/put-tasks-acknowledge-taskid) Flips the task's `acknowledged` flag. Requires `canUpdateOwnTaskStatus`. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /tasks/acknowledge/{taskId} Toggle acknowledgement of a task. Flips the task's `acknowledged` flag. Requires `canUpdateOwnTaskStatus`. # Follow a task (/docs/reference/api/tasks/put-tasks-taskid-follow) Add the current user to the task's followers list. Idempotent — following again has no effect. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /tasks/{taskId}/follow Follow a task Add the current user to the task's followers list. Idempotent — following again has no effect. # Tag a task (/docs/reference/api/tasks/put-tasks-taskid-tag) Add a project tag to a task. Idempotent — tagging again has no effect. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /tasks/{taskId}/tag Tag a task Add a project tag to a task. Idempotent — tagging again has no effect. # Unfollow a task (/docs/reference/api/tasks/put-tasks-taskid-unfollow) Remove the current user from the task's followers list. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /tasks/{taskId}/unfollow Unfollow a task Remove the current user from the task's followers list. # Untag a task (/docs/reference/api/tasks/put-tasks-taskid-untag) Remove a project tag from a task. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /tasks/{taskId}/untag Untag a task Remove a project tag from a task. # Update status of task. (/docs/reference/api/tasks/put-tasks-taskid) Requires `canUpdateOwnTaskStatus` (the task must be assigned to the caller, or the caller must hold an elevated task permission). Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /tasks/{taskId} Update status of task. Requires `canUpdateOwnTaskStatus` (the task must be assigned to the caller, or the caller must hold an elevated task permission). # Get public information about a user with shared membership. (/docs/reference/api/users/get-users-userid) Returns the public profile of a user who shares at least one workspace/project membership with the caller (or the caller's own public profile). Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /users/{userId} Get public information about a user with shared membership. Returns the public profile of a user who shares at least one workspace/project membership with the caller (or the caller's own public profile). # Get logged in user's details. (/docs/reference/api/users/get-users) Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /users Get logged in user's details. # Update the logged-in user's preferences. (/docs/reference/api/users/patch-users-preferences) Patch-merges the supplied fields into the user's `preferences` JSON. Omitted keys are left untouched. Used for notification settings, sound preferences, hide flags, and onboarding-Todo dismissals. Unknown keys (at any level) are rejected with 400. `dismissed.*` groups per-user UX opt-outs (todos, workspace-setup prompts, etc). The `dismissed` object is merged one level deep, so writing one inner key preserves the others. For todos, unknown ids and ids of Todos that are not dismissible (such as `verifyEmail`) are ignored. Machine-readable definition: https://docs.nurama.com/openapi.json ## PATCH /users/preferences Update the logged-in user's preferences. Patch-merges the supplied fields into the user's `preferences` JSON. Omitted keys are left untouched. Used for notification settings, sound preferences, hide flags, and onboarding-Todo dismissals. Unknown keys (at any level) are rejected with 400. `dismissed.*` groups per-user UX opt-outs (todos, workspace-setup prompts, etc). The `dismissed` object is merged one level deep, so writing one inner key preserves the others. For todos, unknown ids and ids of Todos that are not dismissible (such as `verifyEmail`) are ignored. # Create or update an avatar. (/docs/reference/api/users/post-users-avatar) Creates the avatar asset and returns signed upload links for it. Any existing avatar asset is marked `pendingDelete`. POST and PUT are identical. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /users/avatar Create or update an avatar. Creates the avatar asset and returns signed upload links for it. Any existing avatar asset is marked `pendingDelete`. POST and PUT are identical. # Create or update an avatar. (/docs/reference/api/users/put-users-avatar) Creates the avatar asset and returns signed upload links for it. Any existing avatar asset is marked `pendingDelete`. POST and PUT are identical. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /users/avatar Create or update an avatar. Creates the avatar asset and returns signed upload links for it. Any existing avatar asset is marked `pendingDelete`. POST and PUT are identical. # Get the latest git commit hash (/docs/reference/api/version/get-version-commit) Returns the latest git commit hash and build timestamp of the deployed application. Public — no authentication required. The commit is injected during the build process, so accurate values are only available on deployed builds. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /version/commit Get the latest git commit hash Returns the latest git commit hash and build timestamp of the deployed application. Public — no authentication required. The commit is injected during the build process, so accurate values are only available on deployed builds. # Delete a webhook subscription (/docs/reference/api/webhook-subscriptions/delete-workspaces-workspaceid-webhooks-webhookid) Permanently removes the subscription and its delivery attempts. Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /workspaces/{workspaceId}/webhooks/{webhookId} Delete a webhook subscription Permanently removes the subscription and its delivery attempts. # List delivery attempts (/docs/reference/api/webhook-subscriptions/get-workspaces-workspaceid-webhooks-webhookid-deliveries) Cursor-paginated delivery log, newest first. Each retry of a notification is its own attempt. Pass the returned `nextCursor` back as `cursor` to fetch the next page. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /workspaces/{workspaceId}/webhooks/{webhookId}/deliveries List delivery attempts Cursor-paginated delivery log, newest first. Each retry of a notification is its own attempt. Pass the returned `nextCursor` back as `cursor` to fetch the next page. # Get a webhook subscription (/docs/reference/api/webhook-subscriptions/get-workspaces-workspaceid-webhooks-webhookid) Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /workspaces/{workspaceId}/webhooks/{webhookId} Get a webhook subscription # List the workspace's webhook subscriptions (/docs/reference/api/webhook-subscriptions/get-workspaces-workspaceid-webhooks) Newest first. Secrets are never included. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /workspaces/{workspaceId}/webhooks List the workspace's webhook subscriptions Newest first. Secrets are never included. # Update a webhook subscription (/docs/reference/api/webhook-subscriptions/patch-workspaces-workspaceid-webhooks-webhookid) Partial update; at least one field is required. `status` accepts only the admin-controllable transitions `active` and `paused` — setting `active` on a `failedOut` subscription re-enables it and clears `failedOutAt` / `failedOutReason`. Pass `expiresAt: null` to clear an expiry. URL and event changes go through the same checks as create. Machine-readable definition: https://docs.nurama.com/openapi.json ## PATCH /workspaces/{workspaceId}/webhooks/{webhookId} Update a webhook subscription Partial update; at least one field is required. `status` accepts only the admin-controllable transitions `active` and `paused` — setting `active` on a `failedOut` subscription re-enables it and clears `failedOutAt` / `failedOutReason`. Pass `expiresAt: null` to clear an expiry. URL and event changes go through the same checks as create. # Replay a delivery (/docs/reference/api/webhook-subscriptions/post-workspaces-workspaceid-webhooks-webhookid-deliveries-attemptid-replay) Re-queues the attempt's notification for delivery. A NEW attempt is created (the original is kept for the audit trail) and the notification is queued for delivery again. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /workspaces/{workspaceId}/webhooks/{webhookId}/deliveries/{attemptId}/replay Replay a delivery Re-queues the attempt's notification for delivery. A NEW attempt is created (the original is kept for the audit trail) and the notification is queued for delivery again. # Rotate the signing secret (/docs/reference/api/webhook-subscriptions/post-workspaces-workspaceid-webhooks-webhookid-rotate-secret) Generates a new HMAC signing secret and returns it once. Deliveries signed after this call use the new secret immediately; update the receiver's verification config first if you need zero-downtime rotation. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /workspaces/{workspaceId}/webhooks/{webhookId}/rotate-secret Rotate the signing secret Generates a new HMAC signing secret and returns it once. Deliveries signed after this call use the new secret immediately; update the receiver's verification config first if you need zero-downtime rotation. # Queue a test delivery (/docs/reference/api/webhook-subscriptions/post-workspaces-workspaceid-webhooks-webhookid-test) Fires a synthetic `webhook.test` event through the normal delivery pipeline. The subscription does not need `webhook.test` in its `events` list. The response only confirms the event was queued — inspect the delivery log (`GET .../deliveries`) for the outcome. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /workspaces/{workspaceId}/webhooks/{webhookId}/test Queue a test delivery Fires a synthetic `webhook.test` event through the normal delivery pipeline. The subscription does not need `webhook.test` in its `events` list. The response only confirms the event was queued — inspect the delivery log (`GET .../deliveries`) for the outcome. # Create a webhook subscription (/docs/reference/api/webhook-subscriptions/post-workspaces-workspaceid-webhooks) Registers a delivery URL for the given events and returns the new subscription together with its `signingSecret` — the only time the secret is returned other than on rotate. The URL must be `http(s)`, ≤ 2048 chars, and must not point at a private / loopback / link-local address (literal IPs are rejected outright; hostnames are DNS-resolved and checked). Deployments that require HTTPS reject `http://` URLs except for `localhost`. Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /workspaces/{workspaceId}/webhooks Create a webhook subscription Registers a delivery URL for the given events and returns the new subscription together with its `signingSecret` — the only time the secret is returned other than on rotate. The URL must be `http(s)`, ≤ 2048 chars, and must not point at a private / loopback / link-local address (literal IPs are rejected outright; hostnames are DNS-resolved and checked). Deployments that require HTTPS reject `http://` URLs except for `localhost`. # Change a workspace's status to 'pendingDelete' for later cleanup. (/docs/reference/api/workspaces/delete-workspaces-workspaceid) Requires `canDeleteWorkspace`, which only the workspace OWNER holds — not `canUpdateWorkspace`, which admins also hold. Deleting the workspace is the one way an admin could take it away from its owner, so it costs the owner-only right. Machine-readable definition: https://docs.nurama.com/openapi.json ## DELETE /workspaces/{workspaceId} Change a workspace's status to 'pendingDelete' for later cleanup. Requires `canDeleteWorkspace`, which only the workspace OWNER holds — not `canUpdateWorkspace`, which admins also hold. Deleting the workspace is the one way an admin could take it away from its owner, so it costs the owner-only right. # Get projects within a specific workspace (/docs/reference/api/workspaces/get-workspaces-workspaceid-projects) Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /workspaces/{workspaceId}/projects Get projects within a specific workspace # Get details of a specific workspace (/docs/reference/api/workspaces/get-workspaces-workspaceid) Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /workspaces/{workspaceId} Get details of a specific workspace # Get all workspaces for the authenticated user (/docs/reference/api/workspaces/get-workspaces) Returns every workspace the caller holds a membership in, each stamped with the caller's `roles` and the workspace's `capabilities`. Sort with the `sort` query parameter (deep-object style, e.g. `?sort[name]=1&sort[createdAt]=-1`). A `sort` object in the request body is still accepted as a deprecated alias for one release. Machine-readable definition: https://docs.nurama.com/openapi.json ## GET /workspaces Get all workspaces for the authenticated user Returns every workspace the caller holds a membership in, each stamped with the caller's `roles` and the workspace's `capabilities`. Sort with the `sort` query parameter (deep-object style, e.g. `?sort[name]=1&sort[createdAt]=-1`). A `sort` object in the request body is still accepted as a deprecated alias for one release. # Create or update workspace icon. (deprecated alias; use PUT) (/docs/reference/api/workspaces/post-workspaces-workspaceid-icon) Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /workspaces/{workspaceId}/icon (deprecated) Create or update workspace icon. (deprecated alias; use PUT) # Create or update workspace logo. (deprecated alias; use PUT) (/docs/reference/api/workspaces/post-workspaces-workspaceid-logo) Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /workspaces/{workspaceId}/logo (deprecated) Create or update workspace logo. (deprecated alias; use PUT) # Create a new workspace (/docs/reference/api/workspaces/post-workspaces) Machine-readable definition: https://docs.nurama.com/openapi.json ## POST /workspaces Create a new workspace # Create or update workspace icon. (/docs/reference/api/workspaces/put-workspaces-workspaceid-icon) Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /workspaces/{workspaceId}/icon Create or update workspace icon. # Create or update workspace logo. (/docs/reference/api/workspaces/put-workspaces-workspaceid-logo) Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /workspaces/{workspaceId}/logo Create or update workspace logo. # Update a single workspace setting. (/docs/reference/api/workspaces/put-workspaces-workspaceid-settings-name) Sets one key of the workspace's `settings` JSON column. The `name` path parameter selects the setting and determines the type `value` must have (booleans for the toggles, bounded integers for the credit budgets, strings for the pre-prompts, `{ toolName: boolean|null }` maps for `aiChatTools` / `aiAssistTools`). Requires `canManageWorkspaceSettings` on the workspace. Setting-specific behaviour: - `autoTopUpEnabled: true` is refused with `autoTopUpRequiresPriorTopUp` until the workspace has made at least one manual credit top-up. - Flipping `boardsEnabled` true→false schedules every board in the workspace for deletion after a 48h grace window; flipping it back within the window restores them. Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /workspaces/{workspaceId}/settings/{name} Update a single workspace setting. Sets one key of the workspace's `settings` JSON column. The `name` path parameter selects the setting and determines the type `value` must have (booleans for the toggles, bounded integers for the credit budgets, strings for the pre-prompts, `{ toolName: boolean|null }` maps for `aiChatTools` / `aiAssistTools`). Requires `canManageWorkspaceSettings` on the workspace. Setting-specific behaviour: - `autoTopUpEnabled: true` is refused with `autoTopUpRequiresPriorTopUp` until the workspace has made at least one manual credit top-up. - Flipping `boardsEnabled` true→false schedules every board in the workspace for deletion after a 48h grace window; flipping it back within the window restores them. # Update details of a specific workspace (/docs/reference/api/workspaces/put-workspaces-workspaceid) Machine-readable definition: https://docs.nurama.com/openapi.json ## PUT /workspaces/{workspaceId} Update details of a specific workspace # WebSocket events (/docs/reference/websocket) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Websocket (Socket.io) events emitted by the websocket server (hosted separately from the REST API). **Connecting / channels.** Every channel is a Socket.io namespace named `/{resourceType}/{resourceId}[/{visibility}]`, where resourceType is one of workspace, project, user, chat, asset, submission, task or public, resourceId is a UUID (or legacy 24-char hex id) and the optional visibility is creator, reviewer or public. Public release channels are `/public/{token}` (10-character public token, no visibility suffix). Any other namespace is refused. Authenticate by passing `query: { token }` on the handshake: a user JWT, a personal access token or a bot API key (bot keys must connect through a configured bot gateway hostname). `/public/{token}` namespaces need no handshake token (the token in the namespace is validated instead); authenticated users may also join them. Failures surface as `connect_error` with message `forbidden` (invalid credentials or no permission) or `badRequest` (malformed channel / permission lookup error). **Permissions.** A user may only join their own `/user/{userId}`. `/project/{id}/creator`, `/reviewer` and `/public` require canGetProjectCreatorNotifications, canGetProjectReviewerNotifications and canGetProjectPublicNotifications respectively; every other channel requires canGet\{ResourceType}Notifications (direct or inherited). **Server -> client events:** `notification` (every notification event documented below, emitted on each channel in the notification's channels list; the payload `type` selects the schema), `tokenEvent`, `typing:start` / `typing:stop` and the `collab:*` events (only on `/chat/{chatId}` namespaces). **Client -> server events:** `ws:probe`, `typing:start` / `typing:stop`, `collab:*`. Sockets whose JWT expired or was blacklisted, or whose bot key was revoked, receive `tokenEvent` and are disconnected shortly after. Each event type below is documented using 'get' to represent the emitted event payload under the '200' response schema. **Keys marked with (\*) will be deprecated in a future release and should not be used for new development and should be replaced with values and objects in the changes key in existing implementations.** ## Servers [#servers] | Server | URL | Notes | | ------------ | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `production` | `wss://ws.nurama.com/socket.io` | WebSocket server for user credentials (JWT or personal access token). Socket.IO transport: connect a Socket.IO client to the channel address, not a raw WebSocket. | | `bots` | `wss://bot-ws.nurama.com/socket.io` | WebSocket server for bot API keys. | ## Channels [#channels] Channels are Socket.IO namespaces. Connect a Socket.IO client to the namespace address; do not open a raw WebSocket. ### Resource namespace [#resource-namespace] Address: `/\{resourceType\}/\{resourceId\}/\{visibility\}` Notifications for one workspace, project, user, chat, asset, submission or task. Socket.IO namespace named after the resource. The `/{visibility}` segment is optional: connect to `/{resourceType}/{resourceId}` for the default channel. Requires a handshake `token`. A user may only join their own `/user/{userId}`; `/project/{id}/creator`, `/reviewer` and `/public` require canGetProjectCreatorNotifications, canGetProjectReviewerNotifications and canGetProjectPublicNotifications; every other channel requires canGet\{ResourceType}Notifications (direct or inherited). | Parameter | Description | | -------------- | -------------------------------------------------------------------------- | | `resourceType` | Type of the resource whose events to receive. | | `resourceId` | UUID (or legacy 24-character hex id) of the resource. | | `visibility` | Optional visibility sub-channel; omit the segment for the default channel. | ### Public release namespace [#public-release-namespace] Address: `/public/\{token\}` Notifications for one public release, authenticated by the token in the namespace name. No handshake `token` is needed (authenticated users may still send one). No visibility suffix. Typing indicators for chats that belong to the release are relayed here as well. | Parameter | Description | | --------- | ----------------------------------------------- | | `token` | 10-character alphanumeric public release token. | ### Collab session namespace [#collab-session-namespace] Address: `/chat/\{resourceId\}` Real-time collaboration relay (cursors, drawing, presenter control) between the sockets of one chat. The relay runs on namespaces starting with `/chat/`; the same connection also receives the notification events of the resource namespace. Relayed payloads are enriched server-side with the authenticated user identity, so client supplied identity keys are overwritten. | Parameter | Description | | ------------ | ----------------- | | `resourceId` | UUID of the chat. | ## Events [#events] | Event | Direction | Channel | Summary | | --------------------------------------------------------------------------------------------------------------- | --------------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [Receive notification](/docs/reference/websocket/events/receive-notification) | server → client | `resource` | Envelope event on which every notification listed in this section is delivered. The type property tells you which event schema applies. | | [Receive notification](/docs/reference/websocket/events/receive-public-notification) | server → client | `public` | Envelope event on which every notification listed in this section is delivered. The type property tells you which event schema applies. | | [Receive tokenEvent](/docs/reference/websocket/events/receive-tokenevent) | server → client | `resource` | Emitted by the server right before it force-disconnects a socket whose credential is no longer valid. | | [Emit ws:probe](/docs/reference/websocket/events/send-ws-probe) | client → server | `resource` | Client -> server liveness probe. Emit with an acknowledgement callback; the server acks immediately with no payload. | | [Emit typing:start](/docs/reference/websocket/events/send-typing-start) | client → server | `resource` | Ephemeral typing indicator. Client -> server: emit \{ chatId }. Server -> clients: relayed with the authenticated userId to every other socket on the chat channels. | | [Receive typing:start](/docs/reference/websocket/events/receive-typing-start) | server → client | `resource` | Ephemeral typing indicator. Client -> server: emit \{ chatId }. Server -> clients: relayed with the authenticated userId to every other socket on the chat channels. | | [Emit typing:stop](/docs/reference/websocket/events/send-typing-stop) | client → server | `resource` | Ephemeral typing indicator stop. Client -> server: emit \{ chatId }. Server -> clients: relayed with the authenticated userId to every other socket on the chat channels. | | [Receive typing:stop](/docs/reference/websocket/events/receive-typing-stop) | server → client | `resource` | Ephemeral typing indicator stop. Client -> server: emit \{ chatId }. Server -> clients: relayed with the authenticated userId to every other socket on the chat channels. | | [Emit collab:join](/docs/reference/websocket/events/send-collab-join) | client → server | `collab` | A user joined the collab session on this chat namespace (broadcast to the other members). | | [Receive collab:join](/docs/reference/websocket/events/receive-collab-join) | server → client | `collab` | A user joined the collab session on this chat namespace (broadcast to the other members). | | [Emit collab:leave](/docs/reference/websocket/events/send-collab-leave) | client → server | `collab` | A user left the collab session (explicit collab:leave from the client or socket disconnect). | | [Receive collab:leave](/docs/reference/websocket/events/receive-collab-leave) | server → client | `collab` | A user left the collab session (explicit collab:leave from the client or socket disconnect). | | [Emit collab:cursor-move](/docs/reference/websocket/events/send-collab-cursor-move) | client → server | `collab` | Remote cursor position update (percentage coordinates). | | [Receive collab:cursor-move](/docs/reference/websocket/events/receive-collab-cursor-move) | server → client | `collab` | Remote cursor position update (percentage coordinates). | | [Emit collab:cursor-hide](/docs/reference/websocket/events/send-collab-cursor-hide) | client → server | `collab` | Remote cursor left the asset area. | | [Receive collab:cursor-hide](/docs/reference/websocket/events/receive-collab-cursor-hide) | server → client | `collab` | Remote cursor left the asset area. | | [Emit collab:path-start](/docs/reference/websocket/events/send-collab-path-start) | client → server | `collab` | Pen drawing started. | | [Receive collab:path-start](/docs/reference/websocket/events/receive-collab-path-start) | server → client | `collab` | Pen drawing started. | | [Emit collab:path-update](/docs/reference/websocket/events/send-collab-path-update) | client → server | `collab` | Pen drawing continued with additional points. | | [Receive collab:path-update](/docs/reference/websocket/events/receive-collab-path-update) | server → client | `collab` | Pen drawing continued with additional points. | | [Emit collab:path-end](/docs/reference/websocket/events/send-collab-path-end) | client → server | `collab` | Pen drawing completed. | | [Receive collab:path-end](/docs/reference/websocket/events/receive-collab-path-end) | server → client | `collab` | Pen drawing completed. | | [Emit collab:path-clear](/docs/reference/websocket/events/send-collab-path-clear) | client → server | `collab` | Drawn path(s) cleared. With pathId only that path is cleared, otherwise all paths of the user. | | [Receive collab:path-clear](/docs/reference/websocket/events/receive-collab-path-clear) | server → client | `collab` | Drawn path(s) cleared. With pathId only that path is cleared, otherwise all paths of the user. | | [Emit collab:click](/docs/reference/websocket/events/send-collab-click) | client → server | `collab` | Click ripple at percentage coordinates. | | [Receive collab:click](/docs/reference/websocket/events/receive-collab-click) | server → client | `collab` | Click ripple at percentage coordinates. | | [Emit collab:color-change](/docs/reference/websocket/events/send-collab-color-change) | client → server | `collab` | User changed their annotation colour. The server stores the new colour on the socket, so subsequent relayed events carry it. | | [Receive collab:color-change](/docs/reference/websocket/events/receive-collab-color-change) | server → client | `collab` | User changed their annotation colour. The server stores the new colour on the socket, so subsequent relayed events carry it. | | [Emit collab:region-create](/docs/reference/websocket/events/send-collab-region-create) | client → server | `collab` | Audio/video region created on the waveform/timeline. | | [Receive collab:region-create](/docs/reference/websocket/events/receive-collab-region-create) | server → client | `collab` | Audio/video region created on the waveform/timeline. | | [Emit collab:region-remove](/docs/reference/websocket/events/send-collab-region-remove) | client → server | `collab` | Region removed. | | [Receive collab:region-remove](/docs/reference/websocket/events/receive-collab-region-remove) | server → client | `collab` | Region removed. | | [Emit collab:zoom-sync](/docs/reference/websocket/events/send-collab-zoom-sync) | client → server | `collab` | Zoom level broadcast (followers of the presenter apply it). | | [Receive collab:zoom-sync](/docs/reference/websocket/events/receive-collab-zoom-sync) | server → client | `collab` | Zoom level broadcast (followers of the presenter apply it). | | [Emit collab:playback-sync](/docs/reference/websocket/events/send-collab-playback-sync) | client → server | `collab` | Play/pause/seek state broadcast by the presenter to the other members. | | [Receive collab:playback-sync](/docs/reference/websocket/events/receive-collab-playback-sync) | server → client | `collab` | Play/pause/seek state broadcast by the presenter to the other members. | | [Receive collab:playback-sync:rejected](/docs/reference/websocket/events/receive-collab-playback-sync-rejected) | server → client | `collab` | Server -> sender only: the sender is not the presenter, so its collab:playback-sync was dropped. Carries the real presenter and playback position so the client can snap back to follower mode. | | [Receive collab:presenter-assign](/docs/reference/websocket/events/receive-collab-presenter-assign) | server → client | `collab` | Server -> all sockets in the namespace: a new presenter was assigned. | | [Receive collab:presenter-state](/docs/reference/websocket/events/receive-collab-presenter-state) | server → client | `collab` | Server -> joining socket: current presenter and playback state when a presenter already exists. | | [Emit collab:presenter-request](/docs/reference/websocket/events/send-collab-presenter-request) | client → server | `collab` | Request for presenter control. From an admin it is granted immediately (collab:presenter-assign, reason admin-takeover); from a non-admin it is relayed to the current presenter socket only. | | [Receive collab:presenter-request](/docs/reference/websocket/events/receive-collab-presenter-request) | server → client | `collab` | Request for presenter control. From an admin it is granted immediately (collab:presenter-assign, reason admin-takeover); from a non-admin it is relayed to the current presenter socket only. | | [Emit collab:presenter-takeover](/docs/reference/websocket/events/send-collab-presenter-takeover) | client → server | `collab` | Client -> server only: an admin or the current presenter hands presenter control to a target user. Results in a collab:presenter-assign (reason admin-takeover) to everyone; nothing is relayed under this name. | | [Emit collab:state-request](/docs/reference/websocket/events/send-collab-state-request) | client → server | `collab` | Server -> the earliest joined other member: asks it to send its current annotation state to a late joiner (collab:state-response). | | [Receive collab:state-request](/docs/reference/websocket/events/receive-collab-state-request) | server → client | `collab` | Server -> the earliest joined other member: asks it to send its current annotation state to a late joiner (collab:state-response). | | [Emit collab:state-response](/docs/reference/websocket/events/send-collab-state-response) | client → server | `collab` | Server -> the requesting socket only: sanitised snapshot of paths, regions and zoom provided by an existing member. | | [Receive collab:state-response](/docs/reference/websocket/events/receive-collab-state-response) | server → client | `collab` | Server -> the requesting socket only: sanitised snapshot of paths, regions and zoom provided by an existing member. | | [Receive collab:members](/docs/reference/websocket/events/receive-collab-members) | server → client | `collab` | Server -> joining socket: the members already present in the namespace. | | [Receive collab:self-color](/docs/reference/websocket/events/receive-collab-self-color) | server → client | `collab` | Server -> joining socket: the annotation colour assigned to it for this session. | ## Notification types [#notification-types] 126 notification types are delivered inside the `notification` envelope. See [Notification types](/docs/reference/websocket/notifications). # Receive collab:click (/docs/reference/websocket/events/receive-collab-click) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `collab` channel. Socket.IO event name: `collab:click` . Click ripple at percentage coordinates. Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. ## Payload: `collab:click` [#payload-collabclick] Payload of the 'collab:click' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `x` | `number` | no | | | `y` | `number` | no | | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Receive collab:color-change (/docs/reference/websocket/events/receive-collab-color-change) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `collab` channel. Socket.IO event name: `collab:color-change` . User changed their annotation colour. The server stores the new colour on the socket, so subsequent relayed events carry it. Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. ## Payload: `collab:color-change` [#payload-collabcolor-change] Payload of the 'collab:color-change' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Receive collab:cursor-hide (/docs/reference/websocket/events/receive-collab-cursor-hide) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `collab` channel. Socket.IO event name: `collab:cursor-hide` . Remote cursor left the asset area. Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. ## Payload: `collab:cursor-hide` [#payload-collabcursor-hide] Payload of the 'collab:cursor-hide' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Receive collab:cursor-move (/docs/reference/websocket/events/receive-collab-cursor-move) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `collab` channel. Socket.IO event name: `collab:cursor-move` . Remote cursor position update (percentage coordinates). Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. ## Payload: `collab:cursor-move` [#payload-collabcursor-move] Payload of the 'collab:cursor-move' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `x` | `number` | no | Client supplied X position as a percentage of the asset area. | | `y` | `number` | no | Client supplied Y position as a percentage of the asset area. | | `visible` | `boolean` | no | Client supplied visibility flag. | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Receive collab:join (/docs/reference/websocket/events/receive-collab-join) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `collab` channel. Socket.IO event name: `collab:join` . A user joined the collab session on this chat namespace (broadcast to the other members). Client emits collab:join with optional \{ preferredAnnotationColor }. Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. The joining socket additionally receives collab:self-color, collab:members (if others are present) and either collab:presenter-assign (first member) or collab:presenter-state. ## Payload: `collab:join` [#payload-collabjoin] Payload of the 'collab:join' socket event. | Property | Type | Required | Description | | -------------------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `preferredAnnotationColor` | `string` | no | Echo of the colour the client asked for, if it sent one. | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Receive collab:leave (/docs/reference/websocket/events/receive-collab-leave) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `collab` channel. Socket.IO event name: `collab:leave` . A user left the collab session (explicit collab:leave from the client or socket disconnect). Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. On disconnect the server emits it on behalf of the leaving socket; if they were the presenter a collab:presenter-assign (reason transfer-on-leave) follows. ## Payload: `collab:leave` [#payload-collableave] Payload of the 'collab:leave' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Receive collab:members (/docs/reference/websocket/events/receive-collab-members) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `collab` channel. Socket.IO event name: `collab:members` . Server -> joining socket: the members already present in the namespace. Sent right after collab:join when at least one other authenticated member is connected. ## Payload: `collab:members` [#payload-collabmembers] Payload of the 'collab:members' socket event. | Property | Type | Required | Description | | ----------- | ---------- | -------- | ---------------------------------------------------------------------------- | | `members` | `object[]` | no | Member objects: \{ userId, displayName, color, avatarUrl, annotationColor }. | | `timestamp` | `integer` | no | | # Receive collab:path-clear (/docs/reference/websocket/events/receive-collab-path-clear) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `collab` channel. Socket.IO event name: `collab:path-clear` . Drawn path(s) cleared. With pathId only that path is cleared, otherwise all paths of the user. Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. ## Payload: `collab:path-clear` [#payload-collabpath-clear] Payload of the 'collab:path-clear' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `pathId` | `string \| null` | no | | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Receive collab:path-end (/docs/reference/websocket/events/receive-collab-path-end) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `collab` channel. Socket.IO event name: `collab:path-end` . Pen drawing completed. Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. ## Payload: `collab:path-end` [#payload-collabpath-end] Payload of the 'collab:path-end' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `pathId` | `string` | no | | | `pathData` | `string` | no | Final SVG path data. | | `fadeDuration` | `number` | no | | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Receive collab:path-start (/docs/reference/websocket/events/receive-collab-path-start) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `collab` channel. Socket.IO event name: `collab:path-start` . Pen drawing started. Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. ## Payload: `collab:path-start` [#payload-collabpath-start] Payload of the 'collab:path-start' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `pathId` | `string` | no | Client generated path ID. | | `strokeColor` | `string` | no | | | `strokeWidth` | `number` | no | | | `points` | `object[]` | no | Initial point(s) of the path (client defined shape). | | `fadeDuration` | `number` | no | Milliseconds after which the path fades (0 = persistent). | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Receive collab:path-update (/docs/reference/websocket/events/receive-collab-path-update) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `collab` channel. Socket.IO event name: `collab:path-update` . Pen drawing continued with additional points. Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. ## Payload: `collab:path-update` [#payload-collabpath-update] Payload of the 'collab:path-update' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `pathId` | `string` | no | | | `points` | `object[]` | no | Additional points appended to the path. | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Receive collab:playback-sync:rejected (/docs/reference/websocket/events/receive-collab-playback-sync-rejected) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `collab` channel. Socket.IO event name: `collab:playback-sync:rejected` . Server -> sender only: the sender is not the presenter, so its collab:playback-sync was dropped. Carries the real presenter and playback position so the client can snap back to follower mode. Emitted only to the rejected sender. ## Payload: `collab:playback-sync:rejected` [#payload-collabplayback-syncrejected] Payload of the 'collab:playback-sync:rejected' socket event. | Property | Type | Required | Description | | ---------------------- | ----------------- | -------- | -------------------------------------------------------------------- | | `reason` | `"not-presenter"` | no | | | `presenterId` | `string \| null` | no | | | `presenterDisplayName` | `string \| null` | no | | | `playback` | `object` | no | \{ currentTime: number, playing: boolean } of the current presenter. | | `timestamp` | `integer` | no | | # Receive collab:playback-sync (/docs/reference/websocket/events/receive-collab-playback-sync) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `collab` channel. Socket.IO event name: `collab:playback-sync` . Play/pause/seek state broadcast by the presenter to the other members. Only the current presenter socket may broadcast; other senders receive collab:playback-sync:rejected instead and nothing is relayed. Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. The server also stores currentTime/playing as the namespace playback state. ## Payload: `collab:playback-sync` [#payload-collabplayback-sync] Payload of the 'collab:playback-sync' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `action` | `string` | no | Client supplied action (e.g. 'play', 'pause', 'seek'). | | `currentTime` | `number` | no | | | `playing` | `boolean` | no | | | `duration` | `number` | no | | | `playbackRate` | `number` | no | | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Receive collab:presenter-assign (/docs/reference/websocket/events/receive-collab-presenter-assign) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `collab` channel. Socket.IO event name: `collab:presenter-assign` . Server -> all sockets in the namespace: a new presenter was assigned. Emitted when the first member joins (first-join), when an admin takes over or a presenter/admin reassigns via collab:presenter-takeover (admin-takeover), and when the presenter disconnects and control transfers to an admin or the earliest joined member (transfer-on-leave). ## Payload: `collab:presenter-assign` [#payload-collabpresenter-assign] Payload of the 'collab:presenter-assign' socket event. | Property | Type | Required | Description | | ---------------------- | --------------------------------------------------------- | -------- | ----------- | | `presenterId` | `string` | no | | | `presenterDisplayName` | `string \| null` | no | | | `reason` | `"first-join" \| "admin-takeover" \| "transfer-on-leave"` | no | | | `timestamp` | `integer` | no | | # Receive collab:presenter-request (/docs/reference/websocket/events/receive-collab-presenter-request) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `collab` channel. Socket.IO event name: `collab:presenter-request` . Request for presenter control. From an admin it is granted immediately (collab:presenter-assign, reason admin-takeover); from a non-admin it is relayed to the current presenter socket only. Client emits collab:presenter-request (any data). Client -> server -> the current presenter socket only. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. requesterId / requesterDisplayName duplicate userId / displayName. ## Payload: `collab:presenter-request` [#payload-collabpresenter-request] Payload of the 'collab:presenter-request' socket event. | Property | Type | Required | Description | | ---------------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `requesterId` | `string` | no | | | `requesterDisplayName` | `string \| null` | no | | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Receive collab:presenter-state (/docs/reference/websocket/events/receive-collab-presenter-state) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `collab` channel. Socket.IO event name: `collab:presenter-state` . Server -> joining socket: current presenter and playback state when a presenter already exists. Sent instead of collab:presenter-assign to a socket that joins a namespace that already has a presenter. ## Payload: `collab:presenter-state` [#payload-collabpresenter-state] Payload of the 'collab:presenter-state' socket event. | Property | Type | Required | Description | | ---------------------- | ---------------- | -------- | ------------------------------------------- | | `presenterId` | `string` | no | | | `presenterDisplayName` | `string \| null` | no | | | `playback` | `object` | no | \{ currentTime: number, playing: boolean }. | | `timestamp` | `integer` | no | | # Receive collab:region-create (/docs/reference/websocket/events/receive-collab-region-create) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `collab` channel. Socket.IO event name: `collab:region-create` . Audio/video region created on the waveform/timeline. Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. ## Payload: `collab:region-create` [#payload-collabregion-create] Payload of the 'collab:region-create' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `regionId` | `string` | no | | | `startTime` | `number` | no | | | `endTime` | `number` | no | | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Receive collab:region-remove (/docs/reference/websocket/events/receive-collab-region-remove) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `collab` channel. Socket.IO event name: `collab:region-remove` . Region removed. Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. ## Payload: `collab:region-remove` [#payload-collabregion-remove] Payload of the 'collab:region-remove' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `regionId` | `string` | no | | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Receive collab:self-color (/docs/reference/websocket/events/receive-collab-self-color) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `collab` channel. Socket.IO event name: `collab:self-color` . Server -> joining socket: the annotation colour assigned to it for this session. The preferred colour is kept when it is not the default (#FF0000); otherwise the first unused palette colour is assigned. ## Payload: `collab:self-color` [#payload-collabself-color] Payload of the 'collab:self-color' socket event. | Property | Type | Required | Description | | ----------------- | -------- | -------- | ----------- | | `annotationColor` | `string` | no | | # Receive collab:state-request (/docs/reference/websocket/events/receive-collab-state-request) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `collab` channel. Socket.IO event name: `collab:state-request` . Server -> the earliest joined other member: asks it to send its current annotation state to a late joiner (collab:state-response). Emitted automatically when a socket joins a namespace with existing members, and again when a client retries by emitting collab:state-request itself. ## Payload: `collab:state-request` [#payload-collabstate-request] Payload of the 'collab:state-request' socket event. | Property | Type | Required | Description | | ------------------- | --------- | -------- | -------------------------------------------------- | | `requesterId` | `string` | no | User ID of the late joiner. | | `requesterSocketId` | `string` | no | Socket ID to address the collab:state-response to. | | `timestamp` | `integer` | no | | # Receive collab:state-response (/docs/reference/websocket/events/receive-collab-state-response) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `collab` channel. Socket.IO event name: `collab:state-response` . Server -> the requesting socket only: sanitised snapshot of paths, regions and zoom provided by an existing member. Client emits collab:state-response with \{ requesterSocketId, paths, regions, zoom }; the server validates/truncates (max 200 paths and 200 regions, string length limits) and forwards it only to requesterSocketId. ## Payload: `collab:state-response` [#payload-collabstate-response] Payload of the 'collab:state-response' socket event. | Property | Type | Required | Description | | ------------------- | ---------- | -------- | ----------------------------------------------------------------------------------------- | | `requesterSocketId` | `string` | no | | | `paths` | `object[]` | no | Path objects: \{ pathId, userId, color, strokeWidth, pathData, fadeDuration, createdAt }. | | `regions` | `object[]` | no | Region objects: \{ regionId, startTime, endTime, userId, displayName, color, avatarUrl }. | | `zoom` | `number` | no | Zoom level, omitted when the responder did not supply a number. | | `timestamp` | `integer` | no | | # Receive collab:zoom-sync (/docs/reference/websocket/events/receive-collab-zoom-sync) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `collab` channel. Socket.IO event name: `collab:zoom-sync` . Zoom level broadcast (followers of the presenter apply it). Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. ## Payload: `collab:zoom-sync` [#payload-collabzoom-sync] Payload of the 'collab:zoom-sync' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `zoom` | `number` | no | | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Receive notification (/docs/reference/websocket/events/receive-notification) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `resource` channel. Envelope event on which every notification listed in this section is delivered. The type property tells you which event schema applies. Emitted on every channel (namespace) listed in the notification's channels array. Unlike the REST notification objects, the socket payload does NOT include id or channels. tokens and changes are shaped per event type as documented under each event. ## Envelope: `notification` [#envelope-notification] Payload of the 'notification' socket event. | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | Event specific tokens (see the individual event). | | `changes` | `object \| null` | no | Event specific create/update/delete arrays (see the individual event). May be null. | ## Notification types [#notification-types] | `type` | Summary | | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [`test`](/docs/reference/websocket/notifications/test) | Event used for testing websocket connections. | | [`notificationUpdate`](/docs/reference/websocket/notifications/notificationupdate) | Indicates that a previously delivered, grouped notification has been updated (assetGroupUploadComplete or projectGroupItemPublish). | | [`workspaceCreate`](/docs/reference/websocket/notifications/workspacecreate) | Fired when a new workspace is created. | | [`workspaceUpdate`](/docs/reference/websocket/notifications/workspaceupdate) | Fired when a workspace name is changed. | | [`workspaceDelete`](/docs/reference/websocket/notifications/workspacedelete) | Fired when a workspace is marked for deletion. | | [`workspaceLogoUpdate`](/docs/reference/websocket/notifications/workspacelogoupdate) | CURRENTLY UNUSED IN FAVOR OF logoUpdate event. Fired when a workspace logo is updated. | | [`projectCreate`](/docs/reference/websocket/notifications/projectcreate) | Fired when a new project is created. | | [`projectUpdate`](/docs/reference/websocket/notifications/projectupdate) | Fired when a project name is changed. | | [`projectDelete`](/docs/reference/websocket/notifications/projectdelete) | Fired when a project is marked for deletion. | | [`projectLogoUpdate`](/docs/reference/websocket/notifications/projectlogoupdate) | CURRENTLY UNUSED IN FAVOR OF logoUpdate event. Fired when a project logo is updated. Updates the project and returns the new asset object for the logo. Note that the logo will not be 'active' until the actual file is uploaded. So you will need to watch for updates to this asset before replacing the logo locally. | | [`projectAssetsPublish`](/docs/reference/websocket/notifications/projectassetspublish) | CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when assets within a project are published. | | [`projectAssetsUnpublish`](/docs/reference/websocket/notifications/projectassetsunpublish) | CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when assets within a project are unpublished. | | [`assetNameChange`](/docs/reference/websocket/notifications/assetnamechange) | Fired when an asset's name is changed. | | [`assetPublish`](/docs/reference/websocket/notifications/assetpublish) | Fired for each individual asset published through the project publish flow (accompanies fileSystemPublish / projectItemsPublish). | | [`assetUnpublish`](/docs/reference/websocket/notifications/assetunpublish) | Fired for each individual asset unpublished through the project unpublish flow (accompanies fileSystemUnpublish / projectItemsUnpublish). | | [`assetTag`](/docs/reference/websocket/notifications/assettag) | Fired when a tag is added to an asset. | | [`assetUntag`](/docs/reference/websocket/notifications/assetuntag) | Fired when a tag is removed from an asset. | | [`assetDelete`](/docs/reference/websocket/notifications/assetdelete) | Fired when an asset is deleted. | | [`assetStatusUpdate`](/docs/reference/websocket/notifications/assetstatusupdate) | Fired when an asset's status changes (e.g., during processing). | | [`assetPostProcessUpdate`](/docs/reference/websocket/notifications/assetpostprocessupdate) | Fired periodically during asset post-processing (e.g., transcoding). | | [`assetFileUpdate`](/docs/reference/websocket/notifications/assetfileupdate) | Fired when a file associated with an asset is updated or added. | | [`assetGroupUploadComplete`](/docs/reference/websocket/notifications/assetgroupuploadcomplete) | Fired when an uploaded asset becomes active. Uploads by the same creator into the same resource/visibility within the grouping window (30 min) are accumulated into one notification, which is then re-sent via notificationUpdate. | | [`chatTopicChatCreate`](/docs/reference/websocket/notifications/chattopicchatcreate) | Fired when a new topic-based chat is created. | | [`chatMemberChatCreate`](/docs/reference/websocket/notifications/chatmemberchatcreate) | Fired when a new member-based chat (DM/group) is created. | | [`chatUpdateSubject`](/docs/reference/websocket/notifications/chatupdatesubject) | Fired when the subject of a topic-based chat is updated. | | [`chatMemberUpdate`](/docs/reference/websocket/notifications/chatmemberupdate) | Fired when a member chat's subject or colour is updated. | | [`chatDelete`](/docs/reference/websocket/notifications/chatdelete) | Fired when a topic-based chat is deleted. | | [`chatMemberDelete`](/docs/reference/websocket/notifications/chatmemberdelete) | Fired when a member-based chat is deleted. | | [`chatCreateMessage`](/docs/reference/websocket/notifications/chatcreatemessage) | Fired when a new message is created in a chat (user messages, public/guest messages, AI assistant replies and system messages). | | [`chatReviseMessage`](/docs/reference/websocket/notifications/chatrevisemessage) | Fired when a chat message is revised (edited). | | [`chatRefreshMessage`](/docs/reference/websocket/notifications/chatrefreshmessage) | Provides an updated representation of a system message (e.g. after the assets it references finish processing). | | [`chatMention`](/docs/reference/websocket/notifications/chatmention) | Fired when user(s) are mentioned in a created or revised chat message. Published only on the mentioned users' channels (user/\{userId}). | | [`chatDeleteMessage`](/docs/reference/websocket/notifications/chatdeletemessage) | Fired when a chat message is deleted. | | [`chatRemoveAttachment`](/docs/reference/websocket/notifications/chatremoveattachment) | Fired when an attachment is removed from a chat message. | | [`folderCreate`](/docs/reference/websocket/notifications/foldercreate) | CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when a new folder is created. | | [`folderUpdate`](/docs/reference/websocket/notifications/folderupdate) | CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when a folder is updated. | | [`folderDelete`](/docs/reference/websocket/notifications/folderdelete) | CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when a folder is deleted. | | [`inviteCreate`](/docs/reference/websocket/notifications/invitecreate) | Fired when a new invitation is created. | | [`inviteCancel`](/docs/reference/websocket/notifications/invitecancel) | Fired when an invitation is cancelled. | | [`inviteAccept`](/docs/reference/websocket/notifications/inviteaccept) | Fired when an invitation is accepted. | | [`membershipDelete`](/docs/reference/websocket/notifications/membershipdelete) | Fired when a user's membership to a resource is deleted (removed). | | [`membershipAddRole`](/docs/reference/websocket/notifications/membershipaddrole) | Fired when a role is added to a user's membership. | | [`membershipRemoveRole`](/docs/reference/websocket/notifications/membershipremoverole) | Fired when a role is removed from a user's membership. | | [`membershipLeaveResource`](/docs/reference/websocket/notifications/membershipleaveresource) | Fired when a user leaves a resource themselves. | | [`workspaceStorageLimitWarning`](/docs/reference/websocket/notifications/workspacestoragelimitwarning) | Fired when a workspace's storage usage exceeds a threshold. | | [`userSelfUpdate`](/docs/reference/websocket/notifications/userselfupdate) | Fired when a user updates their own profile information. | | [`userPublicUpdate`](/docs/reference/websocket/notifications/userpublicupdate) | Fired when a user's public information is updated. | | [`userDeleted`](/docs/reference/websocket/notifications/userdeleted) | Fired when a user account is deleted. | | [`userAvatarUpdate`](/docs/reference/websocket/notifications/useravatarupdate) | Fired when a avatars status is set to active. Note that this is an asset event and not a user event so it is fired when the asset's status is set to active not when a user's object is updated. | | [`logoUpdate`](/docs/reference/websocket/notifications/logoupdate) | Generic event for when a workspace or project logo asset becomes active. Includes the updated owner resource in changes. | | [`iconUpdate`](/docs/reference/websocket/notifications/iconupdate) | Generic event for when a workspace or project icon asset becomes active. Includes the updated owner resource in changes. | | [`taskAcknowledged`](/docs/reference/websocket/notifications/taskacknowledged) | Fired when tasks are acknowledged within a project. | | [`taskStatusUpdate`](/docs/reference/websocket/notifications/taskstatusupdate) | Fired when the status of a task is updated. | | [`taskCreate`](/docs/reference/websocket/notifications/taskcreate) | Fired when a new task is created within a project. | | [`notificationUpdateLastSeen`](/docs/reference/websocket/notifications/notificationupdatelastseen) | Fired to update a client's 'last seen' timestamp for notifications. | | [`submissionCreate`](/docs/reference/websocket/notifications/submissioncreate) | Fired when a submission is released for the first time. Published on project/\{projectId}, project/\{projectId}/creator and project/\{projectId}/reviewer. | | [`projectItemsPublish`](/docs/reference/websocket/notifications/projectitemspublish) | Fired when multiple items (assets/folders) within a project are published. | | [`projectItemsUnpublish`](/docs/reference/websocket/notifications/projectitemsunpublish) | Fired when multiple items (assets/folders) within a project are unpublished. | | [`folderPublish`](/docs/reference/websocket/notifications/folderpublish) | Fired when an individual folder is published. | | [`folderTag`](/docs/reference/websocket/notifications/foldertag) | Fired when a tag is added to a folder. | | [`folderUntag`](/docs/reference/websocket/notifications/folderuntag) | Fired when a tag is removed from a folder. | | [`tagCreate`](/docs/reference/websocket/notifications/tagcreate) | Fired when a new tag is created. | | [`tagUpdate`](/docs/reference/websocket/notifications/tagupdate) | Fired when a tag is updated. | | [`tagDelete`](/docs/reference/websocket/notifications/tagdelete) | Fired when a tag is deleted. | | [`fileSystemCreate`](/docs/reference/websocket/notifications/filesystemcreate) | Fired when items are created at a file system path (folder created, single uploaded asset activated, or items copied into a public release). | | [`fileSystemMove`](/docs/reference/websocket/notifications/filesystemmove) | Fired when items are moved to a new file system path. | | [`fileSystemCopy`](/docs/reference/websocket/notifications/filesystemcopy) | Fired when items are copied to a new file system path. | | [`fileSystemDelete`](/docs/reference/websocket/notifications/filesystemdelete) | Fired when items are deleted from file system paths. | | [`fileSystemPublish`](/docs/reference/websocket/notifications/filesystempublish) | Fired when multiple items are published at a file system path. | | [`fileSystemUnpublish`](/docs/reference/websocket/notifications/filesystemunpublish) | Fired when multiple items are unpublished from file system paths. | | [`subscriptionCreate`](/docs/reference/websocket/notifications/subscriptioncreate) | Fired when a new billing subscription is created for a workspace (Stripe webhook). Published on user/\{ownerId} and \{resourceType}/\{resourceId}. | | [`subscriptionUpdate`](/docs/reference/websocket/notifications/subscriptionupdate) | Fired when an existing billing subscription is updated, paused, resumed or deleted (Stripe webhook). Published on user/\{ownerId} and \{resourceType}/\{resourceId}. | | [`projectGroupItemPublish`](/docs/reference/websocket/notifications/projectgroupitempublish) | Grouped notification for items published in a project. Items published by the same user within the grouping window (30 min) are accumulated and re-sent via notificationUpdate. | | [`publicAssetLinkCreate`](/docs/reference/websocket/notifications/publicassetlinkcreate) | Fired when a public (share) link is created for an asset. Published on project/\{projectId}/creator and workspace/\{workspaceId}. | | [`uploadPushSummary`](/docs/reference/websocket/notifications/uploadpushsummary) | Delayed push-notification summary of assets uploaded to a project by one user. Primarily used to send a push notification after scheduledSendAt, but also broadcast on the project visibility channels when created. | | [`publishPushSummary`](/docs/reference/websocket/notifications/publishpushsummary) | Push-notification summary of items published to reviewers. Used to send a push notification; broadcast on project/\{projectId}/reviewer. | | [`submissionPushSummary`](/docs/reference/websocket/notifications/submissionpushsummary) | Push-notification summary for a newly created submission. Used to send a push notification; broadcast on project/\{projectId}. | | [`memberJoinPush`](/docs/reference/websocket/notifications/memberjoinpush) | Push-notification record created when a user joins a workspace or project. Used to send a push notification; broadcast on \{resourceType}/\{resourceId}. | | [`chatMemberArchive`](/docs/reference/websocket/notifications/chatmemberarchive) | Fired when the requesting user archives a member chat for themselves. Published on user/\{userId} only. | | [`chatMemberUnarchive`](/docs/reference/websocket/notifications/chatmemberunarchive) | Fired when the requesting user un-archives a member chat for themselves. Published on user/\{userId} only. | | [`chatHighlightMessage`](/docs/reference/websocket/notifications/chathighlightmessage) | Fired when a message in a project-scoped chat is highlighted. Published on project/\{projectId}/\{visibility} of the chat. | | [`chatFollow`](/docs/reference/websocket/notifications/chatfollow) | Fired when a user follows a chat. Published on the chat channels. | | [`chatUnfollow`](/docs/reference/websocket/notifications/chatunfollow) | Fired when a user unfollows a chat. Published on the chat channels. | | [`userEmailVerify`](/docs/reference/websocket/notifications/useremailverify) | Fired when a user's email address is verified. Published on user/\{userId}. | | [`botCreate`](/docs/reference/websocket/notifications/botcreate) | Fired when a bot user is created in a workspace. Published on workspace/\{workspaceId}. | | [`webhookTest`](/docs/reference/websocket/notifications/webhooktest) | Synthetic event fired when an admin tests a webhook subscription. Published on workspace/\{workspaceId}; delivered by the webhook dispatcher as webhook.test. | | [`taskFollow`](/docs/reference/websocket/notifications/taskfollow) | Fired when a user follows a task. | | [`taskUnfollow`](/docs/reference/websocket/notifications/taskunfollow) | Fired when a user unfollows a task. | | [`submissionUpdate`](/docs/reference/websocket/notifications/submissionupdate) | Fired when an already-released submission is re-released. Published on project/\{projectId}, project/\{projectId}/creator and project/\{projectId}/reviewer. | | [`submissionTag`](/docs/reference/websocket/notifications/submissiontag) | Fired when a tag is added to a submission. resourceType is chatSubmission. | | [`submissionUntag`](/docs/reference/websocket/notifications/submissionuntag) | Fired when a tag is removed from a submission. resourceType is chatSubmission. | | [`aiChatTopicCreate`](/docs/reference/websocket/notifications/aichattopiccreate) | Fired when an AI chat topic is created. Published on user/\{userId} of the topic owner. | | [`aiChatTopicUpdate`](/docs/reference/websocket/notifications/aichattopicupdate) | Fired when an AI chat topic is updated (title, archive state, context items, last message preview) or deleted. Published on user/\{userId} of the topic owner. | | [`aiChatMessageCreate`](/docs/reference/websocket/notifications/aichatmessagecreate) | Fired when the AI assistant posts a message in an AI chat topic. Published on user/\{userId} of the topic owner. | | [`publicFileSystemCreate`](/docs/reference/websocket/notifications/publicfilesystemcreate) | Fired when a public release (public file system) is created. Published on project/\{projectId}/creator. | | [`publicFileSystemUpdate`](/docs/reference/websocket/notifications/publicfilesystemupdate) | Fired when a public release is updated (title, description, validity, options). Published on project/\{projectId}/creator. | | [`publicFileSystemDelete`](/docs/reference/websocket/notifications/publicfilesystemdelete) | Fired when a public release is deleted. Published on project/\{projectId}/creator. | | [`settingsUpdate`](/docs/reference/websocket/notifications/settingsupdate) | Fired when a user's settings for a resource are updated or reset. Published on user/\{userId} only. | | [`convoStart`](/docs/reference/websocket/notifications/convostart) | Fired when a convo (call) is started in a chat. Published on the chat channels and user/\{userId} of the starter. | | [`convoJoin`](/docs/reference/websocket/notifications/convojoin) | Fired when a user joins a convo. | | [`convoLeave`](/docs/reference/websocket/notifications/convoleave) | Fired when a user leaves a convo. | | [`convoComplete`](/docs/reference/websocket/notifications/convocomplete) | Fired when a convo is completed (ended by a user or when the last participant leaves). | | [`convoUpdate`](/docs/reference/websocket/notifications/convoupdate) | Fired when a convo is updated (subject / notes). | | [`convoDelete`](/docs/reference/websocket/notifications/convodelete) | Fired when a convo is deleted. | | [`convoParticipantJoined`](/docs/reference/websocket/notifications/convoparticipantjoined) | Fired (from the call-provider webhook) when a participant actually joins the call room. | | [`convoParticipantLeft`](/docs/reference/websocket/notifications/convoparticipantleft) | Fired (from the call-provider webhook) when a participant leaves the call room. | | [`convoHandover`](/docs/reference/websocket/notifications/convohandover) | Fired on user/\{userId} when the user joins a convo from a second device, so the previous device can leave the call. | | [`boardCreate`](/docs/reference/websocket/notifications/boardcreate) | Fired when a kanban board is created. Published on the project visibility channels of the board. | | [`boardUpdate`](/docs/reference/websocket/notifications/boardupdate) | Fired when a kanban board is updated (name, visibility, options). | | [`boardDelete`](/docs/reference/websocket/notifications/boarddelete) | Fired when a kanban board is deleted. Cascaded task deletions / reassignments are included in changes. | | [`boardTaskCreate`](/docs/reference/websocket/notifications/boardtaskcreate) | Fired when a task is created on a board (UI, AI tool or bulk create). Also used for push notifications. | | [`boardTaskMove`](/docs/reference/websocket/notifications/boardtaskmove) | Fired when a task is moved between columns or boards. Published on the visibility channels of both boards for cross-board moves. | | [`boardTaskAssign`](/docs/reference/websocket/notifications/boardtaskassign) | Fired when a task is assigned or unassigned. Published on the board visibility channels and user/\{assignedToId}. | | [`boardColumnAdd`](/docs/reference/websocket/notifications/boardcolumnadd) | Fired when a column is added to a board. | | [`boardColumnUpdate`](/docs/reference/websocket/notifications/boardcolumnupdate) | Fired when a board column is updated. | | [`boardColumnDelete`](/docs/reference/websocket/notifications/boardcolumndelete) | Fired when a board column is deleted. | | [`boardColumnReorder`](/docs/reference/websocket/notifications/boardcolumnreorder) | Fired when the columns of a board are reordered. changes.update contains every column with its new order. | | [`boardTaskAdd`](/docs/reference/websocket/notifications/boardtaskadd) | Fired when an existing task is added to a board. | | [`boardTaskRemove`](/docs/reference/websocket/notifications/boardtaskremove) | Fired when a task is removed from a board (the task itself is kept). | | [`boardTaskUpdate`](/docs/reference/websocket/notifications/boardtaskupdate) | Fired when a task's details are updated (subject, description, priority, dates, etc.). | | [`boardTaskLink`](/docs/reference/websocket/notifications/boardtasklink) | Fired when two tasks are linked. | | [`boardTaskUnlink`](/docs/reference/websocket/notifications/boardtaskunlink) | Fired when a task link is removed. | | [`boardTaskRelationAdd`](/docs/reference/websocket/notifications/boardtaskrelationadd) | Fired when a resource (asset, folder, message, chat, ...) is related to a task. Also used for push notifications. | | [`boardTaskRelationRemove`](/docs/reference/websocket/notifications/boardtaskrelationremove) | Fired when a task relation is removed (explicitly, or cascaded when a board visibility change removes access). | | [`boardFollow`](/docs/reference/websocket/notifications/boardfollow) | Fired when a user follows a board. | | [`boardUnfollow`](/docs/reference/websocket/notifications/boardunfollow) | Fired when a user unfollows a board. | # Receive notification (/docs/reference/websocket/events/receive-public-notification) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `public` channel. Envelope event on which every notification listed in this section is delivered. The type property tells you which event schema applies. Emitted on every channel (namespace) listed in the notification's channels array. Unlike the REST notification objects, the socket payload does NOT include id or channels. tokens and changes are shaped per event type as documented under each event. ## Envelope: `notification` [#envelope-notification] Payload of the 'notification' socket event. | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | Event specific tokens (see the individual event). | | `changes` | `object \| null` | no | Event specific create/update/delete arrays (see the individual event). May be null. | ## Notification types [#notification-types] | `type` | Summary | | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [`test`](/docs/reference/websocket/notifications/test) | Event used for testing websocket connections. | | [`notificationUpdate`](/docs/reference/websocket/notifications/notificationupdate) | Indicates that a previously delivered, grouped notification has been updated (assetGroupUploadComplete or projectGroupItemPublish). | | [`workspaceCreate`](/docs/reference/websocket/notifications/workspacecreate) | Fired when a new workspace is created. | | [`workspaceUpdate`](/docs/reference/websocket/notifications/workspaceupdate) | Fired when a workspace name is changed. | | [`workspaceDelete`](/docs/reference/websocket/notifications/workspacedelete) | Fired when a workspace is marked for deletion. | | [`workspaceLogoUpdate`](/docs/reference/websocket/notifications/workspacelogoupdate) | CURRENTLY UNUSED IN FAVOR OF logoUpdate event. Fired when a workspace logo is updated. | | [`projectCreate`](/docs/reference/websocket/notifications/projectcreate) | Fired when a new project is created. | | [`projectUpdate`](/docs/reference/websocket/notifications/projectupdate) | Fired when a project name is changed. | | [`projectDelete`](/docs/reference/websocket/notifications/projectdelete) | Fired when a project is marked for deletion. | | [`projectLogoUpdate`](/docs/reference/websocket/notifications/projectlogoupdate) | CURRENTLY UNUSED IN FAVOR OF logoUpdate event. Fired when a project logo is updated. Updates the project and returns the new asset object for the logo. Note that the logo will not be 'active' until the actual file is uploaded. So you will need to watch for updates to this asset before replacing the logo locally. | | [`projectAssetsPublish`](/docs/reference/websocket/notifications/projectassetspublish) | CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when assets within a project are published. | | [`projectAssetsUnpublish`](/docs/reference/websocket/notifications/projectassetsunpublish) | CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when assets within a project are unpublished. | | [`assetNameChange`](/docs/reference/websocket/notifications/assetnamechange) | Fired when an asset's name is changed. | | [`assetPublish`](/docs/reference/websocket/notifications/assetpublish) | Fired for each individual asset published through the project publish flow (accompanies fileSystemPublish / projectItemsPublish). | | [`assetUnpublish`](/docs/reference/websocket/notifications/assetunpublish) | Fired for each individual asset unpublished through the project unpublish flow (accompanies fileSystemUnpublish / projectItemsUnpublish). | | [`assetTag`](/docs/reference/websocket/notifications/assettag) | Fired when a tag is added to an asset. | | [`assetUntag`](/docs/reference/websocket/notifications/assetuntag) | Fired when a tag is removed from an asset. | | [`assetDelete`](/docs/reference/websocket/notifications/assetdelete) | Fired when an asset is deleted. | | [`assetStatusUpdate`](/docs/reference/websocket/notifications/assetstatusupdate) | Fired when an asset's status changes (e.g., during processing). | | [`assetPostProcessUpdate`](/docs/reference/websocket/notifications/assetpostprocessupdate) | Fired periodically during asset post-processing (e.g., transcoding). | | [`assetFileUpdate`](/docs/reference/websocket/notifications/assetfileupdate) | Fired when a file associated with an asset is updated or added. | | [`assetGroupUploadComplete`](/docs/reference/websocket/notifications/assetgroupuploadcomplete) | Fired when an uploaded asset becomes active. Uploads by the same creator into the same resource/visibility within the grouping window (30 min) are accumulated into one notification, which is then re-sent via notificationUpdate. | | [`chatTopicChatCreate`](/docs/reference/websocket/notifications/chattopicchatcreate) | Fired when a new topic-based chat is created. | | [`chatMemberChatCreate`](/docs/reference/websocket/notifications/chatmemberchatcreate) | Fired when a new member-based chat (DM/group) is created. | | [`chatUpdateSubject`](/docs/reference/websocket/notifications/chatupdatesubject) | Fired when the subject of a topic-based chat is updated. | | [`chatMemberUpdate`](/docs/reference/websocket/notifications/chatmemberupdate) | Fired when a member chat's subject or colour is updated. | | [`chatDelete`](/docs/reference/websocket/notifications/chatdelete) | Fired when a topic-based chat is deleted. | | [`chatMemberDelete`](/docs/reference/websocket/notifications/chatmemberdelete) | Fired when a member-based chat is deleted. | | [`chatCreateMessage`](/docs/reference/websocket/notifications/chatcreatemessage) | Fired when a new message is created in a chat (user messages, public/guest messages, AI assistant replies and system messages). | | [`chatReviseMessage`](/docs/reference/websocket/notifications/chatrevisemessage) | Fired when a chat message is revised (edited). | | [`chatRefreshMessage`](/docs/reference/websocket/notifications/chatrefreshmessage) | Provides an updated representation of a system message (e.g. after the assets it references finish processing). | | [`chatMention`](/docs/reference/websocket/notifications/chatmention) | Fired when user(s) are mentioned in a created or revised chat message. Published only on the mentioned users' channels (user/\{userId}). | | [`chatDeleteMessage`](/docs/reference/websocket/notifications/chatdeletemessage) | Fired when a chat message is deleted. | | [`chatRemoveAttachment`](/docs/reference/websocket/notifications/chatremoveattachment) | Fired when an attachment is removed from a chat message. | | [`folderCreate`](/docs/reference/websocket/notifications/foldercreate) | CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when a new folder is created. | | [`folderUpdate`](/docs/reference/websocket/notifications/folderupdate) | CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when a folder is updated. | | [`folderDelete`](/docs/reference/websocket/notifications/folderdelete) | CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when a folder is deleted. | | [`inviteCreate`](/docs/reference/websocket/notifications/invitecreate) | Fired when a new invitation is created. | | [`inviteCancel`](/docs/reference/websocket/notifications/invitecancel) | Fired when an invitation is cancelled. | | [`inviteAccept`](/docs/reference/websocket/notifications/inviteaccept) | Fired when an invitation is accepted. | | [`membershipDelete`](/docs/reference/websocket/notifications/membershipdelete) | Fired when a user's membership to a resource is deleted (removed). | | [`membershipAddRole`](/docs/reference/websocket/notifications/membershipaddrole) | Fired when a role is added to a user's membership. | | [`membershipRemoveRole`](/docs/reference/websocket/notifications/membershipremoverole) | Fired when a role is removed from a user's membership. | | [`membershipLeaveResource`](/docs/reference/websocket/notifications/membershipleaveresource) | Fired when a user leaves a resource themselves. | | [`workspaceStorageLimitWarning`](/docs/reference/websocket/notifications/workspacestoragelimitwarning) | Fired when a workspace's storage usage exceeds a threshold. | | [`userSelfUpdate`](/docs/reference/websocket/notifications/userselfupdate) | Fired when a user updates their own profile information. | | [`userPublicUpdate`](/docs/reference/websocket/notifications/userpublicupdate) | Fired when a user's public information is updated. | | [`userDeleted`](/docs/reference/websocket/notifications/userdeleted) | Fired when a user account is deleted. | | [`userAvatarUpdate`](/docs/reference/websocket/notifications/useravatarupdate) | Fired when a avatars status is set to active. Note that this is an asset event and not a user event so it is fired when the asset's status is set to active not when a user's object is updated. | | [`logoUpdate`](/docs/reference/websocket/notifications/logoupdate) | Generic event for when a workspace or project logo asset becomes active. Includes the updated owner resource in changes. | | [`iconUpdate`](/docs/reference/websocket/notifications/iconupdate) | Generic event for when a workspace or project icon asset becomes active. Includes the updated owner resource in changes. | | [`taskAcknowledged`](/docs/reference/websocket/notifications/taskacknowledged) | Fired when tasks are acknowledged within a project. | | [`taskStatusUpdate`](/docs/reference/websocket/notifications/taskstatusupdate) | Fired when the status of a task is updated. | | [`taskCreate`](/docs/reference/websocket/notifications/taskcreate) | Fired when a new task is created within a project. | | [`notificationUpdateLastSeen`](/docs/reference/websocket/notifications/notificationupdatelastseen) | Fired to update a client's 'last seen' timestamp for notifications. | | [`submissionCreate`](/docs/reference/websocket/notifications/submissioncreate) | Fired when a submission is released for the first time. Published on project/\{projectId}, project/\{projectId}/creator and project/\{projectId}/reviewer. | | [`projectItemsPublish`](/docs/reference/websocket/notifications/projectitemspublish) | Fired when multiple items (assets/folders) within a project are published. | | [`projectItemsUnpublish`](/docs/reference/websocket/notifications/projectitemsunpublish) | Fired when multiple items (assets/folders) within a project are unpublished. | | [`folderPublish`](/docs/reference/websocket/notifications/folderpublish) | Fired when an individual folder is published. | | [`folderTag`](/docs/reference/websocket/notifications/foldertag) | Fired when a tag is added to a folder. | | [`folderUntag`](/docs/reference/websocket/notifications/folderuntag) | Fired when a tag is removed from a folder. | | [`tagCreate`](/docs/reference/websocket/notifications/tagcreate) | Fired when a new tag is created. | | [`tagUpdate`](/docs/reference/websocket/notifications/tagupdate) | Fired when a tag is updated. | | [`tagDelete`](/docs/reference/websocket/notifications/tagdelete) | Fired when a tag is deleted. | | [`fileSystemCreate`](/docs/reference/websocket/notifications/filesystemcreate) | Fired when items are created at a file system path (folder created, single uploaded asset activated, or items copied into a public release). | | [`fileSystemMove`](/docs/reference/websocket/notifications/filesystemmove) | Fired when items are moved to a new file system path. | | [`fileSystemCopy`](/docs/reference/websocket/notifications/filesystemcopy) | Fired when items are copied to a new file system path. | | [`fileSystemDelete`](/docs/reference/websocket/notifications/filesystemdelete) | Fired when items are deleted from file system paths. | | [`fileSystemPublish`](/docs/reference/websocket/notifications/filesystempublish) | Fired when multiple items are published at a file system path. | | [`fileSystemUnpublish`](/docs/reference/websocket/notifications/filesystemunpublish) | Fired when multiple items are unpublished from file system paths. | | [`subscriptionCreate`](/docs/reference/websocket/notifications/subscriptioncreate) | Fired when a new billing subscription is created for a workspace (Stripe webhook). Published on user/\{ownerId} and \{resourceType}/\{resourceId}. | | [`subscriptionUpdate`](/docs/reference/websocket/notifications/subscriptionupdate) | Fired when an existing billing subscription is updated, paused, resumed or deleted (Stripe webhook). Published on user/\{ownerId} and \{resourceType}/\{resourceId}. | | [`projectGroupItemPublish`](/docs/reference/websocket/notifications/projectgroupitempublish) | Grouped notification for items published in a project. Items published by the same user within the grouping window (30 min) are accumulated and re-sent via notificationUpdate. | | [`publicAssetLinkCreate`](/docs/reference/websocket/notifications/publicassetlinkcreate) | Fired when a public (share) link is created for an asset. Published on project/\{projectId}/creator and workspace/\{workspaceId}. | | [`uploadPushSummary`](/docs/reference/websocket/notifications/uploadpushsummary) | Delayed push-notification summary of assets uploaded to a project by one user. Primarily used to send a push notification after scheduledSendAt, but also broadcast on the project visibility channels when created. | | [`publishPushSummary`](/docs/reference/websocket/notifications/publishpushsummary) | Push-notification summary of items published to reviewers. Used to send a push notification; broadcast on project/\{projectId}/reviewer. | | [`submissionPushSummary`](/docs/reference/websocket/notifications/submissionpushsummary) | Push-notification summary for a newly created submission. Used to send a push notification; broadcast on project/\{projectId}. | | [`memberJoinPush`](/docs/reference/websocket/notifications/memberjoinpush) | Push-notification record created when a user joins a workspace or project. Used to send a push notification; broadcast on \{resourceType}/\{resourceId}. | | [`chatMemberArchive`](/docs/reference/websocket/notifications/chatmemberarchive) | Fired when the requesting user archives a member chat for themselves. Published on user/\{userId} only. | | [`chatMemberUnarchive`](/docs/reference/websocket/notifications/chatmemberunarchive) | Fired when the requesting user un-archives a member chat for themselves. Published on user/\{userId} only. | | [`chatHighlightMessage`](/docs/reference/websocket/notifications/chathighlightmessage) | Fired when a message in a project-scoped chat is highlighted. Published on project/\{projectId}/\{visibility} of the chat. | | [`chatFollow`](/docs/reference/websocket/notifications/chatfollow) | Fired when a user follows a chat. Published on the chat channels. | | [`chatUnfollow`](/docs/reference/websocket/notifications/chatunfollow) | Fired when a user unfollows a chat. Published on the chat channels. | | [`userEmailVerify`](/docs/reference/websocket/notifications/useremailverify) | Fired when a user's email address is verified. Published on user/\{userId}. | | [`botCreate`](/docs/reference/websocket/notifications/botcreate) | Fired when a bot user is created in a workspace. Published on workspace/\{workspaceId}. | | [`webhookTest`](/docs/reference/websocket/notifications/webhooktest) | Synthetic event fired when an admin tests a webhook subscription. Published on workspace/\{workspaceId}; delivered by the webhook dispatcher as webhook.test. | | [`taskFollow`](/docs/reference/websocket/notifications/taskfollow) | Fired when a user follows a task. | | [`taskUnfollow`](/docs/reference/websocket/notifications/taskunfollow) | Fired when a user unfollows a task. | | [`submissionUpdate`](/docs/reference/websocket/notifications/submissionupdate) | Fired when an already-released submission is re-released. Published on project/\{projectId}, project/\{projectId}/creator and project/\{projectId}/reviewer. | | [`submissionTag`](/docs/reference/websocket/notifications/submissiontag) | Fired when a tag is added to a submission. resourceType is chatSubmission. | | [`submissionUntag`](/docs/reference/websocket/notifications/submissionuntag) | Fired when a tag is removed from a submission. resourceType is chatSubmission. | | [`aiChatTopicCreate`](/docs/reference/websocket/notifications/aichattopiccreate) | Fired when an AI chat topic is created. Published on user/\{userId} of the topic owner. | | [`aiChatTopicUpdate`](/docs/reference/websocket/notifications/aichattopicupdate) | Fired when an AI chat topic is updated (title, archive state, context items, last message preview) or deleted. Published on user/\{userId} of the topic owner. | | [`aiChatMessageCreate`](/docs/reference/websocket/notifications/aichatmessagecreate) | Fired when the AI assistant posts a message in an AI chat topic. Published on user/\{userId} of the topic owner. | | [`publicFileSystemCreate`](/docs/reference/websocket/notifications/publicfilesystemcreate) | Fired when a public release (public file system) is created. Published on project/\{projectId}/creator. | | [`publicFileSystemUpdate`](/docs/reference/websocket/notifications/publicfilesystemupdate) | Fired when a public release is updated (title, description, validity, options). Published on project/\{projectId}/creator. | | [`publicFileSystemDelete`](/docs/reference/websocket/notifications/publicfilesystemdelete) | Fired when a public release is deleted. Published on project/\{projectId}/creator. | | [`settingsUpdate`](/docs/reference/websocket/notifications/settingsupdate) | Fired when a user's settings for a resource are updated or reset. Published on user/\{userId} only. | | [`convoStart`](/docs/reference/websocket/notifications/convostart) | Fired when a convo (call) is started in a chat. Published on the chat channels and user/\{userId} of the starter. | | [`convoJoin`](/docs/reference/websocket/notifications/convojoin) | Fired when a user joins a convo. | | [`convoLeave`](/docs/reference/websocket/notifications/convoleave) | Fired when a user leaves a convo. | | [`convoComplete`](/docs/reference/websocket/notifications/convocomplete) | Fired when a convo is completed (ended by a user or when the last participant leaves). | | [`convoUpdate`](/docs/reference/websocket/notifications/convoupdate) | Fired when a convo is updated (subject / notes). | | [`convoDelete`](/docs/reference/websocket/notifications/convodelete) | Fired when a convo is deleted. | | [`convoParticipantJoined`](/docs/reference/websocket/notifications/convoparticipantjoined) | Fired (from the call-provider webhook) when a participant actually joins the call room. | | [`convoParticipantLeft`](/docs/reference/websocket/notifications/convoparticipantleft) | Fired (from the call-provider webhook) when a participant leaves the call room. | | [`convoHandover`](/docs/reference/websocket/notifications/convohandover) | Fired on user/\{userId} when the user joins a convo from a second device, so the previous device can leave the call. | | [`boardCreate`](/docs/reference/websocket/notifications/boardcreate) | Fired when a kanban board is created. Published on the project visibility channels of the board. | | [`boardUpdate`](/docs/reference/websocket/notifications/boardupdate) | Fired when a kanban board is updated (name, visibility, options). | | [`boardDelete`](/docs/reference/websocket/notifications/boarddelete) | Fired when a kanban board is deleted. Cascaded task deletions / reassignments are included in changes. | | [`boardTaskCreate`](/docs/reference/websocket/notifications/boardtaskcreate) | Fired when a task is created on a board (UI, AI tool or bulk create). Also used for push notifications. | | [`boardTaskMove`](/docs/reference/websocket/notifications/boardtaskmove) | Fired when a task is moved between columns or boards. Published on the visibility channels of both boards for cross-board moves. | | [`boardTaskAssign`](/docs/reference/websocket/notifications/boardtaskassign) | Fired when a task is assigned or unassigned. Published on the board visibility channels and user/\{assignedToId}. | | [`boardColumnAdd`](/docs/reference/websocket/notifications/boardcolumnadd) | Fired when a column is added to a board. | | [`boardColumnUpdate`](/docs/reference/websocket/notifications/boardcolumnupdate) | Fired when a board column is updated. | | [`boardColumnDelete`](/docs/reference/websocket/notifications/boardcolumndelete) | Fired when a board column is deleted. | | [`boardColumnReorder`](/docs/reference/websocket/notifications/boardcolumnreorder) | Fired when the columns of a board are reordered. changes.update contains every column with its new order. | | [`boardTaskAdd`](/docs/reference/websocket/notifications/boardtaskadd) | Fired when an existing task is added to a board. | | [`boardTaskRemove`](/docs/reference/websocket/notifications/boardtaskremove) | Fired when a task is removed from a board (the task itself is kept). | | [`boardTaskUpdate`](/docs/reference/websocket/notifications/boardtaskupdate) | Fired when a task's details are updated (subject, description, priority, dates, etc.). | | [`boardTaskLink`](/docs/reference/websocket/notifications/boardtasklink) | Fired when two tasks are linked. | | [`boardTaskUnlink`](/docs/reference/websocket/notifications/boardtaskunlink) | Fired when a task link is removed. | | [`boardTaskRelationAdd`](/docs/reference/websocket/notifications/boardtaskrelationadd) | Fired when a resource (asset, folder, message, chat, ...) is related to a task. Also used for push notifications. | | [`boardTaskRelationRemove`](/docs/reference/websocket/notifications/boardtaskrelationremove) | Fired when a task relation is removed (explicitly, or cascaded when a board visibility change removes access). | | [`boardFollow`](/docs/reference/websocket/notifications/boardfollow) | Fired when a user follows a board. | | [`boardUnfollow`](/docs/reference/websocket/notifications/boardunfollow) | Fired when a user unfollows a board. | # Receive tokenEvent (/docs/reference/websocket/events/receive-tokenevent) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `resource` channel. Socket.IO event name: `tokenEvent` . Emitted by the server right before it force-disconnects a socket whose credential is no longer valid. Payload is a plain string, not an object. 'TokenExpired' is sent when the JWT exp has passed, 'tokenBlacklisted' when the JWT was blacklisted (logout) or a bot API key was revoked. The socket is disconnected \~1 second later; re-authenticate and reconnect. ## Payload: `tokenEvent` [#payload-tokenevent] Payload of the 'tokenEvent' socket event. Type: `"TokenExpired" \| "tokenBlacklisted"` # Receive typing:start (/docs/reference/websocket/events/receive-typing-start) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `resource` channel. Socket.IO event name: `typing:start` . Ephemeral typing indicator. Client -> server: emit \{ chatId }. Server -> clients: relayed with the authenticated userId to every other socket on the chat channels. Client emits typing:start with \{ chatId: string }. The server resolves the same channels a chatCreateMessage for that chat would use (chat/\{chatId}, project/\{projectId}/\{visibility}, public/\{token}; never user/\* channels) and emits typing:start on each of them to every socket except the sender. Not persisted; not delivered as a 'notification' event. ## Payload: `typing:start` [#payload-typingstart] Payload of the 'typing:start' socket event. | Property | Type | Required | Description | | ----------- | --------------- | -------- | -------------------------------------------------------------------------------------------- | | `chatId` | `string (uuid)` | no | Chat the typing indicator belongs to. | | `userId` | `string (uuid)` | no | User who is typing. Equals the AI system user ID when the AI assistant is composing a reply. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch. | # Receive typing:stop (/docs/reference/websocket/events/receive-typing-stop) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} server → client on the `resource` channel. Socket.IO event name: `typing:stop` . Ephemeral typing indicator stop. Client -> server: emit \{ chatId }. Server -> clients: relayed with the authenticated userId to every other socket on the chat channels. Same routing and payload as typing:start. ## Payload: `typing:stop` [#payload-typingstop] Payload of the 'typing:stop' socket event. | Property | Type | Required | Description | | ----------- | --------------- | -------- | -------------------------------------------------------------------------------------------- | | `chatId` | `string (uuid)` | no | Chat the typing indicator belongs to. | | `userId` | `string (uuid)` | no | User who is typing. Equals the AI system user ID when the AI assistant is composing a reply. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch. | # Emit collab:click (/docs/reference/websocket/events/send-collab-click) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} client → server on the `collab` channel. Socket.IO event name: `collab:click` . Click ripple at percentage coordinates. Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. ## Payload: `collab:click` [#payload-collabclick] Payload of the 'collab:click' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `x` | `number` | no | | | `y` | `number` | no | | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Emit collab:color-change (/docs/reference/websocket/events/send-collab-color-change) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} client → server on the `collab` channel. Socket.IO event name: `collab:color-change` . User changed their annotation colour. The server stores the new colour on the socket, so subsequent relayed events carry it. Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. ## Payload: `collab:color-change` [#payload-collabcolor-change] Payload of the 'collab:color-change' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Emit collab:cursor-hide (/docs/reference/websocket/events/send-collab-cursor-hide) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} client → server on the `collab` channel. Socket.IO event name: `collab:cursor-hide` . Remote cursor left the asset area. Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. ## Payload: `collab:cursor-hide` [#payload-collabcursor-hide] Payload of the 'collab:cursor-hide' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Emit collab:cursor-move (/docs/reference/websocket/events/send-collab-cursor-move) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} client → server on the `collab` channel. Socket.IO event name: `collab:cursor-move` . Remote cursor position update (percentage coordinates). Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. ## Payload: `collab:cursor-move` [#payload-collabcursor-move] Payload of the 'collab:cursor-move' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `x` | `number` | no | Client supplied X position as a percentage of the asset area. | | `y` | `number` | no | Client supplied Y position as a percentage of the asset area. | | `visible` | `boolean` | no | Client supplied visibility flag. | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Emit collab:join (/docs/reference/websocket/events/send-collab-join) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} client → server on the `collab` channel. Socket.IO event name: `collab:join` . A user joined the collab session on this chat namespace (broadcast to the other members). Client emits collab:join with optional \{ preferredAnnotationColor }. Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. The joining socket additionally receives collab:self-color, collab:members (if others are present) and either collab:presenter-assign (first member) or collab:presenter-state. ## Payload: `collab:join` [#payload-collabjoin] Payload of the 'collab:join' socket event. | Property | Type | Required | Description | | -------------------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `preferredAnnotationColor` | `string` | no | Echo of the colour the client asked for, if it sent one. | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Emit collab:leave (/docs/reference/websocket/events/send-collab-leave) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} client → server on the `collab` channel. Socket.IO event name: `collab:leave` . A user left the collab session (explicit collab:leave from the client or socket disconnect). Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. On disconnect the server emits it on behalf of the leaving socket; if they were the presenter a collab:presenter-assign (reason transfer-on-leave) follows. ## Payload: `collab:leave` [#payload-collableave] Payload of the 'collab:leave' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Emit collab:path-clear (/docs/reference/websocket/events/send-collab-path-clear) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} client → server on the `collab` channel. Socket.IO event name: `collab:path-clear` . Drawn path(s) cleared. With pathId only that path is cleared, otherwise all paths of the user. Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. ## Payload: `collab:path-clear` [#payload-collabpath-clear] Payload of the 'collab:path-clear' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `pathId` | `string \| null` | no | | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Emit collab:path-end (/docs/reference/websocket/events/send-collab-path-end) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} client → server on the `collab` channel. Socket.IO event name: `collab:path-end` . Pen drawing completed. Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. ## Payload: `collab:path-end` [#payload-collabpath-end] Payload of the 'collab:path-end' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `pathId` | `string` | no | | | `pathData` | `string` | no | Final SVG path data. | | `fadeDuration` | `number` | no | | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Emit collab:path-start (/docs/reference/websocket/events/send-collab-path-start) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} client → server on the `collab` channel. Socket.IO event name: `collab:path-start` . Pen drawing started. Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. ## Payload: `collab:path-start` [#payload-collabpath-start] Payload of the 'collab:path-start' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `pathId` | `string` | no | Client generated path ID. | | `strokeColor` | `string` | no | | | `strokeWidth` | `number` | no | | | `points` | `object[]` | no | Initial point(s) of the path (client defined shape). | | `fadeDuration` | `number` | no | Milliseconds after which the path fades (0 = persistent). | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Emit collab:path-update (/docs/reference/websocket/events/send-collab-path-update) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} client → server on the `collab` channel. Socket.IO event name: `collab:path-update` . Pen drawing continued with additional points. Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. ## Payload: `collab:path-update` [#payload-collabpath-update] Payload of the 'collab:path-update' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `pathId` | `string` | no | | | `points` | `object[]` | no | Additional points appended to the path. | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Emit collab:playback-sync (/docs/reference/websocket/events/send-collab-playback-sync) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} client → server on the `collab` channel. Socket.IO event name: `collab:playback-sync` . Play/pause/seek state broadcast by the presenter to the other members. Only the current presenter socket may broadcast; other senders receive collab:playback-sync:rejected instead and nothing is relayed. Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. The server also stores currentTime/playing as the namespace playback state. ## Payload: `collab:playback-sync` [#payload-collabplayback-sync] Payload of the 'collab:playback-sync' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `action` | `string` | no | Client supplied action (e.g. 'play', 'pause', 'seek'). | | `currentTime` | `number` | no | | | `playing` | `boolean` | no | | | `duration` | `number` | no | | | `playbackRate` | `number` | no | | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Emit collab:presenter-request (/docs/reference/websocket/events/send-collab-presenter-request) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} client → server on the `collab` channel. Socket.IO event name: `collab:presenter-request` . Request for presenter control. From an admin it is granted immediately (collab:presenter-assign, reason admin-takeover); from a non-admin it is relayed to the current presenter socket only. Client emits collab:presenter-request (any data). Client -> server -> the current presenter socket only. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. requesterId / requesterDisplayName duplicate userId / displayName. ## Payload: `collab:presenter-request` [#payload-collabpresenter-request] Payload of the 'collab:presenter-request' socket event. | Property | Type | Required | Description | | ---------------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `requesterId` | `string` | no | | | `requesterDisplayName` | `string \| null` | no | | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Emit collab:presenter-takeover (/docs/reference/websocket/events/send-collab-presenter-takeover) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} client → server on the `collab` channel. Socket.IO event name: `collab:presenter-takeover` . Client -> server only: an admin or the current presenter hands presenter control to a target user. Results in a collab:presenter-assign (reason admin-takeover) to everyone; nothing is relayed under this name. Client payload: \{ targetUserId: string, targetDisplayName: string }. Ignored when the sender is neither an admin (workspaceOwner/workspaceAdmin/projectOwner/projectAdmin) nor the current presenter, or when targetUserId is missing. ## Payload: `collab:presenter-takeover` [#payload-collabpresenter-takeover] Client -> server payload (no server emission under this event name). | Property | Type | Required | Description | | ------------------- | -------- | -------- | ----------- | | `targetUserId` | `string` | no | | | `targetDisplayName` | `string` | no | | # Emit collab:region-create (/docs/reference/websocket/events/send-collab-region-create) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} client → server on the `collab` channel. Socket.IO event name: `collab:region-create` . Audio/video region created on the waveform/timeline. Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. ## Payload: `collab:region-create` [#payload-collabregion-create] Payload of the 'collab:region-create' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `regionId` | `string` | no | | | `startTime` | `number` | no | | | `endTime` | `number` | no | | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Emit collab:region-remove (/docs/reference/websocket/events/send-collab-region-remove) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} client → server on the `collab` channel. Socket.IO event name: `collab:region-remove` . Region removed. Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. ## Payload: `collab:region-remove` [#payload-collabregion-remove] Payload of the 'collab:region-remove' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `regionId` | `string` | no | | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Emit collab:state-request (/docs/reference/websocket/events/send-collab-state-request) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} client → server on the `collab` channel. Socket.IO event name: `collab:state-request` . Server -> the earliest joined other member: asks it to send its current annotation state to a late joiner (collab:state-response). Emitted automatically when a socket joins a namespace with existing members, and again when a client retries by emitting collab:state-request itself. ## Payload: `collab:state-request` [#payload-collabstate-request] Payload of the 'collab:state-request' socket event. | Property | Type | Required | Description | | ------------------- | --------- | -------- | -------------------------------------------------- | | `requesterId` | `string` | no | User ID of the late joiner. | | `requesterSocketId` | `string` | no | Socket ID to address the collab:state-response to. | | `timestamp` | `integer` | no | | # Emit collab:state-response (/docs/reference/websocket/events/send-collab-state-response) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} client → server on the `collab` channel. Socket.IO event name: `collab:state-response` . Server -> the requesting socket only: sanitised snapshot of paths, regions and zoom provided by an existing member. Client emits collab:state-response with \{ requesterSocketId, paths, regions, zoom }; the server validates/truncates (max 200 paths and 200 regions, string length limits) and forwards it only to requesterSocketId. ## Payload: `collab:state-response` [#payload-collabstate-response] Payload of the 'collab:state-response' socket event. | Property | Type | Required | Description | | ------------------- | ---------- | -------- | ----------------------------------------------------------------------------------------- | | `requesterSocketId` | `string` | no | | | `paths` | `object[]` | no | Path objects: \{ pathId, userId, color, strokeWidth, pathData, fadeDuration, createdAt }. | | `regions` | `object[]` | no | Region objects: \{ regionId, startTime, endTime, userId, displayName, color, avatarUrl }. | | `zoom` | `number` | no | Zoom level, omitted when the responder did not supply a number. | | `timestamp` | `integer` | no | | # Emit collab:zoom-sync (/docs/reference/websocket/events/send-collab-zoom-sync) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} client → server on the `collab` channel. Socket.IO event name: `collab:zoom-sync` . Zoom level broadcast (followers of the presenter apply it). Client -> server -> all other sockets in the same /chat/\{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. ## Payload: `collab:zoom-sync` [#payload-collabzoom-sync] Payload of the 'collab:zoom-sync' socket event. | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------------------------------------- | | `zoom` | `number` | no | | | `userId` | `string` | no | Authenticated user ID (server supplied, cannot be spoofed). | | `displayName` | `string \| null` | no | Display name (falls back to first + last name). | | `color` | `string \| null` | no | The user's profile colour. | | `avatarUrl` | `string \| null` | no | keyPath of the user's avatar thumbnail file, if any. | | `annotationColor` | `string` | no | Annotation colour assigned to this user for the collab session. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch when the event was relayed. | # Emit typing:start (/docs/reference/websocket/events/send-typing-start) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} client → server on the `resource` channel. Socket.IO event name: `typing:start` . Ephemeral typing indicator. Client -> server: emit \{ chatId }. Server -> clients: relayed with the authenticated userId to every other socket on the chat channels. Client emits typing:start with \{ chatId: string }. The server resolves the same channels a chatCreateMessage for that chat would use (chat/\{chatId}, project/\{projectId}/\{visibility}, public/\{token}; never user/\* channels) and emits typing:start on each of them to every socket except the sender. Not persisted; not delivered as a 'notification' event. ## Payload: `typing:start` [#payload-typingstart] Payload of the 'typing:start' socket event. | Property | Type | Required | Description | | ----------- | --------------- | -------- | -------------------------------------------------------------------------------------------- | | `chatId` | `string (uuid)` | no | Chat the typing indicator belongs to. | | `userId` | `string (uuid)` | no | User who is typing. Equals the AI system user ID when the AI assistant is composing a reply. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch. | # Emit typing:stop (/docs/reference/websocket/events/send-typing-stop) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} client → server on the `resource` channel. Socket.IO event name: `typing:stop` . Ephemeral typing indicator stop. Client -> server: emit \{ chatId }. Server -> clients: relayed with the authenticated userId to every other socket on the chat channels. Same routing and payload as typing:start. ## Payload: `typing:stop` [#payload-typingstop] Payload of the 'typing:stop' socket event. | Property | Type | Required | Description | | ----------- | --------------- | -------- | -------------------------------------------------------------------------------------------- | | `chatId` | `string (uuid)` | no | Chat the typing indicator belongs to. | | `userId` | `string (uuid)` | no | User who is typing. Equals the AI system user ID when the AI assistant is composing a reply. | | `timestamp` | `integer` | no | Server time in milliseconds since epoch. | # Emit ws:probe (/docs/reference/websocket/events/send-ws-probe) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} client → server on the `resource` channel. Socket.IO event name: `ws:probe` . Client -> server liveness probe. Emit with an acknowledgement callback; the server acks immediately with no payload. Client emits ws:probe (any/no data) using socket.io acks, e.g. socket.timeout(2000).emit('ws:probe', null, (err) => ...). A missing ack means the connection is stale and should be torn down. Nothing is emitted by the server other than the ack. ## Payload: `ws:probe` [#payload-wsprobe] Acknowledgement only; the server sends no payload. Type: `object` # aiChatMessageCreate (/docs/reference/websocket/notifications/aichatmessagecreate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `aiChatMessageCreate` . Fired when the AI assistant posts a message in an AI chat topic. Published on user/\{userId} of the topic owner. Payload for the aiChatMessageCreate event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ------------ | --------------- | -------- | -------------------------------------------------------------------- | | `(*)userId` | `string (uuid)` | no | Deprecated. | | `(*)topicId` | `string (uuid)` | no | Deprecated. | | `(*)message` | `object` | no | Deprecated. The assistant message. Use resource from changes.create. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `create` | `object[]` | no | | **`create`** (items) | Property | Type | Required | Description | | -------------- | ----------------- | -------- | ------------------------------ | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"aiChatMessage"` | no | | | `resource` | `object` | no | The created assistant message. | # aiChatTopicCreate (/docs/reference/websocket/notifications/aichattopiccreate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `aiChatTopicCreate` . Fired when an AI chat topic is created. Published on user/\{userId} of the topic owner. Payload for the aiChatTopicCreate event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------- | --------------- | -------- | ---------------------------------------------------------------- | | `(*)userId` | `string (uuid)` | no | Deprecated. | | `(*)topic` | `object` | no | Deprecated. The AI chat topic. Use resource from changes.create. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `create` | `object[]` | no | | **`create`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------ | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"aiChatTopic"` | no | | | `resource` | `object` | no | The created topic. | # aiChatTopicUpdate (/docs/reference/websocket/notifications/aichattopicupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `aiChatTopicUpdate` . Fired when an AI chat topic is updated (title, archive state, context items, last message preview) or deleted. Published on user/\{userId} of the topic owner. Payload for the aiChatTopicUpdate event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | changes.update on updates; changes.delete (no resource) when the topic is deleted. | **`tokens`** | Property | Type | Required | Description | | ----------- | --------------- | -------- | ------------------------------------------------------------------ | | `(*)userId` | `string (uuid)` | no | Deprecated. | | `(*)topic` | `object` | no | Deprecated. The AI chat topic (status pendingDelete when deleted). | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | | `delete` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------ | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"aiChatTopic"` | no | | | `resource` | `object` | no | The updated topic. | **`delete`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"aiChatTopic"` | no | | # assetDelete (/docs/reference/websocket/notifications/assetdelete) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `assetDelete` . Fired when an asset is deleted. Payload for the asset delete event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------------------- | --------------- | -------- | ----------- | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)assetId` | `string (uuid)` | no | | | `(*)name` | `string` | no | | | `(*)ownerResourceType` | `string` | no | | | `(*)ownerResourceId` | `string (uuid)` | no | | | `(*)visibility` | `string[]` | no | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `delete` | `object[]` | no | | **`delete`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | # assetFileUpdate (/docs/reference/websocket/notifications/assetfileupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `assetFileUpdate` . Fired when a file associated with an asset is updated or added. Fired when a file associated with an asset is updated or added (e.g., thumbnail generated). Payload for the asset file update event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------------- | --------------- | -------- | --------------------------------------------------------------- | | `(*)assetId` | `string (uuid)` | no | | | `(*)name` | `string` | no | | | `keyPath` | `string` | yes | The storage key of the new/updated file. | | `functionType` | `string` | yes | The role of the file (e.g., 'original', 'thumbnail', 'stream'). | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | yes | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"asset"` | no | | | `resource` | `object` | no | | # assetGroupUploadComplete (/docs/reference/websocket/notifications/assetgroupuploadcomplete) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `assetGroupUploadComplete` . Fired when an uploaded asset becomes active. Uploads by the same creator into the same resource/visibility within the grouping window (30 min) are accumulated into one notification, which is then re-sent via notificationUpdate. Fired when a group of assets finishes uploading within a defined time window. Subsequent uploads in the window update this notification (tokens.assets and tokens.uploadCount grow) and emit notificationUpdate. Payload for the assetGroupUploadComplete event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | On the initial notification changes.update contains the first asset; the grouped notification delivered via notificationUpdate is NOT extended with later assets (only tokens are). | **`tokens`** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ---------------------------------------------------------------------- | | `(*)creatorId` | `string (uuid)` | no | Deprecated. Use initiatorId. | | `(*)creator` | `object` | no | Deprecated. Public user object of the uploader. Use initiator. | | `visibility` | `string[]` | yes | Visibility of the uploaded asset(s). | | `(*)assets` | `object[]` | no | Deprecated. Uploaded asset objects. Use resources from changes.update. | | `uploadCount` | `integer` | yes | Number of assets accumulated in this group so far. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"asset"` | no | | | `resource` | `object` | no | The uploaded asset. | # assetNameChange (/docs/reference/websocket/notifications/assetnamechange) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `assetNameChange` . Fired when an asset's name is changed. Payload for the asset name change event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------------------- | --------------- | -------- | ------------------------- | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)assetId` | `string (uuid)` | no | | | `(*)ownerResourceType` | `string` | no | | | `(*)ownerResourceId` | `string (uuid)` | no | | | `(*)visibility` | `string[]` | no | | | `oldName` | `string` | yes | | | `newName` | `string` | yes | | | `(*)asset` | `object` | no | The updated asset object. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # assetPostProcessUpdate (/docs/reference/websocket/notifications/assetpostprocessupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `assetPostProcessUpdate` . Fired periodically during asset post-processing (e.g., transcoding). Payload for the asset post-process update event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ----------------------------------------------- | | `assetId` | `string (uuid)` | yes | | | `percentComplete` | `number (float)` | yes | | | `status` | `string` | yes | | | `meta` | `object` | yes | Additional metadata about the processing state. | # assetPublish (/docs/reference/websocket/notifications/assetpublish) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `assetPublish` . Fired for each individual asset published through the project publish flow (accompanies fileSystemPublish / projectItemsPublish). Emitted per published asset on the asset's own channel (asset/\{assetId}) plus the project channels. Folders published in the same operation emit folderPublish. Payload for the assetPublish event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------- | -------- | -------- | ---------------------------- | | `name` | `string` | yes | Name of the published asset. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | --------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"asset"` | no | | | `resource` | `object` | no | The published asset object. | # assetStatusUpdate (/docs/reference/websocket/notifications/assetstatusupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `assetStatusUpdate` . Fired when an asset's status changes (e.g., during processing). Payload for the asset status update event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------------- | --------------- | -------- | ----------------------------------------- | | `(*)assetId` | `string (uuid)` | no | | | `name` | `string` | yes | | | `oldStatus` | `string` | yes | | | `newStatus` | `string` | yes | | | `(*)updatedAsset` | `object` | no | The asset object with the updated status. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | yes | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # assetTag (/docs/reference/websocket/notifications/assettag) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `assetTag` . Fired when a tag is added to an asset. Payload for the assetTag event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | Not populated for this event (the notification is created without a changes object). | **`tokens`** | Property | Type | Required | Description | | --------- | -------- | -------- | ------------------------------- | | `name` | `string` | yes | Asset name. | | `tagName` | `string` | yes | Name of the tag that was added. | # assetUnpublish (/docs/reference/websocket/notifications/assetunpublish) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `assetUnpublish` . Fired for each individual asset unpublished through the project unpublish flow (accompanies fileSystemUnpublish / projectItemsUnpublish). Emitted per unpublished asset on the asset's own channel (asset/\{assetId}) plus the project channels. Payload for the assetUnpublish event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------- | -------- | -------- | ------------------------------ | | `name` | `string` | yes | Name of the unpublished asset. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"asset"` | no | | | `resource` | `object` | no | The unpublished asset object. | # assetUntag (/docs/reference/websocket/notifications/assetuntag) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `assetUntag` . Fired when a tag is removed from an asset. Payload for the assetUntag event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | Not populated for this event (the notification is created without a changes object). | **`tokens`** | Property | Type | Required | Description | | --------- | -------- | -------- | --------------------------------- | | `name` | `string` | yes | Asset name. | | `tagName` | `string` | yes | Name of the tag that was removed. | # boardColumnAdd (/docs/reference/websocket/notifications/boardcolumnadd) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `boardColumnAdd` . Fired when a column is added to a board. Payload for the boardColumnAdd event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------------- | --------------- | -------- | --------------------------------------------- | | `(*)projectId` | `string (uuid)` | no | Deprecated. | | `(*)boardId` | `string (uuid)` | no | Deprecated. | | `boardName` | `string` | yes | | | `columnName` | `string` | yes | | | `(*)column` | `object` | no | Deprecated. Use resource from changes.create. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `create` | `object[]` | no | | **`create`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"boardColumn"` | no | | | `resource` | `object` | no | The created column. | # boardColumnDelete (/docs/reference/websocket/notifications/boardcolumndelete) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `boardColumnDelete` . Fired when a board column is deleted. Payload for the boardColumnDelete event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `(*)projectId` | `string (uuid)` | no | Deprecated. | | `(*)boardId` | `string (uuid)` | no | Deprecated. | | `boardName` | `string` | yes | | | `(*)columnId` | `string (uuid)` | no | Deprecated. | | `columnName` | `string` | yes | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `delete` | `object[]` | no | | **`delete`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"boardColumn"` | no | | # boardColumnReorder (/docs/reference/websocket/notifications/boardcolumnreorder) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `boardColumnReorder` . Fired when the columns of a board are reordered. changes.update contains every column with its new order. Payload for the boardColumnReorder event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `(*)projectId` | `string (uuid)` | no | Deprecated. | | `(*)boardId` | `string (uuid)` | no | Deprecated. | | `boardName` | `string` | yes | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | -------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"boardColumn"` | no | | | `resource` | `object` | no | A column with its updated order. | # boardColumnUpdate (/docs/reference/websocket/notifications/boardcolumnupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `boardColumnUpdate` . Fired when a board column is updated. Payload for the boardColumnUpdate event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------------- | --------------- | -------- | --------------------------------------------- | | `(*)projectId` | `string (uuid)` | no | Deprecated. | | `(*)boardId` | `string (uuid)` | no | Deprecated. | | `boardName` | `string` | yes | | | `(*)columnId` | `string (uuid)` | no | Deprecated. | | `columnName` | `string` | yes | | | `(*)column` | `object` | no | Deprecated. Use resource from changes.update. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"boardColumn"` | no | | | `resource` | `object` | no | The updated column. | # boardCreate (/docs/reference/websocket/notifications/boardcreate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `boardCreate` . Fired when a kanban board is created. Published on the project visibility channels of the board. Payload for the boardCreate event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------------- | --------------- | -------- | --------------------------------------------- | | `(*)projectId` | `string (uuid)` | no | Deprecated. | | `boardName` | `string` | yes | | | `(*)board` | `object` | no | Deprecated. Use resource from changes.create. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `create` | `object[]` | no | | **`create`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------ | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"board"` | no | | | `resource` | `object` | no | The created board. | # boardDelete (/docs/reference/websocket/notifications/boarddelete) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `boardDelete` . Fired when a kanban board is deleted. Cascaded task deletions / reassignments are included in changes. Payload for the boardDelete event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | changes.delete always contains the board plus one entry per task deleted with it; changes.update (present only when tasks were moved to another board) lists the reassigned tasks without a resource object. | **`tokens`** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `(*)projectId` | `string (uuid)` | no | Deprecated. | | `boardName` | `string` | yes | | **`changes`** | Property | Type | Required | Description | | -------- | -------------------- | -------- | ----------- | | `update` | `object[]` | no | | | `delete` | `object \| object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------------------------------------ | | `resourceId` | `string (uuid)` | no | ID of a task reassigned to another board/column. | | `resourceType` | `"task"` | no | | **`delete`** (items) One of 2 variants: **Variant 1** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"board"` | no | | **Variant 2** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------------------------ | | `resourceId` | `string (uuid)` | no | ID of a task deleted with the board. | | `resourceType` | `"task"` | no | | # boardFollow (/docs/reference/websocket/notifications/boardfollow) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `boardFollow` . Fired when a user follows a board. Payload for the boardFollow event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------------- | --------------- | -------- | --------------------------- | | `(*)projectId` | `string (uuid)` | no | Deprecated. | | `(*)boardId` | `string (uuid)` | no | Deprecated. Use resourceId. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | --------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"board"` | no | | | `resource` | `object` | no | The board with updated followers. | # boardTaskAdd (/docs/reference/websocket/notifications/boardtaskadd) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `boardTaskAdd` . Fired when an existing task is added to a board. Payload for the boardTaskAdd event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `(*)projectId` | `string (uuid)` | no | Deprecated. | | `(*)boardId` | `string (uuid)` | no | Deprecated. | | `boardName` | `string` | yes | | | `(*)taskId` | `string (uuid)` | no | Deprecated. | | `taskSubject` | `string` | yes | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | --------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"task"` | no | | | `resource` | `object` | no | The task now placed on the board. | # boardTaskAssign (/docs/reference/websocket/notifications/boardtaskassign) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `boardTaskAssign` . Fired when a task is assigned or unassigned. Published on the board visibility channels and user/\{assignedToId}. Payload for the boardTaskAssign event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------------- | ----------------------- | -------- | ----------------------------------- | | `(*)projectId` | `string (uuid)` | no | Deprecated. | | `taskNumber` | `integer` | yes | | | `taskSubject` | `string` | yes | | | `assignedToId` | `string (uuid) \| null` | yes | New assignee, null when unassigned. | | `boardName` | `string \| null` | yes | | | `(*)boardId` | `string (uuid) \| null` | no | Deprecated. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"task"` | no | | | `resource` | `object` | no | The task with the new assignee. | # boardTaskCreate (/docs/reference/websocket/notifications/boardtaskcreate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `boardTaskCreate` . Fired when a task is created on a board (UI, AI tool or bulk create). Also used for push notifications. Payload for the boardTaskCreate event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `(*)projectId` | `string (uuid)` | no | Deprecated. | | `taskNumber` | `integer` | yes | | | `taskSubject` | `string` | yes | | | `boardName` | `string` | yes | | | `(*)boardId` | `string (uuid)` | no | Deprecated. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `create` | `object[]` | no | | **`create`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"task"` | no | | | `resource` | `object` | no | The created task. | # boardTaskLink (/docs/reference/websocket/notifications/boardtasklink) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `boardTaskLink` . Fired when two tasks are linked. Payload for the boardTaskLink event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------------- | --------------- | -------- | ---------------------------------- | | `(*)projectId` | `string (uuid)` | no | Deprecated. | | `(*)taskId` | `string (uuid)` | no | Deprecated. | | `(*)linkedTaskId` | `string (uuid)` | no | Deprecated. | | `linkType` | `string` | yes | Link type (defaults to 'related'). | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `create` | `object[]` | no | | **`create`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------------ | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"taskLink"` | no | | | `resource` | `object` | no | The created link record. | # boardTaskMove (/docs/reference/websocket/notifications/boardtaskmove) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `boardTaskMove` . Fired when a task is moved between columns or boards. Published on the visibility channels of both boards for cross-board moves. Payload for the boardTaskMove event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------------- | ----------------------- | -------- | ------------------------------------------------------------------- | | `(*)projectId` | `string (uuid)` | no | Deprecated. | | `taskNumber` | `integer` | yes | | | `taskSubject` | `string` | yes | | | `fromColumnName` | `string` | yes | | | `toColumnName` | `string` | yes | | | `boardName` | `string` | yes | Destination board name. | | `(*)boardId` | `string (uuid)` | no | Deprecated. Destination board ID. | | `fromBoardName` | `string \| null` | yes | Source board name for cross-board moves, null for same-board moves. | | `fromBoardId` | `string (uuid) \| null` | yes | Source board ID for cross-board moves, null for same-board moves. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | --------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"task"` | no | | | `resource` | `object` | no | The moved task. | # boardTaskRelationAdd (/docs/reference/websocket/notifications/boardtaskrelationadd) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `boardTaskRelationAdd` . Fired when a resource (asset, folder, message, chat, ...) is related to a task. Also used for push notifications. Payload for the boardTaskRelationAdd event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------------------------- | | `(*)projectId` | `string (uuid)` | no | Deprecated. | | `(*)taskId` | `string (uuid)` | no | Deprecated. | | `resourceId` | `string (uuid)` | yes | ID of the related resource. | | `resourceType` | `string` | yes | Type of the related resource. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `create` | `object[]` | no | | **`create`** (items) | Property | Type | Required | Description | | -------------- | ---------------- | -------- | ---------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"taskRelation"` | no | | | `resource` | `object` | no | The created relation record. | # boardTaskRelationRemove (/docs/reference/websocket/notifications/boardtaskrelationremove) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `boardTaskRelationRemove` . Fired when a task relation is removed (explicitly, or cascaded when a board visibility change removes access). Payload for the boardTaskRelationRemove event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------------- | ----------------------- | -------- | --------------------------------------------------------- | | `(*)projectId` | `string (uuid)` | no | Deprecated. | | `(*)taskId` | `string (uuid) \| null` | no | Deprecated. Null for cascaded removals. | | `resourceId` | `string (uuid) \| null` | yes | ID of the related resource. Null for cascaded removals. | | `resourceType` | `string \| null` | yes | Type of the related resource. Null for cascaded removals. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `delete` | `object[]` | no | | **`delete`** (items) | Property | Type | Required | Description | | -------------- | ---------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"taskRelation"` | no | | # boardTaskRemove (/docs/reference/websocket/notifications/boardtaskremove) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `boardTaskRemove` . Fired when a task is removed from a board (the task itself is kept). Payload for the boardTaskRemove event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `(*)projectId` | `string (uuid)` | no | Deprecated. | | `(*)boardId` | `string (uuid)` | no | Deprecated. | | `boardName` | `string` | yes | | | `(*)taskId` | `string (uuid)` | no | Deprecated. | | `taskSubject` | `string` | yes | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | -------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"task"` | no | | | `resource` | `object` | no | The task after removal from the board. | # boardTaskUnlink (/docs/reference/websocket/notifications/boardtaskunlink) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `boardTaskUnlink` . Fired when a task link is removed. Payload for the boardTaskUnlink event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------------- | --------------- | -------- | ----------- | | `(*)projectId` | `string (uuid)` | no | Deprecated. | | `(*)taskId` | `string (uuid)` | no | Deprecated. | | `(*)linkedTaskId` | `string (uuid)` | no | Deprecated. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `delete` | `object[]` | no | | **`delete`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------------------------------------- | | `resourceId` | `string (uuid)` | no | Note: the source task ID, not the link record ID. | | `resourceType` | `"taskLink"` | no | | # boardTaskUpdate (/docs/reference/websocket/notifications/boardtaskupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `boardTaskUpdate` . Fired when a task's details are updated (subject, description, priority, dates, etc.). Payload for the boardTaskUpdate event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `(*)projectId` | `string (uuid)` | no | Deprecated. | | `(*)boardId` | `string (uuid)` | no | Deprecated. | | `boardName` | `string` | yes | | | `(*)taskId` | `string (uuid)` | no | Deprecated. | | `taskSubject` | `string` | yes | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"task"` | no | | | `resource` | `object` | no | The updated task. | # boardUnfollow (/docs/reference/websocket/notifications/boardunfollow) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `boardUnfollow` . Fired when a user unfollows a board. Payload for the boardUnfollow event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------------- | --------------- | -------- | --------------------------- | | `(*)projectId` | `string (uuid)` | no | Deprecated. | | `(*)boardId` | `string (uuid)` | no | Deprecated. Use resourceId. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | --------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"board"` | no | | | `resource` | `object` | no | The board with updated followers. | # boardUpdate (/docs/reference/websocket/notifications/boardupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `boardUpdate` . Fired when a kanban board is updated (name, visibility, options). Payload for the boardUpdate event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------------- | --------------- | -------- | --------------------------------------------- | | `(*)projectId` | `string (uuid)` | no | Deprecated. | | `boardName` | `string` | yes | | | `(*)board` | `object` | no | Deprecated. Use resource from changes.update. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------ | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"board"` | no | | | `resource` | `object` | no | The updated board. | # botCreate (/docs/reference/websocket/notifications/botcreate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `botCreate` . Fired when a bot user is created in a workspace. Published on workspace/\{workspaceId}. Payload for the botCreate event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------------- | --------------- | -------- | ------------------------------------------------------------------ | | `(*)workspaceId` | `string (uuid)` | no | Deprecated. Use resourceId. | | `(*)bot` | `object` | no | Deprecated. The bot user object. Use resource from changes.create. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `create` | `object[]` | no | | **`create`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | --------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"user"` | no | | | `resource` | `object` | no | The created bot user (accountType bot). | # chatCreateMessage (/docs/reference/websocket/notifications/chatcreatemessage) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `chatCreateMessage` . Fired when a new message is created in a chat (user messages, public/guest messages, AI assistant replies and system messages). Fired when a new message is created in a chat. Published on chat/\{chatId}, the topic resource channel(s) and user/\{userId} for member chats. Payload for the chatCreateMessage event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | changes.create holds the message and changes.update the parent chat (lastMessage etc.). When the message creates the chat itself (first message in a new topic chat) the chat entry appears in changes.create instead of changes.update. | **`tokens`** | Property | Type | Required | Description | | ----------------- | --------------- | -------- | ---------------------------------------------------------------------------------------------- | | `(*)requesterId` | `string (uuid)` | no | Deprecated. Use initiatorId. | | `(*)requester` | `object` | no | Deprecated. Use initiator. | | `(*)chatId` | `string (uuid)` | no | Deprecated. | | `(*)messageId` | `string (uuid)` | no | Deprecated. | | `(*)resourceType` | `string` | no | Deprecated. Topic/scope resource type of the chat (e.g. 'project', 'asset', 'task', 'public'). | | `(*)resourceId` | `string (uuid)` | no | Deprecated. | | `(*)visibility` | `string[]` | no | Deprecated. | | `(*)mentions` | `object[]` | no | Deprecated. Mentions contained in the message. | | `(*)message` | `object` | no | Deprecated. The created message object. Use resource from changes.create. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `create` | `object[]` | no | | | `update` | `object[]` | no | | **`create`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | -------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chatMessage"` | no | | | `resource` | `object` | no | The created message. | **`update`** (items) | Property | Type | Required | Description | | -------------- | -------------------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chat" \| "chatMember" \| "chatSubmission"` | no | | | `resource` | `object` | no | The chat the message belongs to (resourceType reflects the chat model: 'chat' for topic chats, 'chatMember' for member chats, 'chatSubmission' for submission chats). | # chatDelete (/docs/reference/websocket/notifications/chatdelete) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `chatDelete` . Fired when a topic-based chat is deleted. Payload for the topic chat delete event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------------- | --------------- | -------- | ----------- | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)chatId` | `string (uuid)` | no | | | `(*)topicType` | `string` | no | | | `(*)topicId` | `string (uuid)` | no | | | `(*)visibility` | `string[]` | no | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `delete` | `object[]` | no | | **`delete`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | # chatDeleteMessage (/docs/reference/websocket/notifications/chatdeletemessage) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `chatDeleteMessage` . Fired when a chat message is deleted. Payload for the chatDeleteMessage event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------------- | ----------------------- | -------- | ---------------------------------------------------------- | | `(*)requesterId` | `string (uuid)` | no | Deprecated. Use initiatorId. | | `(*)requester` | `object` | no | Deprecated. Use initiator. | | `(*)chatId` | `string (uuid)` | no | Deprecated. | | `(*)messageId` | `string (uuid)` | no | Deprecated. | | `(*)resourceType` | `string` | no | Deprecated. | | `(*)resourceId` | `string (uuid)` | no | Deprecated. | | `(*)visibility` | `string[]` | no | Deprecated. | | `(*)replyToId` | `string (uuid) \| null` | no | Deprecated. ID of the message this was a reply to, if any. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | | `delete` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | -------------------------------------------- | -------- | --------------------------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chat" \| "chatMember" \| "chatSubmission"` | no | | | `resource` | `object` | no | The parent chat after the deletion (message counts etc.). | **`delete`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chatMessage"` | no | | # chatFollow (/docs/reference/websocket/notifications/chatfollow) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `chatFollow` . Fired when a user follows a chat. Published on the chat channels. Payload for the chatFollow event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | Always an empty object for this event. | | `changes` | `object` | no | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | -------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chat"` | no | | | `resource` | `object` | no | The chat with updated followers. | # chatHighlightMessage (/docs/reference/websocket/notifications/chathighlightmessage) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `chatHighlightMessage` . Fired when a message in a project-scoped chat is highlighted. Published on project/\{projectId}/\{visibility} of the chat. Payload for the chatHighlightMessage event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------------- | --------------- | -------- | ---------------------------- | | `(*)requesterId` | `string (uuid)` | no | Deprecated. Use initiatorId. | | `(*)requester` | `object` | no | Deprecated. Use initiator. | | `(*)chatId` | `string (uuid)` | no | Deprecated. | | `(*)messageId` | `string (uuid)` | no | Deprecated. | | `(*)projectId` | `string (uuid)` | no | Deprecated. | **`changes`** | Property | Type | Required | Description | | -------- | -------------------- | -------- | ----------- | | `update` | `object \| object[]` | no | | **`update`** (items) One of 2 variants: **Variant 1** | Property | Type | Required | Description | | -------------- | --------------- | -------- | -------------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chat"` | no | | | `resource` | `object` | no | The chat containing the highlighted message. | **Variant 2** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------------ | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chatMessage"` | no | | | `resource` | `object` | no | The highlighted message. | # chatMemberArchive (/docs/reference/websocket/notifications/chatmemberarchive) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `chatMemberArchive` . Fired when the requesting user archives a member chat for themselves. Published on user/\{userId} only. Payload for the chatMemberArchive event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------- | --------------- | -------- | --------------------------- | | `(*)chatId` | `string (uuid)` | no | Deprecated. Use resourceId. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------------------------------------------ | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chatMember"` | no | | | `resource` | `object` | no | The member chat (with the archive state for the user). | # chatMemberChatCreate (/docs/reference/websocket/notifications/chatmemberchatcreate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `chatMemberChatCreate` . Fired when a new member-based chat (DM/group) is created. Fired when a new member-based chat (direct message/group) is created. Payload for the member chat create event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------------- | --------------- | -------- | ----------- | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)chatId` | `string (uuid)` | no | | | `(*)scopeType` | `string` | no | | | `(*)scopeId` | `string (uuid)` | no | | | `(*)members` | `object[]` | no | | | `(*)subject` | `string` | no | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `create` | `object[]` | no | | **`create`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # chatMemberDelete (/docs/reference/websocket/notifications/chatmemberdelete) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `chatMemberDelete` . Fired when a member-based chat is deleted. Payload for the member chat delete event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------------- | --------------- | -------- | ----------- | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)chatId` | `string (uuid)` | no | | | `(*)scopeType` | `string` | no | | | `(*)scopeId` | `string (uuid)` | no | | | `(*)members` | `object[]` | no | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `delete` | `object[]` | no | | **`delete`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | # chatMemberUnarchive (/docs/reference/websocket/notifications/chatmemberunarchive) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `chatMemberUnarchive` . Fired when the requesting user un-archives a member chat for themselves. Published on user/\{userId} only. Payload for the chatMemberUnarchive event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------- | --------------- | -------- | --------------------------- | | `(*)chatId` | `string (uuid)` | no | Deprecated. Use resourceId. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ---------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chatMember"` | no | | | `resource` | `object` | no | The member chat. | # chatMemberUpdate (/docs/reference/websocket/notifications/chatmemberupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `chatMemberUpdate` . Fired when a member chat's subject or colour is updated. Fired when a member-based chat is updated (subject and/or color). Published on chat/\{chatId} and user/\{memberId} for every member. Payload for the chatMemberUpdate event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------- | -------- | -------- | ------------------------------------------ | | `update` | `object` | yes | The submitted update: \{ subject, color }. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ---------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chatMember"` | no | | | `resource` | `object` | no | The updated member chat. | | `oldResource` | `object` | no | The member chat before the update. | # chatMention (/docs/reference/websocket/notifications/chatmention) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `chatMention` . Fired when user(s) are mentioned in a created or revised chat message. Published only on the mentioned users' channels (user/\{userId}). Fired specifically when a user is mentioned in a chat message. Tokens are the same set as chatCreateMessage / chatReviseMessage. Payload for the chatMention event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------------- | --------------- | -------- | --------------------------------------------------------------------------------- | | `(*)requesterId` | `string (uuid)` | no | Deprecated. Use initiatorId. | | `(*)requester` | `object` | no | Deprecated. Use initiator. | | `(*)chatId` | `string (uuid)` | no | Deprecated. | | `(*)messageId` | `string (uuid)` | no | Deprecated. | | `mentions` | `object[]` | yes | Mentions contained in the message. | | `(*)message` | `object` | no | Deprecated. The message containing the mention. Use resource from changes.update. | | `(*)resourceType` | `string` | no | Deprecated. Topic/scope resource type of the chat. | | `(*)resourceId` | `string (uuid)` | no | Deprecated. | | `(*)visibility` | `string[]` | no | Deprecated. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chatMessage"` | no | | | `resource` | `object` | no | The message containing the mention. | # chatRefreshMessage (/docs/reference/websocket/notifications/chatrefreshmessage) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `chatRefreshMessage` . Provides an updated representation of a system message (e.g. after the assets it references finish processing). Fired by the system to provide an updated representation of a message. initiatorType is always system. Payload for the chatRefreshMessage event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------------- | --------------- | -------- | --------------------------------------------------------------------------- | | `(*)chatId` | `string (uuid)` | no | Deprecated. | | `(*)messageId` | `string (uuid)` | no | Deprecated. | | `(*)message` | `object` | no | Deprecated. The refreshed message object. Use resource from changes.update. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ---------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chatMessage"` | no | | | `resource` | `object` | no | The refreshed message. | # chatRemoveAttachment (/docs/reference/websocket/notifications/chatremoveattachment) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `chatRemoveAttachment` . Fired when an attachment is removed from a chat message. Payload for the chat remove attachment event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------------- | --------------- | -------- | --------------------------------- | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)chatId` | `string (uuid)` | no | | | `(*)messageId` | `string (uuid)` | no | | | `(*)assetId` | `string (uuid)` | no | ID of the asset that was removed. | | `(*)resourceType` | `string` | no | | | `(*)resourceId` | `string (uuid)` | no | | | `(*)visibility` | `string[]` | no | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # chatReviseMessage (/docs/reference/websocket/notifications/chatrevisemessage) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `chatReviseMessage` . Fired when a chat message is revised (edited). Payload for the chatReviseMessage event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------------- | --------------- | -------- | ------------------------------------------------------------------------- | | `(*)requesterId` | `string (uuid)` | no | Deprecated. Use initiatorId. | | `(*)requester` | `object` | no | Deprecated. Use initiator. | | `(*)chatId` | `string (uuid)` | no | Deprecated. | | `(*)messageId` | `string (uuid)` | no | Deprecated. | | `(*)resourceType` | `string` | no | Deprecated. | | `(*)resourceId` | `string (uuid)` | no | Deprecated. | | `(*)visibility` | `string[]` | no | Deprecated. | | `(*)mentions` | `object[]` | no | Deprecated. | | `(*)message` | `object` | no | Deprecated. The revised message object. Use resource from changes.update. | **`changes`** | Property | Type | Required | Description | | -------- | -------------------- | -------- | ----------- | | `update` | `object \| object[]` | no | | **`update`** (items) One of 2 variants: **Variant 1** | Property | Type | Required | Description | | -------------- | --------------- | -------- | -------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chatMessage"` | no | | | `resource` | `object` | no | The revised message. | | `oldResource` | `object` | no | The message before the revision. | **Variant 2** | Property | Type | Required | Description | | -------------- | -------------------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chat" \| "chatMember" \| "chatSubmission"` | no | | | `resource` | `object` | no | The chat the message belongs to (resourceType reflects the chat model: 'chat' for topic chats, 'chatMember' for member chats, 'chatSubmission' for submission chats). | # chatTopicChatCreate (/docs/reference/websocket/notifications/chattopicchatcreate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `chatTopicChatCreate` . Fired when a new topic-based chat is created. Fired when a new topic-based chat is created (linked to an asset or project). Payload for the topic chat create event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------------- | --------------- | -------- | ----------- | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)chatId` | `string (uuid)` | no | | | `(*)topicType` | `string` | no | | | `(*)topicId` | `string (uuid)` | no | | | `(*)visibility` | `string[]` | no | | | `(*)subject` | `string` | no | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `create` | `object[]` | no | | **`create`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # chatUnfollow (/docs/reference/websocket/notifications/chatunfollow) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `chatUnfollow` . Fired when a user unfollows a chat. Published on the chat channels. Payload for the chatUnfollow event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | Always an empty object for this event. | | `changes` | `object` | no | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | -------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chat"` | no | | | `resource` | `object` | no | The chat with updated followers. | # chatUpdateSubject (/docs/reference/websocket/notifications/chatupdatesubject) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `chatUpdateSubject` . Fired when the subject of a topic-based chat is updated. Payload for the topic chat subject update event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------------- | --------------- | -------- | ----------- | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)chatId` | `string (uuid)` | no | | | `(*)topicType` | `string` | no | | | `(*)topicId` | `string (uuid)` | no | | | `(*)visibility` | `string[]` | no | | | `oldSubject` | `string` | yes | | | `newSubject` | `string` | yes | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | | `oldResource` | `object` | no | The chat before the subject change. | # convoComplete (/docs/reference/websocket/notifications/convocomplete) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `convoComplete` . Fired when a convo is completed (ended by a user or when the last participant leaves). Payload for the convoComplete event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ------------------ | --------------- | -------- | ----------- | | `(*)convoId` | `string (uuid)` | no | Deprecated. | | `(*)chatId` | `string (uuid)` | no | Deprecated. | | `(*)userId` | `string (uuid)` | no | Deprecated. | | `userName` | `string` | yes | | | `durationMinutes` | `number` | yes | | | `participantNames` | `string[]` | yes | | **`changes`** | Property | Type | Required | Description | | -------- | ------------------------------ | -------- | ----------- | | `update` | `object \| object \| object[]` | no | | **`update`** (items) One of 3 variants: **Variant 1** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"convo"` | no | | | `resource` | `object` | no | The convo. | **Variant 2** | Property | Type | Required | Description | | -------------- | -------------------------------------------- | -------- | -------------------------------------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chat" \| "chatMember" \| "chatSubmission"` | no | | | `resource` | `object` | no | The chat the convo belongs to (resourceType is the chat model name). | **Variant 3** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------------------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chatMessage"` | no | | | `resource` | `object` | no | The system message posted to the chat for this event. | # convoDelete (/docs/reference/websocket/notifications/convodelete) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `convoDelete` . Fired when a convo is deleted. Payload for the convoDelete event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ------------ | -------------------------------------------- | -------- | ----------- | | `(*)convoId` | `string (uuid)` | no | Deprecated. | | `(*)chatId` | `string (uuid)` | no | Deprecated. | | `chatType` | `"chat" \| "chatMember" \| "chatSubmission"` | yes | | | `(*)userId` | `string (uuid)` | no | Deprecated. | | `userName` | `string` | yes | | **`changes`** | Property | Type | Required | Description | | -------- | -------------------- | -------- | ----------- | | `update` | `object \| object[]` | no | | | `delete` | `object[]` | no | | **`update`** (items) One of 2 variants: **Variant 1** | Property | Type | Required | Description | | -------------- | -------------------------------------------- | -------- | ------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chat" \| "chatMember" \| "chatSubmission"` | no | | | `resource` | `object` | no | The chat the convo belonged to. | **Variant 2** | Property | Type | Required | Description | | -------------- | --------------- | -------- | -------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chatMessage"` | no | | | `resource` | `object` | no | The system message posted to the chat. | **`delete`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"convo"` | no | | # convoHandover (/docs/reference/websocket/notifications/convohandover) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `convoHandover` . Fired on user/\{userId} when the user joins a convo from a second device, so the previous device can leave the call. Payload for the convoHandover event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | Not populated for this event (the notification is created without a changes object). | **`tokens`** | Property | Type | Required | Description | | ------------ | --------------- | -------- | ---------------------------- | | `(*)convoId` | `string (uuid)` | no | Deprecated. Use resourceId. | | `(*)userId` | `string (uuid)` | no | Deprecated. Use initiatorId. | # convoJoin (/docs/reference/websocket/notifications/convojoin) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `convoJoin` . Fired when a user joins a convo. Payload for the convoJoin event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ------------ | --------------- | -------- | ----------- | | `(*)convoId` | `string (uuid)` | no | Deprecated. | | `(*)userId` | `string (uuid)` | no | Deprecated. | | `userName` | `string` | yes | | **`changes`** | Property | Type | Required | Description | | -------- | ------------------------------ | -------- | ----------- | | `update` | `object \| object \| object[]` | no | | **`update`** (items) One of 3 variants: **Variant 1** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"convo"` | no | | | `resource` | `object` | no | The convo. | **Variant 2** | Property | Type | Required | Description | | -------------- | -------------------------------------------- | -------- | -------------------------------------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chat" \| "chatMember" \| "chatSubmission"` | no | | | `resource` | `object` | no | The chat the convo belongs to (resourceType is the chat model name). | **Variant 3** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------------------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chatMessage"` | no | | | `resource` | `object` | no | The system message posted to the chat for this event. | # convoLeave (/docs/reference/websocket/notifications/convoleave) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `convoLeave` . Fired when a user leaves a convo. Payload for the convoLeave event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ------------ | --------------- | -------- | ----------- | | `(*)convoId` | `string (uuid)` | no | Deprecated. | | `(*)userId` | `string (uuid)` | no | Deprecated. | | `userName` | `string` | yes | | **`changes`** | Property | Type | Required | Description | | -------- | ------------------------------ | -------- | ----------- | | `update` | `object \| object \| object[]` | no | | **`update`** (items) One of 3 variants: **Variant 1** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"convo"` | no | | | `resource` | `object` | no | The convo. | **Variant 2** | Property | Type | Required | Description | | -------------- | -------------------------------------------- | -------- | -------------------------------------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chat" \| "chatMember" \| "chatSubmission"` | no | | | `resource` | `object` | no | The chat the convo belongs to (resourceType is the chat model name). | **Variant 3** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------------------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chatMessage"` | no | | | `resource` | `object` | no | The system message posted to the chat for this event. | # convoParticipantJoined (/docs/reference/websocket/notifications/convoparticipantjoined) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `convoParticipantJoined` . Fired (from the call-provider webhook) when a participant actually joins the call room. Payload for the convoParticipantJoined event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------- | --------------- | -------- | ----------- | | `userName` | `string` | yes | | | `convoType` | `string` | yes | | | `(*)chatId` | `string (uuid)` | no | Deprecated. | **`changes`** | Property | Type | Required | Description | | -------- | -------------------- | -------- | ----------- | | `update` | `object \| object[]` | no | | **`update`** (items) One of 2 variants: **Variant 1** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------------------------ | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"convo"` | no | | | `resource` | `object` | no | The convo with updated participants. | **Variant 2** | Property | Type | Required | Description | | -------------- | -------------------------------------------- | -------- | ------------------------------ | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chat" \| "chatMember" \| "chatSubmission"` | no | | | `resource` | `object` | no | The chat the convo belongs to. | # convoParticipantLeft (/docs/reference/websocket/notifications/convoparticipantleft) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `convoParticipantLeft` . Fired (from the call-provider webhook) when a participant leaves the call room. Payload for the convoParticipantLeft event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------- | --------------- | -------- | ----------- | | `userName` | `string` | yes | | | `convoType` | `string` | yes | | | `(*)chatId` | `string (uuid)` | no | Deprecated. | **`changes`** | Property | Type | Required | Description | | -------- | -------------------- | -------- | ----------- | | `update` | `object \| object[]` | no | | **`update`** (items) One of 2 variants: **Variant 1** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------------------------ | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"convo"` | no | | | `resource` | `object` | no | The convo with updated participants. | **Variant 2** | Property | Type | Required | Description | | -------------- | -------------------------------------------- | -------- | ------------------------------ | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chat" \| "chatMember" \| "chatSubmission"` | no | | | `resource` | `object` | no | The chat the convo belongs to. | # convoStart (/docs/reference/websocket/notifications/convostart) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `convoStart` . Fired when a convo (call) is started in a chat. Published on the chat channels and user/\{userId} of the starter. Payload for the convoStart event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ------------ | -------------------------------------------- | -------- | --------------------- | | `(*)convoId` | `string (uuid)` | no | Deprecated. | | `(*)chatId` | `string (uuid)` | no | Deprecated. | | `chatType` | `"chat" \| "chatMember" \| "chatSubmission"` | yes | | | `convoType` | `string` | yes | | | `(*)userId` | `string (uuid)` | no | Deprecated. | | `userName` | `string` | yes | | | `roomUrl` | `string` | yes | URL of the call room. | **`changes`** | Property | Type | Required | Description | | -------- | -------------------- | -------- | ----------- | | `create` | `object \| object[]` | no | | | `update` | `object[]` | no | | **`create`** (items) One of 2 variants: **Variant 1** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------ | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"convo"` | no | | | `resource` | `object` | no | The started convo. | **Variant 2** | Property | Type | Required | Description | | -------------- | --------------- | -------- | -------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chatMessage"` | no | | | `resource` | `object` | no | The system message posted to the chat. | **`update`** (items) | Property | Type | Required | Description | | -------------- | -------------------------------------------- | -------- | ------------------------------ | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chat" \| "chatMember" \| "chatSubmission"` | no | | | `resource` | `object` | no | The chat the convo belongs to. | # convoUpdate (/docs/reference/websocket/notifications/convoupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `convoUpdate` . Fired when a convo is updated (subject / notes). Payload for the convoUpdate event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ------------ | -------------------------------------------- | -------- | ----------- | | `(*)convoId` | `string (uuid)` | no | Deprecated. | | `(*)chatId` | `string (uuid)` | no | Deprecated. | | `chatType` | `"chat" \| "chatMember" \| "chatSubmission"` | yes | | | `(*)userId` | `string (uuid)` | no | Deprecated. | | `userName` | `string` | yes | | **`changes`** | Property | Type | Required | Description | | -------- | ------------------------------ | -------- | ----------- | | `update` | `object \| object \| object[]` | no | | **`update`** (items) One of 3 variants: **Variant 1** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"convo"` | no | | | `resource` | `object` | no | The convo. | **Variant 2** | Property | Type | Required | Description | | -------------- | -------------------------------------------- | -------- | -------------------------------------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chat" \| "chatMember" \| "chatSubmission"` | no | | | `resource` | `object` | no | The chat the convo belongs to (resourceType is the chat model name). | **Variant 3** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------------------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chatMessage"` | no | | | `resource` | `object` | no | The system message posted to the chat for this event. | # fileSystemCopy (/docs/reference/websocket/notifications/filesystemcopy) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `fileSystemCopy` . Fired when items are copied to a new file system path. Payload for the fileSystemCopy event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | Not populated for this event (the notification is created without a changes object). | **`tokens`** | Property | Type | Required | Description | | ----------------- | ---------- | -------- | ----------------------------------------------------- | | `itemsCount` | `integer` | yes | Number of items copied. | | `itemPaths` | `string[]` | yes | Original file system paths of the copied items. | | `destinationPath` | `string` | yes | Destination file system path where items were copied. | # fileSystemCreate (/docs/reference/websocket/notifications/filesystemcreate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `fileSystemCreate` . Fired when items are created at a file system path (folder created, single uploaded asset activated, or items copied into a public release). Signals clients to refresh the destination path. The changes object is usually absent; it is populated only for the single-asset activation (create asset) and public release (update public) cases. Payload for the fileSystemCreate event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | Optional. Present only in some code paths (see description). | **`tokens`** | Property | Type | Required | Description | | ----------------- | --------- | -------- | -------------------------------------------------------------------------------------------- | | `itemsCount` | `integer` | yes | Number of items created. | | `destinationPath` | `string` | yes | File system path where items were created (e.g. 'project/\{projectId}/creator/\{basePath}'). | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `create` | `object[]` | no | | | `update` | `object[]` | no | | **`create`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | --------------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"asset"` | no | | | `resource` | `object` | no | The activated asset (upload completion path). | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ---------------------------------------------------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"public"` | no | | | `resource` | `object` | no | The public release record with recalculated inventory (add-items-to-release path). | # fileSystemDelete (/docs/reference/websocket/notifications/filesystemdelete) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `fileSystemDelete` . Fired when items are deleted from file system paths. Payload for the fileSystemDelete event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | Not populated for this event (the notification is created without a changes object). | **`tokens`** | Property | Type | Required | Description | | ------------ | ---------- | -------- | --------------------------------------- | | `itemsCount` | `integer` | yes | Number of items deleted. | | `itemPaths` | `string[]` | yes | File system paths of the deleted items. | # fileSystemMove (/docs/reference/websocket/notifications/filesystemmove) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `fileSystemMove` . Fired when items are moved to a new file system path. Payload for the fileSystemMove event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | Not populated for this event (the notification is created without a changes object). | **`tokens`** | Property | Type | Required | Description | | ----------------- | ---------- | -------- | ---------------------------------------------------- | | `itemsCount` | `integer` | yes | Number of items moved. | | `itemPaths` | `string[]` | yes | Original file system paths of the moved items. | | `destinationPath` | `string` | yes | Destination file system path where items were moved. | # fileSystemPublish (/docs/reference/websocket/notifications/filesystempublish) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `fileSystemPublish` . Fired when multiple items are published at a file system path. Fired when multiple items (assets/folders) are published at a file system path. Payload for the items published event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------------------- | --------- | -------- | -------------------------------------------- | | `(*)itemsCount` | `integer` | no | Number of items published. | | `(*)destinationPath` | `string` | no | File system path where items were published. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"asset" \| "folder"` | no | | | `resource` | `object` | no | | # fileSystemUnpublish (/docs/reference/websocket/notifications/filesystemunpublish) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `fileSystemUnpublish` . Fired when multiple items are unpublished from file system paths. Fired when multiple items (assets/folders) are unpublished from file system paths. Payload for the items unpublished event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | --------------- | ---------- | -------- | ------------------------------------------- | | `(*)itemsCount` | `integer` | no | Number of items unpublished. | | `(*)itemPaths` | `string[]` | no | File system paths of the unpublished items. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"asset" \| "folder"` | no | | | `resource` | `object` | no | | # folderCreate (/docs/reference/websocket/notifications/foldercreate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `folderCreate` . CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when a new folder is created. Fired when a new folder is created. Payload for the folder create event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------------- | --------------- | -------- | -------------------------------- | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)folder` | `object` | no | The newly created folder object. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `create` | `object[]` | no | | **`create`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # folderDelete (/docs/reference/websocket/notifications/folderdelete) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `folderDelete` . CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when a folder is deleted. Fired when a folder is deleted. Payload for the folder delete event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------------- | --------------- | -------- | ----------------------------------- | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)folder` | `object` | no | The folder object that was deleted. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `delete` | `object[]` | no | | **`delete`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | # folderPublish (/docs/reference/websocket/notifications/folderpublish) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `folderPublish` . Fired when an individual folder is published. Payload for the folder publish event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | --------- | -------- | -------- | -------------------------------------- | | `(*)name` | `string` | no | Name of the folder that was published. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # folderTag (/docs/reference/websocket/notifications/foldertag) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `folderTag` . Fired when a tag is added to a folder. Payload for the folderTag event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | Not populated for this event (the notification is created without a changes object). | **`tokens`** | Property | Type | Required | Description | | --------- | -------- | -------- | ------------------------------- | | `name` | `string` | yes | Folder name. | | `tagName` | `string` | yes | Name of the tag that was added. | # folderUntag (/docs/reference/websocket/notifications/folderuntag) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `folderUntag` . Fired when a tag is removed from a folder. Payload for the folderUntag event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | Not populated for this event (the notification is created without a changes object). | **`tokens`** | Property | Type | Required | Description | | --------- | -------- | -------- | --------------------------------- | | `name` | `string` | yes | Folder name. | | `tagName` | `string` | yes | Name of the tag that was removed. | # folderUpdate (/docs/reference/websocket/notifications/folderupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `folderUpdate` . CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when a folder is updated. Fired when a folder is updated (name, color, etc.). Payload for the folder update event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ------------------- | --------------- | -------- | ------------------------------------ | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)originalFolder` | `object` | no | The folder object before the update. | | `(*)updatedFolder` | `object` | no | The folder object after the update. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # iconUpdate (/docs/reference/websocket/notifications/iconupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `iconUpdate` . Generic event for when a workspace or project icon asset becomes active. Includes the updated owner resource in changes. Fired by the system when an icon asset's upload completes. changes.update contains the asset and the owning workspace/project. Payload for the iconUpdate event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------------- | -------------------------- | -------- | ------------------------------------------------------- | | `(*)resourceType` | `"workspace" \| "project"` | no | Deprecated. | | `(*)resourceId` | `string (uuid)` | no | Deprecated. | | `(*)asset` | `object` | no | Deprecated. The asset object representing the new icon. | **`changes`** | Property | Type | Required | Description | | -------- | -------------------- | -------- | ----------- | | `update` | `object \| object[]` | no | | **`update`** (items) One of 2 variants: **Variant 1** | Property | Type | Required | Description | | -------------- | --------------- | -------- | --------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"asset"` | no | | | `resource` | `object` | no | The icon asset. | **Variant 2** | Property | Type | Required | Description | | -------------- | -------------------------- | -------- | ---------------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"workspace" \| "project"` | no | | | `resource` | `object` | no | The owning resource with the new icon applied. | # Notification types (/docs/reference/websocket/notifications) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Each notification arrives as a `notification` socket event whose `type` names one of the entries below. Subscribe to `notification` on a channel and switch on `type`. | `type` | Summary | | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [`test`](/docs/reference/websocket/notifications/test) | Event used for testing websocket connections. | | [`notificationUpdate`](/docs/reference/websocket/notifications/notificationupdate) | Indicates that a previously delivered, grouped notification has been updated (assetGroupUploadComplete or projectGroupItemPublish). | | [`workspaceCreate`](/docs/reference/websocket/notifications/workspacecreate) | Fired when a new workspace is created. | | [`workspaceUpdate`](/docs/reference/websocket/notifications/workspaceupdate) | Fired when a workspace name is changed. | | [`workspaceDelete`](/docs/reference/websocket/notifications/workspacedelete) | Fired when a workspace is marked for deletion. | | [`workspaceLogoUpdate`](/docs/reference/websocket/notifications/workspacelogoupdate) | CURRENTLY UNUSED IN FAVOR OF logoUpdate event. Fired when a workspace logo is updated. | | [`projectCreate`](/docs/reference/websocket/notifications/projectcreate) | Fired when a new project is created. | | [`projectUpdate`](/docs/reference/websocket/notifications/projectupdate) | Fired when a project name is changed. | | [`projectDelete`](/docs/reference/websocket/notifications/projectdelete) | Fired when a project is marked for deletion. | | [`projectLogoUpdate`](/docs/reference/websocket/notifications/projectlogoupdate) | CURRENTLY UNUSED IN FAVOR OF logoUpdate event. Fired when a project logo is updated. Updates the project and returns the new asset object for the logo. Note that the logo will not be 'active' until the actual file is uploaded. So you will need to watch for updates to this asset before replacing the logo locally. | | [`projectAssetsPublish`](/docs/reference/websocket/notifications/projectassetspublish) | CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when assets within a project are published. | | [`projectAssetsUnpublish`](/docs/reference/websocket/notifications/projectassetsunpublish) | CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when assets within a project are unpublished. | | [`assetNameChange`](/docs/reference/websocket/notifications/assetnamechange) | Fired when an asset's name is changed. | | [`assetPublish`](/docs/reference/websocket/notifications/assetpublish) | Fired for each individual asset published through the project publish flow (accompanies fileSystemPublish / projectItemsPublish). | | [`assetUnpublish`](/docs/reference/websocket/notifications/assetunpublish) | Fired for each individual asset unpublished through the project unpublish flow (accompanies fileSystemUnpublish / projectItemsUnpublish). | | [`assetTag`](/docs/reference/websocket/notifications/assettag) | Fired when a tag is added to an asset. | | [`assetUntag`](/docs/reference/websocket/notifications/assetuntag) | Fired when a tag is removed from an asset. | | [`assetDelete`](/docs/reference/websocket/notifications/assetdelete) | Fired when an asset is deleted. | | [`assetStatusUpdate`](/docs/reference/websocket/notifications/assetstatusupdate) | Fired when an asset's status changes (e.g., during processing). | | [`assetPostProcessUpdate`](/docs/reference/websocket/notifications/assetpostprocessupdate) | Fired periodically during asset post-processing (e.g., transcoding). | | [`assetFileUpdate`](/docs/reference/websocket/notifications/assetfileupdate) | Fired when a file associated with an asset is updated or added. | | [`assetGroupUploadComplete`](/docs/reference/websocket/notifications/assetgroupuploadcomplete) | Fired when an uploaded asset becomes active. Uploads by the same creator into the same resource/visibility within the grouping window (30 min) are accumulated into one notification, which is then re-sent via notificationUpdate. | | [`chatTopicChatCreate`](/docs/reference/websocket/notifications/chattopicchatcreate) | Fired when a new topic-based chat is created. | | [`chatMemberChatCreate`](/docs/reference/websocket/notifications/chatmemberchatcreate) | Fired when a new member-based chat (DM/group) is created. | | [`chatUpdateSubject`](/docs/reference/websocket/notifications/chatupdatesubject) | Fired when the subject of a topic-based chat is updated. | | [`chatMemberUpdate`](/docs/reference/websocket/notifications/chatmemberupdate) | Fired when a member chat's subject or colour is updated. | | [`chatDelete`](/docs/reference/websocket/notifications/chatdelete) | Fired when a topic-based chat is deleted. | | [`chatMemberDelete`](/docs/reference/websocket/notifications/chatmemberdelete) | Fired when a member-based chat is deleted. | | [`chatCreateMessage`](/docs/reference/websocket/notifications/chatcreatemessage) | Fired when a new message is created in a chat (user messages, public/guest messages, AI assistant replies and system messages). | | [`chatReviseMessage`](/docs/reference/websocket/notifications/chatrevisemessage) | Fired when a chat message is revised (edited). | | [`chatRefreshMessage`](/docs/reference/websocket/notifications/chatrefreshmessage) | Provides an updated representation of a system message (e.g. after the assets it references finish processing). | | [`chatMention`](/docs/reference/websocket/notifications/chatmention) | Fired when user(s) are mentioned in a created or revised chat message. Published only on the mentioned users' channels (user/\{userId}). | | [`chatDeleteMessage`](/docs/reference/websocket/notifications/chatdeletemessage) | Fired when a chat message is deleted. | | [`chatRemoveAttachment`](/docs/reference/websocket/notifications/chatremoveattachment) | Fired when an attachment is removed from a chat message. | | [`folderCreate`](/docs/reference/websocket/notifications/foldercreate) | CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when a new folder is created. | | [`folderUpdate`](/docs/reference/websocket/notifications/folderupdate) | CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when a folder is updated. | | [`folderDelete`](/docs/reference/websocket/notifications/folderdelete) | CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when a folder is deleted. | | [`inviteCreate`](/docs/reference/websocket/notifications/invitecreate) | Fired when a new invitation is created. | | [`inviteCancel`](/docs/reference/websocket/notifications/invitecancel) | Fired when an invitation is cancelled. | | [`inviteAccept`](/docs/reference/websocket/notifications/inviteaccept) | Fired when an invitation is accepted. | | [`membershipDelete`](/docs/reference/websocket/notifications/membershipdelete) | Fired when a user's membership to a resource is deleted (removed). | | [`membershipAddRole`](/docs/reference/websocket/notifications/membershipaddrole) | Fired when a role is added to a user's membership. | | [`membershipRemoveRole`](/docs/reference/websocket/notifications/membershipremoverole) | Fired when a role is removed from a user's membership. | | [`membershipLeaveResource`](/docs/reference/websocket/notifications/membershipleaveresource) | Fired when a user leaves a resource themselves. | | [`workspaceStorageLimitWarning`](/docs/reference/websocket/notifications/workspacestoragelimitwarning) | Fired when a workspace's storage usage exceeds a threshold. | | [`userSelfUpdate`](/docs/reference/websocket/notifications/userselfupdate) | Fired when a user updates their own profile information. | | [`userPublicUpdate`](/docs/reference/websocket/notifications/userpublicupdate) | Fired when a user's public information is updated. | | [`userDeleted`](/docs/reference/websocket/notifications/userdeleted) | Fired when a user account is deleted. | | [`userAvatarUpdate`](/docs/reference/websocket/notifications/useravatarupdate) | Fired when a avatars status is set to active. Note that this is an asset event and not a user event so it is fired when the asset's status is set to active not when a user's object is updated. | | [`logoUpdate`](/docs/reference/websocket/notifications/logoupdate) | Generic event for when a workspace or project logo asset becomes active. Includes the updated owner resource in changes. | | [`iconUpdate`](/docs/reference/websocket/notifications/iconupdate) | Generic event for when a workspace or project icon asset becomes active. Includes the updated owner resource in changes. | | [`taskAcknowledged`](/docs/reference/websocket/notifications/taskacknowledged) | Fired when tasks are acknowledged within a project. | | [`taskStatusUpdate`](/docs/reference/websocket/notifications/taskstatusupdate) | Fired when the status of a task is updated. | | [`taskCreate`](/docs/reference/websocket/notifications/taskcreate) | Fired when a new task is created within a project. | | [`notificationUpdateLastSeen`](/docs/reference/websocket/notifications/notificationupdatelastseen) | Fired to update a client's 'last seen' timestamp for notifications. | | [`submissionCreate`](/docs/reference/websocket/notifications/submissioncreate) | Fired when a submission is released for the first time. Published on project/\{projectId}, project/\{projectId}/creator and project/\{projectId}/reviewer. | | [`projectItemsPublish`](/docs/reference/websocket/notifications/projectitemspublish) | Fired when multiple items (assets/folders) within a project are published. | | [`projectItemsUnpublish`](/docs/reference/websocket/notifications/projectitemsunpublish) | Fired when multiple items (assets/folders) within a project are unpublished. | | [`folderPublish`](/docs/reference/websocket/notifications/folderpublish) | Fired when an individual folder is published. | | [`folderTag`](/docs/reference/websocket/notifications/foldertag) | Fired when a tag is added to a folder. | | [`folderUntag`](/docs/reference/websocket/notifications/folderuntag) | Fired when a tag is removed from a folder. | | [`tagCreate`](/docs/reference/websocket/notifications/tagcreate) | Fired when a new tag is created. | | [`tagUpdate`](/docs/reference/websocket/notifications/tagupdate) | Fired when a tag is updated. | | [`tagDelete`](/docs/reference/websocket/notifications/tagdelete) | Fired when a tag is deleted. | | [`fileSystemCreate`](/docs/reference/websocket/notifications/filesystemcreate) | Fired when items are created at a file system path (folder created, single uploaded asset activated, or items copied into a public release). | | [`fileSystemMove`](/docs/reference/websocket/notifications/filesystemmove) | Fired when items are moved to a new file system path. | | [`fileSystemCopy`](/docs/reference/websocket/notifications/filesystemcopy) | Fired when items are copied to a new file system path. | | [`fileSystemDelete`](/docs/reference/websocket/notifications/filesystemdelete) | Fired when items are deleted from file system paths. | | [`fileSystemPublish`](/docs/reference/websocket/notifications/filesystempublish) | Fired when multiple items are published at a file system path. | | [`fileSystemUnpublish`](/docs/reference/websocket/notifications/filesystemunpublish) | Fired when multiple items are unpublished from file system paths. | | [`subscriptionCreate`](/docs/reference/websocket/notifications/subscriptioncreate) | Fired when a new billing subscription is created for a workspace (Stripe webhook). Published on user/\{ownerId} and \{resourceType}/\{resourceId}. | | [`subscriptionUpdate`](/docs/reference/websocket/notifications/subscriptionupdate) | Fired when an existing billing subscription is updated, paused, resumed or deleted (Stripe webhook). Published on user/\{ownerId} and \{resourceType}/\{resourceId}. | | [`projectGroupItemPublish`](/docs/reference/websocket/notifications/projectgroupitempublish) | Grouped notification for items published in a project. Items published by the same user within the grouping window (30 min) are accumulated and re-sent via notificationUpdate. | | [`publicAssetLinkCreate`](/docs/reference/websocket/notifications/publicassetlinkcreate) | Fired when a public (share) link is created for an asset. Published on project/\{projectId}/creator and workspace/\{workspaceId}. | | [`uploadPushSummary`](/docs/reference/websocket/notifications/uploadpushsummary) | Delayed push-notification summary of assets uploaded to a project by one user. Primarily used to send a push notification after scheduledSendAt, but also broadcast on the project visibility channels when created. | | [`publishPushSummary`](/docs/reference/websocket/notifications/publishpushsummary) | Push-notification summary of items published to reviewers. Used to send a push notification; broadcast on project/\{projectId}/reviewer. | | [`submissionPushSummary`](/docs/reference/websocket/notifications/submissionpushsummary) | Push-notification summary for a newly created submission. Used to send a push notification; broadcast on project/\{projectId}. | | [`memberJoinPush`](/docs/reference/websocket/notifications/memberjoinpush) | Push-notification record created when a user joins a workspace or project. Used to send a push notification; broadcast on \{resourceType}/\{resourceId}. | | [`chatMemberArchive`](/docs/reference/websocket/notifications/chatmemberarchive) | Fired when the requesting user archives a member chat for themselves. Published on user/\{userId} only. | | [`chatMemberUnarchive`](/docs/reference/websocket/notifications/chatmemberunarchive) | Fired when the requesting user un-archives a member chat for themselves. Published on user/\{userId} only. | | [`chatHighlightMessage`](/docs/reference/websocket/notifications/chathighlightmessage) | Fired when a message in a project-scoped chat is highlighted. Published on project/\{projectId}/\{visibility} of the chat. | | [`chatFollow`](/docs/reference/websocket/notifications/chatfollow) | Fired when a user follows a chat. Published on the chat channels. | | [`chatUnfollow`](/docs/reference/websocket/notifications/chatunfollow) | Fired when a user unfollows a chat. Published on the chat channels. | | [`userEmailVerify`](/docs/reference/websocket/notifications/useremailverify) | Fired when a user's email address is verified. Published on user/\{userId}. | | [`botCreate`](/docs/reference/websocket/notifications/botcreate) | Fired when a bot user is created in a workspace. Published on workspace/\{workspaceId}. | | [`webhookTest`](/docs/reference/websocket/notifications/webhooktest) | Synthetic event fired when an admin tests a webhook subscription. Published on workspace/\{workspaceId}; delivered by the webhook dispatcher as webhook.test. | | [`taskFollow`](/docs/reference/websocket/notifications/taskfollow) | Fired when a user follows a task. | | [`taskUnfollow`](/docs/reference/websocket/notifications/taskunfollow) | Fired when a user unfollows a task. | | [`submissionUpdate`](/docs/reference/websocket/notifications/submissionupdate) | Fired when an already-released submission is re-released. Published on project/\{projectId}, project/\{projectId}/creator and project/\{projectId}/reviewer. | | [`submissionTag`](/docs/reference/websocket/notifications/submissiontag) | Fired when a tag is added to a submission. resourceType is chatSubmission. | | [`submissionUntag`](/docs/reference/websocket/notifications/submissionuntag) | Fired when a tag is removed from a submission. resourceType is chatSubmission. | | [`aiChatTopicCreate`](/docs/reference/websocket/notifications/aichattopiccreate) | Fired when an AI chat topic is created. Published on user/\{userId} of the topic owner. | | [`aiChatTopicUpdate`](/docs/reference/websocket/notifications/aichattopicupdate) | Fired when an AI chat topic is updated (title, archive state, context items, last message preview) or deleted. Published on user/\{userId} of the topic owner. | | [`aiChatMessageCreate`](/docs/reference/websocket/notifications/aichatmessagecreate) | Fired when the AI assistant posts a message in an AI chat topic. Published on user/\{userId} of the topic owner. | | [`publicFileSystemCreate`](/docs/reference/websocket/notifications/publicfilesystemcreate) | Fired when a public release (public file system) is created. Published on project/\{projectId}/creator. | | [`publicFileSystemUpdate`](/docs/reference/websocket/notifications/publicfilesystemupdate) | Fired when a public release is updated (title, description, validity, options). Published on project/\{projectId}/creator. | | [`publicFileSystemDelete`](/docs/reference/websocket/notifications/publicfilesystemdelete) | Fired when a public release is deleted. Published on project/\{projectId}/creator. | | [`settingsUpdate`](/docs/reference/websocket/notifications/settingsupdate) | Fired when a user's settings for a resource are updated or reset. Published on user/\{userId} only. | | [`convoStart`](/docs/reference/websocket/notifications/convostart) | Fired when a convo (call) is started in a chat. Published on the chat channels and user/\{userId} of the starter. | | [`convoJoin`](/docs/reference/websocket/notifications/convojoin) | Fired when a user joins a convo. | | [`convoLeave`](/docs/reference/websocket/notifications/convoleave) | Fired when a user leaves a convo. | | [`convoComplete`](/docs/reference/websocket/notifications/convocomplete) | Fired when a convo is completed (ended by a user or when the last participant leaves). | | [`convoUpdate`](/docs/reference/websocket/notifications/convoupdate) | Fired when a convo is updated (subject / notes). | | [`convoDelete`](/docs/reference/websocket/notifications/convodelete) | Fired when a convo is deleted. | | [`convoParticipantJoined`](/docs/reference/websocket/notifications/convoparticipantjoined) | Fired (from the call-provider webhook) when a participant actually joins the call room. | | [`convoParticipantLeft`](/docs/reference/websocket/notifications/convoparticipantleft) | Fired (from the call-provider webhook) when a participant leaves the call room. | | [`convoHandover`](/docs/reference/websocket/notifications/convohandover) | Fired on user/\{userId} when the user joins a convo from a second device, so the previous device can leave the call. | | [`boardCreate`](/docs/reference/websocket/notifications/boardcreate) | Fired when a kanban board is created. Published on the project visibility channels of the board. | | [`boardUpdate`](/docs/reference/websocket/notifications/boardupdate) | Fired when a kanban board is updated (name, visibility, options). | | [`boardDelete`](/docs/reference/websocket/notifications/boarddelete) | Fired when a kanban board is deleted. Cascaded task deletions / reassignments are included in changes. | | [`boardTaskCreate`](/docs/reference/websocket/notifications/boardtaskcreate) | Fired when a task is created on a board (UI, AI tool or bulk create). Also used for push notifications. | | [`boardTaskMove`](/docs/reference/websocket/notifications/boardtaskmove) | Fired when a task is moved between columns or boards. Published on the visibility channels of both boards for cross-board moves. | | [`boardTaskAssign`](/docs/reference/websocket/notifications/boardtaskassign) | Fired when a task is assigned or unassigned. Published on the board visibility channels and user/\{assignedToId}. | | [`boardColumnAdd`](/docs/reference/websocket/notifications/boardcolumnadd) | Fired when a column is added to a board. | | [`boardColumnUpdate`](/docs/reference/websocket/notifications/boardcolumnupdate) | Fired when a board column is updated. | | [`boardColumnDelete`](/docs/reference/websocket/notifications/boardcolumndelete) | Fired when a board column is deleted. | | [`boardColumnReorder`](/docs/reference/websocket/notifications/boardcolumnreorder) | Fired when the columns of a board are reordered. changes.update contains every column with its new order. | | [`boardTaskAdd`](/docs/reference/websocket/notifications/boardtaskadd) | Fired when an existing task is added to a board. | | [`boardTaskRemove`](/docs/reference/websocket/notifications/boardtaskremove) | Fired when a task is removed from a board (the task itself is kept). | | [`boardTaskUpdate`](/docs/reference/websocket/notifications/boardtaskupdate) | Fired when a task's details are updated (subject, description, priority, dates, etc.). | | [`boardTaskLink`](/docs/reference/websocket/notifications/boardtasklink) | Fired when two tasks are linked. | | [`boardTaskUnlink`](/docs/reference/websocket/notifications/boardtaskunlink) | Fired when a task link is removed. | | [`boardTaskRelationAdd`](/docs/reference/websocket/notifications/boardtaskrelationadd) | Fired when a resource (asset, folder, message, chat, ...) is related to a task. Also used for push notifications. | | [`boardTaskRelationRemove`](/docs/reference/websocket/notifications/boardtaskrelationremove) | Fired when a task relation is removed (explicitly, or cascaded when a board visibility change removes access). | | [`boardFollow`](/docs/reference/websocket/notifications/boardfollow) | Fired when a user follows a board. | | [`boardUnfollow`](/docs/reference/websocket/notifications/boardunfollow) | Fired when a user unfollows a board. | # inviteAccept (/docs/reference/websocket/notifications/inviteaccept) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `inviteAccept` . Fired when an invitation is accepted. Payload for the inviteAccept event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------------- | --------------- | -------- | ------------------------------------------------ | | `(*)requesterId` | `string (uuid)` | no | Deprecated. Use initiatorId. | | `(*)requester` | `object` | no | Deprecated. Use initiator. | | `(*)resourceType` | `string` | no | Deprecated. | | `(*)resourceId` | `string (uuid)` | no | Deprecated. | | `(*)role` | `string` | no | Deprecated. | | `(*)invite` | `object` | no | Deprecated. The invite object that was accepted. | | `(*)membership` | `object` | no | Deprecated. The newly created membership object. | **`changes`** | Property | Type | Required | Description | | -------- | -------------------- | -------- | ----------- | | `update` | `object \| object[]` | no | | **`update`** (items) One of 2 variants: **Variant 1** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------------------------------------------------------------------- | | `resourceId` | `string (uuid)` | no | Note: the ID of the resource the membership belongs to (not the membership ID). | | `resourceType` | `"membership"` | no | | | `resource` | `object` | no | The membership created by accepting the invite. | **Variant 2** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------------------------------------------------------------------- | | `resourceId` | `string (uuid)` | no | Note: the ID of the resource the invite belongs to (not the invite ID). | | `resourceType` | `"invite"` | no | | | `resource` | `object` | no | The accepted invite. | # inviteCancel (/docs/reference/websocket/notifications/invitecancel) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `inviteCancel` . Fired when an invitation is cancelled. Payload for the invite cancel event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ------------------------------------- | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)inviteeEmail` | `string (email)` | no | | | `(*)resourceType` | `string` | no | | | `(*)resourceId` | `string (uuid)` | no | | | `(*)role` | `string` | no | | | `(*)invite` | `object` | no | The invite object that was cancelled. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # inviteCreate (/docs/reference/websocket/notifications/invitecreate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `inviteCreate` . Fired when a new invitation is created. Payload for the invite create event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------------- | ---------------- | -------- | ----------- | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)inviteeEmail` | `string (email)` | no | | | `(*)resourceType` | `string` | no | | | `(*)resourceId` | `string (uuid)` | no | | | `(*)role` | `string` | no | | | `(*)resourceName` | `string` | no | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `create` | `object[]` | no | | **`create`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # logoUpdate (/docs/reference/websocket/notifications/logoupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `logoUpdate` . Generic event for when a workspace or project logo asset becomes active. Includes the updated owner resource in changes. Fired by the system when a logo asset's upload completes. changes.update contains the asset and the owning workspace/project. Payload for the logoUpdate event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------------- | -------------------------- | -------- | ------------------------------------------------------- | | `(*)resourceType` | `"workspace" \| "project"` | no | Deprecated. | | `(*)resourceId` | `string (uuid)` | no | Deprecated. | | `(*)asset` | `object` | no | Deprecated. The asset object representing the new logo. | **`changes`** | Property | Type | Required | Description | | -------- | -------------------- | -------- | ----------- | | `update` | `object \| object[]` | no | | **`update`** (items) One of 2 variants: **Variant 1** | Property | Type | Required | Description | | -------------- | --------------- | -------- | --------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"asset"` | no | | | `resource` | `object` | no | The logo asset. | **Variant 2** | Property | Type | Required | Description | | -------------- | -------------------------- | -------- | ---------------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"workspace" \| "project"` | no | | | `resource` | `object` | no | The owning resource with the new logo applied. | # memberJoinPush (/docs/reference/websocket/notifications/memberjoinpush) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `memberJoinPush` . Push-notification record created when a user joins a workspace or project. Used to send a push notification; broadcast on \{resourceType}/\{resourceId}. Created directly (bypasses template validation). Not intended for UI rendering. Payload for the memberJoinPush event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | Not populated for this event (the notification is created without a changes object). | **`tokens`** | Property | Type | Required | Description | | -------------- | -------------------------- | -------- | -------------------- | | `userId` | `string` | yes | The user who joined. | | `resourceId` | `string` | yes | | | `resourceType` | `"workspace" \| "project"` | yes | | | `resourceName` | `string` | yes | | # membershipAddRole (/docs/reference/websocket/notifications/membershipaddrole) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `membershipAddRole` . Fired when a role is added to a user's membership. Fired when a role is added to a user's membership for a resource. Payload for the membership add role event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------------- | --------------- | -------- | ----------- | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)memberId` | `string (uuid)` | no | | | `member` | `object` | yes | | | `(*)resourceType` | `string` | no | | | `(*)resourceId` | `string (uuid)` | no | | | `resourceName` | `string` | yes | | | `role` | `string` | yes | | | `(*)membership` | `object` | no | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # membershipDelete (/docs/reference/websocket/notifications/membershipdelete) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `membershipDelete` . Fired when a user's membership to a resource is deleted (removed). Payload for the membership delete event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------------- | --------------- | -------- | ----------- | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)memberId` | `string (uuid)` | no | | | `(*)member` | `object` | no | | | `(*)resourceType` | `string` | no | | | `(*)resourceId` | `string (uuid)` | no | | | `resourceName` | `string` | yes | | | `roles` | `string[]` | yes | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `delete` | `object[]` | no | | **`delete`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | # membershipLeaveResource (/docs/reference/websocket/notifications/membershipleaveresource) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `membershipLeaveResource` . Fired when a user leaves a resource themselves. Payload for the membershipLeaveResource event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------------- | --------------- | -------- | ---------------------------- | | `(*)requesterId` | `string (uuid)` | no | Deprecated. Use initiatorId. | | `(*)requester` | `object` | no | Deprecated. Use initiator. | | `(*)memberId` | `string (uuid)` | no | Deprecated. | | `member` | `object` | yes | | | `(*)resourceType` | `string` | no | Deprecated. | | `(*)resourceId` | `string (uuid)` | no | Deprecated. | | `resourceName` | `string` | yes | | | `roles` | `string[]` | yes | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `delete` | `object[]` | no | | **`delete`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------------------------ | | `resourceId` | `string (uuid)` | no | ID of the deleted membership record. | | `resourceType` | `"membership"` | no | | # membershipRemoveRole (/docs/reference/websocket/notifications/membershipremoverole) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `membershipRemoveRole` . Fired when a role is removed from a user's membership. Fired when a role is removed from a user's membership for a resource. Payload for the membership remove role event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------------- | --------------- | -------- | ------------------------------ | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)memberId` | `string (uuid)` | no | | | `member` | `object` | yes | | | `(*)resourceType` | `string` | no | | | `(*)resourceId` | `string (uuid)` | no | | | `resourceName` | `string` | yes | | | `role` | `string` | yes | | | `(*)membership` | `object` | no | The updated membership object. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # notificationUpdate (/docs/reference/websocket/notifications/notificationupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `notificationUpdate` . Indicates that a previously delivered, grouped notification has been updated (assetGroupUploadComplete or projectGroupItemPublish). Fired when a grouped notification accumulates another item within its grouping window. The full updated notification is in tokens.updatedNotification; the changes object is not populated for this event. Payload for the notificationUpdate event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | Not populated for this event (the notification is created without a changes object). | **`tokens`** | Property | Type | Required | Description | | ---------------------- | --------------- | -------- | ---------------------------------------------------------------------------------------------------- | | `notificationId` | `string (uuid)` | yes | ID of the notification that was updated. | | `originalNotification` | `object` | yes | The notification object before the update. | | `updatedNotification` | `object` | yes | The notification object after the update (tokens.assets / tokens.items and changes.update extended). | # notificationUpdateLastSeen (/docs/reference/websocket/notifications/notificationupdatelastseen) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `notificationUpdateLastSeen` . Fired to update a client's 'last seen' timestamp for notifications. Fired internally or for specific clients to update their 'last seen' timestamp for certain notification channels/types. Payload for the notification update last seen event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ------------- | -------------------- | -------- | ----------- | | `(*)channels` | `string[]` | no | | | `(*)types` | `string[]` | no | | | `(*)lastSeen` | `string (date-time)` | no | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # projectAssetsPublish (/docs/reference/websocket/notifications/projectassetspublish) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `projectAssetsPublish` . CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when assets within a project are published. Fired when assets within a project are published. Payload for the project assets publish event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------------- | --------------- | -------- | ---------------------------------------------- | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)assets` | `object[]` | no | Deprecated. Use resources from changes.update. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | yes | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # projectAssetsUnpublish (/docs/reference/websocket/notifications/projectassetsunpublish) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `projectAssetsUnpublish` . CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when assets within a project are unpublished. Fired when assets within a project are unpublished. Payload for the project assets unpublish event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------------- | --------------- | -------- | ---------------------------------------------- | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)assets` | `object[]` | no | Deprecated. Use resources from changes.update. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | yes | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # projectCreate (/docs/reference/websocket/notifications/projectcreate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `projectCreate` . Fired when a new project is created. Payload for the project create event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------------- | --------------- | -------- | ---------------------------------------------- | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)projectId` | `string (uuid)` | no | | | `(*)projectName` | `string` | no | | | `(*)workspaceId` | `string (uuid)` | no | | | `(*)membership` | `object` | no | The initial membership object for the creator. | **`changes`** | Property | Type | Required | Description | | -------- | -------------------- | -------- | ----------- | | `create` | `object \| object[]` | no | | **`create`** (items) One of 2 variants: **Variant 1** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | New project object. | **Variant 2** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ---------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | New membership object. | # projectDelete (/docs/reference/websocket/notifications/projectdelete) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `projectDelete` . Fired when a project is marked for deletion. Payload for the project delete event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------------- | --------------- | -------- | ----------- | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)projectId` | `string (uuid)` | no | | | `projectName` | `string` | yes | | | `(*)workspaceId` | `string (uuid)` | no | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `delete` | `object[]` | no | | **`delete`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | # projectGroupItemPublish (/docs/reference/websocket/notifications/projectgroupitempublish) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `projectGroupItemPublish` . Grouped notification for items published in a project. Items published by the same user within the grouping window (30 min) are accumulated and re-sent via notificationUpdate. Payload for the projectGroupItemPublish event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------- | ---------- | -------- | ------------------------------------------------------------------------------ | | `(*)items` | `object[]` | no | Deprecated. Published asset/folder objects. Use resources from changes.update. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------------- | -------- | ----------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"asset" \| "folder"` | no | | | `resource` | `object` | no | A published item. | # projectItemsPublish (/docs/reference/websocket/notifications/projectitemspublish) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `projectItemsPublish` . Fired when multiple items (assets/folders) within a project are published. Payload for the project items publish event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------- | ---- | -------- | ----------- | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"asset" \| "folder"` | no | | | `resource` | `object` | no | | # projectItemsUnpublish (/docs/reference/websocket/notifications/projectitemsunpublish) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `projectItemsUnpublish` . Fired when multiple items (assets/folders) within a project are unpublished. Payload for the project items unpublish event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------- | ---- | -------- | ----------- | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"asset" \| "folder"` | no | | | `resource` | `object` | no | | # projectLogoUpdate (/docs/reference/websocket/notifications/projectlogoupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `projectLogoUpdate` . CURRENTLY UNUSED IN FAVOR OF logoUpdate event. Fired when a project logo is updated. Updates the project and returns the new asset object for the logo. Note that the logo will not be 'active' until the actual file is uploaded. So you will need to watch for updates to this asset before replacing the logo locally. Fired when a project logo is updated. No code path currently emits this event; see logoUpdate. Payload for the projectLogoUpdate event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------- | -------- | -------- | --------------------------------------------------------------------------- | | `(*)asset` | `object` | no | Deprecated. Use resource from changes.update where resourceType is 'asset'. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `create` | `object[]` | no | | | `update` | `object[]` | no | | **`create`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"asset"` | no | | | `resource` | `object` | no | The new logo asset. | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | -------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"project"` | no | | | `resource` | `object` | no | The updated project. | # projectUpdate (/docs/reference/websocket/notifications/projectupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `projectUpdate` . Fired when a project name is changed. Payload for the project name change event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------------- | --------------- | -------- | ----------- | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)projectId` | `string (uuid)` | no | | | `oldProjectName` | `string` | yes | | | `newProjectName` | `string` | yes | | | `(*)workspaceId` | `string (uuid)` | no | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------------------ | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | Updated project object. | | `oldResource` | `object` | no | The project before the update. | # publicAssetLinkCreate (/docs/reference/websocket/notifications/publicassetlinkcreate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `publicAssetLinkCreate` . Fired when a public (share) link is created for an asset. Published on project/\{projectId}/creator and workspace/\{workspaceId}. Payload for the publicAssetLinkCreate event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------------- | ---------------------------- | -------- | --------------------------------------------------------- | | `assetName` | `string` | yes | | | `(*)assetId` | `string (uuid)` | no | Deprecated. Use resourceId. | | `(*)projectId` | `string (uuid)` | no | Deprecated. | | `projectName` | `string` | yes | | | `creatorName` | `string` | yes | Display name (or email) of the user who created the link. | | `expires` | `string (date-time) \| null` | yes | Expiry of the link, null when it does not expire. | | `deepLink` | `string` | yes | Deep link to the asset in the app. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `create` | `object[]` | no | | **`create`** (items) | Property | Type | Required | Description | | -------------- | ------------------- | -------- | ------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"publicAssetLink"` | no | | | `resource` | `object` | no | The created public asset link record. | # publicFileSystemCreate (/docs/reference/websocket/notifications/publicfilesystemcreate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `publicFileSystemCreate` . Fired when a public release (public file system) is created. Published on project/\{projectId}/creator. Payload for the publicFileSystemCreate event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------- | -------- | -------- | ---------------------------------------------- | | `title` | `string` | yes | | | `inventory` | `object` | yes | Inventory summary of the items in the release. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `create` | `object[]` | no | | **`create`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | -------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"public"` | no | | | `resource` | `object` | no | The public release record. | # publicFileSystemDelete (/docs/reference/websocket/notifications/publicfilesystemdelete) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `publicFileSystemDelete` . Fired when a public release is deleted. Published on project/\{projectId}/creator. Payload for the publicFileSystemDelete event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------- | -------- | -------- | ----------- | | `title` | `string` | yes | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `delete` | `object[]` | no | | **`delete`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ---------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"public"` | no | | | `resource` | `object` | no | The deleted public release record. | # publicFileSystemUpdate (/docs/reference/websocket/notifications/publicfilesystemupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `publicFileSystemUpdate` . Fired when a public release is updated (title, description, validity, options). Published on project/\{projectId}/creator. Payload for the publicFileSystemUpdate event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------- | -------- | -------- | ----------- | | `title` | `string` | yes | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ---------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"public"` | no | | | `resource` | `object` | no | The updated public release record. | | `oldResource` | `object` | no | The record before the update. | # publishPushSummary (/docs/reference/websocket/notifications/publishpushsummary) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `publishPushSummary` . Push-notification summary of items published to reviewers. Used to send a push notification; broadcast on project/\{projectId}/reviewer. Created directly (bypasses template validation). Not intended for UI rendering. Payload for the publishPushSummary event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | Not populated for this event (the notification is created without a changes object). | **`tokens`** | Property | Type | Required | Description | | ------------- | ---------- | -------- | ---------------------------------------------------------------------- | | `publisherId` | `string` | yes | | | `projectId` | `string` | yes | | | `projectName` | `string` | yes | | | `items` | `object[]` | yes | Minimal item summaries: \{ \_id, mediaType (null for folders), name }. | # settingsUpdate (/docs/reference/websocket/notifications/settingsupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `settingsUpdate` . Fired when a user's settings for a resource are updated or reset. Published on user/\{userId} only. Payload for the settingsUpdate event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | changes.update on update, changes.delete on reset. resourceId of the entry is the user ID. | **`tokens`** | Property | Type | Required | Description | | -------------- | -------- | -------- | --------------------------------------------- | | `resourceType` | `string` | yes | Type of the resource the settings apply to. | | `resourceId` | `string` | yes | | | `settings` | `object` | yes | The updated settings (empty object on reset). | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | | `delete` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ---------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"settings"` | no | | | `resource` | `object` | no | The updated settings object. | **`delete`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"settings"` | no | | # submissionCreate (/docs/reference/websocket/notifications/submissioncreate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `submissionCreate` . Fired when a submission is released for the first time. Published on project/\{projectId}, project/\{projectId}/creator and project/\{projectId}/reviewer. Payload for the submissionCreate event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------------- | --------------- | -------- | ------------------------------------------------------------------------------------- | | `(*)requesterId` | `string (uuid)` | no | Deprecated. Use initiatorId. | | `(*)requester` | `object` | no | Deprecated. Use initiator. | | `(*)submission` | `object` | no | Deprecated. The submission (chatSubmission) object. Use resource from changes.create. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `create` | `object[]` | no | | **`create`** (items) | Property | Type | Required | Description | | -------------- | ------------------ | -------- | ------------------------ | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chatSubmission"` | no | | | `resource` | `object` | no | The released submission. | # submissionPushSummary (/docs/reference/websocket/notifications/submissionpushsummary) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `submissionPushSummary` . Push-notification summary for a newly created submission. Used to send a push notification; broadcast on project/\{projectId}. Created directly (bypasses template validation). Not intended for UI rendering. Payload for the submissionPushSummary event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | Not populated for this event (the notification is created without a changes object). | **`tokens`** | Property | Type | Required | Description | | ------------------- | -------- | -------- | ------------------------------------------------ | | `publisherId` | `string` | yes | | | `projectId` | `string` | yes | | | `projectName` | `string` | yes | | | `submissionId` | `string` | yes | | | `submissionSubject` | `string` | yes | | | `description` | `string` | yes | Submission description (empty string when none). | # submissionTag (/docs/reference/websocket/notifications/submissiontag) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `submissionTag` . Fired when a tag is added to a submission. resourceType is chatSubmission. Payload for the submissionTag event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | Not populated for this event (the notification is created without a changes object). | **`tokens`** | Property | Type | Required | Description | | --------- | -------- | -------- | --------------------------------------------- | | `subject` | `string` | yes | Submission subject ('Submission' when empty). | | `tagName` | `string` | yes | | # submissionUntag (/docs/reference/websocket/notifications/submissionuntag) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `submissionUntag` . Fired when a tag is removed from a submission. resourceType is chatSubmission. Payload for the submissionUntag event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | Not populated for this event (the notification is created without a changes object). | **`tokens`** | Property | Type | Required | Description | | --------- | -------- | -------- | --------------------------------------------- | | `subject` | `string` | yes | Submission subject ('Submission' when empty). | | `tagName` | `string` | yes | | # submissionUpdate (/docs/reference/websocket/notifications/submissionupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `submissionUpdate` . Fired when an already-released submission is re-released. Published on project/\{projectId}, project/\{projectId}/creator and project/\{projectId}/reviewer. Payload for the submissionUpdate event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------------- | --------------- | -------- | ------------------------------------------------------------------------------------- | | `(*)requesterId` | `string (uuid)` | no | Deprecated. Use initiatorId. | | `(*)requester` | `object` | no | Deprecated. Use initiator. | | `(*)submission` | `object` | no | Deprecated. The submission (chatSubmission) object. Use resource from changes.update. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | ------------------ | -------- | --------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"chatSubmission"` | no | | | `resource` | `object` | no | The re-released submission. | # subscriptionCreate (/docs/reference/websocket/notifications/subscriptioncreate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `subscriptionCreate` . Fired when a new billing subscription is created for a workspace (Stripe webhook). Published on user/\{ownerId} and \{resourceType}/\{resourceId}. Payload for the subscriptionCreate event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | Always an empty object for this event. | | `changes` | `object` | no | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `create` | `object[]` | no | | **`create`** (items) | Property | Type | Required | Description | | -------------- | ---------------- | -------- | -------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"subscription"` | no | | | `resource` | `object` | no | The newly created subscription object. | # subscriptionUpdate (/docs/reference/websocket/notifications/subscriptionupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `subscriptionUpdate` . Fired when an existing billing subscription is updated, paused, resumed or deleted (Stripe webhook). Published on user/\{ownerId} and \{resourceType}/\{resourceId}. Payload for the subscriptionUpdate event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | Always an empty object for this event. | | `changes` | `object` | no | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | ---------------- | -------- | -------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"subscription"` | no | | | `resource` | `object` | no | The updated subscription object. | # tagCreate (/docs/reference/websocket/notifications/tagcreate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `tagCreate` . Fired when a new tag is created. Payload for the tag create event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ------------ | -------- | -------- | ------------------------- | | `(*)tagName` | `string` | no | Name of the created tag. | | `(*)color` | `string` | no | Color of the created tag. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `create` | `object[]` | no | | **`create`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # tagDelete (/docs/reference/websocket/notifications/tagdelete) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `tagDelete` . Fired when a tag is deleted. Payload for the tagDelete event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ------------ | -------- | -------- | ------------------------------------- | | `(*)tagName` | `string` | no | Deprecated. Name of the deleted tag. | | `(*)color` | `string` | no | Deprecated. Color of the deleted tag. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `delete` | `object[]` | no | | **`delete`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"tag"` | no | | | `resource` | `object` | no | The deleted tag object. | # tagUpdate (/docs/reference/websocket/notifications/tagupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `tagUpdate` . Fired when a tag is updated. Fired when a tag is updated (name or color change). Payload for the tag update event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | --------------- | -------- | -------- | -------------------------- | | `(*)oldTagName` | `string` | no | Previous name of the tag. | | `(*)newTagName` | `string` | no | New name of the tag. | | `(*)oldColor` | `string` | no | Previous color of the tag. | | `(*)newColor` | `string` | no | New color of the tag. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # taskAcknowledged (/docs/reference/websocket/notifications/taskacknowledged) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `taskAcknowledged` . Fired when tasks are acknowledged within a project. Payload for the task acknowledged event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ------------------------ | --------------- | -------- | -------------------------------------------- | | `(*)projectId` | `string (uuid)` | no | | | `newUnacknowledgedCount` | `integer` | yes | The remaining count of unacknowledged tasks. | | `(*)acknowledgedTasks` | `object[]` | no | List of tasks that were acknowledged. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # taskCreate (/docs/reference/websocket/notifications/taskcreate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `taskCreate` . Fired when a new task is created within a project. Payload for the task create event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------------------ | | `(*)projectId` | `string (uuid)` | no | | | `(*)task` | `object` | no | The newly created task object. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `create` | `object[]` | no | | **`create`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # taskFollow (/docs/reference/websocket/notifications/taskfollow) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `taskFollow` . Fired when a user follows a task. Payload for the taskFollow event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------------- | --------------- | -------- | --------------------------- | | `(*)projectId` | `string (uuid)` | no | Deprecated. | | `(*)taskId` | `string (uuid)` | no | Deprecated. Use resourceId. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | -------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"task"` | no | | | `resource` | `object` | no | The task with updated followers. | # taskStatusUpdate (/docs/reference/websocket/notifications/taskstatusupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `taskStatusUpdate` . Fired when the status of a task is updated. Payload for the task status update event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------------- | --------------- | -------- | ----------- | | `(*)projectId` | `string (uuid)` | no | | | `originalStatus` | `string` | yes | | | `updatedStatus` | `string` | yes | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # taskUnfollow (/docs/reference/websocket/notifications/taskunfollow) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `taskUnfollow` . Fired when a user unfollows a task. Payload for the taskUnfollow event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | -------------- | --------------- | -------- | --------------------------- | | `(*)projectId` | `string (uuid)` | no | Deprecated. | | `(*)taskId` | `string (uuid)` | no | Deprecated. Use resourceId. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | -------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"task"` | no | | | `resource` | `object` | no | The task with updated followers. | # test (/docs/reference/websocket/notifications/test) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `test` . Event used for testing websocket connections. Test event payload. Changes key structure will depend on test scenario. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------- | -------- | -------- | -------------------------------- | | `testData` | `string` | yes | Arbitrary data sent for testing. | # uploadPushSummary (/docs/reference/websocket/notifications/uploadpushsummary) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `uploadPushSummary` . Delayed push-notification summary of assets uploaded to a project by one user. Primarily used to send a push notification after scheduledSendAt, but also broadcast on the project visibility channels when created. Created directly (bypasses template validation) and grouped per creator/project while pushStatus is pending; later uploads are appended to tokens.assets and the timer is reset. Not intended for UI rendering. Payload for the uploadPushSummary event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | Not populated for this event (the notification is created without a changes object). | **`tokens`** | Property | Type | Required | Description | | ------------- | ---------- | -------- | ------------------------------------------------------------------------------------------------ | | `creatorId` | `string` | yes | ID of the uploader. | | `creator` | `object` | no | Public user snapshot of the uploader (present in the payload although not part of the template). | | `projectId` | `string` | yes | | | `projectName` | `string` | yes | | | `assets` | `object[]` | yes | Minimal asset summaries: \{ \_id, mediaType, name }. | # userAvatarUpdate (/docs/reference/websocket/notifications/useravatarupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `userAvatarUpdate` . Fired when a avatars status is set to active. Note that this is an asset event and not a user event so it is fired when the asset's status is set to active not when a user's object is updated. Fired when a user updates their avatar. Payload for the user avatar update event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------- | --------------- | -------- | --------------------------------------------- | | `(*)userId` | `string (uuid)` | no | | | `(*)asset` | `object` | no | The asset object representing the new avatar. | **`changes`** | Property | Type | Required | Description | | -------- | -------------------- | -------- | ----------- | | `update` | `object \| object[]` | no | | **`update`** (items) One of 2 variants: **Variant 1** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | **Variant 2** | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # userDeleted (/docs/reference/websocket/notifications/userdeleted) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `userDeleted` . Fired when a user account is deleted. Payload for the user deleted event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ------------- | -------- | -------- | ------------------------------------------- | | `(*)userData` | `object` | no | Information about the user who was deleted. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `delete` | `object[]` | no | | **`delete`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | # userEmailVerify (/docs/reference/websocket/notifications/useremailverify) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `userEmailVerify` . Fired when a user's email address is verified. Published on user/\{userId}. Payload for the userEmailVerify event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | Always an empty object for this event. | | `changes` | `object` | no | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `"user"` | no | | | `resource` | `object` | no | The user object (includes isEmailVerified). | # userPublicUpdate (/docs/reference/websocket/notifications/userpublicupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `userPublicUpdate` . Fired when a user's public information is updated. Fired when a user's public information (e.g., display name, avatar) is updated, visible to others. Payload for the user public update event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------- | -------- | -------- | ------------------------------------------------------ | | `(*)update` | `object` | no | Object containing the public fields that were updated. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # userSelfUpdate (/docs/reference/websocket/notifications/userselfupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `userSelfUpdate` . Fired when a user updates their own profile information. Payload for the user self update event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------- | -------- | -------- | ----------------------------------------------- | | `(*)update` | `object` | no | Object containing the fields that were updated. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | no | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # webhookTest (/docs/reference/websocket/notifications/webhooktest) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `webhookTest` . Synthetic event fired when an admin tests a webhook subscription. Published on workspace/\{workspaceId}; delivered by the webhook dispatcher as webhook.test. Payload for the webhookTest event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | Not populated for this event (the notification is created without a changes object). | **`tokens`** | Property | Type | Required | Description | | ---------------- | --------------- | -------- | ----------------------------------------------------------------------------------------- | | `triggeredById` | `string (uuid)` | yes | User who triggered the test. | | `subscriptionId` | `string (uuid)` | yes | Webhook subscription being tested (also resourceId; resourceType is webhookSubscription). | | `message` | `string` | yes | Human readable banner message. | # workspaceCreate (/docs/reference/websocket/notifications/workspacecreate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `workspaceCreate` . Fired when a new workspace is created. Payload for the workspace create event. Includes new workspace object in changes.create array. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ----------------- | -------- | -------- | --------------------------------------------- | | `(*)newWorkspace` | `object` | no | Deprecated. Use resource from changes.create. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `create` | `object[]` | yes | | **`create`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | --------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | New workspace object. | # workspaceDelete (/docs/reference/websocket/notifications/workspacedelete) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `workspaceDelete` . Fired when a workspace is marked for deletion. Payload for the workspace delete event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------------- | --------------- | -------- | ----------- | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)workspaceId` | `string (uuid)` | no | | | `workspaceName` | `string` | yes | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `delete` | `object[]` | yes | | **`delete`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | # workspaceLogoUpdate (/docs/reference/websocket/notifications/workspacelogoupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `workspaceLogoUpdate` . CURRENTLY UNUSED IN FAVOR OF logoUpdate event. Fired when a workspace logo is updated. Fired when a workspace logo is updated. Payload for the workspace logo update event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ---------- | -------- | -------- | --------------------------------------------------------------------------- | | `(*)asset` | `object` | no | Deprecated. Use resource from changes.update where resourceType is 'asset'. | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | yes | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ----------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | | # workspaceStorageLimitWarning (/docs/reference/websocket/notifications/workspacestoragelimitwarning) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `workspaceStorageLimitWarning` . Fired when a workspace's storage usage exceeds a threshold. Fired when a workspace's storage usage exceeds a predefined threshold. Payload for the workspace storage limit warning event. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | --------------------- | --------------- | -------- | ----------- | | `workspaceId` | `string (uuid)` | yes | | | `storageLimitInBytes` | `number` | yes | | | `storageUsedInBytes` | `number` | yes | | # workspaceUpdate (/docs/reference/websocket/notifications/workspaceupdate) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Delivered as the `notification` socket event with `type` set to `workspaceUpdate` . Fired when a workspace name is changed. Payload for the workspace name change event. Token keys marked with (\*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations. ## Payload [#payload] | Property | Type | Required | Description | | --------------- | -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `string` | yes | The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference. | | `initiatorId` | `string (uuid)` | no | ID of the user or system that initiated the event. Null if initiatorType is 'system'. | | `initiatorType` | `"user" \| "system"` | yes | Type of initiator (user or system). | | `initiator` | `object \| null` | no | Populated initiator user object (if initiatorType is 'user'). | | `resourceId` | `string (uuid)` | yes | ID of the primary resource this notification pertains to. | | `resourceType` | `string` | yes | Type of the primary resource this notification pertains to. | | `channels` | `string[]` | no | The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id). | | `createdAt` | `string (date-time)` | yes | Timestamp when the notification was created. | | `tokens` | `object` | no | | | `changes` | `object` | no | | **`tokens`** | Property | Type | Required | Description | | ------------------ | --------------- | -------- | ----------- | | `(*)requesterId` | `string (uuid)` | no | | | `(*)requester` | `object` | no | | | `(*)workspaceId` | `string (uuid)` | no | | | `oldWorkspaceName` | `string` | yes | | | `newWorkspaceName` | `string` | yes | | **`changes`** | Property | Type | Required | Description | | -------- | ---------- | -------- | ----------- | | `update` | `object[]` | yes | | **`update`** (items) | Property | Type | Required | Description | | -------------- | --------------- | -------- | ------------------------- | | `resourceId` | `string (uuid)` | no | | | `resourceType` | `string` | no | | | `resource` | `object` | no | Updated workspace object. | # BotClient (/docs/reference/sdk/BotClient) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Classes [#classes] ### default [#default] Client for interacting with the Nurama API as a bot user. Authenticates with a long-lived API key (`nrm_bot_...`) instead of a JWT. Requests must arrive at the bot subdomain (`bot.nurama.com` by default) so the server can apply bot-specific firewall and rate-limit rules. Exposes only the namespaces a bot is permitted to use — auth, user profile, payment, subscription, device, and bot-administration namespaces are omitted. #### Example [#example] ```ts import BotClient from '@nurama/sdk/bot'; const bot = new BotClient(process.env.NURAMA_BOT_API_KEY!); const workspaces = await bot.workspace.listWorkspaces(); ``` #### Constructors [#constructors] ##### Constructor [#constructor] ```ts new default(apiKey, options?): default; ``` ###### Parameters [#parameters] | Parameter | Type | Description | | --------- | --------------------------------------- | ------------------------------------------------------ | | `apiKey` | `string` | Bot API key in the format `nrm_bot_{prefix}_{secret}`. | | `options` | [`BotClientOptions`](#botclientoptions) | Configuration overrides. | ###### Returns [#returns] [`default`](#default) #### Properties [#properties] | Property | Modifier | Type | Description | | -------------------------------------------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `aiChat` | `readonly` | \{ `createTopic`: `Promise`\<`AiChatCreateTopicResponse`>; `deleteTopic`: `Promise`\<`AiChatGetTopicResponse`>; `getTopic`: `Promise`\<`AiChatGetTopicResponse`>; `listTopics`: `Promise`\<`AiChatListTopicsResponse`>; `updateTopic`: `Promise`\<`AiChatGetTopicResponse`>; } | - | | `aiChat.createTopic` | `public` | `Promise`\<`AiChatCreateTopicResponse`> | - | | `aiChat.deleteTopic` | `public` | `Promise`\<`AiChatGetTopicResponse`> | - | | `aiChat.getTopic` | `public` | `Promise`\<`AiChatGetTopicResponse`> | - | | `aiChat.listTopics` | `public` | `Promise`\<`AiChatListTopicsResponse`> | - | | `aiChat.updateTopic` | `public` | `Promise`\<`AiChatGetTopicResponse`> | - | | `asset` | `readonly` | [`AssetMethods`](/docs/reference/sdk/NuramaClient#assetmethods) | - | | `board` | `readonly` | \{ `addColumn`: `Promise`\<`BoardColumn`>; `addExistingTaskToBoard`: `Promise`\<`Task`>; `createBoard`: `Promise`\<`Board`>; `createBoardTask`: `Promise`\<`Task`>; `deleteBoard`: `Promise`\<\{ `deletedTaskIds`: `string`\[]; `disposition`: `string`; `message`: `string`; `reassignedTaskIds`: `string`\[]; }>; `deleteColumn`: `Promise`\<`void`>; `followBoard`: `Promise`\<`Board`>; `getBoard`: `Promise`\<`BoardWithTasks`>; `getBoardTasks`: `Promise`\<`Task`\[]>; `getProjectBoards`: `Promise`\<`Board`\[]>; `getProjectTasks`: `Promise`\<`any`>; `moveTask`: `Promise`\<`Task`>; `removeTaskFromBoard`: `Promise`\<`Task`>; `reorderColumns`: `Promise`\<`BoardColumn`\[]>; `tagBoard`: `Promise`\<`Board`>; `unfollowBoard`: `Promise`\<`Board`>; `untagBoard`: `Promise`\<`Board`>; `updateBoard`: `Promise`\<`Board`>; `updateColumn`: `Promise`\<`BoardColumn`>; } | - | | `board.addColumn` | `public` | `Promise`\<`BoardColumn`> | - | | `board.addExistingTaskToBoard` | `public` | `Promise`\<`Task`> | - | | `board.createBoard` | `public` | `Promise`\<`Board`> | - | | `board.createBoardTask` | `public` | `Promise`\<`Task`> | - | | `board.deleteBoard` | `public` | `Promise`\<\{ `deletedTaskIds`: `string`\[]; `disposition`: `string`; `message`: `string`; `reassignedTaskIds`: `string`\[]; }> | - | | `board.deleteColumn` | `public` | `Promise`\<`void`> | - | | `board.followBoard` | `public` | `Promise`\<`Board`> | - | | `board.getBoard` | `public` | `Promise`\<`BoardWithTasks`> | - | | `board.getBoardTasks` | `public` | `Promise`\<`Task`\[]> | - | | `board.getProjectBoards` | `public` | `Promise`\<`Board`\[]> | - | | `board.getProjectTasks` | `public` | `Promise`\<`any`> | - | | `board.moveTask` | `public` | `Promise`\<`Task`> | - | | `board.removeTaskFromBoard` | `public` | `Promise`\<`Task`> | - | | `board.reorderColumns` | `public` | `Promise`\<`BoardColumn`\[]> | - | | `board.tagBoard` | `public` | `Promise`\<`Board`> | - | | `board.unfollowBoard` | `public` | `Promise`\<`Board`> | - | | `board.untagBoard` | `public` | `Promise`\<`Board`> | - | | `board.updateBoard` | `public` | `Promise`\<`Board`> | - | | `board.updateColumn` | `public` | `Promise`\<`BoardColumn`> | - | | `chat` | `readonly` | \{ `addAttachments`: `Promise`\<[`AttachmentUploadRecord`](/docs/reference/sdk/routes/chat#attachmentuploadrecord)\[]>; `addMembers`: `Promise`\<`ChatMember`>; `archiveMemberChat`: `Promise`\<`ChatMember`>; `createAssetChatAndMessage`: `Promise`\<`any`>; `createMemberChat`: `Promise`\<`ChatMember`>; `createMessage`: `Promise`\<`ChatMessage`>; `createMessageShortLink`: `Promise`\<\{ `code`: `string`; `shortUrl`: `string`; }>; `createReaction`: `Promise`\<`ChatMessage`>; `createTopicChat`: `Promise`\<`Chat`>; `deleteChat`: `Promise`\<`void`>; `deleteMemberChat`: `Promise`\<`void`>; `deleteMessage`: `Promise`\<`ChatMessage`>; `fetchLinkPreviews`: `Promise`\<[`LinkPreviewResponse`](/docs/reference/sdk/routes/chat#linkpreviewresponse)>; `followChat`: `Promise`\<`void`>; `getAddableMembers`: `Promise`\< \| [`AddableMembersByScope`](/docs/reference/sdk/routes/chat#addablemembersbyscope) \| `Membership`\[]>; `getChat`: `Promise`\<`Chat`>; `getChatByTopicId`: `Promise`\<`Chat`>; `getMemberChat`: `Promise`\<`ChatMember`>; `getMentionableAssets`: `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`Asset`>>; `getMentionableFolders`: `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`Folder`>>; `getMentionablePublics`: `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<[`MentionablePublic`](/docs/reference/sdk/routes/chat#mentionablepublic)>>; `getMentionableSubmissions`: `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<[`MentionableSubmission`](/docs/reference/sdk/routes/chat#mentionablesubmission)>>; `getMentionableTasks`: `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`any`>>; `getMentions`: `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`ChatMessage`>>; `getMessage`: `Promise`\<`ChatMessage`>; `getMessages`: `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`ChatMessage`>>; `getReplies`: `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`ChatMessage`>>; `getScopeAddableMembers`: `Promise`\< \| [`AddableMembersByScope`](/docs/reference/sdk/routes/chat#addablemembersbyscope) \| `Membership`\[]>; `getUsersMemberChats`: `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`ChatMember`>>; `getWorkspaceProjectChats`: `Promise`\<`any`\[]>; `highlightMessage`: `Promise`\<`ChatMessage`>; `removeAttachment`: `Promise`\<`ChatMessage`>; `removeMembers`: `Promise`\<`ChatMember`>; `removeReaction`: `Promise`\<`ChatMessage`>; `reviseMessage`: `Promise`\<`ChatMessage`>; `unarchiveMemberChat`: `Promise`\<`ChatMember`>; `unfollowChat`: `Promise`\<`void`>; `unhighlightMessage`: `Promise`\<`ChatMessage`>; `updateChatSubject`: `Promise`\<`Chat`>; `updateMemberChat`: `Promise`\<`ChatMember`>; `updateMemberChatIcon`: `Promise`\<\{ `chat`: `ChatMember`; } & [`AttachmentUploadRecord`](/docs/reference/sdk/routes/chat#attachmentuploadrecord)>; } | - | | `chat.addAttachments` | `public` | `Promise`\<[`AttachmentUploadRecord`](/docs/reference/sdk/routes/chat#attachmentuploadrecord)\[]> | - | | `chat.addMembers` | `public` | `Promise`\<`ChatMember`> | - | | `chat.archiveMemberChat` | `public` | `Promise`\<`ChatMember`> | - | | `chat.createAssetChatAndMessage` | `public` | `Promise`\<`any`> | - | | `chat.createMemberChat` | `public` | `Promise`\<`ChatMember`> | - | | `chat.createMessage` | `public` | `Promise`\<`ChatMessage`> | - | | `chat.createMessageShortLink` | `public` | `Promise`\<\{ `code`: `string`; `shortUrl`: `string`; }> | - | | `chat.createReaction` | `public` | `Promise`\<`ChatMessage`> | - | | `chat.createTopicChat` | `public` | `Promise`\<`Chat`> | - | | `chat.deleteChat` | `public` | `Promise`\<`void`> | - | | `chat.deleteMemberChat` | `public` | `Promise`\<`void`> | - | | `chat.deleteMessage` | `public` | `Promise`\<`ChatMessage`> | - | | `chat.fetchLinkPreviews` | `public` | `Promise`\<[`LinkPreviewResponse`](/docs/reference/sdk/routes/chat#linkpreviewresponse)> | - | | `chat.followChat` | `public` | `Promise`\<`void`> | - | | `chat.getAddableMembers` | `public` | `Promise`\< \| [`AddableMembersByScope`](/docs/reference/sdk/routes/chat#addablemembersbyscope) \| `Membership`\[]> | - | | `chat.getChat` | `public` | `Promise`\<`Chat`> | - | | `chat.getChatByTopicId` | `public` | `Promise`\<`Chat`> | - | | `chat.getMemberChat` | `public` | `Promise`\<`ChatMember`> | - | | `chat.getMentionableAssets` | `public` | `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`Asset`>> | - | | `chat.getMentionableFolders` | `public` | `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`Folder`>> | - | | `chat.getMentionablePublics` | `public` | `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<[`MentionablePublic`](/docs/reference/sdk/routes/chat#mentionablepublic)>> | - | | `chat.getMentionableSubmissions` | `public` | `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<[`MentionableSubmission`](/docs/reference/sdk/routes/chat#mentionablesubmission)>> | - | | `chat.getMentionableTasks` | `public` | `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`any`>> | - | | `chat.getMentions` | `public` | `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`ChatMessage`>> | - | | `chat.getMessage` | `public` | `Promise`\<`ChatMessage`> | - | | `chat.getMessages` | `public` | `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`ChatMessage`>> | - | | `chat.getReplies` | `public` | `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`ChatMessage`>> | - | | `chat.getScopeAddableMembers` | `public` | `Promise`\< \| [`AddableMembersByScope`](/docs/reference/sdk/routes/chat#addablemembersbyscope) \| `Membership`\[]> | - | | `chat.getUsersMemberChats` | `public` | `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`ChatMember`>> | - | | `chat.getWorkspaceProjectChats` | `public` | `Promise`\<`any`\[]> | - | | `chat.highlightMessage` | `public` | `Promise`\<`ChatMessage`> | - | | `chat.removeAttachment` | `public` | `Promise`\<`ChatMessage`> | - | | `chat.removeMembers` | `public` | `Promise`\<`ChatMember`> | - | | `chat.removeReaction` | `public` | `Promise`\<`ChatMessage`> | - | | `chat.reviseMessage` | `public` | `Promise`\<`ChatMessage`> | - | | `chat.unarchiveMemberChat` | `public` | `Promise`\<`ChatMember`> | - | | `chat.unfollowChat` | `public` | `Promise`\<`void`> | - | | `chat.unhighlightMessage` | `public` | `Promise`\<`ChatMessage`> | - | | `chat.updateChatSubject` | `public` | `Promise`\<`Chat`> | - | | `chat.updateMemberChat` | `public` | `Promise`\<`ChatMember`> | - | | `chat.updateMemberChatIcon` | `public` | `Promise`\<\{ `chat`: `ChatMember`; } & [`AttachmentUploadRecord`](/docs/reference/sdk/routes/chat#attachmentuploadrecord)> | - | | `config` | `readonly` | [`ConfigMethods`](/docs/reference/sdk/routes/config#configmethods) | - | | `convo` | `readonly` | \{ `completeConvo`: `Promise`\<`CompleteConvoResponse`>; `deleteConvo`: `Promise`\<`void`>; `getChatConvos`: `Promise`\<`Convo`\[]>; `getConvo`: `Promise`\<`GetConvoResponse`>; `getProjectConvos`: `Promise`\<`Convo`\[]>; `getScopeConvos`: `Promise`\<`GetScopeConvosResponse`>; `joinConvo`: `Promise`\<`JoinConvoResponse`>; `leaveConvo`: `Promise`\<`LeaveConvoResponse`>; `rejoinConvo`: `Promise`\<`JoinConvoResponse`>; `startConvo`: `Promise`\<`StartConvoResponse`>; `updateConvo`: `Promise`\<`UpdateConvoResponse`>; } | - | | `convo.completeConvo` | `public` | `Promise`\<`CompleteConvoResponse`> | - | | `convo.deleteConvo` | `public` | `Promise`\<`void`> | - | | `convo.getChatConvos` | `public` | `Promise`\<`Convo`\[]> | - | | `convo.getConvo` | `public` | `Promise`\<`GetConvoResponse`> | - | | `convo.getProjectConvos` | `public` | `Promise`\<`Convo`\[]> | - | | `convo.getScopeConvos` | `public` | `Promise`\<`GetScopeConvosResponse`> | - | | `convo.joinConvo` | `public` | `Promise`\<`JoinConvoResponse`> | - | | `convo.leaveConvo` | `public` | `Promise`\<`LeaveConvoResponse`> | - | | `convo.rejoinConvo` | `public` | `Promise`\<`JoinConvoResponse`> | - | | `convo.startConvo` | `public` | `Promise`\<`StartConvoResponse`> | - | | `convo.updateConvo` | `public` | `Promise`\<`UpdateConvoResponse`> | - | | `folder` | `readonly` | \{ `getFolder`: `Promise`\<`Folder`>; `getFoldersAssets`: `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/folder#paginatedresponse)\<`Asset`>>; `tagFolder`: `Promise`\<`Folder`>; `untagFolder`: `Promise`\<`Folder`>; `updateFolder`: `Promise`\<`Folder`>; `updateFolderIcon`: `Promise`\<`any`>; } | - | | `folder.getFolder` | `public` | `Promise`\<`Folder`> | - | | `folder.getFoldersAssets` | `public` | `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/folder#paginatedresponse)\<`Asset`>> | - | | `folder.tagFolder` | `public` | `Promise`\<`Folder`> | - | | `folder.untagFolder` | `public` | `Promise`\<`Folder`> | - | | `folder.updateFolder` | `public` | `Promise`\<`Folder`> | - | | `folder.updateFolderIcon` | `public` | `Promise`\<`any`> | - | | `invite` | `readonly` | \{ `acceptInvite`: `Promise`\<[`AcceptInviteResponse`](/docs/reference/sdk/routes/invite#acceptinviteresponse)>; `cancelInvite`: `Promise`\<`Invite`>; `getInviteById`: `Promise`\<`Invite`>; `getInvites`: `Promise`\<[`PaginatedInvitesResponse`](/docs/reference/sdk/routes/invite#paginatedinvitesresponse)>; `getInvitesForResource`: `Promise`\<`Invite`\[]>; `inviteUser`: `Promise`\<`Invite`>; `resendInvite`: `Promise`\<`Invite`>; } | - | | `invite.acceptInvite` | `public` | `Promise`\<[`AcceptInviteResponse`](/docs/reference/sdk/routes/invite#acceptinviteresponse)> | - | | `invite.cancelInvite` | `public` | `Promise`\<`Invite`> | - | | `invite.getInviteById` | `public` | `Promise`\<`Invite`> | - | | `invite.getInvites` | `public` | `Promise`\<[`PaginatedInvitesResponse`](/docs/reference/sdk/routes/invite#paginatedinvitesresponse)> | - | | `invite.getInvitesForResource` | `public` | `Promise`\<`Invite`\[]> | - | | `invite.inviteUser` | `public` | `Promise`\<`Invite`> | - | | `invite.resendInvite` | `public` | `Promise`\<`Invite`> | - | | `membership` | `readonly` | \{ `addRole`: `Promise`\<`Membership`>; `deleteMembership`: `Promise`\<`void`>; `getMyMemberships`: `Promise`\<`Membership`\[]>; `getProjectLastSeen`: `Promise`\<[`GetLastSeenResponse`](/docs/reference/sdk/routes/membership#getlastseenresponse)>; `getProjectMemberships`: `Promise`\<`MembershipReport`>; `getProjectMentionableUsers`: `Promise`\<`Mentionable`\[]>; `getWorkspaceLastSeen`: `Promise`\<[`GetLastSeenResponse`](/docs/reference/sdk/routes/membership#getlastseenresponse)>; `getWorkspaceMemberships`: `Promise`\<`MembershipReport`>; `leaveResource`: `Promise`\<`void`>; `removeRole`: `Promise`\<`Membership`>; } | - | | `membership.addRole` | `public` | `Promise`\<`Membership`> | - | | `membership.deleteMembership` | `public` | `Promise`\<`void`> | - | | `membership.getMyMemberships` | `public` | `Promise`\<`Membership`\[]> | - | | `membership.getProjectLastSeen` | `public` | `Promise`\<[`GetLastSeenResponse`](/docs/reference/sdk/routes/membership#getlastseenresponse)> | - | | `membership.getProjectMemberships` | `public` | `Promise`\<`MembershipReport`> | - | | `membership.getProjectMentionableUsers` | `public` | `Promise`\<`Mentionable`\[]> | - | | `membership.getWorkspaceLastSeen` | `public` | `Promise`\<[`GetLastSeenResponse`](/docs/reference/sdk/routes/membership#getlastseenresponse)> | - | | `membership.getWorkspaceMemberships` | `public` | `Promise`\<`MembershipReport`> | - | | `membership.leaveResource` | `public` | `Promise`\<`void`> | - | | `membership.removeRole` | `public` | `Promise`\<`Membership`> | - | | `notification` | `readonly` | \{ `getNewNotificationCount`: `Promise`\<[`NotificationCountResponse`](/docs/reference/sdk/routes/notification#notificationcountresponse)>; `getNewNotificationCountBulk`: `Promise`\<[`NotificationCountBulkResponse`](/docs/reference/sdk/routes/notification#notificationcountbulkresponse)>; `getNewNotifications`: `Promise`\<[`PaginatedNotificationResponse`](/docs/reference/sdk/routes/notification#paginatednotificationresponse)>; `getNotifications`: `Promise`\<[`PaginatedNotificationResponse`](/docs/reference/sdk/routes/notification#paginatednotificationresponse)>; `getUsersLastNotificationsSeen`: `Promise`\<[`LastSeenResponse`](/docs/reference/sdk/routes/notification#lastseenresponse)>; `updateUsersLastSeen`: `Promise`\<[`LastSeenResponse`](/docs/reference/sdk/routes/notification#lastseenresponse)>; } | - | | `notification.getNewNotificationCount` | `public` | `Promise`\<[`NotificationCountResponse`](/docs/reference/sdk/routes/notification#notificationcountresponse)> | - | | `notification.getNewNotificationCountBulk` | `public` | `Promise`\<[`NotificationCountBulkResponse`](/docs/reference/sdk/routes/notification#notificationcountbulkresponse)> | - | | `notification.getNewNotifications` | `public` | `Promise`\<[`PaginatedNotificationResponse`](/docs/reference/sdk/routes/notification#paginatednotificationresponse)> | - | | `notification.getNotifications` | `public` | `Promise`\<[`PaginatedNotificationResponse`](/docs/reference/sdk/routes/notification#paginatednotificationresponse)> | - | | `notification.getUsersLastNotificationsSeen` | `public` | `Promise`\<[`LastSeenResponse`](/docs/reference/sdk/routes/notification#lastseenresponse)> | - | | `notification.updateUsersLastSeen` | `public` | `Promise`\<[`LastSeenResponse`](/docs/reference/sdk/routes/notification#lastseenresponse)> | - | | `product` | `readonly` | \{ `getSuggestedCurrency`: `Promise`\<\{ `country`: `string` \| `null`; `currency`: [`SupportedCurrency`](/docs/reference/sdk/routes/product#supportedcurrency); `locked?`: `boolean`; `supported`: [`SupportedCurrency`](/docs/reference/sdk/routes/product#supportedcurrency)\[]; }>; `getWorkspaceProducts`: `Promise`\<`Product`\[]>; `listPlans`: `Promise`\<`Product`\[]>; } | - | | `product.getSuggestedCurrency` | `public` | `Promise`\<\{ `country`: `string` \| `null`; `currency`: [`SupportedCurrency`](/docs/reference/sdk/routes/product#supportedcurrency); `locked?`: `boolean`; `supported`: [`SupportedCurrency`](/docs/reference/sdk/routes/product#supportedcurrency)\[]; }> | - | | `product.getWorkspaceProducts` | `public` | `Promise`\<`Product`\[]> | - | | `product.listPlans` | `public` | `Promise`\<`Product`\[]> | - | | `project` | `readonly` | [`ProjectMethods`](/docs/reference/sdk/NuramaClient#projectmethods) | - | | `public` | `readonly` | \{ `createPublicAssetChatMessage`: `Promise`\<`CreatePublicAssetChatMessageResponse`>; `createPublicChatMessage`: `Promise`\<`ChatMessage`>; `createPublicTopicChatMessage`: `Promise`\<`CreatePublicAssetChatMessageResponse`>; `downloadAssets`: `Promise`\<`DownloadSignedUrlData`\[]>; `getPublicAsset`: `Promise`\<`PublicAssetResponse`>; `getPublicChat`: `Promise`\<`Chat` \| `null`>; `getPublicChatMessages`: `Promise`\<`PublicChatMessagesResponse`>; `getPublicDownloadUrl`: `Promise`\<[`PublicDownloadUrlResponse`](/docs/reference/sdk/routes/shortlink#publicdownloadurlresponse)>; `getPublicEmbedFiles`: `Promise`\<[`PublicEmbedFilesResponse`](/docs/reference/sdk/routes/shortlink#publicembedfilesresponse)>; `getPublicFileSystem`: `Promise`\<[`PublicFileSystemDetailsResponse`](/docs/reference/sdk/routes/public#publicfilesystemdetailsresponse)>; `getPublicItems`: `Promise`\<[`PublicFileSystemResponse`](/docs/reference/sdk/routes/public#publicfilesystemresponse)>; `getPublicItemsAtPath`: `Promise`\<[`PublicFileSystemResponse`](/docs/reference/sdk/routes/public#publicfilesystemresponse)>; `recordAccessActivity`: `Promise`\<`void`>; `resolvePublicDownload`: `Promise`\<[`ResolvePublicDownloadResponse`](/docs/reference/sdk/routes/shortlink#resolvepublicdownloadresponse)>; } | - | | `public.createPublicAssetChatMessage` | `public` | `Promise`\<`CreatePublicAssetChatMessageResponse`> | - | | `public.createPublicChatMessage` | `public` | `Promise`\<`ChatMessage`> | - | | `public.createPublicTopicChatMessage` | `public` | `Promise`\<`CreatePublicAssetChatMessageResponse`> | - | | `public.downloadAssets` | `public` | `Promise`\<`DownloadSignedUrlData`\[]> | - | | `public.getPublicAsset` | `public` | `Promise`\<`PublicAssetResponse`> | - | | `public.getPublicChat` | `public` | `Promise`\<`Chat` \| `null`> | - | | `public.getPublicChatMessages` | `public` | `Promise`\<`PublicChatMessagesResponse`> | - | | `public.getPublicDownloadUrl` | `public` | `Promise`\<[`PublicDownloadUrlResponse`](/docs/reference/sdk/routes/shortlink#publicdownloadurlresponse)> | - | | `public.getPublicEmbedFiles` | `public` | `Promise`\<[`PublicEmbedFilesResponse`](/docs/reference/sdk/routes/shortlink#publicembedfilesresponse)> | - | | `public.getPublicFileSystem` | `public` | `Promise`\<[`PublicFileSystemDetailsResponse`](/docs/reference/sdk/routes/public#publicfilesystemdetailsresponse)> | - | | `public.getPublicItems` | `public` | `Promise`\<[`PublicFileSystemResponse`](/docs/reference/sdk/routes/public#publicfilesystemresponse)> | - | | `public.getPublicItemsAtPath` | `public` | `Promise`\<[`PublicFileSystemResponse`](/docs/reference/sdk/routes/public#publicfilesystemresponse)> | - | | `public.recordAccessActivity` | `public` | `Promise`\<`void`> | - | | `public.resolvePublicDownload` | `public` | `Promise`\<[`ResolvePublicDownloadResponse`](/docs/reference/sdk/routes/shortlink#resolvepublicdownloadresponse)> | - | | `settings` | `readonly` | \{ `cleanupOrphanedSettings`: `Promise`\<\{ `message`: `string`; `removedCount`: `number`; }>; `getAllResourceSettings`: `Promise`\<\{ `resourceSettings`: [`ResourceSettings`](/docs/reference/sdk/routes/settings#resourcesettings)\[]; }>; `getEffectiveSettings`: `Promise`\<[`EffectiveSettings`](/docs/reference/sdk/routes/settings#effectivesettings)>; `getResourceSettings`: `Promise`\< \| [`ResourceSettings`](/docs/reference/sdk/routes/settings#resourcesettings) \| \{ `message`: `string`; }>; `resetResourceSettings`: `Promise`\<\{ `message`: `string`; }>; `updateResourceSettings`: `Promise`\<\{ `message`: `string`; `settings`: [`ResourceSettings`](/docs/reference/sdk/routes/settings#resourcesettings); }>; } | - | | `settings.cleanupOrphanedSettings` | `public` | `Promise`\<\{ `message`: `string`; `removedCount`: `number`; }> | - | | `settings.getAllResourceSettings` | `public` | `Promise`\<\{ `resourceSettings`: [`ResourceSettings`](/docs/reference/sdk/routes/settings#resourcesettings)\[]; }> | - | | `settings.getEffectiveSettings` | `public` | `Promise`\<[`EffectiveSettings`](/docs/reference/sdk/routes/settings#effectivesettings)> | - | | `settings.getResourceSettings` | `public` | `Promise`\< \| [`ResourceSettings`](/docs/reference/sdk/routes/settings#resourcesettings) \| \{ `message`: `string`; }> | - | | `settings.resetResourceSettings` | `public` | `Promise`\<\{ `message`: `string`; }> | - | | `settings.updateResourceSettings` | `public` | `Promise`\<\{ `message`: `string`; `settings`: [`ResourceSettings`](/docs/reference/sdk/routes/settings#resourcesettings); }> | - | | `shortlink` | `readonly` | \{ `resolveShortLink`: `Promise`\<[`ResolveShortLinkResponse`](/docs/reference/sdk/routes/shortlink#resolveshortlinkresponse)>; } | - | | `shortlink.resolveShortLink` | `public` | `Promise`\<[`ResolveShortLinkResponse`](/docs/reference/sdk/routes/shortlink#resolveshortlinkresponse)> | - | | `socket` | `readonly` | \{ `connect`: (`channel`, `options`) => `Promise`\<[`SocketChannel`](/docs/reference/sdk/routes/socket#socketchannel)>; `connectPublic`: (`publicToken`, `options`) => `Promise`\<[`SocketChannel`](/docs/reference/sdk/routes/socket#socketchannel)>; `disconnect`: (`channel`) => `Promise`\<`void`>; `disconnectAll`: () => `Promise`\<`void`>; `emit`: (`channel`, `event`, `data?`) => `void`; `emitWithAck`: (`channel`, `event`, `data`, `timeoutMs`) => `Promise`\<`boolean`>; `isConnected`: (`channel`) => `boolean`; `onReconnect`: (`channel`, `callback`) => `void`; `onReconnectFailed`: (`channel`, `callback`) => `void`; `subscribe`: \<`T`>(`channel`, `event`, `callback`) => `Promise`\<`void`>; `subscribePublic`: \<`T`>(`publicToken`, `event`, `callback`) => `Promise`\<`void`>; `unsubscribe`: (`channel`, `event`, `callback?`) => `void`; } | - | | `socket.connect` | `public` | (`channel`, `options`) => `Promise`\<[`SocketChannel`](/docs/reference/sdk/routes/socket#socketchannel)> | Connect to a socket channel | | `socket.connectPublic` | `public` | (`publicToken`, `options`) => `Promise`\<[`SocketChannel`](/docs/reference/sdk/routes/socket#socketchannel)> | Connect to a public socket channel without authentication | | `socket.disconnect` | `public` | (`channel`) => `Promise`\<`void`> | Disconnect from a socket channel | | `socket.disconnectAll` | `public` | () => `Promise`\<`void`> | Disconnect from all channels | | `socket.emit` | `public` | (`channel`, `event`, `data?`) => `void` | Emit an event to a connected channel | | `socket.emitWithAck` | `public` | (`channel`, `event`, `data`, `timeoutMs`) => `Promise`\<`boolean`> | Emit an event with a timeout-bounded server acknowledgement. Resolves `true` if the server acks within `timeoutMs`, `false` on timeout or transport error. Use it to actively verify a channel's liveness when `socket.connected` may be stale — most notably after a backgrounded tab returns to focus, where the flag can remain `true` for up to socket.io's own heartbeat window (\~25–45s) even after the underlying TCP transport has died. Relies on socket.io v4's `socket.timeout(ms).emit(ev, data, cb)` pattern: the server acknowledges the event via its trailing callback; if no ack arrives within `timeoutMs` the callback receives an Error. | | `socket.isConnected` | `public` | (`channel`) => `boolean` | Check if connected to a channel | | `socket.onReconnect` | `public` | (`channel`, `callback`) => `void` | Register a callback for when the channel reconnects — a socket.io transport-level reconnect, or the token-refresh reconnect. Use it to recover any gap of server->client messages missed while the connection was down; socket.io does not replay those. Dispatched from the 'reconnect' handler in connect() and from the token-refresh path. | | `socket.onReconnectFailed` | `public` | (`channel`, `callback`) => `void` | Register a callback for when Socket.IO exhausts all reconnection attempts | | `socket.subscribe` | `public` | \<`T`>(`channel`, `event`, `callback`) => `Promise`\<`void`> | Subscribe to an event on a channel | | `socket.subscribePublic` | `public` | \<`T`>(`publicToken`, `event`, `callback`) => `Promise`\<`void`> | Subscribe to an event on a public channel Automatically connects to the public channel if not already connected | | `socket.unsubscribe` | `public` | (`channel`, `event`, `callback?`) => `void` | Stop listening for an event on a channel. If `callback` is provided, only that specific listener is removed; otherwise every listener for that event is cleared. | | `storage` | `readonly` | \{ `getStorageChart`: `Promise`\<[`ChartDataResponse`](/docs/reference/sdk/routes/storage#chartdataresponse)>; `getStorageRecord`: `Promise`\<[`StorageRecord`](/docs/reference/sdk/routes/storage#storagerecord)>; } | - | | `storage.getStorageChart` | `public` | `Promise`\<[`ChartDataResponse`](/docs/reference/sdk/routes/storage#chartdataresponse)> | - | | `storage.getStorageRecord` | `public` | `Promise`\<[`StorageRecord`](/docs/reference/sdk/routes/storage#storagerecord)> | - | | `tag` | `readonly` | \{ `createTag`: `Promise`\<`Tag`>; `deleteTag`: `Promise`\<`Tag`>; `getTags`: `Promise`\<[`Tags`](/docs/reference/sdk/routes/tag#tags)>; `updateTag`: `Promise`\<`Tag`>; } | - | | `tag.createTag` | `public` | `Promise`\<`Tag`> | - | | `tag.deleteTag` | `public` | `Promise`\<`Tag`> | - | | `tag.getTags` | `public` | `Promise`\<[`Tags`](/docs/reference/sdk/routes/tag#tags)> | - | | `tag.updateTag` | `public` | `Promise`\<`Tag`> | - | | `task` | `readonly` | \{ `acknowledgeAllTasks`: `Promise`\<[`AcknowledgeAllTasksResponse`](/docs/reference/sdk/routes/task#acknowledgealltasksresponse)>; `acknowledgeTask`: `Promise`\<`Task`>; `bulkCreate`: `Promise`\<[`BulkCreateTasksResponse`](/docs/reference/sdk/routes/task#bulkcreatetasksresponse)>; `deleteTask`: `Promise`\<`void`>; `followTask`: `Promise`\<`Task`>; `getMyTasks`: `Promise`\<[`GetTasksResponse`](/docs/reference/sdk/routes/task#gettasksresponse)>; `getTaskEvents`: `Promise`\<[`GetTaskEventsResponse`](/docs/reference/sdk/routes/task#gettaskeventsresponse)>; `getTaskLinks`: `Promise`\<`TaskLink`\[]>; `getUnacknowledgedTaskCount`: `Promise`\<[`UnacknowledgedTaskCountResponse`](/docs/reference/sdk/routes/task#unacknowledgedtaskcountresponse)>; `linkTask`: `Promise`\<`TaskLink`>; `tagTask`: `Promise`\<`Task`>; `unfollowTask`: `Promise`\<`Task`>; `unlinkTask`: `Promise`\<`void`>; `untagTask`: `Promise`\<`Task`>; `updateTaskDetails`: `Promise`\<`Task`>; `updateTaskStatus`: `Promise`\<`Task`>; } | - | | `task.acknowledgeAllTasks` | `public` | `Promise`\<[`AcknowledgeAllTasksResponse`](/docs/reference/sdk/routes/task#acknowledgealltasksresponse)> | - | | `task.acknowledgeTask` | `public` | `Promise`\<`Task`> | - | | `task.bulkCreate` | `public` | `Promise`\<[`BulkCreateTasksResponse`](/docs/reference/sdk/routes/task#bulkcreatetasksresponse)> | - | | `task.deleteTask` | `public` | `Promise`\<`void`> | - | | `task.followTask` | `public` | `Promise`\<`Task`> | - | | `task.getMyTasks` | `public` | `Promise`\<[`GetTasksResponse`](/docs/reference/sdk/routes/task#gettasksresponse)> | - | | `task.getTaskEvents` | `public` | `Promise`\<[`GetTaskEventsResponse`](/docs/reference/sdk/routes/task#gettaskeventsresponse)> | - | | `task.getTaskLinks` | `public` | `Promise`\<`TaskLink`\[]> | - | | `task.getUnacknowledgedTaskCount` | `public` | `Promise`\<[`UnacknowledgedTaskCountResponse`](/docs/reference/sdk/routes/task#unacknowledgedtaskcountresponse)> | - | | `task.linkTask` | `public` | `Promise`\<`TaskLink`> | - | | `task.tagTask` | `public` | `Promise`\<`Task`> | - | | `task.unfollowTask` | `public` | `Promise`\<`Task`> | - | | `task.unlinkTask` | `public` | `Promise`\<`void`> | - | | `task.untagTask` | `public` | `Promise`\<`Task`> | - | | `task.updateTaskDetails` | `public` | `Promise`\<`Task`> | - | | `task.updateTaskStatus` | `public` | `Promise`\<`Task`> | - | | `taskRelation` | `readonly` | \{ `createTaskRelation`: `Promise`\<[`TaskRelation`](/docs/reference/sdk/routes/taskRelation#taskrelation)>; `deleteTaskRelation`: `Promise`\<`void`>; `getRelationsForChat`: `Promise`\<[`PaginatedTaskRelations`](/docs/reference/sdk/routes/taskRelation#paginatedtaskrelations)>; `getRelationsForMessage`: `Promise`\<[`PaginatedTaskRelations`](/docs/reference/sdk/routes/taskRelation#paginatedtaskrelations)>; `getTaskRelations`: `Promise`\<[`PaginatedTaskRelations`](/docs/reference/sdk/routes/taskRelation#paginatedtaskrelations)>; } | - | | `taskRelation.createTaskRelation` | `public` | `Promise`\<[`TaskRelation`](/docs/reference/sdk/routes/taskRelation#taskrelation)> | - | | `taskRelation.deleteTaskRelation` | `public` | `Promise`\<`void`> | - | | `taskRelation.getRelationsForChat` | `public` | `Promise`\<[`PaginatedTaskRelations`](/docs/reference/sdk/routes/taskRelation#paginatedtaskrelations)> | - | | `taskRelation.getRelationsForMessage` | `public` | `Promise`\<[`PaginatedTaskRelations`](/docs/reference/sdk/routes/taskRelation#paginatedtaskrelations)> | - | | `taskRelation.getTaskRelations` | `public` | `Promise`\<[`PaginatedTaskRelations`](/docs/reference/sdk/routes/taskRelation#paginatedtaskrelations)> | - | | `version` | `readonly` | \{ `getCommitHash`: `Promise`\<[`CommitResponse`](/docs/reference/sdk/routes/version#commitresponse)>; `getHealth`: `Promise`\<[`HealthStatus`](/docs/reference/sdk/routes/version#healthstatus)>; } | - | | `version.getCommitHash` | `public` | `Promise`\<[`CommitResponse`](/docs/reference/sdk/routes/version#commitresponse)> | - | | `version.getHealth` | `public` | `Promise`\<[`HealthStatus`](/docs/reference/sdk/routes/version#healthstatus)> | - | | `workspace` | `readonly` | [`WorkspaceMethods`](/docs/reference/sdk/NuramaClient#workspacemethods) | - | ## Interfaces [#interfaces] ### BotClientOptions [#botclientoptions] #### Properties [#properties-1] | Property | Type | Description | | ------------------------------------------------------- | -------------------------------------------- | ------------------------------------------------------------------------------------------------ | | `baseURL?` | `string` | Override the default bot API URL ([https://bot.nurama.com](https://bot.nurama.com)). | | `cacheDurationSeconds?` | `number` | Cache duration in seconds. Default: 5 | | `debug?` | `boolean` | Enable debug logging. Default: false | | `enableCache?` | `boolean` | Enable response caching. Default: true | | `fetch?` | (`input`, `init?`) => `Promise`\<`Response`> | Custom fetch implementation. Defaults to global fetch. | | `websocketURL?` | `string` | Override the default bot WebSocket URL ([https://bot-ws.nurama.com](https://bot-ws.nurama.com)). | # NuramaClient (/docs/reference/sdk/NuramaClient) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Classes [#classes] ### default [#default] Client interface for interacting with the Nurama REST API. #### Constructors [#constructors] ##### Constructor [#constructor] ```ts new default(baseURL, options?): default; ``` Creates an instance of NuramaClient. ###### Parameters [#parameters] | Parameter | Type | Description | | --------- | --------------------------------------------- | -------------------------------- | | `baseURL` | `string` | The base URL for the Nurama API. | | `options` | [`NuramaClientOptions`](#nuramaclientoptions) | Configuration options. | ###### Returns [#returns] [`default`](#default) #### Properties [#properties] | Property | Modifier | Type | Default value | Description | | ---------------------------------------------------------------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ai` | `public` | \{ `composeWithNu`: `Promise`\<[`ComposeWithNuResponse`](/docs/reference/sdk/routes/ai#composewithnuresponse)>; `createRevisionSourceUpload`: `Promise`\<[`CreateRevisionSourceUploadResponse`](/docs/reference/sdk/routes/ai#createrevisionsourceuploadresponse)>; `generateRevision`: `Promise`\<[`GenerateImageRevisionResponse`](/docs/reference/sdk/routes/ai#generateimagerevisionresponse)>; `generateTasks`: `Promise`\<[`GenerateTasksResponse`](/docs/reference/sdk/routes/ai#generatetasksresponse)>; `listTones`: `Promise`\<[`ListTonesResponse`](/docs/reference/sdk/routes/ai#listtonesresponse)>; `polish`: `Promise`\<[`PolishResponse`](/docs/reference/sdk/routes/ai#polishresponse)>; `submitFeedback`: `Promise`\<\{ `id`: `string`; }>; } | `undefined` | - | | `ai.composeWithNu` | `public` | `Promise`\<[`ComposeWithNuResponse`](/docs/reference/sdk/routes/ai#composewithnuresponse)> | `undefined` | - | | `ai.createRevisionSourceUpload` | `public` | `Promise`\<[`CreateRevisionSourceUploadResponse`](/docs/reference/sdk/routes/ai#createrevisionsourceuploadresponse)> | `undefined` | - | | `ai.generateRevision` | `public` | `Promise`\<[`GenerateImageRevisionResponse`](/docs/reference/sdk/routes/ai#generateimagerevisionresponse)> | `undefined` | - | | `ai.generateTasks` | `public` | `Promise`\<[`GenerateTasksResponse`](/docs/reference/sdk/routes/ai#generatetasksresponse)> | `undefined` | - | | `ai.listTones` | `public` | `Promise`\<[`ListTonesResponse`](/docs/reference/sdk/routes/ai#listtonesresponse)> | `undefined` | - | | `ai.polish` | `public` | `Promise`\<[`PolishResponse`](/docs/reference/sdk/routes/ai#polishresponse)> | `undefined` | - | | `ai.submitFeedback` | `public` | `Promise`\<\{ `id`: `string`; }> | `undefined` | - | | `aiChat` | `public` | \{ `createTopic`: `Promise`\<`AiChatCreateTopicResponse`>; `deleteTopic`: `Promise`\<`AiChatGetTopicResponse`>; `getTopic`: `Promise`\<`AiChatGetTopicResponse`>; `listTopics`: `Promise`\<`AiChatListTopicsResponse`>; `updateTopic`: `Promise`\<`AiChatGetTopicResponse`>; } | `undefined` | - | | `aiChat.createTopic` | `public` | `Promise`\<`AiChatCreateTopicResponse`> | `undefined` | - | | `aiChat.deleteTopic` | `public` | `Promise`\<`AiChatGetTopicResponse`> | `undefined` | - | | `aiChat.getTopic` | `public` | `Promise`\<`AiChatGetTopicResponse`> | `undefined` | - | | `aiChat.listTopics` | `public` | `Promise`\<`AiChatListTopicsResponse`> | `undefined` | - | | `aiChat.updateTopic` | `public` | `Promise`\<`AiChatGetTopicResponse`> | `undefined` | - | | `asset` | `readonly` | [`AssetMethods`](#assetmethods) | `undefined` | - | | `auth` | `readonly` | [`AuthMethods`](#authmethods) | `undefined` | - | | `baseURL` | `readonly` | `string` | `undefined` | - | | `blogPosts` | `public` | \{ `listBlogPosts`: `Promise`\<`BlogPostListResponse`>; } | `undefined` | - | | `blogPosts.listBlogPosts` | `public` | `Promise`\<`BlogPostListResponse`> | `undefined` | - | | `board` | `public` | \{ `addColumn`: `Promise`\<`BoardColumn`>; `addExistingTaskToBoard`: `Promise`\<`Task`>; `createBoard`: `Promise`\<`Board`>; `createBoardTask`: `Promise`\<`Task`>; `deleteBoard`: `Promise`\<\{ `deletedTaskIds`: `string`\[]; `disposition`: `string`; `message`: `string`; `reassignedTaskIds`: `string`\[]; }>; `deleteColumn`: `Promise`\<`void`>; `followBoard`: `Promise`\<`Board`>; `getBoard`: `Promise`\<`BoardWithTasks`>; `getBoardTasks`: `Promise`\<`Task`\[]>; `getProjectBoards`: `Promise`\<`Board`\[]>; `getProjectTasks`: `Promise`\<`any`>; `moveTask`: `Promise`\<`Task`>; `removeTaskFromBoard`: `Promise`\<`Task`>; `reorderColumns`: `Promise`\<`BoardColumn`\[]>; `tagBoard`: `Promise`\<`Board`>; `unfollowBoard`: `Promise`\<`Board`>; `untagBoard`: `Promise`\<`Board`>; `updateBoard`: `Promise`\<`Board`>; `updateColumn`: `Promise`\<`BoardColumn`>; } | `undefined` | - | | `board.addColumn` | `public` | `Promise`\<`BoardColumn`> | `undefined` | - | | `board.addExistingTaskToBoard` | `public` | `Promise`\<`Task`> | `undefined` | - | | `board.createBoard` | `public` | `Promise`\<`Board`> | `undefined` | - | | `board.createBoardTask` | `public` | `Promise`\<`Task`> | `undefined` | - | | `board.deleteBoard` | `public` | `Promise`\<\{ `deletedTaskIds`: `string`\[]; `disposition`: `string`; `message`: `string`; `reassignedTaskIds`: `string`\[]; }> | `undefined` | - | | `board.deleteColumn` | `public` | `Promise`\<`void`> | `undefined` | - | | `board.followBoard` | `public` | `Promise`\<`Board`> | `undefined` | - | | `board.getBoard` | `public` | `Promise`\<`BoardWithTasks`> | `undefined` | - | | `board.getBoardTasks` | `public` | `Promise`\<`Task`\[]> | `undefined` | - | | `board.getProjectBoards` | `public` | `Promise`\<`Board`\[]> | `undefined` | - | | `board.getProjectTasks` | `public` | `Promise`\<`any`> | `undefined` | - | | `board.moveTask` | `public` | `Promise`\<`Task`> | `undefined` | - | | `board.removeTaskFromBoard` | `public` | `Promise`\<`Task`> | `undefined` | - | | `board.reorderColumns` | `public` | `Promise`\<`BoardColumn`\[]> | `undefined` | - | | `board.tagBoard` | `public` | `Promise`\<`Board`> | `undefined` | - | | `board.unfollowBoard` | `public` | `Promise`\<`Board`> | `undefined` | - | | `board.untagBoard` | `public` | `Promise`\<`Board`> | `undefined` | - | | `board.updateBoard` | `public` | `Promise`\<`Board`> | `undefined` | - | | `board.updateColumn` | `public` | `Promise`\<`BoardColumn`> | `undefined` | - | | `bot` | `public` | \{ `createBot`: `Promise`\<[`CreateBotResponse`](/docs/reference/sdk/routes/bot#createbotresponse)>; `deleteBot`: `Promise`\<`void`>; `getBot`: `Promise`\<[`Bot`](/docs/reference/sdk/routes/bot#bot)>; `listBots`: `Promise`\<[`Bot`](/docs/reference/sdk/routes/bot#bot)\[]>; `listProjectMemberships`: `Promise`\<[`BotProjectMembership`](/docs/reference/sdk/routes/bot#botprojectmembership)\[]>; `removeProjectMembership`: `Promise`\<`void`>; `rotateBotKey`: `Promise`\<[`RotateBotKeyResponse`](/docs/reference/sdk/routes/bot#rotatebotkeyresponse)>; `setProjectMembership`: `Promise`\<[`BotProjectMembership`](/docs/reference/sdk/routes/bot#botprojectmembership)>; `updateBot`: `Promise`\<[`Bot`](/docs/reference/sdk/routes/bot#bot)>; `updateBotAvatar`: `Promise`\<[`UpdateBotAvatarResponse`](/docs/reference/sdk/routes/bot#updatebotavatarresponse)>; } | `undefined` | - | | `bot.createBot` | `public` | `Promise`\<[`CreateBotResponse`](/docs/reference/sdk/routes/bot#createbotresponse)> | `undefined` | - | | `bot.deleteBot` | `public` | `Promise`\<`void`> | `undefined` | - | | `bot.getBot` | `public` | `Promise`\<[`Bot`](/docs/reference/sdk/routes/bot#bot)> | `undefined` | - | | `bot.listBots` | `public` | `Promise`\<[`Bot`](/docs/reference/sdk/routes/bot#bot)\[]> | `undefined` | - | | `bot.listProjectMemberships` | `public` | `Promise`\<[`BotProjectMembership`](/docs/reference/sdk/routes/bot#botprojectmembership)\[]> | `undefined` | - | | `bot.removeProjectMembership` | `public` | `Promise`\<`void`> | `undefined` | - | | `bot.rotateBotKey` | `public` | `Promise`\<[`RotateBotKeyResponse`](/docs/reference/sdk/routes/bot#rotatebotkeyresponse)> | `undefined` | - | | `bot.setProjectMembership` | `public` | `Promise`\<[`BotProjectMembership`](/docs/reference/sdk/routes/bot#botprojectmembership)> | `undefined` | - | | `bot.updateBot` | `public` | `Promise`\<[`Bot`](/docs/reference/sdk/routes/bot#bot)> | `undefined` | - | | `bot.updateBotAvatar` | `public` | `Promise`\<[`UpdateBotAvatarResponse`](/docs/reference/sdk/routes/bot#updatebotavatarresponse)> | `undefined` | - | | `browserMode` | `readonly` | `boolean` | `false` | - | | `cacheDurationSeconds` | `readonly` | `number` | `undefined` | - | | `chat` | `public` | \{ `addAttachments`: `Promise`\<[`AttachmentUploadRecord`](/docs/reference/sdk/routes/chat#attachmentuploadrecord)\[]>; `addMembers`: `Promise`\<`ChatMember`>; `archiveMemberChat`: `Promise`\<`ChatMember`>; `createAssetChatAndMessage`: `Promise`\<`any`>; `createMemberChat`: `Promise`\<`ChatMember`>; `createMessage`: `Promise`\<`ChatMessage`>; `createMessageShortLink`: `Promise`\<\{ `code`: `string`; `shortUrl`: `string`; }>; `createReaction`: `Promise`\<`ChatMessage`>; `createTopicChat`: `Promise`\<`Chat`>; `deleteChat`: `Promise`\<`void`>; `deleteMemberChat`: `Promise`\<`void`>; `deleteMessage`: `Promise`\<`ChatMessage`>; `fetchLinkPreviews`: `Promise`\<[`LinkPreviewResponse`](/docs/reference/sdk/routes/chat#linkpreviewresponse)>; `followChat`: `Promise`\<`void`>; `getAddableMembers`: `Promise`\< \| [`AddableMembersByScope`](/docs/reference/sdk/routes/chat#addablemembersbyscope) \| `Membership`\[]>; `getChat`: `Promise`\<`Chat`>; `getChatByTopicId`: `Promise`\<`Chat`>; `getMemberChat`: `Promise`\<`ChatMember`>; `getMentionableAssets`: `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`Asset`>>; `getMentionableFolders`: `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`Folder`>>; `getMentionablePublics`: `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<[`MentionablePublic`](/docs/reference/sdk/routes/chat#mentionablepublic)>>; `getMentionableSubmissions`: `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<[`MentionableSubmission`](/docs/reference/sdk/routes/chat#mentionablesubmission)>>; `getMentionableTasks`: `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`any`>>; `getMentions`: `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`ChatMessage`>>; `getMessage`: `Promise`\<`ChatMessage`>; `getMessages`: `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`ChatMessage`>>; `getReplies`: `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`ChatMessage`>>; `getScopeAddableMembers`: `Promise`\< \| [`AddableMembersByScope`](/docs/reference/sdk/routes/chat#addablemembersbyscope) \| `Membership`\[]>; `getUsersMemberChats`: `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`ChatMember`>>; `getWorkspaceProjectChats`: `Promise`\<`any`\[]>; `highlightMessage`: `Promise`\<`ChatMessage`>; `removeAttachment`: `Promise`\<`ChatMessage`>; `removeMembers`: `Promise`\<`ChatMember`>; `removeReaction`: `Promise`\<`ChatMessage`>; `reviseMessage`: `Promise`\<`ChatMessage`>; `unarchiveMemberChat`: `Promise`\<`ChatMember`>; `unfollowChat`: `Promise`\<`void`>; `unhighlightMessage`: `Promise`\<`ChatMessage`>; `updateChatSubject`: `Promise`\<`Chat`>; `updateMemberChat`: `Promise`\<`ChatMember`>; `updateMemberChatIcon`: `Promise`\<\{ `chat`: `ChatMember`; } & [`AttachmentUploadRecord`](/docs/reference/sdk/routes/chat#attachmentuploadrecord)>; } | `undefined` | - | | `chat.addAttachments` | `public` | `Promise`\<[`AttachmentUploadRecord`](/docs/reference/sdk/routes/chat#attachmentuploadrecord)\[]> | `undefined` | - | | `chat.addMembers` | `public` | `Promise`\<`ChatMember`> | `undefined` | - | | `chat.archiveMemberChat` | `public` | `Promise`\<`ChatMember`> | `undefined` | - | | `chat.createAssetChatAndMessage` | `public` | `Promise`\<`any`> | `undefined` | - | | `chat.createMemberChat` | `public` | `Promise`\<`ChatMember`> | `undefined` | - | | `chat.createMessage` | `public` | `Promise`\<`ChatMessage`> | `undefined` | - | | `chat.createMessageShortLink` | `public` | `Promise`\<\{ `code`: `string`; `shortUrl`: `string`; }> | `undefined` | - | | `chat.createReaction` | `public` | `Promise`\<`ChatMessage`> | `undefined` | - | | `chat.createTopicChat` | `public` | `Promise`\<`Chat`> | `undefined` | - | | `chat.deleteChat` | `public` | `Promise`\<`void`> | `undefined` | - | | `chat.deleteMemberChat` | `public` | `Promise`\<`void`> | `undefined` | - | | `chat.deleteMessage` | `public` | `Promise`\<`ChatMessage`> | `undefined` | - | | `chat.fetchLinkPreviews` | `public` | `Promise`\<[`LinkPreviewResponse`](/docs/reference/sdk/routes/chat#linkpreviewresponse)> | `undefined` | - | | `chat.followChat` | `public` | `Promise`\<`void`> | `undefined` | - | | `chat.getAddableMembers` | `public` | `Promise`\< \| [`AddableMembersByScope`](/docs/reference/sdk/routes/chat#addablemembersbyscope) \| `Membership`\[]> | `undefined` | - | | `chat.getChat` | `public` | `Promise`\<`Chat`> | `undefined` | - | | `chat.getChatByTopicId` | `public` | `Promise`\<`Chat`> | `undefined` | - | | `chat.getMemberChat` | `public` | `Promise`\<`ChatMember`> | `undefined` | - | | `chat.getMentionableAssets` | `public` | `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`Asset`>> | `undefined` | - | | `chat.getMentionableFolders` | `public` | `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`Folder`>> | `undefined` | - | | `chat.getMentionablePublics` | `public` | `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<[`MentionablePublic`](/docs/reference/sdk/routes/chat#mentionablepublic)>> | `undefined` | - | | `chat.getMentionableSubmissions` | `public` | `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<[`MentionableSubmission`](/docs/reference/sdk/routes/chat#mentionablesubmission)>> | `undefined` | - | | `chat.getMentionableTasks` | `public` | `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`any`>> | `undefined` | - | | `chat.getMentions` | `public` | `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`ChatMessage`>> | `undefined` | - | | `chat.getMessage` | `public` | `Promise`\<`ChatMessage`> | `undefined` | - | | `chat.getMessages` | `public` | `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`ChatMessage`>> | `undefined` | - | | `chat.getReplies` | `public` | `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`ChatMessage`>> | `undefined` | - | | `chat.getScopeAddableMembers` | `public` | `Promise`\< \| [`AddableMembersByScope`](/docs/reference/sdk/routes/chat#addablemembersbyscope) \| `Membership`\[]> | `undefined` | - | | `chat.getUsersMemberChats` | `public` | `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/chat#paginatedresponse)\<`ChatMember`>> | `undefined` | - | | `chat.getWorkspaceProjectChats` | `public` | `Promise`\<`any`\[]> | `undefined` | - | | `chat.highlightMessage` | `public` | `Promise`\<`ChatMessage`> | `undefined` | - | | `chat.removeAttachment` | `public` | `Promise`\<`ChatMessage`> | `undefined` | - | | `chat.removeMembers` | `public` | `Promise`\<`ChatMember`> | `undefined` | - | | `chat.removeReaction` | `public` | `Promise`\<`ChatMessage`> | `undefined` | - | | `chat.reviseMessage` | `public` | `Promise`\<`ChatMessage`> | `undefined` | - | | `chat.unarchiveMemberChat` | `public` | `Promise`\<`ChatMember`> | `undefined` | - | | `chat.unfollowChat` | `public` | `Promise`\<`void`> | `undefined` | - | | `chat.unhighlightMessage` | `public` | `Promise`\<`ChatMessage`> | `undefined` | - | | `chat.updateChatSubject` | `public` | `Promise`\<`Chat`> | `undefined` | - | | `chat.updateMemberChat` | `public` | `Promise`\<`ChatMember`> | `undefined` | - | | `chat.updateMemberChatIcon` | `public` | `Promise`\<\{ `chat`: `ChatMember`; } & [`AttachmentUploadRecord`](/docs/reference/sdk/routes/chat#attachmentuploadrecord)> | `undefined` | - | | `config` | `readonly` | [`ConfigMethods`](/docs/reference/sdk/routes/config#configmethods) | `undefined` | - | | `convo` | `public` | \{ `completeConvo`: `Promise`\<`CompleteConvoResponse`>; `deleteConvo`: `Promise`\<`void`>; `getChatConvos`: `Promise`\<`Convo`\[]>; `getConvo`: `Promise`\<`GetConvoResponse`>; `getProjectConvos`: `Promise`\<`Convo`\[]>; `getScopeConvos`: `Promise`\<`GetScopeConvosResponse`>; `joinConvo`: `Promise`\<`JoinConvoResponse`>; `leaveConvo`: `Promise`\<`LeaveConvoResponse`>; `rejoinConvo`: `Promise`\<`JoinConvoResponse`>; `startConvo`: `Promise`\<`StartConvoResponse`>; `updateConvo`: `Promise`\<`UpdateConvoResponse`>; } | `undefined` | - | | `convo.completeConvo` | `public` | `Promise`\<`CompleteConvoResponse`> | `undefined` | - | | `convo.deleteConvo` | `public` | `Promise`\<`void`> | `undefined` | - | | `convo.getChatConvos` | `public` | `Promise`\<`Convo`\[]> | `undefined` | - | | `convo.getConvo` | `public` | `Promise`\<`GetConvoResponse`> | `undefined` | - | | `convo.getProjectConvos` | `public` | `Promise`\<`Convo`\[]> | `undefined` | - | | `convo.getScopeConvos` | `public` | `Promise`\<`GetScopeConvosResponse`> | `undefined` | - | | `convo.joinConvo` | `public` | `Promise`\<`JoinConvoResponse`> | `undefined` | - | | `convo.leaveConvo` | `public` | `Promise`\<`LeaveConvoResponse`> | `undefined` | - | | `convo.rejoinConvo` | `public` | `Promise`\<`JoinConvoResponse`> | `undefined` | - | | `convo.startConvo` | `public` | `Promise`\<`StartConvoResponse`> | `undefined` | - | | `convo.updateConvo` | `public` | `Promise`\<`UpdateConvoResponse`> | `undefined` | - | | `credits` | `public` | \{ `getBalance`: `Promise`\<[`GetBalanceResponse`](/docs/reference/sdk/routes/credits#getbalanceresponse)>; `getUsageReport`: `Promise`\<[`UsageReportResponse`](/docs/reference/sdk/routes/credits#usagereportresponse)>; } | `undefined` | - | | `credits.getBalance` | `public` | `Promise`\<[`GetBalanceResponse`](/docs/reference/sdk/routes/credits#getbalanceresponse)> | `undefined` | - | | `credits.getUsageReport` | `public` | `Promise`\<[`UsageReportResponse`](/docs/reference/sdk/routes/credits#usagereportresponse)> | `undefined` | - | | `debug` | `readonly` | `boolean` | `undefined` | - | | `device` | `public` | \{ `deleteDevice`: `Promise`\<`void`>; `getDevice`: `Promise`\<`Device`>; `getUserDevices`: `Promise`\<`Device`\[]>; `registerDevice`: `Promise`\<`Device`>; `updateDevice`: `Promise`\<`Device`>; } | `undefined` | - | | `device.deleteDevice` | `public` | `Promise`\<`void`> | `undefined` | - | | `device.getDevice` | `public` | `Promise`\<`Device`> | `undefined` | - | | `device.getUserDevices` | `public` | `Promise`\<`Device`\[]> | `undefined` | - | | `device.registerDevice` | `public` | `Promise`\<`Device`> | `undefined` | - | | `device.updateDevice` | `public` | `Promise`\<`Device`> | `undefined` | - | | `enableCache` | `readonly` | `boolean` | `undefined` | - | | `fetch` | `readonly` | (`input`, `init?`) => `Promise`\<`Response`> | `undefined` | - | | `folder` | `public` | \{ `getFolder`: `Promise`\<`Folder`>; `getFoldersAssets`: `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/folder#paginatedresponse)\<`Asset`>>; `tagFolder`: `Promise`\<`Folder`>; `untagFolder`: `Promise`\<`Folder`>; `updateFolder`: `Promise`\<`Folder`>; `updateFolderIcon`: `Promise`\<`any`>; } | `undefined` | - | | `folder.getFolder` | `public` | `Promise`\<`Folder`> | `undefined` | - | | `folder.getFoldersAssets` | `public` | `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/folder#paginatedresponse)\<`Asset`>> | `undefined` | - | | `folder.tagFolder` | `public` | `Promise`\<`Folder`> | `undefined` | - | | `folder.untagFolder` | `public` | `Promise`\<`Folder`> | `undefined` | - | | `folder.updateFolder` | `public` | `Promise`\<`Folder`> | `undefined` | - | | `folder.updateFolderIcon` | `public` | `Promise`\<`any`> | `undefined` | - | | `invalidateCacheOnMutation` | `readonly` | `boolean` | `undefined` | - | | `invite` | `public` | \{ `acceptInvite`: `Promise`\<[`AcceptInviteResponse`](/docs/reference/sdk/routes/invite#acceptinviteresponse)>; `cancelInvite`: `Promise`\<`Invite`>; `getInviteById`: `Promise`\<`Invite`>; `getInvites`: `Promise`\<[`PaginatedInvitesResponse`](/docs/reference/sdk/routes/invite#paginatedinvitesresponse)>; `getInvitesForResource`: `Promise`\<`Invite`\[]>; `inviteUser`: `Promise`\<`Invite`>; `resendInvite`: `Promise`\<`Invite`>; } | `undefined` | - | | `invite.acceptInvite` | `public` | `Promise`\<[`AcceptInviteResponse`](/docs/reference/sdk/routes/invite#acceptinviteresponse)> | `undefined` | - | | `invite.cancelInvite` | `public` | `Promise`\<`Invite`> | `undefined` | - | | `invite.getInviteById` | `public` | `Promise`\<`Invite`> | `undefined` | - | | `invite.getInvites` | `public` | `Promise`\<[`PaginatedInvitesResponse`](/docs/reference/sdk/routes/invite#paginatedinvitesresponse)> | `undefined` | - | | `invite.getInvitesForResource` | `public` | `Promise`\<`Invite`\[]> | `undefined` | - | | `invite.inviteUser` | `public` | `Promise`\<`Invite`> | `undefined` | - | | `invite.resendInvite` | `public` | `Promise`\<`Invite`> | `undefined` | - | | `membership` | `public` | \{ `addRole`: `Promise`\<`Membership`>; `deleteMembership`: `Promise`\<`void`>; `getMyMemberships`: `Promise`\<`Membership`\[]>; `getProjectLastSeen`: `Promise`\<[`GetLastSeenResponse`](/docs/reference/sdk/routes/membership#getlastseenresponse)>; `getProjectMemberships`: `Promise`\<`MembershipReport`>; `getProjectMentionableUsers`: `Promise`\<`Mentionable`\[]>; `getWorkspaceLastSeen`: `Promise`\<[`GetLastSeenResponse`](/docs/reference/sdk/routes/membership#getlastseenresponse)>; `getWorkspaceMemberships`: `Promise`\<`MembershipReport`>; `leaveResource`: `Promise`\<`void`>; `removeRole`: `Promise`\<`Membership`>; } | `undefined` | - | | `membership.addRole` | `public` | `Promise`\<`Membership`> | `undefined` | - | | `membership.deleteMembership` | `public` | `Promise`\<`void`> | `undefined` | - | | `membership.getMyMemberships` | `public` | `Promise`\<`Membership`\[]> | `undefined` | - | | `membership.getProjectLastSeen` | `public` | `Promise`\<[`GetLastSeenResponse`](/docs/reference/sdk/routes/membership#getlastseenresponse)> | `undefined` | - | | `membership.getProjectMemberships` | `public` | `Promise`\<`MembershipReport`> | `undefined` | - | | `membership.getProjectMentionableUsers` | `public` | `Promise`\<`Mentionable`\[]> | `undefined` | - | | `membership.getWorkspaceLastSeen` | `public` | `Promise`\<[`GetLastSeenResponse`](/docs/reference/sdk/routes/membership#getlastseenresponse)> | `undefined` | - | | `membership.getWorkspaceMemberships` | `public` | `Promise`\<`MembershipReport`> | `undefined` | - | | `membership.leaveResource` | `public` | `Promise`\<`void`> | `undefined` | - | | `membership.removeRole` | `public` | `Promise`\<`Membership`> | `undefined` | - | | `notification` | `public` | \{ `getNewNotificationCount`: `Promise`\<[`NotificationCountResponse`](/docs/reference/sdk/routes/notification#notificationcountresponse)>; `getNewNotificationCountBulk`: `Promise`\<[`NotificationCountBulkResponse`](/docs/reference/sdk/routes/notification#notificationcountbulkresponse)>; `getNewNotifications`: `Promise`\<[`PaginatedNotificationResponse`](/docs/reference/sdk/routes/notification#paginatednotificationresponse)>; `getNotifications`: `Promise`\<[`PaginatedNotificationResponse`](/docs/reference/sdk/routes/notification#paginatednotificationresponse)>; `getUsersLastNotificationsSeen`: `Promise`\<[`LastSeenResponse`](/docs/reference/sdk/routes/notification#lastseenresponse)>; `updateUsersLastSeen`: `Promise`\<[`LastSeenResponse`](/docs/reference/sdk/routes/notification#lastseenresponse)>; } | `undefined` | - | | `notification.getNewNotificationCount` | `public` | `Promise`\<[`NotificationCountResponse`](/docs/reference/sdk/routes/notification#notificationcountresponse)> | `undefined` | - | | `notification.getNewNotificationCountBulk` | `public` | `Promise`\<[`NotificationCountBulkResponse`](/docs/reference/sdk/routes/notification#notificationcountbulkresponse)> | `undefined` | - | | `notification.getNewNotifications` | `public` | `Promise`\<[`PaginatedNotificationResponse`](/docs/reference/sdk/routes/notification#paginatednotificationresponse)> | `undefined` | - | | `notification.getNotifications` | `public` | `Promise`\<[`PaginatedNotificationResponse`](/docs/reference/sdk/routes/notification#paginatednotificationresponse)> | `undefined` | - | | `notification.getUsersLastNotificationsSeen` | `public` | `Promise`\<[`LastSeenResponse`](/docs/reference/sdk/routes/notification#lastseenresponse)> | `undefined` | - | | `notification.updateUsersLastSeen` | `public` | `Promise`\<[`LastSeenResponse`](/docs/reference/sdk/routes/notification#lastseenresponse)> | `undefined` | - | | `payment` | `public` | \{ `createManualCheckout`: `Promise`\<`any`>; `createStripeCheckout`: `Promise`\<[`StripeCheckoutResponse`](/docs/reference/sdk/routes/payment#stripecheckoutresponse)>; `createStripeCustomer`: `Promise`\<[`StripeCustomerResponse`](/docs/reference/sdk/routes/payment#stripecustomerresponse)>; `getStripePortalUrl`: `Promise`\<[`StripePortalResponse`](/docs/reference/sdk/routes/payment#stripeportalresponse)>; } | `undefined` | - | | `payment.createManualCheckout` | `public` | `Promise`\<`any`> | `undefined` | - | | `payment.createStripeCheckout` | `public` | `Promise`\<[`StripeCheckoutResponse`](/docs/reference/sdk/routes/payment#stripecheckoutresponse)> | `undefined` | - | | `payment.createStripeCustomer` | `public` | `Promise`\<[`StripeCustomerResponse`](/docs/reference/sdk/routes/payment#stripecustomerresponse)> | `undefined` | - | | `payment.getStripePortalUrl` | `public` | `Promise`\<[`StripePortalResponse`](/docs/reference/sdk/routes/payment#stripeportalresponse)> | `undefined` | - | | `product` | `public` | \{ `getSuggestedCurrency`: `Promise`\<\{ `country`: `string` \| `null`; `currency`: [`SupportedCurrency`](/docs/reference/sdk/routes/product#supportedcurrency); `locked?`: `boolean`; `supported`: [`SupportedCurrency`](/docs/reference/sdk/routes/product#supportedcurrency)\[]; }>; `getWorkspaceProducts`: `Promise`\<`Product`\[]>; `listPlans`: `Promise`\<`Product`\[]>; } | `undefined` | - | | `product.getSuggestedCurrency` | `public` | `Promise`\<\{ `country`: `string` \| `null`; `currency`: [`SupportedCurrency`](/docs/reference/sdk/routes/product#supportedcurrency); `locked?`: `boolean`; `supported`: [`SupportedCurrency`](/docs/reference/sdk/routes/product#supportedcurrency)\[]; }> | `undefined` | - | | `product.getWorkspaceProducts` | `public` | `Promise`\<`Product`\[]> | `undefined` | - | | `product.listPlans` | `public` | `Promise`\<`Product`\[]> | `undefined` | - | | `project` | `readonly` | [`ProjectMethods`](#projectmethods) | `undefined` | - | | `public` | `public` | \{ `createPublicAssetChatMessage`: `Promise`\<`CreatePublicAssetChatMessageResponse`>; `createPublicChatMessage`: `Promise`\<`ChatMessage`>; `createPublicTopicChatMessage`: `Promise`\<`CreatePublicAssetChatMessageResponse`>; `downloadAssets`: `Promise`\<`DownloadSignedUrlData`\[]>; `getPublicAsset`: `Promise`\<`PublicAssetResponse`>; `getPublicChat`: `Promise`\<`Chat` \| `null`>; `getPublicChatMessages`: `Promise`\<`PublicChatMessagesResponse`>; `getPublicDownloadUrl`: `Promise`\<[`PublicDownloadUrlResponse`](/docs/reference/sdk/routes/shortlink#publicdownloadurlresponse)>; `getPublicEmbedFiles`: `Promise`\<[`PublicEmbedFilesResponse`](/docs/reference/sdk/routes/shortlink#publicembedfilesresponse)>; `getPublicFileSystem`: `Promise`\<[`PublicFileSystemDetailsResponse`](/docs/reference/sdk/routes/public#publicfilesystemdetailsresponse)>; `getPublicItems`: `Promise`\<[`PublicFileSystemResponse`](/docs/reference/sdk/routes/public#publicfilesystemresponse)>; `getPublicItemsAtPath`: `Promise`\<[`PublicFileSystemResponse`](/docs/reference/sdk/routes/public#publicfilesystemresponse)>; `recordAccessActivity`: `Promise`\<`void`>; `resolvePublicDownload`: `Promise`\<[`ResolvePublicDownloadResponse`](/docs/reference/sdk/routes/shortlink#resolvepublicdownloadresponse)>; } | `undefined` | - | | `public.createPublicAssetChatMessage` | `public` | `Promise`\<`CreatePublicAssetChatMessageResponse`> | `undefined` | - | | `public.createPublicChatMessage` | `public` | `Promise`\<`ChatMessage`> | `undefined` | - | | `public.createPublicTopicChatMessage` | `public` | `Promise`\<`CreatePublicAssetChatMessageResponse`> | `undefined` | - | | `public.downloadAssets` | `public` | `Promise`\<`DownloadSignedUrlData`\[]> | `undefined` | - | | `public.getPublicAsset` | `public` | `Promise`\<`PublicAssetResponse`> | `undefined` | - | | `public.getPublicChat` | `public` | `Promise`\<`Chat` \| `null`> | `undefined` | - | | `public.getPublicChatMessages` | `public` | `Promise`\<`PublicChatMessagesResponse`> | `undefined` | - | | `public.getPublicDownloadUrl` | `public` | `Promise`\<[`PublicDownloadUrlResponse`](/docs/reference/sdk/routes/shortlink#publicdownloadurlresponse)> | `undefined` | - | | `public.getPublicEmbedFiles` | `public` | `Promise`\<[`PublicEmbedFilesResponse`](/docs/reference/sdk/routes/shortlink#publicembedfilesresponse)> | `undefined` | - | | `public.getPublicFileSystem` | `public` | `Promise`\<[`PublicFileSystemDetailsResponse`](/docs/reference/sdk/routes/public#publicfilesystemdetailsresponse)> | `undefined` | - | | `public.getPublicItems` | `public` | `Promise`\<[`PublicFileSystemResponse`](/docs/reference/sdk/routes/public#publicfilesystemresponse)> | `undefined` | - | | `public.getPublicItemsAtPath` | `public` | `Promise`\<[`PublicFileSystemResponse`](/docs/reference/sdk/routes/public#publicfilesystemresponse)> | `undefined` | - | | `public.recordAccessActivity` | `public` | `Promise`\<`void`> | `undefined` | - | | `public.resolvePublicDownload` | `public` | `Promise`\<[`ResolvePublicDownloadResponse`](/docs/reference/sdk/routes/shortlink#resolvepublicdownloadresponse)> | `undefined` | - | | `refreshLockTimeoutMs` | `readonly` | `number` | `undefined` | - | | `refreshTokenStorageKey` | `readonly` | `string` | `undefined` | - | | `scratch` | `public` | \{ `completeUpload`: `Promise`\<[`CompleteUploadResponse`](/docs/reference/sdk/routes/scratch#completeuploadresponse)>; `promote`: `Promise`\<[`PromoteResponse`](/docs/reference/sdk/routes/scratch#promoteresponse)>; } | `undefined` | - | | `scratch.completeUpload` | `public` | `Promise`\<[`CompleteUploadResponse`](/docs/reference/sdk/routes/scratch#completeuploadresponse)> | `undefined` | - | | `scratch.promote` | `public` | `Promise`\<[`PromoteResponse`](/docs/reference/sdk/routes/scratch#promoteresponse)> | `undefined` | - | | `settings` | `public` | \{ `cleanupOrphanedSettings`: `Promise`\<\{ `message`: `string`; `removedCount`: `number`; }>; `getAllResourceSettings`: `Promise`\<\{ `resourceSettings`: [`ResourceSettings`](/docs/reference/sdk/routes/settings#resourcesettings)\[]; }>; `getEffectiveSettings`: `Promise`\<[`EffectiveSettings`](/docs/reference/sdk/routes/settings#effectivesettings)>; `getResourceSettings`: `Promise`\< \| [`ResourceSettings`](/docs/reference/sdk/routes/settings#resourcesettings) \| \{ `message`: `string`; }>; `resetResourceSettings`: `Promise`\<\{ `message`: `string`; }>; `updateResourceSettings`: `Promise`\<\{ `message`: `string`; `settings`: [`ResourceSettings`](/docs/reference/sdk/routes/settings#resourcesettings); }>; } | `undefined` | - | | `settings.cleanupOrphanedSettings` | `public` | `Promise`\<\{ `message`: `string`; `removedCount`: `number`; }> | `undefined` | - | | `settings.getAllResourceSettings` | `public` | `Promise`\<\{ `resourceSettings`: [`ResourceSettings`](/docs/reference/sdk/routes/settings#resourcesettings)\[]; }> | `undefined` | - | | `settings.getEffectiveSettings` | `public` | `Promise`\<[`EffectiveSettings`](/docs/reference/sdk/routes/settings#effectivesettings)> | `undefined` | - | | `settings.getResourceSettings` | `public` | `Promise`\< \| [`ResourceSettings`](/docs/reference/sdk/routes/settings#resourcesettings) \| \{ `message`: `string`; }> | `undefined` | - | | `settings.resetResourceSettings` | `public` | `Promise`\<\{ `message`: `string`; }> | `undefined` | - | | `settings.updateResourceSettings` | `public` | `Promise`\<\{ `message`: `string`; `settings`: [`ResourceSettings`](/docs/reference/sdk/routes/settings#resourcesettings); }> | `undefined` | - | | `shortlink` | `public` | \{ `resolveShortLink`: `Promise`\<[`ResolveShortLinkResponse`](/docs/reference/sdk/routes/shortlink#resolveshortlinkresponse)>; } | `undefined` | - | | `shortlink.resolveShortLink` | `public` | `Promise`\<[`ResolveShortLinkResponse`](/docs/reference/sdk/routes/shortlink#resolveshortlinkresponse)> | `undefined` | - | | `socket` | `public` | \{ `connect`: (`channel`, `options`) => `Promise`\<[`SocketChannel`](/docs/reference/sdk/routes/socket#socketchannel)>; `connectPublic`: (`publicToken`, `options`) => `Promise`\<[`SocketChannel`](/docs/reference/sdk/routes/socket#socketchannel)>; `disconnect`: (`channel`) => `Promise`\<`void`>; `disconnectAll`: () => `Promise`\<`void`>; `emit`: (`channel`, `event`, `data?`) => `void`; `emitWithAck`: (`channel`, `event`, `data`, `timeoutMs`) => `Promise`\<`boolean`>; `isConnected`: (`channel`) => `boolean`; `onReconnect`: (`channel`, `callback`) => `void`; `onReconnectFailed`: (`channel`, `callback`) => `void`; `subscribe`: \<`T`>(`channel`, `event`, `callback`) => `Promise`\<`void`>; `subscribePublic`: \<`T`>(`publicToken`, `event`, `callback`) => `Promise`\<`void`>; `unsubscribe`: (`channel`, `event`, `callback?`) => `void`; } | `undefined` | - | | `socket.connect` | `public` | (`channel`, `options`) => `Promise`\<[`SocketChannel`](/docs/reference/sdk/routes/socket#socketchannel)> | `undefined` | Connect to a socket channel | | `socket.connectPublic` | `public` | (`publicToken`, `options`) => `Promise`\<[`SocketChannel`](/docs/reference/sdk/routes/socket#socketchannel)> | `undefined` | Connect to a public socket channel without authentication | | `socket.disconnect` | `public` | (`channel`) => `Promise`\<`void`> | `undefined` | Disconnect from a socket channel | | `socket.disconnectAll` | `public` | () => `Promise`\<`void`> | `undefined` | Disconnect from all channels | | `socket.emit` | `public` | (`channel`, `event`, `data?`) => `void` | `undefined` | Emit an event to a connected channel | | `socket.emitWithAck` | `public` | (`channel`, `event`, `data`, `timeoutMs`) => `Promise`\<`boolean`> | `undefined` | Emit an event with a timeout-bounded server acknowledgement. Resolves `true` if the server acks within `timeoutMs`, `false` on timeout or transport error. Use it to actively verify a channel's liveness when `socket.connected` may be stale — most notably after a backgrounded tab returns to focus, where the flag can remain `true` for up to socket.io's own heartbeat window (\~25–45s) even after the underlying TCP transport has died. Relies on socket.io v4's `socket.timeout(ms).emit(ev, data, cb)` pattern: the server acknowledges the event via its trailing callback; if no ack arrives within `timeoutMs` the callback receives an Error. | | `socket.isConnected` | `public` | (`channel`) => `boolean` | `undefined` | Check if connected to a channel | | `socket.onReconnect` | `public` | (`channel`, `callback`) => `void` | `undefined` | Register a callback for when the channel reconnects — a socket.io transport-level reconnect, or the token-refresh reconnect. Use it to recover any gap of server->client messages missed while the connection was down; socket.io does not replay those. Dispatched from the 'reconnect' handler in connect() and from the token-refresh path. | | `socket.onReconnectFailed` | `public` | (`channel`, `callback`) => `void` | `undefined` | Register a callback for when Socket.IO exhausts all reconnection attempts | | `socket.subscribe` | `public` | \<`T`>(`channel`, `event`, `callback`) => `Promise`\<`void`> | `undefined` | Subscribe to an event on a channel | | `socket.subscribePublic` | `public` | \<`T`>(`publicToken`, `event`, `callback`) => `Promise`\<`void`> | `undefined` | Subscribe to an event on a public channel Automatically connects to the public channel if not already connected | | `socket.unsubscribe` | `public` | (`channel`, `event`, `callback?`) => `void` | `undefined` | Stop listening for an event on a channel. If `callback` is provided, only that specific listener is removed; otherwise every listener for that event is cleared. | | `storage` | `public` | \{ `getStorageChart`: `Promise`\<[`ChartDataResponse`](/docs/reference/sdk/routes/storage#chartdataresponse)>; `getStorageRecord`: `Promise`\<[`StorageRecord`](/docs/reference/sdk/routes/storage#storagerecord)>; } | `undefined` | - | | `storage.getStorageChart` | `public` | `Promise`\<[`ChartDataResponse`](/docs/reference/sdk/routes/storage#chartdataresponse)> | `undefined` | - | | `storage.getStorageRecord` | `public` | `Promise`\<[`StorageRecord`](/docs/reference/sdk/routes/storage#storagerecord)> | `undefined` | - | | `subscription` | `readonly` | [`SubscriptionMethods`](#subscriptionmethods) | `undefined` | - | | `supportChat` | `public` | \{ `createAttachment`: `Promise`\<`SupportChatCreateAttachmentResponse`>; `getTopic`: `Promise`\<`SupportChatGetTopicResponse`>; } | `undefined` | - | | `supportChat.createAttachment` | `public` | `Promise`\<`SupportChatCreateAttachmentResponse`> | `undefined` | - | | `supportChat.getTopic` | `public` | `Promise`\<`SupportChatGetTopicResponse`> | `undefined` | - | | `supportTicket` | `public` | \{ `createSupportTicket`: `Promise`\<[`SupportTicket`](/docs/reference/sdk/routes/supportTicket#supportticket)>; `getSupportTicket`: `Promise`\<[`SupportTicket`](/docs/reference/sdk/routes/supportTicket#supportticket)>; `getSupportTicketScopeOptions`: `Promise`\<[`SupportTicketScopeOptions`](/docs/reference/sdk/routes/supportTicket#supportticketscopeoptions)>; `listSupportTickets`: `Promise`\<[`SupportTicketListResponse`](/docs/reference/sdk/routes/supportTicket#supportticketlistresponse)>; } | `undefined` | - | | `supportTicket.createSupportTicket` | `public` | `Promise`\<[`SupportTicket`](/docs/reference/sdk/routes/supportTicket#supportticket)> | `undefined` | - | | `supportTicket.getSupportTicket` | `public` | `Promise`\<[`SupportTicket`](/docs/reference/sdk/routes/supportTicket#supportticket)> | `undefined` | - | | `supportTicket.getSupportTicketScopeOptions` | `public` | `Promise`\<[`SupportTicketScopeOptions`](/docs/reference/sdk/routes/supportTicket#supportticketscopeoptions)> | `undefined` | - | | `supportTicket.listSupportTickets` | `public` | `Promise`\<[`SupportTicketListResponse`](/docs/reference/sdk/routes/supportTicket#supportticketlistresponse)> | `undefined` | - | | `tag` | `public` | \{ `createTag`: `Promise`\<`Tag`>; `deleteTag`: `Promise`\<`Tag`>; `getTags`: `Promise`\<[`Tags`](/docs/reference/sdk/routes/tag#tags)>; `updateTag`: `Promise`\<`Tag`>; } | `undefined` | - | | `tag.createTag` | `public` | `Promise`\<`Tag`> | `undefined` | - | | `tag.deleteTag` | `public` | `Promise`\<`Tag`> | `undefined` | - | | `tag.getTags` | `public` | `Promise`\<[`Tags`](/docs/reference/sdk/routes/tag#tags)> | `undefined` | - | | `tag.updateTag` | `public` | `Promise`\<`Tag`> | `undefined` | - | | `task` | `public` | \{ `acknowledgeAllTasks`: `Promise`\<[`AcknowledgeAllTasksResponse`](/docs/reference/sdk/routes/task#acknowledgealltasksresponse)>; `acknowledgeTask`: `Promise`\<`Task`>; `bulkCreate`: `Promise`\<[`BulkCreateTasksResponse`](/docs/reference/sdk/routes/task#bulkcreatetasksresponse)>; `deleteTask`: `Promise`\<`void`>; `followTask`: `Promise`\<`Task`>; `getMyTasks`: `Promise`\<[`GetTasksResponse`](/docs/reference/sdk/routes/task#gettasksresponse)>; `getTaskEvents`: `Promise`\<[`GetTaskEventsResponse`](/docs/reference/sdk/routes/task#gettaskeventsresponse)>; `getTaskLinks`: `Promise`\<`TaskLink`\[]>; `getUnacknowledgedTaskCount`: `Promise`\<[`UnacknowledgedTaskCountResponse`](/docs/reference/sdk/routes/task#unacknowledgedtaskcountresponse)>; `linkTask`: `Promise`\<`TaskLink`>; `tagTask`: `Promise`\<`Task`>; `unfollowTask`: `Promise`\<`Task`>; `unlinkTask`: `Promise`\<`void`>; `untagTask`: `Promise`\<`Task`>; `updateTaskDetails`: `Promise`\<`Task`>; `updateTaskStatus`: `Promise`\<`Task`>; } | `undefined` | - | | `task.acknowledgeAllTasks` | `public` | `Promise`\<[`AcknowledgeAllTasksResponse`](/docs/reference/sdk/routes/task#acknowledgealltasksresponse)> | `undefined` | - | | `task.acknowledgeTask` | `public` | `Promise`\<`Task`> | `undefined` | - | | `task.bulkCreate` | `public` | `Promise`\<[`BulkCreateTasksResponse`](/docs/reference/sdk/routes/task#bulkcreatetasksresponse)> | `undefined` | - | | `task.deleteTask` | `public` | `Promise`\<`void`> | `undefined` | - | | `task.followTask` | `public` | `Promise`\<`Task`> | `undefined` | - | | `task.getMyTasks` | `public` | `Promise`\<[`GetTasksResponse`](/docs/reference/sdk/routes/task#gettasksresponse)> | `undefined` | - | | `task.getTaskEvents` | `public` | `Promise`\<[`GetTaskEventsResponse`](/docs/reference/sdk/routes/task#gettaskeventsresponse)> | `undefined` | - | | `task.getTaskLinks` | `public` | `Promise`\<`TaskLink`\[]> | `undefined` | - | | `task.getUnacknowledgedTaskCount` | `public` | `Promise`\<[`UnacknowledgedTaskCountResponse`](/docs/reference/sdk/routes/task#unacknowledgedtaskcountresponse)> | `undefined` | - | | `task.linkTask` | `public` | `Promise`\<`TaskLink`> | `undefined` | - | | `task.tagTask` | `public` | `Promise`\<`Task`> | `undefined` | - | | `task.unfollowTask` | `public` | `Promise`\<`Task`> | `undefined` | - | | `task.unlinkTask` | `public` | `Promise`\<`void`> | `undefined` | - | | `task.untagTask` | `public` | `Promise`\<`Task`> | `undefined` | - | | `task.updateTaskDetails` | `public` | `Promise`\<`Task`> | `undefined` | - | | `task.updateTaskStatus` | `public` | `Promise`\<`Task`> | `undefined` | - | | `taskRelation` | `public` | \{ `createTaskRelation`: `Promise`\<[`TaskRelation`](/docs/reference/sdk/routes/taskRelation#taskrelation)>; `deleteTaskRelation`: `Promise`\<`void`>; `getRelationsForChat`: `Promise`\<[`PaginatedTaskRelations`](/docs/reference/sdk/routes/taskRelation#paginatedtaskrelations)>; `getRelationsForMessage`: `Promise`\<[`PaginatedTaskRelations`](/docs/reference/sdk/routes/taskRelation#paginatedtaskrelations)>; `getTaskRelations`: `Promise`\<[`PaginatedTaskRelations`](/docs/reference/sdk/routes/taskRelation#paginatedtaskrelations)>; } | `undefined` | - | | `taskRelation.createTaskRelation` | `public` | `Promise`\<[`TaskRelation`](/docs/reference/sdk/routes/taskRelation#taskrelation)> | `undefined` | - | | `taskRelation.deleteTaskRelation` | `public` | `Promise`\<`void`> | `undefined` | - | | `taskRelation.getRelationsForChat` | `public` | `Promise`\<[`PaginatedTaskRelations`](/docs/reference/sdk/routes/taskRelation#paginatedtaskrelations)> | `undefined` | - | | `taskRelation.getRelationsForMessage` | `public` | `Promise`\<[`PaginatedTaskRelations`](/docs/reference/sdk/routes/taskRelation#paginatedtaskrelations)> | `undefined` | - | | `taskRelation.getTaskRelations` | `public` | `Promise`\<[`PaginatedTaskRelations`](/docs/reference/sdk/routes/taskRelation#paginatedtaskrelations)> | `undefined` | - | | `token` | `public` | \{ `createToken`: `Promise`\<[`CreateTokenResponse`](/docs/reference/sdk/routes/token#createtokenresponse)>; `deleteToken`: `Promise`\<`void`>; `listTokens`: `Promise`\<[`TokenSummary`](/docs/reference/sdk/routes/token#tokensummary)\[]>; } | `undefined` | - | | `token.createToken` | `public` | `Promise`\<[`CreateTokenResponse`](/docs/reference/sdk/routes/token#createtokenresponse)> | `undefined` | - | | `token.deleteToken` | `public` | `Promise`\<`void`> | `undefined` | - | | `token.listTokens` | `public` | `Promise`\<[`TokenSummary`](/docs/reference/sdk/routes/token#tokensummary)\[]> | `undefined` | - | | `tokenExpiryBufferSeconds` | `readonly` | `number` | `undefined` | - | | `tokenRefreshMaxWaitMs` | `readonly` | `number` | `undefined` | - | | `tokenRefreshRetryDelayMs` | `readonly` | `number` | `undefined` | - | | `tokenStorageKey` | `readonly` | `string` | `undefined` | - | | `user` | `readonly` | [`UserMethods`](#usermethods) | `undefined` | - | | `version` | `public` | \{ `getCommitHash`: `Promise`\<[`CommitResponse`](/docs/reference/sdk/routes/version#commitresponse)>; `getHealth`: `Promise`\<[`HealthStatus`](/docs/reference/sdk/routes/version#healthstatus)>; } | `undefined` | - | | `version.getCommitHash` | `public` | `Promise`\<[`CommitResponse`](/docs/reference/sdk/routes/version#commitresponse)> | `undefined` | - | | `version.getHealth` | `public` | `Promise`\<[`HealthStatus`](/docs/reference/sdk/routes/version#healthstatus)> | `undefined` | - | | `webhook` | `public` | \{ `createWebhook`: `Promise`\<[`CreateWebhookResponse`](/docs/reference/sdk/routes/webhook#createwebhookresponse)>; `deleteWebhook`: `Promise`\<`void`>; `getWebhook`: `Promise`\<[`WebhookSubscription`](/docs/reference/sdk/routes/webhook#webhooksubscription)>; `listWebhookDeliveries`: `Promise`\<[`ListDeliveriesResponse`](/docs/reference/sdk/routes/webhook#listdeliveriesresponse)>; `listWebhooks`: `Promise`\<[`WebhookSubscription`](/docs/reference/sdk/routes/webhook#webhooksubscription)\[]>; `replayWebhookDelivery`: `Promise`\<\{ `attempt`: [`WebhookAttempt`](/docs/reference/sdk/routes/webhook#webhookattempt); }>; `rotateWebhookSecret`: `Promise`\<[`RotateWebhookSecretResponse`](/docs/reference/sdk/routes/webhook#rotatewebhooksecretresponse)>; `testWebhook`: `Promise`\<[`TestWebhookResponse`](/docs/reference/sdk/routes/webhook#testwebhookresponse)>; `updateWebhook`: `Promise`\<[`WebhookSubscription`](/docs/reference/sdk/routes/webhook#webhooksubscription)>; } | `undefined` | - | | `webhook.createWebhook` | `public` | `Promise`\<[`CreateWebhookResponse`](/docs/reference/sdk/routes/webhook#createwebhookresponse)> | `undefined` | - | | `webhook.deleteWebhook` | `public` | `Promise`\<`void`> | `undefined` | - | | `webhook.getWebhook` | `public` | `Promise`\<[`WebhookSubscription`](/docs/reference/sdk/routes/webhook#webhooksubscription)> | `undefined` | - | | `webhook.listWebhookDeliveries` | `public` | `Promise`\<[`ListDeliveriesResponse`](/docs/reference/sdk/routes/webhook#listdeliveriesresponse)> | `undefined` | - | | `webhook.listWebhooks` | `public` | `Promise`\<[`WebhookSubscription`](/docs/reference/sdk/routes/webhook#webhooksubscription)\[]> | `undefined` | - | | `webhook.replayWebhookDelivery` | `public` | `Promise`\<\{ `attempt`: [`WebhookAttempt`](/docs/reference/sdk/routes/webhook#webhookattempt); }> | `undefined` | - | | `webhook.rotateWebhookSecret` | `public` | `Promise`\<[`RotateWebhookSecretResponse`](/docs/reference/sdk/routes/webhook#rotatewebhooksecretresponse)> | `undefined` | - | | `webhook.testWebhook` | `public` | `Promise`\<[`TestWebhookResponse`](/docs/reference/sdk/routes/webhook#testwebhookresponse)> | `undefined` | - | | `webhook.updateWebhook` | `public` | `Promise`\<[`WebhookSubscription`](/docs/reference/sdk/routes/webhook#webhooksubscription)> | `undefined` | - | | `websocketURL?` | `readonly` | `string` | `undefined` | - | | `workspace` | `readonly` | [`WorkspaceMethods`](#workspacemethods) | `undefined` | - | #### Methods [#methods] ##### \_log() [#_log] ```ts _log(...args): void; ``` Internal helper for conditional logging. Underscore-prefixed to flag "internal contract" — accessible from sibling route modules but not part of the documented public API. ###### Parameters [#parameters-1] | Parameter | Type | Description | | --------- | -------- | --------------------------------- | | ...`args` | `any`\[] | Arguments to pass to console.log. | ###### Returns [#returns-1] `void` ##### clearCache() [#clearcache] ```ts clearCache(): void; ``` Clears the response cache. ###### Returns [#returns-2] `void` ##### getCacheStats() [#getcachestats] ```ts getCacheStats(): { entries: { hasData: boolean; hasPendingPromise: boolean; key: string; timestamp: number; }[]; size: number; }; ``` Gets cache statistics for debugging. ###### Returns [#returns-3] ```ts { entries: { hasData: boolean; hasPendingPromise: boolean; key: string; timestamp: number; }[]; size: number; } ``` Object containing cache statistics. | Name | Type | | --------- | ----------------------------------------------------------------------------------------------------- | | `entries` | \{ `hasData`: `boolean`; `hasPendingPromise`: `boolean`; `key`: `string`; `timestamp`: `number`; }\[] | | `size` | `number` | ##### getTokenExpiry() [#gettokenexpiry] ```ts getTokenExpiry(): { access: string | null; refresh: string | null; }; ``` Gets the token expiration timestamps. ###### Returns [#returns-4] ```ts { access: string | null; refresh: string | null; } ``` Object containing access and refresh token expiry ISO timestamps. | Name | Type | | --------- | ------------------ | | `access` | `string` \| `null` | | `refresh` | `string` \| `null` | ##### getUserId() [#getuserid] ```ts getUserId(): string | null; ``` Gets the current user's ID from the JWT token. ###### Returns [#returns-5] `string` | `null` The user ID if available, null otherwise. ##### getVersion() [#getversion] ```ts getVersion(): SDKVersionInfo; ``` Gets the SDK version information including build timestamp and hash. Useful for debugging and verifying which SDK version is in use. ###### Returns [#returns-6] [`SDKVersionInfo`](#sdkversioninfo) SDK version, build timestamp, build hash, and git commit ##### tokenValid() [#tokenvalid] ```ts tokenValid(): boolean; ``` Checks if the current JWT token exists and is valid. ###### Returns [#returns-7] `boolean` True if the token exists and is valid, false otherwise. ## Interfaces [#interfaces] ### ApiError [#apierror] Error thrown by `_request` when the API responds with a non-2xx status. `status` is the HTTP status and `data` the parsed error body (`{ type, code, message, errorData? }`). Use `isApiError` to narrow. #### Extends [#extends] * `Error` #### Properties [#properties-1] | Property | Type | Inherited from | | ---------------------------- | -------- | --------------- | | `data?` | `any` | - | | `message` | `string` | `Error.message` | | `name` | `string` | `Error.name` | | `stack?` | `string` | `Error.stack` | | `status?` | `number` | - | *** ### AssetMethods [#assetmethods] #### Extends [#extends-1] * `ReturnType`\<*typeof* [`default`](/docs/reference/sdk/routes/asset#default)> #### Methods [#methods-1] ##### cleanupUploadSessions() [#cleanupuploadsessions] ```ts cleanupUploadSessions(projectId, olderThanMs?): void; ``` Clean up old upload sessions for a project ###### Parameters [#parameters-2] | Parameter | Type | Description | | -------------- | -------- | --------------------------------------------------- | | `projectId` | `string` | The project ID | | `olderThanMs?` | `number` | Remove sessions older than this (default: 24 hours) | ###### Returns [#returns-8] `void` ###### Inherited from [#inherited-from] ```ts ReturnType.cleanupUploadSessions ``` ##### completeCustomThumbnailUpload() [#completecustomthumbnailupload] ```ts completeCustomThumbnailUpload(assetId, data): Promise<{ key: string; status: string; }>; ``` Finalize the multipart upload for a custom thumbnail. Committing the upload starts the background processing that generates the thumbnail outputs. ###### Parameters [#parameters-3] | Parameter | Type | | --------------- | ------------------------------------------------------------------------------------------------------- | | `assetId` | `string` | | `data` | \{ `key`: `string`; `parts`: \{ `ETag`: `string`; `PartNumber`: `number`; }\[]; `uploadId`: `string`; } | | `data.key` | `string` | | `data.parts` | \{ `ETag`: `string`; `PartNumber`: `number`; }\[] | | `data.uploadId` | `string` | ###### Returns [#returns-9] `Promise`\<\{ `key`: `string`; `status`: `string`; }> ###### Inherited from [#inherited-from-1] ```ts ReturnType.completeCustomThumbnailUpload ``` ##### completeUpload() [#completeupload] ```ts completeUpload(uploadData): Promise; ``` Complete a multipart upload initiated by `createAssets`. Takes the same `{ uploadId, parts }` shape as `nuramaClient.scratch.completeUpload`, plus the `key` and `assetId`. ###### Parameters [#parameters-4] | Parameter | Type | Description | | ------------ | --------------------------------------------------------------------------------------------- | ------------------------------------------------- | | `uploadData` | [`CompleteMultipartUploadData`](/docs/reference/sdk/routes/asset#completemultipartuploaddata) | Data including key, uploadId, parts, and assetId. | ###### Returns [#returns-10] `Promise`\<`any`> Upload completion response from the server. ###### Inherited from [#inherited-from-2] ```ts ReturnType.completeUpload ``` ##### completeUploadSession() [#completeuploadsession] ```ts completeUploadSession(projectId, sessionId): void; ``` Mark an upload session as completed ###### Parameters [#parameters-5] | Parameter | Type | Description | | ----------- | -------- | -------------- | | `projectId` | `string` | The project ID | | `sessionId` | `string` | The session ID | ###### Returns [#returns-11] `void` ###### Inherited from [#inherited-from-3] ```ts ReturnType.completeUploadSession ``` ##### createPublicLink() [#createpubliclink] ```ts createPublicLink(assetId, data): Promise; ``` Create a public download link for an asset. ###### Parameters [#parameters-6] | Parameter | Type | Description | | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------ | | `assetId` | `string` | The asset ID. | | `data` | \{ `mode?`: [`PublicAssetLinkMode`](/docs/reference/sdk/routes/asset#publicassetlinkmode-1); `projectId`: `string`; `validity?`: `number`; } | Link creation data. | | `data.mode?` | [`PublicAssetLinkMode`](/docs/reference/sdk/routes/asset#publicassetlinkmode-1) | - | | `data.projectId` | `string` | The project ID. | | `data.validity?` | `number` | Link validity in milliseconds. | ###### Returns [#returns-12] `Promise`\<[`PublicAssetLink`](/docs/reference/sdk/routes/asset#publicassetlink)> The created public link. ###### Inherited from [#inherited-from-4] ```ts ReturnType.createPublicLink ``` ##### createShortLink() [#createshortlink] ```ts createShortLink(assetId, data?): Promise; ``` Creates a short link for an asset. If a short link already exists for the asset with the same visibility, returns the existing one. ###### Parameters [#parameters-7] | Parameter | Type | Description | | --------- | --------------------------------------------------------------------------------------- | ----------------------------------------------- | | `assetId` | `string` | The ID of the asset to create a short link for. | | `data?` | [`CreateAssetShortLinkData`](/docs/reference/sdk/routes/asset#createassetshortlinkdata) | Optional data including visibility context. | ###### Returns [#returns-13] `Promise`\<[`CreateAssetShortLinkResponse`](/docs/reference/sdk/routes/asset#createassetshortlinkresponse)> The short link object and short URL. ###### Inherited from [#inherited-from-5] ```ts ReturnType.createShortLink ``` ##### deleteAsset() [#deleteasset] ```ts deleteAsset(assetId): Promise; ``` Deletes an asset (marks for deletion). ###### Parameters [#parameters-8] | Parameter | Type | Description | | --------- | -------- | ------------------------------ | | `assetId` | `string` | The ID of the asset to delete. | ###### Returns [#returns-14] `Promise`\<[`AssetWithChats`](/docs/reference/sdk/routes/asset#assetwithchats)> ###### Inherited from [#inherited-from-6] ```ts ReturnType.deleteAsset ``` ##### disablePublicLink() [#disablepubliclink] ```ts disablePublicLink(assetId, linkId): Promise; ``` Disable a public download link. ###### Parameters [#parameters-9] | Parameter | Type | Description | | --------- | -------- | ------------- | | `assetId` | `string` | The asset ID. | | `linkId` | `string` | The link ID. | ###### Returns [#returns-15] `Promise`\<[`PublicAssetLink`](/docs/reference/sdk/routes/asset#publicassetlink)> The disabled public link. ###### Inherited from [#inherited-from-7] ```ts ReturnType.disablePublicLink ``` ##### downloadAssets() [#downloadassets] ```ts downloadAssets(assetIds): Promise; ``` Generates signed download URLs for the original files of specified assets. ###### Parameters [#parameters-10] | Parameter | Type | Description | | ---------- | ----------- | ---------------------- | | `assetIds` | `string`\[] | An array of asset IDs. | ###### Returns [#returns-16] `Promise`\<[`DownloadAssetsResponse`](/docs/reference/sdk/routes/asset#downloadassetsresponse)> Array of download URL results. ###### Inherited from [#inherited-from-8] ```ts ReturnType.downloadAssets ``` ##### getAsset() [#getasset] ```ts getAsset(assetId, params?): Promise; ``` Retrieves a specific asset by its ID with optional chat data. ###### Parameters [#parameters-11] | Parameter | Type | Description | | --------- | ------------------------------------------------------------------- | -------------------------------------------- | | `assetId` | `string` | The ID of the asset. | | `params?` | [`GetAssetParams`](/docs/reference/sdk/routes/asset#getassetparams) | Optional parameters for chat data inclusion. | ###### Returns [#returns-17] `Promise`\<[`AssetWithChats`](/docs/reference/sdk/routes/asset#assetwithchats)> The asset object with optional chat data. ###### Inherited from [#inherited-from-9] ```ts ReturnType.getAsset ``` ##### getAssetAccessActivity() [#getassetaccessactivity] ```ts getAssetAccessActivity(assetId, params?): Promise<{ breakdown: { count: number; label: string; value: string; }[]; eventType: string | null; from: string; groupBy: string; range: string; series: { count: number; date: string; eventType: string; }[]; to: string; totals: { count: number; eventType: string; }[]; }>; ``` Get aggregated access-activity for a single asset. Returns totals per eventType, a breakdown for the requested dimension, and a zero-filled daily series. ###### Parameters [#parameters-12] | Parameter | Type | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `assetId` | `string` | | `params?` | \{ `eventType?`: `"play_started"` \| `"play_completed"` \| `"download"` \| `"embed_resolved"`; `groupBy?`: `"visibility"` \| `"referrerHost"` \| `"country"` \| `"userAgentClass"` \| `"day"`; `limit?`: `number`; `range?`: `"7d"` \| `"30d"` \| `"90d"`; } | | `params.eventType?` | `"play_started"` \| `"play_completed"` \| `"download"` \| `"embed_resolved"` | | `params.groupBy?` | `"visibility"` \| `"referrerHost"` \| `"country"` \| `"userAgentClass"` \| `"day"` | | `params.limit?` | `number` | | `params.range?` | `"7d"` \| `"30d"` \| `"90d"` | ###### Returns [#returns-18] `Promise`\<\{ `breakdown`: \{ `count`: `number`; `label`: `string`; `value`: `string`; }\[]; `eventType`: `string` | `null`; `from`: `string`; `groupBy`: `string`; `range`: `string`; `series`: \{ `count`: `number`; `date`: `string`; `eventType`: `string`; }\[]; `to`: `string`; `totals`: \{ `count`: `number`; `eventType`: `string`; }\[]; }> ###### Inherited from [#inherited-from-10] ```ts ReturnType.getAssetAccessActivity ``` ##### getAssetPage() [#getassetpage] ```ts getAssetPage(assetId, params?): Promise; ``` Gets the page number an asset appears on based on specified filters and sorting. ###### Parameters [#parameters-13] | Parameter | Type | Description | | --------- | --------------------------------------------------------------------------- | -------------------------------------------------------------- | | `assetId` | `string` | The ID of the asset to find the page for. | | `params?` | [`GetAssetPageParams`](/docs/reference/sdk/routes/asset#getassetpageparams) | Query parameters for sorting, filtering, and pagination limit. | ###### Returns [#returns-19] `Promise`\<[`AssetPageResponse`](/docs/reference/sdk/routes/asset#assetpageresponse)> Object containing the page number. ###### Inherited from [#inherited-from-11] ```ts ReturnType.getAssetPage ``` ##### getAssetReferences() [#getassetreferences] ```ts getAssetReferences(assetId): Promise; ``` Lists every location an asset is referenced — its primary file system and each secondary reference (reviewer, submission, public), grouped and counted. Renaming an asset retitles it at every one of these locations, and deleting its last primary reference removes them all — so this is what the rename and delete confirmations show the user before either happens. ###### Parameters [#parameters-14] | Parameter | Type | Description | | --------- | -------- | -------------------- | | `assetId` | `string` | The ID of the asset. | ###### Returns [#returns-20] `Promise`\<`AssetReferences`> The asset's references. ###### Inherited from [#inherited-from-12] ```ts ReturnType.getAssetReferences ``` ##### getCustomThumbnailUploadUrl() [#getcustomthumbnailuploadurl] ```ts getCustomThumbnailUploadUrl(assetId, data): Promise<{ assetId: string; expires: number; fileName: string; key: string; mimeType: string; status: string; uploadId: string; urls: string[]; }>; ``` Mint signed multipart upload URLs for a user-supplied custom thumbnail image. Once the upload is completed, background processing generates the custom-thumbnail outputs and attaches them to the asset; the `assetFileUpdate` websocket event fires when they are ready. Caller flow: 1. multipartUpload(file, response.urls, response.key, response.uploadId) 2. completeCustomThumbnailUpload(\{ assetId, key, uploadId, parts }) 3. wait for the assetFileUpdate websocket event ###### Parameters [#parameters-15] | Parameter | Type | | --------------- | ---------------------------------------------------------------------- | | `assetId` | `string` | | `data` | \{ `fileName`: `string`; `mimeType`: `string`; `sizeInMB`: `number`; } | | `data.fileName` | `string` | | `data.mimeType` | `string` | | `data.sizeInMB` | `number` | ###### Returns [#returns-21] `Promise`\<\{ `assetId`: `string`; `expires`: `number`; `fileName`: `string`; `key`: `string`; `mimeType`: `string`; `status`: `string`; `uploadId`: `string`; `urls`: `string`\[]; }> ###### Inherited from [#inherited-from-13] ```ts ReturnType.getCustomThumbnailUploadUrl ``` ##### getDocumentViewUrl() [#getdocumentviewurl] ```ts getDocumentViewUrl(assetId): Promise; ``` Mints a short-lived signed URL for rendering a document inline. A document's `media` PDF is kept in private storage, so unlike images and video it cannot be addressed by keyPath through the public file URL. Fetch this each time a document is opened; do not cache it past `expires`. ###### Parameters [#parameters-16] | Parameter | Type | Description | | --------- | -------- | ------------------------ | | `assetId` | `string` | The document asset's ID. | ###### Returns [#returns-22] `Promise`\<[`DocumentViewUrlResponse`](/docs/reference/sdk/routes/asset#documentviewurlresponse)> Signed URL, expiry and page count. ###### Inherited from [#inherited-from-14] ```ts ReturnType.getDocumentViewUrl ``` ##### getFile() [#getfile] ```ts getFile(assetId, fileId): Promise; ``` Retrieves a specific file from an asset. ###### Parameters [#parameters-17] | Parameter | Type | Description | | --------- | -------- | -------------------- | | `assetId` | `string` | The ID of the asset. | | `fileId` | `string` | The ID of the file. | ###### Returns [#returns-23] `Promise`\<`File`> The file object. ###### Inherited from [#inherited-from-15] ```ts ReturnType.getFile ``` ##### getFilesByFunctionType() [#getfilesbyfunctiontype] ```ts getFilesByFunctionType(assetId, functionType): Promise; ``` Retrieves files of a specific function type from an asset. ###### Parameters [#parameters-18] | Parameter | Type | Description | | -------------- | -------- | --------------------------------------------------------------- | | `assetId` | `string` | The ID of the asset. | | `functionType` | `string` | The function type of the files (e.g., 'thumbnail', 'original'). | ###### Returns [#returns-24] `Promise`\<`File`\[]> An array of file objects. ###### Inherited from [#inherited-from-16] ```ts ReturnType.getFilesByFunctionType ``` ##### getPublicLinks() [#getpubliclinks] ```ts getPublicLinks(assetId, options?): Promise<{ results: PublicAssetLink[]; }>; ``` Get all public download links for an asset. ###### Parameters [#parameters-19] | Parameter | Type | Description | | ---------------------- | ------------------------------- | ------------- | | `assetId` | `string` | The asset ID. | | `options?` | \{ `bypassCache?`: `boolean`; } | - | | `options.bypassCache?` | `boolean` | - | ###### Returns [#returns-25] `Promise`\<\{ `results`: [`PublicAssetLink`](/docs/reference/sdk/routes/asset#publicassetlink)\[]; }> The public links. ###### Inherited from [#inherited-from-17] ```ts ReturnType.getPublicLinks ``` ##### getUploadSession() [#getuploadsession] ```ts getUploadSession(projectId, sessionId): UploadSessionData | null; ``` Get a specific upload session ###### Parameters [#parameters-20] | Parameter | Type | Description | | ----------- | -------- | -------------- | | `projectId` | `string` | The project ID | | `sessionId` | `string` | The session ID | ###### Returns [#returns-26] `UploadSessionData` | `null` Upload session data or null if not found ###### Inherited from [#inherited-from-18] ```ts ReturnType.getUploadSession ``` ##### getUploadSessions() [#getuploadsessions] ```ts getUploadSessions(projectId): UploadSessionData[]; ``` Get all active upload sessions for a project ###### Parameters [#parameters-21] | Parameter | Type | Description | | ----------- | -------- | ---------------------------------- | | `projectId` | `string` | The project ID to get sessions for | ###### Returns [#returns-27] `UploadSessionData`\[] Array of upload session data ###### Inherited from [#inherited-from-19] ```ts ReturnType.getUploadSessions ``` ##### hasActiveUploads() [#hasactiveuploads] ```ts hasActiveUploads(staleMs?): boolean; ``` True when any upload is genuinely in flight anywhere in the app (across all projects and tabs). Intended for app-level guards — e.g. suppressing an automatic version-update page refresh while bytes are still uploading. Stale (crashed-tab) sessions are ignored via the freshness window. ###### Parameters [#parameters-22] | Parameter | Type | Description | | ---------- | -------- | ------------------------------------------------------------------------------------ | | `staleMs?` | `number` | Max age of the last progress update that still counts as active (default: 2 minutes) | ###### Returns [#returns-28] `boolean` ###### Inherited from [#inherited-from-20] ```ts ReturnType.hasActiveUploads ``` ##### multipartUpload() [#multipartupload] ```ts multipartUpload( file, signedUrls, key, uploadId, options? ): Promise; ``` Uploads a file using multipart upload with the provided signed URLs ###### Parameters [#parameters-23] | Parameter | Type | Description | | ------------ | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | | `file` | `string` \| `File` \| `Blob` \| `Buffer`\<`ArrayBufferLike`> | The file to upload (File/Blob in browser, Buffer/string path in Node.js) | | `signedUrls` | `string`\[] | Array of signed URLs for each part | | `key` | `string` | The storage key returned alongside the signed URLs | | `uploadId` | `string` | The multipart upload id returned alongside the signed URLs | | `options` | [`MultipartUploadOptions`](/docs/reference/sdk/routes/asset#multipartuploadoptions) | Upload options | ###### Returns [#returns-29] `Promise`\<[`MultipartUploadResult`](/docs/reference/sdk/routes/asset#multipartuploadresult)> The completed upload data ###### Inherited from [#inherited-from-21] ```ts ReturnType.multipartUpload ``` ##### offUploadSessionMessage() [#offuploadsessionmessage] ```ts offUploadSessionMessage(listenerId): void; ``` Unregister a cross-tab upload session message listener ###### Parameters [#parameters-24] | Parameter | Type | Description | | ------------ | -------- | ------------------ | | `listenerId` | `string` | Unique listener ID | ###### Returns [#returns-30] `void` ###### Inherited from [#inherited-from-22] ```ts ReturnType.offUploadSessionMessage ``` ##### onUploadSessionMessage() [#onuploadsessionmessage] ```ts onUploadSessionMessage(listenerId, callback): void; ``` Register a listener for cross-tab upload session messages ###### Parameters [#parameters-25] | Parameter | Type | Description | | ------------ | --------------------- | ------------------------------------ | | `listenerId` | `string` | Unique listener ID | | `callback` | (`message`) => `void` | Callback function to handle messages | ###### Returns [#returns-31] `void` ###### Inherited from [#inherited-from-23] ```ts ReturnType.onUploadSessionMessage ``` ##### promoteAttachmentToProject() [#promoteattachmenttoproject] ```ts promoteAttachmentToProject(assetId, payload): Promise<{ asset: Asset; deduped: boolean; }>; ``` Promote a chat-message attachment into a project as a fresh, independent project asset. The source attachment is left untouched; the new project asset has its own lifecycle, post-processing pipeline, and storage footprint. Idempotent: a second promote of the same source into the same project returns the existing promoted asset with `deduped: true`. Requires `canCreateAsset` on the destination project — reviewers are blocked. The server additionally rejects when the source attachment's workspace doesn't match the destination project's. ###### Parameters [#parameters-26] | Parameter | Type | | ------------------- | -------------------------------------------------- | | `assetId` | `string` | | `payload` | \{ `fileName?`: `string`; `projectId`: `string`; } | | `payload.fileName?` | `string` | | `payload.projectId` | `string` | ###### Returns [#returns-32] `Promise`\<\{ `asset`: `Asset`; `deduped`: `boolean`; }> ###### Inherited from [#inherited-from-24] ```ts ReturnType.promoteAttachmentToProject ``` ##### reactivatePublicLink() [#reactivatepubliclink] ```ts reactivatePublicLink( assetId, linkId, data? ): Promise; ``` Reactivate a disabled/expired public download link. ###### Parameters [#parameters-27] | Parameter | Type | Description | | ---------------- | --------------------------- | ----------------------------- | | `assetId` | `string` | The asset ID. | | `linkId` | `string` | The link ID. | | `data?` | \{ `validity?`: `number`; } | Reactivation data. | | `data.validity?` | `number` | New validity in milliseconds. | ###### Returns [#returns-33] `Promise`\<[`PublicAssetLink`](/docs/reference/sdk/routes/asset#publicassetlink)> The reactivated public link. ###### Inherited from [#inherited-from-25] ```ts ReturnType.reactivatePublicLink ``` ##### recordAccessActivity() [#recordaccessactivity] ```ts recordAccessActivity(assetId, body): Promise; ``` Record an authenticated play event from the in-app player. Fire-and-forget; server returns 204. Throw-on-failure is fine because the caller already de-dupes per session. ###### Parameters [#parameters-28] | Parameter | Type | | ----------------- | ---------------------------------------------------------------------------------------------------- | | `assetId` | `string` | | `body` | \{ `eventType`: `"play_started"` \| `"play_completed"`; `visibility`: `"creator"` \| `"reviewer"`; } | | `body.eventType` | `"play_started"` \| `"play_completed"` | | `body.visibility` | `"creator"` \| `"reviewer"` | ###### Returns [#returns-34] `Promise`\<`void`> ###### Inherited from [#inherited-from-26] ```ts ReturnType.recordAccessActivity ``` ##### removeCustomThumbnail() [#removecustomthumbnail] ```ts removeCustomThumbnail(assetId): Promise; ``` Remove the custom thumbnail from an asset. Soft-deletes all custom thumb files; the asset falls back to the auto-generated thumbnail. ###### Parameters [#parameters-29] | Parameter | Type | | --------- | -------- | | `assetId` | `string` | ###### Returns [#returns-35] `Promise`\<`Asset`> ###### Inherited from [#inherited-from-27] ```ts ReturnType.removeCustomThumbnail ``` ##### removeUploadSession() [#removeuploadsession] ```ts removeUploadSession(projectId, sessionId): void; ``` Remove an upload session ###### Parameters [#parameters-30] | Parameter | Type | Description | | ----------- | -------- | -------------- | | `projectId` | `string` | The project ID | | `sessionId` | `string` | The session ID | ###### Returns [#returns-36] `void` ###### Inherited from [#inherited-from-28] ```ts ReturnType.removeUploadSession ``` ##### repairAssets() [#repairassets] ```ts repairAssets(assetIds): Promise; ``` Attempts to repair assets (e.g., regenerate signed URLs for pending uploads). ###### Parameters [#parameters-31] | Parameter | Type | Description | | ---------- | ----------- | -------------------------------- | | `assetIds` | `string`\[] | An array of asset IDs to repair. | ###### Returns [#returns-37] `Promise`\<[`RepairAssetsResponse`](/docs/reference/sdk/routes/asset#repairassetsresponse)> Array of repair results. ###### Inherited from [#inherited-from-29] ```ts ReturnType.repairAssets ``` ##### tagAsset() [#tagasset] ```ts tagAsset(assetId, tagData): Promise; ``` Tags an asset with a specific tag. ###### Parameters [#parameters-32] | Parameter | Type | Description | | --------- | --------------------------------------------------------------- | --------------------------- | | `assetId` | `string` | The ID of the asset to tag. | | `tagData` | [`TagAssetData`](/docs/reference/sdk/routes/asset#tagassetdata) | Data containing the tag ID. | ###### Returns [#returns-38] `Promise`\<[`AssetWithChats`](/docs/reference/sdk/routes/asset#assetwithchats)> The updated asset object. ###### Inherited from [#inherited-from-30] ```ts ReturnType.tagAsset ``` ##### untagAsset() [#untagasset] ```ts untagAsset(assetId, untagData): Promise; ``` Untags an asset by removing a specific tag. ###### Parameters [#parameters-33] | Parameter | Type | Description | | ----------- | ------------------------------------------------------------------- | ------------------------------------- | | `assetId` | `string` | The ID of the asset to untag. | | `untagData` | [`UntagAssetData`](/docs/reference/sdk/routes/asset#untagassetdata) | Data containing the tag ID to remove. | ###### Returns [#returns-39] `Promise`\<[`AssetWithChats`](/docs/reference/sdk/routes/asset#assetwithchats)> The updated asset object. ###### Inherited from [#inherited-from-31] ```ts ReturnType.untagAsset ``` ##### updateAsset() [#updateasset] ```ts updateAsset(assetId, updateData): Promise; ``` Updates an asset. ###### Parameters [#parameters-34] | Parameter | Type | Description | | ------------ | --------------------------------------------------------------------- | -------------------------------------------------- | | `assetId` | `string` | The ID of the asset to update. | | `updateData` | [`UpdateAssetData`](/docs/reference/sdk/routes/asset#updateassetdata) | Data to update (e.g., name, meta, tags, folderId). | ###### Returns [#returns-40] `Promise`\<[`AssetWithChats`](/docs/reference/sdk/routes/asset#assetwithchats)> The updated asset object. ###### Inherited from [#inherited-from-32] ```ts ReturnType.updateAsset ``` ##### updatePublicLink() [#updatepubliclink] ```ts updatePublicLink( assetId, linkId, data ): Promise; ``` Update a public download link (extend expiration or change status). ###### Parameters [#parameters-35] | Parameter | Type | Description | | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ------------- | | `assetId` | `string` | The asset ID. | | `linkId` | `string` | The link ID. | | `data` | \{ `mode?`: [`PublicAssetLinkMode`](/docs/reference/sdk/routes/asset#publicassetlinkmode-1); `status?`: `string`; `validity?`: `number`; } | Update data. | | `data.mode?` | [`PublicAssetLinkMode`](/docs/reference/sdk/routes/asset#publicassetlinkmode-1) | - | | `data.status?` | `string` | - | | `data.validity?` | `number` | - | ###### Returns [#returns-41] `Promise`\<[`PublicAssetLink`](/docs/reference/sdk/routes/asset#publicassetlink)> The updated public link. ###### Inherited from [#inherited-from-33] ```ts ReturnType.updatePublicLink ``` *** ### AuthMethods [#authmethods] #### Extends [#extends-2] * `ReturnType`\<*typeof* [`default`](/docs/reference/sdk/routes/auth#default)> #### Methods [#methods-2] ##### changePassword() [#changepassword] ```ts changePassword( currentPassword, newPassword, mfaToken? ): Promise; ``` Changes the authenticated user's password. Requires current password verification and MFA token if MFA is enabled. All refresh tokens will be invalidated after password change. ###### Parameters [#parameters-36] | Parameter | Type | Description | | ----------------- | -------- | --------------------------------------- | | `currentPassword` | `string` | The current password for verification. | | `newPassword` | `string` | The new password. | | `mfaToken?` | `string` | MFA token (required if MFA is enabled). | ###### Returns [#returns-42] `Promise`\<`void`> Promise resolving when complete. ###### Inherited from [#inherited-from-34] ```ts ReturnType.changePassword ``` ##### disableMfa() [#disablemfa] ```ts disableMfa(mfaToken): Promise; ``` Disables multi-factor authentication for the authenticated user. Requires a current valid MFA token for confirmation. ###### Parameters [#parameters-37] | Parameter | Type | Description | | ---------- | -------- | --------------------------- | | `mfaToken` | `string` | The current MFA token code. | ###### Returns [#returns-43] `Promise`\<`void`> Promise resolving when complete. ###### Inherited from [#inherited-from-35] ```ts ReturnType.disableMfa ``` ##### enableMfa() [#enablemfa] ```ts enableMfa(): Promise; ``` Enables multi-factor authentication for the authenticated user. ###### Returns [#returns-44] `Promise`\<`MFAEnableResponse`> Promise resolving to MFA setup details (secret, OTP URL, backup codes). ###### Inherited from [#inherited-from-36] ```ts ReturnType.enableMfa ``` ##### exchangeOAuthCode() [#exchangeoauthcode] ```ts exchangeOAuthCode(code): Promise; ``` ###### Parameters [#parameters-38] | Parameter | Type | | --------- | -------- | | `code` | `string` | ###### Returns [#returns-45] `Promise`\<`OAuthExchangeResponse`> ###### Inherited from [#inherited-from-37] ```ts ReturnType.exchangeOAuthCode ``` ##### forgotPassword() [#forgotpassword] ```ts forgotPassword(email): Promise; ``` Forgets a user's password. ###### Parameters [#parameters-39] | Parameter | Type | Description | | --------- | -------- | ------------------------- | | `email` | `string` | The user's email address. | ###### Returns [#returns-46] `Promise`\<`void`> ###### Inherited from [#inherited-from-38] ```ts ReturnType.forgotPassword ``` ##### getLinkedOAuthProviders() [#getlinkedoauthproviders] ```ts getLinkedOAuthProviders(): Promise; ``` Gets all OAuth providers linked to the authenticated user's account. ###### Returns [#returns-47] `Promise`\<`LinkedAuthProvider`\[]> Promise resolving to array of linked OAuth providers. ###### Inherited from [#inherited-from-39] ```ts ReturnType.getLinkedOAuthProviders ``` ##### linkOAuthProvider() [#linkoauthprovider] ```ts linkOAuthProvider(provider): Promise; ``` Links an OAuth provider to the authenticated user's account. This allows users to sign in with multiple OAuth providers. ###### Parameters [#parameters-40] | Parameter | Type | Description | | ---------- | --------------- | ------------------------------------------------------------- | | `provider` | `OAuthProvider` | The OAuth provider to link (google, apple, microsoft, adobe). | ###### Returns [#returns-48] `Promise`\<[`LoginRegisterResponse`](/docs/reference/sdk/routes/auth#loginregisterresponse)> Promise resolving to user data with updated linked providers. ###### Inherited from [#inherited-from-40] ```ts ReturnType.linkOAuthProvider ``` ##### lockAccount() [#lockaccount] ```ts lockAccount(token): Promise; ``` Locks a user account using a lock account token. This is used when a user receives a password changed notification for a change they did not initiate, allowing them to immediately secure their account. ###### Parameters [#parameters-41] | Parameter | Type | Description | | --------- | -------- | ------------------------------------------------------- | | `token` | `string` | The lock account token from the password changed email. | ###### Returns [#returns-49] `Promise`\<`void`> Promise resolving when the account is locked. ###### Inherited from [#inherited-from-41] ```ts ReturnType.lockAccount ``` ##### login() [#login] ```ts login(credentials): Promise; ``` Logs in a user. ###### Parameters [#parameters-42] | Parameter | Type | Description | | ------------- | ---------------------------------------------------------------------- | ------------------ | | `credentials` | [`LoginCredentials`](/docs/reference/sdk/routes/auth#logincredentials) | Login credentials. | ###### Returns [#returns-50] `Promise`\<[`LoginRegisterResponse`](/docs/reference/sdk/routes/auth#loginregisterresponse)> Object containing user info and tokens (or MFA challenge token). ###### Inherited from [#inherited-from-42] ```ts ReturnType.login ``` ##### logout() [#logout] ```ts logout(refreshToken): Promise; ``` Logs out a user. ###### Parameters [#parameters-43] | Parameter | Type | Description | | -------------- | -------- | -------------------------------- | | `refreshToken` | `string` | The refresh token to invalidate. | ###### Returns [#returns-51] `Promise`\<`void`> ###### Inherited from [#inherited-from-43] ```ts ReturnType.logout ``` ##### refreshTokens() [#refreshtokens] ```ts refreshTokens(refreshToken?): Promise; ``` Refreshes user tokens. ###### Parameters [#parameters-44] | Parameter | Type | Description | | --------------- | -------- | ------------------ | | `refreshToken?` | `string` | The refresh token. | ###### Returns [#returns-52] `Promise`\<[`RefreshResponse`](/docs/reference/sdk/routes/auth#refreshresponse)> Object containing new access and refresh tokens. ###### Inherited from [#inherited-from-44] ```ts ReturnType.refreshTokens ``` ##### register() [#register] ```ts register(userData): Promise; ``` Registers a new user. ###### Parameters [#parameters-45] | Parameter | Type | Description | | ---------- | ---------------------------------------------------------------------- | ----------------------- | | `userData` | [`RegisterUserData`](/docs/reference/sdk/routes/auth#registeruserdata) | User registration data. | ###### Returns [#returns-53] `Promise`\<[`LoginRegisterResponse`](/docs/reference/sdk/routes/auth#loginregisterresponse)> Object containing user info and tokens. ###### Inherited from [#inherited-from-45] ```ts ReturnType.register ``` ##### registerGuest() [#registerguest] ```ts registerGuest(data): Promise; ``` Registers a guest account for public chat participation. Always returns void (204) regardless of outcome for anti-enumeration. ###### Parameters [#parameters-46] | Parameter | Type | Description | | ------------------ | --------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | | `data` | \{ `color?`: `string`; `displayName`: `string`; `email`: `string`; `publicToken`: `string`; } | Guest registration data (email, displayName, optional approved color, publicToken). | | `data.color?` | `string` | - | | `data.displayName` | `string` | - | | `data.email` | `string` | - | | `data.publicToken` | `string` | - | ###### Returns [#returns-54] `Promise`\<`void`> ###### Inherited from [#inherited-from-46] ```ts ReturnType.registerGuest ``` ##### resendVerification() [#resendverification] ```ts resendVerification(email): Promise; ``` Public, unauthenticated resend of the verification email keyed by address. For users past the verification grace window who can't log in or call the authed sendVerificationEmail. Always resolves (the server returns 204 regardless of whether the email exists). ###### Parameters [#parameters-47] | Parameter | Type | Description | | --------- | -------- | ----------------------------------------------------- | | `email` | `string` | The email address to resend the verification link to. | ###### Returns [#returns-55] `Promise`\<`void`> ###### Inherited from [#inherited-from-47] ```ts ReturnType.resendVerification ``` ##### resetPassword() [#resetpassword] ```ts resetPassword(params): Promise; ``` Resets a user's password. ###### Parameters [#parameters-48] | Parameter | Type | Description | | --------- | ------------------------------------------------------------------------ | ----------------- | | `params` | [`ResetPasswordData`](/docs/reference/sdk/routes/auth#resetpassworddata) | Input parameters. | ###### Returns [#returns-56] `Promise`\<`void`> Promise resolving when complete. ###### Inherited from [#inherited-from-48] ```ts ReturnType.resetPassword ``` ##### sendVerificationEmail() [#sendverificationemail] ```ts sendVerificationEmail(): Promise; ``` Sends a verification email to the authenticated user. ###### Returns [#returns-57] `Promise`\<`void`> Promise resolving when complete. ###### Inherited from [#inherited-from-49] ```ts ReturnType.sendVerificationEmail ``` ##### setPassword() [#setpassword] ```ts setPassword(password, mfaToken?): Promise; ``` Sets a password for an OAuth-only user account. This allows OAuth users to add local authentication as a backup. ###### Parameters [#parameters-49] | Parameter | Type | Description | | ----------- | -------- | --------------------------------------- | | `password` | `string` | The password to set. | | `mfaToken?` | `string` | MFA token (required if MFA is enabled). | ###### Returns [#returns-58] `Promise`\<`void`> Promise resolving when complete. ###### Inherited from [#inherited-from-50] ```ts ReturnType.setPassword ``` ##### unlinkOAuthProvider() [#unlinkoauthprovider] ```ts unlinkOAuthProvider(provider): Promise; ``` Unlinks an OAuth provider from the authenticated user's account. User must have at least one authentication method remaining (password or another OAuth provider). ###### Parameters [#parameters-50] | Parameter | Type | Description | | ---------- | --------------- | --------------------------------------------------------------- | | `provider` | `OAuthProvider` | The OAuth provider to unlink (google, apple, microsoft, adobe). | ###### Returns [#returns-59] `Promise`\<`void`> Promise resolving when complete. ###### Inherited from [#inherited-from-51] ```ts ReturnType.unlinkOAuthProvider ``` ##### upgradeGuest() [#upgradeguest] ```ts upgradeGuest(data): Promise<{ user: User; }>; ``` Upgrades a guest account to a standard account with a password. Requires the user to be authenticated as a guest. ###### Parameters [#parameters-51] | Parameter | Type | Description | | ----------------- | ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | | `data` | \{ `company?`: `string`; `firstName?`: `string`; `lastName?`: `string`; `password`: `string`; `userName?`: `string`; } | Upgrade data (password, optional firstName, lastName, company, userName). | | `data.company?` | `string` | - | | `data.firstName?` | `string` | - | | `data.lastName?` | `string` | - | | `data.password` | `string` | - | | `data.userName?` | `string` | - | ###### Returns [#returns-60] `Promise`\<\{ `user`: `User`; }> Promise resolving to the upgraded user data. ###### Inherited from [#inherited-from-52] ```ts ReturnType.upgradeGuest ``` ##### verifyBackupCode() [#verifybackupcode] ```ts verifyBackupCode(backupCode): Promise; ``` Verifies an MFA backup code. This is used during login when a user has lost access to their authenticator app. ###### Parameters [#parameters-52] | Parameter | Type | Description | | ------------ | -------- | ----------------------------------------- | | `backupCode` | `string` | The backup code (8-character hex string). | ###### Returns [#returns-61] `Promise`\<`MFAVerifyResponse`> Promise resolving to user/token data upon successful verification. ###### Inherited from [#inherited-from-53] ```ts ReturnType.verifyBackupCode ``` ##### verifyEmail() [#verifyemail] ```ts verifyEmail(token): Promise; ``` Verifies a user's email using the provided token. ###### Parameters [#parameters-53] | Parameter | Type | Description | | --------- | -------- | ----------------------------- | | `token` | `string` | The email verification token. | ###### Returns [#returns-62] `Promise`\<`void`> Promise resolving when complete. ###### Inherited from [#inherited-from-54] ```ts ReturnType.verifyEmail ``` ##### verifyGuest() [#verifyguest] ```ts verifyGuest(token): Promise; ``` Verifies a guest account using the token from the verification email. Stores auth tokens on success and returns user data. ###### Parameters [#parameters-54] | Parameter | Type | Description | | --------- | -------- | ----------------------------- | | `token` | `string` | The guest verification token. | ###### Returns [#returns-63] `Promise`\<[`LoginRegisterResponse`](/docs/reference/sdk/routes/auth#loginregisterresponse)> Promise resolving to user data and auth tokens. ###### Inherited from [#inherited-from-55] ```ts ReturnType.verifyGuest ``` ##### verifyMfa() [#verifymfa] ```ts verifyMfa(mfaToken): Promise; ``` Verifies an MFA token (e.g., TOTP code). This is used both during initial MFA setup and during login challenges. ###### Parameters [#parameters-55] | Parameter | Type | Description | | ---------- | -------- | ------------------- | | `mfaToken` | `string` | The MFA token code. | ###### Returns [#returns-64] `Promise`\<`MFAVerifyResponse`> Promise resolving to user/token data upon successful verification. ###### Inherited from [#inherited-from-56] ```ts ReturnType.verifyMfa ``` *** ### NuramaClientOptions [#nuramaclientoptions] #### Properties [#properties-2] | Property | Type | Description | | ------------------------------------------------------------------- | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `apiKey?` | `string` | Long-lived API key to use for every request (e.g., a bot API key starting with `nrm_bot_`). When set, the client skips JWT refresh logic and uses the key as the bearer token. | | `browserMode?` | `boolean` | Whether to run in browser mode (uses localStorage for token storage). Default: false | | `cacheDurationSeconds?` | `number` | Cache duration in seconds. Default: 5 | | `debug?` | `boolean` | Enable debug logging. Default: false | | `enableCache?` | `boolean` | Enable response caching. Default: true | | `fetch?` | (`input`, `init?`) => `Promise`\<`Response`> | Custom fetch implementation. If not provided, will use global fetch | | `invalidateCacheOnMutation?` | `boolean` | After a successful write (POST/PUT/PATCH/DELETE) to a resource, evict cached GET responses for that resource so the next read returns fresh data (read-after-write consistency). Default: true. | | `onMaintenance?` | () => `void` | Invoked when the API returns a `{ error: 'maintenance' }` body with a 418 or 503 status — i.e. the site is in a maintenance window. Lets an already-loaded (cached) app surface a maintenance message instead of failing silently. | | `onUnauthorized?` | (`reason?`) => `void` | Callback invoked when authentication fails and re-login is required (e.g., refresh token expired/missing). `reason.type` carries the API's error type when available — notably `emailVerificationRequired` when the refresh was rejected because the user's email-verification grace period has expired, so callers can prompt verification instead of a plain logout. | | `refreshLockTimeoutMs?` | `number` | Timeout in ms for the refresh lock to prevent multiple simultaneous refreshes. Default: 5000 | | `refreshTokenStorageKey?` | `string` | Key used to store the refresh token in storage. Default: 'nurama\_refresh\_token' | | `tokenExpiryBufferSeconds?` | `number` | Number of seconds before token expiry to trigger refresh. Default: 300 (5 minutes) | | `tokenRefreshMaxWaitMs?` | `number` | Maximum time in ms to wait for token refresh. Default: 10000 | | `tokenRefreshRetryDelayMs?` | `number` | Delay in ms between token refresh retries. Default: 1000 | | `tokenStorageKey?` | `string` | Key used to store the access token in storage. Default: 'nurama\_token' | | `websocketURL?` | `string` | WebSocket server URL. If not provided, will use the baseURL | *** ### ProjectMethods [#projectmethods] #### Extends [#extends-3] * `ReturnType`\<*typeof* [`default`](/docs/reference/sdk/routes/project#default)> #### Methods [#methods-3] ##### addItemsToPublicFileSystem() [#additemstopublicfilesystem] ```ts addItemsToPublicFileSystem( projectId, publicId, addItemsData ): Promise; ``` Adds additional items to an existing public file system. ###### Parameters [#parameters-56] | Parameter | Type | Description | | -------------- | ----------------------------------------------------------------------------------------------------- | --------------------------------- | | `projectId` | `string` | The ID of the project. | | `publicId` | `string` | The ID of the public file system. | | `addItemsData` | [`AddItemsToPublicFileSystemData`](/docs/reference/sdk/routes/project#additemstopublicfilesystemdata) | Data for adding items. | ###### Returns [#returns-65] `Promise`\<[`PublicFileSystemResponse`](/docs/reference/sdk/routes/project#publicfilesystemresponse)> The updated public file system object. ###### Inherited from [#inherited-from-57] ```ts ReturnType.addItemsToPublicFileSystem ``` ##### addItemsToSubmission() [#additemstosubmission] ```ts addItemsToSubmission( projectId, submissionId, addItemsData ): Promise; ``` Adds items to an existing submission. ###### Parameters [#parameters-57] | Parameter | Type | Description | | -------------- | ----------------------------------------------------------------------------------------- | ---------------------------------------- | | `projectId` | `string` | The ID of the project. | | `submissionId` | `string` | The ID of the submission. | | `addItemsData` | [`AddItemsToSubmissionData`](/docs/reference/sdk/routes/project#additemstosubmissiondata) | Data for adding items to the submission. | ###### Returns [#returns-66] `Promise`\<`ChatSubmission`> The updated submission object. ###### Inherited from [#inherited-from-58] ```ts ReturnType.addItemsToSubmission ``` ##### copyItemsToPath() [#copyitemstopath] ```ts copyItemsToPath( projectId, visibility, copyData ): Promise<{ count: number; }>; ``` Copies items to a specific path within a project. ###### Parameters [#parameters-58] | Parameter | Type | Description | | ------------ | ------------------------------------------------------------------- | ------------------------------------------------- | | `projectId` | `string` | The ID of the project. | | `visibility` | `"creator"` \| `"reviewer"` | The visibility context ('creator' or 'reviewer'). | | `copyData` | [`CopyItemsData`](/docs/reference/sdk/routes/project#copyitemsdata) | Data for copying items. | ###### Returns [#returns-67] `Promise`\<\{ `count`: `number`; }> Object containing the count of copied items. ###### Inherited from [#inherited-from-59] ```ts ReturnType.copyItemsToPath ``` ##### copyPublicItemsAtPath() [#copypublicitemsatpath] ```ts copyPublicItemsAtPath( projectId, token, copyData ): Promise<{ count: number; }>; ``` Copies items within a public file system (authenticated management). ###### Parameters [#parameters-59] | Parameter | Type | Description | | ----------- | ------------------------------------------------------------------------------- | ------------------------ | | `projectId` | `string` | The ID of the project. | | `token` | `string` | The public access token. | | `copyData` | [`CopyPublicItemsData`](/docs/reference/sdk/routes/project#copypublicitemsdata) | Data for copying items. | ###### Returns [#returns-68] `Promise`\<\{ `count`: `number`; }> Object containing the count of copied items. ###### Inherited from [#inherited-from-60] ```ts ReturnType.copyPublicItemsAtPath ``` ##### copySubmissionItems() [#copysubmissionitems] ```ts copySubmissionItems( projectId, submissionId, copyData ): Promise<{ count: number; }>; ``` Copies items within a submission. ###### Parameters [#parameters-60] | Parameter | Type | Description | | -------------- | --------------------------------------------------------------------------------------- | ------------------------- | | `projectId` | `string` | The ID of the project. | | `submissionId` | `string` | The ID of the submission. | | `copyData` | [`CopySubmissionItemsData`](/docs/reference/sdk/routes/project#copysubmissionitemsdata) | Data for copying items. | ###### Returns [#returns-69] `Promise`\<\{ `count`: `number`; }> Object containing the count of copied items. ###### Inherited from [#inherited-from-61] ```ts ReturnType.copySubmissionItems ``` ##### createAssets() [#createassets] ```ts createAssets(projectId, fileUploadBody): Promise; ``` Create assets within a project and return their signed links for upload. ###### Parameters [#parameters-61] | Parameter | Type | Description | | ---------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------- | | `projectId` | `string` | The ID of the project. | | `fileUploadBody` | [`ProjectFileUploadBody`](/docs/reference/sdk/routes/project#projectfileuploadbody) | List of files to upload with optional destination path. | ###### Returns [#returns-70] `Promise`\<`any`\[]> Array of results, each containing asset info and signed URL data. ###### Inherited from [#inherited-from-62] ```ts ReturnType.createAssets ``` ##### createFolder() [#createfolder] ```ts createFolder( projectId, visibility, folderData ): Promise; ``` Creates a folder within a project with file system integration. ###### Parameters [#parameters-62] | Parameter | Type | Description | | ------------ | ------------------------------------------------------------------------- | ------------------------------------------------- | | `projectId` | `string` | The ID of the project. | | `visibility` | `"creator"` \| `"reviewer"` | The visibility context ('creator' or 'reviewer'). | | `folderData` | [`CreateFolderData`](/docs/reference/sdk/routes/project#createfolderdata) | Data for creating the folder. | ###### Returns [#returns-71] `Promise`\<`Folder`> The created folder object. ###### Inherited from [#inherited-from-63] ```ts ReturnType.createFolder ``` ##### createLogo() [#createlogo] ```ts createLogo(projectId, logoData): Promise; ``` Creates a new logo asset for a project. ###### Parameters [#parameters-63] | Parameter | Type | Description | | ----------- | --------------------------------------------------------------------- | --------------------------- | | `projectId` | `string` | The ID of the project. | | `logoData` | [`LogoUploadData`](/docs/reference/sdk/routes/project#logouploaddata) | File metadata for the logo. | ###### Returns [#returns-72] `Promise`\<`any`> Object containing signed URL data and updated project info. ###### Inherited from [#inherited-from-64] ```ts ReturnType.createLogo ``` ##### createProject() [#createproject] ```ts createProject(projectData): Promise; ``` Creates a new project. ###### Parameters [#parameters-64] | Parameter | Type | Description | | ------------- | --------------------------------------------------------------------------- | ------------------------- | | `projectData` | [`CreateProjectData`](/docs/reference/sdk/routes/project#createprojectdata) | Data for the new project. | ###### Returns [#returns-73] `Promise`\<`Project`> The created project object. ###### Inherited from [#inherited-from-65] ```ts ReturnType.createProject ``` ##### createProjectPublicAssetChatMessage() [#createprojectpublicassetchatmessage] ```ts createProjectPublicAssetChatMessage( projectId, token, assetId, data ): Promise; ``` Creates a message on an asset's public chat from an authenticated project context. Creates the chat lazily if it doesn't exist yet. Unlike the public endpoint, this does NOT check token expiration. ###### Parameters [#parameters-65] | Parameter | Type | Description | | ----------- | -------------------------------- | ------------------------ | | `projectId` | `string` | The ID of the project. | | `token` | `string` | The public access token. | | `assetId` | `string` | The ID of the asset. | | `data` | `CreatePublicChatMessageRequest` | Message data. | ###### Returns [#returns-74] `Promise`\<`CreatePublicAssetChatMessageResponse`> The chat and created message. ###### Inherited from [#inherited-from-66] ```ts ReturnType.createProjectPublicAssetChatMessage ``` ##### createProjectPublicChatMessage() [#createprojectpublicchatmessage] ```ts createProjectPublicChatMessage( projectId, token, chatId, data ): Promise; ``` Creates a message in an existing public chat from an authenticated project context. Unlike the public endpoint, this does NOT check token expiration. ###### Parameters [#parameters-66] | Parameter | Type | Description | | ----------- | -------------------------------- | ------------------------ | | `projectId` | `string` | The ID of the project. | | `token` | `string` | The public access token. | | `chatId` | `string` | The ID of the chat. | | `data` | `CreatePublicChatMessageRequest` | Message data. | ###### Returns [#returns-75] `Promise`\<`ChatMessage`> The created message. ###### Inherited from [#inherited-from-67] ```ts ReturnType.createProjectPublicChatMessage ``` ##### createProjectPublicTopicChatMessage() [#createprojectpublictopicchatmessage] ```ts createProjectPublicTopicChatMessage( projectId, token, data ): Promise; ``` Creates a message on the main public topic chat from an authenticated project context. Creates the chat lazily if it doesn't exist yet. Unlike the public endpoint, this does NOT check token expiration. ###### Parameters [#parameters-67] | Parameter | Type | Description | | ----------- | -------------------------------- | ------------------------ | | `projectId` | `string` | The ID of the project. | | `token` | `string` | The public access token. | | `data` | `CreatePublicChatMessageRequest` | Message data. | ###### Returns [#returns-76] `Promise`\<`CreatePublicAssetChatMessageResponse`> The chat and created message. ###### Inherited from [#inherited-from-68] ```ts ReturnType.createProjectPublicTopicChatMessage ``` ##### createPublicFileSystem() [#createpublicfilesystem] ```ts createPublicFileSystem(projectId, publicFileSystemData): Promise; ``` Creates a public file system with a secure token for sharing project assets publicly. ###### Parameters [#parameters-68] | Parameter | Type | Description | | ---------------------- | --------------------------------------------------------------------------------------------- | ----------------------------------------- | | `projectId` | `string` | The ID of the project. | | `publicFileSystemData` | [`CreatePublicFileSystemData`](/docs/reference/sdk/routes/project#createpublicfilesystemdata) | Data for creating the public file system. | ###### Returns [#returns-77] `Promise`\<[`PublicFileSystemResponse`](/docs/reference/sdk/routes/project#publicfilesystemresponse)> The created public file system object. ###### Inherited from [#inherited-from-69] ```ts ReturnType.createPublicFileSystem ``` ##### createPublicFolder() [#createpublicfolder] ```ts createPublicFolder( projectId, token, folderData ): Promise; ``` Creates a folder inside a public file system (authenticated management). ###### Parameters [#parameters-69] | Parameter | Type | Description | | ------------ | ------------------------------------------------------------------------- | ----------------------------------------------------- | | `projectId` | `string` | The ID of the project. | | `token` | `string` | The public access token. | | `folderData` | [`CreateFolderData`](/docs/reference/sdk/routes/project#createfolderdata) | Data for creating the folder (name, color, basePath). | ###### Returns [#returns-78] `Promise`\<`Folder`> The created folder object. ###### Inherited from [#inherited-from-70] ```ts ReturnType.createPublicFolder ``` ##### createSubmission() [#createsubmission] ```ts createSubmission(projectId, submissionData): Promise; ``` Creates a new submission for a project. ###### Parameters [#parameters-70] | Parameter | Type | Description | | ---------------- | --------------------------------------------------------------------------------- | ------------------------ | | `projectId` | `string` | The ID of the project. | | `submissionData` | [`CreateSubmissionData`](/docs/reference/sdk/routes/project#createsubmissiondata) | Data for the submission. | ###### Returns [#returns-79] `Promise`\<`ChatSubmission`> The created submission object. ###### Inherited from [#inherited-from-71] ```ts ReturnType.createSubmission ``` ##### createSubmissionFolder() [#createsubmissionfolder] ```ts createSubmissionFolder( projectId, submissionId, folderData ): Promise; ``` Creates a folder within a submission. ###### Parameters [#parameters-71] | Parameter | Type | Description | | -------------- | --------------------------------------------------------------------------------------------- | ----------------------------- | | `projectId` | `string` | The ID of the project. | | `submissionId` | `string` | The ID of the submission. | | `folderData` | [`CreateSubmissionFolderData`](/docs/reference/sdk/routes/project#createsubmissionfolderdata) | Data for creating the folder. | ###### Returns [#returns-80] `Promise`\<`Folder`> The created folder object. ###### Inherited from [#inherited-from-72] ```ts ReturnType.createSubmissionFolder ``` ##### deleteItemsAtPath() [#deleteitemsatpath] ```ts deleteItemsAtPath( projectId, visibility, deleteData ): Promise<{ count: number; }>; ``` Deletes items at a specific path within a project. ###### Parameters [#parameters-72] | Parameter | Type | Description | | ------------ | ----------------------------------------------------------------------- | ------------------------------------------------- | | `projectId` | `string` | The ID of the project. | | `visibility` | `"creator"` \| `"reviewer"` | The visibility context ('creator' or 'reviewer'). | | `deleteData` | [`DeleteItemsData`](/docs/reference/sdk/routes/project#deleteitemsdata) | Data for deleting items. | ###### Returns [#returns-81] `Promise`\<\{ `count`: `number`; }> Object containing the count of deleted items. ###### Inherited from [#inherited-from-73] ```ts ReturnType.deleteItemsAtPath ``` ##### deleteProject() [#deleteproject] ```ts deleteProject(projectId): Promise; ``` Deletes a project (marks for deletion). ###### Parameters [#parameters-73] | Parameter | Type | Description | | ----------- | -------- | -------------------------------- | | `projectId` | `string` | The ID of the project to delete. | ###### Returns [#returns-82] `Promise`\<`void`> The deleted public release record. ###### Inherited from [#inherited-from-74] ```ts ReturnType.deleteProject ``` ##### deletePublicFileSystem() [#deletepublicfilesystem] ```ts deletePublicFileSystem(projectId, publicId): Promise; ``` Deletes a public file system and invalidates its access token. ###### Parameters [#parameters-74] | Parameter | Type | Description | | ----------- | -------- | --------------------------------- | | `projectId` | `string` | The ID of the project. | | `publicId` | `string` | The ID of the public file system. | ###### Returns [#returns-83] `Promise`\<[`PublicFileSystemResponse`](/docs/reference/sdk/routes/project#publicfilesystemresponse)> The deleted public release record. ###### Inherited from [#inherited-from-75] ```ts ReturnType.deletePublicFileSystem ``` ##### deletePublicItemsAtPath() [#deletepublicitemsatpath] ```ts deletePublicItemsAtPath( projectId, token, deleteData ): Promise<{ count: number; }>; ``` Deletes items from a public file system (authenticated management). ###### Parameters [#parameters-75] | Parameter | Type | Description | | ------------ | ----------------------------------------------------------------------------------- | ------------------------ | | `projectId` | `string` | The ID of the project. | | `token` | `string` | The public access token. | | `deleteData` | [`DeletePublicItemsData`](/docs/reference/sdk/routes/project#deletepublicitemsdata) | Data for deleting items. | ###### Returns [#returns-84] `Promise`\<\{ `count`: `number`; }> Object containing the count of deleted items. ###### Inherited from [#inherited-from-76] ```ts ReturnType.deletePublicItemsAtPath ``` ##### deleteSubmissionItems() [#deletesubmissionitems] ```ts deleteSubmissionItems( projectId, submissionId, deleteData ): Promise<{ count: number; }>; ``` Deletes items within a submission. ###### Parameters [#parameters-76] | Parameter | Type | Description | | -------------- | ------------------------------------------------------------------------------------------- | ------------------------- | | `projectId` | `string` | The ID of the project. | | `submissionId` | `string` | The ID of the submission. | | `deleteData` | [`DeleteSubmissionItemsData`](/docs/reference/sdk/routes/project#deletesubmissionitemsdata) | Data for deleting items. | ###### Returns [#returns-85] `Promise`\<\{ `count`: `number`; }> Object containing the count of deleted items. ###### Inherited from [#inherited-from-77] ```ts ReturnType.deleteSubmissionItems ``` ##### getAssets() [#getassets] ```ts getAssets( projectId, visibility, params? ): Promise>; ``` Lists a project's assets for one visibility tier. `creator` requires `canGetCreatorAssets`; `reviewer` requires `canGetReviewerAssets`. ###### Parameters [#parameters-77] | Parameter | Type | Description | | ------------ | ------------------------------------------------------------------------- | --------------------------------------------- | | `projectId` | `string` | The project ID. | | `visibility` | `"creator"` \| `"reviewer"` | Which tier's assets to list. | | `params?` | [`ListAssetsParams`](/docs/reference/sdk/routes/project#listassetsparams) | Filters and pagination. See ListAssetsParams. | ###### Returns [#returns-86] `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/project#paginatedresponse)\<`Asset`>> Paginated assets. ###### Throws [#throws] 'projectId is required.' or 'visibility is required.'. ###### Inherited from [#inherited-from-78] ```ts ReturnType.getAssets ``` ##### getFolders() [#getfolders] ```ts getFolders( projectId, visibility, params? ): Promise>; ``` Gets folders within a project with specified visibility. ###### Parameters [#parameters-78] | Parameter | Type | Description | | ------------ | --------------------------------------------------------------------------- | ------------------------------------------------- | | `projectId` | `string` | The ID of the project. | | `visibility` | `"creator"` \| `"reviewer"` | The visibility context ('creator' or 'reviewer'). | | `params?` | [`ListFoldersParams`](/docs/reference/sdk/routes/project#listfoldersparams) | Query parameters for filtering and pagination. | ###### Returns [#returns-87] `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/project#paginatedresponse)\<`Folder`>> Paginated list of folders. ###### Inherited from [#inherited-from-79] ```ts ReturnType.getFolders ``` ##### getHighlightedMessages() [#gethighlightedmessages] ```ts getHighlightedMessages( projectId, visibility, params? ): Promise>; ``` Lists highlighted chat messages across a project for one visibility tier (cursor pagination only). `creator` requires `canGetCreatorHighlights`; `reviewer` requires `canGetReviewerHighlights`. ###### Parameters [#parameters-79] | Parameter | Type | Description | | ------------ | ------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | | `projectId` | `string` | The project ID. | | `visibility` | `"creator"` \| `"reviewer"` | Which tier's highlights to list. | | `params?` | [`GetHighlightedMessagesParams`](/docs/reference/sdk/routes/project#gethighlightedmessagesparams) | Cursor pagination. See GetHighlightedMessagesParams. | ###### Returns [#returns-88] `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/project#paginatedresponse)\<`ChatMessage`>> Paginated highlighted messages. ###### Throws [#throws-1] 'projectId is required.' or 'visibility is required.'. ###### Inherited from [#inherited-from-80] ```ts ReturnType.getHighlightedMessages ``` ##### getHomeFeed() [#gethomefeed] ```ts getHomeFeed( projectId, visibility, params? ): Promise>; ``` Gets the home feed for a project with a specified visibility. ###### Parameters [#parameters-80] | Parameter | Type | Description | | ------------ | --------------------------------------------------------------------- | ------------------------------------------------- | | `projectId` | `string` | The ID of the project. | | `visibility` | `"creator"` \| `"reviewer"` | The visibility context ('creator' or 'reviewer'). | | `params?` | [`ListFeedParams`](/docs/reference/sdk/routes/project#listfeedparams) | Query parameters for filtering and pagination. | ###### Returns [#returns-89] `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/project#paginatedresponse)\<`Asset`>> Paginated feed items. ###### Inherited from [#inherited-from-81] ```ts ReturnType.getHomeFeed ``` ##### getItemsAtPath() [#getitemsatpath] ```ts getItemsAtPath( projectId, visibility, path?, params?, usePost? ): Promise>; ``` Gets items at a specific path within a project. ###### Parameters [#parameters-81] | Parameter | Type | Default value | Description | | ------------ | --------------------------------------------------------------------------------- | ------------- | ----------------------------------------------------------------- | | `projectId` | `string` | `undefined` | The ID of the project. | | `visibility` | `"creator"` \| `"reviewer"` | `undefined` | The visibility context ('creator' or 'reviewer'). | | `path?` | `string` | `undefined` | The path to get items from (optional, defaults to root). | | `params?` | [`GetItemsAtPathParams`](/docs/reference/sdk/routes/project#getitemsatpathparams) | `undefined` | Query parameters for filtering and pagination. | | `usePost?` | `boolean` | `false` | Whether to use POST method (useful for large resourceIds arrays). | ###### Returns [#returns-90] `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/project#paginatedresponse)\<`any`>> Paginated list of items at the path. ###### Inherited from [#inherited-from-82] ```ts ReturnType.getItemsAtPath ``` ##### getProject() [#getproject] ```ts getProject(projectId): Promise; ``` Retrieves a specific project by its ID. ###### Parameters [#parameters-82] | Parameter | Type | Description | | ----------- | -------- | ---------------------- | | `projectId` | `string` | The ID of the project. | ###### Returns [#returns-91] `Promise`\<`Project`> The project object. ###### Inherited from [#inherited-from-83] ```ts ReturnType.getProject ``` ##### getProjectChat() [#getprojectchat] ```ts getProjectChat( projectId, visibility, params? ): Promise; ``` Gets the project chat with the specified visibility. ###### Parameters [#parameters-83] | Parameter | Type | Description | | ------------ | ------------------------------------------------------------------- | ------------------------------------------------- | | `projectId` | `string` | The ID of the project. | | `visibility` | `"creator"` \| `"reviewer"` | The visibility context ('creator' or 'reviewer'). | | `params?` | [`GetChatParams`](/docs/reference/sdk/routes/project#getchatparams) | Query parameters for message/reply limits. | ###### Returns [#returns-92] `Promise`\<`Chat`> The chat object. ###### Inherited from [#inherited-from-84] ```ts ReturnType.getProjectChat ``` ##### getProjectPublicAsset() [#getprojectpublicasset] ```ts getProjectPublicAsset( projectId, token, assetId ): Promise; ``` Gets a public asset with its public chat from an authenticated project context. Unlike the public endpoint, this does NOT check token expiration. Use this for internal management of public file systems. ###### Parameters [#parameters-84] | Parameter | Type | Description | | ----------- | -------- | -------------------------------- | | `projectId` | `string` | The ID of the project. | | `token` | `string` | The public access token. | | `assetId` | `string` | The ID of the asset to retrieve. | ###### Returns [#returns-93] `Promise`\<`PublicAssetResponse`> The asset with its public chat. ###### Inherited from [#inherited-from-85] ```ts ReturnType.getProjectPublicAsset ``` ##### getProjectPublicChat() [#getprojectpublicchat] ```ts getProjectPublicChat(projectId, token): Promise; ``` Gets a public chat from an authenticated project context. Unlike the public endpoint, this does NOT check token expiration. Use this for internal management of public file systems. ###### Parameters [#parameters-85] | Parameter | Type | Description | | ----------- | -------- | ------------------------ | | `projectId` | `string` | The ID of the project. | | `token` | `string` | The public access token. | ###### Returns [#returns-94] `Promise`\<`any`> The public chat or null if none exists. ###### Inherited from [#inherited-from-86] ```ts ReturnType.getProjectPublicChat ``` ##### getProjectPublicChatMessages() [#getprojectpublicchatmessages] ```ts getProjectPublicChatMessages( projectId, token, chatId, params? ): Promise; ``` Gets messages from a public chat from an authenticated project context. Unlike the public endpoint, this does NOT check token expiration. Use this for internal management of public file systems. ###### Parameters [#parameters-86] | Parameter | Type | Description | | ----------- | ----------------------------------------------------------------------------------------------- | -------------------------------- | | `projectId` | `string` | The ID of the project. | | `token` | `string` | The public access token. | | `chatId` | `string` | The ID of the chat. | | `params?` | [`GetPublicChatMessagesParams`](/docs/reference/sdk/routes/project#getpublicchatmessagesparams) | Query parameters for pagination. | ###### Returns [#returns-95] `Promise`\<`PublicChatMessagesResponse`> Paginated list of chat messages. ###### Inherited from [#inherited-from-87] ```ts ReturnType.getProjectPublicChatMessages ``` ##### getProjects() [#getprojects] ```ts getProjects(): Promise; ``` Retrieves projects accessible by the user. NOTE: API endpoint `/v1/projects` does not currently support pagination. ###### Returns [#returns-96] `Promise`\<`Project`\[]> List of project objects. ###### Inherited from [#inherited-from-88] ```ts ReturnType.getProjects ``` ##### getPublicAudit() [#getpublicaudit] ```ts getPublicAudit(projectId, params?): Promise>; ``` Get the public audit for a project — assets that are or have been publicly exposed. ###### Parameters [#parameters-87] | Parameter | Type | Description | | ------------------------- | -------------------------------------------------------------------------- | ---------------------------------------- | | `projectId` | `string` | - | | `params?` | \{ `currentlyPublic?`: `boolean`; `limit?`: `number`; `page?`: `number`; } | - | | `params.currentlyPublic?` | `boolean` | When true, only assets currently public. | | `params.limit?` | `number` | - | | `params.page?` | `number` | - | ###### Returns [#returns-97] `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/project#paginatedresponse)\<[`PublicAuditAssetResponse`](/docs/reference/sdk/routes/project#publicauditassetresponse)>> ###### Requires [#requires] `projectAdmin` or `projectOwner` on the project (or workspace-tier admin via inheritance). ###### Inherited from [#inherited-from-89] ```ts ReturnType.getPublicAudit ``` ##### getPublicFileSystem() [#getpublicfilesystem] ```ts getPublicFileSystem(projectId, publicId): Promise; ``` Retrieves a specific public file system by its ID. ###### Parameters [#parameters-88] | Parameter | Type | Description | | ----------- | -------- | --------------------------------- | | `projectId` | `string` | The ID of the project. | | `publicId` | `string` | The ID of the public file system. | ###### Returns [#returns-98] `Promise`\<[`PublicFileSystemResponse`](/docs/reference/sdk/routes/project#publicfilesystemresponse)> The public file system object. ###### Inherited from [#inherited-from-90] ```ts ReturnType.getPublicFileSystem ``` ##### getPublicFileSystems() [#getpublicfilesystems] ```ts getPublicFileSystems(projectId, params?): Promise>; ``` Gets all public file systems for a project. ###### Parameters [#parameters-89] | Parameter | Type | Description | | ----------- | ----------------------------------------------------------------------------------------------- | --------------------------------------------------------------- | | `projectId` | `string` | The ID of the project. | | `params?` | [`ListPublicFileSystemsParams`](/docs/reference/sdk/routes/project#listpublicfilesystemsparams) | Query parameters (pagination, sort, search, status, creatorId). | ###### Returns [#returns-99] `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/project#paginatedresponse)\<[`PublicFileSystemResponse`](/docs/reference/sdk/routes/project#publicfilesystemresponse)>> Paginated list of public file systems. ###### Inherited from [#inherited-from-91] ```ts ReturnType.getPublicFileSystems ``` ##### getPublicItemsAtPath() [#getpublicitemsatpath] ```ts getPublicItemsAtPath( projectId, token, path?, params? ): Promise>; ``` Gets items from a public file system at a specific path (authenticated management). ###### Parameters [#parameters-90] | Parameter | Type | Description | | ----------- | --------------------------------------------------------------------------------- | -------------------------------------------------------- | | `projectId` | `string` | The ID of the project. | | `token` | `string` | The public access token. | | `path?` | `string` | The path to get items from (optional, defaults to root). | | `params?` | [`GetItemsAtPathParams`](/docs/reference/sdk/routes/project#getitemsatpathparams) | Query parameters for filtering and pagination. | ###### Returns [#returns-100] `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/project#paginatedresponse)\<`any`>> Paginated list of public file system items. ###### Inherited from [#inherited-from-92] ```ts ReturnType.getPublicItemsAtPath ``` ##### getSubmission() [#getsubmission] ```ts getSubmission( projectId, submissionId, params? ): Promise; ``` Retrieves a specific submission by its ID. ###### Parameters [#parameters-91] | Parameter | Type | Description | | -------------- | ------------------------------------------------------------------------------- | ------------------------------------------------ | | `projectId` | `string` | The ID of the project. | | `submissionId` | `string` | The ID of the submission. | | `params?` | [`GetSubmissionParams`](/docs/reference/sdk/routes/project#getsubmissionparams) | Query parameters for chat message/reply options. | ###### Returns [#returns-101] `Promise`\<`ChatSubmission`> The submission object. ###### Inherited from [#inherited-from-93] ```ts ReturnType.getSubmission ``` ##### getSubmissionItems() [#getsubmissionitems] ```ts getSubmissionItems( projectId, submissionId, path?, params? ): Promise>; ``` Gets files for a specific submission. ###### Parameters [#parameters-92] | Parameter | Type | Description | | -------------- | --------------------------------------------------------------------------------- | -------------------------------------------------------- | | `projectId` | `string` | The ID of the project. | | `submissionId` | `string` | The ID of the submission. | | `path?` | `string` | The path to get items from (optional, defaults to root). | | `params?` | [`GetItemsAtPathParams`](/docs/reference/sdk/routes/project#getitemsatpathparams) | Query parameters for filtering and pagination. | ###### Returns [#returns-102] `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/project#paginatedresponse)\<`any`>> Paginated list of files. ###### Inherited from [#inherited-from-94] ```ts ReturnType.getSubmissionItems ``` ##### getSubmissions() [#getsubmissions] ```ts getSubmissions(projectId, params?): Promise>; ``` Retrieves submissions for a project. ###### Parameters [#parameters-93] | Parameter | Type | Description | | ----------- | ----------------------------------------------------------------------------------- | ---------------------------------------------- | | `projectId` | `string` | The ID of the project. | | `params?` | [`ListSubmissionsParams`](/docs/reference/sdk/routes/project#listsubmissionsparams) | Query parameters for filtering and pagination. | ###### Returns [#returns-103] `Promise`\<[`PaginatedResponse`](/docs/reference/sdk/routes/project#paginatedresponse)\<`ChatSubmission`>> Paginated list of submissions. ###### Inherited from [#inherited-from-95] ```ts ReturnType.getSubmissions ``` ##### getTopAccessActivity() [#gettopaccessactivity] ```ts getTopAccessActivity(projectId, params?): Promise; ``` Top-N assets in a project by access-activity event type (plays, downloads, embeds). Requires project read access. Returns asset IDs and counts only; hydrate names and thumbnails through the normal asset fetch path. ###### Parameters [#parameters-94] | Parameter | Type | Description | | | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------- | ----- | ----------------------------- | | `projectId` | `string` | The project ID. | | | | `params?` | \{ `eventType?`: `"play_started"` \| `"play_completed"` \| `"download"` \| `"embed_resolved"`; `limit?`: `number`; `range?`: `"7d"` \| `"30d"` \| `"90d"`; } | `range` ('7d' | '30d' | '90d'), `eventType`, `limit`. | | `params.eventType?` | `"play_started"` \| `"play_completed"` \| `"download"` \| `"embed_resolved"` | - | | | | `params.limit?` | `number` | - | | | | `params.range?` | `"7d"` \| `"30d"` \| `"90d"` | - | | | ###### Returns [#returns-104] `Promise`\<[`ProjectTopAccessActivityResponse`](/docs/reference/sdk/routes/project#projecttopaccessactivityresponse)> Ranked asset IDs with counts. ###### Throws [#throws-2] 'projectId is required.' when `projectId` is falsy. ###### Inherited from [#inherited-from-96] ```ts ReturnType.getTopAccessActivity ``` ##### moveItemsToPath() [#moveitemstopath] ```ts moveItemsToPath( projectId, visibility, moveData ): Promise; ``` Moves items to a specific path within a project. ###### Parameters [#parameters-95] | Parameter | Type | Description | | ------------ | ------------------------------------------------------------------- | ------------------------------------------------- | | `projectId` | `string` | The ID of the project. | | `visibility` | `"creator"` \| `"reviewer"` | The visibility context ('creator' or 'reviewer'). | | `moveData` | [`MoveItemsData`](/docs/reference/sdk/routes/project#moveitemsdata) | Data for moving items. | ###### Returns [#returns-105] `Promise`\<[`MoveItemsResult`](/docs/reference/sdk/routes/project#moveitemsresult)> Object containing the count of moved items. ###### Inherited from [#inherited-from-97] ```ts ReturnType.moveItemsToPath ``` ##### movePublicItemsAtPath() [#movepublicitemsatpath] ```ts movePublicItemsAtPath( projectId, token, moveData ): Promise<{ count: number; }>; ``` Moves items within a public file system (authenticated management). ###### Parameters [#parameters-96] | Parameter | Type | Description | | ----------- | ------------------------------------------------------------------------------- | ------------------------ | | `projectId` | `string` | The ID of the project. | | `token` | `string` | The public access token. | | `moveData` | [`MovePublicItemsData`](/docs/reference/sdk/routes/project#movepublicitemsdata) | Data for moving items. | ###### Returns [#returns-106] `Promise`\<\{ `count`: `number`; }> Object containing the count of moved items. ###### Inherited from [#inherited-from-98] ```ts ReturnType.movePublicItemsAtPath ``` ##### moveSubmissionItems() [#movesubmissionitems] ```ts moveSubmissionItems( projectId, submissionId, moveData ): Promise<{ count: number; }>; ``` Moves items within a submission. ###### Parameters [#parameters-97] | Parameter | Type | Description | | -------------- | --------------------------------------------------------------------------------------- | ------------------------- | | `projectId` | `string` | The ID of the project. | | `submissionId` | `string` | The ID of the submission. | | `moveData` | [`MoveSubmissionItemsData`](/docs/reference/sdk/routes/project#movesubmissionitemsdata) | Data for moving items. | ###### Returns [#returns-107] `Promise`\<\{ `count`: `number`; }> Object containing the count of moved items. ###### Inherited from [#inherited-from-99] ```ts ReturnType.moveSubmissionItems ``` ##### previewDeleteItemsAtPath() [#previewdeleteitemsatpath] ```ts previewDeleteItemsAtPath( projectId, visibility, deleteData ): Promise; ``` Asks what deleting these paths would reach, without deleting anything. Computed from the same cascade the delete runs, so the answer is what will happen rather than an estimate of it. Only SECONDARY references come back — the reviewer, submission and public-release copies that would go with the selection. ###### Parameters [#parameters-98] | Parameter | Type | Description | | ------------ | ----------------------------------------------------------------------- | ------------------------------- | | `projectId` | `string` | - | | `visibility` | `"creator"` \| `"reviewer"` | - | | `deleteData` | [`DeleteItemsData`](/docs/reference/sdk/routes/project#deleteitemsdata) | The same body the delete takes. | ###### Returns [#returns-108] `Promise`\<`DeleteImpact`> ###### Inherited from [#inherited-from-100] ```ts ReturnType.previewDeleteItemsAtPath ``` ##### publishItems() [#publishitems] ```ts publishItems(projectId, publishData): Promise; ``` Publishes a list of items (assets, folders) within a project. ###### Parameters [#parameters-99] | Parameter | Type | Description | | ------------- | ------------------------------------------------------------------------- | -------------------------- | | `projectId` | `string` | The ID of the project. | | `publishData` | [`PublishItemsData`](/docs/reference/sdk/routes/project#publishitemsdata) | Data for publishing items. | ###### Returns [#returns-109] `Promise`\<`any`> Object containing lists of published items and results. ###### Inherited from [#inherited-from-101] ```ts ReturnType.publishItems ``` ##### releasePublicFileSystem() [#releasepublicfilesystem] ```ts releasePublicFileSystem(projectId, publicId): Promise; ``` Releases a staged (unreleased) public file system, making it externally accessible via its public token. ###### Parameters [#parameters-100] | Parameter | Type | Description | | ----------- | -------- | --------------------------------- | | `projectId` | `string` | The ID of the project. | | `publicId` | `string` | The ID of the public file system. | ###### Returns [#returns-110] `Promise`\<[`PublicFileSystemResponse`](/docs/reference/sdk/routes/project#publicfilesystemresponse)> The released public file system object. ###### Inherited from [#inherited-from-102] ```ts ReturnType.releasePublicFileSystem ``` ##### releaseSubmission() [#releasesubmission] ```ts releaseSubmission(projectId, submissionId): Promise; ``` Releases a staged (unreleased) submission, making it visible to reviewers and firing the deferred "new submission" side effects (emails, notifications, system messages). ###### Parameters [#parameters-101] | Parameter | Type | Description | | -------------- | -------- | ------------------------- | | `projectId` | `string` | The ID of the project. | | `submissionId` | `string` | The ID of the submission. | ###### Returns [#returns-111] `Promise`\<`ChatSubmission`> The released submission object. ###### Inherited from [#inherited-from-103] ```ts ReturnType.releaseSubmission ``` ##### releaseSubmissionUpdate() [#releasesubmissionupdate] ```ts releaseSubmissionUpdate(projectId, submissionId): Promise; ``` Re-releases an already-released submission's side effects (the "Release Update" action) — re-notifies reviewers with the submission-update email template + `submissionUpdate` notification. Does not change status. ###### Parameters [#parameters-102] | Parameter | Type | Description | | -------------- | -------- | ------------------------- | | `projectId` | `string` | The ID of the project. | | `submissionId` | `string` | The ID of the submission. | ###### Returns [#returns-112] `Promise`\<`ChatSubmission`> The submission object. ###### Inherited from [#inherited-from-104] ```ts ReturnType.releaseSubmissionUpdate ``` ##### searchProject() [#searchproject] ```ts searchProject(projectId, params): Promise; ``` Full-text search across assets, chat messages, and tasks within a project. Results are populated per the content type's native list view (asset → creator/publisher/tags; chatMessage → author/mentions/attachments; task → creator/assignee/project/origin). ###### Parameters [#parameters-103] | Parameter | Type | Description | | ----------- | --------------------- | --------------------------------------------------------------------------------------------------------------- | | `projectId` | `string` | - | | `params` | `SearchProjectParams` | At minimum `q`. Optional filters: `contentTypes`, `dateFrom`, `dateTo`, `creatorId`, `sortBy`, `page`, `limit`. | ###### Returns [#returns-113] `Promise`\<`SearchResponse`> Paginated search results. ###### Inherited from [#inherited-from-105] ```ts ReturnType.searchProject ``` ##### tagSubmission() [#tagsubmission] ```ts tagSubmission( projectId, submissionId, tagData ): Promise; ``` Adds a tag to a submission. ###### Parameters [#parameters-104] | Parameter | Type | Description | | -------------- | --------------------------------------------------------------------------- | -------------------------------- | | `projectId` | `string` | The ID of the project. | | `submissionId` | `string` | The ID of the submission. | | `tagData` | [`TagSubmissionData`](/docs/reference/sdk/routes/project#tagsubmissiondata) | Data for tagging the submission. | ###### Returns [#returns-114] `Promise`\<`ChatSubmission`> The updated submission object. ###### Inherited from [#inherited-from-106] ```ts ReturnType.tagSubmission ``` ##### unpublishItems() [#unpublishitems] ```ts unpublishItems(projectId, unpublishData): Promise; ``` Unpublishes a list of items (assets, folders) within a project. ###### Parameters [#parameters-105] | Parameter | Type | Description | | --------------- | ----------------------------------------------------------------------------- | ---------------------------- | | `projectId` | `string` | The ID of the project. | | `unpublishData` | [`UnpublishItemsData`](/docs/reference/sdk/routes/project#unpublishitemsdata) | Data for unpublishing items. | ###### Returns [#returns-115] `Promise`\<`any`> Object containing lists of unpublished items and results. ###### Inherited from [#inherited-from-107] ```ts ReturnType.unpublishItems ``` ##### untagSubmission() [#untagsubmission] ```ts untagSubmission( projectId, submissionId, tagData ): Promise; ``` Removes a tag from a submission. ###### Parameters [#parameters-106] | Parameter | Type | Description | | -------------- | --------------------------------------------------------------------------- | ---------------------------------- | | `projectId` | `string` | The ID of the project. | | `submissionId` | `string` | The ID of the submission. | | `tagData` | [`TagSubmissionData`](/docs/reference/sdk/routes/project#tagsubmissiondata) | Data for untagging the submission. | ###### Returns [#returns-116] `Promise`\<`ChatSubmission`> The updated submission object. ###### Inherited from [#inherited-from-108] ```ts ReturnType.untagSubmission ``` ##### updateLogo() [#updatelogo] ```ts updateLogo(projectId, logoData): Promise; ``` Updates the logo asset for a project. ###### Parameters [#parameters-107] | Parameter | Type | Description | | ----------- | --------------------------------------------------------------------- | ------------------------------- | | `projectId` | `string` | The ID of the project. | | `logoData` | [`LogoUploadData`](/docs/reference/sdk/routes/project#logouploaddata) | File metadata for the new logo. | ###### Returns [#returns-117] `Promise`\<`any`> Object containing signed URL data and updated project info. ###### Inherited from [#inherited-from-109] ```ts ReturnType.updateLogo ``` ##### updateProject() [#updateproject] ```ts updateProject(projectId, updateData): Promise; ``` Updates a project. ###### Parameters [#parameters-108] | Parameter | Type | Description | | ------------ | --------------------------------------------------------------------------- | -------------------------------- | | `projectId` | `string` | The ID of the project to update. | | `updateData` | [`UpdateProjectData`](/docs/reference/sdk/routes/project#updateprojectdata) | Data to update. | ###### Returns [#returns-118] `Promise`\<`Project`> The updated project object. ###### Inherited from [#inherited-from-110] ```ts ReturnType.updateProject ``` ##### updatePublicFileSystem() [#updatepublicfilesystem] ```ts updatePublicFileSystem( projectId, publicId, updateData ): Promise; ``` Updates an existing public file system's title and description. ###### Parameters [#parameters-109] | Parameter | Type | Description | | ------------ | --------------------------------------------------------------------------------------------- | --------------------------------- | | `projectId` | `string` | The ID of the project. | | `publicId` | `string` | The ID of the public file system. | | `updateData` | [`UpdatePublicFileSystemData`](/docs/reference/sdk/routes/project#updatepublicfilesystemdata) | Data to update. | ###### Returns [#returns-119] `Promise`\<[`PublicFileSystemResponse`](/docs/reference/sdk/routes/project#publicfilesystemresponse)> The updated public file system object. ###### Inherited from [#inherited-from-111] ```ts ReturnType.updatePublicFileSystem ``` ##### updateSetting() [#updatesetting] ```ts updateSetting( projectId, name, value ): Promise; ``` Updates a single project setting (e.g. `aiPolishEnabled`, `aiCustomPreprompt`). Pass `null` to inherit the workspace's value; pass a typed value to override. The valid setting names are validated server-side against `projectService.validProjectSettings`. ###### Parameters [#parameters-110] | Parameter | Type | Description | | | | ----------- | --------- | ------------------------------------- | ------- | ------- | | `projectId` | `string` | - | | | | `name` | `string` | Setting key (e.g. 'aiPolishEnabled'). | | | | `value` | `unknown` | null (inherit) | boolean | string. | ###### Returns [#returns-120] `Promise`\<`Project`> ###### Inherited from [#inherited-from-112] ```ts ReturnType.updateSetting ``` ##### updateSubmission() [#updatesubmission] ```ts updateSubmission( projectId, submissionId, updateData ): Promise; ``` Updates a submission. ###### Parameters [#parameters-111] | Parameter | Type | Description | | -------------- | --------------------------------------------------------------------------------- | ------------------------- | | `projectId` | `string` | The ID of the project. | | `submissionId` | `string` | The ID of the submission. | | `updateData` | [`UpdateSubmissionData`](/docs/reference/sdk/routes/project#updatesubmissiondata) | Data to update. | ###### Returns [#returns-121] `Promise`\<`ChatSubmission`> The updated submission object. ###### Inherited from [#inherited-from-113] ```ts ReturnType.updateSubmission ``` *** ### SDKVersionInfo [#sdkversioninfo] SDK Version Information AUTO-GENERATED - DO NOT EDIT MANUALLY Generated at: 2026-09-22T16:09:58.836Z #### Properties [#properties-3] | Property | Type | | ------------------------------------------ | -------- | | `buildHash` | `string` | | `buildTimestamp` | `string` | | `gitCommit` | `string` | | `version` | `string` | *** ### SubscriptionMethods [#subscriptionmethods] #### Extends [#extends-4] * `ReturnType`\<*typeof* [`default`](/docs/reference/sdk/routes/subscription#default)> #### Methods [#methods-4] ##### cancelWorkspaceSubscription() [#cancelworkspacesubscription] ```ts cancelWorkspaceSubscription(workspaceId): Promise; ``` Cancels the subscription for a specific workspace. Requires authentication and permission. ###### Parameters [#parameters-112] | Parameter | Type | Description | | ------------- | -------- | ------------------------ | | `workspaceId` | `string` | The ID of the workspace. | ###### Returns [#returns-122] `Promise`\<`any`> The cancellation response. ###### Inherited from [#inherited-from-114] ```ts ReturnType.cancelWorkspaceSubscription ``` ##### createWorkspaceOrder() [#createworkspaceorder] ```ts createWorkspaceOrder(workspaceId, orderData): Promise; ``` Creates a subscription order for a specific workspace. Requires authentication and permission. ###### Parameters [#parameters-113] | Parameter | Type | Description | | ------------- | -------------------------------------------------------------------------------------------------- | ------------------------ | | `workspaceId` | `string` | The ID of the workspace. | | `orderData` | [`CreateWorkspaceOrderParams`](/docs/reference/sdk/routes/subscription#createworkspaceorderparams) | The order data. | ###### Returns [#returns-123] `Promise`\<`any`> The created order response. ###### Inherited from [#inherited-from-115] ```ts ReturnType.createWorkspaceOrder ``` ##### getResourceLimits() [#getresourcelimits] ```ts getResourceLimits(resourceId): Promise; ``` Retrieves the resource limits (e.g., storage, seats) for a specific resource (typically workspace). Requires authentication. ###### Parameters [#parameters-114] | Parameter | Type | Description | | ------------ | -------- | ------------------------------------------- | | `resourceId` | `string` | The ID of the resource (e.g., workspaceId). | ###### Returns [#returns-124] `Promise`\<[`ResourceLimits`](/docs/reference/sdk/routes/subscription#resourcelimits)> An object containing the resource limits. ###### Inherited from [#inherited-from-116] ```ts ReturnType.getResourceLimits ``` ##### getRoleUsage() [#getroleusage] ```ts getRoleUsage(resourceId): Promise; ``` Retrieves per-role (creator / reviewer) seat usage and caps for a workspace. `limit` is `null` when the plan is unlimited for that seat type. Requires authentication. ###### Parameters [#parameters-115] | Parameter | Type | Description | | ------------ | -------- | ----------------- | | `resourceId` | `string` | The workspace ID. | ###### Returns [#returns-125] `Promise`\<[`RoleUsage`](/docs/reference/sdk/routes/subscription#roleusage)> Creator- and reviewer-side seat usage. ###### Inherited from [#inherited-from-117] ```ts ReturnType.getRoleUsage ``` ##### getSeatUsage() [#getseatusage] ```ts getSeatUsage(resourceId): Promise; ``` Retrieves the seat usage for a specific resource (typically workspace). Requires authentication. ###### Parameters [#parameters-116] | Parameter | Type | Description | | ------------ | -------- | ------------------------------------------- | | `resourceId` | `string` | The ID of the resource (e.g., workspaceId). | ###### Returns [#returns-126] `Promise`\<[`SeatUsage`](/docs/reference/sdk/routes/subscription#seatusage)> An object containing seat usage details. ###### Inherited from [#inherited-from-118] ```ts ReturnType.getSeatUsage ``` ##### getStorageUsage() [#getstorageusage] ```ts getStorageUsage(resourceId): Promise; ``` Retrieves the storage usage for a specific resource (typically workspace). Requires authentication. ###### Parameters [#parameters-117] | Parameter | Type | Description | | ------------ | -------- | ------------------------------------------- | | `resourceId` | `string` | The ID of the resource (e.g., workspaceId). | ###### Returns [#returns-127] `Promise`\<[`StorageUsage`](/docs/reference/sdk/routes/subscription#storageusage)> An object containing storage usage details. ###### Inherited from [#inherited-from-119] ```ts ReturnType.getStorageUsage ``` ##### getUserSubscriptions() [#getusersubscriptions] ```ts getUserSubscriptions(params?): Promise; ``` Retrieves all subscriptions owned by the currently authenticated user. Requires authentication. ###### Parameters [#parameters-118] | Parameter | Type | Description | | --------- | ------------------------------------------------------------------------------------------ | ------------------------------------------------- | | `params?` | [`GetSubscriptionsParams`](/docs/reference/sdk/routes/subscription#getsubscriptionsparams) | Optional query parameters for status and sorting. | ###### Returns [#returns-128] `Promise`\<`Subscription`\[]> An array of subscription objects. ###### Inherited from [#inherited-from-120] ```ts ReturnType.getUserSubscriptions ``` ##### getWorkspaceOrders() [#getworkspaceorders] ```ts getWorkspaceOrders(workspaceId, params?): Promise; ``` Retrieves subscription orders for a specific workspace. Requires authentication and permission. ###### Parameters [#parameters-119] | Parameter | Type | Description | | ------------- | ---------------------------------------------------------------------------------------------------- | -------------------------- | | `workspaceId` | `string` | The ID of the workspace. | | `params?` | [`GetSubscriptionOrdersParams`](/docs/reference/sdk/routes/subscription#getsubscriptionordersparams) | Optional query parameters. | ###### Returns [#returns-129] `Promise`\<`any`\[]> An array of subscription order objects. ###### Inherited from [#inherited-from-121] ```ts ReturnType.getWorkspaceOrders ``` ##### getWorkspaceSubscription() [#getworkspacesubscription] ```ts getWorkspaceSubscription(workspaceId): Promise; ``` Retrieves the active subscription for a specific workspace. Requires authentication and permission. ###### Parameters [#parameters-120] | Parameter | Type | Description | | ------------- | -------- | ------------------------ | | `workspaceId` | `string` | The ID of the workspace. | ###### Returns [#returns-130] `Promise`\<`Subscription`> The workspace subscription object. ###### Inherited from [#inherited-from-122] ```ts ReturnType.getWorkspaceSubscription ``` ##### getWorkspaceUsageSummary() [#getworkspaceusagesummary] ```ts getWorkspaceUsageSummary(workspaceId): Promise<{ billableSeatCount: number; storageUsedInBytes: number; }>; ``` Retrieves the workspace usage summary (billable seats and storage used). Requires authentication and subscription management permission. ###### Parameters [#parameters-121] | Parameter | Type | Description | | ------------- | -------- | ------------------------ | | `workspaceId` | `string` | The ID of the workspace. | ###### Returns [#returns-131] `Promise`\<\{ `billableSeatCount`: `number`; `storageUsedInBytes`: `number`; }> Usage summary. ###### Inherited from [#inherited-from-123] ```ts ReturnType.getWorkspaceUsageSummary ``` ##### resumeWorkspaceSubscription() [#resumeworkspacesubscription] ```ts resumeWorkspaceSubscription(workspaceId): Promise; ``` Reverse a scheduled (period-end) cancellation, keeping the workspace's subscription on its normal renewal cycle. Only valid while the subscription is still active with a pending cancellation; a fully lapsed subscription can't be resumed (the owner must re-subscribe). Requires authentication and permission. ###### Parameters [#parameters-122] | Parameter | Type | Description | | ------------- | -------- | ------------------------ | | `workspaceId` | `string` | The ID of the workspace. | ###### Returns [#returns-132] `Promise`\<`any`> The resume response. ###### Inherited from [#inherited-from-124] ```ts ReturnType.resumeWorkspaceSubscription ``` ##### swapWorkspacePlan() [#swapworkspaceplan] ```ts swapWorkspacePlan(workspaceId, params): Promise<{ subscription: Subscription | null; warnings: PlanChangeWarning[]; }>; ``` Swap the workspace's active basePlan line for a different basePlan product. Same code path both upgrades and downgrades; the API's pre-flight capacity check is what distinguishes a permitted change from a refused one. Pass `dryRun: true` to get the pre-flight verdict without mutating. On over-allocation the API returns 400 `planCapacityInsufficient` with `errorData.violations: [{ resource, current, newLimit }]`, surfaced via the SDK's normal error path. On success, returns the updated subscription plus a `warnings[]` array of feature-gate capabilities the destination plan does NOT include (suitable for showing as a confirmation notice). ###### Parameters [#parameters-123] | Parameter | Type | | ---------------------- | ------------------------------------------------------------------------------------------------------------------ | | `workspaceId` | `string` | | `params` | \{ `billingPeriod`: `"month"` \| `"year"`; `currency`: `string`; `dryRun?`: `boolean`; `newProductId`: `string`; } | | `params.billingPeriod` | `"month"` \| `"year"` | | `params.currency` | `string` | | `params.dryRun?` | `boolean` | | `params.newProductId` | `string` | ###### Returns [#returns-133] `Promise`\<\{ `subscription`: `Subscription` | `null`; `warnings`: [`PlanChangeWarning`](/docs/reference/sdk/routes/subscription#planchangewarning)\[]; }> ###### Inherited from [#inherited-from-125] ```ts ReturnType.swapWorkspacePlan ``` *** ### UserMethods [#usermethods] #### Extends [#extends-5] * `ReturnType`\<*typeof* [`default`](/docs/reference/sdk/routes/user#default)> #### Methods [#methods-5] ##### createAvatar() [#createavatar] ```ts createAvatar(fileData): Promise; ``` Creates a new avatar for the user. ###### Parameters [#parameters-124] | Parameter | Type | Description | | ---------- | ------------------------------------------------------ | ---------------------------------------------------- | | `fileData` | [`FileData`](/docs/reference/sdk/routes/user#filedata) | File metadata (e.g., \{ name, checksum, sizeInMB }). | ###### Returns [#returns-134] `Promise`\<`any`> Object containing signed URL data and updated user info. ###### Inherited from [#inherited-from-126] ```ts ReturnType.createAvatar ``` ##### deleteCurrentUser() [#deletecurrentuser] ```ts deleteCurrentUser(): Promise; ``` Deletes the current user. Requires authentication. ###### Returns [#returns-135] `Promise`\<`void`> ###### Inherited from [#inherited-from-127] ```ts ReturnType.deleteCurrentUser ``` ##### getSelf() [#getself] ```ts getSelf(): Promise; ``` Retrieves the current user's profile. Requires authentication. ###### Returns [#returns-136] `Promise`\<`PublicUser`> The current user's profile. ###### Throws [#throws-3] If no user ID is found in the token. ###### Inherited from [#inherited-from-128] ```ts ReturnType.getSelf ``` ##### getTodos() [#gettodos] ```ts getTodos(): Promise<{ todos: UserTodo[]; }>; ``` Get the current user's active site-level Todos for the onboarding drawer. Returns only todos whose completion condition isn't met and (for dismissibles) that the user hasn't opted out of. Server computes from live state — no caching on the server side, so a fresh call always reflects ground truth. ###### Returns [#returns-137] `Promise`\<\{ `todos`: [`UserTodo`](/docs/reference/sdk/routes/user#usertodo)\[]; }> ###### Inherited from [#inherited-from-129] ```ts ReturnType.getTodos ``` ##### getUser() [#getuser] ```ts getUser(userId): Promise; ``` Retrieves the public profile of a specific user. Requires authentication. ###### Parameters [#parameters-125] | Parameter | Type | Description | | --------- | -------- | ------------------------------- | | `userId` | `string` | The ID of the user to retrieve. | ###### Returns [#returns-138] `Promise`\<`PublicUser`> Public user object. ###### Inherited from [#inherited-from-130] ```ts ReturnType.getUser ``` ##### markSeen() [#markseen] ```ts markSeen(element): Promise; ``` Record that the current user has seen a one-time UI element (welcome video, tutorial coachmark). Idempotent. Returns the updated user. ###### Parameters [#parameters-126] | Parameter | Type | Description | | --------- | -------- | ----------------------------------------------------------------------------- | | `element` | `string` | one-time element key (must be one of the element keys the server recognises). | ###### Returns [#returns-139] `Promise`\<`User`> ###### Inherited from [#inherited-from-131] ```ts ReturnType.markSeen ``` ##### unmarkSeen() [#unmarkseen] ```ts unmarkSeen(elements?): Promise; ``` Remove one-time UI elements from the current user's `hasSeen` so they display again. Pass specific element keys, or omit to clear ALL. Returns the updated user. ###### Parameters [#parameters-127] | Parameter | Type | Description | | ----------- | ----------- | -------------------------------------- | | `elements?` | `string`\[] | elements to remove; omit to clear all. | ###### Returns [#returns-140] `Promise`\<`User`> ###### Inherited from [#inherited-from-132] ```ts ReturnType.unmarkSeen ``` ##### updateAvatar() [#updateavatar] ```ts updateAvatar(fileData): Promise; ``` Updates the user's avatar. ###### Parameters [#parameters-128] | Parameter | Type | Description | | ---------- | ------------------------------------------------------ | ---------------------------------------------------- | | `fileData` | [`FileData`](/docs/reference/sdk/routes/user#filedata) | File metadata (e.g., \{ name, checksum, sizeInMB }). | ###### Returns [#returns-141] `Promise`\<`any`> Object containing signed URL data and updated user info. ###### Inherited from [#inherited-from-133] ```ts ReturnType.updateAvatar ``` ##### updatePreferences() [#updatepreferences] ```ts updatePreferences(preferenceData): Promise; ``` Updates the user's preferences. ###### Parameters [#parameters-129] | Parameter | Type | Description | | ---------------- | -------------------------------------------------------------------- | ----------------------------------------------------------- | | `preferenceData` | [`PreferencesData`](/docs/reference/sdk/routes/user#preferencesdata) | Preference data to update (e.g., \{ hide: \['feedHint'] }). | ###### Returns [#returns-142] `Promise`\<`User`> Updated user object. ###### Inherited from [#inherited-from-134] ```ts ReturnType.updatePreferences ``` ##### updateSelf() [#updateself] ```ts updateSelf(updateData): Promise; ``` Updates the logged-in user's profile. Requires authentication. At least one field must be provided. ###### Parameters [#parameters-130] | Parameter | Type | Description | | ------------ | ------------------------------------------------------------------ | ------------------------------- | | `updateData` | [`UpdateUserData`](/docs/reference/sdk/routes/user#updateuserdata) | The user data fields to update. | ###### Returns [#returns-143] `Promise`\<`User`> The updated user object. ###### Inherited from [#inherited-from-135] ```ts ReturnType.updateSelf ``` *** ### WorkspaceMethods [#workspacemethods] #### Extends [#extends-6] * `ReturnType`\<*typeof* [`default`](/docs/reference/sdk/routes/workspace#default)> #### Methods [#methods-6] ##### createIcon() [#createicon] ```ts createIcon(workspaceId, fileData): Promise; ``` Request signed URL data to upload a workspace icon (the small square shown in sidebars and tabs — distinct from the logo). ###### Parameters [#parameters-131] | Parameter | Type | | ------------- | ----------------------------------------------------------- | | `workspaceId` | `string` | | `fileData` | [`FileData`](/docs/reference/sdk/routes/workspace#filedata) | ###### Returns [#returns-144] `Promise`\<`any`> Response containing signed URL data and workspace info. ###### Inherited from [#inherited-from-136] ```ts ReturnType.createIcon ``` ##### createLogo() [#createlogo-1] ```ts createLogo(workspaceId, fileData): Promise; ``` Request signed URL data to upload a workspace logo. Caller then multipart-uploads the file using the returned `signedUrlData` and calls `client.asset.completeUpload(...)` to finalize. ###### Parameters [#parameters-132] | Parameter | Type | | ------------- | ----------------------------------------------------------- | | `workspaceId` | `string` | | `fileData` | [`FileData`](/docs/reference/sdk/routes/workspace#filedata) | ###### Returns [#returns-145] `Promise`\<`any`> Response containing signed URL data and workspace info. ###### Inherited from [#inherited-from-137] ```ts ReturnType.createLogo ``` ##### createWorkspace() [#createworkspace] ```ts createWorkspace(data): Promise; ``` Creates a new workspace. Requires authentication. ###### Parameters [#parameters-133] | Parameter | Type | Description | | --------- | --------------------------------------------------------------------------------- | --------------- | | `data` | [`CreateWorkspaceData`](/docs/reference/sdk/routes/workspace#createworkspacedata) | Workspace data. | ###### Returns [#returns-146] `Promise`\<`any`> The created workspace object. ###### Inherited from [#inherited-from-138] ```ts ReturnType.createWorkspace ``` ##### deleteWorkspace() [#deleteworkspace] ```ts deleteWorkspace(workspaceId): Promise; ``` Soft-delete a workspace. All nested resources (projects, chats, assets) become inaccessible; bytes are reclaimed by the cleanup cron. ###### Parameters [#parameters-134] | Parameter | Type | Description | | ------------- | -------- | ---------------------------------- | | `workspaceId` | `string` | The ID of the workspace to delete. | ###### Returns [#returns-147] `Promise`\<`any`> Object confirming the status change. ###### Inherited from [#inherited-from-139] ```ts ReturnType.deleteWorkspace ``` ##### getWorkspace() [#getworkspace] ```ts getWorkspace(workspaceId): Promise; ``` Retrieves a specific workspace by its ID. Requires authentication. ###### Parameters [#parameters-135] | Parameter | Type | Description | | ------------- | -------- | ------------------------------------ | | `workspaceId` | `string` | The ID of the workspace to retrieve. | ###### Returns [#returns-148] `Promise`\<`any`> The workspace object. ###### Inherited from [#inherited-from-140] ```ts ReturnType.getWorkspace ``` ##### listProjects() [#listprojects] ```ts listProjects(workspaceId): Promise; ``` List the projects inside a workspace that the calling user has access to. ###### Parameters [#parameters-136] | Parameter | Type | Description | | ------------- | -------- | ------------------------ | | `workspaceId` | `string` | The ID of the workspace. | ###### Returns [#returns-149] `Promise`\<`any`\[]> An array of project objects. ###### Inherited from [#inherited-from-141] ```ts ReturnType.listProjects ``` ##### listWorkspaces() [#listworkspaces] ```ts listWorkspaces(sortParams?): Promise; ``` Lists all workspaces the authenticated user has access to. Requires authentication. ###### Parameters [#parameters-137] | Parameter | Type | Description | | ------------- | --------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `sortParams?` | [`SortParams`](/docs/reference/sdk/routes/workspace#sortparams) | Optional sorting. Keys are field names (`id`, `name`, `createdAt`, `updatedAt`); values are 1 for ascending or -1 for descending. Sent as `?sort[name]=1&sort[createdAt]=-1`. | ###### Returns [#returns-150] `Promise`\<`any`\[]> Workspaces with the caller's `roles` and the workspace `capabilities`. ###### Inherited from [#inherited-from-142] ```ts ReturnType.listWorkspaces ``` ##### updateIcon() [#updateicon] ```ts updateIcon(workspaceId, fileData): Promise; ``` Request signed URL data to replace the workspace icon. Same upload shape as `createIcon`. ###### Parameters [#parameters-138] | Parameter | Type | | ------------- | ----------------------------------------------------------- | | `workspaceId` | `string` | | `fileData` | [`FileData`](/docs/reference/sdk/routes/workspace#filedata) | ###### Returns [#returns-151] `Promise`\<`any`> Response containing signed URL data and workspace info. ###### Inherited from [#inherited-from-143] ```ts ReturnType.updateIcon ``` ##### updateLogo() [#updatelogo-1] ```ts updateLogo(workspaceId, fileData): Promise; ``` Request signed URL data to replace the workspace logo. Same upload shape as `createLogo`; existing logo is replaced once `completeUpload` lands. ###### Parameters [#parameters-139] | Parameter | Type | | ------------- | ----------------------------------------------------------- | | `workspaceId` | `string` | | `fileData` | [`FileData`](/docs/reference/sdk/routes/workspace#filedata) | ###### Returns [#returns-152] `Promise`\<`any`> Response containing signed URL data and workspace info. ###### Inherited from [#inherited-from-144] ```ts ReturnType.updateLogo ``` ##### updateSetting() [#updatesetting-1] ```ts updateSetting( workspaceId, settingName, value ): Promise; ``` Toggle a single workspace boolean setting (e.g. an `enableX` feature flag). ###### Parameters [#parameters-140] | Parameter | Type | Description | | ------------- | --------- | ------------------------------ | | `workspaceId` | `string` | The ID of the workspace. | | `settingName` | `string` | The name of the setting. | | `value` | `boolean` | The new value for the setting. | ###### Returns [#returns-153] `Promise`\<`any`> The updated workspace object with new settings. ###### Inherited from [#inherited-from-145] ```ts ReturnType.updateSetting ``` ##### updateWorkspace() [#updateworkspace] ```ts updateWorkspace(workspaceId, updateData): Promise; ``` Update workspace metadata (name, description, etc.). ###### Parameters [#parameters-141] | Parameter | Type | | ------------- | --------------------------------------------------------------------------------- | | `workspaceId` | `string` | | `updateData` | [`UpdateWorkspaceData`](/docs/reference/sdk/routes/workspace#updateworkspacedata) | ###### Returns [#returns-154] `Promise`\<`any`> The updated workspace object. ###### Inherited from [#inherited-from-146] ```ts ReturnType.updateWorkspace ``` ## Functions [#functions] ### isApiError() [#isapierror] ```ts function isApiError(error): error is ApiError; ``` Narrow an unknown thrown value to an API error carrying an HTTP status. #### Parameters [#parameters-142] | Parameter | Type | | --------- | --------- | | `error` | `unknown` | #### Returns [#returns-155] `error is ApiError` ## References [#references] ### Bot [#bot] Re-exports [Bot](/docs/reference/sdk/routes/bot#bot) *** ### BotApiKeySummary [#botapikeysummary] Re-exports [BotApiKeySummary](/docs/reference/sdk/routes/bot#botapikeysummary) *** ### BotProjectMembership [#botprojectmembership] Re-exports [BotProjectMembership](/docs/reference/sdk/routes/bot#botprojectmembership) *** ### BotProjectRole [#botprojectrole] Re-exports [BotProjectRole](/docs/reference/sdk/routes/bot#botprojectrole) *** ### CreateBotData [#createbotdata] Re-exports [CreateBotData](/docs/reference/sdk/routes/bot#createbotdata) *** ### CreateBotResponse [#createbotresponse] Re-exports [CreateBotResponse](/docs/reference/sdk/routes/bot#createbotresponse) *** ### CreateSupportTicketRequest [#createsupportticketrequest] Re-exports [CreateSupportTicketRequest](/docs/reference/sdk/routes/supportTicket#createsupportticketrequest) *** ### CreateTokenData [#createtokendata] Re-exports [CreateTokenData](/docs/reference/sdk/routes/token#createtokendata) *** ### CreateTokenResponse [#createtokenresponse] Re-exports [CreateTokenResponse](/docs/reference/sdk/routes/token#createtokenresponse) *** ### CreateWebhookData [#createwebhookdata] Re-exports [CreateWebhookData](/docs/reference/sdk/routes/webhook#createwebhookdata) *** ### CreateWebhookResponse [#createwebhookresponse] Re-exports [CreateWebhookResponse](/docs/reference/sdk/routes/webhook#createwebhookresponse) *** ### HealthStatus [#healthstatus] Re-exports [HealthStatus](/docs/reference/sdk/routes/version#healthstatus) *** ### ListDeliveriesParams [#listdeliveriesparams] Re-exports [ListDeliveriesParams](/docs/reference/sdk/routes/webhook#listdeliveriesparams) *** ### ListDeliveriesResponse [#listdeliveriesresponse] Re-exports [ListDeliveriesResponse](/docs/reference/sdk/routes/webhook#listdeliveriesresponse) *** ### RotateBotKeyResponse [#rotatebotkeyresponse] Re-exports [RotateBotKeyResponse](/docs/reference/sdk/routes/bot#rotatebotkeyresponse) *** ### RotateWebhookSecretResponse [#rotatewebhooksecretresponse] Re-exports [RotateWebhookSecretResponse](/docs/reference/sdk/routes/webhook#rotatewebhooksecretresponse) *** ### SupportTicket [#supportticket] Re-exports [SupportTicket](/docs/reference/sdk/routes/supportTicket#supportticket) *** ### SupportTicketListParams [#supportticketlistparams] Re-exports [SupportTicketListParams](/docs/reference/sdk/routes/supportTicket#supportticketlistparams) *** ### SupportTicketListResponse [#supportticketlistresponse] Re-exports [SupportTicketListResponse](/docs/reference/sdk/routes/supportTicket#supportticketlistresponse) *** ### SupportTicketScope [#supportticketscope] Re-exports [SupportTicketScope](/docs/reference/sdk/routes/supportTicket#supportticketscope) *** ### SupportTicketScopeOptions [#supportticketscopeoptions] Re-exports [SupportTicketScopeOptions](/docs/reference/sdk/routes/supportTicket#supportticketscopeoptions) *** ### SupportTicketStatus [#supportticketstatus] Re-exports [SupportTicketStatus](/docs/reference/sdk/routes/supportTicket#supportticketstatus-1) *** ### TestWebhookResponse [#testwebhookresponse] Re-exports [TestWebhookResponse](/docs/reference/sdk/routes/webhook#testwebhookresponse) *** ### TokenKind [#tokenkind] Re-exports [TokenKind](/docs/reference/sdk/routes/token#tokenkind) *** ### TokenScope [#tokenscope] Re-exports [TokenScope](/docs/reference/sdk/routes/token#tokenscope) *** ### TokenSummary [#tokensummary] Re-exports [TokenSummary](/docs/reference/sdk/routes/token#tokensummary) *** ### UpdateBotAvatarFileData [#updatebotavatarfiledata] Re-exports [UpdateBotAvatarFileData](/docs/reference/sdk/routes/bot#updatebotavatarfiledata) *** ### UpdateBotAvatarResponse [#updatebotavatarresponse] Re-exports [UpdateBotAvatarResponse](/docs/reference/sdk/routes/bot#updatebotavatarresponse) *** ### UpdateBotData [#updatebotdata] Re-exports [UpdateBotData](/docs/reference/sdk/routes/bot#updatebotdata) *** ### UpdateWebhookData [#updatewebhookdata] Re-exports [UpdateWebhookData](/docs/reference/sdk/routes/webhook#updatewebhookdata) *** ### UserTodo [#usertodo] Re-exports [UserTodo](/docs/reference/sdk/routes/user#usertodo) *** ### WebhookAttempt [#webhookattempt] Re-exports [WebhookAttempt](/docs/reference/sdk/routes/webhook#webhookattempt) *** ### WebhookAttemptStatus [#webhookattemptstatus] Re-exports [WebhookAttemptStatus](/docs/reference/sdk/routes/webhook#webhookattemptstatus-1) *** ### WebhookEvent [#webhookevent] Re-exports [WebhookEvent](/docs/reference/sdk/routes/webhook#webhookevent) *** ### WebhookSubscription [#webhooksubscription] Re-exports [WebhookSubscription](/docs/reference/sdk/routes/webhook#webhooksubscription) *** ### WebhookSubscriptionStatus [#webhooksubscriptionstatus] Re-exports [WebhookSubscriptionStatus](/docs/reference/sdk/routes/webhook#webhooksubscriptionstatus-1) # SDK reference (/docs/reference/sdk) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Generated from the TypeScript sources of [`@nurama/sdk`](https://www.npmjs.com/package/@nurama/sdk). Start with the [method index](./sdk/method-index) for a task-oriented view, then use the namespace pages for signatures and types. ## Clients [#clients] * [BotClient](/docs/reference/sdk/BotClient) * [NuramaClient](/docs/reference/sdk/NuramaClient) ## Namespaces [#namespaces] Available on both clients as `client.` / `bot.`. * [`ai`](/docs/reference/sdk/routes/ai) * [`asset`](/docs/reference/sdk/routes/asset) * [`auth`](/docs/reference/sdk/routes/auth) * [`blogPosts`](/docs/reference/sdk/routes/blogPosts) * [`board`](/docs/reference/sdk/routes/board) * [`bot`](/docs/reference/sdk/routes/bot) * [`chat`](/docs/reference/sdk/routes/chat) * [`chatAi`](/docs/reference/sdk/routes/chatAi) * [`config`](/docs/reference/sdk/routes/config) * [`convo`](/docs/reference/sdk/routes/convo) * [`credits`](/docs/reference/sdk/routes/credits) * [`device`](/docs/reference/sdk/routes/device) * [`folder`](/docs/reference/sdk/routes/folder) * [`invite`](/docs/reference/sdk/routes/invite) * [`membership`](/docs/reference/sdk/routes/membership) * [`notification`](/docs/reference/sdk/routes/notification) * [`payment`](/docs/reference/sdk/routes/payment) * [`product`](/docs/reference/sdk/routes/product) * [`project`](/docs/reference/sdk/routes/project) * [`public`](/docs/reference/sdk/routes/public) * [`scratch`](/docs/reference/sdk/routes/scratch) * [`settings`](/docs/reference/sdk/routes/settings) * [`shortlink`](/docs/reference/sdk/routes/shortlink) * [`socket`](/docs/reference/sdk/routes/socket) * [`storage`](/docs/reference/sdk/routes/storage) * [`subscription`](/docs/reference/sdk/routes/subscription) * [`supportChat`](/docs/reference/sdk/routes/supportChat) * [`supportTicket`](/docs/reference/sdk/routes/supportTicket) * [`tag`](/docs/reference/sdk/routes/tag) * [`task`](/docs/reference/sdk/routes/task) * [`taskRelation`](/docs/reference/sdk/routes/taskRelation) * [`token`](/docs/reference/sdk/routes/token) * [`user`](/docs/reference/sdk/routes/user) * [`version`](/docs/reference/sdk/routes/version) * [`webhook`](/docs/reference/sdk/routes/webhook) * [`workspace`](/docs/reference/sdk/routes/workspace) # Method index (/docs/reference/sdk/method-index) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} > Method index for `@nurama/sdk` and `@nurama/sdk/bot`, organized for both human readers and AI assistants working in this repo. Use this as the single starting point when building tools, integrations, or bots — most things you'd think to write from scratch already exist as a method here. ## Two clients [#two-clients] * **`NuramaClient`** (`packages/sdk/src/NuramaClient.ts`) — JWT-authenticated, full surface. For server-side code acting on behalf of a user, or admin tooling. * **`BotClient`** (`packages/sdk/src/BotClient.ts`) — bot API key (`nrm_bot_…`), reduced surface (no auth/user-self/payment/subscription/device/bot-administration). Default base URLs are `https://bot.nurama.com` (HTTP) and `https://bot-ws.nurama.com` (WebSocket). Use this from any process running as a bot user. ```js import BotClient from '@nurama/sdk/bot'; const bot = new BotClient(process.env.NURAMA_BOT_API_KEY); ``` Both clients expose the same namespace objects (`bot.chat`, `client.chat`, etc.); the only difference is what's reachable. This document covers the **bot-reachable** subset. Non-bot namespaces (`auth`, `payment`, `subscription`, `device`) are intentionally omitted. ## Conventions [#conventions] * **Read-only** vs **mutating** — flagged on every method. Bots in read-heavy workflows should default to read-only methods unless their purpose is explicitly to write. * **Method names repeat the noun** — `asset.getAsset`, `board.createBoard`, `supportTicket.listSupportTickets`, never `asset.get`. Methods close over the client rather than `this`, so a namespace can be destructured (`const { getAsset, updateAsset } = client.asset`) and names from different namespaces never collide. Verb vocabulary: `get`/`list` for reads, `create`, `update`, `delete`, `add`/`remove` for membership-style changes, and the action name (`follow`, `tag`, `publish`, ...) for actions. * **Methods live in the namespace of the resource in the URL** — `/tasks/{id}/links` is `task.getTaskLinks`, `/public-download/{token}` is `public.resolvePublicDownload`. * **Visibility is an argument** — reads that differ by tier take `visibility: 'creator' | 'reviewer'` (e.g. `project.getAssets(projectId, 'reviewer')`, `project.getHomeFeed`, `project.getFolders`, `project.getProjectChat`, `project.getHighlightedMessages`). Always pass the tier matching the originating chat; never read across tiers. * **Pagination** — methods returning `PaginatedResponse` accept `{ limit, paginate: 'cursor' | 'index', cursor?, page? }`. Cursor pagination is the default for streams; index pagination for fixed-size lists. Backend caps `limit` at 20 in most places. * **Required IDs** — `chatId`, `projectId`, `messageId`, etc. throw if missing. Always pass them. ## Bot-relevant subset (start here) [#bot-relevant-subset-start-here] For most bot tools, you'll want one of these: | Goal | Method | Notes | | -------------------------------------- | ------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- | | Get the chat the bot was @mentioned in | `bot.chat.getChat(chatId)` | Read-only. Returns `chatType`, `topicType`, `topicId`, `visibility`, `participants`. | | Get recent chat history | `bot.chat.getMessages(chatId, params)` | Read-only. `sort: { createdAt: -1 }, limit: 20, excludeReplies: true` is the conventional shape. | | Get one message | `bot.chat.getMessage(messageId)` | Read-only. Used for reply-author lookups. | | Reply in a chat | `bot.chat.createMessage(chatId, { content, assetMentions?, mentions? })` | **Mutating.** Pass `assetMentions: [uuid…]` to render `{{assetMention:UUID}}` tokens as clickable. | | List active assets in a project | `bot.project.getHomeFeed(projectId, visibility, params)` | Read-only. Same shape as the FE feed; pass `chatMessageLimit: 20` to get chat data inline. | | List project members | `bot.membership.getProjectMemberships(projectId, params)` | Read-only. | | Get bot's own memberships | `bot.membership.getMyMemberships()` | Read-only. Used at startup. | | Subscribe to events | `bot.socket.subscribe(channel, event, handler)` | Channels: `/user/{botUserId}`, `/project/{projectId}`, `/project/{projectId}/{visibility}`. | | Emit typing indicator | `bot.socket.emit(channel, 'typing:start', { chatId })` / `typing:stop` | Bot must already be subscribed to `channel`. Server fans out to chat/project channels automatically. | If your tool is doing something that doesn't fit the table above, scan the per-namespace sections below before writing new code. *** ## `bot.chat` — chats and messages [#botchat--chats-and-messages] > Reference: [chat](/docs/reference/sdk/routes/chat) ### Topic chats (auto-created for projects/assets/tasks) [#topic-chats-auto-created-for-projectsassetstasks] * **read** `createTopicChat(data)` — programmatic topic-chat creation (rare; usually auto-created). * **read** `getChatByTopicId(topicId, { topicType, visibility })` — fetch by topic instead of chatId. * **read** `getChat(chatId)` — single chat with metadata + recentMessages refs. * **mutate** `updateChatSubject(chatId, { subject })` * **mutate** `deleteChat(chatId)` — *destructive* ### Member chats (private DMs) [#member-chats-private-dms] * **mutate** `createMemberChat(data)` — start a 1:1 or group chat. * **read** `getUsersMemberChats(params)` — paginated list of bot's member chats. * **read** `getMemberChat(chatId)` — single member chat. * **mutate** `updateMemberChat(chatId, data)` * **mutate** `archiveMemberChat(chatId)` / `unarchiveMemberChat(chatId)` * **mutate** `addMembers(chatId, { memberIds })` / `removeMembers(chatId, { memberIds })` * **read** `getAddableMembers(chatId)` — who can be invited. * **mutate** `updateMemberChatIcon(chatId, fileData)` * **mutate** `deleteMemberChat(chatId)` — *destructive* ### Messages [#messages] * **mutate** `createMessage(chatId, { content, attachments?, mentions?, assetMentions?, folderMentions?, replyToId?, quotes? })` — primary write for bots. * **read** `getMessages(chatId, { limit, sort, excludeReplies, contentSearch?, authorId?, hasAttachments?, hasAnnotations?, highlighted?, type? })` — paginated. * **read** `getMessage(messageId, { replies? })` * **mutate** `reviseMessage(messageId, data)` * **mutate** `deleteMessage(messageId)` — *destructive* * **read** `getReplies(messageId, params)` * **read** `getMessagePage(messageId, params)` — find which page a message is on. * **mutate** `addAttachments(messageId, attachments)` / `removeAttachment(messageId, assetId)` * **read** `getMentions(params)` — bot's @-mentions across chats. * **mutate** `createReaction(messageId, { emoji })` / `removeReaction(messageId)` * **mutate** `highlightMessage(messageId)` / `unhighlightMessage(messageId)` * **mutate** `createMessageShortLink(messageId)` — returns `{ code, shortUrl }`. * **read** `fetchLinkPreviews({ urls })` ### Mentionable resources (chat-scoped autocomplete) [#mentionable-resources-chat-scoped-autocomplete] * **read** `getMentionableAssets(chatId, params)` — assets reachable from this chat. * **read** `getMentionableFolders(chatId, params)` ### Summaries + chat following [#summaries--chat-following] * **mutate** `generateSummary(chatId, data)` — generate an AI summary of recent activity. * **read** `getSummaries(chatId, params)` * **mutate** `followChat(chatId)` / `unfollowChat(chatId)` ### Asset chat shortcut [#asset-chat-shortcut] * **mutate** `createAssetChatAndMessage(assetId, visibility, data, params)` — create a chat (if absent) and post a message in one call. *** ## `bot.project` — projects, assets-in-project, submissions, file system [#botproject--projects-assets-in-project-submissions-file-system] > Reference: [project](/docs/reference/sdk/routes/project) (the largest namespace) ### Project CRUD [#project-crud] * **read** `getProjects()` — bot's accessible projects (also see `bot.workspace.listProjects(workspaceId)`). * **read** `getProject(projectId)` * **mutate** `createProject(data)` / `updateProject(projectId, data)` / `deleteProject(projectId)` * **mutate** `createLogo(projectId, fileData)` / `updateLogo(projectId, fileData)` ### Assets in a project (visibility-scoped) [#assets-in-a-project-visibility-scoped] * **read** `getAssets(projectId, visibility, params)` — flat lists, no chat data. * **read** `getHomeFeed(projectId, visibility, params)` — assets *with* their chat data inline. **This is what the FE uses.** Pass `chatMessageLimit: 20`, `mediaTypes: ['image','video','audio']` to mirror the FE feed. * **read** `getHomeFeed(projectId, visibility, params)` — visibility-parameterized version. * **mutate** `createAssets(projectId, fileUploadBody)` — initiate uploads. ### Folders [#folders] * **read** `getFolders(projectId, visibility, params)` * **read** `getFolders(projectId, visibility, params)` * **mutate** `createFolder(projectId, visibility, data)` ### Project chats [#project-chats] * **read** `getProjectChat(projectId, visibility, params)` ### File-system path operations (visibility-scoped) [#file-system-path-operations-visibility-scoped] * **read** `getItemsAtPath(projectId, visibility, path, params, usePost?)` * **mutate** `moveItemsToPath(projectId, visibility, data)` / `copyItemsToPath` / `deleteItemsAtPath` — *destructive* ### Submissions [#submissions] * **mutate** `createSubmission(projectId, data)` * **read** `getSubmissions(projectId, params)` / `getSubmission(projectId, submissionId, params)` * **read** `getSubmissionAssets(projectId, submissionId, params)` * **read** `getSubmissionItems(projectId, submissionId, path?, params)` * **mutate** `addItemsToSubmission` / `updateSubmission` / `tagSubmission` / `untagSubmission` * **mutate** `createSubmissionFolder` / `moveSubmissionItems` / `copySubmissionItems` / `deleteSubmissionItems` — *destructive last one* ### Publishing [#publishing] * **mutate** `publishItems(projectId, data)` / `unpublishItems(projectId, data)` ### Public file systems (shareable links) [#public-file-systems-shareable-links] * **read** `getPublicFileSystems(projectId, params)` / `getPublicFileSystem(projectId, publicId)` / `getPublicAudit(...)` * **mutate** `createPublicFileSystem(projectId, data)` / `updatePublicFileSystem` / `deletePublicFileSystem` * **mutate** `addItemsToPublicFileSystem` / `getPublicItemsAtPath` / `movePublicItemsAtPath` / `copyPublicItemsAtPath` / `deletePublicItemsAtPath` *** ## `bot.asset` — single-asset operations [#botasset--single-asset-operations] > Reference: [asset](/docs/reference/sdk/routes/asset) * **read** `getAsset(assetId, { includeChats? })` * **mutate** `updateAsset(assetId, data)` / `deleteAsset(assetId)` — *destructive last one* * **read** `getFile(assetId, fileId)` — file metadata. * **read** `getFilesByFunctionType(assetId, functionType)` — e.g. `'thumbnail'`, `'original'`, `'media'`. * **read** `getAssetPage(assetId, params)` — find which page in a list this asset appears on. * **mutate** `tagAsset(assetId, data)` / `untagAsset(assetId, data)` * **mutate** `multipartUpload(...)` / `completeMultipartUpload(uploadData)` — file upload pipeline. * **mutate** `repairAssets(assetIds)` — re-trigger post-processing. * **read** `downloadAssets(assetIds)` — returns signed download URLs. * **mutate** `createShortLink(assetId, data?)` * **mutate** `createPublicLink(...)` / `updatePublicLink(...)` / `disablePublicLink` / `reactivatePublicLink` * **read** `getPublicLinks(assetId)` *** ## `bot.folder` — single-folder operations [#botfolder--single-folder-operations] > Reference: [folder](/docs/reference/sdk/routes/folder) * **read** `getFolder(folderId)` / `getFoldersAssets(folderId, params)` * **mutate** `updateFolder(folderId, data)` / `updateFolderName(folderId, { name })` / `updateFolderIcon(folderId, data)` * **mutate** `deleteFolder(folderId)` — *destructive* * **mutate** `tagFolder(folderId, data)` / `untagFolder(folderId, data)` *** ## `bot.membership` — who has access to what [#botmembership--who-has-access-to-what] > Reference: [membership](/docs/reference/sdk/routes/membership) * **read** `getMyMemberships()` — for the bot user. Used at startup to derive the bot's projects. * **read** `getWorkspaceMemberships(workspaceId, params)` / `getProjectMemberships(projectId, params)` — paginated, supports `nameSearch` and `billable` filters. * **read** `getProjectMentionableUsers(projectId, visibility)` — autocomplete for @mentions. * **read** `getWorkspaceLastSeen(workspaceId, { userIds })` / `getProjectLastSeen(projectId, { userIds })` — bulk last-active timestamps (1–100 users). * **mutate** `addRole(data)` / `removeRole(data)` — *privileged; bot needs admin scope*. * **mutate** `deleteMembership(membershipId)` / `leaveResource(resourceId)` — *destructive* *** ## `bot.notification` — historical notifications [#botnotification--historical-notifications] > Reference: [notification](/docs/reference/sdk/routes/notification) * **read** `getNotifications(data)` — paginated by channels/types. * **read** `getNewNotifications(data)` — unread since last seen. * **read** `getNewNotificationCount(data)` / `getNewNotificationCountBulk(data)` — counts only. * **read** `getUsersLastNotificationsSeen(data)` — last-seen timestamp per channel/type. * **mutate** `updateUsersLastSeen(data)` — mark seen. For real-time notifications, use `bot.socket.subscribe` instead. *** ## `bot.task` — tasks and acknowledgement [#bottask--tasks-and-acknowledgement] > Reference: [task](/docs/reference/sdk/routes/task) * **read** `getMyTasks(params)` — bot's tasks; filter by `projectId`, `creatorId`, `relatedToId`, `visibility`, `acknowledged`. * **mutate** `updateTaskStatus(taskId, { status })` — `pending` / `inProgress` / `complete` / `cancelled`. * **mutate** `acknowledgeTask(taskId)` — clears the unacknowledged flag. * **read** `getUnacknowledgedTaskCount(projectId)` / `getTaskEvents(taskId, params)` *** ## `bot.user` — user profiles [#botuser--user-profiles] > Reference: [user](/docs/reference/sdk/routes/user) * **read** `getUser(userId)` — public profile (sanitized). * **read** `getSelf()` — bot's own profile. * **mutate** `updateSelf(data)` / `updatePreferences(data)` / `createAvatar(fileData)` / `updateAvatar(fileData)` — bot self-administration. *** ## `bot.workspace` — workspaces and their projects [#botworkspace--workspaces-and-their-projects] > Reference: [workspace](/docs/reference/sdk/routes/workspace) * **read** `getWorkspace(workspaceId)` / `listWorkspaces(sortParams)` / `listProjects(workspaceId)` * **mutate** `createWorkspace(data)` / `updateWorkspace(workspaceId, data)` / `updateSetting(workspaceId, name, value)` * **mutate** `deleteWorkspace(workspaceId)` — *destructive* * **mutate** Logo/icon CRUD: `createLogo` / `updateLogo` / `createIcon` / `updateIcon` *** ## `bot.board` — kanban boards [#botboard--kanban-boards] > Reference: [board](/docs/reference/sdk/routes/board) * **read** `getProjectBoards(projectId, params)` / `getProjectTasks(projectId, params)` / `getBoard(boardId)` / `getBoardTasks(...)` / `getTaskLinks(taskId)` * **mutate** `createBoard` / `updateBoard` / `deleteBoard` — *destructive last* * **mutate** Column ops: `addColumn` / `reorderColumns` / `updateColumn` / `deleteColumn` * **mutate** Task ops: `createBoardTask` / `addExistingTaskToBoard` / `moveTask` / `removeTaskFromBoard` / `updateTaskDetails` * **mutate** Linking: `linkTask(taskId, data)` / `unlinkTask(taskId, linkedTaskId)` * **mutate** Tagging: `tagBoard` / `untagBoard` / `tagTask` / `untagTask` *** ## `bot.convo` — live conversations [#botconvo--live-conversations] > Reference: [convo](/docs/reference/sdk/routes/convo) * **mutate** `startConvo(data)` / `joinConvo(convoId)` / `rejoinConvo` / `leaveConvo` / `completeConvo` / `deleteConvo` / `updateConvo` * **read** `getConvo(convoId)` / `getScopeConvos(...)` *** ## `bot.public` — public file system access [#botpublic--public-file-system-access] > Reference: [public](/docs/reference/sdk/routes/public) For when bots interact with publicly shared content via tokens. * **read** `getPublicFileSystem(token)` / `getPublicItems(token, params)` / `getPublicItemsAtPath(token, path, params)` / `getPublicAsset(token, assetId)` / `getPublicChat(token, chatId?)` / `getPublicChatMessages(...)` * **mutate** `createPublicChatMessage(...)` / `createPublicTopicChatMessage(...)` / `createPublicAssetChatMessage(...)` * **read** `downloadAssets(token, data)` — public signed downloads. *** ## `bot.shortlink` [#botshortlink] > Reference: [shortlink](/docs/reference/sdk/routes/shortlink) * **read** `resolveShortLink(code)` — returns the canonical resource the link points to. * **read** `resolvePublicDownload(token)` / `getPublicDownloadUrl(token)` *** ## `bot.tag` — workspace tags [#bottag--workspace-tags] > Reference: [tag](/docs/reference/sdk/routes/tag) * **mutate** `createTag(data)` / `updateTag(tagId, data)` / `deleteTag(tagId)` * **read** `getTags(...)` *** ## `bot.invite` — invitations [#botinvite--invitations] > Reference: [invite](/docs/reference/sdk/routes/invite) * **mutate** `inviteUser(data)` / `acceptInvite(inviteId)` / `cancelInvite(inviteId)` / `resendInvite(inviteId)` * **read** `getInvites(params)` / `getInviteById(inviteId)` / `getInvitesForResource(resourceId, params)` *** ## `bot.settings` — resource settings [#botsettings--resource-settings] > Reference: [settings](/docs/reference/sdk/routes/settings) * **read** `getEffectiveSettings(...)` — resolved with inheritance. * **read** `getResourceSettings(...)` / `getAllResourceSettings()` * **mutate** `updateResourceSettings(...)` / `resetResourceSettings(...)` / `cleanupOrphanedSettings()` *** ## `bot.storage` — storage usage [#botstorage--storage-usage] > Reference: [storage](/docs/reference/sdk/routes/storage) * **read** `getStorageChart(...)` / `getStorageRecord(...)` *** ## `bot.socket` — real-time events [#botsocket--real-time-events] > Reference: [socket](/docs/reference/sdk/routes/socket) * `connect(channel, options)` / `connectPublic(publicToken, options)` — establish a Socket.IO namespace connection. * `subscribe(channel, event, handler)` / `subscribePublic(publicToken, event, handler)` — most bots use this directly; auto-connects. * `unsubscribe(channel, event, handler)` * `disconnect(channel)` / `disconnectAll()` * `emit(channel, event, data)` — publish on a connected channel (typing indicators, collab events). * `isConnected(channel)` / `onReconnectFailed(channel, callback)` ### Channel patterns [#channel-patterns] * `/user/{userId}` — personal channel: chatMention notifications, member-chat fan-out. * `/project/{projectId}` — project-wide events. * `/project/{projectId}/{visibility}` — visibility-scoped events: `chatCreateMessage` for topic chats fans out here. Subscribe to both `creator` and `reviewer` if the bot's role spans both tiers. * `/chat/{chatId}` — followers-only stream for one chat. * `/public/{publicToken}` — public file-system events. ### Event types you'll encounter [#event-types-youll-encounter] * `chatMention` — bot was @-mentioned. `tokens: { chatId, messageId, mentions, message }`. * `chatCreateMessage` — any new message in a chat the bot has visibility on. Includes the full message at `changes.create[].resource`. * `chatReviseMessage` / `chatDeleteMessage` / `chatRefreshMessage` / `chatRemoveAttachment` * `convoStart` / `convoJoin` / `convoLeave` / `convoComplete` / `convoDelete` / `convoUpdate` * `assetStatusUpdate` / `assetFileUpdate` * `userAvatarUpdate` / `userPublicUpdate` * `taskCreate` / `taskUpdate` ### Server-listened events (emit from bot) [#server-listened-events-emit-from-bot] * `typing:start { chatId }` / `typing:stop { chatId }` — server resolves fanout from `chatId`; bot must be authenticated on the channel it emits from. *** # ai (/docs/reference/sdk/routes/ai) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### ComposeWithNuRequest [#composewithnurequest] #### Properties [#properties] | Property | Type | Description | | ------------------------------------ | -------------------------------------------- | ---------------------------------------------------------------- | | `chatId` | `string` | Chat being composed into. Read server-side for context and tone. | | `messages` | [`ComposeWithNuTurn`](#composewithnuturn)\[] | - | | `projectId?` | `string` | - | | `workspaceId` | `string` | - | *** ### ComposeWithNuResponse [#composewithnuresponse] #### Properties [#properties-1] | Property | Type | Description | | ---------------------------------------- | ------------------ | ------------------------------------------------------------------------ | | `balanceAfter` | `number` \| `null` | - | | `billedCredits` | `number` | - | | `eventId` | `string` \| `null` | - | | `proposal` | `string` \| `null` | Wording the user may put in their composer, or null for a pure question. | | `text` | `string` | What Nu said to the user. Never posted anywhere. | *** ### ComposeWithNuTurn [#composewithnuturn] One turn of the drafting conversation, as sent back on each request. #### Properties [#properties-2] | Property | Type | Description | | --------------------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `proposal?` | `string` \| `null` | Wording this turn offered. Held per turn so an earlier draft stays takeable after the conversation has moved on — the user may prefer the version from three turns ago. | | `role` | `"user"` \| `"assistant"` | - | | `text` | `string` | - | *** ### CreateRevisionSourceUploadRequest [#createrevisionsourceuploadrequest] Source-upload mint request. Returns a multipart upload bundle that the caller drives like any other scratch / asset upload (PUT each `urls[i]` with the corresponding part, collect the ETags, then call `nuramaClient.scratch.completeUpload`). The server always records the upload as `image/jpeg` — the only supported source is a captured video frame, which is always JPEG. Size cap: 25 MB (the image provider's per-image limit). #### Properties [#properties-3] | Property | Type | Description | | -------------------------------------- | -------- | ---------------------------------------------- | | `assetId?` | `string` | Audit-only lineage — the originating asset id. | | `projectId?` | `string` | - | | `sizeInMB` | `number` | - | | `workspaceId` | `string` | - | *** ### CreateRevisionSourceUploadResponse [#createrevisionsourceuploadresponse] #### Properties [#properties-4] | Property | Type | Description | | -------------------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------- | | `expires` | `string` | ISO timestamp. The scratch upload expires and is removed after this. | | `key` | `string` | Storage key for the upload. Pass to `nuramaClient.asset.multipartUpload`, which echoes it in its progress and result shapes. | | `scratchId` | `string` | Use as `source.scratchId` on the subsequent `generateRevision` call. | | `uploadId` | `string` | Pass to `nuramaClient.scratch.completeUpload` along with the parts. | | `urls` | `string`\[] | One signed PUT URL per multipart part. Single-element array for sub-chunk-size payloads (1080p JPEG frames are well under). | *** ### GeneratedTask [#generatedtask] #### Properties [#properties-5] | Property | Type | | ------------------------------------ | -------- | | `description` | `string` | | `subject` | `string` | *** ### GenerateImageRevisionRequest [#generateimagerevisionrequest] #### Properties [#properties-6] | Property | Type | Description | | --------------------------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `assetId?` | `string` | Audit-only — the caller has already resolved the asset's media URL. | | `jobId?` | `string` | Groups all revisions from one modal session. | | `mask?` | \{ `dataUrl`: `string`; } | Optional alpha-channel mask PNG (data URL) matching the source image's dimensions. Transparent pixels mark the edit region; opaque pixels are preserved. When supplied, the server forwards it as OpenAI's top-level `mask` field — NOT as another `references[]` entry — and auto-augments the prompt with a region directive. | | `mask.dataUrl` | `string` | - | | `projectId?` | `string` | - | | `prompt` | `string` | - | | `references?` | `string`\[] | Prior revisions to condition on (public URLs or data URLs). | | `source` | [`ImageRevisionSource`](#imagerevisionsource) | - | | `sourceAspect?` | `number` | Source image's aspect ratio (width / height). Two effects when set: 1. The server picks the closest OpenAI-supported generation size — landscape, portrait, or square — instead of always generating 1024×1024. Reduces the gap between the model's output aspect and the source aspect before any padding. 2. After generation, the server pads the result with black bars (letterbox/pillarbox) so the final bytes exactly match this aspect. The user gets an output image whose framing matches the input they started from, with the generated content centred and the unfilled edges padded. Omit (or pass `1.0`) for legacy square output. | | `workspaceId` | `string` | - | *** ### GenerateImageRevisionResponse [#generateimagerevisionresponse] #### Properties [#properties-7] | Property | Type | Description | | ------------------------------------------ | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `balanceAfter` | `number` \| `null` | - | | `billedCredits` | `number` | - | | `eventId` | `string` \| `null` | - | | `model` | `string` | - | | `quality` | `string` | - | | `revisionId` | `string` | Scratch id of the generated revision. Use it in one of two ways: - "Upload to project" → call `nuramaClient.scratch.promote(id)` to materialise it as a project-scoped Asset. - "Attach to chat" → pass `{ scratchId }` as a chat-message attachment item; the chat-send endpoint promotes it to a chat-scoped Asset at send time. | | `revisionUrl` | `string` \| `null` | Public URL of the revision, ready to render directly. | *** ### GenerateTasksRequest [#generatetasksrequest] #### Properties [#properties-8] | Property | Type | Description | | --------------------------------------------- | ------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `contextMessages?` | [`TaskGenerationContextMessage`](#taskgenerationcontextmessage)\[] | Preceding chat messages (oldest first) to give the model conversational lead-in. Server caps at 10 messages and trims long content per-message; the focal `messageText` is the actual instruction. | | `messageId?` | `string` | Optional source chat message id — reserved for future audit linking. | | `messageText` | `string` | - | | `projectId` | `string` | - | | `workspaceId` | `string` | - | *** ### GenerateTasksResponse [#generatetasksresponse] #### Properties [#properties-9] | Property | Type | | ------------------------------------------ | ------------------------------------ | | `balanceAfter` | `number` | | `billedCredits` | `number` | | `eventId` | `string` \| `null` | | `tasks` | [`GeneratedTask`](#generatedtask)\[] | *** ### ListTonesResponse [#listtonesresponse] #### Properties [#properties-10] | Property | Type | | ------------------------ | ---------------------------- | | `tones` | [`ToneEntry`](#toneentry)\[] | *** ### PolishRequest [#polishrequest] #### Properties [#properties-11] | Property | Type | | -------------------------------------- | -------- | | `projectId?` | `string` | | `text` | `string` | | `toneId` | `string` | | `workspaceId` | `string` | *** ### PolishResponse [#polishresponse] #### Properties [#properties-12] | Property | Type | | ------------------------------------------ | ------------------ | | `balanceAfter` | `number` | | `billedCredits` | `number` | | `eventId` | `string` \| `null` | | `polishedText` | `string` | *** ### SubmitAiFeedbackRequest [#submitaifeedbackrequest] One Nu Feedback submission. #### Properties [#properties-13] | Property | Type | Description | | --------------------------------------- | --------------------------------- | ------------------------------------------------------------------- | | `chatId` | `string` | - | | `contextItems?` | `Record`\<`string`, `unknown`>\[] | - | | `messageId?` | `string` | - | | `notes?` | `string` | The user's own words on what worked or didn't. Optional. | | `pageContext?` | `Record`\<`string`, `unknown`> | Extras the client already holds, folded into the stored snapshot. | | `projectId?` | `string` | - | | `rating` | `"positive"` \| `"negative"` | - | | `surface` | `"chat"` \| `"assist"` | Which AI surface produced the reply — the two are tuned separately. | | `workspaceId?` | `string` | - | *** ### TaskGenerationContextMessage [#taskgenerationcontextmessage] #### Properties [#properties-14] | Property | Type | Description | | ----------------------------------- | -------- | --------------------------------------------------------------------- | | `authorName?` | `string` | Display name of the message author. Optional but improves the prompt. | | `content` | `string` | - | *** ### ToneEntry [#toneentry] #### Properties [#properties-15] | Property | Type | | ------------------------ | -------- | | `id` | `string` | | `label` | `string` | ## Type Aliases [#type-aliases] ### ImageRevisionSource [#imagerevisionsource] ```ts type ImageRevisionSource = | { url: string; } | { scratchId: string; } | { dataUrl: string; }; ``` Source for an image revision call. Exactly one of: * `url` — public media URL (typical for image assets). * `scratchId` — id of a scratch upload created via `createRevisionSourceUpload`. Preferred for captured video frames: the bytes go straight to storage instead of through the request body. * `dataUrl` — DEPRECATED: a captured video frame serialised as a base64 data URL inline in the request body. Kept for backward compatibility only; new code should always use the `scratchId` flow. ## Functions [#functions] ### default() [#default] ```ts function default(client): { composeWithNu: Promise; createRevisionSourceUpload: Promise; generateRevision: Promise; generateTasks: Promise; listTones: Promise; polish: Promise; submitFeedback: Promise<{ id: string; }>; }; ``` Methods for the Nu AI assistant integration points. Nu is the platform-native AI feature set. Each integration point is gated by workspace settings (`allowAiFeatures` master switch + per-feature toggle * role allowlist) and metered against the workspace's credit balance. MVP exposes a single integration point — Polish — used by the chat composer to rewrite a draft message in a selected tone. #### Parameters [#parameters] | Parameter | Type | | --------- | ----------------------------------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | #### Returns [#returns] | Name | Type | Description | | ------------------------------ | --------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `composeWithNu()` | (`data`) => `Promise`\<[`ComposeWithNuResponse`](#composewithnuresponse)> | One turn of a Compose-with-Nu drafting conversation. Send only the drafting thread — the chat being written into is read server-side from `chatId`, under the caller's own permissions. The result is Nu's commentary plus, when it has one, a proposed message. Nothing is posted: the proposal is the user's to take or discard. | | `createRevisionSourceUpload()` | (`data`) => `Promise`\<[`CreateRevisionSourceUploadResponse`](#createrevisionsourceuploadresponse)> | Mint a signed-URL bundle for uploading a source image (typically a captured video frame) into Scratch BEFORE calling `generateRevision`. Use the resulting `scratchId` as the `source.scratchId` on the generate call. Why this exists: video frames are captured client-side and need to reach OpenAI as a public media URL. Posting the bytes inline (as `dataUrl`) makes the API node a pass-through for multi-MB payloads; staging on Scratch first keeps the node out of the byte path entirely. | | `generateRevision()` | (`data`) => `Promise`\<[`GenerateImageRevisionResponse`](#generateimagerevisionresponse)> | Generate one image revision (prompt-driven variant of a source image or video frame). The result is staged as a scratch upload — the caller then chooses one of two outcomes: - "Add to project" → call `nuramaClient.scratch.promote(id)` to create a project-scoped Asset immediately. - "Attach to chat" → pass `{ scratchId, name? }` as an item in the chat message's `attachments[]`; the server promotes each one to a chat-scoped Asset at send time. | | `generateTasks()` | (`data`) => `Promise`\<[`GenerateTasksResponse`](#generatetasksresponse)> | Convert a chat message into one or more board-task drafts. The response's `tasks` array holds the drafts for the user to review and edit before creating them (for example with `nuramaClient.task.bulkCreate`). Requires both the AI add-on AND the Boards add-on on the workspace; the server returns `productNotActive` if either is missing. | | `listTones()` | () => `Promise`\<[`ListTonesResponse`](#listtonesresponse)> | Returns the catalogue of polish tones the platform supports. Use it to populate a tone picker instead of hard-coding the ids. | | `polish()` | (`data`) => `Promise`\<[`PolishResponse`](#polishresponse)> | - | | `submitFeedback()` | (`data`) => `Promise`\<\{ `id`: `string`; }> | Record a thumbs-up / thumbs-down on one assistant reply. `chatId` is required because it is what the server authorises against — a user can only rate a reply in a chat they can already read — and it is what the stored transcript snapshot is built from. | # asset (/docs/reference/sdk/routes/asset) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### AssetWithChats [#assetwithchats] #### Extends [#extends] * `Omit`\<`Asset`, `"chats"`> #### Properties [#properties] | Property | Type | Description | Inherited from | | ----------------------------------------------------------------- | ------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | | `aiGenerated?` | `boolean` | True when the bytes were produced by a platform AI process (e.g. promoted from an `aiRevision` scratch row). Drives the "AI Generated" system chip in the asset view; also queryable for admin filtering. Distinct from user tags — set at create/promote time, not editable. | `Omit.aiGenerated` | | `chats?` | \{ `creator?`: [`Chat`](#chat); `reviewer?`: [`Chat`](#chat); } | - | - | | `chats.creator?` | [`Chat`](#chat) | - | - | | `chats.reviewer?` | [`Chat`](#chat) | - | - | | `checksum` | `string` | MD5 checksum of original file. **Format** md5 | `Omit.checksum` | | `checksumAlgorithm?` | `"md5"` | The algorithm used for computing the checksum. | `Omit.checksumAlgorithm` | | `createdAt?` | `number` | The timestamp when the asset was created. **Format** int64 | `Omit.createdAt` | | `creator?` | `PublicUser` | Public user information of the creator. | `Omit.creator` | | `creatorId` | `string` | The ID of the user who created the asset. **Format** objectId | `Omit.creatorId` | | `everPublic?` | `boolean` | One-way flag set true once the asset has been publicly exposed (link or file system) at any point. | `Omit.everPublic` | | `expectedUploadSizeInMB` | `number` | Expected upload size of the asset in megabytes, used to determine signed link generation. | `Omit.expectedUploadSizeInMB` | | `files?` | `File`\[] | The files associated with the asset. | `Omit.files` | | `fileSystemPaths?` | `string`\[] | Array of file system entry IDs associated with this asset. **Format** objectId | `Omit.fileSystemPaths` | | `folder?` | `string` \| `Folder` \| `null` | Populated folder data. | `Omit.folder` | | `folderId?` | `string` \| `null` | If the asset is in a folder the folder ID goes here. If not this is null. **Format** objectId **Default** `null` | `Omit.folderId` | | `functionType` | `"avatar"` \| `"attachment"` \| `"media"` \| `"logo"` \| `"icon"` | The function of the asset on the platform. | `Omit.functionType` | | `hasActivePublicFileSystem?` | `boolean` | True when the asset is a member of at least one active, non-expired public file system. | `Omit.hasActivePublicFileSystem` | | `hasActivePublicLink?` | `boolean` | True when the asset has at least one active public download link. | `Omit.hasActivePublicLink` | | `id` | `string` | The id of the asset. **Format** objectId | `Omit.id` | | `inheritance?` | `any` | Populated inheritance data. | `Omit.inheritance` | | `inheritanceId?` | `string` \| `null` | ID of the inheritance object associated with this asset. **Format** objectId | `Omit.inheritanceId` | | `keyPath` | `string` | Storage path of the asset's original file, relative to the storage root. | `Omit.keyPath` | | `mediaType` | `"image"` \| `"video"` \| `"audio"` \| `"file"` \| `"3d"` \| `"document"` | The media type of the asset. | `Omit.mediaType` | | `meta?` | `Record`\<`string`, `any`> | Additional metadata for the asset. **Default** `{}` | `Omit.meta` | | `name` | `string` | The name of the asset used on the platform. | `Omit.name` | | `ownerResourceId` | `string` | The id of the resource that the asset is attached to. **Format** objectId | `Omit.ownerResourceId` | | `ownerResourceType` | `"project"` \| `"chatMessage"` \| `"user"` | The type of the owner resource. | `Omit.ownerResourceType` | | `publishedOn?` | `string` \| `null` | The date when the asset was published. If not published, this will be null. **Format** date-time **Default** `null` | `Omit.publishedOn` | | `publisher?` | `PublicUser` | Public user information of the publisher (if published). | `Omit.publisher` | | `publisherId?` | `string` \| `null` | The ID of the user who published the asset (if published). **Format** objectId **Default** `null` | `Omit.publisherId` | | `sizeInBytes` | `number` | The total size of the asset in bytes. | `Omit.sizeInBytes` | | `slug?` | `string` | The URL-friendly slug of the asset name. | `Omit.slug` | | `status` | `"active"` \| `"pendingDelete"` \| `"inactive"` | The status of the asset. **Default** `active` | `Omit.status` | | `submissionFileSystemIds?` | `string`\[] | Submission file system IDs the asset currently belongs to. Empty when not in any submission. | `Omit.submissionFileSystemIds` | | `tags?` | `string`\[] | Tags associated with the asset. **Format** objectId | `Omit.tags` | | `updatedAt?` | `number` | The timestamp when the asset was last updated. **Format** int64 | `Omit.updatedAt` | | `visibility?` | (`"creator"` \| `"reviewer"` \| `"member"` \| `"public"`)\[] | The visibility settings for the asset. **Default** `['creator']` | `Omit.visibility` | *** ### Chat [#chat] #### Properties [#properties-1] | Property | Type | | ------------------------------------------- | -------- | | `_id?` | `string` | | `id?` | `string` | | `recentMessages?` | `any`\[] | | `totalMessages?` | `number` | *** ### CompleteMultipartUploadData [#completemultipartuploaddata] #### Properties [#properties-2] | Property | Type | | ------------------------------ | ------------------------------------------------- | | `assetId` | `string` | | `key` | `string` | | `parts` | \{ `ETag`: `string`; `PartNumber`: `number`; }\[] | | `uploadId` | `string` | *** ### CreateAssetShortLinkData [#createassetshortlinkdata] #### Properties [#properties-3] | Property | Type | | ------------------------------------- | --------------------------- | | `visibility?` | `"creator"` \| `"reviewer"` | *** ### CreateAssetShortLinkResponse [#createassetshortlinkresponse] #### Properties [#properties-4] | Property | Type | | -------------------------------- | --------------------------- | | `shortLink` | [`ShortLink`](#shortlink-1) | | `shortUrl` | `string` | *** ### DocumentViewUrlResponse [#documentviewurlresponse] #### Properties [#properties-5] | Property | Type | Description | | ------------------------------------------------ | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `expires` | `number` | Unix seconds. Refetch rather than reusing a URL past this. | | `originalPageCount` | `number` | Pages in the source document. Equals `pageCount` unless truncated. | | `pageCount` | `number` | From `meta.document.pageCount`; 0 when processing has not reported it. | | `pagesTruncated` | `boolean` | True when the `media` PDF holds only the first `pageCount` pages of a longer document, because post-processing hit its `maxPages` cap. The PDF itself is internally consistent, so this flag is the only way to know. | | `truncatedFrom` | `"start"` \| `"end"` | Which end of the document the `media` PDF kept. `'start'` for everything read front-to-back; `'end'` for logs, whose newest lines are at the bottom. Only meaningful when `pagesTruncated` is true. | | `url` | `string` | Signed URL for the document's `media` PDF, served inline. | *** ### GetAssetPageParams [#getassetpageparams] #### Properties [#properties-6] | Property | Type | | ------------------------------------- | -------------------------------- | | `inFolder?` | `boolean` | | `limit?` | `number` | | `sort?` | `Record`\<`string`, `-1` \| `1`> | | `visibility?` | `string` | *** ### GetAssetParams [#getassetparams] #### Properties [#properties-7] | Property | Type | | ----------------------------------------------- | --------------------------- | | `chatMessageLimit?` | `number` | | `chatMessageSort?` | \{ `id?`: `1` \| `-1`; } | | `chatMessageSort.id?` | `1` \| `-1` | | `chatReplyLimit?` | `number` | | `chatReplySort?` | \{ `id?`: `1` \| `-1`; } | | `chatReplySort.id?` | `1` \| `-1` | | `chatVisibility?` | `"creator"` \| `"reviewer"` | *** ### MultipartUploadOptions [#multipartuploadoptions] #### Properties [#properties-8] | Property | Type | | ----------------------------------------------------------------- | ---------------------- | | `abortSignal?` | `AbortSignal` | | `assetId?` | `string` | | `enableProgressPersistence?` | `boolean` | | `fileName?` | `string` | | `fileSize?` | `number` | | `maxRetries?` | `number` | | `onProgress?` | (`progress`) => `void` | | `projectId?` | `string` | | `sessionId?` | `string` | *** ### MultipartUploadResult [#multipartuploadresult] #### Properties [#properties-9] | Property | Type | | -------------------------------- | ------------------------------------------------- | | `key` | `string` | | `parts` | \{ `ETag`: `string`; `PartNumber`: `number`; }\[] | | `uploadId` | `string` | *** ### PartUploadOptions [#partuploadoptions] #### Properties [#properties-10] | Property | Type | | ------------------------------------------- | ---------------------- | | `abortSignal?` | `AbortSignal` | | `maxRetries?` | `number` | | `onPartProgress?` | (`progress`) => `void` | *** ### PublicAssetLink [#publicassetlink] #### Properties [#properties-11] | Property | Type | Description | | ---------------------------------- | ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `assetId` | `string` | - | | `createdAt` | `string` | - | | `creatorId` | `string` | - | | `expires` | `string` \| `null` | - | | `id` | `string` | - | | `isExpired?` | `boolean` | - | | `mode?` | [`PublicAssetLinkMode`](#publicassetlinkmode-1) | Capability mode for this link. - 'download' — direct-download link only; embed iframe blocked. - 'embed' — embeddable iframe only; direct download blocked. - 'embed-download' — both endpoints allowed (default; backward-compatible). Enforced server-side at /v1/public-download/\{token}/download and /embed-files. | | `projectId` | `string` | - | | `publicUrl` | `string` | - | | `status` | `"active"` \| `"expired"` \| `"disabled"` | - | | `token` | `string` | - | | `updatedAt` | `string` | - | *** ### ShortLink [#shortlink] #### Properties [#properties-12] | Property | Type | | -------------------------------------- | ---------------------------------------------------------------------------------- | | `code` | `string` | | `createdAt` | `string` | | `creatorId` | `string` | | `id` | `string` | | `resourceId` | `string` | | `resourceType` | `"asset"` \| `"project"` \| `"workspace"` \| `"chatMessage"` \| `"chatSubmission"` | | `updatedAt?` | `string` | | `visibility` | `"creator"` \| `"reviewer"` \| `null` | *** ### TagAssetData [#tagassetdata] #### Properties [#properties-13] | Property | Type | | ------------------------ | -------- | | `tagId` | `string` | *** ### UntagAssetData [#untagassetdata] #### Properties [#properties-14] | Property | Type | | -------------------------- | -------- | | `tagId` | `string` | *** ### UpdateAssetData [#updateassetdata] #### Properties [#properties-15] | Property | Type | | --------------------------------- | -------------------------- | | `folderId?` | `string` \| `null` | | `meta?` | `Record`\<`string`, `any`> | | `name?` | `string` | | `tags?` | `string`\[] | ## Type Aliases [#type-aliases] ### AssetPageResponse [#assetpageresponse] ```ts type AssetPageResponse = { page: number; }; ``` #### Properties [#properties-16] | Property | Type | | ---------------------- | -------- | | `page` | `number` | *** ### AssetResponse [#assetresponse] ```ts type AssetResponse = AssetWithChats; ``` *** ### DownloadAssetsResponse [#downloadassetsresponse] ```ts type DownloadAssetsResponse = any[]; ``` *** ### FileResponse [#fileresponse] ```ts type FileResponse = File; ``` *** ### PublicAssetLinkMode [#publicassetlinkmode] ```ts type PublicAssetLinkMode = "download" | "embed" | "embed-download"; ``` *** ### RepairAssetsResponse [#repairassetsresponse] ```ts type RepairAssetsResponse = any[]; ``` ## Functions [#functions] ### default() [#default] ```ts function default(client): { cleanupUploadSessions: void; completeCustomThumbnailUpload: Promise<{ key: string; status: string; }>; completeUpload: Promise; completeUploadSession: void; createPublicLink: Promise; createShortLink: Promise; deleteAsset: Promise; disablePublicLink: Promise; downloadAssets: Promise; getAsset: Promise; getAssetAccessActivity: Promise<{ breakdown: { count: number; label: string; value: string; }[]; eventType: string | null; from: string; groupBy: string; range: string; series: { count: number; date: string; eventType: string; }[]; to: string; totals: { count: number; eventType: string; }[]; }>; getAssetPage: Promise; getAssetReferences: Promise; getCustomThumbnailUploadUrl: Promise<{ assetId: string; expires: number; fileName: string; key: string; mimeType: string; status: string; uploadId: string; urls: string[]; }>; getDocumentViewUrl: Promise; getFile: Promise; getFilesByFunctionType: Promise; getPublicLinks: Promise<{ results: PublicAssetLink[]; }>; getUploadSession: UploadSessionData | null; getUploadSessions: UploadSessionData[]; hasActiveUploads: boolean; multipartUpload: Promise; offUploadSessionMessage: void; onUploadSessionMessage: void; promoteAttachmentToProject: Promise<{ asset: Asset; deduped: boolean; }>; reactivatePublicLink: Promise; recordAccessActivity: Promise; removeCustomThumbnail: Promise; removeUploadSession: void; repairAssets: Promise; tagAsset: Promise; untagAsset: Promise; updateAsset: Promise; updatePublicLink: Promise; }; ``` Defines asset-related methods for the NuramaClient. #### Parameters [#parameters] | Parameter | Type | Description | | --------- | ----------------------------------------------------- | -------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | The NuramaClient instance. | #### Returns [#returns] An object containing the asset-related methods. | Name | Type | Description | | --------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `cleanupUploadSessions()` | (`projectId`, `olderThanMs?`) => `void` | Clean up old upload sessions for a project | | `completeCustomThumbnailUpload()` | (`assetId`, `data`) => `Promise`\<\{ `key`: `string`; `status`: `string`; }> | Finalize the multipart upload for a custom thumbnail. Committing the upload starts the background processing that generates the thumbnail outputs. | | `completeUpload()` | (`uploadData`) => `Promise`\<`any`> | Complete a multipart upload initiated by `createAssets`. Takes the same `{ uploadId, parts }` shape as `nuramaClient.scratch.completeUpload`, plus the `key` and `assetId`. | | `completeUploadSession()` | (`projectId`, `sessionId`) => `void` | Mark an upload session as completed | | `createPublicLink()` | (`assetId`, `data`) => `Promise`\<[`PublicAssetLink`](#publicassetlink)> | Create a public download link for an asset. | | `createShortLink()` | (`assetId`, `data?`) => `Promise`\<[`CreateAssetShortLinkResponse`](#createassetshortlinkresponse)> | Creates a short link for an asset. If a short link already exists for the asset with the same visibility, returns the existing one. | | `deleteAsset()` | (`assetId`) => `Promise`\<[`AssetWithChats`](#assetwithchats)> | Deletes an asset (marks for deletion). | | `disablePublicLink()` | (`assetId`, `linkId`) => `Promise`\<[`PublicAssetLink`](#publicassetlink)> | Disable a public download link. | | `downloadAssets()` | (`assetIds`) => `Promise`\<[`DownloadAssetsResponse`](#downloadassetsresponse)> | Generates signed download URLs for the original files of specified assets. | | `getAsset()` | (`assetId`, `params?`) => `Promise`\<[`AssetWithChats`](#assetwithchats)> | Retrieves a specific asset by its ID with optional chat data. | | `getAssetAccessActivity()` | (`assetId`, `params?`) => `Promise`\<\{ `breakdown`: \{ `count`: `number`; `label`: `string`; `value`: `string`; }\[]; `eventType`: `string` \| `null`; `from`: `string`; `groupBy`: `string`; `range`: `string`; `series`: \{ `count`: `number`; `date`: `string`; `eventType`: `string`; }\[]; `to`: `string`; `totals`: \{ `count`: `number`; `eventType`: `string`; }\[]; }> | Get aggregated access-activity for a single asset. Returns totals per eventType, a breakdown for the requested dimension, and a zero-filled daily series. | | `getAssetPage()` | (`assetId`, `params?`) => `Promise`\<[`AssetPageResponse`](#assetpageresponse)> | Gets the page number an asset appears on based on specified filters and sorting. | | `getAssetReferences()` | (`assetId`) => `Promise`\<`AssetReferences`> | Lists every location an asset is referenced — its primary file system and each secondary reference (reviewer, submission, public), grouped and counted. Renaming an asset retitles it at every one of these locations, and deleting its last primary reference removes them all — so this is what the rename and delete confirmations show the user before either happens. | | `getCustomThumbnailUploadUrl()` | (`assetId`, `data`) => `Promise`\<\{ `assetId`: `string`; `expires`: `number`; `fileName`: `string`; `key`: `string`; `mimeType`: `string`; `status`: `string`; `uploadId`: `string`; `urls`: `string`\[]; }> | Mint signed multipart upload URLs for a user-supplied custom thumbnail image. Once the upload is completed, background processing generates the custom-thumbnail outputs and attaches them to the asset; the `assetFileUpdate` websocket event fires when they are ready. Caller flow: 1. multipartUpload(file, response.urls, response.key, response.uploadId) 2. completeCustomThumbnailUpload(\{ assetId, key, uploadId, parts }) 3. wait for the assetFileUpdate websocket event | | `getDocumentViewUrl()` | (`assetId`) => `Promise`\<[`DocumentViewUrlResponse`](#documentviewurlresponse)> | Mints a short-lived signed URL for rendering a document inline. A document's `media` PDF is kept in private storage, so unlike images and video it cannot be addressed by keyPath through the public file URL. Fetch this each time a document is opened; do not cache it past `expires`. | | `getFile()` | (`assetId`, `fileId`) => `Promise`\<`File`> | Retrieves a specific file from an asset. | | `getFilesByFunctionType()` | (`assetId`, `functionType`) => `Promise`\<`File`\[]> | Retrieves files of a specific function type from an asset. | | `getPublicLinks()` | (`assetId`, `options?`) => `Promise`\<\{ `results`: [`PublicAssetLink`](#publicassetlink)\[]; }> | Get all public download links for an asset. | | `getUploadSession()` | (`projectId`, `sessionId`) => `UploadSessionData` \| `null` | Get a specific upload session | | `getUploadSessions()` | (`projectId`) => `UploadSessionData`\[] | Get all active upload sessions for a project | | `hasActiveUploads()` | (`staleMs?`) => `boolean` | True when any upload is genuinely in flight anywhere in the app (across all projects and tabs). Intended for app-level guards — e.g. suppressing an automatic version-update page refresh while bytes are still uploading. Stale (crashed-tab) sessions are ignored via the freshness window. | | `multipartUpload()` | ( `file`, `signedUrls`, `key`, `uploadId`, `options?` ) => `Promise`\<[`MultipartUploadResult`](#multipartuploadresult)> | Uploads a file using multipart upload with the provided signed URLs | | `offUploadSessionMessage()` | (`listenerId`) => `void` | Unregister a cross-tab upload session message listener | | `onUploadSessionMessage()` | (`listenerId`, `callback`) => `void` | Register a listener for cross-tab upload session messages | | `promoteAttachmentToProject()` | (`assetId`, `payload`) => `Promise`\<\{ `asset`: `Asset`; `deduped`: `boolean`; }> | Promote a chat-message attachment into a project as a fresh, independent project asset. The source attachment is left untouched; the new project asset has its own lifecycle, post-processing pipeline, and storage footprint. Idempotent: a second promote of the same source into the same project returns the existing promoted asset with `deduped: true`. Requires `canCreateAsset` on the destination project — reviewers are blocked. The server additionally rejects when the source attachment's workspace doesn't match the destination project's. | | `reactivatePublicLink()` | ( `assetId`, `linkId`, `data?` ) => `Promise`\<[`PublicAssetLink`](#publicassetlink)> | Reactivate a disabled/expired public download link. | | `recordAccessActivity()` | (`assetId`, `body`) => `Promise`\<`void`> | Record an authenticated play event from the in-app player. Fire-and-forget; server returns 204. Throw-on-failure is fine because the caller already de-dupes per session. | | `removeCustomThumbnail()` | (`assetId`) => `Promise`\<`Asset`> | Remove the custom thumbnail from an asset. Soft-deletes all custom thumb files; the asset falls back to the auto-generated thumbnail. | | `removeUploadSession()` | (`projectId`, `sessionId`) => `void` | Remove an upload session | | `repairAssets()` | (`assetIds`) => `Promise`\<[`RepairAssetsResponse`](#repairassetsresponse)> | Attempts to repair assets (e.g., regenerate signed URLs for pending uploads). | | `tagAsset()` | (`assetId`, `tagData`) => `Promise`\<[`AssetWithChats`](#assetwithchats)> | Tags an asset with a specific tag. | | `untagAsset()` | (`assetId`, `untagData`) => `Promise`\<[`AssetWithChats`](#assetwithchats)> | Untags an asset by removing a specific tag. | | `updateAsset()` | (`assetId`, `updateData`) => `Promise`\<[`AssetWithChats`](#assetwithchats)> | Updates an asset. | | `updatePublicLink()` | ( `assetId`, `linkId`, `data` ) => `Promise`\<[`PublicAssetLink`](#publicassetlink)> | Update a public download link (extend expiration or change status). | # auth (/docs/reference/sdk/routes/auth) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### ChangePasswordData [#changepassworddata] #### Properties [#properties] | Property | Type | | -------------------------------------------- | -------- | | `currentPassword` | `string` | | `mfaToken?` | `string` | | `newPassword` | `string` | *** ### DisableMFAData [#disablemfadata] #### Properties [#properties-1] | Property | Type | | -------------------------------- | -------- | | `mfaToken` | `string` | *** ### LoginCredentials [#logincredentials] #### Properties [#properties-2] | Property | Type | Description | | ------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `inviteId?` | `string` | Optional. When signing in to accept an invite, pass the invite id: it only reaches the user through the message sent to that address, so quoting it proves control of the inbox and lifts the email-verification grace block for this login. Credentials are still required. | | `login` | `string` | - | | `password` | `string` | - | *** ### LoginRegisterResponse [#loginregisterresponse] #### Properties [#properties-3] | Property | Type | | -------------------------- | ------------ | | `tokens` | `AuthTokens` | | `user` | `User` | *** ### RefreshResponse [#refreshresponse] #### Extends [#extends] * `AuthTokens` #### Properties [#properties-4] | Property | Type | Inherited from | | --------------------------------- | ------- | ---------------------- | | `access` | `Token` | `AuthTokens.access` | | `refresh` | `Token` | `AuthTokens.refresh` | | `verifyMfa?` | `Token` | `AuthTokens.verifyMfa` | *** ### RegisterUserData [#registeruserdata] #### Extends [#extends-1] * `Pick`\<`User`, `"firstName"` | `"lastName"` | `"email"`> #### Properties [#properties-5] | Property | Type | Description | Inherited from | | -------------------------------- | -------- | -------------------------------------------------------------- | ---------------- | | `email` | `string` | The email address of the user. **Format** email | `Pick.email` | | `firstName` | `string` | The first name of the user. **Min Length** 3 **Max Length** 35 | `Pick.firstName` | | `lastName` | `string` | The last name of the user. **Max Length** 35 | `Pick.lastName` | | `password` | `string` | - | - | *** ### ResetPasswordData [#resetpassworddata] #### Properties [#properties-6] | Property | Type | | -------------------------------- | -------- | | `password` | `string` | | `token` | `string` | *** ### VerifyBackupCodeData [#verifybackupcodedata] #### Properties [#properties-7] | Property | Type | | ---------------------------------- | -------- | | `backupCode` | `string` | *** ### VerifyMFAData [#verifymfadata] #### Properties [#properties-8] | Property | Type | | -------------------------------- | -------- | | `mfaToken` | `string` | ## Functions [#functions] ### default() [#default] ```ts function default(client): { changePassword: Promise; disableMfa: Promise; enableMfa: Promise; exchangeOAuthCode: Promise; forgotPassword: Promise; getLinkedOAuthProviders: Promise; linkOAuthProvider: Promise; lockAccount: Promise; login: Promise; logout: Promise; refreshTokens: Promise; register: Promise; registerGuest: Promise; resendVerification: Promise; resetPassword: Promise; sendVerificationEmail: Promise; setPassword: Promise; unlinkOAuthProvider: Promise; upgradeGuest: Promise<{ user: User; }>; verifyBackupCode: Promise; verifyEmail: Promise; verifyGuest: Promise; verifyMfa: Promise; }; ``` Defines authentication-related methods for the NuramaClient. #### Parameters [#parameters] | Parameter | Type | Description | | --------- | ----------------------------------------------------- | -------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | The NuramaClient instance. | #### Returns [#returns] An object containing the authentication methods. | Name | Type | Description | | --------------------------- | -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `changePassword()` | ( `currentPassword`, `newPassword`, `mfaToken?` ) => `Promise`\<`void`> | Changes the authenticated user's password. Requires current password verification and MFA token if MFA is enabled. All refresh tokens will be invalidated after password change. | | `disableMfa()` | (`mfaToken`) => `Promise`\<`void`> | Disables multi-factor authentication for the authenticated user. Requires a current valid MFA token for confirmation. | | `enableMfa()` | () => `Promise`\<`MFAEnableResponse`> | Enables multi-factor authentication for the authenticated user. | | `exchangeOAuthCode()` | (`code`) => `Promise`\<`OAuthExchangeResponse`> | - | | `forgotPassword()` | (`email`) => `Promise`\<`void`> | Forgets a user's password. | | `getLinkedOAuthProviders()` | () => `Promise`\<`LinkedAuthProvider`\[]> | Gets all OAuth providers linked to the authenticated user's account. | | `linkOAuthProvider()` | (`provider`) => `Promise`\<[`LoginRegisterResponse`](#loginregisterresponse)> | Links an OAuth provider to the authenticated user's account. This allows users to sign in with multiple OAuth providers. | | `lockAccount()` | (`token`) => `Promise`\<`void`> | Locks a user account using a lock account token. This is used when a user receives a password changed notification for a change they did not initiate, allowing them to immediately secure their account. | | `login()` | (`credentials`) => `Promise`\<[`LoginRegisterResponse`](#loginregisterresponse)> | Logs in a user. | | `logout()` | (`refreshToken`) => `Promise`\<`void`> | Logs out a user. | | `refreshTokens()` | (`refreshToken?`) => `Promise`\<[`RefreshResponse`](#refreshresponse)> | Refreshes user tokens. | | `register()` | (`userData`) => `Promise`\<[`LoginRegisterResponse`](#loginregisterresponse)> | Registers a new user. | | `registerGuest()` | (`data`) => `Promise`\<`void`> | Registers a guest account for public chat participation. Always returns void (204) regardless of outcome for anti-enumeration. | | `resendVerification()` | (`email`) => `Promise`\<`void`> | Public, unauthenticated resend of the verification email keyed by address. For users past the verification grace window who can't log in or call the authed sendVerificationEmail. Always resolves (the server returns 204 regardless of whether the email exists). | | `resetPassword()` | (`params`) => `Promise`\<`void`> | Resets a user's password. | | `sendVerificationEmail()` | () => `Promise`\<`void`> | Sends a verification email to the authenticated user. | | `setPassword()` | (`password`, `mfaToken?`) => `Promise`\<`void`> | Sets a password for an OAuth-only user account. This allows OAuth users to add local authentication as a backup. | | `unlinkOAuthProvider()` | (`provider`) => `Promise`\<`void`> | Unlinks an OAuth provider from the authenticated user's account. User must have at least one authentication method remaining (password or another OAuth provider). | | `upgradeGuest()` | (`data`) => `Promise`\<\{ `user`: `User`; }> | Upgrades a guest account to a standard account with a password. Requires the user to be authenticated as a guest. | | `verifyBackupCode()` | (`backupCode`) => `Promise`\<`MFAVerifyResponse`> | Verifies an MFA backup code. This is used during login when a user has lost access to their authenticator app. | | `verifyEmail()` | (`token`) => `Promise`\<`void`> | Verifies a user's email using the provided token. | | `verifyGuest()` | (`token`) => `Promise`\<[`LoginRegisterResponse`](#loginregisterresponse)> | Verifies a guest account using the token from the verification email. Stores auth tokens on success and returns user data. | | `verifyMfa()` | (`mfaToken`) => `Promise`\<`MFAVerifyResponse`> | Verifies an MFA token (e.g., TOTP code). This is used both during initial MFA setup and during login challenges. | # blogPosts (/docs/reference/sdk/routes/blogPosts) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Functions [#functions] ### default() [#default] ```ts function default(client): { listBlogPosts: Promise; }; ``` Read-only blog feed (Nurama News, shown on the web app's /news page). Auth: any signed-in user. No workspace coupling — the feed is platform-level, identical for every user. The server normalises the post payload and sanitises post HTML, so the returned `bodyHtml` is safe to render directly. #### Parameters [#parameters] | Parameter | Type | | --------- | ----------------------------------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | #### Returns [#returns] | Name | Type | Description | | ----------------- | ------------------------------------------------- | --------------------------------------- | | `listBlogPosts()` | (`params?`) => `Promise`\<`BlogPostListResponse`> | List the most recent Nurama News posts. | # board (/docs/reference/sdk/routes/board) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### AddColumnData [#addcolumndata] #### Properties [#properties] | Property | Type | Description | | ----------------------------------------------------------- | --------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | | `color?` | `string` | - | | `description?` | `string` | - | | `isDefault?` | `boolean` | - | | `name` | `string` | - | | `reviewersCanContribute?` | `boolean` | When true, reviewer-role users may create tasks in this column on a reviewer-visibility board. | | `sortOrder?` | `number` | - | | `taskStatus?` | `"pending"` \| `"inProgress"` \| `"complete"` \| `"closed"` \| `null` | - | *** ### AddExistingTaskData [#addexistingtaskdata] #### Properties [#properties-1] | Property | Type | | ------------------------------- | -------- | | `columnId?` | `string` | | `taskId` | `string` | *** ### CreateBoardData [#createboarddata] #### Properties [#properties-2] | Property | Type | | --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `columns?` | \{ `color?`: `string`; `description?`: `string`; `isDefault?`: `boolean`; `name`: `string`; `sortOrder?`: `number`; `taskStatus?`: `"pending"` \| `"inProgress"` \| `"complete"` \| `"closed"` \| `null`; }\[] | | `description?` | `string` | | `name` | `string` | | `projectId` | `string` | | `visibility?` | (`"creator"` \| `"reviewer"`)\[] | *** ### CreateBoardTaskData [#createboardtaskdata] #### Properties [#properties-3] | Property | Type | Description | | --------------------------------------- | ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `announce?` | \{ `chatId`: `string`; `messageId`: `string`; } | Optional announce flag. When supplied, after the task is created the server posts a Nu reply in `chatId` threaded under `messageId` with this task as a single taskCard and links them via TaskRelation. Mirrors the same flag on `tasks.bulkCreate`. | | `announce.chatId` | `string` | - | | `announce.messageId` | `string` | - | | `assignedToId?` | `string` | - | | `columnId?` | `string` | - | | `description?` | `string` | - | | `subject` | `string` | - | *** ### LinkTaskData [#linktaskdata] #### Properties [#properties-4] | Property | Type | | -------------------------------------- | ----------------------------------------------------------- | | `linkedTaskId` | `string` | | `linkType?` | `"related"` \| `"blocks"` \| `"blockedBy"` \| `"duplicate"` | *** ### MoveTaskData [#movetaskdata] #### Properties [#properties-5] | Property | Type | Description | | ----------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `columnId?` | `string` | Required for same-board moves; optional when `targetBoardId` is set (server defaults to the target board's default column). | | `sortOrder?` | `number` | - | | `targetBoardId?` | `string` | When supplied AND different from the URL `boardId`, the server performs a cross-board move — `boardId` and `columnId` are updated together. Omit for the original same-board move. | *** ### ReorderColumnsData [#reordercolumnsdata] #### Properties [#properties-6] | Property | Type | | ------------------------------ | ---------------------------------------------- | | `columns` | \{ `id`: `string`; `sortOrder`: `number`; }\[] | *** ### UpdateBoardData [#updateboarddata] #### Properties [#properties-7] | Property | Type | Description | | --------------------------------------- | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `cascade?` | `boolean` | When narrowing visibility, opt into automatic cleanup of dependent tasks, assignees, and relations. If omitted (or false) and dependents exist, the server returns 409 with a structured `errorData.blockers` payload. | | `description?` | `string` \| `null` | - | | `name?` | `string` | - | | `sortOrder?` | `number` | - | | `status?` | `"active"` \| `"archived"` | - | | `visibility?` | (`"creator"` \| `"reviewer"`)\[] | - | *** ### UpdateColumnData [#updatecolumndata] #### Properties [#properties-8] | Property | Type | Description | | ------------------------------------------------------------- | --------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | | `color?` | `string` \| `null` | - | | `description?` | `string` \| `null` | - | | `isDefault?` | `boolean` | - | | `name?` | `string` | - | | `reviewersCanContribute?` | `boolean` | When true, reviewer-role users may create tasks in this column on a reviewer-visibility board. | | `sortOrder?` | `number` | - | | `taskStatus?` | `"pending"` \| `"inProgress"` \| `"complete"` \| `"closed"` \| `null` | - | *** ### UpdateTaskDetailsData [#updatetaskdetailsdata] #### Properties [#properties-9] | Property | Type | | ----------------------------------------- | ------------------ | | `assignedToId?` | `string` \| `null` | | `description?` | `string` \| `null` | | `subject?` | `string` | ## Functions [#functions] ### default() [#default] ```ts function default(client): { addColumn: Promise; addExistingTaskToBoard: Promise; createBoard: Promise; createBoardTask: Promise; deleteBoard: Promise<{ deletedTaskIds: string[]; disposition: string; message: string; reassignedTaskIds: string[]; }>; deleteColumn: Promise; followBoard: Promise; getBoard: Promise; getBoardTasks: Promise; getProjectBoards: Promise; getProjectTasks: Promise; moveTask: Promise; removeTaskFromBoard: Promise; reorderColumns: Promise; tagBoard: Promise; unfollowBoard: Promise; untagBoard: Promise; updateBoard: Promise; updateColumn: Promise; }; ``` #### Parameters [#parameters] | Parameter | Type | | --------- | ----------------------------------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | #### Returns [#returns] | Name | Type | Description | | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `addColumn()` | (`boardId`, `data`) => `Promise`\<`BoardColumn`> | Add a column to a board. Appended at the end unless `sortOrder` is provided. | | `addExistingTaskToBoard()` | (`boardId`, `data`) => `Promise`\<`Task`> | Attach an existing project task to a board (no new task is created). | | `createBoard()` | (`data`) => `Promise`\<`Board`> | Create a new board inside a project. If `columns` are omitted the server seeds the standard four-column layout. | | `createBoardTask()` | (`boardId`, `data`) => `Promise`\<`Task`> | Create a task directly on a board. When `announce` is supplied the server also posts a Nu reply in the named chat threaded under the given message, with this task linked via TaskRelation. | | `deleteBoard()` | (`boardId`, `body?`) => `Promise`\<\{ `deletedTaskIds`: `string`\[]; `disposition`: `string`; `message`: `string`; `reassignedTaskIds`: `string`\[]; }> | Delete a board. `disposition` controls what happens to its tasks: `unassign` (default — tasks survive boardless), `delete`, or `reassign` to another board/column. | | `deleteColumn()` | ( `boardId`, `columnId`, `targetColumnId?` ) => `Promise`\<`void`> | Delete a column. If the column holds tasks, pass `targetColumnId` to move them; otherwise the call fails. | | `followBoard()` | (`boardId`) => `Promise`\<`Board`> | Follow a board to receive notifications about its tasks. | | `getBoard()` | (`boardId`) => `Promise`\<`BoardWithTasks`> | Fetch a board with its columns and tasks populated. | | `getBoardTasks()` | (`boardId`, `params?`) => `Promise`\<`Task`\[]> | List tasks on a board, optionally narrowed by column / assignee / tag / status / search. | | `getProjectBoards()` | (`projectId`, `params?`) => `Promise`\<`Board`\[]> | List boards in a project. Filters by visibility, free-text search, and tag ids. | | `getProjectTasks()` | (`projectId`, `params?`) => `Promise`\<`any`> | List every task in a project across all boards. Use `boardId: 'unassigned'` to fetch only tasks not yet placed on a board. | | `moveTask()` | ( `boardId`, `taskId`, `data` ) => `Promise`\<`Task`> | Move a task to a different column on the same board. | | `removeTaskFromBoard()` | (`boardId`, `taskId`) => `Promise`\<`Task`> | Detach a task from a board. The task itself is preserved as boardless. | | `reorderColumns()` | (`boardId`, `data`) => `Promise`\<`BoardColumn`\[]> | Reorder a board's columns. The request must include every column id. | | `tagBoard()` | (`boardId`, `tagId`) => `Promise`\<`Board`> | Attach a tag to a board. | | `unfollowBoard()` | (`boardId`) => `Promise`\<`Board`> | Stop following a board. | | `untagBoard()` | (`boardId`, `tagId`) => `Promise`\<`Board`> | Detach a tag from a board. | | `updateBoard()` | (`boardId`, `data`) => `Promise`\<`Board`> | Update a board's metadata. Set `cascade: true` to opt into automatic cleanup of dependent tasks when narrowing visibility; otherwise the server returns 409 with a `blockers` payload. | | `updateColumn()` | ( `boardId`, `columnId`, `data` ) => `Promise`\<`BoardColumn`> | Update column metadata (name, color, task-status mapping, etc.). | # bot (/docs/reference/sdk/routes/bot) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### Bot [#bot] #### Properties [#properties] | Property | Type | Description | | --------------------------------------------------- | -------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | `accountType` | `"bot"` | - | | `apiKey?` | [`BotApiKeySummary`](#botapikeysummary) | - | | `apiKeys?` | [`BotApiKeySummary`](#botapikeysummary)\[] | - | | `avatar?` | `any` | Populated avatar Asset (joined server-side from `avatarId`). The web client resolves the image URL from this field via `getAvatarUrl()`. | | `avatarId` | `string` \| `null` | - | | `color` | `string` | - | | `createdAt` | `string` | - | | `displayName` | `string` | - | | `id` | `string` | - | | `membershipId?` | `string` | - | | `projectMemberships?` | [`BotProjectMembership`](#botprojectmembership)\[] | Project memberships within the workspace the bot belongs to. Populated by `listBots` and `getBot`. Empty array if the bot has no project assignments. | | `roles?` | `string`\[] | - | | `status` | `string` | - | | `updatedAt` | `string` | - | *** ### BotApiKeySummary [#botapikeysummary] #### Properties [#properties-1] | Property | Type | Description | | ---------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------ | | `createdAt` | `string` | - | | `expiresAt?` | `string` \| `null` | - | | `id` | `string` | - | | `keyPrefix` | `string` | - | | `kind?` | `"botAccess"` \| `"pat"` \| `"oauthAccess"` \| `"oauthRefresh"` \| `null` | Discriminator. Bot keys mint as 'botAccess'. | | `lastUsed?` | `string` \| `null` | - | | `name` | `string` | - | | `scopes?` | `string`\[] | Granted action verbs. Empty array = unscoped (legacy). | | `status` | `"active"` \| `"revoked"` | - | *** ### BotProjectMembership [#botprojectmembership] #### Properties [#properties-2] | Property | Type | | ---------------------------------------- | -------------------------------------- | | `membershipId` | `string` | | `projectId` | `string` | | `projectName` | `string` | | `roles` | [`BotProjectRole`](#botprojectrole)\[] | *** ### CreateBotData [#createbotdata] #### Properties [#properties-3] | Property | Type | Description | | ----------------------------- | ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `color?` | `string` | Optional hex color from the approved palette. Auto-assigned if omitted. | | `name` | `string` | Display name for the bot. 1–50 characters. | | `roles` | (`"workspaceAdmin"` \| `"workspaceMember"` \| `"workspaceChatMember"`)\[] | Workspace roles to grant the bot. Must be one or more of: workspaceAdmin, workspaceMember, workspaceChatMember. | | `scopes?` | `string`\[] | Optional API-key scopes. Defaults to \[] (legacy — bot key can call any route that isn't yet scope-gated). Once a route is gated by `requireTokenScope` the bot needs the matching scope here for that route to work. | *** ### CreateBotResponse [#createbotresponse] #### Properties [#properties-4] | Property | Type | Description | | -------------------------- | ------------- | ------------------------------------------------------------------------------------------------- | | `bot` | [`Bot`](#bot) | - | | `rawKey` | `string` | Raw API key, returned ONCE at creation time. Store it immediately — it cannot be retrieved again. | *** ### RotateBotKeyResponse [#rotatebotkeyresponse] #### Properties [#properties-5] | Property | Type | Description | | ---------------------------- | --------------------------------------- | ------------------------------- | | `apiKey` | [`BotApiKeySummary`](#botapikeysummary) | - | | `rawKey` | `string` | New raw API key. Returned once. | *** ### UpdateBotAvatarFileData [#updatebotavatarfiledata] #### Properties [#properties-6] | Property | Type | | ------------------------------ | -------- | | `checksum` | `string` | | `name` | `string` | | `sizeInMB` | `number` | *** ### UpdateBotAvatarResponse [#updatebotavatarresponse] #### Indexable [#indexable] ```ts [k: string]: unknown ``` #### Properties [#properties-7] | Property | Type | | ----------------------------------------- | ---------------------------------------------------------------- | | `asset?` | \{ \[`k`: `string`]: `unknown`; `id`: `string`; } | | `asset.id` | `string` | | `signedUrlData?` | \{ `key`: `string`; `uploadId`: `string`; `urls`: `string`\[]; } | | `signedUrlData.key` | `string` | | `signedUrlData.uploadId` | `string` | | `signedUrlData.urls` | `string`\[] | | `user` | \{ `avatarId`: `string` \| `null`; `id`: `string`; } | | `user.avatarId` | `string` \| `null` | | `user.id` | `string` | *** ### UpdateBotData [#updatebotdata] #### Properties [#properties-8] | Property | Type | | --------------------------- | -------- | | `color?` | `string` | | `name?` | `string` | ## Type Aliases [#type-aliases] ### BotProjectRole [#botprojectrole] ```ts type BotProjectRole = "creator" | "reviewer" | "projectAdmin"; ``` ## Functions [#functions] ### default() [#default] ```ts function default(client): { createBot: Promise; deleteBot: Promise; getBot: Promise; listBots: Promise; listProjectMemberships: Promise; removeProjectMembership: Promise; rotateBotKey: Promise; setProjectMembership: Promise; updateBot: Promise; updateBotAvatar: Promise; }; ``` Bot user administration methods. Used by workspace owners/admins (callers holding a JWT) to manage bot users in a workspace. Bots themselves cannot call these endpoints — bot administration is restricted server-side. #### Parameters [#parameters] | Parameter | Type | | --------- | ----------------------------------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | #### Returns [#returns] | Name | Type | Description | | --------------------------- | -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `createBot()` | (`workspaceId`, `data`) => `Promise`\<[`CreateBotResponse`](#createbotresponse)> | Create a bot user in a workspace. Returns the new bot and the raw API key (shown only once). | | `deleteBot()` | (`workspaceId`, `botId`) => `Promise`\<`void`> | Delete a bot user. Revokes all API keys, removes the workspace membership, and marks the user inactive. | | `getBot()` | (`workspaceId`, `botId`) => `Promise`\<[`Bot`](#bot)> | Get a single bot's details, including all of its API key metadata (no secrets). | | `listBots()` | (`workspaceId`) => `Promise`\<[`Bot`](#bot)\[]> | List bot users in a workspace. | | `listProjectMemberships()` | (`workspaceId`, `botId`) => `Promise`\<[`BotProjectMembership`](#botprojectmembership)\[]> | List the bot's project memberships within the workspace. | | `removeProjectMembership()` | ( `workspaceId`, `botId`, `projectId` ) => `Promise`\<`void`> | Remove the bot's membership on a project. Idempotent. | | `rotateBotKey()` | (`workspaceId`, `botId`) => `Promise`\<[`RotateBotKeyResponse`](#rotatebotkeyresponse)> | Revoke the bot's current API key and issue a new one. The new raw key is returned once. | | `setProjectMembership()` | ( `workspaceId`, `botId`, `projectId`, `data` ) => `Promise`\<[`BotProjectMembership`](#botprojectmembership)> | Upsert the bot's membership on a project. Replaces roles if a membership already exists; creates one otherwise. Idempotent. | | `updateBot()` | ( `workspaceId`, `botId`, `data` ) => `Promise`\<[`Bot`](#bot)> | Update a bot's display name and/or color. | | `updateBotAvatar()` | ( `workspaceId`, `botId`, `fileData` ) => `Promise`\<[`UpdateBotAvatarResponse`](#updatebotavatarresponse)> | Request signed URL data to upload a new avatar for the bot. Upload the file with `client.asset.multipartUpload(...)` using the returned `signedUrlData`, then call `client.asset.completeUpload(...)` to finalize. | # chat (/docs/reference/sdk/routes/chat) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### AddableMembersByScope [#addablemembersbyscope] Addable members for a legacy project-scoped member chat, split by the membership they come from. #### Properties [#properties] | Property | Type | | ---------------------------------------------------- | --------------- | | `projectMembership` | `Membership`\[] | | `workspaceMembership` | `Membership`\[] | *** ### AttachmentUploadRecord [#attachmentuploadrecord] One entry of an upload response: the created asset plus the signed upload data the caller uses to PUT the bytes, or a per-file failure (`status: 'fail'` with `error`). #### Properties [#properties-1] | Property | Type | | ----------------------------------------------------------- | ----------------------- | | `asset?` | `Asset` | | `error?` | `string` | | `id` | `string` \| `number` | | `name` | `string` | | `signedUrlData?` | `any` | | `status` | `"success"` \| `"fail"` | | `uploadChunkSizeInBytes?` | `number` | *** ### BaseAnnotation [#baseannotation] #### Extended by [#extended-by] * [`NestedDotAnnotation`](#nesteddotannotation) * [`NestedShapeAnnotation`](#nestedshapeannotation) * [`NestedTextAnnotation`](#nestedtextannotation) * [`NestedPathAnnotation`](#nestedpathannotation) * [`DotAnnotation`](#dotannotation) * [`FrameCommentAnnotation`](#framecommentannotation) * [`ShapeAnnotation`](#shapeannotation) * [`TextAnnotation`](#textannotation) * [`PathAnnotation`](#pathannotation) #### Properties [#properties-2] | Property | Type | | ----------------------------------------------- | --------------------------------------------------------------------------------------- | | `angle?` | `number` | | `color?` | `string` | | `endTimestamp?` | `number` | | `fillRule?` | `"nonzero"` \| `"evenodd"` | | `flipX?` | `boolean` | | `flipY?` | `boolean` | | `frame?` | `number` | | `height?` | `number` | | `left?` | `number` | | `opacity?` | `number` | | `originX?` | `"left"` \| `"center"` \| `"right"` | | `originY?` | `"center"` \| `"top"` \| `"bottom"` | | `scaleX?` | `number` | | `scaleY?` | `number` | | `shadow?` | \{ `blur?`: `number`; `color?`: `string`; `offsetX?`: `number`; `offsetY?`: `number`; } | | `shadow.blur?` | `number` | | `shadow.color?` | `string` | | `shadow.offsetX?` | `number` | | `shadow.offsetY?` | `number` | | `skewX?` | `number` | | `skewY?` | `number` | | `startTimestamp?` | `number` | | `strokeDashArray?` | `number`\[] | | `strokeLineCap?` | `"butt"` \| `"round"` \| `"square"` | | `strokeLineJoin?` | `"round"` \| `"miter"` \| `"bevel"` | | `strokeMiterLimit?` | `number` | | `timestamp?` | `number` | | `top?` | `number` | | `visible?` | `boolean` | | `width?` | `number` | *** ### CreateAssetChatAndMessageData [#createassetchatandmessagedata] #### Extends [#extends] * [`CreateMessageData`](#createmessagedata) #### Properties [#properties-3] | Property | Type | Description | Inherited from | | --------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------- | | `annotations?` | [`Annotation`](#annotation)\[] | - | [`CreateMessageData`](#createmessagedata).[`annotations`](#annotations-1) | | `assetMentions?` | `string`\[] | - | [`CreateMessageData`](#createmessagedata).[`assetMentions`](#assetmentions-1) | | `attachments?` | ( \| [`FileAttachmentData`](#fileattachmentdata) \| [`ScratchAttachmentRef`](#scratchattachmentref))\[] | - | [`CreateMessageData`](#createmessagedata).[`attachments`](#attachments-1) | | `content?` | `string` | - | [`CreateMessageData`](#createmessagedata).[`content`](#content-1) | | `folderMentions?` | `string`\[] | - | [`CreateMessageData`](#createmessagedata).[`folderMentions`](#foldermentions-1) | | `linkPreviews?` | `LinkPreview`\[] | - | [`CreateMessageData`](#createmessagedata).[`linkPreviews`](#linkpreviews-1) | | `mentions?` | `string`\[] | - | [`CreateMessageData`](#createmessagedata).[`mentions`](#mentions-1) | | `pageContext?` | \{ `pageTitle?`: `string`; `path?`: `string`; `visibleAssetIds?`: `string`\[]; } | AI-chat only. Sent on the regular chat endpoint when the target chat is an AI topic so the assistant sees a snapshot of the page the user was looking at. Regular chats ignore this field. | [`CreateMessageData`](#createmessagedata).[`pageContext`](#pagecontext-1) | | `pageContext.pageTitle?` | `string` | - | - | | `pageContext.path?` | `string` | - | - | | `pageContext.visibleAssetIds?` | `string`\[] | - | - | | `publicMentions?` | `string`\[] | - | [`CreateMessageData`](#createmessagedata).[`publicMentions`](#publicmentions-1) | | `quotes?` | `string`\[] | - | [`CreateMessageData`](#createmessagedata).[`quotes`](#quotes-1) | | `replyToId?` | `string` | - | [`CreateMessageData`](#createmessagedata).[`replyToId`](#replytoid-1) | | `submissionMentions?` | `string`\[] | - | [`CreateMessageData`](#createmessagedata).[`submissionMentions`](#submissionmentions-1) | | `taskMentions?` | `string`\[] | - | [`CreateMessageData`](#createmessagedata).[`taskMentions`](#taskmentions-1) | *** ### CreateAssetChatAndMessageParams [#createassetchatandmessageparams] #### Extends [#extends-1] * [`SortParams`](#sortparams) #### Properties [#properties-4] | Property | Type | Inherited from | | ------------------------------- | -------------------------------- | ---------------------------------------------- | | `messages?` | `number` | - | | `replies?` | `number` | - | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-12) | *** ### CreateMemberChatData [#creatememberchatdata] #### Properties [#properties-5] | Property | Type | Description | | -------------------------------- | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | | `color?` | `string` | Optional hex colour from the approved palette (see `GET /config`). | | `memberIds` | `string`\[] | - | | `scopeId` | `string` | - | | `scopeType` | `"project"` \| `"workspace"` | Only `workspace` is accepted by the API; `project` is rejected with 400 (project-scoped member chats are no longer created). | | `subject?` | `string` | - | *** ### CreateMessageData [#createmessagedata] #### Extended by [#extended-by-1] * [`CreateAssetChatAndMessageData`](#createassetchatandmessagedata) #### Properties [#properties-6] | Property | Type | Description | | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `annotations?` | [`Annotation`](#annotation)\[] | - | | `assetMentions?` | `string`\[] | - | | `attachments?` | ( \| [`FileAttachmentData`](#fileattachmentdata) \| [`ScratchAttachmentRef`](#scratchattachmentref))\[] | - | | `content?` | `string` | - | | `folderMentions?` | `string`\[] | - | | `linkPreviews?` | `LinkPreview`\[] | - | | `mentions?` | `string`\[] | - | | `pageContext?` | \{ `pageTitle?`: `string`; `path?`: `string`; `visibleAssetIds?`: `string`\[]; } | AI-chat only. Sent on the regular chat endpoint when the target chat is an AI topic so the assistant sees a snapshot of the page the user was looking at. Regular chats ignore this field. | | `pageContext.pageTitle?` | `string` | - | | `pageContext.path?` | `string` | - | | `pageContext.visibleAssetIds?` | `string`\[] | - | | `publicMentions?` | `string`\[] | - | | `quotes?` | `string`\[] | - | | `replyToId?` | `string` | - | | `submissionMentions?` | `string`\[] | - | | `taskMentions?` | `string`\[] | - | *** ### CreateReactionData [#createreactiondata] #### Properties [#properties-7] | Property | Type | | ------------------------ | -------- | | `emoji` | `string` | *** ### CreateTopicChatData [#createtopicchatdata] #### Properties [#properties-8] | Property | Type | | ----------------------------------- | --------------------------- | | `subject?` | `string` | | `topicId` | `string` | | `topicType` | `"asset"` \| `"project"` | | `visibility?` | `"creator"` \| `"reviewer"` | *** ### DateRangeParams [#daterangeparams] #### Extended by [#extended-by-2] * [`GetUsersMemberChatsParams`](#getusersmemberchatsparams) * [`GetUsersMentionsParams`](#getusersmentionsparams) * [`GetMessagesParams`](#getmessagesparams) * [`GetRepliesParams`](#getrepliesparams) #### Properties [#properties-9] | Property | Type | | ----------------------------------------- | -------------------- | | `createdAfter?` | `string` \| `number` | | `createdBefore?` | `string` \| `number` | | `updatedBefore?` | `string` \| `number` | *** ### DotAnnotation [#dotannotation] #### Extends [#extends-2] * [`BaseAnnotation`](#baseannotation) #### Properties [#properties-10] | Property | Type | Inherited from | | ------------------------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | | `angle?` | `number` | [`BaseAnnotation`](#baseannotation).[`angle`](#angle) | | `color?` | `string` | [`BaseAnnotation`](#baseannotation).[`color`](#color) | | `coordinates` | [`PercentageCoordinates`](#percentagecoordinates) | - | | `endTimestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`endTimestamp`](#endtimestamp) | | `fillRule?` | `"nonzero"` \| `"evenodd"` | [`BaseAnnotation`](#baseannotation).[`fillRule`](#fillrule) | | `flipX?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`flipX`](#flipx) | | `flipY?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`flipY`](#flipy) | | `frame?` | `number` | [`BaseAnnotation`](#baseannotation).[`frame`](#frame) | | `height?` | `number` | [`BaseAnnotation`](#baseannotation).[`height`](#height) | | `left?` | `number` | [`BaseAnnotation`](#baseannotation).[`left`](#left) | | `nestedAnnotations?` | [`NestedAnnotation`](#nestedannotation)\[] | - | | `opacity?` | `number` | [`BaseAnnotation`](#baseannotation).[`opacity`](#opacity) | | `originX?` | `"left"` \| `"center"` \| `"right"` | [`BaseAnnotation`](#baseannotation).[`originX`](#originx) | | `originY?` | `"center"` \| `"top"` \| `"bottom"` | [`BaseAnnotation`](#baseannotation).[`originY`](#originy) | | `radius?` | `number` | - | | `scaleX?` | `number` | [`BaseAnnotation`](#baseannotation).[`scaleX`](#scalex) | | `scaleY?` | `number` | [`BaseAnnotation`](#baseannotation).[`scaleY`](#scaley) | | `shadow?` | \{ `blur?`: `number`; `color?`: `string`; `offsetX?`: `number`; `offsetY?`: `number`; } | [`BaseAnnotation`](#baseannotation).[`shadow`](#shadow) | | `shadow.blur?` | `number` | - | | `shadow.color?` | `string` | - | | `shadow.offsetX?` | `number` | - | | `shadow.offsetY?` | `number` | - | | `skewX?` | `number` | [`BaseAnnotation`](#baseannotation).[`skewX`](#skewx) | | `skewY?` | `number` | [`BaseAnnotation`](#baseannotation).[`skewY`](#skewy) | | `startTimestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`startTimestamp`](#starttimestamp) | | `strokeDashArray?` | `number`\[] | [`BaseAnnotation`](#baseannotation).[`strokeDashArray`](#strokedasharray) | | `strokeLineCap?` | `"butt"` \| `"round"` \| `"square"` | [`BaseAnnotation`](#baseannotation).[`strokeLineCap`](#strokelinecap) | | `strokeLineJoin?` | `"round"` \| `"miter"` \| `"bevel"` | [`BaseAnnotation`](#baseannotation).[`strokeLineJoin`](#strokelinejoin) | | `strokeMiterLimit?` | `number` | [`BaseAnnotation`](#baseannotation).[`strokeMiterLimit`](#strokemiterlimit) | | `timestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`timestamp`](#timestamp) | | `top?` | `number` | [`BaseAnnotation`](#baseannotation).[`top`](#top) | | `type` | `"dot"` | - | | `visible?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`visible`](#visible) | | `width?` | `number` | [`BaseAnnotation`](#baseannotation).[`width`](#width) | *** ### FetchLinkPreviewsData [#fetchlinkpreviewsdata] #### Properties [#properties-11] | Property | Type | | ---------------------- | ----------- | | `urls` | `string`\[] | *** ### FileAttachmentData [#fileattachmentdata] #### Properties [#properties-12] | Property | Type | | ------------------------------ | -------- | | `checksum` | `string` | | `id` | `number` | | `name` | `string` | | `sizeInMB` | `number` | *** ### FrameCommentAnnotation [#framecommentannotation] #### Extends [#extends-3] * [`BaseAnnotation`](#baseannotation) #### Properties [#properties-13] | Property | Type | Inherited from | | --------------------------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | | `angle?` | `number` | [`BaseAnnotation`](#baseannotation).[`angle`](#angle) | | `color?` | `string` | [`BaseAnnotation`](#baseannotation).[`color`](#color) | | `endTimestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`endTimestamp`](#endtimestamp) | | `fillRule?` | `"nonzero"` \| `"evenodd"` | [`BaseAnnotation`](#baseannotation).[`fillRule`](#fillrule) | | `flipX?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`flipX`](#flipx) | | `flipY?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`flipY`](#flipy) | | `frame?` | `number` | [`BaseAnnotation`](#baseannotation).[`frame`](#frame) | | `height?` | `number` | [`BaseAnnotation`](#baseannotation).[`height`](#height) | | `left?` | `number` | [`BaseAnnotation`](#baseannotation).[`left`](#left) | | `nestedAnnotations?` | [`NestedAnnotation`](#nestedannotation)\[] | - | | `opacity?` | `number` | [`BaseAnnotation`](#baseannotation).[`opacity`](#opacity) | | `originX?` | `"left"` \| `"center"` \| `"right"` | [`BaseAnnotation`](#baseannotation).[`originX`](#originx) | | `originY?` | `"center"` \| `"top"` \| `"bottom"` | [`BaseAnnotation`](#baseannotation).[`originY`](#originy) | | `scaleX?` | `number` | [`BaseAnnotation`](#baseannotation).[`scaleX`](#scalex) | | `scaleY?` | `number` | [`BaseAnnotation`](#baseannotation).[`scaleY`](#scaley) | | `shadow?` | \{ `blur?`: `number`; `color?`: `string`; `offsetX?`: `number`; `offsetY?`: `number`; } | [`BaseAnnotation`](#baseannotation).[`shadow`](#shadow) | | `shadow.blur?` | `number` | - | | `shadow.color?` | `string` | - | | `shadow.offsetX?` | `number` | - | | `shadow.offsetY?` | `number` | - | | `skewX?` | `number` | [`BaseAnnotation`](#baseannotation).[`skewX`](#skewx) | | `skewY?` | `number` | [`BaseAnnotation`](#baseannotation).[`skewY`](#skewy) | | `startTimestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`startTimestamp`](#starttimestamp) | | `strokeDashArray?` | `number`\[] | [`BaseAnnotation`](#baseannotation).[`strokeDashArray`](#strokedasharray) | | `strokeLineCap?` | `"butt"` \| `"round"` \| `"square"` | [`BaseAnnotation`](#baseannotation).[`strokeLineCap`](#strokelinecap) | | `strokeLineJoin?` | `"round"` \| `"miter"` \| `"bevel"` | [`BaseAnnotation`](#baseannotation).[`strokeLineJoin`](#strokelinejoin) | | `strokeMiterLimit?` | `number` | [`BaseAnnotation`](#baseannotation).[`strokeMiterLimit`](#strokemiterlimit) | | `timestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`timestamp`](#timestamp) | | `top?` | `number` | [`BaseAnnotation`](#baseannotation).[`top`](#top) | | `type` | `"frameComment"` | - | | `visible?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`visible`](#visible) | | `width?` | `number` | [`BaseAnnotation`](#baseannotation).[`width`](#width) | *** ### GetChatByTopicIdParams [#getchatbytopicidparams] #### Extends [#extends-4] * [`SortParams`](#sortparams) #### Properties [#properties-14] | Property | Type | Inherited from | | ------------------------------------- | -------------------------------- | ---------------------------------------------- | | `messages?` | `number` | - | | `replies?` | `number` | - | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-12) | | `topicType` | `string` | - | | `visibility?` | `"creator"` \| `"reviewer"` | - | *** ### GetMentionableAssetsParams [#getmentionableassetsparams] #### Extends [#extends-5] * [`PaginationParams`](#paginationparams).[`SortParams`](#sortparams) #### Properties [#properties-15] | Property | Type | Inherited from | | ------------------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------- | | `cursor?` | `string` | [`PaginationParams`](#paginationparams).[`cursor`](#cursor-9) | | `includeCounts?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCounts`](#includecounts-9) | | `includeCursorRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCursorRecord`](#includecursorrecord-9) | | `includeStartAtRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeStartAtRecord`](#includestartatrecord-9) | | `limit?` | `number` | [`PaginationParams`](#paginationparams).[`limit`](#limit-9) | | `nameSearch?` | `string` | - | | `page?` | `number` | [`PaginationParams`](#paginationparams).[`page`](#page-9) | | `paginate?` | `"cursor"` \| `"index"` | [`PaginationParams`](#paginationparams).[`paginate`](#paginate-9) | | `paginateReverse?` | `boolean` | [`PaginationParams`](#paginationparams).[`paginateReverse`](#paginatereverse-9) | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-12) | | `startAt?` | `string` | [`PaginationParams`](#paginationparams).[`startAt`](#startat-9) | *** ### GetMentionableFoldersParams [#getmentionablefoldersparams] #### Extends [#extends-6] * [`PaginationParams`](#paginationparams).[`SortParams`](#sortparams) #### Properties [#properties-16] | Property | Type | Inherited from | | --------------------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------- | | `cursor?` | `string` | [`PaginationParams`](#paginationparams).[`cursor`](#cursor-9) | | `includeCounts?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCounts`](#includecounts-9) | | `includeCursorRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCursorRecord`](#includecursorrecord-9) | | `includeStartAtRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeStartAtRecord`](#includestartatrecord-9) | | `limit?` | `number` | [`PaginationParams`](#paginationparams).[`limit`](#limit-9) | | `nameSearch?` | `string` | - | | `page?` | `number` | [`PaginationParams`](#paginationparams).[`page`](#page-9) | | `paginate?` | `"cursor"` \| `"index"` | [`PaginationParams`](#paginationparams).[`paginate`](#paginate-9) | | `paginateReverse?` | `boolean` | [`PaginationParams`](#paginationparams).[`paginateReverse`](#paginatereverse-9) | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-12) | | `startAt?` | `string` | [`PaginationParams`](#paginationparams).[`startAt`](#startat-9) | *** ### GetMentionablePublicsParams [#getmentionablepublicsparams] #### Extends [#extends-7] * [`PaginationParams`](#paginationparams).[`SortParams`](#sortparams) #### Properties [#properties-17] | Property | Type | Inherited from | | --------------------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------- | | `cursor?` | `string` | [`PaginationParams`](#paginationparams).[`cursor`](#cursor-9) | | `includeCounts?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCounts`](#includecounts-9) | | `includeCursorRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCursorRecord`](#includecursorrecord-9) | | `includeStartAtRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeStartAtRecord`](#includestartatrecord-9) | | `limit?` | `number` | [`PaginationParams`](#paginationparams).[`limit`](#limit-9) | | `nameSearch?` | `string` | - | | `page?` | `number` | [`PaginationParams`](#paginationparams).[`page`](#page-9) | | `paginate?` | `"cursor"` \| `"index"` | [`PaginationParams`](#paginationparams).[`paginate`](#paginate-9) | | `paginateReverse?` | `boolean` | [`PaginationParams`](#paginationparams).[`paginateReverse`](#paginatereverse-9) | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-12) | | `startAt?` | `string` | [`PaginationParams`](#paginationparams).[`startAt`](#startat-9) | *** ### GetMentionableSubmissionsParams [#getmentionablesubmissionsparams] #### Extends [#extends-8] * [`PaginationParams`](#paginationparams).[`SortParams`](#sortparams) #### Properties [#properties-18] | Property | Type | Inherited from | | --------------------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------- | | `cursor?` | `string` | [`PaginationParams`](#paginationparams).[`cursor`](#cursor-9) | | `includeCounts?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCounts`](#includecounts-9) | | `includeCursorRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCursorRecord`](#includecursorrecord-9) | | `includeStartAtRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeStartAtRecord`](#includestartatrecord-9) | | `limit?` | `number` | [`PaginationParams`](#paginationparams).[`limit`](#limit-9) | | `nameSearch?` | `string` | - | | `page?` | `number` | [`PaginationParams`](#paginationparams).[`page`](#page-9) | | `paginate?` | `"cursor"` \| `"index"` | [`PaginationParams`](#paginationparams).[`paginate`](#paginate-9) | | `paginateReverse?` | `boolean` | [`PaginationParams`](#paginationparams).[`paginateReverse`](#paginatereverse-9) | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-12) | | `startAt?` | `string` | [`PaginationParams`](#paginationparams).[`startAt`](#startat-9) | *** ### GetMentionableTasksParams [#getmentionabletasksparams] #### Extends [#extends-9] * [`PaginationParams`](#paginationparams).[`SortParams`](#sortparams) #### Properties [#properties-19] | Property | Type | Inherited from | | --------------------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------- | | `cursor?` | `string` | [`PaginationParams`](#paginationparams).[`cursor`](#cursor-9) | | `includeCounts?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCounts`](#includecounts-9) | | `includeCursorRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCursorRecord`](#includecursorrecord-9) | | `includeStartAtRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeStartAtRecord`](#includestartatrecord-9) | | `limit?` | `number` | [`PaginationParams`](#paginationparams).[`limit`](#limit-9) | | `nameSearch?` | `string` | - | | `page?` | `number` | [`PaginationParams`](#paginationparams).[`page`](#page-9) | | `paginate?` | `"cursor"` \| `"index"` | [`PaginationParams`](#paginationparams).[`paginate`](#paginate-9) | | `paginateReverse?` | `boolean` | [`PaginationParams`](#paginationparams).[`paginateReverse`](#paginatereverse-9) | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-12) | | `startAt?` | `string` | [`PaginationParams`](#paginationparams).[`startAt`](#startat-9) | *** ### GetMessageParams [#getmessageparams] #### Extends [#extends-10] * [`SortParams`](#sortparams) #### Properties [#properties-20] | Property | Type | Inherited from | | ------------------------------- | -------------------------------- | ---------------------------------------------- | | `replies?` | `number` | - | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-12) | *** ### GetMessagesParams [#getmessagesparams] #### Extends [#extends-11] * [`PaginationParams`](#paginationparams).[`SortParams`](#sortparams).[`DateRangeParams`](#daterangeparams) #### Properties [#properties-21] | Property | Type | Inherited from | | --------------------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------- | | `authorId?` | `string` | - | | `contentSearch?` | `string` | - | | `createdAfter?` | `string` \| `number` | [`DateRangeParams`](#daterangeparams).[`createdAfter`](#createdafter) | | `createdBefore?` | `string` \| `number` | [`DateRangeParams`](#daterangeparams).[`createdBefore`](#createdbefore) | | `cursor?` | `string` | [`PaginationParams`](#paginationparams).[`cursor`](#cursor-9) | | `excludeReplies?` | `boolean` | - | | `hasAnnotations?` | `boolean` | - | | `hasAttachments?` | `boolean` | - | | `highlighted?` | `boolean` | - | | `includeCounts?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCounts`](#includecounts-9) | | `includeCursorRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCursorRecord`](#includecursorrecord-9) | | `includeStartAtRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeStartAtRecord`](#includestartatrecord-9) | | `isConvoMessage?` | `boolean` | - | | `limit?` | `number` | [`PaginationParams`](#paginationparams).[`limit`](#limit-9) | | `page?` | `number` | [`PaginationParams`](#paginationparams).[`page`](#page-9) | | `paginate?` | `"cursor"` \| `"index"` | [`PaginationParams`](#paginationparams).[`paginate`](#paginate-9) | | `paginateReverse?` | `boolean` | [`PaginationParams`](#paginationparams).[`paginateReverse`](#paginatereverse-9) | | `replies?` | `number` | - | | `replyLimit?` | `number` | - | | `replySort?` | `Record`\<`string`, `-1` \| `1`> | - | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-12) | | `startAt?` | `string` | [`PaginationParams`](#paginationparams).[`startAt`](#startat-9) | | `type?` | `"user"` \| `"system"` | - | | `updatedBefore?` | `string` \| `number` | [`DateRangeParams`](#daterangeparams).[`updatedBefore`](#updatedbefore) | *** ### GetRepliesParams [#getrepliesparams] #### Extends [#extends-12] * [`PaginationParams`](#paginationparams).[`SortParams`](#sortparams).[`DateRangeParams`](#daterangeparams) #### Properties [#properties-22] | Property | Type | Inherited from | | --------------------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------- | | `createdAfter?` | `string` \| `number` | [`DateRangeParams`](#daterangeparams).[`createdAfter`](#createdafter) | | `createdBefore?` | `string` \| `number` | [`DateRangeParams`](#daterangeparams).[`createdBefore`](#createdbefore) | | `cursor?` | `string` | [`PaginationParams`](#paginationparams).[`cursor`](#cursor-9) | | `includeCounts?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCounts`](#includecounts-9) | | `includeCursorRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCursorRecord`](#includecursorrecord-9) | | `includeStartAtRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeStartAtRecord`](#includestartatrecord-9) | | `limit?` | `number` | [`PaginationParams`](#paginationparams).[`limit`](#limit-9) | | `page?` | `number` | [`PaginationParams`](#paginationparams).[`page`](#page-9) | | `paginate?` | `"cursor"` \| `"index"` | [`PaginationParams`](#paginationparams).[`paginate`](#paginate-9) | | `paginateReverse?` | `boolean` | [`PaginationParams`](#paginationparams).[`paginateReverse`](#paginatereverse-9) | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-12) | | `startAt?` | `string` | [`PaginationParams`](#paginationparams).[`startAt`](#startat-9) | | `updatedBefore?` | `string` \| `number` | [`DateRangeParams`](#daterangeparams).[`updatedBefore`](#updatedbefore) | *** ### GetUsersMemberChatsParams [#getusersmemberchatsparams] #### Extends [#extends-13] * [`PaginationParams`](#paginationparams).[`SortParams`](#sortparams).[`DateRangeParams`](#daterangeparams) #### Properties [#properties-23] | Property | Type | Inherited from | | --------------------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------- | | `archived?` | `boolean` | - | | `createdAfter?` | `string` \| `number` | [`DateRangeParams`](#daterangeparams).[`createdAfter`](#createdafter) | | `createdBefore?` | `string` \| `number` | [`DateRangeParams`](#daterangeparams).[`createdBefore`](#createdbefore) | | `cursor?` | `string` | [`PaginationParams`](#paginationparams).[`cursor`](#cursor-9) | | `includeCounts?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCounts`](#includecounts-9) | | `includeCursorRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCursorRecord`](#includecursorrecord-9) | | `includeStartAtRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeStartAtRecord`](#includestartatrecord-9) | | `limit?` | `number` | [`PaginationParams`](#paginationparams).[`limit`](#limit-9) | | `memberSearch?` | `string` | - | | `page?` | `number` | [`PaginationParams`](#paginationparams).[`page`](#page-9) | | `paginate?` | `"cursor"` \| `"index"` | [`PaginationParams`](#paginationparams).[`paginate`](#paginate-9) | | `paginateReverse?` | `boolean` | [`PaginationParams`](#paginationparams).[`paginateReverse`](#paginatereverse-9) | | `recentMessages?` | `number` | - | | `scopeId?` | `string` | - | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-12) | | `startAt?` | `string` | [`PaginationParams`](#paginationparams).[`startAt`](#startat-9) | | `subjectSearch?` | `string` | - | | `updatedBefore?` | `string` \| `number` | [`DateRangeParams`](#daterangeparams).[`updatedBefore`](#updatedbefore) | *** ### GetUsersMentionsParams [#getusersmentionsparams] #### Extends [#extends-14] * [`PaginationParams`](#paginationparams).[`SortParams`](#sortparams).[`DateRangeParams`](#daterangeparams) #### Properties [#properties-24] | Property | Type | Inherited from | | --------------------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------- | | `authorId?` | `string` | - | | `chatId?` | `string` | - | | `createdAfter?` | `string` \| `number` | [`DateRangeParams`](#daterangeparams).[`createdAfter`](#createdafter) | | `createdBefore?` | `string` \| `number` | [`DateRangeParams`](#daterangeparams).[`createdBefore`](#createdbefore) | | `cursor?` | `string` | [`PaginationParams`](#paginationparams).[`cursor`](#cursor-9) | | `includeCounts?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCounts`](#includecounts-9) | | `includeCursorRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCursorRecord`](#includecursorrecord-9) | | `includeStartAtRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeStartAtRecord`](#includestartatrecord-9) | | `limit?` | `number` | [`PaginationParams`](#paginationparams).[`limit`](#limit-9) | | `page?` | `number` | [`PaginationParams`](#paginationparams).[`page`](#page-9) | | `paginate?` | `"cursor"` \| `"index"` | [`PaginationParams`](#paginationparams).[`paginate`](#paginate-9) | | `paginateReverse?` | `boolean` | [`PaginationParams`](#paginationparams).[`paginateReverse`](#paginatereverse-9) | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-12) | | `startAt?` | `string` | [`PaginationParams`](#paginationparams).[`startAt`](#startat-9) | | `updatedBefore?` | `string` \| `number` | [`DateRangeParams`](#daterangeparams).[`updatedBefore`](#updatedbefore) | *** ### LinkPreviewResponse [#linkpreviewresponse] #### Properties [#properties-25] | Property | Type | | ------------------------------ | ---------------- | | `previews` | `LinkPreview`\[] | *** ### MemberIdList [#memberidlist] #### Properties [#properties-26] | Property | Type | | ---------------------------------- | ----------- | | `memberIds` | `string`\[] | *** ### MentionablePublic [#mentionablepublic] Mentionable public collection entry returned by `getMentionablePublics`. `token` is the URL-safe stable identifier used in the `publicMention:` message-token payload. #### Properties [#properties-27] | Property | Type | | ------------------------------------ | ---------------------------------------------------------------------------------------------------------- | | `chatId` | `string` \| `null` | | `createdAt` | `string` | | `creator` | \| \{ `displayName?`: `string`; `firstName?`: `string`; `id`: `string`; `lastName?`: `string`; } \| `null` | | `description` | `string` \| `null` | | `expiresAt` | `string` \| `null` | | `id` | `string` | | `status` | `string` | | `title` | `string` | | `token` | `string` | *** ### MentionableSubmission [#mentionablesubmission] Mentionable submission entry returned by `getMentionableSubmissions`. Each submission's `id` doubles as the `chatId` (the ChatSubmission row IS the submission chat). #### Properties [#properties-28] | Property | Type | | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------- | | `chatId` | `string` | | `creator` | \| \{ `displayName?`: `string`; `firstName?`: `string`; `id`: `string`; `lastName?`: `string`; } \| `null` | | `description` | `string` \| `null` | | `id` | `string` | | `lastMessageAt` | `string` \| `null` | | `publishedAt` | `string` | | `status` | `string` | | `subject` | `string` | | `totalMessages` | `number` | | `version` | `string` \| `null` | *** ### NestedDotAnnotation [#nesteddotannotation] #### Extends [#extends-15] * [`BaseAnnotation`](#baseannotation) #### Properties [#properties-29] | Property | Type | Inherited from | | ------------------------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | | `angle?` | `number` | [`BaseAnnotation`](#baseannotation).[`angle`](#angle) | | `color?` | `string` | [`BaseAnnotation`](#baseannotation).[`color`](#color) | | `coordinates` | [`PercentageCoordinates`](#percentagecoordinates) | - | | `endTimestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`endTimestamp`](#endtimestamp) | | `fillRule?` | `"nonzero"` \| `"evenodd"` | [`BaseAnnotation`](#baseannotation).[`fillRule`](#fillrule) | | `flipX?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`flipX`](#flipx) | | `flipY?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`flipY`](#flipy) | | `frame?` | `number` | [`BaseAnnotation`](#baseannotation).[`frame`](#frame) | | `height?` | `number` | [`BaseAnnotation`](#baseannotation).[`height`](#height) | | `left?` | `number` | [`BaseAnnotation`](#baseannotation).[`left`](#left) | | `opacity?` | `number` | [`BaseAnnotation`](#baseannotation).[`opacity`](#opacity) | | `originX?` | `"left"` \| `"center"` \| `"right"` | [`BaseAnnotation`](#baseannotation).[`originX`](#originx) | | `originY?` | `"center"` \| `"top"` \| `"bottom"` | [`BaseAnnotation`](#baseannotation).[`originY`](#originy) | | `radius?` | `number` | - | | `scaleX?` | `number` | [`BaseAnnotation`](#baseannotation).[`scaleX`](#scalex) | | `scaleY?` | `number` | [`BaseAnnotation`](#baseannotation).[`scaleY`](#scaley) | | `shadow?` | \{ `blur?`: `number`; `color?`: `string`; `offsetX?`: `number`; `offsetY?`: `number`; } | [`BaseAnnotation`](#baseannotation).[`shadow`](#shadow) | | `shadow.blur?` | `number` | - | | `shadow.color?` | `string` | - | | `shadow.offsetX?` | `number` | - | | `shadow.offsetY?` | `number` | - | | `skewX?` | `number` | [`BaseAnnotation`](#baseannotation).[`skewX`](#skewx) | | `skewY?` | `number` | [`BaseAnnotation`](#baseannotation).[`skewY`](#skewy) | | `startTimestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`startTimestamp`](#starttimestamp) | | `strokeDashArray?` | `number`\[] | [`BaseAnnotation`](#baseannotation).[`strokeDashArray`](#strokedasharray) | | `strokeLineCap?` | `"butt"` \| `"round"` \| `"square"` | [`BaseAnnotation`](#baseannotation).[`strokeLineCap`](#strokelinecap) | | `strokeLineJoin?` | `"round"` \| `"miter"` \| `"bevel"` | [`BaseAnnotation`](#baseannotation).[`strokeLineJoin`](#strokelinejoin) | | `strokeMiterLimit?` | `number` | [`BaseAnnotation`](#baseannotation).[`strokeMiterLimit`](#strokemiterlimit) | | `timestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`timestamp`](#timestamp) | | `top?` | `number` | [`BaseAnnotation`](#baseannotation).[`top`](#top) | | `type` | `"dot"` | - | | `visible?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`visible`](#visible) | | `width?` | `number` | [`BaseAnnotation`](#baseannotation).[`width`](#width) | *** ### NestedPathAnnotation [#nestedpathannotation] #### Extends [#extends-16] * [`BaseAnnotation`](#baseannotation) #### Properties [#properties-30] | Property | Type | Inherited from | | ------------------------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | | `angle?` | `number` | [`BaseAnnotation`](#baseannotation).[`angle`](#angle) | | `color?` | `string` | [`BaseAnnotation`](#baseannotation).[`color`](#color) | | `endTimestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`endTimestamp`](#endtimestamp) | | `fillRule?` | `"nonzero"` \| `"evenodd"` | [`BaseAnnotation`](#baseannotation).[`fillRule`](#fillrule) | | `flipX?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`flipX`](#flipx) | | `flipY?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`flipY`](#flipy) | | `frame?` | `number` | [`BaseAnnotation`](#baseannotation).[`frame`](#frame) | | `height?` | `number` | [`BaseAnnotation`](#baseannotation).[`height`](#height) | | `left?` | `number` | [`BaseAnnotation`](#baseannotation).[`left`](#left) | | `opacity?` | `number` | [`BaseAnnotation`](#baseannotation).[`opacity`](#opacity) | | `originX?` | `"left"` \| `"center"` \| `"right"` | [`BaseAnnotation`](#baseannotation).[`originX`](#originx) | | `originY?` | `"center"` \| `"top"` \| `"bottom"` | [`BaseAnnotation`](#baseannotation).[`originY`](#originy) | | `pathData` | `string` | - | | `scaleX?` | `number` | [`BaseAnnotation`](#baseannotation).[`scaleX`](#scalex) | | `scaleY?` | `number` | [`BaseAnnotation`](#baseannotation).[`scaleY`](#scaley) | | `shadow?` | \{ `blur?`: `number`; `color?`: `string`; `offsetX?`: `number`; `offsetY?`: `number`; } | [`BaseAnnotation`](#baseannotation).[`shadow`](#shadow) | | `shadow.blur?` | `number` | - | | `shadow.color?` | `string` | - | | `shadow.offsetX?` | `number` | - | | `shadow.offsetY?` | `number` | - | | `skewX?` | `number` | [`BaseAnnotation`](#baseannotation).[`skewX`](#skewx) | | `skewY?` | `number` | [`BaseAnnotation`](#baseannotation).[`skewY`](#skewy) | | `startTimestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`startTimestamp`](#starttimestamp) | | `strokeColor?` | `string` | - | | `strokeDashArray?` | `number`\[] | [`BaseAnnotation`](#baseannotation).[`strokeDashArray`](#strokedasharray) | | `strokeLineCap?` | `"butt"` \| `"round"` \| `"square"` | [`BaseAnnotation`](#baseannotation).[`strokeLineCap`](#strokelinecap) | | `strokeLineJoin?` | `"round"` \| `"miter"` \| `"bevel"` | [`BaseAnnotation`](#baseannotation).[`strokeLineJoin`](#strokelinejoin) | | `strokeMiterLimit?` | `number` | [`BaseAnnotation`](#baseannotation).[`strokeMiterLimit`](#strokemiterlimit) | | `strokeWidth?` | `number` | - | | `timestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`timestamp`](#timestamp) | | `top?` | `number` | [`BaseAnnotation`](#baseannotation).[`top`](#top) | | `type` | `"path"` | - | | `visible?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`visible`](#visible) | | `width?` | `number` | [`BaseAnnotation`](#baseannotation).[`width`](#width) | *** ### NestedShapeAnnotation [#nestedshapeannotation] #### Extends [#extends-17] * [`BaseAnnotation`](#baseannotation) #### Properties [#properties-31] | Property | Type | Inherited from | | ------------------------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | | `angle?` | `number` | [`BaseAnnotation`](#baseannotation).[`angle`](#angle) | | `color?` | `string` | [`BaseAnnotation`](#baseannotation).[`color`](#color) | | `coordinates` | [`PercentageCoordinates`](#percentagecoordinates)\[] | - | | `endTimestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`endTimestamp`](#endtimestamp) | | `fillColor?` | `string` | - | | `fillRule?` | `"nonzero"` \| `"evenodd"` | [`BaseAnnotation`](#baseannotation).[`fillRule`](#fillrule) | | `flipX?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`flipX`](#flipx) | | `flipY?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`flipY`](#flipy) | | `frame?` | `number` | [`BaseAnnotation`](#baseannotation).[`frame`](#frame) | | `height?` | `number` | [`BaseAnnotation`](#baseannotation).[`height`](#height) | | `left?` | `number` | [`BaseAnnotation`](#baseannotation).[`left`](#left) | | `opacity?` | `number` | [`BaseAnnotation`](#baseannotation).[`opacity`](#opacity) | | `originX?` | `"left"` \| `"center"` \| `"right"` | [`BaseAnnotation`](#baseannotation).[`originX`](#originx) | | `originY?` | `"center"` \| `"top"` \| `"bottom"` | [`BaseAnnotation`](#baseannotation).[`originY`](#originy) | | `scaleX?` | `number` | [`BaseAnnotation`](#baseannotation).[`scaleX`](#scalex) | | `scaleY?` | `number` | [`BaseAnnotation`](#baseannotation).[`scaleY`](#scaley) | | `shadow?` | \{ `blur?`: `number`; `color?`: `string`; `offsetX?`: `number`; `offsetY?`: `number`; } | [`BaseAnnotation`](#baseannotation).[`shadow`](#shadow) | | `shadow.blur?` | `number` | - | | `shadow.color?` | `string` | - | | `shadow.offsetX?` | `number` | - | | `shadow.offsetY?` | `number` | - | | `skewX?` | `number` | [`BaseAnnotation`](#baseannotation).[`skewX`](#skewx) | | `skewY?` | `number` | [`BaseAnnotation`](#baseannotation).[`skewY`](#skewy) | | `startTimestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`startTimestamp`](#starttimestamp) | | `strokeColor?` | `string` | - | | `strokeDashArray?` | `number`\[] | [`BaseAnnotation`](#baseannotation).[`strokeDashArray`](#strokedasharray) | | `strokeLineCap?` | `"butt"` \| `"round"` \| `"square"` | [`BaseAnnotation`](#baseannotation).[`strokeLineCap`](#strokelinecap) | | `strokeLineJoin?` | `"round"` \| `"miter"` \| `"bevel"` | [`BaseAnnotation`](#baseannotation).[`strokeLineJoin`](#strokelinejoin) | | `strokeMiterLimit?` | `number` | [`BaseAnnotation`](#baseannotation).[`strokeMiterLimit`](#strokemiterlimit) | | `strokeWidth?` | `number` | - | | `timestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`timestamp`](#timestamp) | | `top?` | `number` | [`BaseAnnotation`](#baseannotation).[`top`](#top) | | `type` | `"rectangle"` \| `"circle"` \| `"triangle"` \| `"arrow"` \| `"line"` | - | | `visible?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`visible`](#visible) | | `width?` | `number` | [`BaseAnnotation`](#baseannotation).[`width`](#width) | *** ### NestedTextAnnotation [#nestedtextannotation] #### Extends [#extends-18] * [`BaseAnnotation`](#baseannotation) #### Properties [#properties-32] | Property | Type | Inherited from | | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | | `angle?` | `number` | [`BaseAnnotation`](#baseannotation).[`angle`](#angle) | | `color?` | `string` | [`BaseAnnotation`](#baseannotation).[`color`](#color) | | `content` | `string` | - | | `coordinates` | [`PercentageCoordinates`](#percentagecoordinates) | - | | `endTimestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`endTimestamp`](#endtimestamp) | | `fillRule?` | `"nonzero"` \| `"evenodd"` | [`BaseAnnotation`](#baseannotation).[`fillRule`](#fillrule) | | `flipX?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`flipX`](#flipx) | | `flipY?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`flipY`](#flipy) | | `fontFamily?` | \| `"Arial"` \| `"Helvetica"` \| `"Times New Roman"` \| `"Courier New"` \| `"Georgia"` \| `"Verdana"` | - | | `fontSize?` | `number` | - | | `fontStyle?` | `"normal"` \| `"italic"` | - | | `fontWeight?` | `"normal"` \| `"bold"` | - | | `frame?` | `number` | [`BaseAnnotation`](#baseannotation).[`frame`](#frame) | | `height?` | `number` | [`BaseAnnotation`](#baseannotation).[`height`](#height) | | `left?` | `number` | [`BaseAnnotation`](#baseannotation).[`left`](#left) | | `opacity?` | `number` | [`BaseAnnotation`](#baseannotation).[`opacity`](#opacity) | | `originX?` | `"left"` \| `"center"` \| `"right"` | [`BaseAnnotation`](#baseannotation).[`originX`](#originx) | | `originY?` | `"center"` \| `"top"` \| `"bottom"` | [`BaseAnnotation`](#baseannotation).[`originY`](#originy) | | `scaleX?` | `number` | [`BaseAnnotation`](#baseannotation).[`scaleX`](#scalex) | | `scaleY?` | `number` | [`BaseAnnotation`](#baseannotation).[`scaleY`](#scaley) | | `shadow?` | \{ `blur?`: `number`; `color?`: `string`; `offsetX?`: `number`; `offsetY?`: `number`; } | [`BaseAnnotation`](#baseannotation).[`shadow`](#shadow) | | `shadow.blur?` | `number` | - | | `shadow.color?` | `string` | - | | `shadow.offsetX?` | `number` | - | | `shadow.offsetY?` | `number` | - | | `skewX?` | `number` | [`BaseAnnotation`](#baseannotation).[`skewX`](#skewx) | | `skewY?` | `number` | [`BaseAnnotation`](#baseannotation).[`skewY`](#skewy) | | `startTimestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`startTimestamp`](#starttimestamp) | | `strokeDashArray?` | `number`\[] | [`BaseAnnotation`](#baseannotation).[`strokeDashArray`](#strokedasharray) | | `strokeLineCap?` | `"butt"` \| `"round"` \| `"square"` | [`BaseAnnotation`](#baseannotation).[`strokeLineCap`](#strokelinecap) | | `strokeLineJoin?` | `"round"` \| `"miter"` \| `"bevel"` | [`BaseAnnotation`](#baseannotation).[`strokeLineJoin`](#strokelinejoin) | | `strokeMiterLimit?` | `number` | [`BaseAnnotation`](#baseannotation).[`strokeMiterLimit`](#strokemiterlimit) | | `textColor?` | `string` | - | | `timestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`timestamp`](#timestamp) | | `top?` | `number` | [`BaseAnnotation`](#baseannotation).[`top`](#top) | | `type` | `"text"` | - | | `visible?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`visible`](#visible) | | `width?` | `number` | [`BaseAnnotation`](#baseannotation).[`width`](#width) | *** ### PaginationParams [#paginationparams] #### Extended by [#extended-by-3] * [`GetUsersMemberChatsParams`](#getusersmemberchatsparams) * [`GetUsersMentionsParams`](#getusersmentionsparams) * [`GetMessagesParams`](#getmessagesparams) * [`GetRepliesParams`](#getrepliesparams) * [`GetMentionableAssetsParams`](#getmentionableassetsparams) * [`GetMentionableFoldersParams`](#getmentionablefoldersparams) * [`GetMentionableTasksParams`](#getmentionabletasksparams) * [`GetMentionableSubmissionsParams`](#getmentionablesubmissionsparams) * [`GetMentionablePublicsParams`](#getmentionablepublicsparams) #### Properties [#properties-33] | Property | Type | | --------------------------------------------------------- | ----------------------- | | `cursor?` | `string` | | `includeCounts?` | `boolean` | | `includeCursorRecord?` | `boolean` | | `includeStartAtRecord?` | `boolean` | | `limit?` | `number` | | `page?` | `number` | | `paginate?` | `"cursor"` \| `"index"` | | `paginateReverse?` | `boolean` | | `startAt?` | `string` | *** ### PathAnnotation [#pathannotation] #### Extends [#extends-19] * [`BaseAnnotation`](#baseannotation) #### Properties [#properties-34] | Property | Type | Inherited from | | --------------------------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | | `angle?` | `number` | [`BaseAnnotation`](#baseannotation).[`angle`](#angle) | | `color?` | `string` | [`BaseAnnotation`](#baseannotation).[`color`](#color) | | `endTimestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`endTimestamp`](#endtimestamp) | | `fillRule?` | `"nonzero"` \| `"evenodd"` | [`BaseAnnotation`](#baseannotation).[`fillRule`](#fillrule) | | `flipX?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`flipX`](#flipx) | | `flipY?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`flipY`](#flipy) | | `frame?` | `number` | [`BaseAnnotation`](#baseannotation).[`frame`](#frame) | | `height?` | `number` | [`BaseAnnotation`](#baseannotation).[`height`](#height) | | `left?` | `number` | [`BaseAnnotation`](#baseannotation).[`left`](#left) | | `nestedAnnotations?` | [`NestedAnnotation`](#nestedannotation)\[] | - | | `opacity?` | `number` | [`BaseAnnotation`](#baseannotation).[`opacity`](#opacity) | | `originX?` | `"left"` \| `"center"` \| `"right"` | [`BaseAnnotation`](#baseannotation).[`originX`](#originx) | | `originY?` | `"center"` \| `"top"` \| `"bottom"` | [`BaseAnnotation`](#baseannotation).[`originY`](#originy) | | `pathData` | `string` | - | | `scaleX?` | `number` | [`BaseAnnotation`](#baseannotation).[`scaleX`](#scalex) | | `scaleY?` | `number` | [`BaseAnnotation`](#baseannotation).[`scaleY`](#scaley) | | `shadow?` | \{ `blur?`: `number`; `color?`: `string`; `offsetX?`: `number`; `offsetY?`: `number`; } | [`BaseAnnotation`](#baseannotation).[`shadow`](#shadow) | | `shadow.blur?` | `number` | - | | `shadow.color?` | `string` | - | | `shadow.offsetX?` | `number` | - | | `shadow.offsetY?` | `number` | - | | `skewX?` | `number` | [`BaseAnnotation`](#baseannotation).[`skewX`](#skewx) | | `skewY?` | `number` | [`BaseAnnotation`](#baseannotation).[`skewY`](#skewy) | | `startTimestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`startTimestamp`](#starttimestamp) | | `strokeColor?` | `string` | - | | `strokeDashArray?` | `number`\[] | [`BaseAnnotation`](#baseannotation).[`strokeDashArray`](#strokedasharray) | | `strokeLineCap?` | `"butt"` \| `"round"` \| `"square"` | [`BaseAnnotation`](#baseannotation).[`strokeLineCap`](#strokelinecap) | | `strokeLineJoin?` | `"round"` \| `"miter"` \| `"bevel"` | [`BaseAnnotation`](#baseannotation).[`strokeLineJoin`](#strokelinejoin) | | `strokeMiterLimit?` | `number` | [`BaseAnnotation`](#baseannotation).[`strokeMiterLimit`](#strokemiterlimit) | | `strokeWidth?` | `number` | - | | `timestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`timestamp`](#timestamp) | | `top?` | `number` | [`BaseAnnotation`](#baseannotation).[`top`](#top) | | `type` | `"path"` | - | | `visible?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`visible`](#visible) | | `width?` | `number` | [`BaseAnnotation`](#baseannotation).[`width`](#width) | *** ### PercentageCoordinates [#percentagecoordinates] #### Properties [#properties-35] | Property | Type | | ---------------- | -------- | | `x` | `number` | | `y` | `number` | *** ### ReviseMessageData [#revisemessagedata] #### Properties [#properties-36] | Property | Type | | ----------------------------------------------------- | ------------------------------ | | `annotations?` | [`Annotation`](#annotation)\[] | | `assetMentions?` | `string`\[] | | `content?` | `string` | | `folderMentions?` | `string`\[] | | `linkPreviews?` | `LinkPreview`\[] | | `mentions?` | `string`\[] | | `publicMentions?` | `string`\[] | | `quotes?` | `string`\[] | | `submissionMentions?` | `string`\[] | | `taskMentions?` | `string`\[] | *** ### ScratchAttachmentRef [#scratchattachmentref] Scratch-shape attachment ref — points at bytes already uploaded as a scratch upload. Used by AI Revision (Attach to chat) and the Nurama Support chat (image attachments). The chat-send endpoint accepts either this shape OR the upload-shape (`FileAttachmentData`) in the same `attachments[]` array; the server handles each item according to its shape. #### Properties [#properties-37] | Property | Type | | -------------------------------- | -------- | | `name?` | `string` | | `scratchId` | `string` | *** ### ShapeAnnotation [#shapeannotation] #### Extends [#extends-20] * [`BaseAnnotation`](#baseannotation) #### Properties [#properties-38] | Property | Type | Inherited from | | --------------------------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | | `angle?` | `number` | [`BaseAnnotation`](#baseannotation).[`angle`](#angle) | | `color?` | `string` | [`BaseAnnotation`](#baseannotation).[`color`](#color) | | `coordinates` | [`PercentageCoordinates`](#percentagecoordinates)\[] | - | | `endTimestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`endTimestamp`](#endtimestamp) | | `fillColor?` | `string` | - | | `fillRule?` | `"nonzero"` \| `"evenodd"` | [`BaseAnnotation`](#baseannotation).[`fillRule`](#fillrule) | | `flipX?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`flipX`](#flipx) | | `flipY?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`flipY`](#flipy) | | `frame?` | `number` | [`BaseAnnotation`](#baseannotation).[`frame`](#frame) | | `height?` | `number` | [`BaseAnnotation`](#baseannotation).[`height`](#height) | | `left?` | `number` | [`BaseAnnotation`](#baseannotation).[`left`](#left) | | `nestedAnnotations?` | [`NestedAnnotation`](#nestedannotation)\[] | - | | `opacity?` | `number` | [`BaseAnnotation`](#baseannotation).[`opacity`](#opacity) | | `originX?` | `"left"` \| `"center"` \| `"right"` | [`BaseAnnotation`](#baseannotation).[`originX`](#originx) | | `originY?` | `"center"` \| `"top"` \| `"bottom"` | [`BaseAnnotation`](#baseannotation).[`originY`](#originy) | | `scaleX?` | `number` | [`BaseAnnotation`](#baseannotation).[`scaleX`](#scalex) | | `scaleY?` | `number` | [`BaseAnnotation`](#baseannotation).[`scaleY`](#scaley) | | `shadow?` | \{ `blur?`: `number`; `color?`: `string`; `offsetX?`: `number`; `offsetY?`: `number`; } | [`BaseAnnotation`](#baseannotation).[`shadow`](#shadow) | | `shadow.blur?` | `number` | - | | `shadow.color?` | `string` | - | | `shadow.offsetX?` | `number` | - | | `shadow.offsetY?` | `number` | - | | `skewX?` | `number` | [`BaseAnnotation`](#baseannotation).[`skewX`](#skewx) | | `skewY?` | `number` | [`BaseAnnotation`](#baseannotation).[`skewY`](#skewy) | | `startTimestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`startTimestamp`](#starttimestamp) | | `strokeColor?` | `string` | - | | `strokeDashArray?` | `number`\[] | [`BaseAnnotation`](#baseannotation).[`strokeDashArray`](#strokedasharray) | | `strokeLineCap?` | `"butt"` \| `"round"` \| `"square"` | [`BaseAnnotation`](#baseannotation).[`strokeLineCap`](#strokelinecap) | | `strokeLineJoin?` | `"round"` \| `"miter"` \| `"bevel"` | [`BaseAnnotation`](#baseannotation).[`strokeLineJoin`](#strokelinejoin) | | `strokeMiterLimit?` | `number` | [`BaseAnnotation`](#baseannotation).[`strokeMiterLimit`](#strokemiterlimit) | | `strokeWidth?` | `number` | - | | `timestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`timestamp`](#timestamp) | | `top?` | `number` | [`BaseAnnotation`](#baseannotation).[`top`](#top) | | `type` | `"rectangle"` \| `"circle"` \| `"triangle"` \| `"arrow"` \| `"line"` | - | | `visible?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`visible`](#visible) | | `width?` | `number` | [`BaseAnnotation`](#baseannotation).[`width`](#width) | *** ### SortParams [#sortparams] #### Extended by [#extended-by-4] * [`GetUsersMemberChatsParams`](#getusersmemberchatsparams) * [`GetUsersMentionsParams`](#getusersmentionsparams) * [`GetChatByTopicIdParams`](#getchatbytopicidparams) * [`GetMessagesParams`](#getmessagesparams) * [`CreateAssetChatAndMessageParams`](#createassetchatandmessageparams) * [`GetMessageParams`](#getmessageparams) * [`GetRepliesParams`](#getrepliesparams) * [`GetMentionableAssetsParams`](#getmentionableassetsparams) * [`GetMentionableFoldersParams`](#getmentionablefoldersparams) * [`GetMentionableTasksParams`](#getmentionabletasksparams) * [`GetMentionableSubmissionsParams`](#getmentionablesubmissionsparams) * [`GetMentionablePublicsParams`](#getmentionablepublicsparams) #### Properties [#properties-39] | Property | Type | | -------------------------- | -------------------------------- | | `sort?` | `Record`\<`string`, `-1` \| `1`> | *** ### TextAnnotation [#textannotation] #### Extends [#extends-21] * [`BaseAnnotation`](#baseannotation) #### Properties [#properties-40] | Property | Type | Inherited from | | --------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | | `angle?` | `number` | [`BaseAnnotation`](#baseannotation).[`angle`](#angle) | | `color?` | `string` | [`BaseAnnotation`](#baseannotation).[`color`](#color) | | `content` | `string` | - | | `coordinates` | [`PercentageCoordinates`](#percentagecoordinates) | - | | `endTimestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`endTimestamp`](#endtimestamp) | | `fillRule?` | `"nonzero"` \| `"evenodd"` | [`BaseAnnotation`](#baseannotation).[`fillRule`](#fillrule) | | `flipX?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`flipX`](#flipx) | | `flipY?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`flipY`](#flipy) | | `fontFamily?` | \| `"Arial"` \| `"Helvetica"` \| `"Times New Roman"` \| `"Courier New"` \| `"Georgia"` \| `"Verdana"` | - | | `fontSize?` | `number` | - | | `fontStyle?` | `"normal"` \| `"italic"` | - | | `fontWeight?` | `"normal"` \| `"bold"` | - | | `frame?` | `number` | [`BaseAnnotation`](#baseannotation).[`frame`](#frame) | | `height?` | `number` | [`BaseAnnotation`](#baseannotation).[`height`](#height) | | `left?` | `number` | [`BaseAnnotation`](#baseannotation).[`left`](#left) | | `nestedAnnotations?` | [`NestedAnnotation`](#nestedannotation)\[] | - | | `opacity?` | `number` | [`BaseAnnotation`](#baseannotation).[`opacity`](#opacity) | | `originX?` | `"left"` \| `"center"` \| `"right"` | [`BaseAnnotation`](#baseannotation).[`originX`](#originx) | | `originY?` | `"center"` \| `"top"` \| `"bottom"` | [`BaseAnnotation`](#baseannotation).[`originY`](#originy) | | `scaleX?` | `number` | [`BaseAnnotation`](#baseannotation).[`scaleX`](#scalex) | | `scaleY?` | `number` | [`BaseAnnotation`](#baseannotation).[`scaleY`](#scaley) | | `shadow?` | \{ `blur?`: `number`; `color?`: `string`; `offsetX?`: `number`; `offsetY?`: `number`; } | [`BaseAnnotation`](#baseannotation).[`shadow`](#shadow) | | `shadow.blur?` | `number` | - | | `shadow.color?` | `string` | - | | `shadow.offsetX?` | `number` | - | | `shadow.offsetY?` | `number` | - | | `skewX?` | `number` | [`BaseAnnotation`](#baseannotation).[`skewX`](#skewx) | | `skewY?` | `number` | [`BaseAnnotation`](#baseannotation).[`skewY`](#skewy) | | `startTimestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`startTimestamp`](#starttimestamp) | | `strokeDashArray?` | `number`\[] | [`BaseAnnotation`](#baseannotation).[`strokeDashArray`](#strokedasharray) | | `strokeLineCap?` | `"butt"` \| `"round"` \| `"square"` | [`BaseAnnotation`](#baseannotation).[`strokeLineCap`](#strokelinecap) | | `strokeLineJoin?` | `"round"` \| `"miter"` \| `"bevel"` | [`BaseAnnotation`](#baseannotation).[`strokeLineJoin`](#strokelinejoin) | | `strokeMiterLimit?` | `number` | [`BaseAnnotation`](#baseannotation).[`strokeMiterLimit`](#strokemiterlimit) | | `textColor?` | `string` | - | | `timestamp?` | `number` | [`BaseAnnotation`](#baseannotation).[`timestamp`](#timestamp) | | `top?` | `number` | [`BaseAnnotation`](#baseannotation).[`top`](#top) | | `type` | `"text"` | - | | `visible?` | `boolean` | [`BaseAnnotation`](#baseannotation).[`visible`](#visible) | | `width?` | `number` | [`BaseAnnotation`](#baseannotation).[`width`](#width) | *** ### UpdateChatSubjectData [#updatechatsubjectdata] #### Properties [#properties-41] | Property | Type | | ------------------------------ | -------- | | `subject` | `string` | *** ### UpdateMemberChatData [#updatememberchatdata] #### Properties [#properties-42] | Property | Type | | ------------------------------- | -------- | | `color?` | `string` | | `subject?` | `string` | *** ### UpdateMemberChatIconData [#updatememberchaticondata] #### Properties [#properties-43] | Property | Type | | -------------------------------- | -------- | | `checksum` | `string` | | `name` | `string` | | `sizeInMB` | `number` | ## Type Aliases [#type-aliases] ### Annotation [#annotation] ```ts type Annotation = | DotAnnotation | FrameCommentAnnotation | ShapeAnnotation | TextAnnotation | PathAnnotation; ``` *** ### AttachmentResponse [#attachmentresponse] ```ts type AttachmentResponse = AttachmentUploadRecord; ``` *** ### ChatMessageResponse [#chatmessageresponse] ```ts type ChatMessageResponse = ChatMessage; ``` *** ### ChatResponse [#chatresponse] ```ts type ChatResponse = Chat; ``` *** ### MemberChatResponse [#memberchatresponse] ```ts type MemberChatResponse = ChatMember; ``` *** ### MemberResponse [#memberresponse] ```ts type MemberResponse = Membership; ``` *** ### NestedAnnotation [#nestedannotation] ```ts type NestedAnnotation = | NestedDotAnnotation | NestedShapeAnnotation | NestedTextAnnotation | NestedPathAnnotation; ``` *** ### PaginatedResponse [#paginatedresponse] ```ts type PaginatedResponse = PaginatedResult | CursorPaginatedResult & { results?: T[]; }; ``` #### Type Declaration [#type-declaration] | Name | Type | | ---------- | ------ | | `results?` | `T`\[] | #### Type Parameters [#type-parameters] | Type Parameter | | -------------- | | `T` | ## Functions [#functions] ### default() [#default] ```ts function default(client): { addAttachments: Promise; addMembers: Promise; archiveMemberChat: Promise; createAssetChatAndMessage: Promise; createMemberChat: Promise; createMessage: Promise; createMessageShortLink: Promise<{ code: string; shortUrl: string; }>; createReaction: Promise; createTopicChat: Promise; deleteChat: Promise; deleteMemberChat: Promise; deleteMessage: Promise; fetchLinkPreviews: Promise; followChat: Promise; getAddableMembers: Promise; getChat: Promise; getChatByTopicId: Promise; getMemberChat: Promise; getMentionableAssets: Promise>; getMentionableFolders: Promise>; getMentionablePublics: Promise>; getMentionableSubmissions: Promise>; getMentionableTasks: Promise>; getMentions: Promise>; getMessage: Promise; getMessages: Promise>; getReplies: Promise>; getScopeAddableMembers: Promise; getUsersMemberChats: Promise>; getWorkspaceProjectChats: Promise; highlightMessage: Promise; removeAttachment: Promise; removeMembers: Promise; removeReaction: Promise; reviseMessage: Promise; unarchiveMemberChat: Promise; unfollowChat: Promise; unhighlightMessage: Promise; updateChatSubject: Promise; updateMemberChat: Promise; updateMemberChatIcon: Promise<{ chat: ChatMember; } & AttachmentUploadRecord>; }; ``` Defines chat-related methods for the NuramaClient. #### Parameters [#parameters] | Parameter | Type | Description | | --------- | ----------------------------------------------------- | -------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | The NuramaClient instance. | #### Returns [#returns] An object containing the chat-related methods. | Name | Type | Description | | ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `addAttachments()` | (`messageId`, `attachments`) => `Promise`\<[`AttachmentUploadRecord`](#attachmentuploadrecord)\[]> | Creates attachment assets for an existing message and returns signed upload URLs for them. Only the message's author may attach, and in topic/submission chats they also need `canCreateAttachment`. Only image and video file names are accepted, each `checksum` must be a 32-64 character hex MD5/SHA-256 digest, `id` must be an integer no greater than 10, and the message may hold at most 6 attachments in total (`exceedsMaxAttachments`). The request is also checked against the workspace storage quota (`uploadRequestExceedsSubscription`). **Throws** 'messageId is required.' when `messageId` is falsy. | | `addMembers()` | (`chatId`, `data`) => `Promise`\<`ChatMember`> | Adds users to a member chat by user ID. The caller must be a member of the chat, and every user must be chat-eligible in the chat's scope (`membersInvalid` otherwise). `memberIds` is not enforced by validation, but the request cannot succeed without it. **Throws** 'chatId is required.' when `chatId` is falsy. | | `archiveMemberChat()` | (`chatId`) => `Promise`\<`ChatMember`> | Archives a member chat for the calling user only. Adds the caller to the chat's `archivedBy` list; other members' view of the chat is unaffected. The caller must be a member of the chat. **Throws** 'chatId is required.' when `chatId` is falsy. | | `createAssetChatAndMessage()` | ( `assetId`, `visibility`, `data`, `params?` ) => `Promise`\<`any`> | Posts a message to an asset's chat at the given visibility, creating the chat first if it does not exist yet (asset chats are normally auto-created, so this mainly covers legacy assets). Only media assets are accepted (`assetInvalidFunctionType` / 404 otherwise). Requires both `canCreate{Creator\|Reviewer}Chat` and `canCreate{Creator\|Reviewer}ChatMessage` on the asset for the chosen visibility. The body follows the same rules as `createMessage`. The `params` argument is neither validated nor forwarded by the API handler, so the returned chat always carries 10 recent messages with 10 replies each, sorted `{ id: -1 }`. **Throws** 'assetId is required.' when `assetId` is falsy. | | `createMemberChat()` | (`data`) => `Promise`\<`ChatMember`> | Creates a member ("Team") chat in a workspace with the given members. Only `scopeType: 'workspace'` is accepted by the API: project-scoped member chats are deprecated and `social` is not supported yet, so both are rejected with 400 even though the type still allows them. Requires `canCreateWorkspaceMemberChat` on the workspace. The caller is always added as the first member, every member must be chat-eligible in the scope (`membersInvalid` otherwise), and a random approved colour is assigned (the API also accepts an optional `color`, not exposed on this type). | | `createMessage()` | (`chatId`, `data`) => `Promise`\<`ChatMessage`> | Posts a message to any chat type (topic, member, submission, AI, support). Either `content` (max 10,000 chars) or at least one attachment is required. API tokens need the `chat:write` scope (`tokenScopeMissing` / 403 otherwise); users need message-create permission on the chat, e.g. `canCreateCreatorChatMessage` / `canCreateReviewerChatMessage` for topic chats or membership for member chats. Limits: 6 attachments, 10 of each mention kind, 5 quotes, 5 link previews and 100 annotations. Mentioning users in topic/member/submission chats creates tasks and notifications for them. `pageContext` is only read by AI chats and ignored by every other chat type. **Throws** 'chatId is required.' when `chatId` is falsy. | | `createMessageShortLink()` | (`messageId`) => `Promise`\<\{ `code`: `string`; `shortUrl`: `string`; }> | Creates a short link for a chat message, or returns the existing one if the message already has a short link. Visibility is inherited from the parent chat (`creator` / `reviewer` for topic chats, `null` for member chats). Requires read access to the message's chat (`canCreateMessageShortLink`). **Throws** 'messageId is required.' when `messageId` is falsy. | | `createReaction()` | (`messageId`, `data`) => `Promise`\<`ChatMessage`> | Adds the caller's emoji reaction to a message, replacing any reaction they already had on it. Each user holds at most one reaction per message. Requires message-create permission on the chat (`canCreateReaction`). `emoji` must be 1-10 characters. **Throws** 'messageId is required.' when `messageId` is falsy. | | `createTopicChat()` | (`data`) => `Promise`\<`Chat`> | Creates a topic chat for a project or asset at a given visibility. Requires `canCreateCreatorChat` (visibility `creator`) or `canCreateReviewerChat` (visibility `reviewer`) on the topic resource. Although `visibility` is optional in the type, the permission check only passes when it is one of those two values, so omitting it results in 403. | | `deleteChat()` | (`chatId`) => `Promise`\<`void`> | Marks a topic chat for deletion. In practice this only succeeds for `user`-topic chats owned by the caller: project and asset topic chats are refused with `topicChatsMayNotBeDeleted`, and any other topic type with `unknownError`. Member chats are deleted with `deleteMemberChat`. **Throws** 'chatId is required.' when `chatId` is falsy. | | `deleteMemberChat()` | (`chatId`) => `Promise`\<`void`> | Marks a member chat, its messages and its attachments for deletion. Only the chat's creator may delete it; other members receive 403. From the members' perspective the chat disappears immediately; the rows are removed later by the cleanup service. **Throws** 'chatId is required.' when `chatId` is falsy. | | `deleteMessage()` | (`messageId`) => `Promise`\<`ChatMessage`> | Marks a message for deletion. Only the author may delete, and in topic/submission chats they also need `canDeleteOwnChatMessage`. The row is removed later by the cleanup service. **Throws** 'messageId is required.' when `messageId` is falsy. | | `fetchLinkPreviews()` | (`data`) => `Promise`\<[`LinkPreviewResponse`](#linkpreviewresponse)> | Fetches Open Graph / meta-tag preview data for one to five URLs. Each preview carries an HMAC-SHA256 `signature` that must be passed back unchanged in `linkPreviews` when creating or revising a message, as the API verifies it to reject spoofed previews. Duplicate URLs are collapsed and URLs that fail validation, fetching or SSRF checks are omitted, so `previews` may be shorter than `urls`. Rate limited to 30 requests per minute per IP. | | `followChat()` | (`chatId`) => `Promise`\<`void`> | Adds the caller to a chat's following list so they are notified about new messages and updates. Works with topic, member and submission chats and is idempotent. Requires message-create permission on the chat (`canCreateChatMessage`). **Throws** 'chatId is required.' when `chatId` is falsy. | | `getAddableMembers()` | (`chatId`) => `Promise`\<[`AddableMembersByScope`](#addablemembersbyscope) \| `Membership`\[]> | Lists the members that can be added to an existing member chat, based on the chat's scope and the caller's role in it. The caller must be a member of the chat. For workspace-scoped chats the result is a flat array of memberships; for legacy project-scoped chats it is an `AddableMembersByScope` object. **Throws** 'chatId is required.' when `chatId` is falsy. | | `getChat()` | (`chatId`) => `Promise`\<`Chat`> | Retrieves a topic chat (project, asset, task or public) by ID without its messages. Requires `canGetCreatorChat` or `canGetReviewerChat` on the chat, matching its visibility. Only topic chats are served here; member chats are served by `getMemberChat` and a member chat ID yields `chatNotFound`. **Throws** 'chatId is required.' when `chatId` is falsy. | | `getChatByTopicId()` | (`topicId`, `params`) => `Promise`\<`Chat`> | Retrieves the topic chat for a project, asset, public release or task, together with its most recent messages and their replies. Requires `canGetCreatorChat` or `canGetReviewerChat` on the chat, matching `params.visibility`. `replies` (default 10, max 100) and `sort` (default `{ id: -1 }`) are honoured, but `messages` is accepted and then not forwarded by the API handler, so 10 recent messages are always returned. **Throws** 'topicId is required.' when `topicId` is falsy. | | `getMemberChat()` | (`chatId`) => `Promise`\<`ChatMember`> | Retrieves a member chat by ID without its messages. The caller must be a member of the chat. **Throws** 'chatId is required.' when `chatId` is falsy. | | `getMentionableAssets()` | (`chatId`, `params?`) => `Promise`\<[`PaginatedResponse`](#paginatedresponse)\<`Asset`>> | Lists the active assets that can be mentioned (`{{assetMention:assetId}}`) in a chat. What is returned depends on the chat: project and asset topic chats return the project's assets at the chat's visibility; project-scoped member chats and submission chats return all of the project's assets; AI chats return the topic project's assets filtered to the caller's own visibility tiers; workspace/social member chats return an empty list. Requires read access to the chat (`canGetChatMentionableAssets`). Defaults to index pagination (`page`, `limit` max 100, sort `{ name: 1 }`); pass `paginate: 'cursor'` for cursor pagination. `startAt` / `includeStartAtRecord` are not accepted here. **Throws** 'chatId is required.' when `chatId` is falsy. | | `getMentionableFolders()` | (`chatId`, `params?`) => `Promise`\<[`PaginatedResponse`](#paginatedresponse)\<`Folder`>> | Lists the active folders that can be mentioned (`{{folderMention:folderId}}`) in a chat. What is returned depends on the chat: project and asset topic chats return the project's folders at the chat's visibility; project-scoped member chats return all of the project's folders; submission chats return the project's reviewer-visibility folders; AI chats return the topic project's folders filtered to the caller's own visibility tiers; workspace/social member chats return an empty list. Requires read access to the chat (`canGetChatMentionableFolders`). Defaults to index pagination (`page`, `limit` max 100, sort `{ name: 1 }`); pass `paginate: 'cursor'` for cursor pagination. `startAt` / `includeStartAtRecord` are not accepted here. **Throws** 'chatId is required.' when `chatId` is falsy. | | `getMentionablePublics()` | (`chatId`, `params?`) => `Promise`\<[`PaginatedResponse`](#paginatedresponse)\<[`MentionablePublic`](#mentionablepublic)>> | Lists the active public releases (share links) owned by a chat's project that can be mentioned (`{{publicMention:token}}`). The project is resolved from the chat exactly as for `getMentionableSubmissions`; chats without a project return an empty page. Requires read access to the chat (`canGetChatMentionablePublics`). Index pagination only (`page`, `limit` max 100, sort `{ createdAt: -1 }`, also sortable by `title` and `expires`); cursor-pagination params cause a 400. **Throws** 'chatId is required.' when `chatId` is falsy. | | `getMentionableSubmissions()` | (`chatId`, `params?`) => `Promise`\<[`PaginatedResponse`](#paginatedresponse)\<[`MentionableSubmission`](#mentionablesubmission)>> | Lists the active submissions in a chat's project that can be mentioned (`{{submissionMention:submissionId}}`). The project is resolved from the chat (project/asset/task topic chats, project-scoped member chats, submission chats and project-scoped AI chats); chats without a project return an empty page. Requires read access to the chat (`canGetChatMentionableSubmissions`). Index pagination only (`page`, `limit` max 100, sort `{ createdAt: -1 }`, also sortable by `subject` and `lastMessageAt`); cursor-pagination params cause a 400. **Throws** 'chatId is required.' when `chatId` is falsy. | | `getMentionableTasks()` | (`chatId`, `params?`) => `Promise`\<[`PaginatedResponse`](#paginatedresponse)\<`any`>> | Lists the board tasks that can be mentioned (`{{taskMention:taskId}}`) in a chat. Requires the workspace to have the `boards` capability (`capabilityNotAvailable` / 403 otherwise) and read access to the chat (`canGetChatMentionableTasks`). Project, asset and task topic chats return tasks in the project on boards whose visibility includes the chat's; project-scoped member chats return every board task in the project; submission chats return tasks on reviewer-visible boards; workspace/social member chats return an empty list. Legacy tasks without a board are never returned. Defaults to index pagination (`page`, `limit` max 100, sort `{ updatedAt: -1 }`); pass `paginate: 'cursor'` for cursor pagination. **Throws** 'chatId is required.' when `chatId` is falsy. | | `getMentions()` | (`params?`) => `Promise`\<[`PaginatedResponse`](#paginatedresponse)\<`ChatMessage`>> | Lists the messages in which the caller was mentioned. Defaults to index pagination (`page`, `limit` max 100, sort `{ id: -1 }`); pass `paginate: 'cursor'` for cursor pagination. Filter with `chatId` and/or `authorId`. `createdBefore` is only accepted with index pagination; `createdAfter` and `updatedBefore` from DateRangeParams are not accepted by this endpoint and cause a 400. | | `getMessage()` | (`messageId`, `params?`) => `Promise`\<`ChatMessage`> | Retrieves a single message by ID with its most recent replies. Requires read access to the message's chat (`canGetChatMessage`). `replies` defaults to 10 (max 100) and `sort` (default `{ id: -1 }`) orders the included replies. **Throws** 'messageId is required.' when `messageId` is falsy. | | `getMessages()` | (`chatId`, `params?`) => `Promise`\<[`PaginatedResponse`](#paginatedresponse)\<`ChatMessage`>> | Lists a chat's active messages with their recent replies and populated attachments and mentions. Requires read access to the chat (`canGetChat`); API tokens need the `chat:read` scope (`tokenScopeMissing` / 403 otherwise). Defaults to index pagination (`page`, `limit` max 100, sort `{ id: -1 }`); pass `paginate: 'cursor'` for cursor pagination. `createdBefore` / `createdAfter` are only accepted with index pagination and `updatedBefore` is not accepted at all. `replyLimit` (default 10, max 100) sets the replies returned per message; `replies` is a deprecated alias that takes precedence over `replyLimit` whenever it is set to anything other than 10. **Throws** 'chatId is required.' when `chatId` is falsy. | | `getReplies()` | (`messageId`, `params?`) => `Promise`\<[`PaginatedResponse`](#paginatedresponse)\<`ChatMessage`>> | Lists the active replies to a message, with attachments populated. Requires read access to the message's chat (`canGetChatMessage`). Defaults to index pagination (`page`, `limit` max 100, sort `{ id: -1 }`); pass `paginate: 'cursor'` for cursor pagination. `createdBefore` / `createdAfter` are only accepted with index pagination and `updatedBefore` is not accepted at all. **Throws** 'messageId is required.' when `messageId` is falsy. | | `getScopeAddableMembers()` | (`scopeType`, `scopeId`) => `Promise`\<[`AddableMembersByScope`](#addablemembersbyscope) \| `Membership`\[]> | Lists the members addable to a NEW member chat, by scope, before the chat exists. Use this to populate the create-chat member picker — unlike the raw membership-list endpoints it isn't admin-gated, so non-admin members allowed to start a Team Chat still get the correct list. Requires `canCreateWorkspaceMemberChat` (or `canCreateProjectMemberChat`) on the scope. For `project` scope the result is an `AddableMembersByScope` object; note that project-scoped member chats can no longer be created. **Throws** 'scopeType is required.' or 'scopeId is required.' when either is falsy. | | `getUsersMemberChats()` | (`params?`) => `Promise`\<[`PaginatedResponse`](#paginatedresponse)\<`ChatMember`>> | Lists the member chats the caller belongs to, most recently updated first, each with its recent messages. Defaults to index pagination (`page`, `limit` max 20); pass `paginate: 'cursor'` for cursor pagination. `updatedBefore` is only accepted with index pagination, `recentMessages` caps the messages returned per chat (default and max 20), and `archived` narrows to chats the caller has (`true`) or has not (`false`) archived. `createdBefore` / `createdAfter` from DateRangeParams are not accepted by this endpoint and cause a 400. | | `getWorkspaceProjectChats()` | (`workspaceId`) => `Promise`\<`any`\[]> | Retrieves every project topic chat (creator/reviewer) the caller can access across all projects in a workspace, with the latest message and message count for each, ordered by most recent activity. Powers the workspace-level "Project Chat" list. Requires `canGetWorkspace` on the workspace; access to each project's chats is derived from the caller's inherited `canGetCreatorChat` / `canGetReviewerChat`. **Throws** 'workspaceId is required.' when `workspaceId` is falsy. | | `highlightMessage()` | (`messageId`) => `Promise`\<`ChatMessage`> | Highlights a message, recording the caller as the highlighter. In topic and submission chats this requires `canHighlightMessage` on the chat; in member chats any member may highlight. For project and asset topic chats a system message is posted in the project chat of the same visibility, a `chatHighlightMessage` notification is sent and project members are emailed. **Throws** 'messageId is required.' when `messageId` is falsy. | | `removeAttachment()` | (`messageId`, `assetId`) => `Promise`\<`ChatMessage`> | Removes an attachment from a message and marks the asset for deletion. Only the author may remove attachments, and in topic/submission chats they also need `canDeleteOwnAttachment`. If the message is left with no content and no attachments it is marked for deletion as well, and the deleted message is returned. **Throws** 'messageId is required.' or 'assetId is required.' when either is falsy. | | `removeMembers()` | (`chatId`, `data`) => `Promise`\<`ChatMember`> | Removes users from a member chat by user ID. The caller must be a member of the chat. The chat's creator cannot be removed (`ownerCannotLeaveChat`) and unknown user IDs produce `userNotFound`. Sent as a DELETE with a JSON body. **Throws** 'chatId is required.' when `chatId` is falsy. | | `removeReaction()` | (`messageId`) => `Promise`\<`ChatMessage`> | Removes the caller's own reaction from a message. Gated by the same permission as `createReaction`. Calling it when the caller has no reaction is a no-op that still returns the message. **Throws** 'messageId is required.' when `messageId` is falsy. | | `reviseMessage()` | (`messageId`, `data`) => `Promise`\<`ChatMessage`> | Revises a message's content, mentions, quotes, annotations and link previews, keeping the previous version as a revision. Only the author may revise, and in topic/submission chats they also need `canUpdateOwnChatMessage`. Annotations are replaced, not merged: omit `annotations` to keep the current ones, send `[]` to remove them all. `linkPreviews` likewise replaces the stored previews. Same size limits as `createMessage`. **Throws** 'messageId is required.' when `messageId` is falsy. | | `unarchiveMemberChat()` | (`chatId`) => `Promise`\<`ChatMember`> | Unarchives a member chat for the calling user only. Removes the caller from the chat's `archivedBy` list. The caller must be a member of the chat. **Throws** 'chatId is required.' when `chatId` is falsy. | | `unfollowChat()` | (`chatId`) => `Promise`\<`void`> | Removes the caller from a chat's following list. Works with topic, member and submission chats and is idempotent. No chat permission is checked, so users can stop notifications for a chat they have since lost access to. **Throws** 'chatId is required.' when `chatId` is falsy. | | `unhighlightMessage()` | (`messageId`) => `Promise`\<`ChatMessage`> | Removes the highlight from a message. Clears the highlighter fields and removes the associated system messages and notification. Same permission as `highlightMessage`. **Throws** 'messageId is required.' when `messageId` is falsy. | | `updateChatSubject()` | (`chatId`, `data`) => `Promise`\<`Chat`> | Updates the subject of a topic chat. Requires `canUpdateCreatorChat` or `canUpdateReviewerChat` on the chat, matching its visibility. `subject` is limited to 100 characters. For member chats use `updateMemberChat`. **Throws** 'chatId is required.' when `chatId` is falsy. | | `updateMemberChat()` | (`chatId`, `data`) => `Promise`\<`ChatMember`> | Updates a member chat's subject and/or colour. The caller must be a member of the chat. `subject` is limited to 100 characters and `color` must be one of the approved palette colours. **Throws** 'chatId is required.' when `chatId` is falsy. | | `updateMemberChatIcon()` | (`chatId`, `data`) => `Promise`\<\{ `chat`: `ChatMember`; } & [`AttachmentUploadRecord`](#attachmentuploadrecord)> | Creates an icon asset for a member chat and returns signed upload URLs for it. Any existing icon is marked for deletion. The caller must be a member of the chat; `sizeInMB` is capped at 10 and `name` at 100 characters. Upload the file to the returned `signedUrlData.urls` afterwards, exactly as for any asset upload. **Throws** 'chatId is required.' when `chatId` is falsy. | # chatAi (/docs/reference/sdk/routes/chatAi) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Functions [#functions] ### default() [#default] ```ts function default(client): { createTopic: Promise; deleteTopic: Promise; getTopic: Promise; listTopics: Promise; updateTopic: Promise; }; ``` Topic-CRUD methods for AI chat. Message send + list happens through the regular chat endpoints on `nuramaClient.chat`: * send: `nuramaClient.chat.createMessage(topic.chatId, …)` * list: `nuramaClient.chat.getMessages(topic.chatId, …)` When a message is sent to a chat whose `chatType` is `'ai'`, the server generates the AI reply after storing the message, so attachments, mentions, link previews and notifications behave exactly as in every other chat. Each topic is private to its creator. Topic scope is one of: * 'workspace' → cross-project chat in the workspace * 'project' → bound to a single project * 'social' → personal chat with no resource backing All endpoints below require: * workspace AI add-on subscription * `aiChatEnabled` resolved true (workspace setting + project override) * caller has project / workspace read access for scoped topics Credit-balance gating happens server-side on the regular chat `createMessage` path when the target chat is an AI chat. #### Parameters [#parameters] | Parameter | Type | | --------- | ----------------------------------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | #### Returns [#returns] | Name | Type | Description | | --------------- | ------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `createTopic()` | (`data`) => `Promise`\<`AiChatCreateTopicResponse`> | Create a new (empty) topic. After this resolves, send the first message through `nuramaClient.chat.createMessage(topic.chatId, …)`. | | `deleteTopic()` | (`topicId`, `params`) => `Promise`\<`AiChatGetTopicResponse`> | Soft-delete a topic. The topic, its chat and every attachment asset in that chat are marked `pendingDelete` and cleaned up by background processing. The caller can drop the topic from their local list immediately — there is no "undo" for this. | | `getTopic()` | (`topicId`, `params`) => `Promise`\<`AiChatGetTopicResponse`> | - | | `listTopics()` | (`params`) => `Promise`\<`AiChatListTopicsResponse`> | List the caller's topics for a scope (workspace, project, or social). | | `updateTopic()` | (`topicId`, `data`) => `Promise`\<`AiChatGetTopicResponse`> | - | # config (/docs/reference/sdk/routes/config) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### ConfigMethods [#configmethods] #### Properties [#properties] | Property | Type | | -------------------------------- | ----------------------- | | `getConfig` | () => `Promise`\<`any`> | ## Functions [#functions] ### default() [#default] ```ts function default(client): ConfigMethods; ``` Creates methods related to configuration endpoints. #### Parameters [#parameters] | Parameter | Type | Description | | --------- | ----------------------------------------------------- | -------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | The NuramaClient instance. | #### Returns [#returns] [`ConfigMethods`](#configmethods) An object with configuration-related methods. # convo (/docs/reference/sdk/routes/convo) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Functions [#functions] ### default() [#default] ```ts function default(client): { completeConvo: Promise; deleteConvo: Promise; getChatConvos: Promise; getConvo: Promise; getProjectConvos: Promise; getScopeConvos: Promise; joinConvo: Promise; leaveConvo: Promise; rejoinConvo: Promise; startConvo: Promise; updateConvo: Promise; }; ``` Defines convo (video/audio chat) related methods for the NuramaClient. Handles starting, joining, and managing real-time conversations. #### Parameters [#parameters] | Parameter | Type | Description | | --------- | ----------------------------------------------------- | -------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | The NuramaClient instance. | #### Returns [#returns] An object containing the convo-related methods. | Name | Type | Description | | -------------------- | ------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `completeConvo()` | (`convoId`) => `Promise`\<`CompleteConvoResponse`> | Mark a conversation as complete. Ends the conversation and triggers recording/transcript processing if enabled. Requires authentication and permission to complete the conversation. **Example** `const result = await client.convo.completeConvo('507f1f77bcf86cd799439011');` | | `deleteConvo()` | (`convoId`) => `Promise`\<`void`> | Delete/cancel a conversation. Only the creator can delete a conversation. Requires authentication and permission to delete the conversation. **Example** `await client.convo.deleteConvo('507f1f77bcf86cd799439011');` | | `getChatConvos()` | (`chatId`, `params?`) => `Promise`\<`Convo`\[]> | List the convos that have taken place in a chat, newest first. Requires read access to the chat. | | `getConvo()` | (`convoId`) => `Promise`\<`GetConvoResponse`> | Get a specific conversation by ID. Requires authentication and permission to view the conversation. **Example** `const result = await client.convo.getConvo('507f1f77bcf86cd799439011');` | | `getProjectConvos()` | (`projectId`, `params?`) => `Promise`\<`Convo`\[]> | List every convo across all chats in a project (the "Convos drawer"), newest first. Requires `canGetProject` on the project. | | `getScopeConvos()` | (`scopeId`, `params`) => `Promise`\<`GetScopeConvosResponse`> | Get conversations for a scope (project). Returns paginated list of conversations with cursor-based pagination. Active conversations are returned first. Requires authentication and permission to view conversations. **Example** `const result = await client.convo.getScopeConvos('507f1f77bcf86cd799439011', { visibility: ['creator', 'reviewer'], status: 'active', limit: 20 });` | | `joinConvo()` | (`convoId`) => `Promise`\<`JoinConvoResponse`> | Join an active conversation. Returns the conversation details and a Daily.co meeting token for the user. Requires authentication and permission to join the conversation. **Example** `const result = await client.convo.joinConvo('507f1f77bcf86cd799439011'); // Use result.token to join the Daily.co call // Use result.convo.dailyRoomUrl as the room URL` | | `leaveConvo()` | (`convoId`) => `Promise`\<`LeaveConvoResponse`> | Leave an active conversation. Removes the user from the active participants list. Requires authentication. **Example** `const result = await client.convo.leaveConvo('507f1f77bcf86cd799439011');` | | `rejoinConvo()` | (`convoId`) => `Promise`\<`JoinConvoResponse`> | Rejoin an active conversation (page refresh / reconnect). Only returns a new meeting token if the user is already an active participant. No notifications are sent. | | `startConvo()` | (`data`) => `Promise`\<`StartConvoResponse`> | Start a new conversation (video or audio). Requires authentication. **Example** `const result = await client.convo.startConvo({ chatId: '507f1f77bcf86cd799439011', chatType: 'chat', convoType: 'video' });` | | `updateConvo()` | (`convoId`, `data`) => `Promise`\<`UpdateConvoResponse`> | Update a conversation's subject and/or description. Only the conversation starter can update these fields. Requires authentication. **Example** `const result = await client.convo.updateConvo('507f1f77bcf86cd799439011', { subject: 'Weekly Team Sync', description: 'Discussing project updates and roadmap' });` | # credits (/docs/reference/sdk/routes/credits) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### GetBalanceResponse [#getbalanceresponse] #### Properties [#properties] | Property | Type | Description | | ---------------------------------------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `balance` | `number` | Total spendable balance — sum of planBalance + purchasedBalance. | | `hasPriorTopUp?` | `boolean` | True when the workspace has at least one prior manual top-up (a `subscriptionGrant` order). Auto top-up can only be enabled once this is true — users must top up manually once first. | | `planBalance` | `number` | Plan-granted credits for the current billing cycle. Refreshed (SET, not added) on every Stripe renewal. Unspent plan credits do NOT carry over. | | `purchasedBalance` | `number` | Purchased credits — accumulated from one-off top-ups, auto-top-ups, admin grants. Carries over indefinitely. | *** ### UsageReportIntegrationRow [#usagereportintegrationrow] #### Properties [#properties-1] | Property | Type | | ---------------------------------------------- | -------- | | `billedCredits` | `number` | | `callCount` | `number` | | `integrationPoint` | `string` | *** ### UsageReportParams [#usagereportparams] #### Properties [#properties-2] | Property | Type | Description | | ------------------------------------------------- | -------- | -------------------------------------------------------------- | | `endDate?` | `string` | ISO date string. Server defaults to "now" when omitted. | | `integrationPoint?` | `string` | Narrow the per-user breakdown to a single integration point. | | `startDate?` | `string` | ISO date string. Server defaults to 30 days ago when omitted. | | `userId?` | `string` | Narrow the per-integration breakdown to a single user's calls. | *** ### UsageReportResponse [#usagereportresponse] #### Properties [#properties-3] | Property | Type | | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | | `byIntegration` | [`UsageReportIntegrationRow`](#usagereportintegrationrow)\[] | | `byUser` | [`UsageReportUserRow`](#usagereportuserrow)\[] | | `filters` | \{ `endDate`: `string`; `integrationPoint`: `string` \| `null`; `startDate`: `string`; `userId`: `string` \| `null`; } | | `filters.endDate` | `string` | | `filters.integrationPoint` | `string` \| `null` | | `filters.startDate` | `string` | | `filters.userId` | `string` \| `null` | | `total` | \{ `billedCredits`: `number`; `callCount`: `number`; `tokensIn`: `number`; `tokensOut`: `number`; } | | `total.billedCredits` | `number` | | `total.callCount` | `number` | | `total.tokensIn` | `number` | | `total.tokensOut` | `number` | *** ### UsageReportUserRow [#usagereportuserrow] #### Properties [#properties-4] | Property | Type | | ------------------------------------------ | ------------------ | | `avatar` | `unknown` | | `billedCredits` | `number` | | `callCount` | `number` | | `color` | `string` \| `null` | | `displayName` | `string` \| `null` | | `userId` | `string` | ## Functions [#functions] ### default() [#default] ```ts function default(client): { getBalance: Promise; getUsageReport: Promise; }; ``` Service-agnostic Nurama Credit balance + usage endpoints. The `/v1/credits/*` route shape and SDK namespace are deliberately decoupled from any single service's naming so future services (convos, etc.) can draw from the same balance without callers having to know where the spend originated. Today the metered data is AI-only because AI is the only service that's metered, but the contract is stable. #### Parameters [#parameters] | Parameter | Type | | --------- | ----------------------------------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | #### Returns [#returns] | Name | Type | Description | | ------------------ | --------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | `getBalance()` | (`workspaceId`) => `Promise`\<[`GetBalanceResponse`](#getbalanceresponse)> | Get the workspace's spendable credit balance. | | `getUsageReport()` | (`workspaceId`, `params?`) => `Promise`\<[`UsageReportResponse`](#usagereportresponse)> | Get the workspace's credit usage report. Same shape as the AI usage report — today the data is AI-only because AI is the only service that's metered. | # device (/docs/reference/sdk/routes/device) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Functions [#functions] ### default() [#default] ```ts function default(client): { deleteDevice: Promise; getDevice: Promise; getUserDevices: Promise; registerDevice: Promise; updateDevice: Promise; }; ``` Defines device-related methods for the NuramaClient. Handles device registration and management for push notifications. #### Parameters [#parameters] | Parameter | Type | Description | | --------- | ----------------------------------------------------- | -------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | The NuramaClient instance. | #### Returns [#returns] An object containing the device-related methods. | Name | Type | Description | | ------------------ | -------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `deleteDevice()` | (`deviceId`) => `Promise`\<`void`> | Delete a device. Users can only delete their own devices. Requires authentication. **Example** `await client.device.deleteDevice('507f1f77bcf86cd799439011');` | | `getDevice()` | (`deviceId`) => `Promise`\<`Device`> | Get a specific device by ID. Users can only access their own devices. Requires authentication. **Example** `const device = await client.device.getDevice('507f1f77bcf86cd799439011');` | | `getUserDevices()` | (`filters?`) => `Promise`\<`Device`\[]> | Get all devices for the authenticated user. Requires authentication. **Example** `const devices = await client.device.getUserDevices({ status: 'active' });` | | `registerDevice()` | (`deviceData`) => `Promise`\<`Device`> | Register a new device for push notifications. If the same push token is registered again, the existing device will be updated. Requires authentication. **Example** `const device = await client.device.registerDevice({ deviceType: 'ios', pushToken: 'ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]', bundleId: 'com.nurama.mobile', deviceInfo: { appVersion: '1.0.0', osVersion: '17.0', deviceModel: 'iPhone 15', deviceName: "John's iPhone" } });` | | `updateDevice()` | (`deviceId`, `updateData`) => `Promise`\<`Device`> | Update device information. Users can only update their own devices. Requires authentication. **Example** `const device = await client.device.updateDevice('507f1f77bcf86cd799439011', { deviceInfo: { appVersion: '1.1.0' }, status: 'active' });` | # folder (/docs/reference/sdk/routes/folder) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### GetFoldersAssetsParams [#getfoldersassetsparams] #### Extends [#extends] * [`PaginationParams`](#paginationparams).[`SortParams`](#sortparams) #### Properties [#properties] | Property | Type | Inherited from | | ----------------------------------- | -------------------------------- | ----------------------------------------------------------- | | `chats?` | `boolean` | - | | `limit?` | `number` | [`PaginationParams`](#paginationparams).[`limit`](#limit-1) | | `messages?` | `number` | - | | `page?` | `number` | [`PaginationParams`](#paginationparams).[`page`](#page-1) | | `replies?` | `number` | - | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-1) | | `visibility?` | `"creator"` \| `"reviewer"` | - | *** ### PaginationParams [#paginationparams] #### Extended by [#extended-by] * [`GetFoldersAssetsParams`](#getfoldersassetsparams) #### Properties [#properties-1] | Property | Type | | --------------------------- | -------- | | `limit?` | `number` | | `page?` | `number` | *** ### SortParams [#sortparams] #### Extended by [#extended-by-1] * [`GetFoldersAssetsParams`](#getfoldersassetsparams) #### Properties [#properties-2] | Property | Type | | ------------------------- | -------------------------------- | | `sort?` | `Record`\<`string`, `-1` \| `1`> | *** ### TagFolderData [#tagfolderdata] #### Properties [#properties-3] | Property | Type | | ------------------------ | -------- | | `tagId` | `string` | *** ### UntagFolderData [#untagfolderdata] #### Properties [#properties-4] | Property | Type | | -------------------------- | -------- | | `tagId` | `string` | *** ### UpdateFolderData [#updatefolderdata] #### Properties [#properties-5] | Property | Type | | ------------------------- | -------- | | `color?` | `string` | | `name?` | `string` | *** ### UpdateFolderIconData [#updatefoldericondata] #### Properties [#properties-6] | Property | Type | | ------------------------------ | -------- | | `checksum` | `string` | | `name` | `string` | | `sizeInMB` | `number` | ## Type Aliases [#type-aliases] ### AssetResponse [#assetresponse] ```ts type AssetResponse = Asset; ``` *** ### FolderResponse [#folderresponse] ```ts type FolderResponse = Folder; ``` *** ### PaginatedResponse [#paginatedresponse] ```ts type PaginatedResponse = PaginatedResult | CursorPaginatedResult & { results?: T[]; }; ``` #### Type Declaration [#type-declaration] | Name | Type | | ---------- | ------ | | `results?` | `T`\[] | #### Type Parameters [#type-parameters] | Type Parameter | | -------------- | | `T` | ## Functions [#functions] ### default() [#default] ```ts function default(client): { getFolder: Promise; getFoldersAssets: Promise>; tagFolder: Promise; untagFolder: Promise; updateFolder: Promise; updateFolderIcon: Promise; }; ``` Defines folder-related methods for the NuramaClient. #### Parameters [#parameters] | Parameter | Type | Description | | --------- | ----------------------------------------------------- | -------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | The NuramaClient instance. | #### Returns [#returns] An object containing the folder-related methods. | Name | Type | Description | | -------------------- | ------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------- | | `getFolder()` | (`folderId`) => `Promise`\<`Folder`> | Fetch a single folder by id. | | `getFoldersAssets()` | (`folderId`, `params?`) => `Promise`\<[`PaginatedResponse`](#paginatedresponse)\<`Asset`>> | List the assets that live directly inside a folder (does not recurse). | | `tagFolder()` | (`folderId`, `tagData`) => `Promise`\<`Folder`> | Tags a folder with a specific tag. | | `untagFolder()` | (`folderId`, `untagData`) => `Promise`\<`Folder`> | Untags a folder by removing a specific tag. | | `updateFolder()` | (`folderId`, `data`) => `Promise`\<`Folder`> | Updates a folder's name and/or color. | | `updateFolderIcon()` | (`folderId`, `data`) => `Promise`\<`any`> | Updates a folder's icon. | # invite (/docs/reference/sdk/routes/invite) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### GetInvitesToResourceParams [#getinvitestoresourceparams] #### Properties [#properties] | Property | Type | | --------------------------- | --------------------------------------------------------------------- | | `status?` | [`InviteStatus`](#invitestatus) \| [`InviteStatus`](#invitestatus)\[] | *** ### GetUsersInvitesParams [#getusersinvitesparams] #### Properties [#properties-1] | Property | Type | | ----------------------------------- | --------------------------------------------------------------------- | | `inviteType?` | `"all"` \| `"inviter"` \| `"invitee"` | | `status?` | [`InviteStatus`](#invitestatus) \| [`InviteStatus`](#invitestatus)\[] | *** ### InviteUserToResourceData [#inviteusertoresourcedata] #### Properties [#properties-2] | Property | Type | Description | | --------------------------------------------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `additionalRoles?` | `string`\[] | Optional workspace-level roles granted alongside the primary role (must be roles the server allows as additional roles, e.g. workspaceChatMember, workspaceAdmin). Applied to the workspace membership on accept. | | `inviteeEmail` | `string` | - | | `resourceId` | `string` | - | | `resourceType` | `string` | - | | `role` | `string` | - | ## Type Aliases [#type-aliases] ### AcceptInviteResponse [#acceptinviteresponse] ```ts type AcceptInviteResponse = { invite: Invite; membership: Membership; }; ``` #### Properties [#properties-3] | Property | Type | | ---------------------------------- | ------------ | | `invite` | `Invite` | | `membership` | `Membership` | *** ### InviteResponse [#inviteresponse] ```ts type InviteResponse = Invite; ``` *** ### InviteStatus [#invitestatus] ```ts type InviteStatus = "active" | "canceled" | "accepted"; ``` *** ### PaginatedInvitesResponse [#paginatedinvitesresponse] ```ts type PaginatedInvitesResponse = | PaginatedResponse | { invitee: Invite[]; inviter: Invite[]; } | Invite[]; ``` *** ### PaginatedResponse [#paginatedresponse] ```ts type PaginatedResponse = PaginatedResult | CursorPaginatedResult & { results?: T[]; }; ``` #### Type Declaration [#type-declaration] | Name | Type | | ---------- | ------ | | `results?` | `T`\[] | #### Type Parameters [#type-parameters] | Type Parameter | | -------------- | | `T` | ## Functions [#functions] ### default() [#default] ```ts function default(client): { acceptInvite: Promise; cancelInvite: Promise; getInviteById: Promise; getInvites: Promise; getInvitesForResource: Promise; inviteUser: Promise; resendInvite: Promise; }; ``` Defines invite-related methods for the NuramaClient. #### Parameters [#parameters] | Parameter | Type | Description | | --------- | ----------------------------------------------------- | -------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | The NuramaClient instance. | #### Returns [#returns] An object containing the invite-related methods. | Name | Type | Description | | ------------------------- | ---------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | `acceptInvite()` | (`inviteId`) => `Promise`\<[`AcceptInviteResponse`](#acceptinviteresponse)> | Accept an invite for the authenticated user. Creates the membership. | | `cancelInvite()` | (`inviteId`) => `Promise`\<`Invite`> | Revoke a pending invite. | | `getInviteById()` | (`inviteId`) => `Promise`\<`Invite`> | Look up an invite by id. Public — no auth — so the recipient can preview the invite (target resource, role, inviter) before signing up or logging in. | | `getInvites()` | (`params?`) => `Promise`\<[`PaginatedInvitesResponse`](#paginatedinvitesresponse)> | List invites the current user has issued (pending, accepted, expired). | | `getInvitesForResource()` | (`resourceId`, `params?`) => `Promise`\<`Invite`\[]> | List pending invites attached to a workspace or project resource. | | `inviteUser()` | (`data`) => `Promise`\<`Invite`> | Invite a user (by email) to a workspace or project at a given role. Triggers an invitation email; the recipient accepts via the link. | | `resendInvite()` | (`inviteId`) => `Promise`\<`Invite`> | Re-send a pending invite email (does not extend or reissue the token). | # membership (/docs/reference/sdk/routes/membership) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### AddRemoveRoleData [#addremoveroledata] #### Properties [#properties] | Property | Type | | -------------------------------------- | -------- | | `membershipId` | `string` | | `role` | `string` | *** ### GetLastSeenData [#getlastseendata] #### Properties [#properties-1] | Property | Type | | ---------------------------- | ----------- | | `userIds` | `string`\[] | *** ### GetLastSeenResponse [#getlastseenresponse] #### Properties [#properties-2] | Property | Type | | ---------------------------- | -------------------------------------- | | `results` | [`LastSeenResult`](#lastseenresult)\[] | *** ### GetProjectMembershipParams [#getprojectmembershipparams] #### Extends [#extends] * [`PaginationParams`](#paginationparams).[`SortParams`](#sortparams) #### Properties [#properties-3] | Property | Type | Inherited from | | ----------------------------------- | -------------------------------- | ----------------------------------------------------------- | | `limit?` | `number` | [`PaginationParams`](#paginationparams).[`limit`](#limit-2) | | `nameSearch?` | `string` \| `null` | - | | `page?` | `number` | [`PaginationParams`](#paginationparams).[`page`](#page-2) | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-2) | *** ### GetWorkspaceMembershipParams [#getworkspacemembershipparams] #### Extends [#extends-1] * [`PaginationParams`](#paginationparams).[`SortParams`](#sortparams) #### Properties [#properties-4] | Property | Type | Inherited from | | ------------------------------------- | -------------------------------- | ----------------------------------------------------------- | | `isBillable?` | `boolean` | - | | `limit?` | `number` | [`PaginationParams`](#paginationparams).[`limit`](#limit-2) | | `nameSearch?` | `string` \| `null` | - | | `page?` | `number` | [`PaginationParams`](#paginationparams).[`page`](#page-2) | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-2) | *** ### LastSeenResult [#lastseenresult] #### Properties [#properties-5] | Property | Type | | -------------------------------------- | ---------------------------- | | `lastSeen` | `string` \| `null` | | `resourceId` | `string` | | `resourceType` | `"project"` \| `"workspace"` | | `userId` | `string` | *** ### PaginationParams [#paginationparams] #### Extended by [#extended-by] * [`GetWorkspaceMembershipParams`](#getworkspacemembershipparams) * [`GetProjectMembershipParams`](#getprojectmembershipparams) #### Properties [#properties-6] | Property | Type | | --------------------------- | -------- | | `limit?` | `number` | | `page?` | `number` | *** ### SortParams [#sortparams] #### Extended by [#extended-by-1] * [`GetWorkspaceMembershipParams`](#getworkspacemembershipparams) * [`GetProjectMembershipParams`](#getprojectmembershipparams) #### Properties [#properties-7] | Property | Type | | ------------------------- | -------------------------------- | | `sort?` | `Record`\<`string`, `-1` \| `1`> | ## Type Aliases [#type-aliases] ### MembershipResponse [#membershipresponse] ```ts type MembershipResponse = Membership; ``` *** ### MentionableUserResponse [#mentionableuserresponse] ```ts type MentionableUserResponse = Mentionable; ``` *** ### PaginatedMembershipResponse [#paginatedmembershipresponse] ```ts type PaginatedMembershipResponse = MembershipReport; ``` ## Functions [#functions] ### default() [#default] ```ts function default(client): { addRole: Promise; deleteMembership: Promise; getMyMemberships: Promise; getProjectLastSeen: Promise; getProjectMemberships: Promise; getProjectMentionableUsers: Promise; getWorkspaceLastSeen: Promise; getWorkspaceMemberships: Promise; leaveResource: Promise; removeRole: Promise; }; ``` Defines membership-related methods for the NuramaClient. #### Parameters [#parameters] | Parameter | Type | Description | | --------- | ----------------------------------------------------- | -------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | The NuramaClient instance. | #### Returns [#returns] An object containing the membership-related methods. | Name | Type | Description | | ------------------------------ | ------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------- | | `addRole()` | (`data`) => `Promise`\<`Membership`> | Adds a role to an existing membership record. Requires permission to add roles. | | `deleteMembership()` | (`membershipId`) => `Promise`\<`void`> | Deletes a specific membership record by its ID. Requires specific permissions to delete others' memberships. | | `getMyMemberships()` | () => `Promise`\<`Membership`\[]> | Retrieves the membership records for the currently authenticated user. | | `getProjectLastSeen()` | (`projectId`, `data`) => `Promise`\<[`GetLastSeenResponse`](#getlastseenresponse)> | Retrieves resource-specific last seen timestamps for multiple users in a project. Requires permission to get project members. | | `getProjectMemberships()` | (`projectId`, `params?`) => `Promise`\<`MembershipReport`> | Retrieves memberships associated with a specific project. Requires permission based on user's role in the project/workspace. | | `getProjectMentionableUsers()` | (`projectId`, `visibility`) => `Promise`\<`Mentionable`\[]> | Retrieves a list of users mentionable within a project based on visibility. Requires permission to get mentionable users. | | `getWorkspaceLastSeen()` | (`workspaceId`, `data`) => `Promise`\<[`GetLastSeenResponse`](#getlastseenresponse)> | Retrieves resource-specific last seen timestamps for multiple users in a workspace. Requires permission to get workspace members. | | `getWorkspaceMemberships()` | (`workspaceId`, `params?`) => `Promise`\<`MembershipReport`> | Retrieves memberships associated with a specific workspace. Requires permission to get workspace members. | | `leaveResource()` | (`resourceId`) => `Promise`\<`void`> | Allows the authenticated user to leave a resource (delete their own membership). Cannot be used to remove ownership roles. | | `removeRole()` | (`data`) => `Promise`\<`Membership`> | Removes a role from an existing membership record. Requires permission to remove roles. Cannot remove ownership roles. | # notification (/docs/reference/sdk/routes/notification) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### BaseNotificationParams [#basenotificationparams] #### Extended by [#extended-by] * [`GetNotificationsData`](#getnotificationsdata) * [`GetNewNotificationsData`](#getnewnotificationsdata) * [`GetNewNotificationCountData`](#getnewnotificationcountdata) * [`GetUsersLastNotificationsSeenData`](#getuserslastnotificationsseendata) * [`UpdateUsersLastSeenData`](#updateuserslastseendata) #### Properties [#properties] | Property | Type | | ------------------------------ | ----------- | | `channels` | `string`\[] | | `types?` | `string`\[] | *** ### ChannelQuery [#channelquery] #### Properties [#properties-1] | Property | Type | | -------------------------------- | ----------- | | `channels` | `string`\[] | | `types?` | `string`\[] | *** ### GetNewNotificationCountBulkData [#getnewnotificationcountbulkdata] #### Properties [#properties-2] | Property | Type | | ------------------------------------------ | ---------------------------------- | | `channelQueries` | [`ChannelQuery`](#channelquery)\[] | *** ### GetNewNotificationCountData [#getnewnotificationcountdata] #### Extends [#extends] * [`BaseNotificationParams`](#basenotificationparams) #### Properties [#properties-3] | Property | Type | Inherited from | | -------------------------------- | ----------- | --------------------------------------------------------------------------- | | `channels` | `string`\[] | [`BaseNotificationParams`](#basenotificationparams).[`channels`](#channels) | | `types?` | `string`\[] | [`BaseNotificationParams`](#basenotificationparams).[`types`](#types) | *** ### GetNewNotificationsData [#getnewnotificationsdata] #### Extends [#extends-1] * [`BaseNotificationParams`](#basenotificationparams).[`PaginationParams`](#paginationparams) #### Properties [#properties-4] | Property | Type | Inherited from | | ------------------------------------------------------- | ----------------------- | ----------------------------------------------------------------------------------------- | | `channels` | `string`\[] | [`BaseNotificationParams`](#basenotificationparams).[`channels`](#channels) | | `cursor?` | `string` | [`PaginationParams`](#paginationparams).[`cursor`](#cursor-2) | | `includeCounts?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCounts`](#includecounts-2) | | `includeCursorRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCursorRecord`](#includecursorrecord-2) | | `includeStartAtRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeStartAtRecord`](#includestartatrecord-2) | | `limit?` | `number` | [`PaginationParams`](#paginationparams).[`limit`](#limit-2) | | `page?` | `number` | [`PaginationParams`](#paginationparams).[`page`](#page-2) | | `paginate?` | `"cursor"` \| `"index"` | - | | `paginateReverse?` | `boolean` | [`PaginationParams`](#paginationparams).[`paginateReverse`](#paginatereverse-2) | | `startAt?` | `string` | [`PaginationParams`](#paginationparams).[`startAt`](#startat-2) | | `types?` | `string`\[] | [`BaseNotificationParams`](#basenotificationparams).[`types`](#types) | | `updateLastSeen?` | `boolean` | - | *** ### GetNotificationsData [#getnotificationsdata] #### Extends [#extends-2] * [`BaseNotificationParams`](#basenotificationparams).[`PaginationParams`](#paginationparams).[`SortParams`](#sortparams) #### Properties [#properties-5] | Property | Type | Inherited from | | --------------------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------- | | `channels` | `string`\[] | [`BaseNotificationParams`](#basenotificationparams).[`channels`](#channels) | | `createdAfter?` | `number` | - | | `createdBefore?` | `number` | - | | `cursor?` | `string` | [`PaginationParams`](#paginationparams).[`cursor`](#cursor-2) | | `includeCounts?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCounts`](#includecounts-2) | | `includeCursorRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCursorRecord`](#includecursorrecord-2) | | `includeStartAtRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeStartAtRecord`](#includestartatrecord-2) | | `limit?` | `number` | [`PaginationParams`](#paginationparams).[`limit`](#limit-2) | | `page?` | `number` | [`PaginationParams`](#paginationparams).[`page`](#page-2) | | `paginate?` | `"cursor"` \| `"index"` | - | | `paginateReverse?` | `boolean` | [`PaginationParams`](#paginationparams).[`paginateReverse`](#paginatereverse-2) | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-1) | | `startAt?` | `string` | [`PaginationParams`](#paginationparams).[`startAt`](#startat-2) | | `types?` | `string`\[] | [`BaseNotificationParams`](#basenotificationparams).[`types`](#types) | *** ### GetUsersLastNotificationsSeenData [#getuserslastnotificationsseendata] #### Extends [#extends-3] * [`BaseNotificationParams`](#basenotificationparams) #### Properties [#properties-6] | Property | Type | Inherited from | | -------------------------------- | ----------- | --------------------------------------------------------------------------- | | `channels` | `string`\[] | [`BaseNotificationParams`](#basenotificationparams).[`channels`](#channels) | | `types?` | `string`\[] | [`BaseNotificationParams`](#basenotificationparams).[`types`](#types) | *** ### PaginationParams [#paginationparams] #### Extended by [#extended-by-1] * [`GetNotificationsData`](#getnotificationsdata) * [`GetNewNotificationsData`](#getnewnotificationsdata) #### Properties [#properties-7] | Property | Type | | --------------------------------------------------------- | --------- | | `cursor?` | `string` | | `includeCounts?` | `boolean` | | `includeCursorRecord?` | `boolean` | | `includeStartAtRecord?` | `boolean` | | `limit?` | `number` | | `page?` | `number` | | `paginateReverse?` | `boolean` | | `startAt?` | `string` | *** ### SortParams [#sortparams] #### Extended by [#extended-by-2] * [`GetNotificationsData`](#getnotificationsdata) #### Properties [#properties-8] | Property | Type | | ------------------------- | -------------------------------- | | `sort?` | `Record`\<`string`, `-1` \| `1`> | *** ### UpdateUsersLastSeenData [#updateuserslastseendata] #### Extends [#extends-4] * [`BaseNotificationParams`](#basenotificationparams) #### Properties [#properties-9] | Property | Type | Inherited from | | -------------------------------- | ----------- | --------------------------------------------------------------------------- | | `channels` | `string`\[] | [`BaseNotificationParams`](#basenotificationparams).[`channels`](#channels) | | `types?` | `string`\[] | [`BaseNotificationParams`](#basenotificationparams).[`types`](#types) | ## Type Aliases [#type-aliases] ### LastSeenResponse [#lastseenresponse] ```ts type LastSeenResponse = { channels: string[]; lastSeen: number; types?: string[]; }; ``` #### Properties [#properties-10] | Property | Type | | -------------------------------- | ----------- | | `channels` | `string`\[] | | `lastSeen` | `number` | | `types?` | `string`\[] | *** ### NotificationCountBulkResponse [#notificationcountbulkresponse] ```ts type NotificationCountBulkResponse = { channels: string[]; count: number; types?: string[]; }[]; ``` #### Type Declaration [#type-declaration] | Name | Type | | ---------- | ----------- | | `channels` | `string`\[] | | `count` | `number` | | `types?` | `string`\[] | *** ### NotificationCountResponse [#notificationcountresponse] ```ts type NotificationCountResponse = { count: number; }; ``` #### Properties [#properties-11] | Property | Type | | ------------------------ | -------- | | `count` | `number` | *** ### PaginatedNotificationResponse [#paginatednotificationresponse] ```ts type PaginatedNotificationResponse = PaginatedResponse; ``` *** ### PaginatedResponse [#paginatedresponse] ```ts type PaginatedResponse = PaginatedResult | CursorPaginatedResult & { results?: T[]; }; ``` #### Type Declaration [#type-declaration-1] | Name | Type | | ---------- | ------ | | `results?` | `T`\[] | #### Type Parameters [#type-parameters] | Type Parameter | | -------------- | | `T` | ## Functions [#functions] ### default() [#default] ```ts function default(client): { getNewNotificationCount: Promise; getNewNotificationCountBulk: Promise; getNewNotifications: Promise; getNotifications: Promise; getUsersLastNotificationsSeen: Promise; updateUsersLastSeen: Promise; }; ``` Defines notification-related methods for the NuramaClient. #### Parameters [#parameters] | Parameter | Type | Description | | --------- | ----------------------------------------------------- | -------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | The NuramaClient instance. | #### Returns [#returns] An object containing the notification-related methods. | Name | Type | Description | | --------------------------------- | ----------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | `getNewNotificationCount()` | (`data`) => `Promise`\<[`NotificationCountResponse`](#notificationcountresponse)> | Gets the count of new (unread) notifications for the specified channels. | | `getNewNotificationCountBulk()` | (`data`) => `Promise`\<[`NotificationCountBulkResponse`](#notificationcountbulkresponse)> | Gets the count of new notifications for multiple channel/type queries in a single request. | | `getNewNotifications()` | (`data`) => `Promise`\<[`PaginatedNotificationResponse`](#paginatednotificationresponse)> | Retrieves new notifications since the user's last viewed timestamp for the specified channels. Optionally updates the last viewed timestamp. | | `getNotifications()` | (`data`) => `Promise`\<[`PaginatedNotificationResponse`](#paginatednotificationresponse)> | Retrieves notifications for specified channels, with optional filtering and pagination. | | `getUsersLastNotificationsSeen()` | (`data`) => `Promise`\<[`LastSeenResponse`](#lastseenresponse)> | Retrieves the last seen timestamp record for the specified channels and optional types. | | `updateUsersLastSeen()` | (`data`) => `Promise`\<[`LastSeenResponse`](#lastseenresponse)> | Updates (or creates) the last seen timestamp for the user for the specified channels and optional types. | # payment (/docs/reference/sdk/routes/payment) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### ManualCheckoutRequest [#manualcheckoutrequest] #### Properties [#properties] | Property | Type | | ---------------------------------------- | --------------------- | | `billingPeriod` | `"month"` \| `"year"` | | `currency` | `"usd"` \| `"gbp"` | | `productId` | `string` | | `resourceId` | `string` | *** ### StripeCheckoutRequest [#stripecheckoutrequest] #### Properties [#properties-1] | Property | Type | | ------------------------------------------ | --------------------- | | `billingPeriod` | `"month"` \| `"year"` | | `currency` | `"usd"` \| `"gbp"` | | `productId` | `string` | | `resourceId` | `string` | *** ### StripeCheckoutResponse [#stripecheckoutresponse] #### Properties [#properties-2] | Property | Type | | -------------------- | -------- | | `url` | `string` | *** ### StripeCustomerResponse [#stripecustomerresponse] #### Properties [#properties-3] | Property | Type | | ---------------------------------- | -------- | | `customerId` | `string` | *** ### StripePortalResponse [#stripeportalresponse] #### Properties [#properties-4] | Property | Type | | ---------------------- | -------- | | `url` | `string` | ## Functions [#functions] ### default() [#default] ```ts function default(client): { createManualCheckout: Promise; createStripeCheckout: Promise; createStripeCustomer: Promise; getStripePortalUrl: Promise; }; ``` Defines payment-related methods for the NuramaClient. #### Parameters [#parameters] | Parameter | Type | Description | | --------- | ----------------------------------------------------- | -------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | The NuramaClient instance. | #### Returns [#returns] An object containing the payment-related methods. | Name | Type | Description | | ------------------------ | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | | `createManualCheckout()` | (`checkoutData`) => `Promise`\<`any`> | Create a manual subscription without Stripe processing. Requires authentication and permission. | | `createStripeCheckout()` | (`checkoutData`) => `Promise`\<[`StripeCheckoutResponse`](#stripecheckoutresponse)> | Create a Stripe subscription checkout session. Requires authentication and permission. | | `createStripeCustomer()` | () => `Promise`\<[`StripeCustomerResponse`](#stripecustomerresponse)> | Create a new Stripe customer for the authenticated user. Requires authentication and permission. | | `getStripePortalUrl()` | () => `Promise`\<[`StripePortalResponse`](#stripeportalresponse)> | Generate a URL for the Stripe customer portal for subscription management. Requires authentication and permission. | # product (/docs/reference/sdk/routes/product) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### GetWorkspaceProductsParams [#getworkspaceproductsparams] #### Properties [#properties] | Property | Type | | --------------------------------------------- | ----------------------------------------------------------------------------------- | | `paymentProvider?` | `"stripe"` \| `"manualInvoice"` | | `productType?` | `"basePlan"` \| `"addSeat"` \| `"addStorage"` \| `"addCredits"` \| `"enableBoards"` | ## Type Aliases [#type-aliases] ### ProductResponse [#productresponse] ```ts type ProductResponse = Product; ``` *** ### SupportedCurrency [#supportedcurrency] ```ts type SupportedCurrency = "gbp" | "usd" | "eur"; ``` ## Functions [#functions] ### default() [#default] ```ts function default(client): { getSuggestedCurrency: Promise<{ country: string | null; currency: SupportedCurrency; locked?: boolean; supported: SupportedCurrency[]; }>; getWorkspaceProducts: Promise; listPlans: Promise; }; ``` Defines product-related methods for the NuramaClient. #### Parameters [#parameters] | Parameter | Type | Description | | --------- | ----------------------------------------------------- | -------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | The NuramaClient instance. | #### Returns [#returns] An object containing the product-related methods. | Name | Type | Description | | ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `getSuggestedCurrency()` | () => `Promise`\<\{ `country`: `string` \| `null`; `currency`: [`SupportedCurrency`](#supportedcurrency); `locked?`: `boolean`; `supported`: [`SupportedCurrency`](#supportedcurrency)\[]; }> | Suggested billing currency for the caller, derived server-side from the CDN geo header. A *default* for the currency selector only — the user can override. Falls back to `usd` with no geo header. | | `getWorkspaceProducts()` | (`workspaceId`, `params?`) => `Promise`\<`Product`\[]> | Retrieves available products for a specific workspace, considering restrictions. Requires authentication and permission. | | `listPlans()` | () => `Promise`\<`Product`\[]> | List active starter-package "plans" available to the caller, scoped by user-level restrictions but NOT bound to a workspace. Used by the post-signup plan-selection overlay before any workspace exists. | # project (/docs/reference/sdk/routes/project) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### AddItemsToPublicFileSystemData [#additemstopublicfilesystemdata] #### Properties [#properties] | Property | Type | | -------------------------------- | ----------- | | `itemPaths` | `string`\[] | *** ### AddItemsToSubmissionData [#additemstosubmissiondata] #### Properties [#properties-1] | Property | Type | | --------------------------------------------- | ----------- | | `destinationPath?` | `string` | | `itemPaths` | `string`\[] | *** ### CopyItemsData [#copyitemsdata] #### Properties [#properties-2] | Property | Type | | ---------------------------------------------- | ----------- | | `destinationPath` | `string` | | `itemPaths` | `string`\[] | *** ### CopyPublicItemsData [#copypublicitemsdata] #### Properties [#properties-3] | Property | Type | | ---------------------------------------------- | ----------- | | `destinationPath` | `string` | | `itemPaths` | `string`\[] | *** ### CopySubmissionItemsData [#copysubmissionitemsdata] #### Properties [#properties-4] | Property | Type | | ---------------------------------------------- | ----------- | | `destinationPath` | `string` | | `itemPaths` | `string`\[] | *** ### CreateFolderData [#createfolderdata] #### Properties [#properties-5] | Property | Type | | ------------------------------- | -------- | | `basePath?` | `string` | | `color?` | `string` | | `name` | `string` | *** ### CreateProjectData [#createprojectdata] #### Properties [#properties-6] | Property | Type | | ------------------------------------ | -------- | | `name` | `string` | | `workspaceId` | `string` | *** ### CreatePublicFileSystemData [#createpublicfilesystemdata] #### Properties [#properties-7] | Property | Type | Description | | ----------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `allowAnonymousComments?` | `boolean` | Allow unauthenticated visitors to comment with just a display name + color. | | `description?` | `string` | - | | `hideCreators?` | `boolean` | Repress asset/folder creators + the "Shared by" user in the external public API output. | | `itemPaths?` | `string`\[] | - | | `releaseImmediately?` | `boolean` | When false, the release is staged as `unreleased` — externally inaccessible until it is released via `releasePublicFileSystem`. Defaults to true (goes live immediately). | | `title` | `string` | - | | `validity?` | `number` | - | *** ### CreateSubmissionData [#createsubmissiondata] #### Properties [#properties-8] | Property | Type | Description | | ----------------------------------------------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `description?` | `string` | - | | `itemPaths?` | `string`\[] | - | | `releaseImmediately?` | `boolean` | When false, the submission is staged as `unreleased` — hidden from reviewers until it is released via `releaseSubmission`. Defaults to true (goes live immediately). | | `subject?` | `string` | - | | `version?` | `string` | - | *** ### CreateSubmissionFolderData [#createsubmissionfolderdata] #### Properties [#properties-9] | Property | Type | | --------------------------------- | -------- | | `basePath?` | `string` | | `color?` | `string` | | `name` | `string` | *** ### DateRangeParams [#daterangeparams] #### Extended by [#extended-by] * [`GetItemsAtPathParams`](#getitemsatpathparams) * [`ListAssetsParams`](#listassetsparams) * [`ListFoldersParams`](#listfoldersparams) * [`ListSubmissionsParams`](#listsubmissionsparams) #### Properties [#properties-10] | Property | Type | | ----------------------------------------- | -------------------- | | `createdAfter?` | `string` \| `number` | | `createdBefore?` | `string` \| `number` | *** ### DeleteItemsData [#deleteitemsdata] #### Properties [#properties-11] | Property | Type | | ---------------------------------- | ----------- | | `itemPaths` | `string`\[] | *** ### DeletePublicItemsData [#deletepublicitemsdata] #### Properties [#properties-12] | Property | Type | | ---------------------------------- | ----------- | | `itemPaths` | `string`\[] | *** ### DeleteSubmissionItemsData [#deletesubmissionitemsdata] #### Properties [#properties-13] | Property | Type | | ---------------------------------- | ----------- | | `itemPaths` | `string`\[] | *** ### FileUploadData [#fileuploaddata] #### Extended by [#extended-by-1] * [`LogoUploadData`](#logouploaddata) #### Properties [#properties-14] | Property | Type | | --------------------------------- | -------- | | `basePath?` | `string` | | `checksum` | `string` | | `id` | `number` | | `name` | `string` | | `sizeInMB` | `number` | *** ### GetChatParams [#getchatparams] #### Properties [#properties-15] | Property | Type | | ------------------------------- | -------- | | `messages?` | `number` | | `replies?` | `number` | *** ### GetHighlightedMessagesParams [#gethighlightedmessagesparams] #### Extends [#extends] * [`SortParams`](#sortparams).[`PaginationParams`](#paginationparams) #### Properties [#properties-16] | Property | Type | Inherited from | | ----------------------------------------------------- | -------------------------------- | --------------------------------------------------------------------------------------- | | `cursor?` | `string` | [`PaginationParams`](#paginationparams).[`cursor`](#cursor-8) | | `includeCounts?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCounts`](#includecounts-8) | | `includeCursorRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCursorRecord`](#includecursorrecord-8) | | `limit?` | `number` | [`PaginationParams`](#paginationparams).[`limit`](#limit-8) | | `page?` | `number` | [`PaginationParams`](#paginationparams).[`page`](#page-8) | | `paginate?` | `"cursor"` \| `"index"` | [`PaginationParams`](#paginationparams).[`paginate`](#paginate-8) | | `paginateReverse?` | `boolean` | [`PaginationParams`](#paginationparams).[`paginateReverse`](#paginatereverse-8) | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-7) | | `startAt?` | `string` | [`PaginationParams`](#paginationparams).[`startAt`](#startat-8) | *** ### GetItemsAtPathParams [#getitemsatpathparams] #### Extends [#extends-1] * [`SortParams`](#sortparams).[`DateRangeParams`](#daterangeparams) #### Properties [#properties-17] | Property | Type | Inherited from | | ------------------------------------------------------- | ----------------------------------------- | ----------------------------------------------------------------------- | | `createdAfter?` | `string` \| `number` | [`DateRangeParams`](#daterangeparams).[`createdAfter`](#createdafter) | | `createdBefore?` | `string` \| `number` | [`DateRangeParams`](#daterangeparams).[`createdBefore`](#createdbefore) | | `creatorId?` | `string` | - | | `cursor?` | `string` | - | | `includeCounts?` | `boolean` | - | | `includeCursorRecord?` | `boolean` | - | | `includeStartAtRecord?` | `boolean` | - | | `limit?` | `number` | - | | `mediaTypes?` | (`"folder"` \| `"image"` \| `"video"`)\[] | - | | `nameSearch?` | `string` | - | | `page?` | `number` | - | | `paginate?` | `"cursor"` \| `"index"` | - | | `paginateReverse?` | `boolean` | - | | `resourceIds?` | `string`\[] | - | | `resourceStatus?` | `"active"` \| `"pendingDelete"` | - | | `resourceTags?` | `string`\[] | - | | `resourceType?` | `"asset"` \| `"folder"` | - | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-7) | | `startAt?` | `string` | - | *** ### GetPublicChatMessagesParams [#getpublicchatmessagesparams] #### Extends [#extends-2] * [`PaginationParams`](#paginationparams) #### Properties [#properties-18] | Property | Type | Inherited from | | ------------------------------------------------------- | ----------------------- | --------------------------------------------------------------------------------------- | | `cursor?` | `string` | [`PaginationParams`](#paginationparams).[`cursor`](#cursor-8) | | `includeCounts?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCounts`](#includecounts-8) | | `includeCursorRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCursorRecord`](#includecursorrecord-8) | | `limit?` | `number` | [`PaginationParams`](#paginationparams).[`limit`](#limit-8) | | `page?` | `number` | [`PaginationParams`](#paginationparams).[`page`](#page-8) | | `paginate?` | `"cursor"` \| `"index"` | [`PaginationParams`](#paginationparams).[`paginate`](#paginate-8) | | `paginateReverse?` | `boolean` | [`PaginationParams`](#paginationparams).[`paginateReverse`](#paginatereverse-8) | | `replyLimit?` | `number` | - | | `startAt?` | `string` | [`PaginationParams`](#paginationparams).[`startAt`](#startat-8) | *** ### GetSubmissionParams [#getsubmissionparams] #### Properties [#properties-19] | Property | Type | | ----------------------------------------------- | ------------------------------------------------------------------------------ | | `chatMessageLimit?` | `number` | | `chatMessageSort?` | \{ `createdAt?`: `1` \| `-1`; `id?`: `1` \| `-1`; `updatedAt?`: `1` \| `-1`; } | | `chatMessageSort.createdAt?` | `1` \| `-1` | | `chatMessageSort.id?` | `1` \| `-1` | | `chatMessageSort.updatedAt?` | `1` \| `-1` | | `chatReplyLimit?` | `number` | | `chatReplySort?` | \{ `createdAt?`: `1` \| `-1`; `id?`: `1` \| `-1`; `updatedAt?`: `1` \| `-1`; } | | `chatReplySort.createdAt?` | `1` \| `-1` | | `chatReplySort.id?` | `1` \| `-1` | | `chatReplySort.updatedAt?` | `1` \| `-1` | *** ### ListAssetsParams [#listassetsparams] #### Extends [#extends-3] * [`SortParams`](#sortparams).[`PaginationParams`](#paginationparams).[`DateRangeParams`](#daterangeparams) #### Extended by [#extended-by-2] * [`ListFeedParams`](#listfeedparams) #### Properties [#properties-20] | Property | Type | Inherited from | | ------------------------------------------------------- | -------------------------------- | --------------------------------------------------------------------------------------- | | `createdAfter?` | `string` \| `number` | [`DateRangeParams`](#daterangeparams).[`createdAfter`](#createdafter) | | `createdBefore?` | `string` \| `number` | [`DateRangeParams`](#daterangeparams).[`createdBefore`](#createdbefore) | | `cursor?` | `string` | [`PaginationParams`](#paginationparams).[`cursor`](#cursor-8) | | `folderId?` | `string` | - | | `ignoreFolder?` | `boolean` | - | | `includeChats?` | `boolean` | - | | `includeCounts?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCounts`](#includecounts-8) | | `includeCursorRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCursorRecord`](#includecursorrecord-8) | | `limit?` | `number` | [`PaginationParams`](#paginationparams).[`limit`](#limit-8) | | `mediaTypes?` | `string`\[] | - | | `page?` | `number` | [`PaginationParams`](#paginationparams).[`page`](#page-8) | | `paginate?` | `"cursor"` \| `"index"` | [`PaginationParams`](#paginationparams).[`paginate`](#paginate-8) | | `paginateReverse?` | `boolean` | [`PaginationParams`](#paginationparams).[`paginateReverse`](#paginatereverse-8) | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-7) | | `startAt?` | `string` | [`PaginationParams`](#paginationparams).[`startAt`](#startat-8) | *** ### ListFeedParams [#listfeedparams] #### Extends [#extends-4] * [`ListAssetsParams`](#listassetsparams) #### Properties [#properties-21] | Property | Type | Inherited from | | ------------------------------------------------------- | -------------------------------- | --------------------------------------------------------------------------------------- | | `chatMessageLimit?` | `number` | - | | `chatMessageSort?` | `Record`\<`string`, `-1` \| `1`> | - | | `chatReplyLimit?` | `number` | - | | `chatReplySort?` | `Record`\<`string`, `-1` \| `1`> | - | | `createdAfter?` | `string` \| `number` | [`ListAssetsParams`](#listassetsparams).[`createdAfter`](#createdafter-2) | | `createdBefore?` | `string` \| `number` | [`ListAssetsParams`](#listassetsparams).[`createdBefore`](#createdbefore-2) | | `cursor?` | `string` | [`ListAssetsParams`](#listassetsparams).[`cursor`](#cursor-3) | | `folderId?` | `string` | [`ListAssetsParams`](#listassetsparams).[`folderId`](#folderid) | | `followedChatsOnly?` | `boolean` | - | | `hideIfNoChatMessages?` | `boolean` | - | | `ignoreFolder?` | `boolean` | [`ListAssetsParams`](#listassetsparams).[`ignoreFolder`](#ignorefolder) | | `includeChats?` | `boolean` | [`ListAssetsParams`](#listassetsparams).[`includeChats`](#includechats) | | `includeCounts?` | `boolean` | [`ListAssetsParams`](#listassetsparams).[`includeCounts`](#includecounts-3) | | `includeCursorRecord?` | `boolean` | [`ListAssetsParams`](#listassetsparams).[`includeCursorRecord`](#includecursorrecord-3) | | `limit?` | `number` | [`ListAssetsParams`](#listassetsparams).[`limit`](#limit-3) | | `mediaTypes?` | `string`\[] | [`ListAssetsParams`](#listassetsparams).[`mediaTypes`](#mediatypes-1) | | `page?` | `number` | [`ListAssetsParams`](#listassetsparams).[`page`](#page-3) | | `paginate?` | `"cursor"` \| `"index"` | [`ListAssetsParams`](#listassetsparams).[`paginate`](#paginate-3) | | `paginateReverse?` | `boolean` | [`ListAssetsParams`](#listassetsparams).[`paginateReverse`](#paginatereverse-3) | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`ListAssetsParams`](#listassetsparams).[`sort`](#sort-2) | | `startAt?` | `string` | [`ListAssetsParams`](#listassetsparams).[`startAt`](#startat-3) | *** ### ListFoldersParams [#listfoldersparams] #### Extends [#extends-5] * [`SortParams`](#sortparams).[`PaginationParams`](#paginationparams).[`DateRangeParams`](#daterangeparams) #### Properties [#properties-22] | Property | Type | Inherited from | | ------------------------------------------------------- | -------------------------------- | --------------------------------------------------------------------------------------- | | `createdAfter?` | `string` \| `number` | [`DateRangeParams`](#daterangeparams).[`createdAfter`](#createdafter) | | `createdBefore?` | `string` \| `number` | [`DateRangeParams`](#daterangeparams).[`createdBefore`](#createdbefore) | | `cursor?` | `string` | [`PaginationParams`](#paginationparams).[`cursor`](#cursor-8) | | `includeCounts?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCounts`](#includecounts-8) | | `includeCursorRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCursorRecord`](#includecursorrecord-8) | | `limit?` | `number` | [`PaginationParams`](#paginationparams).[`limit`](#limit-8) | | `mediaTypes?` | `string`\[] | - | | `page?` | `number` | [`PaginationParams`](#paginationparams).[`page`](#page-8) | | `paginate?` | `"cursor"` \| `"index"` | [`PaginationParams`](#paginationparams).[`paginate`](#paginate-8) | | `paginateReverse?` | `boolean` | [`PaginationParams`](#paginationparams).[`paginateReverse`](#paginatereverse-8) | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-7) | | `startAt?` | `string` | [`PaginationParams`](#paginationparams).[`startAt`](#startat-8) | *** ### ListPublicFileSystemsParams [#listpublicfilesystemsparams] #### Extends [#extends-6] * [`SortParams`](#sortparams).[`PaginationParams`](#paginationparams) #### Properties [#properties-23] | Property | Type | Inherited from | | ------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | | `creatorId?` | `string` | - | | `cursor?` | `string` | [`PaginationParams`](#paginationparams).[`cursor`](#cursor-8) | | `includeCounts?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCounts`](#includecounts-8) | | `includeCursorRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCursorRecord`](#includecursorrecord-8) | | `limit?` | `number` | [`PaginationParams`](#paginationparams).[`limit`](#limit-8) | | `page?` | `number` | [`PaginationParams`](#paginationparams).[`page`](#page-8) | | `paginate?` | `"cursor"` \| `"index"` | [`PaginationParams`](#paginationparams).[`paginate`](#paginate-8) | | `paginateReverse?` | `boolean` | [`PaginationParams`](#paginationparams).[`paginateReverse`](#paginatereverse-8) | | `search?` | `string` | - | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-7) | | `startAt?` | `string` | [`PaginationParams`](#paginationparams).[`startAt`](#startat-8) | | `status?` | \| [`PublicFileSystemStatus`](#publicfilesystemstatus) \| [`PublicFileSystemStatus`](#publicfilesystemstatus)\[] | - | *** ### ListSubmissionsParams [#listsubmissionsparams] #### Extends [#extends-7] * [`SortParams`](#sortparams).[`PaginationParams`](#paginationparams).[`DateRangeParams`](#daterangeparams) #### Properties [#properties-24] | Property | Type | Inherited from | | ------------------------------------------------------- | -------------------------------- | --------------------------------------------------------------------------------------- | | `createdAfter?` | `string` \| `number` | [`DateRangeParams`](#daterangeparams).[`createdAfter`](#createdafter) | | `createdBefore?` | `string` \| `number` | [`DateRangeParams`](#daterangeparams).[`createdBefore`](#createdbefore) | | `cursor?` | `string` | [`PaginationParams`](#paginationparams).[`cursor`](#cursor-8) | | `includeCounts?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCounts`](#includecounts-8) | | `includeCursorRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCursorRecord`](#includecursorrecord-8) | | `limit?` | `number` | [`PaginationParams`](#paginationparams).[`limit`](#limit-8) | | `page?` | `number` | [`PaginationParams`](#paginationparams).[`page`](#page-8) | | `paginate?` | `"cursor"` \| `"index"` | [`PaginationParams`](#paginationparams).[`paginate`](#paginate-8) | | `paginateReverse?` | `boolean` | [`PaginationParams`](#paginationparams).[`paginateReverse`](#paginatereverse-8) | | `search?` | `string` | - | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-7) | | `startAt?` | `string` | [`PaginationParams`](#paginationparams).[`startAt`](#startat-8) | *** ### LogoUploadData [#logouploaddata] #### Extends [#extends-8] * [`FileUploadData`](#fileuploaddata) #### Properties [#properties-25] | Property | Type | Inherited from | | --------------------------------- | -------- | ------------------------------------------------------------- | | `basePath?` | `string` | [`FileUploadData`](#fileuploaddata).[`basePath`](#basepath-2) | | `checksum` | `string` | [`FileUploadData`](#fileuploaddata).[`checksum`](#checksum) | | `id` | `number` | [`FileUploadData`](#fileuploaddata).[`id`](#id) | | `name` | `string` | [`FileUploadData`](#fileuploaddata).[`name`](#name-3) | | `sizeInMB` | `number` | [`FileUploadData`](#fileuploaddata).[`sizeInMB`](#sizeinmb) | *** ### MoveItemsData [#moveitemsdata] #### Properties [#properties-26] | Property | Type | | ---------------------------------------------- | ----------- | | `destinationPath` | `string` | | `itemPaths` | `string`\[] | *** ### MoveItemsResult [#moveitemsresult] A move into a virtual folder is not a move. `Public/` and `Submission/` copy the items into that collection; `Review/` publishes them. Both leave the sources in place, and both report through the extra fields below. #### Properties [#properties-27] | Property | Type | Description | | --------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------------- | | `count` | `number` | Items copied, or published when `published` is true. | | `errors?` | \{ `data?`: `unknown`; `message?`: `string`; `type`: `string`; }\[] | Items the publish rejected. Empty or absent when everything went through. | | `published?` | `boolean` | Set when the destination was `Review/`, so the items were published. | | `virtualDestination?` | `boolean` | Set when the destination resolved to a virtual folder. | *** ### MovePublicItemsData [#movepublicitemsdata] #### Properties [#properties-28] | Property | Type | | ---------------------------------------------- | ----------- | | `destinationPath` | `string` | | `itemPaths` | `string`\[] | *** ### MoveSubmissionItemsData [#movesubmissionitemsdata] #### Properties [#properties-29] | Property | Type | | ---------------------------------------------- | ----------- | | `destinationPath` | `string` | | `itemPaths` | `string`\[] | *** ### PaginationParams [#paginationparams] #### Extended by [#extended-by-3] * [`ListAssetsParams`](#listassetsparams) * [`ListFoldersParams`](#listfoldersparams) * [`ListSubmissionsParams`](#listsubmissionsparams) * [`ListPublicFileSystemsParams`](#listpublicfilesystemsparams) * [`GetHighlightedMessagesParams`](#gethighlightedmessagesparams) * [`GetPublicChatMessagesParams`](#getpublicchatmessagesparams) #### Properties [#properties-30] | Property | Type | | ------------------------------------------------------- | ----------------------- | | `cursor?` | `string` | | `includeCounts?` | `boolean` | | `includeCursorRecord?` | `boolean` | | `limit?` | `number` | | `page?` | `number` | | `paginate?` | `"cursor"` \| `"index"` | | `paginateReverse?` | `boolean` | | `startAt?` | `string` | *** ### ProjectFileUploadBody [#projectfileuploadbody] #### Properties [#properties-31] | Property | Type | | ----------------------------------------------- | -------------------------------------- | | `destinationPath?` | `string` | | `files` | [`FileUploadData`](#fileuploaddata)\[] | *** ### ProjectTopAccessActivityResponse [#projecttopaccessactivityresponse] Defines project-related methods for the NuramaClient. #### Properties [#properties-32] | Property | Type | | -------------------------------- | ----------------------------------------------- | | `eventType` | `string` | | `from` | `string` | | `range` | `string` | | `results` | \{ `assetId`: `string`; `count`: `number`; }\[] | | `to` | `string` | *** ### PublicAuditAssetResponse [#publicauditassetresponse] #### Properties [#properties-33] | Property | Type | | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | `createdAt` | `string` | | `creator` | \| \{ `avatar?`: `any`; `color?`: `string`; `displayName?`: `string`; `firstName?`: `string`; `id`: `string`; `lastName?`: `string`; } \| `null` | | `everPublic` | `boolean` | | `hasActivePublicLink` | `boolean` | | `id` | `string` | | `mediaType` | `string` | | `name` | `string` | | `publicFileSystems` | \{ `id`: `string`; `status`: `string`; `title`: `string`; }\[] | | `publicLinkCount` | `number` | | `thumbnail` | \| \{ `keyPath`: `string`; } \| `null` | *** ### PublicFileSystemResponse [#publicfilesystemresponse] #### Properties [#properties-34] | Property | Type | | ------------------------------------------------------------- | ----------- | | `allowAnonymousComments?` | `boolean` | | `createdAt` | `string` | | `description?` | `string` | | `expiresAt` | `string` | | `hideCreators?` | `boolean` | | `id` | `string` | | `itemPaths` | `string`\[] | | `projectId` | `string` | | `title` | `string` | | `token` | `string` | | `updatedAt` | `string` | *** ### PublishItemsData [#publishitemsdata] #### Properties [#properties-35] | Property | Type | | --------------------------------------------------------- | ----------- | | `basePath?` | `string` | | `resourceIds` | `string`\[] | | `sendEmailNotification?` | `boolean` | *** ### SortParams [#sortparams] #### Extended by [#extended-by-4] * [`GetItemsAtPathParams`](#getitemsatpathparams) * [`ListAssetsParams`](#listassetsparams) * [`ListFoldersParams`](#listfoldersparams) * [`ListSubmissionsParams`](#listsubmissionsparams) * [`ListPublicFileSystemsParams`](#listpublicfilesystemsparams) * [`GetHighlightedMessagesParams`](#gethighlightedmessagesparams) #### Properties [#properties-36] | Property | Type | | ------------------------- | -------------------------------- | | `sort?` | `Record`\<`string`, `-1` \| `1`> | *** ### TagSubmissionData [#tagsubmissiondata] #### Properties [#properties-37] | Property | Type | | ------------------------ | -------- | | `tagId` | `string` | *** ### UnpublishItemsData [#unpublishitemsdata] #### Properties [#properties-38] | Property | Type | | -------------------------------------- | ----------- | | `resourceIds` | `string`\[] | *** ### UpdateProjectData [#updateprojectdata] #### Properties [#properties-39] | Property | Type | | --------------------------------------- | --------- | | `description?` | `string` | | `name?` | `string` | | `updateSlug?` | `boolean` | *** ### UpdatePublicFileSystemData [#updatepublicfilesystemdata] #### Properties [#properties-40] | Property | Type | Description | | ------------------------------------------------------------- | ------------------------------------------------------------------------ | --------------------------------------------------------------------------------------- | | `allowAnonymousComments?` | `boolean` | Allow unauthenticated visitors to comment with just a display name + color. | | `description?` | `string` | - | | `hideCreators?` | `boolean` | Repress asset/folder creators + the "Shared by" user in the external public API output. | | `status?` | `"active"` \| `"expired"` \| `"disabled"` \| `"error"` \| `"unreleased"` | - | | `title?` | `string` | - | | `validity?` | `number` | - | *** ### UpdateSubmissionData [#updatesubmissiondata] #### Properties [#properties-41] | Property | Type | | --------------------------------------- | -------- | | `description?` | `string` | | `subject?` | `string` | | `version?` | `string` | ## Type Aliases [#type-aliases] ### AssetResponse [#assetresponse] ```ts type AssetResponse = Asset; ``` *** ### ChatResponse [#chatresponse] ```ts type ChatResponse = Chat; ``` *** ### FolderResponse [#folderresponse] ```ts type FolderResponse = Folder; ``` *** ### PaginatedResponse [#paginatedresponse] ```ts type PaginatedResponse = PaginatedResult | CursorPaginatedResult & { results?: T[]; }; ``` #### Type Declaration [#type-declaration] | Name | Type | | ---------- | ------ | | `results?` | `T`\[] | #### Type Parameters [#type-parameters] | Type Parameter | | -------------- | | `T` | *** ### ProjectResponse [#projectresponse] ```ts type ProjectResponse = Project; ``` *** ### PublicFileSystemStatus [#publicfilesystemstatus] ```ts type PublicFileSystemStatus = "active" | "expired" | "disabled" | "unreleased"; ``` *** ### SubmissionResponse [#submissionresponse] ```ts type SubmissionResponse = ChatSubmission; ``` ## Functions [#functions] ### default() [#default] ```ts function default(client): { addItemsToPublicFileSystem: Promise; addItemsToSubmission: Promise; copyItemsToPath: Promise<{ count: number; }>; copyPublicItemsAtPath: Promise<{ count: number; }>; copySubmissionItems: Promise<{ count: number; }>; createAssets: Promise; createFolder: Promise; createLogo: Promise; createProject: Promise; createProjectPublicAssetChatMessage: Promise; createProjectPublicChatMessage: Promise; createProjectPublicTopicChatMessage: Promise; createPublicFileSystem: Promise; createPublicFolder: Promise; createSubmission: Promise; createSubmissionFolder: Promise; deleteItemsAtPath: Promise<{ count: number; }>; deleteProject: Promise; deletePublicFileSystem: Promise; deletePublicItemsAtPath: Promise<{ count: number; }>; deleteSubmissionItems: Promise<{ count: number; }>; getAssets: Promise>; getFolders: Promise>; getHighlightedMessages: Promise>; getHomeFeed: Promise>; getItemsAtPath: Promise>; getProject: Promise; getProjectChat: Promise; getProjectPublicAsset: Promise; getProjectPublicChat: Promise; getProjectPublicChatMessages: Promise; getProjects: Promise; getPublicAudit: Promise>; getPublicFileSystem: Promise; getPublicFileSystems: Promise>; getPublicItemsAtPath: Promise>; getSubmission: Promise; getSubmissionItems: Promise>; getSubmissions: Promise>; getTopAccessActivity: Promise; moveItemsToPath: Promise; movePublicItemsAtPath: Promise<{ count: number; }>; moveSubmissionItems: Promise<{ count: number; }>; previewDeleteItemsAtPath: Promise; publishItems: Promise; releasePublicFileSystem: Promise; releaseSubmission: Promise; releaseSubmissionUpdate: Promise; searchProject: Promise; tagSubmission: Promise; unpublishItems: Promise; untagSubmission: Promise; updateLogo: Promise; updateProject: Promise; updatePublicFileSystem: Promise; updateSetting: Promise; updateSubmission: Promise; }; ``` #### Parameters [#parameters] | Parameter | Type | | --------- | ----------------------------------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | #### Returns [#returns] | Name | Type | Description | | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `addItemsToPublicFileSystem()` | ( `projectId`, `publicId`, `addItemsData` ) => `Promise`\<[`PublicFileSystemResponse`](#publicfilesystemresponse)> | Adds additional items to an existing public file system. | | `addItemsToSubmission()` | ( `projectId`, `submissionId`, `addItemsData` ) => `Promise`\<`ChatSubmission`> | Adds items to an existing submission. | | `copyItemsToPath()` | ( `projectId`, `visibility`, `copyData` ) => `Promise`\<\{ `count`: `number`; }> | Copies items to a specific path within a project. | | `copyPublicItemsAtPath()` | ( `projectId`, `token`, `copyData` ) => `Promise`\<\{ `count`: `number`; }> | Copies items within a public file system (authenticated management). | | `copySubmissionItems()` | ( `projectId`, `submissionId`, `copyData` ) => `Promise`\<\{ `count`: `number`; }> | Copies items within a submission. | | `createAssets()` | (`projectId`, `fileUploadBody`) => `Promise`\<`any`\[]> | Create assets within a project and return their signed links for upload. | | `createFolder()` | ( `projectId`, `visibility`, `folderData` ) => `Promise`\<`Folder`> | Creates a folder within a project with file system integration. | | `createLogo()` | (`projectId`, `logoData`) => `Promise`\<`any`> | Creates a new logo asset for a project. | | `createProject()` | (`projectData`) => `Promise`\<`Project`> | Creates a new project. | | `createProjectPublicAssetChatMessage()` | ( `projectId`, `token`, `assetId`, `data` ) => `Promise`\<`CreatePublicAssetChatMessageResponse`> | Creates a message on an asset's public chat from an authenticated project context. Creates the chat lazily if it doesn't exist yet. Unlike the public endpoint, this does NOT check token expiration. | | `createProjectPublicChatMessage()` | ( `projectId`, `token`, `chatId`, `data` ) => `Promise`\<`ChatMessage`> | Creates a message in an existing public chat from an authenticated project context. Unlike the public endpoint, this does NOT check token expiration. | | `createProjectPublicTopicChatMessage()` | ( `projectId`, `token`, `data` ) => `Promise`\<`CreatePublicAssetChatMessageResponse`> | Creates a message on the main public topic chat from an authenticated project context. Creates the chat lazily if it doesn't exist yet. Unlike the public endpoint, this does NOT check token expiration. | | `createPublicFileSystem()` | (`projectId`, `publicFileSystemData`) => `Promise`\<[`PublicFileSystemResponse`](#publicfilesystemresponse)> | Creates a public file system with a secure token for sharing project assets publicly. | | `createPublicFolder()` | ( `projectId`, `token`, `folderData` ) => `Promise`\<`Folder`> | Creates a folder inside a public file system (authenticated management). | | `createSubmission()` | (`projectId`, `submissionData`) => `Promise`\<`ChatSubmission`> | Creates a new submission for a project. | | `createSubmissionFolder()` | ( `projectId`, `submissionId`, `folderData` ) => `Promise`\<`Folder`> | Creates a folder within a submission. | | `deleteItemsAtPath()` | ( `projectId`, `visibility`, `deleteData` ) => `Promise`\<\{ `count`: `number`; }> | Deletes items at a specific path within a project. | | `deleteProject()` | (`projectId`) => `Promise`\<`void`> | Deletes a project (marks for deletion). | | `deletePublicFileSystem()` | (`projectId`, `publicId`) => `Promise`\<[`PublicFileSystemResponse`](#publicfilesystemresponse)> | Deletes a public file system and invalidates its access token. | | `deletePublicItemsAtPath()` | ( `projectId`, `token`, `deleteData` ) => `Promise`\<\{ `count`: `number`; }> | Deletes items from a public file system (authenticated management). | | `deleteSubmissionItems()` | ( `projectId`, `submissionId`, `deleteData` ) => `Promise`\<\{ `count`: `number`; }> | Deletes items within a submission. | | `getAssets()` | ( `projectId`, `visibility`, `params?` ) => `Promise`\<[`PaginatedResponse`](#paginatedresponse)\<`Asset`>> | Lists a project's assets for one visibility tier. `creator` requires `canGetCreatorAssets`; `reviewer` requires `canGetReviewerAssets`. **Throws** 'projectId is required.' or 'visibility is required.'. | | `getFolders()` | ( `projectId`, `visibility`, `params?` ) => `Promise`\<[`PaginatedResponse`](#paginatedresponse)\<`Folder`>> | Gets folders within a project with specified visibility. | | `getHighlightedMessages()` | ( `projectId`, `visibility`, `params?` ) => `Promise`\<[`PaginatedResponse`](#paginatedresponse)\<`ChatMessage`>> | Lists highlighted chat messages across a project for one visibility tier (cursor pagination only). `creator` requires `canGetCreatorHighlights`; `reviewer` requires `canGetReviewerHighlights`. **Throws** 'projectId is required.' or 'visibility is required.'. | | `getHomeFeed()` | ( `projectId`, `visibility`, `params?` ) => `Promise`\<[`PaginatedResponse`](#paginatedresponse)\<`Asset`>> | Gets the home feed for a project with a specified visibility. | | `getItemsAtPath()` | ( `projectId`, `visibility`, `path?`, `params?`, `usePost?` ) => `Promise`\<[`PaginatedResponse`](#paginatedresponse)\<`any`>> | Gets items at a specific path within a project. | | `getProject()` | (`projectId`) => `Promise`\<`Project`> | Retrieves a specific project by its ID. | | `getProjectChat()` | ( `projectId`, `visibility`, `params?` ) => `Promise`\<`Chat`> | Gets the project chat with the specified visibility. | | `getProjectPublicAsset()` | ( `projectId`, `token`, `assetId` ) => `Promise`\<`PublicAssetResponse`> | Gets a public asset with its public chat from an authenticated project context. Unlike the public endpoint, this does NOT check token expiration. Use this for internal management of public file systems. | | `getProjectPublicChat()` | (`projectId`, `token`) => `Promise`\<`any`> | Gets a public chat from an authenticated project context. Unlike the public endpoint, this does NOT check token expiration. Use this for internal management of public file systems. | | `getProjectPublicChatMessages()` | ( `projectId`, `token`, `chatId`, `params?` ) => `Promise`\<`PublicChatMessagesResponse`> | Gets messages from a public chat from an authenticated project context. Unlike the public endpoint, this does NOT check token expiration. Use this for internal management of public file systems. | | `getProjects()` | () => `Promise`\<`Project`\[]> | Retrieves projects accessible by the user. NOTE: API endpoint `/v1/projects` does not currently support pagination. | | `getPublicAudit()` | (`projectId`, `params?`) => `Promise`\<[`PaginatedResponse`](#paginatedresponse)\<[`PublicAuditAssetResponse`](#publicauditassetresponse)>> | Get the public audit for a project — assets that are or have been publicly exposed. **Requires** `projectAdmin` or `projectOwner` on the project (or workspace-tier admin via inheritance). | | `getPublicFileSystem()` | (`projectId`, `publicId`) => `Promise`\<[`PublicFileSystemResponse`](#publicfilesystemresponse)> | Retrieves a specific public file system by its ID. | | `getPublicFileSystems()` | (`projectId`, `params?`) => `Promise`\<[`PaginatedResponse`](#paginatedresponse)\<[`PublicFileSystemResponse`](#publicfilesystemresponse)>> | Gets all public file systems for a project. | | `getPublicItemsAtPath()` | ( `projectId`, `token`, `path?`, `params?` ) => `Promise`\<[`PaginatedResponse`](#paginatedresponse)\<`any`>> | Gets items from a public file system at a specific path (authenticated management). | | `getSubmission()` | ( `projectId`, `submissionId`, `params?` ) => `Promise`\<`ChatSubmission`> | Retrieves a specific submission by its ID. | | `getSubmissionItems()` | ( `projectId`, `submissionId`, `path?`, `params?` ) => `Promise`\<[`PaginatedResponse`](#paginatedresponse)\<`any`>> | Gets files for a specific submission. | | `getSubmissions()` | (`projectId`, `params?`) => `Promise`\<[`PaginatedResponse`](#paginatedresponse)\<`ChatSubmission`>> | Retrieves submissions for a project. | | `getTopAccessActivity()` | (`projectId`, `params?`) => `Promise`\<[`ProjectTopAccessActivityResponse`](#projecttopaccessactivityresponse)> | Top-N assets in a project by access-activity event type (plays, downloads, embeds). Requires project read access. Returns asset IDs and counts only; hydrate names and thumbnails through the normal asset fetch path. **Throws** 'projectId is required.' when `projectId` is falsy. | | `moveItemsToPath()` | ( `projectId`, `visibility`, `moveData` ) => `Promise`\<[`MoveItemsResult`](#moveitemsresult)> | Moves items to a specific path within a project. | | `movePublicItemsAtPath()` | ( `projectId`, `token`, `moveData` ) => `Promise`\<\{ `count`: `number`; }> | Moves items within a public file system (authenticated management). | | `moveSubmissionItems()` | ( `projectId`, `submissionId`, `moveData` ) => `Promise`\<\{ `count`: `number`; }> | Moves items within a submission. | | `previewDeleteItemsAtPath()` | ( `projectId`, `visibility`, `deleteData` ) => `Promise`\<`DeleteImpact`> | Asks what deleting these paths would reach, without deleting anything. Computed from the same cascade the delete runs, so the answer is what will happen rather than an estimate of it. Only SECONDARY references come back — the reviewer, submission and public-release copies that would go with the selection. | | `publishItems()` | (`projectId`, `publishData`) => `Promise`\<`any`> | Publishes a list of items (assets, folders) within a project. | | `releasePublicFileSystem()` | (`projectId`, `publicId`) => `Promise`\<[`PublicFileSystemResponse`](#publicfilesystemresponse)> | Releases a staged (unreleased) public file system, making it externally accessible via its public token. | | `releaseSubmission()` | (`projectId`, `submissionId`) => `Promise`\<`ChatSubmission`> | Releases a staged (unreleased) submission, making it visible to reviewers and firing the deferred "new submission" side effects (emails, notifications, system messages). | | `releaseSubmissionUpdate()` | (`projectId`, `submissionId`) => `Promise`\<`ChatSubmission`> | Re-releases an already-released submission's side effects (the "Release Update" action) — re-notifies reviewers with the submission-update email template + `submissionUpdate` notification. Does not change status. | | `searchProject()` | (`projectId`, `params`) => `Promise`\<`SearchResponse`> | Full-text search across assets, chat messages, and tasks within a project. Results are populated per the content type's native list view (asset → creator/publisher/tags; chatMessage → author/mentions/attachments; task → creator/assignee/project/origin). | | `tagSubmission()` | ( `projectId`, `submissionId`, `tagData` ) => `Promise`\<`ChatSubmission`> | Adds a tag to a submission. | | `unpublishItems()` | (`projectId`, `unpublishData`) => `Promise`\<`any`> | Unpublishes a list of items (assets, folders) within a project. | | `untagSubmission()` | ( `projectId`, `submissionId`, `tagData` ) => `Promise`\<`ChatSubmission`> | Removes a tag from a submission. | | `updateLogo()` | (`projectId`, `logoData`) => `Promise`\<`any`> | Updates the logo asset for a project. | | `updateProject()` | (`projectId`, `updateData`) => `Promise`\<`Project`> | Updates a project. | | `updatePublicFileSystem()` | ( `projectId`, `publicId`, `updateData` ) => `Promise`\<[`PublicFileSystemResponse`](#publicfilesystemresponse)> | Updates an existing public file system's title and description. | | `updateSetting()` | ( `projectId`, `name`, `value` ) => `Promise`\<`Project`> | Updates a single project setting (e.g. `aiPolishEnabled`, `aiCustomPreprompt`). Pass `null` to inherit the workspace's value; pass a typed value to override. The valid setting names are validated server-side against `projectService.validProjectSettings`. | | `updateSubmission()` | ( `projectId`, `submissionId`, `updateData` ) => `Promise`\<`ChatSubmission`> | Updates a submission. | # public (/docs/reference/sdk/routes/public) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### DownloadPublicAssetsData [#downloadpublicassetsdata] Request body for downloading public assets #### Properties [#properties] | Property | Type | | ------------------------------ | ----------- | | `assetIds` | `string`\[] | *** ### PaginationParams [#paginationparams] Base pagination parameters #### Extended by [#extended-by] * [`PublicPaginationParams`](#publicpaginationparams) #### Properties [#properties-1] | Property | Type | | ------------------------------------------------------- | -------------------------------- | | `cursor?` | `string` | | `includeCounts?` | `boolean` | | `includeCursorRecord?` | `boolean` | | `includeStartAtRecord?` | `boolean` | | `limit?` | `number` | | `page?` | `number` | | `paginate?` | `"cursor"` \| `"index"` | | `paginateReverse?` | `boolean` | | `sort?` | `Record`\<`string`, `-1` \| `1`> | | `startAt?` | `string` | *** ### PublicFileSystemDetailsResponse [#publicfilesystemdetailsresponse] Response type for a single public file system #### Properties [#properties-2] | Property | Type | Description | | ----------------------------------------------------------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | `allowAnonymousComments?` | `boolean` | Whether unauthenticated visitors may comment on this release by supplying a display name (no account). Drives the anonymous compose flow in the UI. | | `createdAt` | `string` | - | | `description?` | `string` | - | | `expiresAt` | `string` | - | | `id` | `string` | - | | `itemPaths` | `string`\[] | - | | `projectId` | `string` | - | | `title` | `string` | - | | `token` | `string` | - | | `updatedAt` | `string` | - | *** ### PublicPaginationParams [#publicpaginationparams] Pagination parameters specific to public routes #### Extends [#extends] * [`PaginationParams`](#paginationparams) #### Properties [#properties-3] | Property | Type | Inherited from | | --------------------------------------------------------- | ------------------------------------------------------------------ | --------------------------------------------------------------------------------------- | | `creatorId?` | `string` | - | | `cursor?` | `string` | [`PaginationParams`](#paginationparams).[`cursor`](#cursor) | | `includeCounts?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCounts`](#includecounts) | | `includeCursorRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeCursorRecord`](#includecursorrecord) | | `includeStartAtRecord?` | `boolean` | [`PaginationParams`](#paginationparams).[`includeStartAtRecord`](#includestartatrecord) | | `limit?` | `number` | [`PaginationParams`](#paginationparams).[`limit`](#limit) | | `mediaTypes?` | (`"folder"` \| `"image"` \| `"video"` \| `"audio"` \| `"file"`)\[] | - | | `nameSearch?` | `string` | - | | `page?` | `number` | [`PaginationParams`](#paginationparams).[`page`](#page) | | `paginate?` | `"cursor"` \| `"index"` | [`PaginationParams`](#paginationparams).[`paginate`](#paginate) | | `paginateReverse?` | `boolean` | [`PaginationParams`](#paginationparams).[`paginateReverse`](#paginatereverse) | | `recursiveSearch?` | `boolean` | - | | `resourceIds?` | `string`\[] | - | | `resourceSlugs?` | `string`\[] | - | | `resourceStatus?` | `"active"` \| `"pendingDelete"` | - | | `resourceTags?` | `string`\[] | - | | `resourceType?` | `"asset"` \| `"folder"` | - | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`PaginationParams`](#paginationparams).[`sort`](#sort) | | `startAt?` | `string` | [`PaginationParams`](#paginationparams).[`startAt`](#startat) | ## Type Aliases [#type-aliases] ### PublicFileSystemResponse [#publicfilesystemresponse] ```ts type PublicFileSystemResponse = CursorPaginatedResult & { results?: FileSystem[]; }; ``` Response type for paginated public file system items #### Type Declaration [#type-declaration] | Name | Type | | ---------- | --------------- | | `results?` | `FileSystem`\[] | ## Functions [#functions] ### default() [#default] ```ts function default(client): { createPublicAssetChatMessage: Promise; createPublicChatMessage: Promise; createPublicTopicChatMessage: Promise; downloadAssets: Promise; getPublicAsset: Promise; getPublicChat: Promise; getPublicChatMessages: Promise; getPublicDownloadUrl: Promise; getPublicEmbedFiles: Promise; getPublicFileSystem: Promise; getPublicItems: Promise; getPublicItemsAtPath: Promise; recordAccessActivity: Promise; resolvePublicDownload: Promise; }; ``` Defines public route methods for unauthenticated access to public file systems. #### Parameters [#parameters] | Parameter | Type | | --------- | ----------------------------------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | #### Returns [#returns] | Name | Type | Description | | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `createPublicAssetChatMessage()` | ( `token`, `assetId`, `data` ) => `Promise`\<`CreatePublicAssetChatMessageResponse`> | Creates a message on an asset's public chat. If no public chat exists for this asset in this public file system, one is created (lazy creation). Requires authentication. **Example** `// This creates the chat if it doesn't exist and posts the first message const { chat, message } = await nuramaClient.public.createPublicAssetChatMessage('abc123def4', 'asset-id', { content: 'First comment on this asset!', });` | | `createPublicChatMessage()` | ( `token`, `chatId`, `data` ) => `Promise`\<`ChatMessage`> | Creates a message in an existing public chat. Requires authentication. **Example** `const message = await nuramaClient.public.createPublicChatMessage('abc123def4', 'chat-id', { content: 'Hello world!', });` | | `createPublicTopicChatMessage()` | (`token`, `data`) => `Promise`\<`CreatePublicAssetChatMessageResponse`> | Creates a message on the main public topic chat. If no main chat exists for this public file system, one is created (lazy creation). Requires authentication. **Example** `// This creates the main chat if it doesn't exist and posts the first message const { chat, message } = await nuramaClient.public.createPublicTopicChatMessage('abc123def4', { content: 'First comment on this public file system!', });` | | `downloadAssets()` | (`token`, `downloadData`) => `Promise`\<`DownloadSignedUrlData`\[]> | Downloads public assets by generating signed URLs for the original files. This endpoint does not require authentication - access is controlled by the token. **Example** `const downloadUrls = await nuramaClient.public.downloadAssets('abc123def4', { assetIds: ['507f1f77bcf86cd799439011', '507f191e810c19729de860ea'] });` | | `getPublicAsset()` | (`token`, `assetId`) => `Promise`\<`PublicAssetResponse`> | Gets an asset with its public chat in the context of a public file system. This endpoint does not require authentication for read access. **Example** `const asset = await nuramaClient.public.getPublicAsset('abc123def4', 'asset-id'); if (asset.chats.public) { console.log('Asset has public chat:', asset.chats.public.id); }` | | `getPublicChat()` | (`token`, `chatId?`) => `Promise`\<`Chat` \| `null`> | Gets the main public file system chat or a specific chat by ID. This endpoint does not require authentication for read access. **Example** `// Get main public file system chat const mainChat = await nuramaClient.public.getPublicChat('abc123def4'); // Get specific chat by ID const chat = await nuramaClient.public.getPublicChat('abc123def4', 'chat-id-here');` | | `getPublicChatMessages()` | ( `token`, `chatId`, `params?` ) => `Promise`\<`PublicChatMessagesResponse`> | Gets paginated messages for a public chat. This endpoint does not require authentication for read access. **Example** `const messages = await nuramaClient.public.getPublicChatMessages('abc123def4', 'chat-id', { limit: 20, paginateReverse: false, });` | | `getPublicDownloadUrl()` | (`token`) => `Promise`\<[`PublicDownloadUrlResponse`](/docs/reference/sdk/routes/shortlink#publicdownloadurlresponse)> | Get a short-lived signed download URL for a public asset-link token. Public endpoint; fails with 403 for embed-only links. **Throws** 'token is required.' when `token` is falsy. | | `getPublicEmbedFiles()` | (`token`) => `Promise`\<[`PublicEmbedFilesResponse`](/docs/reference/sdk/routes/shortlink#publicembedfilesresponse)> | Get the HLS stream and fallback media key paths for the embeddable player. Public endpoint; fails with 403 for download-only links. **Throws** 'token is required.' when `token` is falsy. | | `getPublicFileSystem()` | (`token`) => `Promise`\<[`PublicFileSystemDetailsResponse`](#publicfilesystemdetailsresponse)> | Gets public file system details by token. This endpoint does not require authentication - access is controlled by the token. **Example** `const publicFileSystem = await nuramaClient.public.getPublicFileSystem('abc123def4');` | | `getPublicItems()` | (`token`, `params?`) => `Promise`\<[`PublicFileSystemResponse`](#publicfilesystemresponse)> | Gets public items at the root level of a public file system. This endpoint does not require authentication - access is controlled by the token. **Example** `const publicItems = await nuramaClient.public.getPublicItems('abc123def4');` | | `getPublicItemsAtPath()` | ( `token`, `path`, `params?` ) => `Promise`\<[`PublicFileSystemResponse`](#publicfilesystemresponse)> | Gets public items at a specific path within a public file system. This endpoint does not require authentication - access is controlled by the token. **Example** `const items = await nuramaClient.public.getPublicItemsAtPath('abc123def4', 'folder1/subfolder');` | | `recordAccessActivity()` | (`token`, `body`) => `Promise`\<`void`> | Record a play event from the embed player for a public asset link. Public endpoint; no authentication. The API responds 204. **Throws** 'token is required.' when `token` is falsy. | | `resolvePublicDownload()` | (`token`) => `Promise`\<[`ResolvePublicDownloadResponse`](/docs/reference/sdk/routes/shortlink#resolvepublicdownloadresponse)> | Resolve a public asset-link token to the minimal file info the download page shows. Public endpoint; no authentication. **Throws** 'token is required.' when `token` is falsy. | # scratch (/docs/reference/sdk/routes/scratch) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### CompleteUploadBody [#completeuploadbody] #### Properties [#properties] | Property | Type | | ------------------------------ | ------------------------------------------------- | | `parts` | \{ `ETag`: `string`; `PartNumber`: `number`; }\[] | | `uploadId` | `string` | *** ### CompleteUploadResponse [#completeuploadresponse] #### Properties [#properties-1] | Property | Type | | -------------------- | ------------------ | | `id` | `string` | | `url` | `string` \| `null` | *** ### PromoteBody [#promotebody] #### Properties [#properties-2] | Property | Type | Description | | ------------------------------- | -------- | --------------------------------------------------------------------------- | | `fileName?` | `string` | Optional rename — lands on `Asset.name`. Defaults to a row-id-derived name. | *** ### PromoteResponse [#promoteresponse] #### Properties [#properties-3] | Property | Type | Description | | -------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `alreadyPromoted` | `boolean` | `true` when the scratch upload was already promoted on a prior call (e.g. the same revision was attached to a chat message earlier, which promoted it at send time). The returned `asset` is the existing one. Callers should treat this as a no-op for "newly added" UX (toast copy, list-refresh side effects) while still surfacing the asset. | | `asset` | `unknown` | - | ## Functions [#functions] ### default() [#default] ```ts function default(client): { completeUpload: Promise; promote: Promise; }; ``` Scratch — platform-wide temporary storage with an explicit lifecycle. There is NO public surface for creating scratch uploads or minting upload URLs. Parent features (e.g. AI Revision) initiate the multipart upload server-side and return the `{ scratchId, uploadId, key, urls[] }` bundle in their own response payload. The caller uploads each part directly against its signed URL (same pattern as asset uploads), then calls `completeUpload` here to finalise. `completeUpload` mirrors `nuramaClient.asset.completeUpload`: the body is the same `{ uploadId, parts }` shape. For scratch uploads the server additionally counts the finished object's size against workspace storage usage and records the upload in the audit log. #### Parameters [#parameters] | Parameter | Type | | --------- | ----------------------------------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | #### Returns [#returns] | Name | Type | Description | | ------------------ | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `completeUpload()` | (`scratchId`, `data`) => `Promise`\<[`CompleteUploadResponse`](#completeuploadresponse)> | Finish a multipart upload for a scratch upload. Same `{ uploadId, parts }` body the asset complete-upload route accepts. The server finalises the object in storage, counts its size against workspace storage usage, records the audit entry, and moves the scratch status from pendingUpload to active. Creator-only. | | `promote()` | (`scratchId`, `data?`) => `Promise`\<[`PromoteResponse`](#promoteresponse)> | Promote a scratch upload to a real Asset. Creator-only — only the user who created the scratch upload can call this. Destination is derived server-side from the scratch upload itself: - it has a `projectId` → asset created in that project - it has only a workspace → asset created at the workspace The destination cannot be overridden in the body: a scratch upload always lands in the workspace / project it was created for. The only optional input is `fileName` to override the asset's user-facing name. | # settings (/docs/reference/sdk/routes/settings) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### EffectiveSettings [#effectivesettings] #### Properties [#properties] | Property | Type | | ---------------------------------------------------- | -------------------------- | | `emailNotifications` | `Record`\<`string`, `any`> | | `sounds` | `Record`\<`string`, `any`> | | `systemNotifications` | `Record`\<`string`, `any`> | *** ### ResourceSettings [#resourcesettings] #### Properties [#properties-1] | Property | Type | | ------------------------------------------------------- | ---------------------------- | | `emailNotifications?` | `Record`\<`string`, `any`> | | `resourceId` | `string` | | `resourceType` | `"project"` \| `"workspace"` | | `sounds?` | `Record`\<`string`, `any`> | | `systemNotifications?` | `Record`\<`string`, `any`> | *** ### ResourceSettingsOverrides [#resourcesettingsoverrides] #### Properties [#properties-2] | Property | Type | | ------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `emailNotifications?` | \{ `dailySummary?`: `boolean` \| `null`; `newFollowing?`: `boolean` \| `null`; `newFollowingActiveInterval?`: `number` \| `null`; `newMention?`: `boolean` \| `null`; `newMentionActiveInterval?`: `number` \| `null`; `publishedAsset?`: `boolean` \| `null`; `sendEmailNotifications?`: `boolean` \| `null`; } | | `emailNotifications.dailySummary?` | `boolean` \| `null` | | `emailNotifications.newFollowing?` | `boolean` \| `null` | | `emailNotifications.newFollowingActiveInterval?` | `number` \| `null` | | `emailNotifications.newMention?` | `boolean` \| `null` | | `emailNotifications.newMentionActiveInterval?` | `number` \| `null` | | `emailNotifications.publishedAsset?` | `boolean` \| `null` | | `emailNotifications.sendEmailNotifications?` | `boolean` \| `null` | | `sounds?` | \{ `alerts?`: `boolean` \| `null`; `mentions?`: `boolean` \| `null`; `playSounds?`: `boolean` \| `null`; `privateMessages?`: `boolean` \| `null`; } | | `sounds.alerts?` | `boolean` \| `null` | | `sounds.mentions?` | `boolean` \| `null` | | `sounds.playSounds?` | `boolean` \| `null` | | `sounds.privateMessages?` | `boolean` \| `null` | | `systemNotifications?` | \{ `alerts?`: `boolean` \| `null`; `mentions?`: `boolean` \| `null`; `privateMessages?`: `boolean` \| `null`; `showSystemNotifications?`: `boolean` \| `null`; } | | `systemNotifications.alerts?` | `boolean` \| `null` | | `systemNotifications.mentions?` | `boolean` \| `null` | | `systemNotifications.privateMessages?` | `boolean` \| `null` | | `systemNotifications.showSystemNotifications?` | `boolean` \| `null` | ## Functions [#functions] ### default() [#default] ```ts function default(client): { cleanupOrphanedSettings: Promise<{ message: string; removedCount: number; }>; getAllResourceSettings: Promise<{ resourceSettings: ResourceSettings[]; }>; getEffectiveSettings: Promise; getResourceSettings: Promise< | ResourceSettings | { message: string; }>; resetResourceSettings: Promise<{ message: string; }>; updateResourceSettings: Promise<{ message: string; settings: ResourceSettings; }>; }; ``` Defines settings-related methods for the NuramaClient. #### Parameters [#parameters] | Parameter | Type | Description | | --------- | ----------------------------------------------------- | -------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | The NuramaClient instance. | #### Returns [#returns] An object containing the settings-related methods. | Name | Type | Description | | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------- | | `cleanupOrphanedSettings()` | () => `Promise`\<\{ `message`: `string`; `removedCount`: `number`; }> | Cleanup orphaned settings (settings for resources user no longer has access to). Requires authentication. | | `getAllResourceSettings()` | () => `Promise`\<\{ `resourceSettings`: [`ResourceSettings`](#resourcesettings)\[]; }> | Get all resource settings for current user. Requires authentication. | | `getEffectiveSettings()` | ( `resourceType`, `resourceId`, `workspaceId?` ) => `Promise`\<[`EffectiveSettings`](#effectivesettings)> | Get effective (resolved) settings for a resource with full cascade. Requires authentication. | | `getResourceSettings()` | (`resourceType`, `resourceId`) => `Promise`\< \| [`ResourceSettings`](#resourcesettings) \| \{ `message`: `string`; }> | Get raw resource settings (overrides only, not cascaded). Requires authentication. | | `resetResourceSettings()` | (`resourceType`, `resourceId`) => `Promise`\<\{ `message`: `string`; }> | Reset resource settings to inherit from parent/global. Requires authentication. | | `updateResourceSettings()` | ( `resourceType`, `resourceId`, `settings` ) => `Promise`\<\{ `message`: `string`; `settings`: [`ResourceSettings`](#resourcesettings); }> | Update resource-specific settings. Requires authentication. | # shortlink (/docs/reference/sdk/routes/shortlink) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### PublicDownloadUrlResponse [#publicdownloadurlresponse] #### Properties [#properties] | Property | Type | | ------------------------------ | -------- | | `expires` | `number` | | `fileName` | `string` | | `mimeType` | `string` | | `url` | `string` | *** ### PublicEmbedFilesResponse [#publicembedfilesresponse] #### Properties [#properties-1] | Property | Type | Description | | --------------------------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `fileName` | `string` | - | | `mediaKeyPath` | `string` \| `null` | Original media keyPath used as fallback when no HLS manifest is available. | | `mediaType` | `string` | - | | `mode?` | `"embed"` \| `"embed-download"` | Mode of the underlying public link: 'embed' (no download) or 'embed-download' (download allowed alongside embed). 'download' never appears — that mode blocks the embed-files endpoint entirely. Optional for backward compatibility with older API versions; treat absence as 'embed-download'. | | `posterKeyPath` | `string` \| `null` | Poster image keyPath for video assets (explicit poster, falling back to largest thumbnail). Null when none exists. | | `streamKeyPath` | `string` \| `null` | HLS manifest keyPath (e.g. "workspaces/.../stream/index.m3u8"), null if not yet processed. | | `waveformKeyPath?` | `string` \| `null` | Pre-computed waveform peaks JSON keyPath for audio assets. Null for video / when no peaks file exists. | *** ### ResolvePublicDownloadResponse [#resolvepublicdownloadresponse] #### Properties [#properties-2] | Property | Type | Description | | ------------------------------------------- | ----------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `fileName` | `string` | - | | `mediaType` | `string` | - | | `mimeType?` | `string` \| `null` | Mime type of the original media file, when known. | | `mode?` | `"download"` \| `"embed"` \| `"embed-download"` | Capability mode of the link. The download page uses this to decide whether to render the inline preview (`embed-download`), the embed-only message (`embed`), or auto-download (`download`). Optional for backward compatibility with older API versions; treat absence as `embed-download`. | | `previewKeyPath?` | `string` \| `null` | For image assets: the keyPath of the image file, used to render an inline preview on the download page. Null for non-image assets (video / audio previews are iframed from the embed page; files render an icon). | | `status` | `string` | - | | `token` | `string` | - | *** ### ResolveShortLinkResponse [#resolveshortlinkresponse] #### Properties [#properties-3] | Property | Type | | -------------------------------------- | ---------------------------------------------------------------------------------- | | `deepLink` | `string` | | `resourceId` | `string` | | `resourceType` | `"asset"` \| `"project"` \| `"workspace"` \| `"chatMessage"` \| `"chatSubmission"` | | `visibility` | `"creator"` \| `"reviewer"` \| `null` | ## Functions [#functions] ### default() [#default] ```ts function default(client): { resolveShortLink: Promise; }; ``` Defines short link related methods for the NuramaClient. #### Parameters [#parameters] | Parameter | Type | Description | | --------- | ----------------------------------------------------- | -------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | The NuramaClient instance. | #### Returns [#returns] An object containing the short link related methods. | Name | Type | Description | | -------------------- | ------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | | `resolveShortLink()` | (`code`) => `Promise`\<[`ResolveShortLinkResponse`](#resolveshortlinkresponse)> | Resolves a short link code to its full deep link path. This endpoint is publicly accessible and does not require authentication. | # socket (/docs/reference/sdk/routes/socket) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### BaseNotificationEvent [#basenotificationevent] #### Properties [#properties] | Property | Type | | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `changes?` | \{ `create?`: \{ `resource`: `any`; `resourceId`: `string`; `resourceType`: `string`; }\[]; `delete?`: \{ `resourceId`: `string`; `resourceType`: `string`; }\[]; `update?`: \{ `newResource?`: `any`; `oldResource?`: `any`; `resource`: `any`; `resourceId`: `string`; `resourceType`: `string`; }\[]; } | | `changes.create?` | \{ `resource`: `any`; `resourceId`: `string`; `resourceType`: `string`; }\[] | | `changes.delete?` | \{ `resourceId`: `string`; `resourceType`: `string`; }\[] | | `changes.update?` | \{ `newResource?`: `any`; `oldResource?`: `any`; `resource`: `any`; `resourceId`: `string`; `resourceType`: `string`; }\[] | | `channels` | `string`\[] | | `createdAt` | `string` | | `initiator` | `any` | | `initiatorId` | `string` \| `null` | | `initiatorType` | `"user"` \| `"system"` | | `resourceId` | `string` | | `resourceType` | `string` | | `tokens?` | `Record`\<`string`, `any`> | | `type` | `string` | *** ### PublicSocketOptions [#publicsocketoptions] #### Properties [#properties-1] | Property | Type | Description | | ----------------------------------------- | --------- | -------------------------------------------------------------------------------------------------------------- | | `autoReconnect?` | `boolean` | Automatically reconnect if connection is lost **Default** `true` | | `debug?` | `boolean` | Debug logging **Default** `false` | | `websocketURL?` | `string` | Override the WebSocket URL for this specific connection Takes precedence over the client's websocketURL option | *** ### SocketChannel [#socketchannel] #### Properties [#properties-2] | Property | Type | Description | | -------------------------------- | ------------------------------------------------ | ------------------ | | `channel` | `string` | Channel path | | `listeners` | `Record`\<`string`, `Set`\<(`event`) => `void`>> | Event listeners | | `socket` | [`SocketInterface`](#socketinterface) | Socket.IO instance | *** ### SocketInterface [#socketinterface] #### Properties [#properties-3] | Property | Type | | ---------------------------------- | ------------------------------------------------------ | | `connected` | `boolean` | | `disconnect` | () => `void` | | `emit` | (`event`, ...`args`) => `void` | | `off` | (`event`) => `void` | | `on` | (`event`, `listener`) => `void` | | `timeout` | (`ms`) => \{ `emit`: (`event`, ...`args`) => `void`; } | *** ### SocketOptions [#socketoptions] #### Properties [#properties-4] | Property | Type | Description | | ------------------------------------------------------------------- | --------- | -------------------------------------------------------------------------------------------------------------- | | `autoReconnect?` | `boolean` | Automatically reconnect if connection is lost **Default** `true` | | `autoReconnectOnTokenExpiry?` | `boolean` | Automatically attempt to reconnect if token expires **Default** `true` | | `autoRefresh?` | `boolean` | Automatically handle token refresh **Default** `true` | | `debug?` | `boolean` | Debug logging **Default** `false` | | `websocketURL?` | `string` | Override the WebSocket URL for this specific connection Takes precedence over the client's websocketURL option | ## Type Aliases [#type-aliases] ### SocketMethods [#socketmethods] ```ts type SocketMethods = ReturnType; ``` ## Functions [#functions] ### default() [#default] ```ts function default(client): { connect: (channel, options) => Promise; connectPublic: (publicToken, options) => Promise; disconnect: (channel) => Promise; disconnectAll: () => Promise; emit: (channel, event, data?) => void; emitWithAck: (channel, event, data, timeoutMs) => Promise; isConnected: (channel) => boolean; onReconnect: (channel, callback) => void; onReconnectFailed: (channel, callback) => void; subscribe: (channel, event, callback) => Promise; subscribePublic: (publicToken, event, callback) => Promise; unsubscribe: (channel, event, callback?) => void; }; ``` #### Parameters [#parameters] | Parameter | Type | | --------- | ----------------------------------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | #### Returns [#returns] | Name | Type | Description | | --------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `connect()` | (`channel`, `options`) => `Promise`\<[`SocketChannel`](#socketchannel)> | Connect to a socket channel | | `connectPublic()` | (`publicToken`, `options`) => `Promise`\<[`SocketChannel`](#socketchannel)> | Connect to a public socket channel without authentication | | `disconnect()` | (`channel`) => `Promise`\<`void`> | Disconnect from a socket channel | | `disconnectAll()` | () => `Promise`\<`void`> | Disconnect from all channels | | `emit()` | (`channel`, `event`, `data?`) => `void` | Emit an event to a connected channel | | `emitWithAck()` | (`channel`, `event`, `data`, `timeoutMs`) => `Promise`\<`boolean`> | Emit an event with a timeout-bounded server acknowledgement. Resolves `true` if the server acks within `timeoutMs`, `false` on timeout or transport error. Use it to actively verify a channel's liveness when `socket.connected` may be stale — most notably after a backgrounded tab returns to focus, where the flag can remain `true` for up to socket.io's own heartbeat window (\~25–45s) even after the underlying TCP transport has died. Relies on socket.io v4's `socket.timeout(ms).emit(ev, data, cb)` pattern: the server acknowledges the event via its trailing callback; if no ack arrives within `timeoutMs` the callback receives an Error. | | `isConnected()` | (`channel`) => `boolean` | Check if connected to a channel | | `onReconnect()` | (`channel`, `callback`) => `void` | Register a callback for when the channel reconnects — a socket.io transport-level reconnect, or the token-refresh reconnect. Use it to recover any gap of server->client messages missed while the connection was down; socket.io does not replay those. Dispatched from the 'reconnect' handler in connect() and from the token-refresh path. | | `onReconnectFailed()` | (`channel`, `callback`) => `void` | Register a callback for when Socket.IO exhausts all reconnection attempts | | `subscribe()` | \<`T`>(`channel`, `event`, `callback`) => `Promise`\<`void`> | Subscribe to an event on a channel | | `subscribePublic()` | \<`T`>(`publicToken`, `event`, `callback`) => `Promise`\<`void`> | Subscribe to an event on a public channel Automatically connects to the public channel if not already connected | | `unsubscribe()` | (`channel`, `event`, `callback?`) => `void` | Stop listening for an event on a channel. If `callback` is provided, only that specific listener is removed; otherwise every listener for that event is cleared. | # storage (/docs/reference/sdk/routes/storage) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### ChartDataEntry [#chartdataentry] #### Properties [#properties] | Property | Type | | -------------------------------------------------- | -------- | | `averageSizeInBytes` | `number` | | `period` | `string` | *** ### GetStorageChartParams [#getstoragechartparams] #### Properties [#properties-1] | Property | Type | | ------------------------------------------------- | -------------------------------------------- | | `aggregationPeriod?` | `"month"` \| `"year"` \| `"day"` \| `"week"` | | `endDate?` | `number` | | `startDate?` | `number` | *** ### StorageRecord [#storagerecord] #### Properties [#properties-2] | Property | Type | | -------------------------------------- | --------------------------------- | | `id` | `string` | | `resourceId` | `string` | | `resourceType` | [`ResourceType`](#resourcetype-1) | | `sizeInBytes` | `number` | ## Type Aliases [#type-aliases] ### ChartDataResponse [#chartdataresponse] ```ts type ChartDataResponse = ChartDataEntry[]; ``` *** ### ResourceType [#resourcetype] ```ts type ResourceType = "user" | "workspace" | "project" | "chat" | "asset"; ``` *** ### StorageMethods [#storagemethods] ```ts type StorageMethods = ReturnType; ``` ## Functions [#functions] ### default() [#default] ```ts function default(client): { getStorageChart: Promise; getStorageRecord: Promise; }; ``` Defines storage-related methods for the NuramaClient. #### Parameters [#parameters] | Parameter | Type | Description | | --------- | ----------------------------------------------------- | -------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | The NuramaClient instance. | #### Returns [#returns] An object containing the storage-related methods. | Name | Type | Description | | -------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | | `getStorageChart()` | ( `resourceType`, `resourceId`, `params?` ) => `Promise`\<[`ChartDataResponse`](#chartdataresponse)> | Retrieves storage usage chart data for a specific resource. Requires authentication and permission. | | `getStorageRecord()` | (`resourceType`, `resourceId`) => `Promise`\<[`StorageRecord`](#storagerecord)> | Retrieves the latest storage record for a specific resource. Requires authentication and permission. | # subscription (/docs/reference/sdk/routes/subscription) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### CreateWorkspaceOrderParams [#createworkspaceorderparams] #### Properties [#properties] | Property | Type | Description | | ----------------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `amountInMinor?` | `number` | Customer-chosen purchase amount in the subscription's currency MINOR unit (pence for GBP, cents for USD, yen for JPY, etc.). Required for variable-amount products (currently only the AI add-on, `productType: 'enableAi'`). Server enforces a per-currency minimum. | | `productId` | `string` | - | | `quantity` | `number` | - | *** ### GetSubscriptionOrdersParams [#getsubscriptionordersparams] #### Properties [#properties-1] | Property | Type | | --------------------------- | -------- | | `limit?` | `number` | | `page?` | `number` | | `sortBy?` | `string` | *** ### GetSubscriptionsParams [#getsubscriptionsparams] #### Extends [#extends] * [`SortParams`](#sortparams) #### Properties [#properties-2] | Property | Type | Inherited from | | --------------------------- | ------------------------------------------- | --------------------------------------------- | | `limit?` | `number` | - | | `page?` | `number` | - | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-1) | | `status?` | [`SubscriptionStatus`](#subscriptionstatus) | - | *** ### ResourceLimits [#resourcelimits] #### Properties [#properties-3] | Property | Type | | ---------------------------------------------------- | -------- | | `totalCredits` | `number` | | `totalSeats` | `number` | | `totalStorageInBytes` | `number` | *** ### RoleSeatUsage [#roleseatusage] #### Properties [#properties-4] | Property | Type | Description | | -------------------------- | ------------------ | ------------------------------------------------------------------------- | | `limit` | `number` \| `null` | Plan cap for this seat type, or `null` when the plan is unlimited for it. | | `used` | `number` | Distinct users occupying this seat type across the workspace + projects. | *** ### RoleUsage [#roleusage] #### Properties [#properties-5] | Property | Type | | -------------------------------- | --------------------------------- | | `creators` | [`RoleSeatUsage`](#roleseatusage) | | `reviewers` | [`RoleSeatUsage`](#roleseatusage) | *** ### SeatUsage [#seatusage] #### Properties [#properties-6] | Property | Type | | ------------------------------------------ | -------- | | `availableSeats` | `number` | | `totalSeats` | `number` | | `usedSeats` | `number` | *** ### SortParams [#sortparams] #### Extended by [#extended-by] * [`GetSubscriptionsParams`](#getsubscriptionsparams) #### Properties [#properties-7] | Property | Type | | ------------------------- | -------------------------------- | | `sort?` | `Record`\<`string`, `-1` \| `1`> | *** ### StorageUsage [#storageusage] #### Properties [#properties-8] | Property | Type | | ------------------------------------------------------------ | -------- | | `availableStorageInBytes` | `number` | | `totalStorageInBytes` | `number` | | `usedStorageInBytes` | `number` | ## Type Aliases [#type-aliases] ### PlanChangeWarning [#planchangewarning] ```ts type PlanChangeWarning = | { capability: string; type: "capabilityRemoved"; } | { currency: string; currentSeats: number; period: "month" | "year"; total: number | null; type: "seatMigration"; unitPrice: number | null; }; ``` Soft warnings returned by a plan swap / dry-run. STRUCTURED (not localized strings) so your app can render localized copy from these values. *** ### SubscriptionStatus [#subscriptionstatus] ```ts type SubscriptionStatus = | "active" | "pending" | "canceled" | "expired" | "pastDue" | "paused" | "paymentFailed" | "unpaid"; ``` ## Functions [#functions] ### default() [#default] ```ts function default(client): { cancelWorkspaceSubscription: Promise; createWorkspaceOrder: Promise; getResourceLimits: Promise; getRoleUsage: Promise; getSeatUsage: Promise; getStorageUsage: Promise; getUserSubscriptions: Promise; getWorkspaceOrders: Promise; getWorkspaceSubscription: Promise; getWorkspaceUsageSummary: Promise<{ billableSeatCount: number; storageUsedInBytes: number; }>; resumeWorkspaceSubscription: Promise; swapWorkspacePlan: Promise<{ subscription: Subscription | null; warnings: PlanChangeWarning[]; }>; }; ``` Defines subscription-related methods for the NuramaClient. #### Parameters [#parameters] | Parameter | Type | Description | | --------- | ----------------------------------------------------- | -------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | The NuramaClient instance. | #### Returns [#returns] An object containing the subscription-related methods. | Name | Type | Description | | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `cancelWorkspaceSubscription()` | (`workspaceId`) => `Promise`\<`any`> | Cancels the subscription for a specific workspace. Requires authentication and permission. | | `createWorkspaceOrder()` | (`workspaceId`, `orderData`) => `Promise`\<`any`> | Creates a subscription order for a specific workspace. Requires authentication and permission. | | `getResourceLimits()` | (`resourceId`) => `Promise`\<[`ResourceLimits`](#resourcelimits)> | Retrieves the resource limits (e.g., storage, seats) for a specific resource (typically workspace). Requires authentication. | | `getRoleUsage()` | (`resourceId`) => `Promise`\<[`RoleUsage`](#roleusage)> | Retrieves per-role (creator / reviewer) seat usage and caps for a workspace. `limit` is `null` when the plan is unlimited for that seat type. Requires authentication. | | `getSeatUsage()` | (`resourceId`) => `Promise`\<[`SeatUsage`](#seatusage)> | Retrieves the seat usage for a specific resource (typically workspace). Requires authentication. | | `getStorageUsage()` | (`resourceId`) => `Promise`\<[`StorageUsage`](#storageusage)> | Retrieves the storage usage for a specific resource (typically workspace). Requires authentication. | | `getUserSubscriptions()` | (`params?`) => `Promise`\<`Subscription`\[]> | Retrieves all subscriptions owned by the currently authenticated user. Requires authentication. | | `getWorkspaceOrders()` | (`workspaceId`, `params?`) => `Promise`\<`any`\[]> | Retrieves subscription orders for a specific workspace. Requires authentication and permission. | | `getWorkspaceSubscription()` | (`workspaceId`) => `Promise`\<`Subscription`> | Retrieves the active subscription for a specific workspace. Requires authentication and permission. | | `getWorkspaceUsageSummary()` | (`workspaceId`) => `Promise`\<\{ `billableSeatCount`: `number`; `storageUsedInBytes`: `number`; }> | Retrieves the workspace usage summary (billable seats and storage used). Requires authentication and subscription management permission. | | `resumeWorkspaceSubscription()` | (`workspaceId`) => `Promise`\<`any`> | Reverse a scheduled (period-end) cancellation, keeping the workspace's subscription on its normal renewal cycle. Only valid while the subscription is still active with a pending cancellation; a fully lapsed subscription can't be resumed (the owner must re-subscribe). Requires authentication and permission. | | `swapWorkspacePlan()` | (`workspaceId`, `params`) => `Promise`\<\{ `subscription`: `Subscription` \| `null`; `warnings`: [`PlanChangeWarning`](#planchangewarning)\[]; }> | Swap the workspace's active basePlan line for a different basePlan product. Same code path both upgrades and downgrades; the API's pre-flight capacity check is what distinguishes a permitted change from a refused one. Pass `dryRun: true` to get the pre-flight verdict without mutating. On over-allocation the API returns 400 `planCapacityInsufficient` with `errorData.violations: [{ resource, current, newLimit }]`, surfaced via the SDK's normal error path. On success, returns the updated subscription plus a `warnings[]` array of feature-gate capabilities the destination plan does NOT include (suitable for showing as a confirmation notice). | # supportChat (/docs/reference/sdk/routes/supportChat) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Functions [#functions] ### default() [#default] ```ts function default(client): { createAttachment: Promise; getTopic: Promise; }; ``` Nurama Support chat — one topic per user on the `/news` page. The surface is intentionally tiny: one endpoint that lazily creates the user's support topic on first call and returns the existing row on every subsequent call. There is no list / archive / delete — each user has exactly one support conversation that persists across visits. Messages flow through the regular chat endpoints on `nuramaClient.chat`: * send: `nuramaClient.chat.createMessage(topic.chatId, { content })` * list: `nuramaClient.chat.getMessages(topic.chatId, …)` Backend gates: `auth → requireGlobalSupportChatEnabled → supportChatLimiter`. Unmetered (no credit deduction) — abuse is bounded by the per-user per-day rate limiter, not a credit balance check. #### Parameters [#parameters] | Parameter | Type | | --------- | ----------------------------------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | #### Returns [#returns] | Name | Type | Description | | -------------------- | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `createAttachment()` | (`data`) => `Promise`\<`SupportChatCreateAttachmentResponse`> | Mint a scratch upload bundle for one image attachment. The image is kept as a scratch upload for 72 hours and is used by the assistant to interpret the next user message — it is never promoted to a permanent Asset. Same upload protocol as every other multipart upload on the platform: call this, multipart-upload the bytes to `urls`, then call `nuramaClient.scratch.completeUpload(scratchId, { uploadId, parts })`. Send the message with `attachments: [{ scratchId, name }]`. | | `getTopic()` | () => `Promise`\<`SupportChatGetTopicResponse`> | Get-or-create the caller's Support topic. Idempotent: re-calling returns the same row, so this is safe to invoke on every page mount. | # supportTicket (/docs/reference/sdk/routes/supportTicket) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### CreateSupportTicketRequest [#createsupportticketrequest] #### Properties [#properties] | Property | Type | Description | | ------------------------------------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `aiGenerated?` | `boolean` | `true` when the ticket was drafted by Nu via the `create_support_ticket` chat tool and submitted by the user from the pre-populated draft. Recorded on the ticket for analytics; set it when the ticket form was opened from an AI-draft action. | | `body` | `string` | - | | `deviceInfo?` | `Record`\<`string`, `unknown`> | Browser/app/device snapshot collected at submit time. | | `scopeId?` | `string` | Required for workspace/project scope; ignored for user scope. | | `scopeType` | [`SupportTicketScope`](#supportticketscope) | - | | `subject` | `string` | - | *** ### SupportTicket [#supportticket] #### Properties [#properties-1] | Property | Type | Description | | -------------------------------------- | ----------------------------------------------- | -------------------------------------------------------------- | | `aiGenerated` | `boolean` | True for tickets drafted by Nu's `create_support_ticket` tool. | | `chatId` | `string` | - | | `createdAt` | `string` | - | | `creatorId` | `string` | - | | `deviceInfo` | `Record`\<`string`, `unknown`> | - | | `id` | `string` | - | | `priority` | `string` | - | | `scopeId` | `string` \| `null` | - | | `scopeType` | [`SupportTicketScope`](#supportticketscope) | - | | `status` | [`SupportTicketStatus`](#supportticketstatus-1) | - | | `subject` | `string` | - | | `ticketNumber` | `number` | - | | `updatedAt` | `string` | - | *** ### SupportTicketListParams [#supportticketlistparams] #### Properties [#properties-2] | Property | Type | | ----------------------------- | ----------------------------------------------- | | `limit?` | `number` | | `page?` | `number` | | `status?` | [`SupportTicketStatus`](#supportticketstatus-1) | *** ### SupportTicketListResponse [#supportticketlistresponse] #### Properties [#properties-3] | Property | Type | | -------------------------------------- | ------------------------------------ | | `limit` | `number` | | `page` | `number` | | `results` | [`SupportTicket`](#supportticket)\[] | | `totalPages` | `number` | | `totalResults` | `number` | *** ### SupportTicketScopeOptions [#supportticketscopeoptions] #### Properties [#properties-4] | Property | Type | | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `projects` | \{ `color?`: `string` \| `null`; `id`: `string`; `logo?`: [`SupportTicketScopeLogo`](#supportticketscopelogo); `name`: `string`; `slug`: `string` \| `null`; `workspaceId`: `string`; }\[] | | `workspaces` | \{ `color?`: `string` \| `null`; `id`: `string`; `logo?`: [`SupportTicketScopeLogo`](#supportticketscopelogo); `name`: `string`; `slug`: `string`; }\[] | ## Type Aliases [#type-aliases] ### SupportTicketScope [#supportticketscope] ```ts type SupportTicketScope = "user" | "workspace" | "project"; ``` *** ### SupportTicketScopeLogo [#supportticketscopelogo] ```ts type SupportTicketScopeLogo = | { [key: string]: unknown; files?: unknown[]; } | null; ``` A logo asset (thumbnail-ready) attached to a scope for avatar rendering. *** ### SupportTicketStatus [#supportticketstatus] ```ts type SupportTicketStatus = "open" | "pending" | "resolved" | "closed"; ``` ## Functions [#functions] ### default() [#default] ```ts function default(client): { createSupportTicket: Promise; getSupportTicket: Promise; getSupportTicketScopeOptions: Promise; listSupportTickets: Promise; }; ``` Support tickets. A ticket carries the metadata + a backing Chat thread; the conversation itself is sent/read through the regular chat endpoints: * send: `nuramaClient.chat.createMessage(ticket.chatId, …)` * read: `nuramaClient.chat.getMessages(ticket.chatId, …)` Nurama customer service replies (as the support persona) from the admin site. #### Parameters [#parameters] | Parameter | Type | | --------- | ----------------------------------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | #### Returns [#returns] | Name | Type | Description | | -------------------------------- | ------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------- | | `createSupportTicket()` | (`data`) => `Promise`\<[`SupportTicket`](#supportticket)> | Create a ticket. The opening message body becomes the first thread entry. | | `getSupportTicket()` | (`ticketId`) => `Promise`\<[`SupportTicket`](#supportticket)> | - | | `getSupportTicketScopeOptions()` | () => `Promise`\<[`SupportTicketScopeOptions`](#supportticketscopeoptions)> | Workspaces/projects the caller may scope a new ticket to. | | `listSupportTickets()` | (`params?`) => `Promise`\<[`SupportTicketListResponse`](#supportticketlistresponse)> | List the caller's own tickets + (for resource admins) tickets in their scope. | # tag (/docs/reference/sdk/routes/tag) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### CreateTagData [#createtagdata] Data required to create a new tag #### Properties [#properties] | Property | Type | Description | | ------------------------------------------------ | ---------------------- | -------------------------------------------------------------------------------------------- | | `color?` | `string` | Optional hex color code for the tag. If not provided, a color will be assigned automatically | | `name` | `string` | The name of the tag | | `ownerResourceId` | `string` | The ID of the resource that will own this tag | | `ownerResourceType` | `TagOwnerResourceType` | The type of resource that will own this tag | *** ### GetTagsParams [#gettagsparams] Parameters for getting tags for a resource #### Properties [#properties-1] | Property | Type | Description | | --------------------------- | ------------------------------------------ | ---------------------------------------------------- | | `name?` | `string` | Filter tags by partial name match (case-insensitive) | | `sortBy?` | `"createdAt"` \| `"updatedAt"` \| `"name"` | Sort tags by field | *** ### UpdateTagData [#updatetagdata] Data for updating an existing tag #### Properties [#properties-2] | Property | Type | Description | | --------------------------- | -------- | ---------------------------------- | | `color?` | `string` | The new hex color code for the tag | | `name?` | `string` | The new name for the tag | ## Type Aliases [#type-aliases] ### Tags [#tags] ```ts type Tags = Tag[]; ``` Array of tags ## Functions [#functions] ### default() [#default] ```ts function default(client): { createTag: Promise; deleteTag: Promise; getTags: Promise; updateTag: Promise; }; ``` Defines tag-related methods for the NuramaClient. #### Parameters [#parameters] | Parameter | Type | Description | | --------- | ----------------------------------------------------- | -------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | The NuramaClient instance. | #### Returns [#returns] An object containing the tag-related methods. | Name | Type | Description | | ------------- | ------------------------------------------------------------------------------------ | ------------------------------------------- | | `createTag()` | (`tagData`) => `Promise`\<`Tag`> | Creates a new tag for a specific resource. | | `deleteTag()` | (`tagId`) => `Promise`\<`Tag`> | Deletes a tag permanently. | | `getTags()` | ( `ownerResourceType`, `ownerResourceId`, `params?` ) => `Promise`\<[`Tags`](#tags)> | Retrieves all tags for a specific resource. | | `updateTag()` | (`tagId`, `updateData`) => `Promise`\<`Tag`> | Updates an existing tag. | # task (/docs/reference/sdk/routes/task) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### AcknowledgeAllTasksResponse [#acknowledgealltasksresponse] #### Properties [#properties] | Property | Type | Description | | ---------------------------------------------------- | --------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `acknowledged` | `number` | Number of tasks that were acknowledged by this call. | | `unacknowledgedCount` | [`UnacknowledgedTaskCountResponse`](#unacknowledgedtaskcountresponse) | The user's remaining unacknowledged count for the project (should be all-zero). | *** ### BulkCreateTaskResult [#bulkcreatetaskresult] #### Properties [#properties-1] | Property | Type | | ------------------------------ | ------------------------------------------- | | `clientId` | `string` | | `error?` | \{ `code`: `string`; `message`: `string`; } | | `error.code` | `string` | | `error.message` | `string` | | `status` | `"error"` \| `"created"` | | `task?` | `Task` | *** ### BulkCreateTasksRequest [#bulkcreatetasksrequest] #### Properties [#properties-2] | Property | Type | Description | | -------------------------------- | ----------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `announce?` | \{ `chatId`: `string`; `messageId`: `string`; } | When present, the server posts a single Nu reply in the chat after the batch creates, threaded as `replyToId = messageId` and carrying every newly-created task as a taskCard. Replaces the standalone `ai.announceTasksFromMessage` endpoint we shipped previously. | | `announce.chatId` | `string` | - | | `announce.messageId` | `string` | - | | `projectId` | `string` | - | | `tasks` | [`BulkTaskDraft`](#bulktaskdraft)\[] | - | *** ### BulkCreateTasksResponse [#bulkcreatetasksresponse] #### Properties [#properties-3] | Property | Type | | --------------------------------- | ---------------------------------------------------------- | | `announce?` | \{ `messageId`: `string` \| `null`; `posted`: `boolean`; } | | `announce.messageId` | `string` \| `null` | | `announce.posted` | `boolean` | | `results` | [`BulkCreateTaskResult`](#bulkcreatetaskresult)\[] | *** ### BulkTaskDraft [#bulktaskdraft] One task draft in a `bulkCreate` request. #### Properties [#properties-4] | Property | Type | Description | | --------------------------------------- | ------------------ | ----------------------------------------------------------------------------------------------------------------- | | `assignedToId?` | `string` | - | | `boardId` | `string` | - | | `clientId` | `string` | Caller-assigned id; echoed back in `results` so the caller can map a per-task outcome onto the originating draft. | | `columnId?` | `string` | - | | `description?` | `string` \| `null` | - | | `subject` | `string` | - | | `tagIds?` | `string`\[] | - | *** ### GetTaskEventsParams [#gettaskeventsparams] #### Properties [#properties-5] | Property | Type | | --------------------------------- | -------------------------------- | | `eventType?` | `string` | | `limit?` | `number` | | `page?` | `number` | | `sort?` | `Record`\<`string`, `-1` \| `1`> | *** ### GetTasksBaseParams [#gettasksbaseparams] #### Extends [#extends] * [`SortParams`](#sortparams) #### Extended by [#extended-by] * [`GetTasksIndexParams`](#gettasksindexparams) * [`GetTasksCursorParams`](#gettaskscursorparams) #### Properties [#properties-6] | Property | Type | Inherited from | | ----------------------------------------- | ----------------------------------- | --------------------------------------------- | | `acknowledged?` | `boolean` | - | | `creatorId?` | `string` | - | | `limit?` | `number` | - | | `projectId?` | `string` | - | | `relatedToId?` | `string` | - | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`SortParams`](#sortparams).[`sort`](#sort-4) | | `visibility?` | [`TaskVisibility`](#taskvisibility) | - | *** ### GetTasksCursorParams [#gettaskscursorparams] #### Extends [#extends-1] * [`GetTasksBaseParams`](#gettasksbaseparams) #### Properties [#properties-7] | Property | Type | Inherited from | | ------------------------------------------------------- | ----------------------------------- | ----------------------------------------------------------------------------- | | `acknowledged?` | `boolean` | [`GetTasksBaseParams`](#gettasksbaseparams).[`acknowledged`](#acknowledged-1) | | `creatorId?` | `string` | [`GetTasksBaseParams`](#gettasksbaseparams).[`creatorId`](#creatorid) | | `cursor?` | `string` | - | | `includeCounts?` | `boolean` | - | | `includeCursorRecord?` | `boolean` | - | | `includeStartAtRecord?` | `boolean` | - | | `limit?` | `number` | [`GetTasksBaseParams`](#gettasksbaseparams).[`limit`](#limit-1) | | `paginate` | `"cursor"` | - | | `paginateReverse?` | `boolean` | - | | `projectId?` | `string` | [`GetTasksBaseParams`](#gettasksbaseparams).[`projectId`](#projectid-1) | | `relatedToId?` | `string` | [`GetTasksBaseParams`](#gettasksbaseparams).[`relatedToId`](#relatedtoid) | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`GetTasksBaseParams`](#gettasksbaseparams).[`sort`](#sort-1) | | `startAt?` | `string` | - | | `visibility?` | [`TaskVisibility`](#taskvisibility) | [`GetTasksBaseParams`](#gettasksbaseparams).[`visibility`](#visibility) | *** ### GetTasksIndexParams [#gettasksindexparams] #### Extends [#extends-2] * [`GetTasksBaseParams`](#gettasksbaseparams) #### Properties [#properties-8] | Property | Type | Inherited from | | ----------------------------------------- | ----------------------------------- | ----------------------------------------------------------------------------- | | `acknowledged?` | `boolean` | [`GetTasksBaseParams`](#gettasksbaseparams).[`acknowledged`](#acknowledged-1) | | `createdAfter?` | `string` \| `number` | - | | `createdBefore?` | `string` \| `number` | - | | `creatorId?` | `string` | [`GetTasksBaseParams`](#gettasksbaseparams).[`creatorId`](#creatorid) | | `limit?` | `number` | [`GetTasksBaseParams`](#gettasksbaseparams).[`limit`](#limit-1) | | `page?` | `number` | - | | `paginate?` | `"index"` | - | | `projectId?` | `string` | [`GetTasksBaseParams`](#gettasksbaseparams).[`projectId`](#projectid-1) | | `relatedToId?` | `string` | [`GetTasksBaseParams`](#gettasksbaseparams).[`relatedToId`](#relatedtoid) | | `sort?` | `Record`\<`string`, `-1` \| `1`> | [`GetTasksBaseParams`](#gettasksbaseparams).[`sort`](#sort-1) | | `visibility?` | [`TaskVisibility`](#taskvisibility) | [`GetTasksBaseParams`](#gettasksbaseparams).[`visibility`](#visibility) | *** ### SortParams [#sortparams] #### Extended by [#extended-by-1] * [`GetTasksBaseParams`](#gettasksbaseparams) #### Properties [#properties-9] | Property | Type | | ------------------------- | -------------------------------- | | `sort?` | `Record`\<`string`, `-1` \| `1`> | *** ### TaskEvent [#taskevent] #### Properties [#properties-10] | Property | Type | | ---------------------------------- | ----------------------------------------------- | | `actor` | [`TaskEventActor`](#taskeventactor-1) \| `null` | | `createdAt` | `string` | | `detail?` | `Record`\<`string`, `unknown`> | | `eventType` | `string` | | `id` | `string` | | `projectId` | `string` | | `taskId` | `string` | *** ### TaskEventActor [#taskeventactor] #### Properties [#properties-11] | Property | Type | | ------------------------------------- | --------- | | `avatar?` | `unknown` | | `color?` | `string` | | `displayName?` | `string` | | `firstName?` | `string` | | `id` | `string` | | `lastName?` | `string` | *** ### UnacknowledgedTaskCountResponse [#unacknowledgedtaskcountresponse] #### Properties [#properties-12] | Property | Type | | ------------------------------ | -------- | | `creator` | `number` | | `reviewer` | `number` | | `total` | `number` | *** ### UpdateTaskStatusData [#updatetaskstatusdata] #### Properties [#properties-13] | Property | Type | | ---------------------------- | --------------------------- | | `status` | [`TaskStatus`](#taskstatus) | ## Type Aliases [#type-aliases] ### GetTaskEventsResponse [#gettaskeventsresponse] ```ts type GetTaskEventsResponse = PaginatedResponse; ``` *** ### GetTasksParams [#gettasksparams] ```ts type GetTasksParams = | GetTasksIndexParams | GetTasksCursorParams; ``` *** ### GetTasksResponse [#gettasksresponse] ```ts type GetTasksResponse = PaginatedResponse; ``` *** ### PaginatedResponse [#paginatedresponse] ```ts type PaginatedResponse = PaginatedResult | CursorPaginatedResult & { results?: T[]; }; ``` #### Type Declaration [#type-declaration] | Name | Type | | ---------- | ------ | | `results?` | `T`\[] | #### Type Parameters [#type-parameters] | Type Parameter | | -------------- | | `T` | *** ### TaskStatus [#taskstatus] ```ts type TaskStatus = "pending" | "complete" | "cancelled"; ``` *** ### TaskVisibility [#taskvisibility] ```ts type TaskVisibility = "creator" | "reviewer"; ``` ## Functions [#functions] ### default() [#default] ```ts function default(client): { acknowledgeAllTasks: Promise; acknowledgeTask: Promise; bulkCreate: Promise; deleteTask: Promise; followTask: Promise; getMyTasks: Promise; getTaskEvents: Promise; getTaskLinks: Promise; getUnacknowledgedTaskCount: Promise; linkTask: Promise; tagTask: Promise; unfollowTask: Promise; unlinkTask: Promise; untagTask: Promise; updateTaskDetails: Promise; updateTaskStatus: Promise; }; ``` Defines task-related methods for the NuramaClient. #### Parameters [#parameters] | Parameter | Type | Description | | --------- | ----------------------------------------------------- | -------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | The NuramaClient instance. | #### Returns [#returns] An object containing the task-related methods. | Name | Type | Description | | ------------------------------ | -------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `acknowledgeAllTasks()` | (`projectId`) => `Promise`\<[`AcknowledgeAllTasksResponse`](#acknowledgealltasksresponse)> | Acknowledge every unacknowledged mention-task the current user has in a project. Idempotent server-side. | | `acknowledgeTask()` | (`taskId`) => `Promise`\<`Task`> | Toggles the acknowledgement status of a specific task. Requires authentication and permission. | | `bulkCreate()` | (`data`) => `Promise`\<[`BulkCreateTasksResponse`](#bulkcreatetasksresponse)> | Bulk-create one or more tasks under a single project in a single round-trip. Per-task partial success is returned in `results[]`; if `announce` is set and at least one task creates, the server also posts a Nu reply linking the new tasks back to the source message and rendering them as inline taskCards. | | `deleteTask()` | (`taskId`) => `Promise`\<`void`> | Permanently delete a task. Gated server-side by `canRemove{Visibility}BoardTask` for at least one of the parent board's visibility tiers (see `boardPermission('Remove', 'BoardTask')`). Returns void; the server responds with 204 No Content. | | `followTask()` | (`taskId`) => `Promise`\<`Task`> | Add the calling user to a task's `followers` list. Idempotent server-side — following an already-followed task is a no-op and still returns the current task. | | `getMyTasks()` | (`params?`) => `Promise`\<[`GetTasksResponse`](#gettasksresponse)> | Retrieves tasks assigned to the currently authenticated user. Supports filtering, sorting, and both index and cursor pagination. | | `getTaskEvents()` | (`taskId`, `params?`) => `Promise`\<[`GetTaskEventsResponse`](#gettaskeventsresponse)> | Retrieves the event log for a specific task. Returns paginated events in reverse chronological order with populated actor info. | | `getTaskLinks()` | (`taskId`) => `Promise`\<`TaskLink`\[]> | List the tasks linked to a task, with the relation type of each link. **Throws** 'taskId is required.' when `taskId` is falsy. | | `getUnacknowledgedTaskCount()` | (`projectId`) => `Promise`\<[`UnacknowledgedTaskCountResponse`](#unacknowledgedtaskcountresponse)> | Retrieves the count of unacknowledged tasks for the current user within a specific project. Requires authentication. | | `linkTask()` | (`taskId`, `data`) => `Promise`\<`TaskLink`> | Link two tasks with a typed relation (related, blocks, blockedBy, duplicate). The link is symmetrical: both tasks reflect the relationship. **Throws** 'taskId is required.' or 'linkedTaskId is required.'. | | `tagTask()` | (`taskId`, `tagId`) => `Promise`\<`Task`> | Attach a project tag to a task. **Throws** 'taskId is required.' or 'tagId is required.'. | | `unfollowTask()` | (`taskId`) => `Promise`\<`Task`> | Remove the calling user from a task's `followers` list. Idempotent server-side — unfollowing a task you don't follow is a no-op and still returns the current task. | | `unlinkTask()` | (`taskId`, `linkedTaskId`) => `Promise`\<`void`> | Remove a task-to-task link. **Throws** 'taskId is required.' or 'linkedTaskId is required.'. | | `untagTask()` | (`taskId`, `tagId`) => `Promise`\<`Task`> | Detach a project tag from a task. **Throws** 'taskId is required.' or 'tagId is required.'. | | `updateTaskDetails()` | (`taskId`, `data`) => `Promise`\<`Task`> | Update a board task's subject, description, assignee or status. Requires the boards capability and board-task write permission. **Throws** 'taskId is required.' when `taskId` is falsy. | | `updateTaskStatus()` | (`taskId`, `data`) => `Promise`\<`Task`> | Updates the status of a specific task. Requires authentication and permission. | # taskRelation (/docs/reference/sdk/routes/taskRelation) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### PaginatedTaskRelations [#paginatedtaskrelations] #### Properties [#properties] | Property | Type | | -------------------------------------- | ---------------------------------- | | `hasNextPage?` | `boolean` | | `hasPrevPage?` | `boolean` | | `limit` | `number` | | `page` | `number` | | `results` | [`TaskRelation`](#taskrelation)\[] | | `totalPages` | `number` | | `totalResults` | `number` | *** ### TaskRelation [#taskrelation] #### Properties [#properties-1] | Property | Type | | -------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `asset?` | `any` | | `chat?` | \| \{ `chatType`: `string`; `id`: `string`; `publicId?`: `string` \| `null`; `subject?`: `string` \| `null`; `topicId`: `string`; `topicType`: `string`; `visibility`: `string`; } \| `null` | | `createdAt` | `string` | | `creatorId` | `string` | | `id` | `string` | | `message?` | \| \{ `assetMentions`: `string`\[]; `author`: `any`; `authorId`: `string` \| `null`; `chatId`: `string`; `content`: `string` \| `null`; `createdAt`: `string`; `folderMentions`: `string`\[]; `id`: `string`; `mentions`: `string`\[]; } \| `null` | | `publicLink?` | \| \{ `id`: `string`; `name`: `string`; } \| `null` | | `relatedBy?` | `any` | | `resourceId` | `string` | | `resourceType` | [`RelationResourceType`](#relationresourcetype) | | `submission?` | \| \{ `id`: `string`; `name`: `string`; } \| `null` | | `taskId` | `string` | ## Type Aliases [#type-aliases] ### RelationResourceType [#relationresourcetype] ```ts type RelationResourceType = "chat" | "chatMessage"; ``` ## Functions [#functions] ### default() [#default] ```ts function default(client): { createTaskRelation: Promise; deleteTaskRelation: Promise; getRelationsForChat: Promise; getRelationsForMessage: Promise; getTaskRelations: Promise; }; ``` #### Parameters [#parameters] | Parameter | Type | | --------- | ----------------------------------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | #### Returns [#returns] | Name | Type | Description | | -------------------------- | ------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | | `createTaskRelation()` | (`taskId`, `data`) => `Promise`\<[`TaskRelation`](#taskrelation)> | Attach a related resource (chat message, chat, etc.) to a task, so the task surface shows the originating context. | | `deleteTaskRelation()` | (`taskId`, `relationId`) => `Promise`\<`void`> | Detach a related resource from a task. | | `getRelationsForChat()` | (`chatId`, `params?`) => `Promise`\<[`PaginatedTaskRelations`](#paginatedtaskrelations)> | List task relations referencing a chat (reverse lookup). | | `getRelationsForMessage()` | (`messageId`, `params?`) => `Promise`\<[`PaginatedTaskRelations`](#paginatedtaskrelations)> | List task relations referencing a specific chat message (reverse lookup). | | `getTaskRelations()` | (`taskId`, `params?`) => `Promise`\<[`PaginatedTaskRelations`](#paginatedtaskrelations)> | List the relations attached to a task — chat messages, chats, or other resources that reference this task as context. | # token (/docs/reference/sdk/routes/token) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### CreateTokenData [#createtokendata] #### Properties [#properties] | Property | Type | Description | | --------------------------------- | ------------------------------ | ------------------------------------------------------ | | `expiresAt?` | `string` \| `null` | Optional ISO date. Null / omitted = non-expiring. | | `name` | `string` | Customer-facing label. 1–80 characters. | | `scopes` | [`TokenScope`](#tokenscope)\[] | At least one scope. The server rejects unknown scopes. | *** ### CreateTokenResponse [#createtokenresponse] The shape returned by `listTokens` and (without the `token` field) the metadata half of `createToken`. Never includes the raw secret — that is shown exactly once at creation time and is the caller's responsibility to capture. #### Extends [#extends] * [`TokenSummary`](#tokensummary) #### Properties [#properties-1] | Property | Type | Description | Inherited from | | ----------------------------------- | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | | `createdAt` | `string` | - | [`TokenSummary`](#tokensummary).[`createdAt`](#createdat-1) | | `expiresAt?` | `string` \| `null` | - | [`TokenSummary`](#tokensummary).[`expiresAt`](#expiresat-2) | | `id` | `string` | - | [`TokenSummary`](#tokensummary).[`id`](#id-1) | | `kind` | [`TokenKind`](#tokenkind) | - | [`TokenSummary`](#tokensummary).[`kind`](#kind-1) | | `lastUsed?` | `string` \| `null` | - | [`TokenSummary`](#tokensummary).[`lastUsed`](#lastused-1) | | `name` | `string` | - | [`TokenSummary`](#tokensummary).[`name`](#name-2) | | `prefix` | `string` | - | [`TokenSummary`](#tokensummary).[`prefix`](#prefix-1) | | `scopes` | [`TokenScope`](#tokenscope)\[] | - | [`TokenSummary`](#tokensummary).[`scopes`](#scopes-2) | | `token` | `string` | The raw secret. Returned ONLY in this response. The server keeps a one-way hash and cannot recover this value — the customer must capture it immediately (typical pattern: reveal-once modal with a copy button). | - | *** ### TokenSummary [#tokensummary] The shape returned by `listTokens` and (without the `token` field) the metadata half of `createToken`. Never includes the raw secret — that is shown exactly once at creation time and is the caller's responsibility to capture. #### Extended by [#extended-by] * [`CreateTokenResponse`](#createtokenresponse) #### Properties [#properties-2] | Property | Type | | ----------------------------------- | ------------------------------ | | `createdAt` | `string` | | `expiresAt?` | `string` \| `null` | | `id` | `string` | | `kind` | [`TokenKind`](#tokenkind) | | `lastUsed?` | `string` \| `null` | | `name` | `string` | | `prefix` | `string` | | `scopes` | [`TokenScope`](#tokenscope)\[] | ## Type Aliases [#type-aliases] ### TokenKind [#tokenkind] ```ts type TokenKind = "pat" | "oauthAccess" | "oauthRefresh" | "botAccess"; ``` Personal Access Token kinds. v1 only mints `pat`; the rest are reserved for the future OAuth grant flow and are listed here so callers can switch on the kind. *** ### TokenScope [#tokenscope] ```ts type TokenScope = | "chat:read" | "chat:write" | "tasks:read" | "tasks:write" | "assets:read" | "assets:write" | "projects:read" | "workspaces:read"; ``` Granted action verbs on a token. The server validates requested scopes against this set. Fall back to `string` in your own code if it accepts arbitrary scopes from configuration. ## Functions [#functions] ### default() [#default] ```ts function default(client): { createToken: Promise; deleteToken: Promise; listTokens: Promise; }; ``` Personal Access Token surface — auth-gated, owner-scoped. Any logged-in user can mint, list, and revoke their own tokens; there is no admin-on-behalf surface here (admins managing bot keys do that via the `bot` methods). #### Parameters [#parameters] | Parameter | Type | | --------- | ----------------------------------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | #### Returns [#returns] | Name | Type | Description | | --------------- | --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `createToken()` | (`data`) => `Promise`\<[`CreateTokenResponse`](#createtokenresponse)> | Mint a new Personal Access Token for the calling user. The raw secret is in the response's `token` field — store it immediately, it cannot be retrieved again. | | `deleteToken()` | (`tokenId`) => `Promise`\<`void`> | Revoke one of the caller's Personal Access Tokens. The revocation is immediate — the token will return 401 on the very next request. | | `listTokens()` | () => `Promise`\<[`TokenSummary`](#tokensummary)\[]> | List the caller's Personal Access Tokens. Bot-access keys held by the same user (rare but possible — admin who's also a bot owner) are filtered out server-side and surface via the bot management screens instead. | # user (/docs/reference/sdk/routes/user) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### FileData [#filedata] #### Properties [#properties] | Property | Type | | ------------------------------ | -------- | | `checksum` | `string` | | `name` | `string` | | `sizeInMB` | `number` | *** ### PreferencesData [#preferencesdata] #### Properties [#properties-1] | Property | Type | Description | | ----------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `dailyTips?` | \{ `disabled?`: `boolean`; `lastShownDate?`: `string`; } | Daily-tips carousel state. `disabled` opts out entirely; `lastShownDate` (local `YYYY-MM-DD`) gates the once-per-day rule cumulatively across workspaces and devices. Merged one level deep by the server. | | `dailyTips.disabled?` | `boolean` | - | | `dailyTips.lastShownDate?` | `string` | - | | `dateFormat?` | `"european"` \| `"american"` \| `"iso"` | Preferred date display format. Seeded at registration from the registrant's country (European unless month-first, e.g. the US → american); European is the fallback when unset. User-overridable, incl. ISO (YYYY-MM-DD). | | `dismissed?` | \{ `todos?`: `string`\[]; } | Per-user UX dismissals — anything the user has explicitly opted out of seeing again. The server merges this object one level deep, so a write to one `dismissed.*` key preserves its siblings. For each inner array the server treats the value as the full list — callers should merge the new id into the existing array before sending. | | `dismissed.todos?` | `string`\[] | - | | `featureIntros?` | `Record`\<`string`, `string`\[]> | Per-project feature-intro tutorials the user has seen, keyed by project id. Merged one level deep by the server. | | `hide?` | `string`\[] | - | *** ### UpdateUserData [#updateuserdata] Fields accepted when updating the current user's profile. #### Properties [#properties-2] | Property | Type | | --------------------------------------------------- | --------- | | `allowOauthAutolink?` | `boolean` | | `color?` | `string` | | `company?` | `string` | | `displayName?` | `string` | | `email?` | `string` | | `firstName?` | `string` | | `lastName?` | `string` | | `middleName?` | `string` | | `password?` | `string` | | `userName?` | `string` | *** ### UserTodo [#usertodo] Structural shape only — the response carries no display strings. Map `id` to your own localized title, description and action label; the API stays language-agnostic. #### Properties [#properties-3] | Property | Type | | ------------------------------------ | --------- | | `dismissible` | `boolean` | | `id` | `string` | ## Functions [#functions] ### default() [#default] ```ts function default(client): { createAvatar: Promise; deleteCurrentUser: Promise; getSelf: Promise; getTodos: Promise<{ todos: UserTodo[]; }>; getUser: Promise; markSeen: Promise; unmarkSeen: Promise; updateAvatar: Promise; updatePreferences: Promise; updateSelf: Promise; }; ``` Defines user-related methods for the NuramaClient. #### Parameters [#parameters] | Parameter | Type | Description | | --------- | ----------------------------------------------------- | -------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | The NuramaClient instance. | #### Returns [#returns] An object containing the user-related methods. | Name | Type | Description | | --------------------- | ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `createAvatar()` | (`fileData`) => `Promise`\<`any`> | Creates a new avatar for the user. | | `deleteCurrentUser()` | () => `Promise`\<`void`> | Deletes the current user. Requires authentication. | | `getSelf()` | () => `Promise`\<`PublicUser`> | Retrieves the current user's profile. Requires authentication. **Throws** If no user ID is found in the token. | | `getTodos()` | () => `Promise`\<\{ `todos`: [`UserTodo`](#usertodo)\[]; }> | Get the current user's active site-level Todos for the onboarding drawer. Returns only todos whose completion condition isn't met and (for dismissibles) that the user hasn't opted out of. Server computes from live state — no caching on the server side, so a fresh call always reflects ground truth. | | `getUser()` | (`userId`) => `Promise`\<`PublicUser`> | Retrieves the public profile of a specific user. Requires authentication. | | `markSeen()` | (`element`) => `Promise`\<`User`> | Record that the current user has seen a one-time UI element (welcome video, tutorial coachmark). Idempotent. Returns the updated user. | | `unmarkSeen()` | (`elements?`) => `Promise`\<`User`> | Remove one-time UI elements from the current user's `hasSeen` so they display again. Pass specific element keys, or omit to clear ALL. Returns the updated user. | | `updateAvatar()` | (`fileData`) => `Promise`\<`any`> | Updates the user's avatar. | | `updatePreferences()` | (`preferenceData`) => `Promise`\<`User`> | Updates the user's preferences. | | `updateSelf()` | (`updateData`) => `Promise`\<`User`> | Updates the logged-in user's profile. Requires authentication. At least one field must be provided. | # version (/docs/reference/sdk/routes/version) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### CommitResponse [#commitresponse] #### Properties [#properties] | Property | Type | | ------------------------------------ | -------- | | `buildCommit` | `string` | *** ### HealthStatus [#healthstatus] #### Indexable [#indexable] ```ts [key: string]: unknown ``` #### Properties [#properties-1] | Property | Type | Description | | -------------------------------- | -------------------------------------------------------------------------------- | ------------------------------------------------- | | `memory` | `Record`\<`string`, `unknown`> | - | | `postgres` | \{ \[`key`: `string`]: `unknown`; `status`: `"connected"` \| `"disconnected"`; } | - | | `postgres.status` | `"connected"` \| `"disconnected"` | - | | `reason?` | `string` | Present when status is `degraded` or `unhealthy`. | | `status` | `"healthy"` \| `"degraded"` \| `"unhealthy"` | - | | `timestamp` | `number` | Epoch milliseconds when the check ran. | | `uptime` | `number` | Process uptime in seconds. | ## Type Aliases [#type-aliases] ### VersionMethods [#versionmethods] ```ts type VersionMethods = ReturnType; ``` ## Functions [#functions] ### default() [#default] ```ts function default(client): { getCommitHash: Promise; getHealth: Promise; }; ``` Defines version-related methods for the NuramaClient. #### Parameters [#parameters] | Parameter | Type | Description | | --------- | ----------------------------------------------------- | -------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | The NuramaClient instance. | #### Returns [#returns] An object containing the version-related methods. | Name | Type | Description | | ----------------- | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `getCommitHash()` | () => `Promise`\<[`CommitResponse`](#commitresponse)> | Retrieves the latest git commit hash of the deployed application. This is a public endpoint and does not require authentication. | | `getHealth()` | () => `Promise`\<[`HealthStatus`](#healthstatus)> | Retrieves the API health report (database connectivity, memory, uptime). Public endpoint. Resolves normally for `healthy` and `degraded`; the API responds 503 for `unhealthy`, which surfaces as a thrown error with `status: 503` and the report on `data`. | # webhook (/docs/reference/sdk/routes/webhook) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### CreateWebhookData [#createwebhookdata] #### Properties [#properties] | Property | Type | Description | | --------------------------------- | ---------------------------------- | ------------------------------------------------------- | | `events` | [`WebhookEvent`](#webhookevent)\[] | - | | `expiresAt?` | `string` \| `null` | Optional ISO timestamp. Must be in the future when set. | | `name` | `string` | - | | `url` | `string` | - | *** ### CreateWebhookResponse [#createwebhookresponse] #### Extended by [#extended-by] * [`RotateWebhookSecretResponse`](#rotatewebhooksecretresponse) #### Properties [#properties-1] | Property | Type | Description | | ---------------------------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `signingSecret` | `string` | The HMAC signing secret. Returned ONLY here (and from `rotateWebhookSecret`). The server keeps the ciphertext on the row and cannot recover the plaintext later — the customer must capture it now or rotate. | | `subscription` | [`WebhookSubscription`](#webhooksubscription) | - | *** ### ListDeliveriesParams [#listdeliveriesparams] #### Properties [#properties-2] | Property | Type | | --------------------------- | ------------------------------------------------- | | `cursor?` | `string` | | `limit?` | `number` | | `status?` | [`WebhookAttemptStatus`](#webhookattemptstatus-1) | *** ### ListDeliveriesResponse [#listdeliveriesresponse] #### Properties [#properties-3] | Property | Type | | ---------------------------------- | -------------------------------------- | | `items` | [`WebhookAttempt`](#webhookattempt)\[] | | `nextCursor` | `string` \| `null` | *** ### RotateWebhookSecretResponse [#rotatewebhooksecretresponse] #### Extends [#extends] * [`CreateWebhookResponse`](#createwebhookresponse) #### Properties [#properties-4] | Property | Type | Description | Inherited from | | ------------------------------------------ | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | | `signingSecret` | `string` | The HMAC signing secret. Returned ONLY here (and from `rotateWebhookSecret`). The server keeps the ciphertext on the row and cannot recover the plaintext later — the customer must capture it now or rotate. | [`CreateWebhookResponse`](#createwebhookresponse).[`signingSecret`](#signingsecret) | | `subscription` | [`WebhookSubscription`](#webhooksubscription) | - | [`CreateWebhookResponse`](#createwebhookresponse).[`subscription`](#subscription) | *** ### TestWebhookResponse [#testwebhookresponse] #### Properties [#properties-5] | Property | Type | | ---------------------------- | -------- | | `message` | `string` | | `queued` | `true` | *** ### UpdateWebhookData [#updatewebhookdata] #### Properties [#properties-6] | Property | Type | Description | | ----------------------------------- | ---------------------------------- | ------------------------------------------------------------------------------ | | `events?` | [`WebhookEvent`](#webhookevent)\[] | - | | `expiresAt?` | `string` \| `null` | Pass null to clear an existing expiry; pass a future ISO date to set / extend. | | `name?` | `string` | - | | `status?` | `"active"` \| `"paused"` | - | | `url?` | `string` | - | *** ### WebhookAttempt [#webhookattempt] #### Properties [#properties-7] | Property | Type | | --------------------------------------------- | ------------------------------------------------- | | `attempt` | `number` | | `createdAt` | `string` | | `deliveredAt?` | `string` \| `null` | | `errorMessage?` | `string` \| `null` | | `id` | `string` | | `maxAttempts` | `number` | | `nextRetryAt?` | `string` \| `null` | | `notificationId` | `string` | | `responseBody?` | `string` \| `null` | | `responseCode?` | `number` \| `null` | | `responseHeaders?` | `Record`\<`string`, `any`> \| `null` | | `scheduledAt` | `string` | | `signatureV1` | `string` | | `startedAt?` | `string` \| `null` | | `status` | [`WebhookAttemptStatus`](#webhookattemptstatus-1) | | `subscriptionId` | `string` | | `updatedAt` | `string` | *** ### WebhookSubscription [#webhooksubscription] Public shape of a webhook subscription. Never includes the signing secret or the encrypted ciphertext — those are server-only fields. #### Properties [#properties-8] | Property | Type | Description | | --------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `appId?` | `string` \| `null` | - | | `createdAt` | `string` | - | | `createdById` | `string` | - | | `events` | [`WebhookEvent`](#webhookevent)\[] | - | | `expiresAt?` | `string` \| `null` | Optional expiration. When set and in the past, the worker stops fanning new attempts to this subscription, and any in-flight attempts DLQ with a clear reason rather than retrying. Null = no expiry; the subscription delivers indefinitely until manually paused or deleted. | | `failedOutAt?` | `string` \| `null` | - | | `failedOutReason?` | `string` \| `null` | - | | `id` | `string` | - | | `lastDeliveryAt?` | `string` \| `null` | - | | `lastFailureAt?` | `string` \| `null` | - | | `lastSuccessAt?` | `string` \| `null` | - | | `name` | `string` | - | | `status` | [`WebhookSubscriptionStatus`](#webhooksubscriptionstatus-1) | - | | `updatedAt` | `string` | - | | `url` | `string` | - | | `workspaceId` | `string` | - | ## Type Aliases [#type-aliases] ### WebhookAttemptStatus [#webhookattemptstatus] ```ts type WebhookAttemptStatus = "pending" | "inflight" | "succeeded" | "failed" | "dlq"; ``` *** ### WebhookEvent [#webhookevent] ```ts type WebhookEvent = | "task.created" | "task.updated" | "task.deleted" | "chat.message.created" | "asset.published" | "webhook.test"; ``` Wire-format webhook event names. New events are added over time, and payloads only ever gain fields, so receivers pinned to a specific event name keep working as the contract grows. *** ### WebhookSubscriptionStatus [#webhooksubscriptionstatus] ```ts type WebhookSubscriptionStatus = "active" | "paused" | "failedOut"; ``` ## Functions [#functions] ### default() [#default] ```ts function default(client): { createWebhook: Promise; deleteWebhook: Promise; getWebhook: Promise; listWebhookDeliveries: Promise; listWebhooks: Promise; replayWebhookDelivery: Promise<{ attempt: WebhookAttempt; }>; rotateWebhookSecret: Promise; testWebhook: Promise; updateWebhook: Promise; }; ``` Outbound webhook subscription management. Admin-gated server-side by `canManageWebhooks`. All operations are workspace-scoped — there is no app-owned surface here yet (Phase 3 / OAuth). #### Parameters [#parameters] | Parameter | Type | | --------- | ----------------------------------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | #### Returns [#returns] | Name | Type | Description | | ------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `createWebhook()` | (`workspaceId`, `data`) => `Promise`\<[`CreateWebhookResponse`](#createwebhookresponse)> | Create a webhook subscription. The signing secret is in the response's `secret` field — store it immediately, it cannot be retrieved again. **Requires** `canManageWebhooks` on the workspace. | | `deleteWebhook()` | (`workspaceId`, `webhookId`) => `Promise`\<`void`> | Delete a webhook subscription. In-flight deliveries continue to the receiver until they exhaust retries; no new deliveries fire. **Requires** `canManageWebhooks` on the workspace. | | `getWebhook()` | (`workspaceId`, `webhookId`) => `Promise`\<[`WebhookSubscription`](#webhooksubscription)> | Fetch a single webhook subscription by id. **Requires** `canManageWebhooks` on the workspace. | | `listWebhookDeliveries()` | ( `workspaceId`, `webhookId`, `params?` ) => `Promise`\<[`ListDeliveriesResponse`](#listdeliveriesresponse)> | Paginated list of delivery attempts for a webhook subscription. Useful for diagnosing failures (HTTP status, response body snippet, retry timing). **Requires** `canManageWebhooks` on the workspace. | | `listWebhooks()` | (`workspaceId`) => `Promise`\<[`WebhookSubscription`](#webhooksubscription)\[]> | List webhook subscriptions in a workspace. Secrets are never returned. **Requires** `canManageWebhooks` on the workspace. | | `replayWebhookDelivery()` | ( `workspaceId`, `webhookId`, `attemptId` ) => `Promise`\<\{ `attempt`: [`WebhookAttempt`](#webhookattempt); }> | Re-fire a specific past delivery attempt. Useful for confirming a receiver fix without waiting for the next real event. **Requires** `canManageWebhooks` on the workspace. | | `rotateWebhookSecret()` | (`workspaceId`, `webhookId`) => `Promise`\<[`RotateWebhookSecretResponse`](#rotatewebhooksecretresponse)> | Generate a new HMAC signing secret for a subscription and return it once. The old secret is invalidated immediately. **Requires** `canManageWebhooks` on the workspace. | | `testWebhook()` | (`workspaceId`, `webhookId`) => `Promise`\<[`TestWebhookResponse`](#testwebhookresponse)> | Fire a synthetic `webhook.test` delivery to the subscription's URL. The receiver gets a small payload they can use to verify their HMAC + parsing setup. Returns immediately; check the delivery log for the outcome. | | `updateWebhook()` | ( `workspaceId`, `webhookId`, `data` ) => `Promise`\<[`WebhookSubscription`](#webhooksubscription)> | Update a webhook subscription's url, event filter, or active state. **Requires** `canManageWebhooks` on the workspace. | # workspace (/docs/reference/sdk/routes/workspace) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} ## Interfaces [#interfaces] ### CreateWorkspaceData [#createworkspacedata] #### Properties [#properties] | Property | Type | | ------------------------------------- | -------- | | `description?` | `string` | | `name` | `string` | *** ### FileData [#filedata] #### Properties [#properties-1] | Property | Type | | ------------------------------ | -------- | | `checksum` | `string` | | `name` | `string` | | `sizeInMB` | `number` | *** ### SortParams [#sortparams] #### Indexable [#indexable] ```ts [key: string]: -1 | 1 ``` *** ### UpdateWorkspaceData [#updateworkspacedata] #### Properties [#properties-2] | Property | Type | | --------------------------------------- | --------- | | `description?` | `string` | | `name?` | `string` | | `updateSlug?` | `boolean` | ## Functions [#functions] ### default() [#default] ```ts function default(client): { createIcon: Promise; createLogo: Promise; createWorkspace: Promise; deleteWorkspace: Promise; getWorkspace: Promise; listProjects: Promise; listWorkspaces: Promise; updateIcon: Promise; updateLogo: Promise; updateSetting: Promise; updateWorkspace: Promise; }; ``` Defines workspace-related methods for the NuramaClient. #### Parameters [#parameters] | Parameter | Type | Description | | --------- | ----------------------------------------------------- | -------------------------- | | `client` | [`default`](/docs/reference/sdk/NuramaClient#default) | The NuramaClient instance. | #### Returns [#returns] An object containing the workspace methods. | Name | Type | Description | | ------------------- | -------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `createIcon()` | (`workspaceId`, `fileData`) => `Promise`\<`any`> | Request signed URL data to upload a workspace icon (the small square shown in sidebars and tabs — distinct from the logo). | | `createLogo()` | (`workspaceId`, `fileData`) => `Promise`\<`any`> | Request signed URL data to upload a workspace logo. Caller then multipart-uploads the file using the returned `signedUrlData` and calls `client.asset.completeUpload(...)` to finalize. | | `createWorkspace()` | (`data`) => `Promise`\<`any`> | Creates a new workspace. Requires authentication. | | `deleteWorkspace()` | (`workspaceId`) => `Promise`\<`any`> | Soft-delete a workspace. All nested resources (projects, chats, assets) become inaccessible; bytes are reclaimed by the cleanup cron. | | `getWorkspace()` | (`workspaceId`) => `Promise`\<`any`> | Retrieves a specific workspace by its ID. Requires authentication. | | `listProjects()` | (`workspaceId`) => `Promise`\<`any`\[]> | List the projects inside a workspace that the calling user has access to. | | `listWorkspaces()` | (`sortParams?`) => `Promise`\<`any`\[]> | Lists all workspaces the authenticated user has access to. Requires authentication. | | `updateIcon()` | (`workspaceId`, `fileData`) => `Promise`\<`any`> | Request signed URL data to replace the workspace icon. Same upload shape as `createIcon`. | | `updateLogo()` | (`workspaceId`, `fileData`) => `Promise`\<`any`> | Request signed URL data to replace the workspace logo. Same upload shape as `createLogo`; existing logo is replaced once `completeUpload` lands. | | `updateSetting()` | ( `workspaceId`, `settingName`, `value` ) => `Promise`\<`any`> | Toggle a single workspace boolean setting (e.g. an `enableX` feature flag). | | `updateWorkspace()` | (`workspaceId`, `updateData`) => `Promise`\<`any`> | Update workspace metadata (name, description, etc.). | # acknowledge_task (/docs/reference/mcp/acknowledge_task) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Toggle the calling user's acknowledgement of a task (mark as seen, or un-mark). WRITE OPERATION but personal — only affects the calling user's view, not visible to others. Use when the user says "mark this as read" or "I've seen this". ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | -------------------------------- | | `taskId` | `string` | yes | UUID of the task to acknowledge. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "taskId": { "type": "string", "description": "UUID of the task to acknowledge." } }, "required": [ "taskId" ], "additionalProperties": false } ``` # add_chat_members (/docs/reference/mcp/add_chat_members) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Invite users to a member chat — turns a 1:1 DM into a group chat, or grows an existing group. Look up valid invitees first with `get_addable_chat_members` to avoid passing users outside the chat's scope. ## Input [#input] | Property | Type | Required | Description | | ----------- | ---------- | -------- | ------------------------------------- | | `chatId` | `string` | yes | UUID of the member chat. | | `memberIds` | `string[]` | yes | UUIDs of users to invite. min items 1 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "chatId": { "type": "string", "description": "UUID of the member chat." }, "memberIds": { "type": "array", "items": { "type": "string" }, "minItems": 1, "description": "UUIDs of users to invite." } }, "required": [ "chatId", "memberIds" ], "additionalProperties": false } ``` # add_column (/docs/reference/mcp/add_column) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Append a new column to a board. `taskStatus` maps the column to a canonical lifecycle bucket — pass null to leave it unmapped. `reviewersCanContribute` only matters on reviewer-tier boards; safe to omit on creator-only boards. ## Input [#input] | Property | Type | Required | Description | | ------------------------ | ------------------------------------------------------------- | -------- | --------------------------------------------------------------------- | | `boardId` | `string` | yes | UUID of the board. | | `name` | `string` | yes | Column name. min length 1 | | `description` | `string` | no | Optional description. | | `color` | `string` | no | Optional hex color. | | `isDefault` | `boolean` | no | When true, new tasks land here by default. | | `taskStatus` | `"pending" \| "inProgress" \| "complete" \| "closed" \| null` | no | Canonical lifecycle bucket this column represents. | | `sortOrder` | `number` | no | Position among columns. | | `reviewersCanContribute` | `boolean` | no | Reviewer-role users may add tasks here on reviewer-visibility boards. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "boardId": { "type": "string", "description": "UUID of the board." }, "name": { "type": "string", "minLength": 1, "description": "Column name." }, "description": { "type": "string", "description": "Optional description." }, "color": { "type": "string", "description": "Optional hex color." }, "isDefault": { "type": "boolean", "description": "When true, new tasks land here by default." }, "taskStatus": { "type": [ "string", "null" ], "enum": [ "pending", "inProgress", "complete", "closed", null ], "description": "Canonical lifecycle bucket this column represents." }, "sortOrder": { "type": "number", "description": "Position among columns." }, "reviewersCanContribute": { "type": "boolean", "description": "Reviewer-role users may add tasks here on reviewer-visibility boards." } }, "required": [ "boardId", "name" ], "additionalProperties": false } ``` # add_existing_task_to_board (/docs/reference/mcp/add_existing_task_to_board) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Attach an existing task to a board (e.g. to move it across boards within the same project, or to re-board a task that was previously unassigned to any board). WRITE OPERATION. The task's board and column references update; its subject/description/assignee stay intact. For moving within the same board's columns, use `move_task` instead. ## Input [#input] | Property | Type | Required | Description | | ---------- | -------- | -------- | -------------------------------------------------------------------------------------------------------- | | `boardId` | `string` | yes | UUID of the destination board. | | `taskId` | `string` | yes | UUID of the task to attach. | | `columnId` | `string` | no | Optional UUID of a specific column on the destination board. Omit to land in the board's default column. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "boardId": { "type": "string", "description": "UUID of the destination board." }, "taskId": { "type": "string", "description": "UUID of the task to attach." }, "columnId": { "type": "string", "description": "Optional UUID of a specific column on the destination board. Omit to land in the board's default column." } }, "required": [ "boardId", "taskId" ], "additionalProperties": false } ``` # add_items_to_submission (/docs/reference/mcp/add_items_to_submission) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Add creator-tier paths to an existing submission. Optionally place them under a destination path within the submission so the receiving reviewers see a consistent folder structure. ## Input [#input] | Property | Type | Required | Description | | ----------------- | ---------- | -------- | ---------------------------------------------------------------- | | `projectId` | `string` | yes | UUID of the project. | | `submissionId` | `string` | yes | UUID of the submission. | | `itemPaths` | `string[]` | yes | Creator-tier project paths to include. min items 1 | | `destinationPath` | `string` | no | Optional sub-path within the submission to nest the items under. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project." }, "submissionId": { "type": "string", "description": "UUID of the submission." }, "itemPaths": { "type": "array", "items": { "type": "string" }, "minItems": 1, "description": "Creator-tier project paths to include." }, "destinationPath": { "type": "string", "description": "Optional sub-path within the submission to nest the items under." } }, "required": [ "projectId", "submissionId", "itemPaths" ], "additionalProperties": false } ``` # archive_member_chat (/docs/reference/mcp/archive_member_chat) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Archive a member chat — hides it from the active list without losing history. Use when a DM / group chat has run its course. Recover with `unarchive_member_chat`. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | ------------------------ | | `chatId` | `string` | yes | UUID of the member chat. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "chatId": { "type": "string", "description": "UUID of the member chat." } }, "required": [ "chatId" ], "additionalProperties": false } ``` # complete_convo (/docs/reference/mcp/complete_convo) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. End a live conversation for everyone — closes the Daily.co room, stamps `endedAt`, transitions status to `completed`, and triggers recording / transcript post-processing if those features were enabled. Use when wrapping up a huddle. Not destructive (history + recordings stay); for that, use `delete_convo` (Phase F). ## Input [#input] | Property | Type | Required | Description | | --------- | -------- | -------- | ------------------ | | `convoId` | `string` | yes | UUID of the convo. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "convoId": { "type": "string", "description": "UUID of the convo." } }, "required": [ "convoId" ], "additionalProperties": false } ``` # create_ai_chat_topic (/docs/reference/mcp/create_ai_chat_topic) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Create a new (empty) AI chat topic — one of Nu's LLM-assistant conversations. After this resolves, post the first user message via `send_message` against the returned `topic.chatId`; Nurama recognises the chat as an AI chat and routes the message to the assistant. Pre-flight: workspace needs the AI add-on and `aiChatEnabled` resolved true; AI calls also charge credits from the workspace pool. ## Input [#input] | Property | Type | Required | Description | | ------------- | -------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------- | | `workspaceId` | `string` | yes | UUID of the workspace. Required for every scope. | | `scopeType` | `"workspace" \| "project" \| "social"` | yes | Topic scope. `workspace` = cross-project; `project` = bound to one project; `social` = personal. | | `scopeId` | `string` | no | UUID of the workspace or project. Required when `scopeType` is `workspace` or `project`; omit for `social`. | | `title` | `string` | no | Optional title. Auto-named from first user message when omitted. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "workspaceId": { "type": "string", "description": "UUID of the workspace. Required for every scope." }, "scopeType": { "type": "string", "enum": [ "workspace", "project", "social" ], "description": "Topic scope. `workspace` = cross-project; `project` = bound to one project; `social` = personal." }, "scopeId": { "type": "string", "description": "UUID of the workspace or project. Required when `scopeType` is `workspace` or `project`; omit for `social`." }, "title": { "type": "string", "description": "Optional title. Auto-named from first user message when omitted." } }, "required": [ "workspaceId", "scopeType" ], "additionalProperties": false } ``` # create_asset_short_link (/docs/reference/mcp/create_asset_short_link) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Mint a deep-linkable short URL for an asset. Returns `{ shortLink, shortUrl }`. Optionally scope to a `creator` or `reviewer` view so the link lands the recipient on the right tier. ## Input [#input] | Property | Type | Required | Description | | ------------ | ------------------------- | -------- | ------------------------------------------------------------------------------ | | `assetId` | `string` | yes | UUID of the asset. | | `visibility` | `"creator" \| "reviewer"` | no | Optional visibility scope for the link. Omit to use the default for the asset. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "assetId": { "type": "string", "description": "UUID of the asset." }, "visibility": { "type": "string", "enum": [ "creator", "reviewer" ], "description": "Optional visibility scope for the link. Omit to use the default for the asset." } }, "required": [ "assetId" ], "additionalProperties": false } ``` # create_board (/docs/reference/mcp/create_board) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Create a kanban board in a project. Visibility defaults to creator-only; pass `["creator","reviewer"]` to make it cross-tier. Optionally seed columns inline — otherwise the server creates a default column set you can edit with `add_column` / `update_column`. ## Input [#input] | Property | Type | Required | Description | | ------------- | --------------------------- | -------- | ------------------------------------------------------------------------------------------ | | `projectId` | `string` | yes | UUID of the owning project. | | `name` | `string` | yes | Board name. min length 1 | | `description` | `string` | no | Optional description. | | `visibility` | `"creator" \| "reviewer"[]` | no | Visibility tiers the board appears in. Defaults to `["creator"]` server-side when omitted. | | `columns` | `object[]` | no | Optional inline column seed. Omit to let the server create a default set. | **`columns`** (items) | Property | Type | Required | Description | | ------------------------ | ------------------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------------- | | `name` | `string` | yes | | | `description` | `string` | no | | | `color` | `string` | no | | | `isDefault` | `boolean` | no | | | `taskStatus` | `"pending" \| "inProgress" \| "complete" \| "closed" \| null` | no | | | `sortOrder` | `number` | no | | | `reviewersCanContribute` | `boolean` | no | When true, reviewer-role users may create tasks in this column on a reviewer-visibility board. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the owning project." }, "name": { "type": "string", "minLength": 1, "description": "Board name." }, "description": { "type": "string", "description": "Optional description." }, "visibility": { "type": "array", "items": { "type": "string", "enum": [ "creator", "reviewer" ] }, "description": "Visibility tiers the board appears in. Defaults to `[\"creator\"]` server-side when omitted." }, "columns": { "type": "array", "description": "Optional inline column seed. Omit to let the server create a default set.", "items": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" }, "color": { "type": "string" }, "isDefault": { "type": "boolean" }, "taskStatus": { "type": [ "string", "null" ], "enum": [ "pending", "inProgress", "complete", "closed", null ] }, "sortOrder": { "type": "number" }, "reviewersCanContribute": { "type": "boolean", "description": "When true, reviewer-role users may create tasks in this column on a reviewer-visibility board." } }, "required": [ "name" ], "additionalProperties": false } } }, "required": [ "projectId", "name" ], "additionalProperties": false } ``` # create_folder (/docs/reference/mcp/create_folder) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Create a folder inside a project. The folder lives under a specific visibility tier and an optional base path; pass `basePath` to nest inside an existing folder hierarchy. Returns the new folder record. ## Input [#input] | Property | Type | Required | Description | | ------------ | ------------------------- | -------- | -------------------------------------------------------------------------------- | | `projectId` | `string` | yes | UUID of the project. | | `visibility` | `"creator" \| "reviewer"` | yes | Visibility tier the folder lives under. | | `name` | `string` | yes | Folder name. min length 1 | | `basePath` | `string` | no | Optional parent path (e.g. `parent/sub`). Omit to create at the visibility root. | | `color` | `string` | no | Optional hex color (e.g. `#FF6B35`). | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project." }, "visibility": { "type": "string", "enum": [ "creator", "reviewer" ], "description": "Visibility tier the folder lives under." }, "name": { "type": "string", "minLength": 1, "description": "Folder name." }, "basePath": { "type": "string", "description": "Optional parent path (e.g. `parent/sub`). Omit to create at the visibility root." }, "color": { "type": "string", "description": "Optional hex color (e.g. `#FF6B35`)." } }, "required": [ "projectId", "visibility", "name" ], "additionalProperties": false } ``` # create_member_chat (/docs/reference/mcp/create_member_chat) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Start a private member chat — 1:1 DM (one memberId) or group chat (multiple memberIds). The chat is scoped to a resource (workspace / project / social), which controls who is allowed to participate. The caller is automatically a participant; do not include the caller's own userId in `memberIds`. ## Input [#input] | Property | Type | Required | Description | | ----------- | -------------------------------------- | -------- | -------------------------------------------------------------------------------------- | | `scopeType` | `"project" \| "workspace" \| "social"` | yes | What kind of resource scopes the chat. | | `scopeId` | `string` | yes | UUID of the scope resource. | | `memberIds` | `string[]` | yes | Invitee UUIDs (do not include the caller). For a 1:1 DM, pass exactly one. min items 1 | | `subject` | `string` | no | Optional title. Auto-generated from members when omitted. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "scopeType": { "type": "string", "enum": [ "project", "workspace", "social" ], "description": "What kind of resource scopes the chat." }, "scopeId": { "type": "string", "description": "UUID of the scope resource." }, "memberIds": { "type": "array", "items": { "type": "string" }, "minItems": 1, "description": "Invitee UUIDs (do not include the caller). For a 1:1 DM, pass exactly one." }, "subject": { "type": "string", "description": "Optional title. Auto-generated from members when omitted." } }, "required": [ "scopeType", "scopeId", "memberIds" ], "additionalProperties": false } ``` # create_message_short_link (/docs/reference/mcp/create_message_short_link) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Mint a deep-linkable short URL for a chat message. Returns `{ code, shortUrl }`. Use whenever you need to surface a specific message in another context (a task, an email, another chat) — the link jumps the recipient directly to the message in its chat. ## Input [#input] | Property | Type | Required | Description | | ----------- | -------- | -------- | ---------------------------- | | `messageId` | `string` | yes | UUID of the message to link. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "messageId": { "type": "string", "description": "UUID of the message to link." } }, "required": [ "messageId" ], "additionalProperties": false } ``` # create_reaction (/docs/reference/mcp/create_reaction) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Add an emoji reaction to a message. One reaction per user per message — calling again replaces the previous reaction. Use to acknowledge ("👍"), flag for follow-up ("🔁"), or signal status quickly without writing a reply. ## Input [#input] | Property | Type | Required | Description | | ----------- | -------- | -------- | ------------------------------------------------ | | `messageId` | `string` | yes | UUID of the message to react to. | | `emoji` | `string` | yes | Single emoji character or short emoji shortcode. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "messageId": { "type": "string", "description": "UUID of the message to react to." }, "emoji": { "type": "string", "description": "Single emoji character or short emoji shortcode." } }, "required": [ "messageId", "emoji" ], "additionalProperties": false } ``` # create_submission (/docs/reference/mcp/create_submission) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Bundle a set of items at given creator-tier paths into a submission for reviewer review. Submissions are immutable snapshots — they freeze the included paths at creation time. Optionally start empty and add items later with `add_items_to_submission`. ## Input [#input] | Property | Type | Required | Description | | ------------- | ---------- | -------- | --------------------------------------------------------------------------------- | | `projectId` | `string` | yes | UUID of the project. | | `subject` | `string` | no | Subject / title of the submission. | | `description` | `string` | no | Optional longer description. | | `version` | `string` | no | Optional version label (e.g. `v1`, `2026.03`). | | `itemPaths` | `string[]` | no | Project paths to include (e.g. `creator/folder1/asset.jpg`). Omit to start empty. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project." }, "subject": { "type": "string", "description": "Subject / title of the submission." }, "description": { "type": "string", "description": "Optional longer description." }, "version": { "type": "string", "description": "Optional version label (e.g. `v1`, `2026.03`)." }, "itemPaths": { "type": "array", "items": { "type": "string" }, "description": "Project paths to include (e.g. `creator/folder1/asset.jpg`). Omit to start empty." } }, "required": [ "projectId" ], "additionalProperties": false } ``` # create_tag (/docs/reference/mcp/create_tag) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Mint a new tag on a workspace or project. Tags are owned by exactly one resource and visible everywhere it cascades down to. Use BEFORE `tag_task` / `tag_asset` / `tag_folder` / `tag_board` if `list_tags` shows the desired tag does not yet exist. A color is assigned automatically when omitted. ## Input [#input] | Property | Type | Required | Description | | ------------------- | -------------------------- | -------- | -------------------------------------------------------------- | | `name` | `string` | yes | The tag name (e.g. `urgent`, `q3-launch`). min length 1 | | `ownerResourceType` | `"workspace" \| "project"` | yes | The resource that owns this tag — usually `project`. | | `ownerResourceId` | `string` | yes | UUID of the owning resource. | | `color` | `string` | no | Optional hex color (e.g. `#FF6B35`). Auto-assigned if omitted. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "description": "The tag name (e.g. `urgent`, `q3-launch`)." }, "ownerResourceType": { "type": "string", "enum": [ "workspace", "project" ], "description": "The resource that owns this tag — usually `project`." }, "ownerResourceId": { "type": "string", "description": "UUID of the owning resource." }, "color": { "type": "string", "description": "Optional hex color (e.g. `#FF6B35`). Auto-assigned if omitted." } }, "required": [ "name", "ownerResourceType", "ownerResourceId" ], "additionalProperties": false } ``` # create_task (/docs/reference/mcp/create_task) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Create a new task on a board. WRITE OPERATION — the task appears under the bot user as creator and is visible to every member who can see the board. If no `columnId` is provided the task lands in the board's default column. Use `list_project_boards` first if you do not know which `boardId` to target. Optional `announce` posts a Nu-style reply in a chat threaded under a referenced message, with the new task rendered as a task card and a task relation created between the task and that message. Use it when the task originated from a specific message and you want the conversation to surface the new task inline. ## Input [#input] | Property | Type | Required | Description | | -------------- | -------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `boardId` | `string` | yes | UUID of the destination board. | | `subject` | `string` | yes | Short task title shown on the card (≤ 280 chars). min length 1. max length 280 | | `description` | `string` | no | Optional longer body. Plain text or markdown. | | `columnId` | `string` | no | Optional UUID of the column to drop the task into. Defaults to the board's default column. | | `assignedToId` | `string` | no | Optional UUID of the user to assign. Must be a member of the project. | | `announce` | `object` | no | Optionally announce the new task back into a chat. When supplied, Nu posts a reply in `chatId` threaded under `messageId`, with the new task as a single task card, and a task relation is created linking the task to that message. Only set this when both fields are known — the bot must be able to see the chat, and the message must exist in it. | **`announce`** | Property | Type | Required | Description | | ----------- | -------- | -------- | --------------------------------------------------------------------------------------------------------- | | `chatId` | `string` | yes | UUID of the chat where the announcement reply should be posted. | | `messageId` | `string` | yes | UUID of the message the announcement should thread under (typically the message that motivated the task). | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "boardId": { "type": "string", "description": "UUID of the destination board." }, "subject": { "type": "string", "minLength": 1, "maxLength": 280, "description": "Short task title shown on the card (≤ 280 chars)." }, "description": { "type": "string", "description": "Optional longer body. Plain text or markdown." }, "columnId": { "type": "string", "description": "Optional UUID of the column to drop the task into. Defaults to the board's default column." }, "assignedToId": { "type": "string", "description": "Optional UUID of the user to assign. Must be a member of the project." }, "announce": { "type": "object", "description": "Optionally announce the new task back into a chat. When supplied, Nu posts a reply in `chatId` threaded under `messageId`, with the new task as a single task card, and a task relation is created linking the task to that message. Only set this when both fields are known — the bot must be able to see the chat, and the message must exist in it.", "properties": { "chatId": { "type": "string", "description": "UUID of the chat where the announcement reply should be posted." }, "messageId": { "type": "string", "description": "UUID of the message the announcement should thread under (typically the message that motivated the task)." } }, "required": [ "chatId", "messageId" ], "additionalProperties": false } }, "required": [ "boardId", "subject" ], "additionalProperties": false } ``` # create_task_relation (/docs/reference/mcp/create_task_relation) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Attach a task to a chat or a chat message — establishes the "this task came from / belongs to this conversation" link that the Nurama web app renders as a task card in the conversation. Prefer the `create_task` + `announce` flow when creating a brand-new task tied to a message in one shot; reach for this when you need to add another relation to an EXISTING task. ## Input [#input] | Property | Type | Required | Description | | -------------- | ------------------------- | -------- | -------------------------------------------- | | `taskId` | `string` | yes | UUID of the task. | | `resourceId` | `string` | yes | UUID of the chat or chat-message to link to. | | `resourceType` | `"chat" \| "chatMessage"` | yes | What kind of resource `resourceId` is. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "taskId": { "type": "string", "description": "UUID of the task." }, "resourceId": { "type": "string", "description": "UUID of the chat or chat-message to link to." }, "resourceType": { "type": "string", "enum": [ "chat", "chatMessage" ], "description": "What kind of resource `resourceId` is." } }, "required": [ "taskId", "resourceId", "resourceType" ], "additionalProperties": false } ``` # delete_ai_chat_topic (/docs/reference/mcp/delete_ai_chat_topic) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. DESTRUCTIVE — confirm with the user before calling. Restate the target (id + a human descriptor) and wait for explicit approval; do not invoke from inferred intent. No undo. Soft-delete an AI chat topic. The topic, its underlying chat, and every attachment asset scoped to that chat are marked `pendingDelete` immediately and disappear from listings; the stored files and records are then removed asynchronously. There is no in-app undo — the caller may remove the topic from any local list immediately. ## Input [#input] | Property | Type | Required | Description | | ------------- | -------- | -------- | -------------------------------------------- | | `topicId` | `string` | yes | UUID of the AI chat topic. | | `workspaceId` | `string` | yes | UUID of the workspace the topic lives under. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "topicId": { "type": "string", "description": "UUID of the AI chat topic." }, "workspaceId": { "type": "string", "description": "UUID of the workspace the topic lives under." } }, "required": [ "topicId", "workspaceId" ], "additionalProperties": false } ``` # delete_asset (/docs/reference/mcp/delete_asset) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. DESTRUCTIVE — confirm with the user before calling. Restate the target (id + a human descriptor) and wait for explicit approval; do not invoke from inferred intent. No undo. Delete an asset and its stored files (the original upload and every derivative such as thumbnails and transcodes). The asset is removed from feeds, folders, submissions, and chat attachments. ## Input [#input] | Property | Type | Required | Description | | --------- | -------- | -------- | ------------------ | | `assetId` | `string` | yes | UUID of the asset. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "assetId": { "type": "string", "description": "UUID of the asset." } }, "required": [ "assetId" ], "additionalProperties": false } ``` # delete_board (/docs/reference/mcp/delete_board) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. DESTRUCTIVE — confirm with the user before calling. Restate the target (id + a human descriptor) and wait for explicit approval; do not invoke from inferred intent. No undo. Delete a board. `disposition` controls what happens to the board's tasks: * `unassign` (the server default): tasks survive, lose their board / column placement. * `reassign`: tasks move to `targetBoardId` (required) and optionally `targetColumnId`. * `delete`: tasks AND their chats / messages / attachments are cascade-deleted (after a grace window). When `disposition` is omitted the server applies its current default — pass it explicitly when you care. ## Input [#input] | Property | Type | Required | Description | | ---------------- | -------------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------- | | `boardId` | `string` | yes | UUID of the board. | | `disposition` | `"unassign" \| "reassign" \| "delete"` | no | What happens to the tasks. See description above. | | `targetBoardId` | `string` | no | Destination board for reassigned tasks. Required when `disposition === "reassign"`. | | `targetColumnId` | `string` | no | Destination column on `targetBoardId` for reassigned tasks. Optional; falls back to the board's default column. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "boardId": { "type": "string", "description": "UUID of the board." }, "disposition": { "type": "string", "enum": [ "unassign", "reassign", "delete" ], "description": "What happens to the tasks. See description above." }, "targetBoardId": { "type": "string", "description": "Destination board for reassigned tasks. Required when `disposition === \"reassign\"`." }, "targetColumnId": { "type": "string", "description": "Destination column on `targetBoardId` for reassigned tasks. Optional; falls back to the board's default column." } }, "required": [ "boardId" ], "additionalProperties": false } ``` # delete_chat (/docs/reference/mcp/delete_chat) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. DESTRUCTIVE — confirm with the user before calling. Restate the target (id + a human descriptor) and wait for explicit approval; do not invoke from inferred intent. No undo. Delete a topic chat (a project chat or asset chat). All messages, attachments, summaries, and follower state go with it. For member chats / DMs use `delete_member_chat` instead. Auto-created topic chats sometimes re-spawn — deleting them is rarely the right move; consider `update_chat_subject` first. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | ----------------------- | | `chatId` | `string` | yes | UUID of the topic chat. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "chatId": { "type": "string", "description": "UUID of the topic chat." } }, "required": [ "chatId" ], "additionalProperties": false } ``` # delete_column (/docs/reference/mcp/delete_column) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. DESTRUCTIVE — confirm with the user before calling. Restate the target (id + a human descriptor) and wait for explicit approval; do not invoke from inferred intent. No undo. Delete a column from a board. If the column has tasks, pass `targetColumnId` to move them to another column on the same board; otherwise the delete is rejected so that no task is left without a column. ## Input [#input] | Property | Type | Required | Description | | ---------------- | -------- | -------- | ------------------------------------------------------------------------------------------- | | `boardId` | `string` | yes | UUID of the board. | | `columnId` | `string` | yes | UUID of the column to delete. | | `targetColumnId` | `string` | no | UUID of the column to migrate this column's tasks into. Required when the column has tasks. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "boardId": { "type": "string", "description": "UUID of the board." }, "columnId": { "type": "string", "description": "UUID of the column to delete." }, "targetColumnId": { "type": "string", "description": "UUID of the column to migrate this column's tasks into. Required when the column has tasks." } }, "required": [ "boardId", "columnId" ], "additionalProperties": false } ``` # delete_convo (/docs/reference/mcp/delete_convo) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. DESTRUCTIVE — confirm with the user before calling. Restate the target (id + a human descriptor) and wait for explicit approval; do not invoke from inferred intent. No undo. Delete a live conversation (active or completed). Removes the convo record, its recordings, and transcripts. Prefer `complete_convo` to end a call gracefully — that preserves the recording asset for later review. ## Input [#input] | Property | Type | Required | Description | | --------- | -------- | -------- | ------------------ | | `convoId` | `string` | yes | UUID of the convo. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "convoId": { "type": "string", "description": "UUID of the convo." } }, "required": [ "convoId" ], "additionalProperties": false } ``` # delete_folder (/docs/reference/mcp/delete_folder) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. DESTRUCTIVE — confirm with the user before calling. Restate the target (id + a human descriptor) and wait for explicit approval; do not invoke from inferred intent. No undo. Delete a folder. The folder's assets and sub-folders are not auto-deleted — they remain in the project but lose their parent reference (i.e. surface at the visibility root). For a full cascade delete, walk the contents first with `list_items_at_path` and delete the assets explicitly. ## Input [#input] | Property | Type | Required | Description | | ---------- | -------- | -------- | ------------------- | | `folderId` | `string` | yes | UUID of the folder. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "folderId": { "type": "string", "description": "UUID of the folder." } }, "required": [ "folderId" ], "additionalProperties": false } ``` # delete_items_at_path (/docs/reference/mcp/delete_items_at_path) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. DESTRUCTIVE — confirm with the user before calling. Restate the target (id + a human descriptor) and wait for explicit approval; do not invoke from inferred intent. No undo. Delete items from a project at the given paths under the given visibility tier. Each path can resolve to an asset or a folder. Returns a count of removed items. Deleting a folder may also delete everything inside it. ## Input [#input] | Property | Type | Required | Description | | ------------ | ------------------------- | -------- | -------------------------------------------------------------------------- | | `projectId` | `string` | yes | UUID of the project. | | `visibility` | `"creator" \| "reviewer"` | yes | Which visibility tier the paths live under. | | `itemPaths` | `string[]` | yes | Visibility-relative paths to delete (e.g. `folder/asset.jpg`). min items 1 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project." }, "visibility": { "type": "string", "enum": [ "creator", "reviewer" ], "description": "Which visibility tier the paths live under." }, "itemPaths": { "type": "array", "items": { "type": "string" }, "minItems": 1, "description": "Visibility-relative paths to delete (e.g. `folder/asset.jpg`)." } }, "required": [ "projectId", "visibility", "itemPaths" ], "additionalProperties": false } ``` # delete_member_chat (/docs/reference/mcp/delete_member_chat) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. DESTRUCTIVE — confirm with the user before calling. Restate the target (id + a human descriptor) and wait for explicit approval; do not invoke from inferred intent. No undo. Delete a member chat (DM or group). Every participant loses access; message history goes with it. Prefer `archive_member_chat` for "hide from the active list but keep the history" — that's reversible. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | ------------------------ | | `chatId` | `string` | yes | UUID of the member chat. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "chatId": { "type": "string", "description": "UUID of the member chat." } }, "required": [ "chatId" ], "additionalProperties": false } ``` # delete_message (/docs/reference/mcp/delete_message) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. DESTRUCTIVE — confirm with the user before calling. Restate the target (id + a human descriptor) and wait for explicit approval; do not invoke from inferred intent. No undo. Permanently delete a chat message. The message is marked as deleted and a placeholder remains in the feed so the conversation stays readable; connected clients receive a `chatDeleteMessage` event. Replies, reactions, and attachments tied to it are unreachable afterwards. ## Input [#input] | Property | Type | Required | Description | | ----------- | -------- | -------- | ------------------------------ | | `messageId` | `string` | yes | UUID of the message to delete. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "messageId": { "type": "string", "description": "UUID of the message to delete." } }, "required": [ "messageId" ], "additionalProperties": false } ``` # delete_submission_items (/docs/reference/mcp/delete_submission_items) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. DESTRUCTIVE — confirm with the user before calling. Restate the target (id + a human descriptor) and wait for explicit approval; do not invoke from inferred intent. No undo. Remove paths from a submission. The underlying source assets in the creator tier are NOT touched — this only unbinds them from the submission. Returns a count of removed items. ## Input [#input] | Property | Type | Required | Description | | -------------- | ---------- | -------- | ----------------------------------------------------- | | `projectId` | `string` | yes | UUID of the project. | | `submissionId` | `string` | yes | UUID of the submission. | | `itemPaths` | `string[]` | yes | Submission-relative item paths to remove. min items 1 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project." }, "submissionId": { "type": "string", "description": "UUID of the submission." }, "itemPaths": { "type": "array", "items": { "type": "string" }, "minItems": 1, "description": "Submission-relative item paths to remove." } }, "required": [ "projectId", "submissionId", "itemPaths" ], "additionalProperties": false } ``` # delete_tag (/docs/reference/mcp/delete_tag) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. DESTRUCTIVE — confirm with the user before calling. Restate the target (id + a human descriptor) and wait for explicit approval; do not invoke from inferred intent. No undo. Delete a tag from its owning resource (workspace or project). The tag is removed from every asset, folder, task, board, and submission it was applied to in one shot. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | ---------------- | | `tagId` | `string` | yes | UUID of the tag. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "tagId": { "type": "string", "description": "UUID of the tag." } }, "required": [ "tagId" ], "additionalProperties": false } ``` # delete_task_relation (/docs/reference/mcp/delete_task_relation) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. DESTRUCTIVE — confirm with the user before calling. Restate the target (id + a human descriptor) and wait for explicit approval; do not invoke from inferred intent. No undo. Remove a task↔chat or task↔message relation. The task itself and the linked chat / message survive — only the link goes away. Look the relation up first with `list_task_relations` to get its `relationId`. ## Input [#input] | Property | Type | Required | Description | | ------------ | -------- | -------- | ---------------------------------------------------------------- | | `taskId` | `string` | yes | UUID of the task. | | `relationId` | `string` | yes | UUID of the relation row to delete (from `list_task_relations`). | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "taskId": { "type": "string", "description": "UUID of the task." }, "relationId": { "type": "string", "description": "UUID of the relation row to delete (from `list_task_relations`)." } }, "required": [ "taskId", "relationId" ], "additionalProperties": false } ``` # download_assets (/docs/reference/mcp/download_assets) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Mint signed download URLs for one or more assets — the same URLs the Nurama web app's "Download" button uses. Use when the user asks for downloadable links to share. URLs expire after a few minutes; treat them as ephemeral. ## Input [#input] | Property | Type | Required | Description | | ---------- | ---------- | -------- | -------------------------------------------------- | | `assetIds` | `string[]` | yes | Array of asset UUIDs to mint URLs for. min items 1 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "assetIds": { "type": "array", "items": { "type": "string" }, "minItems": 1, "description": "Array of asset UUIDs to mint URLs for." } }, "required": [ "assetIds" ], "additionalProperties": false } ``` # follow_chat (/docs/reference/mcp/follow_chat) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Start following a chat — opts the caller in to real-time notifications for every new message in it. Use when the bot needs to react to ongoing activity in a chat it doesn't already participate in. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | ----------------- | | `chatId` | `string` | yes | UUID of the chat. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "chatId": { "type": "string", "description": "UUID of the chat." } }, "required": [ "chatId" ], "additionalProperties": false } ``` # follow_task (/docs/reference/mcp/follow_task) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Have the calling user follow a task — they will receive notifications about future activity on it. WRITE OPERATION but personal — only affects the calling user's notification subscriptions. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | --------------------------- | | `taskId` | `string` | yes | UUID of the task to follow. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "taskId": { "type": "string", "description": "UUID of the task to follow." } }, "required": [ "taskId" ], "additionalProperties": false } ``` # get_addable_chat_members (/docs/reference/mcp/get_addable_chat_members) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List users who can be invited to a member chat — already filtered by chat scope (workspace / project / social) and excluding current members. Use BEFORE `add_chat_members` so you only pass valid invitee UUIDs and skip a server-side 403. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | ------------------------ | | `chatId` | `string` | yes | UUID of the member chat. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "chatId": { "type": "string", "description": "UUID of the member chat." } }, "required": [ "chatId" ], "additionalProperties": false } ``` # get_ai_chat_topic (/docs/reference/mcp/get_ai_chat_topic) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Fetch a single AI chat topic by id. Returns the topic metadata (title, scope, archived state) plus its backing `chatId` — use that chatId with `list_chat_messages` to read the conversation, and with `send_message` to continue it. ## Input [#input] | Property | Type | Required | Description | | ------------- | -------- | -------- | -------------------------------------------- | | `topicId` | `string` | yes | UUID of the AI chat topic. | | `workspaceId` | `string` | yes | UUID of the workspace the topic lives under. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "topicId": { "type": "string", "description": "UUID of the AI chat topic." }, "workspaceId": { "type": "string", "description": "UUID of the workspace the topic lives under." } }, "required": [ "topicId", "workspaceId" ], "additionalProperties": false } ``` # get_asset (/docs/reference/mcp/get_asset) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Fetch a single asset's metadata by id — name, mediaType, sizeInBytes, status, tags, chats, etc. For just the file URLs (thumbnail / original / media variant), use `get_asset_files`. For multiple assets, use `list_project_assets` or `list_project_feed`. ## Input [#input] | Property | Type | Required | Description | | --------- | -------- | -------- | ------------------ | | `assetId` | `string` | yes | UUID of the asset. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "assetId": { "type": "string", "description": "UUID of the asset." } }, "required": [ "assetId" ], "additionalProperties": false } ``` # get_asset_access_activity (/docs/reference/mcp/get_asset_access_activity) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Read play / download access metrics for a single asset (totals + time-series). Use this for "who has watched / downloaded this?" or "how active is this asset?" This is the same data shown on the asset's Access tab in the Nurama web app. ## Input [#input] | Property | Type | Required | Description | | --------- | -------- | -------- | ------------------ | | `assetId` | `string` | yes | UUID of the asset. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "assetId": { "type": "string", "description": "UUID of the asset." } }, "required": [ "assetId" ], "additionalProperties": false } ``` # get_asset_files (/docs/reference/mcp/get_asset_files) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Get the file records of one functionType for an asset (e.g. `thumbnail`, `original`, `media`, `transcode-*`). Use this to discover the storage path and signed URLs needed to link to or download an asset variant. Different functionTypes return different file shapes. ## Input [#input] | Property | Type | Required | Description | | -------------- | -------- | -------- | --------------------------------------------------------------------------------------------------------- | | `assetId` | `string` | yes | UUID of the asset. | | `functionType` | `string` | yes | File function type — typically `thumbnail`, `original`, or `media`. Asset-type-specific values exist too. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "assetId": { "type": "string", "description": "UUID of the asset." }, "functionType": { "type": "string", "description": "File function type — typically `thumbnail`, `original`, or `media`. Asset-type-specific values exist too." } }, "required": [ "assetId", "functionType" ], "additionalProperties": false } ``` # get_board (/docs/reference/mcp/get_board) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Fetch a single board with its columns and tasks grouped per column. Use this to discover the `columnId` values you need for `move_task` or `create_task`, or to render a full board state. For just the task list without column structure, use `get_board_tasks`. For the project's board list, use `list_project_boards`. ## Input [#input] | Property | Type | Required | Description | | --------- | -------- | -------- | ------------------ | | `boardId` | `string` | yes | UUID of the board. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "boardId": { "type": "string", "description": "UUID of the board." } }, "required": [ "boardId" ], "additionalProperties": false } ``` # get_board_tasks (/docs/reference/mcp/get_board_tasks) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List tasks on one specific board, with optional column / status / assignee / tag filters. Use this when you already know the board you care about. For tasks across an entire project, use `list_project_tasks`. ## Input [#input] | Property | Type | Required | Description | | -------------- | ----------------------------------------------------- | -------- | ----------------------------------------------------- | | `boardId` | `string` | yes | UUID of the board. | | `columnId` | `string` | no | Restrict to one column on the board. | | `status` | `"pending" \| "inProgress" \| "complete" \| "closed"` | no | Restrict to one task status. | | `assignedToId` | `string` | no | Restrict to tasks assigned to one user. | | `search` | `string` | no | Case-insensitive substring match on the task subject. | | `tags` | `string[]` | no | Restrict to tasks carrying any of these tag UUIDs. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "boardId": { "type": "string", "description": "UUID of the board." }, "columnId": { "type": "string", "description": "Restrict to one column on the board." }, "status": { "type": "string", "enum": [ "pending", "inProgress", "complete", "closed" ], "description": "Restrict to one task status." }, "assignedToId": { "type": "string", "description": "Restrict to tasks assigned to one user." }, "search": { "type": "string", "description": "Case-insensitive substring match on the task subject." }, "tags": { "type": "array", "items": { "type": "string" }, "description": "Restrict to tasks carrying any of these tag UUIDs." } }, "required": [ "boardId" ], "additionalProperties": false } ``` # get_chat (/docs/reference/mcp/get_chat) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Fetch the metadata for a single chat: chatType (`topic` / `member` / `submission`), topicType (`project` / `asset` / `task` / etc.), topicId, visibility, and participant ids. Use this when you have a chatId and need to know what the chat is about before reading messages or replying. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | ----------------- | | `chatId` | `string` | yes | UUID of the chat. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "chatId": { "type": "string", "description": "UUID of the chat." } }, "required": [ "chatId" ], "additionalProperties": false } ``` # get_chat_by_topic_id (/docs/reference/mcp/get_chat_by_topic_id) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Resolve a topic id (asset, project, task, public) + visibility into the chat that hangs off it. Returns the chat with its `chatId`. Use this when you have an asset / task / project id but not the chatId — the inverse of `get_chat`. ## Input [#input] | Property | Type | Required | Description | | ------------ | -------------------------------------------- | -------- | ------------------------------------------------------------- | | `topicId` | `string` | yes | UUID of the topic resource (asset / project / task / public). | | `topicType` | `"project" \| "asset" \| "public" \| "task"` | yes | What kind of resource the topicId points at. | | `visibility` | `"creator" \| "reviewer" \| "public"` | yes | Which visibility tier of the chat to fetch. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "topicId": { "type": "string", "description": "UUID of the topic resource (asset / project / task / public)." }, "topicType": { "type": "string", "enum": [ "project", "asset", "public", "task" ], "description": "What kind of resource the topicId points at." }, "visibility": { "type": "string", "enum": [ "creator", "reviewer", "public" ], "description": "Which visibility tier of the chat to fetch." } }, "required": [ "topicId", "topicType", "visibility" ], "additionalProperties": false } ``` # get_convo (/docs/reference/mcp/get_convo) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Fetch a single live conversation (video / audio huddle) by id. Returns subject, status, host chat reference, participants, recordings / transcripts (asset refs only, no signed URLs), timing. Use this to inspect a finished convo before linking its recording into a chat, or to confirm a convo is still active before joining. ## Input [#input] | Property | Type | Required | Description | | --------- | -------- | -------- | ------------------ | | `convoId` | `string` | yes | UUID of the convo. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "convoId": { "type": "string", "description": "UUID of the convo." } }, "required": [ "convoId" ], "additionalProperties": false } ``` # get_folder (/docs/reference/mcp/get_folder) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Fetch a single folder's metadata by id — name, parent folderId, path, owner project, etc. For the folder's contents, use `list_folder_assets`. For project-root folder listing, use `list_items_at_path`. ## Input [#input] | Property | Type | Required | Description | | ---------- | -------- | -------- | ------------------- | | `folderId` | `string` | yes | UUID of the folder. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "folderId": { "type": "string", "description": "UUID of the folder." } }, "required": [ "folderId" ], "additionalProperties": false } ``` # get_member_chat (/docs/reference/mcp/get_member_chat) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Fetch a single member chat (DM / group chat) by id. Returns subject, color, scope, members, archived state. Use to verify a member chat exists and the caller participates in it before posting via `send_message`. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | ------------------------ | | `chatId` | `string` | yes | UUID of the member chat. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "chatId": { "type": "string", "description": "UUID of the member chat." } }, "required": [ "chatId" ], "additionalProperties": false } ``` # get_message (/docs/reference/mcp/get_message) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Fetch a single chat message by id, including attachments, mentions, and reply metadata. Use this when a chat / search surfaced a messageId you need full detail on (typical case: looking up the message the user is replying to before crafting a response). ## Input [#input] | Property | Type | Required | Description | | ----------- | -------- | -------- | ------------------------- | | `messageId` | `string` | yes | UUID of the chat message. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "messageId": { "type": "string", "description": "UUID of the chat message." } }, "required": [ "messageId" ], "additionalProperties": false } ``` # get_new_notification_count (/docs/reference/mcp/get_new_notification_count) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Return the count of new (unread) notifications across the given channels — the cheapest probe to decide whether it's worth paging through `list_new_notifications`. Optional type filter narrows the count. ## Input [#input] | Property | Type | Required | Description | | ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------ | | `channels` | `string[]` | yes | Channel strings to count from. Examples: `user/`, `workspace/`, `project//`. min items 1 | | `types` | `string[]` | no | Optional notification type filter. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "channels": { "type": "array", "items": { "type": "string" }, "minItems": 1, "description": "Channel strings to count from. Examples: `user/`, `workspace/`, `project//`." }, "types": { "type": "array", "items": { "type": "string" }, "description": "Optional notification type filter." } }, "required": [ "channels" ], "additionalProperties": false } ``` # get_project (/docs/reference/mcp/get_project) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Fetch a single project's metadata — name, slug, description, logo, workspaceId, status. Use this to resolve a `projectId` (from `list_my_memberships`) into something the human will recognise, or to confirm a project belongs to a specific workspace before acting. ## Input [#input] | Property | Type | Required | Description | | ----------- | -------- | -------- | -------------------- | | `projectId` | `string` | yes | UUID of the project. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project." } }, "required": [ "projectId" ], "additionalProperties": false } ``` # get_project_chat (/docs/reference/mcp/get_project_chat) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Resolve the project-level chat for one visibility tier (creator or reviewer). Returns the chat with its `chatId` — needed before `list_chat_messages` or `send_message` against the project chat. Per-project there is one creator chat and one reviewer chat; this single tool covers both. ## Input [#input] | Property | Type | Required | Description | | ------------ | ------------------------- | -------- | ---------------------------------------- | | `projectId` | `string` | yes | UUID of the project. | | `visibility` | `"creator" \| "reviewer"` | yes | Which tier of the project chat to fetch. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project." }, "visibility": { "type": "string", "enum": [ "creator", "reviewer" ], "description": "Which tier of the project chat to fetch." } }, "required": [ "projectId", "visibility" ], "additionalProperties": false } ``` # get_public_download_url (/docs/reference/mcp/get_public_download_url) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Return a signed download URL for a public-download token — what a `nurma.link` page actually redirects to when the user clicks Download. Use to fetch the underlying file programmatically when you only have the public token. Public endpoint — no auth required. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | --------------------------------------- | | `token` | `string` | yes | The 10-character public download token. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "token": { "type": "string", "description": "The 10-character public download token." } }, "required": [ "token" ], "additionalProperties": false } ``` # get_replies (/docs/reference/mcp/get_replies) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Load the threaded replies under one message. `list_chat_messages` excludes replies by default; use this to drill into a specific thread. ## Input [#input] | Property | Type | Required | Description | | ----------- | -------- | -------- | ------------------------------------------- | | `messageId` | `string` | yes | UUID of the parent message. | | `limit` | `number` | no | Page size (1-50, default 20). min 1. max 50 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "messageId": { "type": "string", "description": "UUID of the parent message." }, "limit": { "type": "number", "minimum": 1, "maximum": 50, "description": "Page size (1-50, default 20)." } }, "required": [ "messageId" ], "additionalProperties": false } ``` # get_self (/docs/reference/mcp/get_self) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Get the bot's own public profile — id, displayName, avatar, color, accountType. Use this at startup or when the user asks "who am I?" / "what's my user id?". (Resolved from the bot's own memberships — bot credentials have no direct self-profile endpoint.) ## Input [#input] *This tool takes no input.* ## JSON Schema [#json-schema] ```json { "type": "object", "properties": {}, "additionalProperties": false } ``` # get_submission (/docs/reference/mcp/get_submission) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Fetch a single submission package by id, including its metadata. Use this after `list_submissions` to drill into one submission's contents. ## Input [#input] | Property | Type | Required | Description | | -------------- | -------- | -------- | ---------------------------------------------- | | `projectId` | `string` | yes | UUID of the project the submission belongs to. | | `submissionId` | `string` | yes | UUID of the submission. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project the submission belongs to." }, "submissionId": { "type": "string", "description": "UUID of the submission." } }, "required": [ "projectId", "submissionId" ], "additionalProperties": false } ``` # get_task_links (/docs/reference/mcp/get_task_links) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List every task-link record attached to a single task — i.e. which other tasks it is related to, blocks, is blocked by, or duplicates. Each result includes the link type and the linked task's id. Use this to discover dependency chains before triaging a task or before adding a new link. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | -------------------------------------- | | `taskId` | `string` | yes | UUID of the task whose links to fetch. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "taskId": { "type": "string", "description": "UUID of the task whose links to fetch." } }, "required": [ "taskId" ], "additionalProperties": false } ``` # get_unacknowledged_task_count (/docs/reference/mcp/get_unacknowledged_task_count) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Return the count of tasks assigned to the calling identity that have not yet been acknowledged, scoped to a project. Use as a cheap "anything new for me here?" probe before paging through `list_my_tasks`. ## Input [#input] | Property | Type | Required | Description | | ----------- | -------- | -------- | -------------------- | | `projectId` | `string` | yes | UUID of the project. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project." } }, "required": [ "projectId" ], "additionalProperties": false } ``` # get_workspace (/docs/reference/mcp/get_workspace) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Fetch a single workspace's metadata by id — name, slug, color, description, settings (including AI feature toggles), status. Use this to surface workspace-level info or to inspect which AI features are enabled before attempting AI-gated actions. ## Input [#input] | Property | Type | Required | Description | | ------------- | -------- | -------- | ---------------------- | | `workspaceId` | `string` | yes | UUID of the workspace. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "workspaceId": { "type": "string", "description": "UUID of the workspace." } }, "required": [ "workspaceId" ], "additionalProperties": false } ``` # highlight_message (/docs/reference/mcp/highlight_message) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Pin / highlight a message in its chat — surfaces it in the highlights list and visually flags it in the timeline. Use to mark a decision, an answer, or a key piece of context worth preserving. ## Input [#input] | Property | Type | Required | Description | | ----------- | -------- | -------- | --------------------------------- | | `messageId` | `string` | yes | UUID of the message to highlight. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "messageId": { "type": "string", "description": "UUID of the message to highlight." } }, "required": [ "messageId" ], "additionalProperties": false } ``` # MCP tools (/docs/reference/mcp) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Every tool below is served by the Nurama MCP server (see the [MCP guide](/docs/guides/mcp) for setup). Tool names, descriptions and input schemas are exactly what the server returns from `tools/list`; the raw catalogue is available at [`/mcp-tools.json`](/mcp-tools.json). | Tool | Mutating | Summary | | -------------------------------------------------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [`acknowledge_task`](/docs/reference/mcp/acknowledge_task) | yes | Toggle the calling user's acknowledgement of a task (mark as seen, or un-mark). | | [`add_chat_members`](/docs/reference/mcp/add_chat_members) | yes | Invite users to a member chat — turns a 1:1 DM into a group chat, or grows an existing group. | | [`add_column`](/docs/reference/mcp/add_column) | yes | Append a new column to a board. | | [`add_existing_task_to_board`](/docs/reference/mcp/add_existing_task_to_board) | yes | Attach an existing task to a board (e.g. | | [`add_items_to_submission`](/docs/reference/mcp/add_items_to_submission) | yes | Add creator-tier paths to an existing submission. | | [`archive_member_chat`](/docs/reference/mcp/archive_member_chat) | yes | Archive a member chat — hides it from the active list without losing history. | | [`complete_convo`](/docs/reference/mcp/complete_convo) | yes | End a live conversation for everyone — closes the Daily.co room, stamps `endedAt`, transitions status to `completed`, and triggers recording / transcript post-processing if those features were enabled | | [`create_ai_chat_topic`](/docs/reference/mcp/create_ai_chat_topic) | yes | Create a new (empty) AI chat topic — one of Nu's LLM-assistant conversations. | | [`create_asset_short_link`](/docs/reference/mcp/create_asset_short_link) | yes | Mint a deep-linkable short URL for an asset. | | [`create_board`](/docs/reference/mcp/create_board) | yes | Create a kanban board in a project. | | [`create_folder`](/docs/reference/mcp/create_folder) | yes | Create a folder inside a project. | | [`create_member_chat`](/docs/reference/mcp/create_member_chat) | yes | Start a private member chat — 1:1 DM (one memberId) or group chat (multiple memberIds). | | [`create_message_short_link`](/docs/reference/mcp/create_message_short_link) | yes | Mint a deep-linkable short URL for a chat message. | | [`create_reaction`](/docs/reference/mcp/create_reaction) | yes | Add an emoji reaction to a message. | | [`create_submission`](/docs/reference/mcp/create_submission) | yes | Bundle a set of items at given creator-tier paths into a submission for reviewer review. | | [`create_tag`](/docs/reference/mcp/create_tag) | yes | Mint a new tag on a workspace or project. | | [`create_task`](/docs/reference/mcp/create_task) | yes | Create a new task on a board. | | [`create_task_relation`](/docs/reference/mcp/create_task_relation) | yes | Attach a task to a chat or a chat message — establishes the "this task came from / belongs to this conversation" link that the Nurama web app renders as a task card in the conversation. | | [`delete_ai_chat_topic`](/docs/reference/mcp/delete_ai_chat_topic) | yes | DESTRUCTIVE — confirm with the user before calling. | | [`delete_asset`](/docs/reference/mcp/delete_asset) | yes | DESTRUCTIVE — confirm with the user before calling. | | [`delete_board`](/docs/reference/mcp/delete_board) | yes | DESTRUCTIVE — confirm with the user before calling. | | [`delete_chat`](/docs/reference/mcp/delete_chat) | yes | DESTRUCTIVE — confirm with the user before calling. | | [`delete_column`](/docs/reference/mcp/delete_column) | yes | DESTRUCTIVE — confirm with the user before calling. | | [`delete_convo`](/docs/reference/mcp/delete_convo) | yes | DESTRUCTIVE — confirm with the user before calling. | | [`delete_folder`](/docs/reference/mcp/delete_folder) | yes | DESTRUCTIVE — confirm with the user before calling. | | [`delete_items_at_path`](/docs/reference/mcp/delete_items_at_path) | yes | DESTRUCTIVE — confirm with the user before calling. | | [`delete_member_chat`](/docs/reference/mcp/delete_member_chat) | yes | DESTRUCTIVE — confirm with the user before calling. | | [`delete_message`](/docs/reference/mcp/delete_message) | yes | DESTRUCTIVE — confirm with the user before calling. | | [`delete_submission_items`](/docs/reference/mcp/delete_submission_items) | yes | DESTRUCTIVE — confirm with the user before calling. | | [`delete_tag`](/docs/reference/mcp/delete_tag) | yes | DESTRUCTIVE — confirm with the user before calling. | | [`delete_task_relation`](/docs/reference/mcp/delete_task_relation) | yes | DESTRUCTIVE — confirm with the user before calling. | | [`download_assets`](/docs/reference/mcp/download_assets) | no | Mint signed download URLs for one or more assets — the same URLs the Nurama web app's "Download" button uses. | | [`follow_chat`](/docs/reference/mcp/follow_chat) | yes | Start following a chat — opts the caller in to real-time notifications for every new message in it. | | [`follow_task`](/docs/reference/mcp/follow_task) | yes | Have the calling user follow a task — they will receive notifications about future activity on it. | | [`get_addable_chat_members`](/docs/reference/mcp/get_addable_chat_members) | no | List users who can be invited to a member chat — already filtered by chat scope (workspace / project / social) and excluding current members. | | [`get_ai_chat_topic`](/docs/reference/mcp/get_ai_chat_topic) | no | Fetch a single AI chat topic by id. | | [`get_asset`](/docs/reference/mcp/get_asset) | no | Fetch a single asset's metadata by id — name, mediaType, sizeInBytes, status, tags, chats, etc. | | [`get_asset_access_activity`](/docs/reference/mcp/get_asset_access_activity) | no | Read play / download access metrics for a single asset (totals + time-series). | | [`get_asset_files`](/docs/reference/mcp/get_asset_files) | no | Get the file records of one functionType for an asset (e.g. | | [`get_board`](/docs/reference/mcp/get_board) | no | Fetch a single board with its columns and tasks grouped per column. | | [`get_board_tasks`](/docs/reference/mcp/get_board_tasks) | no | List tasks on one specific board, with optional column / status / assignee / tag filters. | | [`get_chat`](/docs/reference/mcp/get_chat) | no | Fetch the metadata for a single chat: chatType (`topic` / `member` / `submission`), topicType (`project` / `asset` / `task` / etc.), topicId, visibility, and participant ids. | | [`get_chat_by_topic_id`](/docs/reference/mcp/get_chat_by_topic_id) | no | Resolve a topic id (asset, project, task, public) + visibility into the chat that hangs off it. | | [`get_convo`](/docs/reference/mcp/get_convo) | no | Fetch a single live conversation (video / audio huddle) by id. | | [`get_folder`](/docs/reference/mcp/get_folder) | no | Fetch a single folder's metadata by id — name, parent folderId, path, owner project, etc. | | [`get_member_chat`](/docs/reference/mcp/get_member_chat) | no | Fetch a single member chat (DM / group chat) by id. | | [`get_message`](/docs/reference/mcp/get_message) | no | Fetch a single chat message by id, including attachments, mentions, and reply metadata. | | [`get_new_notification_count`](/docs/reference/mcp/get_new_notification_count) | no | Return the count of new (unread) notifications across the given channels — the cheapest probe to decide whether it's worth paging through `list_new_notifications`. | | [`get_project`](/docs/reference/mcp/get_project) | no | Fetch a single project's metadata — name, slug, description, logo, workspaceId, status. | | [`get_project_chat`](/docs/reference/mcp/get_project_chat) | no | Resolve the project-level chat for one visibility tier (creator or reviewer). | | [`get_public_download_url`](/docs/reference/mcp/get_public_download_url) | no | Return a signed download URL for a public-download token — what a `nurma.link` page actually redirects to when the user clicks Download. | | [`get_replies`](/docs/reference/mcp/get_replies) | no | Load the threaded replies under one message. | | [`get_self`](/docs/reference/mcp/get_self) | no | Get the bot's own public profile — id, displayName, avatar, color, accountType. | | [`get_submission`](/docs/reference/mcp/get_submission) | no | Fetch a single submission package by id, including its metadata. | | [`get_task_links`](/docs/reference/mcp/get_task_links) | no | List every task-link record attached to a single task — i.e. | | [`get_unacknowledged_task_count`](/docs/reference/mcp/get_unacknowledged_task_count) | no | Return the count of tasks assigned to the calling identity that have not yet been acknowledged, scoped to a project. | | [`get_workspace`](/docs/reference/mcp/get_workspace) | no | Fetch a single workspace's metadata by id — name, slug, color, description, settings (including AI feature toggles), status. | | [`highlight_message`](/docs/reference/mcp/highlight_message) | yes | Pin / highlight a message in its chat — surfaces it in the highlights list and visually flags it in the timeline. | | [`join_convo`](/docs/reference/mcp/join_convo) | yes | Join an active live conversation. | | [`leave_convo`](/docs/reference/mcp/leave_convo) | yes | Leave a convo while it stays active for the other participants. | | [`link_task`](/docs/reference/mcp/link_task) | yes | Create a relationship between two tasks (related, blocks, blockedBy, duplicate). | | [`list_ai_chat_topics`](/docs/reference/mcp/list_ai_chat_topics) | no | List the caller's AI chat topics (Nu — Nurama's LLM assistant — conversations, separate from project chats). | | [`list_chat_messages`](/docs/reference/mcp/list_chat_messages) | no | List recent messages in a chat, newest first. | | [`list_chat_task_relations`](/docs/reference/mcp/list_chat_task_relations) | no | List task relations anchored in a chat — every task that was created from a message in this chat, or otherwise linked to it. | | [`list_folder_assets`](/docs/reference/mcp/list_folder_assets) | no | List the assets directly inside a folder. | | [`list_items_at_path`](/docs/reference/mcp/list_items_at_path) | no | List the file-system items (folders and assets, intermingled) at a path in a project's virtual file system. | | [`list_mentionable_assets`](/docs/reference/mcp/list_mentionable_assets) | no | List assets that can be referenced via `{{assetMention:UUID}}` tokens in a message in this chat. | | [`list_mentionable_folders`](/docs/reference/mcp/list_mentionable_folders) | no | List folders the caller can `{{folderMention:UUID}}` in this chat — already scope-filtered to the chat's visibility tier. | | [`list_mentionable_tasks`](/docs/reference/mcp/list_mentionable_tasks) | no | List tasks that can be referenced via `{{taskMention:UUID}}` tokens in a message in this chat. | | [`list_message_task_relations`](/docs/reference/mcp/list_message_task_relations) | no | List task relations attached to one chat message — every task that was created from this message or otherwise linked to it. | | [`list_my_member_chats`](/docs/reference/mcp/list_my_member_chats) | no | List the caller's member chats — 1:1 DMs and group chats. | | [`list_my_memberships`](/docs/reference/mcp/list_my_memberships) | no | List every workspace, project, and chat the bot user is a member of, with the roles granted on each. | | [`list_my_mentions`](/docs/reference/mcp/list_my_mentions) | no | List chat messages that mention the calling user, across every chat the user can see. | | [`list_my_tasks`](/docs/reference/mcp/list_my_tasks) | no | List tasks assigned to the bot user (or, in DANGEROUSLY\_USE\_USER\_JWT mode, to the human user). | | [`list_new_notifications`](/docs/reference/mcp/list_new_notifications) | no | List notifications NEW since the caller's last-seen timestamp on the given channels. | | [`list_notifications`](/docs/reference/mcp/list_notifications) | no | List notifications on one or more channels (cursor paginated). | | [`list_project_assets`](/docs/reference/mcp/list_project_assets) | no | Flat list of assets in a project, scoped to one visibility tier. | | [`list_project_boards`](/docs/reference/mcp/list_project_boards) | no | List the boards in a project, optionally filtered to one visibility tier. | | [`list_project_feed`](/docs/reference/mcp/list_project_feed) | no | List recent assets in a project, scoped to one visibility tier (`creator` or `reviewer`). | | [`list_project_memberships`](/docs/reference/mcp/list_project_memberships) | no | List every user who has any membership in this project, with their roles. | | [`list_project_mentionable_users`](/docs/reference/mcp/list_project_mentionable_users) | no | List users who can be @-mentioned in a project chat at the given visibility tier. | | [`list_project_tasks`](/docs/reference/mcp/list_project_tasks) | no | List tasks across a project, with optional filters by board, column, status, assignee, or substring search on the subject. | | [`list_scope_convos`](/docs/reference/mcp/list_scope_convos) | no | List live conversations attached to a scope (a project today) at the given visibility tier(s). | | [`list_submissions`](/docs/reference/mcp/list_submissions) | no | List submission packages in a project. | | [`list_tags`](/docs/reference/mcp/list_tags) | no | List every tag defined for an owner resource — project or workspace. | | [`list_task_events`](/docs/reference/mcp/list_task_events) | no | List the audit / activity events for a single task — status changes, assignments, column moves, comments, etc. | | [`list_task_relations`](/docs/reference/mcp/list_task_relations) | no | List the chat / message relations attached to a task. | | [`list_workspace_projects`](/docs/reference/mcp/list_workspace_projects) | no | List every project in a workspace the bot can see — name, slug, id, status. | | [`move_task`](/docs/reference/mcp/move_task) | yes | Move a task. | | [`publish_items`](/docs/reference/mcp/publish_items) | yes | Publish (creator → reviewer tier) one or more resources by id. | | [`rejoin_convo`](/docs/reference/mcp/rejoin_convo) | yes | Re-enter a convo as an already-active participant. | | [`remove_attachment`](/docs/reference/mcp/remove_attachment) | yes | Remove a single asset attachment from a chat message. | | [`remove_chat_members`](/docs/reference/mcp/remove_chat_members) | yes | Remove users from a member chat. | | [`remove_reaction`](/docs/reference/mcp/remove_reaction) | yes | Remove the caller's reaction from a message. | | [`remove_task_from_board`](/docs/reference/mcp/remove_task_from_board) | yes | Detach a task from its board without deleting the task. | | [`reorder_columns`](/docs/reference/mcp/reorder_columns) | yes | Bulk-assign new sort orders to columns on a board. | | [`repair_assets`](/docs/reference/mcp/repair_assets) | yes | Re-trigger post-processing (thumbnails, transcoding, metadata extraction) for one or more assets. | | [`resolve_public_download`](/docs/reference/mcp/resolve_public_download) | no | Resolve a public-download token (the 10-character code at the end of a nurma.link download URL) to minimal file metadata — `fileName`, `mediaType`, `status`. | | [`resolve_shortlink`](/docs/reference/mcp/resolve_shortlink) | no | Resolve a Nurama short-link code (the trailing segment of a [https://nurma.link/](https://nurma.link/)... | | [`revise_message`](/docs/reference/mcp/revise_message) | yes | Edit a chat message. | | [`send_message`](/docs/reference/mcp/send_message) | yes | Post a new chat message as the bot user. | | [`start_convo`](/docs/reference/mcp/start_convo) | yes | Start a new live conversation (video or audio huddle) anchored in a chat. | | [`tag_asset`](/docs/reference/mcp/tag_asset) | yes | Apply a tag to an asset. | | [`tag_board`](/docs/reference/mcp/tag_board) | yes | Apply a tag to a board. | | [`tag_folder`](/docs/reference/mcp/tag_folder) | yes | Apply a tag to a folder. | | [`tag_submission`](/docs/reference/mcp/tag_submission) | yes | Apply a tag to a submission. | | [`tag_task`](/docs/reference/mcp/tag_task) | yes | Attach a project-scoped tag to a task. | | [`unarchive_member_chat`](/docs/reference/mcp/unarchive_member_chat) | yes | Restore an archived member chat to the active list. | | [`unfollow_chat`](/docs/reference/mcp/unfollow_chat) | yes | Stop following a chat. | | [`unfollow_task`](/docs/reference/mcp/unfollow_task) | yes | Have the calling user stop following a task — no further notifications about its activity. | | [`unhighlight_message`](/docs/reference/mcp/unhighlight_message) | yes | Remove the highlight / pin from a message. | | [`unlink_task`](/docs/reference/mcp/unlink_task) | yes | Remove an existing relationship between two tasks. | | [`unpublish_items`](/docs/reference/mcp/unpublish_items) | yes | Unpublish (remove from reviewer tier) one or more resources. | | [`untag_asset`](/docs/reference/mcp/untag_asset) | yes | Remove a tag from an asset. | | [`untag_board`](/docs/reference/mcp/untag_board) | yes | Remove a tag from a board. | | [`untag_folder`](/docs/reference/mcp/untag_folder) | yes | Remove a tag from a folder. | | [`untag_submission`](/docs/reference/mcp/untag_submission) | yes | Remove a tag from a submission. | | [`untag_task`](/docs/reference/mcp/untag_task) | yes | Remove a project-scoped tag from a task. | | [`update_ai_chat_topic`](/docs/reference/mcp/update_ai_chat_topic) | yes | Rename an AI chat topic or toggle its archived state. | | [`update_asset`](/docs/reference/mcp/update_asset) | yes | Update an asset's name, folder placement, or metadata. | | [`update_board`](/docs/reference/mcp/update_board) | yes | Rename, redescribe, retier, archive, or reorder a board. | | [`update_chat_subject`](/docs/reference/mcp/update_chat_subject) | yes | Rename a chat. | | [`update_column`](/docs/reference/mcp/update_column) | yes | Rename, recolor, retag, or reposition a single board column. | | [`update_convo`](/docs/reference/mcp/update_convo) | yes | Rename a convo or update its notes. | | [`update_folder_name`](/docs/reference/mcp/update_folder_name) | yes | Rename a folder. | | [`update_member_chat`](/docs/reference/mcp/update_member_chat) | yes | Update a member chat's subject or color. | | [`update_project`](/docs/reference/mcp/update_project) | yes | Rename or redescribe a project. | | [`update_submission`](/docs/reference/mcp/update_submission) | yes | Rename / redescribe / re-version a submission. | | [`update_tag`](/docs/reference/mcp/update_tag) | yes | Rename or recolor a tag. | | [`update_task_details`](/docs/reference/mcp/update_task_details) | yes | Update a task's subject, description, or assignee. | | [`update_task_status`](/docs/reference/mcp/update_task_status) | yes | Set a task's top-level status to `pending`, `complete`, or `cancelled`. | # join_convo (/docs/reference/mcp/join_convo) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Join an active live conversation. Returns the convo + a Daily.co meeting token the client uses to enter the room. Sends "user joined" notifications to other participants. Use `rejoin_convo` instead for page-refresh / reconnect flows so notifications are not re-fired. ## Input [#input] | Property | Type | Required | Description | | --------- | -------- | -------- | ------------------ | | `convoId` | `string` | yes | UUID of the convo. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "convoId": { "type": "string", "description": "UUID of the convo." } }, "required": [ "convoId" ], "additionalProperties": false } ``` # leave_convo (/docs/reference/mcp/leave_convo) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Leave a convo while it stays active for the other participants. The caller is removed from `activeParticipants` but remains in `allParticipants` for audit. Use to end the bot's presence without ending the call. ## Input [#input] | Property | Type | Required | Description | | --------- | -------- | -------- | ------------------ | | `convoId` | `string` | yes | UUID of the convo. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "convoId": { "type": "string", "description": "UUID of the convo." } }, "required": [ "convoId" ], "additionalProperties": false } ``` # link_task (/docs/reference/mcp/link_task) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Create a relationship between two tasks (related, blocks, blockedBy, duplicate). WRITE OPERATION. Both tasks must be visible to the bot. Use this when the user wants to track dependencies between tasks ("X is blocked by Y", "Z duplicates W"). ## Input [#input] | Property | Type | Required | Description | | -------------- | ----------------------------------------------------- | -------- | ------------------------------------------------------------ | | `taskId` | `string` | yes | UUID of the source task — the one the relationship lives on. | | `linkedTaskId` | `string` | yes | UUID of the target task being linked. | | `linkType` | `"related" \| "blocks" \| "blockedBy" \| "duplicate"` | no | Relationship type. Defaults to `related` if omitted. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "taskId": { "type": "string", "description": "UUID of the source task — the one the relationship lives on." }, "linkedTaskId": { "type": "string", "description": "UUID of the target task being linked." }, "linkType": { "type": "string", "enum": [ "related", "blocks", "blockedBy", "duplicate" ], "description": "Relationship type. Defaults to `related` if omitted." } }, "required": [ "taskId", "linkedTaskId" ], "additionalProperties": false } ``` # list_ai_chat_topics (/docs/reference/mcp/list_ai_chat_topics) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List the caller's AI chat topics (Nu — Nurama's LLM assistant — conversations, separate from project chats). Each topic is scoped: `workspace` topics span every project in the workspace; `project` topics are bound to one project; `social` topics are personal (no resource backing). Topics are private to their creator. Messages inside a topic flow through the regular `list_chat_messages` against `topic.chatId`. ## Input [#input] | Property | Type | Required | Description | | ------------- | -------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------- | | `workspaceId` | `string` | yes | UUID of the workspace. Required for every scope. | | `scopeType` | `"workspace" \| "project" \| "social"` | yes | Topic scope. | | `scopeId` | `string` | no | UUID of the workspace or project the topic is scoped to. Required when `scopeType` is `workspace` or `project`; omit for `social`. | | `archived` | `boolean` | no | Include archived topics. Defaults to active-only. | | `limit` | `number` | no | Page size (1-50, default 20). min 1. max 50 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "workspaceId": { "type": "string", "description": "UUID of the workspace. Required for every scope." }, "scopeType": { "type": "string", "enum": [ "workspace", "project", "social" ], "description": "Topic scope." }, "scopeId": { "type": "string", "description": "UUID of the workspace or project the topic is scoped to. Required when `scopeType` is `workspace` or `project`; omit for `social`." }, "archived": { "type": "boolean", "description": "Include archived topics. Defaults to active-only." }, "limit": { "type": "number", "minimum": 1, "maximum": 50, "description": "Page size (1-50, default 20)." } }, "required": [ "workspaceId", "scopeType" ], "additionalProperties": false } ``` # list_chat_messages (/docs/reference/mcp/list_chat_messages) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List recent messages in a chat, newest first. Use this to read context before composing a reply, to summarise a discussion, or to find the messageId for a follow-up tool. Default cap is 20 messages; raise only when summarising long threads. ## Input [#input] | Property | Type | Required | Description | | ---------------- | --------- | -------- | ---------------------------------------------------------------------------------- | | `chatId` | `string` | yes | UUID of the chat to read. | | `limit` | `number` | no | Number of messages (1-50, default 20). min 1. max 50 | | `excludeReplies` | `boolean` | no | When true, skip threaded replies and return only top-level messages. Default true. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "chatId": { "type": "string", "description": "UUID of the chat to read." }, "limit": { "type": "number", "minimum": 1, "maximum": 50, "description": "Number of messages (1-50, default 20)." }, "excludeReplies": { "type": "boolean", "description": "When true, skip threaded replies and return only top-level messages. Default true." } }, "required": [ "chatId" ], "additionalProperties": false } ``` # list_chat_task_relations (/docs/reference/mcp/list_chat_task_relations) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List task relations anchored in a chat — every task that was created from a message in this chat, or otherwise linked to it. Use to answer "what tasks came out of this chat?" before reading the message history itself. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | ------------------------------------------- | | `chatId` | `string` | yes | UUID of the chat. | | `limit` | `number` | no | Page size (1-50, default 20). min 1. max 50 | | `page` | `number` | no | Page number (index pagination). min 1 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "chatId": { "type": "string", "description": "UUID of the chat." }, "limit": { "type": "number", "minimum": 1, "maximum": 50, "description": "Page size (1-50, default 20)." }, "page": { "type": "number", "minimum": 1, "description": "Page number (index pagination)." } }, "required": [ "chatId" ], "additionalProperties": false } ``` # list_folder_assets (/docs/reference/mcp/list_folder_assets) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List the assets directly inside a folder. Does not recurse into sub-folders — for hierarchy walks, use `list_items_at_path`. ## Input [#input] | Property | Type | Required | Description | | ---------- | -------- | -------- | ------------------------------------------- | | `folderId` | `string` | yes | UUID of the folder. | | `limit` | `number` | no | Page size (1-50, default 20). min 1. max 50 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "folderId": { "type": "string", "description": "UUID of the folder." }, "limit": { "type": "number", "minimum": 1, "maximum": 50, "description": "Page size (1-50, default 20)." } }, "required": [ "folderId" ], "additionalProperties": false } ``` # list_items_at_path (/docs/reference/mcp/list_items_at_path) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List the file-system items (folders and assets, intermingled) at a path in a project's virtual file system. Use this to navigate the project's folder tree. Omit `path` for the root. The path format mirrors `project/{projectId}/{visibility}/folder1/folder2/asset.jpg` — pass the in-project segments only (no leading project/visibility). ## Input [#input] | Property | Type | Required | Description | | ------------ | ------------------------- | -------- | -------------------------------------------------------- | | `projectId` | `string` | yes | UUID of the project. | | `visibility` | `"creator" \| "reviewer"` | yes | Which visibility tier of the file system to list. | | `path` | `string` | no | Slash-separated path inside the project (omit for root). | | `limit` | `number` | no | Page size (1-50, default 20). min 1. max 50 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project." }, "visibility": { "type": "string", "enum": [ "creator", "reviewer" ], "description": "Which visibility tier of the file system to list." }, "path": { "type": "string", "description": "Slash-separated path inside the project (omit for root)." }, "limit": { "type": "number", "minimum": 1, "maximum": 50, "description": "Page size (1-50, default 20)." } }, "required": [ "projectId", "visibility" ], "additionalProperties": false } ``` # list_mentionable_assets (/docs/reference/mcp/list_mentionable_assets) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List assets that can be referenced via `{{assetMention:UUID}}` tokens in a message in this chat. Use this BEFORE `send_message` when composing a message that should embed asset chips — it filters by what the chat's scope can see, so the resulting message won't reference an asset the readers cannot access. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | ----------------------------------------------- | | `chatId` | `string` | yes | UUID of the chat the message will be posted in. | | `search` | `string` | no | Case-insensitive substring match on asset name. | | `limit` | `number` | no | Page size (1-50, default 20). min 1. max 50 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "chatId": { "type": "string", "description": "UUID of the chat the message will be posted in." }, "search": { "type": "string", "description": "Case-insensitive substring match on asset name." }, "limit": { "type": "number", "minimum": 1, "maximum": 50, "description": "Page size (1-50, default 20)." } }, "required": [ "chatId" ], "additionalProperties": false } ``` # list_mentionable_folders (/docs/reference/mcp/list_mentionable_folders) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List folders the caller can `{{folderMention:UUID}}` in this chat — already scope-filtered to the chat's visibility tier. Use BEFORE `send_message` / `revise_message` when the message references a folder, so the mention renders as a clickable token instead of plain text. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | ----------------------------------------------- | | `chatId` | `string` | yes | UUID of the chat the mention will be posted in. | | `limit` | `number` | no | Page size (1-50, default 20). min 1. max 50 | | `search` | `string` | no | Optional substring match on folder name. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "chatId": { "type": "string", "description": "UUID of the chat the mention will be posted in." }, "limit": { "type": "number", "minimum": 1, "maximum": 50, "description": "Page size (1-50, default 20)." }, "search": { "type": "string", "description": "Optional substring match on folder name." } }, "required": [ "chatId" ], "additionalProperties": false } ``` # list_mentionable_tasks (/docs/reference/mcp/list_mentionable_tasks) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List tasks that can be referenced via `{{taskMention:UUID}}` tokens in a message in this chat. Use BEFORE `send_message` when composing a message that should embed task cards. Filtered by the chat's scope, so the resulting message won't reference tasks readers cannot access. Requires the Boards add-on on the workspace. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | ------------------------------------------------- | | `chatId` | `string` | yes | UUID of the chat the message will be posted in. | | `search` | `string` | no | Case-insensitive substring match on task subject. | | `limit` | `number` | no | Page size (1-50, default 20). min 1. max 50 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "chatId": { "type": "string", "description": "UUID of the chat the message will be posted in." }, "search": { "type": "string", "description": "Case-insensitive substring match on task subject." }, "limit": { "type": "number", "minimum": 1, "maximum": 50, "description": "Page size (1-50, default 20)." } }, "required": [ "chatId" ], "additionalProperties": false } ``` # list_message_task_relations (/docs/reference/mcp/list_message_task_relations) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List task relations attached to one chat message — every task that was created from this message or otherwise linked to it. Use after `get_message` when you need to know whether the message already produced tasks before suggesting `create_task` again. ## Input [#input] | Property | Type | Required | Description | | ----------- | -------- | -------- | ------------------------------------------- | | `messageId` | `string` | yes | UUID of the message. | | `limit` | `number` | no | Page size (1-50, default 20). min 1. max 50 | | `page` | `number` | no | Page number (index pagination). min 1 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "messageId": { "type": "string", "description": "UUID of the message." }, "limit": { "type": "number", "minimum": 1, "maximum": 50, "description": "Page size (1-50, default 20)." }, "page": { "type": "number", "minimum": 1, "description": "Page number (index pagination)." } }, "required": [ "messageId" ], "additionalProperties": false } ``` # list_my_member_chats (/docs/reference/mcp/list_my_member_chats) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List the caller's member chats — 1:1 DMs and group chats. Cursor paginated. Filter by scope, subject, member name, or archived state. Use to answer "what private chats am I in?" or to find a specific DM before posting in it. ## Input [#input] | Property | Type | Required | Description | | ---------------- | --------- | -------- | ----------------------------------------------------------------------------- | | `scopeId` | `string` | no | Limit to member chats scoped to this resource (workspace / project / social). | | `subjectSearch` | `string` | no | Substring match on chat subject. | | `memberSearch` | `string` | no | Substring match on participant names. | | `archived` | `boolean` | no | When true, include archived chats. Defaults to active-only when omitted. | | `recentMessages` | `number` | no | Include up to N recent messages per chat (0-50, default 0). min 0. max 50 | | `limit` | `number` | no | Page size (1-50, default 20). min 1. max 50 | | `cursor` | `string` | no | Opaque cursor from a prior page. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "scopeId": { "type": "string", "description": "Limit to member chats scoped to this resource (workspace / project / social)." }, "subjectSearch": { "type": "string", "description": "Substring match on chat subject." }, "memberSearch": { "type": "string", "description": "Substring match on participant names." }, "archived": { "type": "boolean", "description": "When true, include archived chats. Defaults to active-only when omitted." }, "recentMessages": { "type": "number", "minimum": 0, "maximum": 50, "description": "Include up to N recent messages per chat (0-50, default 0)." }, "limit": { "type": "number", "minimum": 1, "maximum": 50, "description": "Page size (1-50, default 20)." }, "cursor": { "type": "string", "description": "Opaque cursor from a prior page." } }, "additionalProperties": false } ``` # list_my_memberships (/docs/reference/mcp/list_my_memberships) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List every workspace, project, and chat the bot user is a member of, with the roles granted on each. Call this first when the user asks "what can you see?" or you need to discover which projectId / workspaceId to use for a follow-up tool. Returns a flat array; the same bot user can be a member of many resources at different role tiers. ## Input [#input] *This tool takes no input.* ## JSON Schema [#json-schema] ```json { "type": "object", "properties": {}, "additionalProperties": false } ``` # list_my_mentions (/docs/reference/mcp/list_my_mentions) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List chat messages that mention the calling user, across every chat the user can see. The most natural trigger feed for "what have I been asked?". Sorted newest-first by the API. Each result includes the chat + message context. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | ------------------------------------------- | | `limit` | `number` | no | Page size (1-50, default 20). min 1. max 50 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "limit": { "type": "number", "minimum": 1, "maximum": 50, "description": "Page size (1-50, default 20)." } }, "additionalProperties": false } ``` # list_my_tasks (/docs/reference/mcp/list_my_tasks) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List tasks assigned to the bot user (or, in DANGEROUSLY\_USE\_USER\_JWT mode, to the human user). Use this to answer "what do I have to do?" or to find a taskId before updating status / details. Supports filtering by status, project, board, etc. ## Input [#input] | Property | Type | Required | Description | | ----------- | ---------------------------------------- | -------- | ------------------------------------------- | | `projectId` | `string` | no | Restrict to one project (UUID). | | `status` | `"pending" \| "complete" \| "cancelled"` | no | Restrict to one task status. | | `limit` | `number` | no | Page size (1-50, default 20). min 1. max 50 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "Restrict to one project (UUID)." }, "status": { "type": "string", "enum": [ "pending", "complete", "cancelled" ], "description": "Restrict to one task status." }, "limit": { "type": "number", "minimum": 1, "maximum": 50, "description": "Page size (1-50, default 20)." } }, "additionalProperties": false } ``` # list_new_notifications (/docs/reference/mcp/list_new_notifications) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List notifications NEW since the caller's last-seen timestamp on the given channels. Lighter than `list_notifications` for "what changed since I last looked?" sweeps. Pass `updateLastSeen: true` to advance the cursor so the next call only returns newer ones; pass false (or omit) to peek without consuming. ## Input [#input] | Property | Type | Required | Description | | ---------------- | ---------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------- | | `channels` | `string[]` | yes | Channel strings to read from. Examples: `user/`, `workspace/`, `project//`. min items 1 | | `types` | `string[]` | no | Optional notification type filter. | | `updateLastSeen` | `boolean` | no | When true, advance the last-seen cursor so future calls only return newer items. | | `limit` | `number` | no | Page size (1-50, default 20). min 1. max 50 | | `cursor` | `string` | no | Opaque cursor from a prior page. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "channels": { "type": "array", "items": { "type": "string" }, "minItems": 1, "description": "Channel strings to read from. Examples: `user/`, `workspace/`, `project//`." }, "types": { "type": "array", "items": { "type": "string" }, "description": "Optional notification type filter." }, "updateLastSeen": { "type": "boolean", "description": "When true, advance the last-seen cursor so future calls only return newer items." }, "limit": { "type": "number", "minimum": 1, "maximum": 50, "description": "Page size (1-50, default 20)." }, "cursor": { "type": "string", "description": "Opaque cursor from a prior page." } }, "required": [ "channels" ], "additionalProperties": false } ``` # list_notifications (/docs/reference/mcp/list_notifications) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List notifications on one or more channels (cursor paginated). `channels` is REQUIRED and uses the same string format as WebSocket subscriptions — `user/`, `workspace/`, `project/`, `project//`, `chat/`. Optionally filter by event `types`. Use for "what's new on these channels?" sweeps. Limit defaults to 20. ## Input [#input] | Property | Type | Required | Description | | ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `channels` | `string[]` | yes | Channel strings to read from. Examples: `user/` for personal events, `workspace/` for workspace-wide, `project//` for visibility-scoped events. min items 1 | | `types` | `string[]` | no | Optional notification type filter (e.g. `chatMention`, `taskAssigned`). Omit for all types on the listed channels. | | `limit` | `number` | no | Page size (1-50, default 20). min 1. max 50 | | `cursor` | `string` | no | Opaque cursor from a prior page. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "channels": { "type": "array", "items": { "type": "string" }, "minItems": 1, "description": "Channel strings to read from. Examples: `user/` for personal events, `workspace/` for workspace-wide, `project//` for visibility-scoped events." }, "types": { "type": "array", "items": { "type": "string" }, "description": "Optional notification type filter (e.g. `chatMention`, `taskAssigned`). Omit for all types on the listed channels." }, "limit": { "type": "number", "minimum": 1, "maximum": 50, "description": "Page size (1-50, default 20)." }, "cursor": { "type": "string", "description": "Opaque cursor from a prior page." } }, "required": [ "channels" ], "additionalProperties": false } ``` # list_project_assets (/docs/reference/mcp/list_project_assets) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Flat list of assets in a project, scoped to one visibility tier. Lighter than `list_project_feed` — no chat metadata, just assets. Use this for inventory queries ("how many assets?") or when you need a raw asset list to scan. ## Input [#input] | Property | Type | Required | Description | | ------------ | ------------------------- | -------- | ----------------------------------------------- | | `projectId` | `string` | yes | UUID of the project. | | `visibility` | `"creator" \| "reviewer"` | yes | Which visibility tier to read. | | `limit` | `number` | no | Page size (1-50, default 20). min 1. max 50 | | `search` | `string` | no | Case-insensitive substring match on asset name. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project." }, "visibility": { "type": "string", "enum": [ "creator", "reviewer" ], "description": "Which visibility tier to read." }, "limit": { "type": "number", "minimum": 1, "maximum": 50, "description": "Page size (1-50, default 20)." }, "search": { "type": "string", "description": "Case-insensitive substring match on asset name." } }, "required": [ "projectId", "visibility" ], "additionalProperties": false } ``` # list_project_boards (/docs/reference/mcp/list_project_boards) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List the boards in a project, optionally filtered to one visibility tier. Use this to discover boardIds before listing tasks or creating a task in a specific board. ## Input [#input] | Property | Type | Required | Description | | ------------ | ------------------------- | -------- | ------------------------------------------------------------------------------ | | `projectId` | `string` | yes | UUID of the project. | | `visibility` | `"creator" \| "reviewer"` | no | Restrict to one visibility tier. Omit to return all boards visible to the bot. | | `search` | `string` | no | Optional case-insensitive substring match on the board name. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project." }, "visibility": { "type": "string", "enum": [ "creator", "reviewer" ], "description": "Restrict to one visibility tier. Omit to return all boards visible to the bot." }, "search": { "type": "string", "description": "Optional case-insensitive substring match on the board name." } }, "required": [ "projectId" ], "additionalProperties": false } ``` # list_project_feed (/docs/reference/mcp/list_project_feed) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List recent assets in a project, scoped to one visibility tier (`creator` or `reviewer`). Use this to answer "what is happening in project X?" or to find an asset id to reference in a follow-up tool. Pick the tier matching the user's intent — `creator` for unpublished work-in-progress, `reviewer` for published assets visible to reviewer-tier accounts. Each result includes recent-message metadata when present. ## Input [#input] | Property | Type | Required | Description | | ------------ | ------------------------- | -------- | ------------------------------------------------------------------ | | `projectId` | `string` | yes | UUID of the project. Get it from list\_my\_memberships if unknown. | | `visibility` | `"creator" \| "reviewer"` | yes | Which visibility tier of the feed to read. | | `limit` | `number` | no | Number of assets to return (1-20, default 10). min 1. max 20 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project. Get it from list_my_memberships if unknown." }, "visibility": { "type": "string", "enum": [ "creator", "reviewer" ], "description": "Which visibility tier of the feed to read." }, "limit": { "type": "number", "minimum": 1, "maximum": 20, "description": "Number of assets to return (1-20, default 10)." } }, "required": [ "projectId", "visibility" ], "additionalProperties": false } ``` # list_project_memberships (/docs/reference/mcp/list_project_memberships) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List every user who has any membership in this project, with their roles. Use this to answer "who's on this project?", to validate an `assignedToId` before `create_task` / `update_task_details`, or to discover userIds for mentions. ## Input [#input] | Property | Type | Required | Description | | ----------- | -------- | -------- | ------------------------------------------- | | `projectId` | `string` | yes | UUID of the project. | | `limit` | `number` | no | Page size (1-50, default 20). min 1. max 50 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project." }, "limit": { "type": "number", "minimum": 1, "maximum": 50, "description": "Page size (1-50, default 20)." } }, "required": [ "projectId" ], "additionalProperties": false } ``` # list_project_mentionable_users (/docs/reference/mcp/list_project_mentionable_users) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List users who can be @-mentioned in a project chat at the given visibility tier. Use BEFORE `send_message` when the message should `{{mention:UUID}}` someone — filters out members who cannot see the visibility tier you're writing in. ## Input [#input] | Property | Type | Required | Description | | ------------ | ---------------------------------- | -------- | -------------------------------------------------------------------------- | | `projectId` | `string` | yes | UUID of the project. | | `visibility` | `"creator" \| "reviewer" \| "all"` | yes | Visibility tier filter. `all` returns every mentionable user across tiers. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project." }, "visibility": { "type": "string", "enum": [ "creator", "reviewer", "all" ], "description": "Visibility tier filter. `all` returns every mentionable user across tiers." } }, "required": [ "projectId", "visibility" ], "additionalProperties": false } ``` # list_project_tasks (/docs/reference/mcp/list_project_tasks) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List tasks across a project, with optional filters by board, column, status, assignee, or substring search on the subject. Use this to answer "what tasks are open?", to find a taskId for a follow-up tool, or to triage a board. ## Input [#input] | Property | Type | Required | Description | | -------------- | ----------------------------------------------------- | -------- | ----------------------------------------------------------------------------------------------- | | `projectId` | `string` | yes | UUID of the project. | | `boardId` | `string` | no | Restrict to tasks on a specific board. Pass the string "unassigned" for tasks not on any board. | | `status` | `"pending" \| "inProgress" \| "complete" \| "closed"` | no | Restrict to one task status. | | `assignedToId` | `string` | no | Restrict to tasks assigned to a single user (UUID). | | `search` | `string` | no | Case-insensitive substring match on the task subject. | | `limit` | `number` | no | Page size (1-50, default 20). min 1. max 50 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project." }, "boardId": { "type": "string", "description": "Restrict to tasks on a specific board. Pass the string \"unassigned\" for tasks not on any board." }, "status": { "type": "string", "enum": [ "pending", "inProgress", "complete", "closed" ], "description": "Restrict to one task status." }, "assignedToId": { "type": "string", "description": "Restrict to tasks assigned to a single user (UUID)." }, "search": { "type": "string", "description": "Case-insensitive substring match on the task subject." }, "limit": { "type": "number", "minimum": 1, "maximum": 50, "description": "Page size (1-50, default 20)." } }, "required": [ "projectId" ], "additionalProperties": false } ``` # list_scope_convos (/docs/reference/mcp/list_scope_convos) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List live conversations attached to a scope (a project today) at the given visibility tier(s). Filter by status / participant search. Use to answer "what huddles are running in this project right now?" or to find a recent completed convo before sharing its recording. ## Input [#input] | Property | Type | Required | Description | | --------------- | ---------------------------------------- | -------- | ------------------------------------------------------------- | | `scopeId` | `string` | yes | UUID of the scope resource — typically a projectId. | | `visibility` | `"creator" \| "reviewer"[]` | yes | Visibility tier(s) to include. Must be non-empty. min items 1 | | `status` | `"active" \| "completed" \| "cancelled"` | no | Filter by lifecycle status. | | `search` | `string` | no | Filter by participant name. | | `limit` | `number` | no | Page size (1-50, default 20). min 1. max 50 | | `cursor` | `string` | no | Opaque cursor from a prior page. | | `includeCounts` | `boolean` | no | When true, include total counts in the response. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "scopeId": { "type": "string", "description": "UUID of the scope resource — typically a projectId." }, "visibility": { "type": "array", "items": { "type": "string", "enum": [ "creator", "reviewer" ] }, "minItems": 1, "description": "Visibility tier(s) to include. Must be non-empty." }, "status": { "type": "string", "enum": [ "active", "completed", "cancelled" ], "description": "Filter by lifecycle status." }, "search": { "type": "string", "description": "Filter by participant name." }, "limit": { "type": "number", "minimum": 1, "maximum": 50, "description": "Page size (1-50, default 20)." }, "cursor": { "type": "string", "description": "Opaque cursor from a prior page." }, "includeCounts": { "type": "boolean", "description": "When true, include total counts in the response." } }, "required": [ "scopeId", "visibility" ], "additionalProperties": false } ``` # list_submissions (/docs/reference/mcp/list_submissions) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List submission packages in a project. Submissions are reviewer-facing virtual folders that bundle published assets for review. Use this to discover `submissionId` values before `get_submission`, or to answer "what has been sent out for review?". ## Input [#input] | Property | Type | Required | Description | | ----------- | -------- | -------- | ------------------------------------------- | | `projectId` | `string` | yes | UUID of the project. | | `limit` | `number` | no | Page size (1-50, default 20). min 1. max 50 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project." }, "limit": { "type": "number", "minimum": 1, "maximum": 50, "description": "Page size (1-50, default 20)." } }, "required": [ "projectId" ], "additionalProperties": false } ``` # list_tags (/docs/reference/mcp/list_tags) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List every tag defined for an owner resource — project or workspace. Use this to discover `tagId` values before calling `tag_task`, `tag_board`, or similar — there is no other way to enumerate tags. Tags are scoped to their owner resource: a project's tags only apply to that project, a workspace's tags to that workspace. ## Input [#input] | Property | Type | Required | Description | | ------------------- | -------------------------- | -------- | ---------------------------------------------------------- | | `ownerResourceType` | `"project" \| "workspace"` | yes | Which resource type owns the tags. | | `ownerResourceId` | `string` | yes | UUID of the owner resource. | | `search` | `string` | no | Optional case-insensitive substring match on the tag name. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "ownerResourceType": { "type": "string", "enum": [ "project", "workspace" ], "description": "Which resource type owns the tags." }, "ownerResourceId": { "type": "string", "description": "UUID of the owner resource." }, "search": { "type": "string", "description": "Optional case-insensitive substring match on the tag name." } }, "required": [ "ownerResourceType", "ownerResourceId" ], "additionalProperties": false } ``` # list_task_events (/docs/reference/mcp/list_task_events) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List the audit / activity events for a single task — status changes, assignments, column moves, comments, etc. Use this to understand the history of a task before acting on it, or to write a summary of recent activity. ## Input [#input] | Property | Type | Required | Description | | ----------- | -------- | -------- | ---------------------------------------------------------------- | | `taskId` | `string` | yes | UUID of the task whose events to fetch. | | `eventType` | `string` | no | Optional filter by event type (e.g. "statusChange", "assigned"). | | `limit` | `number` | no | Page size (1-50, default 20). min 1. max 50 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "taskId": { "type": "string", "description": "UUID of the task whose events to fetch." }, "eventType": { "type": "string", "description": "Optional filter by event type (e.g. \"statusChange\", \"assigned\")." }, "limit": { "type": "number", "minimum": 1, "maximum": 50, "description": "Page size (1-50, default 20)." } }, "required": [ "taskId" ], "additionalProperties": false } ``` # list_task_relations (/docs/reference/mcp/list_task_relations) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List the chat / message relations attached to a task. Each row tells you which chat or chat-message this task was spawned from or links to. Use to answer "where did this task come from?" or "what discussions reference it?" — complementary to `get_task_links` (task↔task) and `list_task_events` (audit log). ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | ------------------------------------------- | | `taskId` | `string` | yes | UUID of the task. | | `limit` | `number` | no | Page size (1-50, default 20). min 1. max 50 | | `page` | `number` | no | Page number (index pagination). min 1 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "taskId": { "type": "string", "description": "UUID of the task." }, "limit": { "type": "number", "minimum": 1, "maximum": 50, "description": "Page size (1-50, default 20)." }, "page": { "type": "number", "minimum": 1, "description": "Page number (index pagination)." } }, "required": [ "taskId" ], "additionalProperties": false } ``` # list_workspace_projects (/docs/reference/mcp/list_workspace_projects) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. List every project in a workspace the bot can see — name, slug, id, status. Use to discover projects before drilling in with `get_project`, `list_project_assets`, `list_project_tasks`, etc. ## Input [#input] | Property | Type | Required | Description | | ------------- | -------- | -------- | ---------------------- | | `workspaceId` | `string` | yes | UUID of the workspace. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "workspaceId": { "type": "string", "description": "UUID of the workspace." } }, "required": [ "workspaceId" ], "additionalProperties": false } ``` # move_task (/docs/reference/mcp/move_task) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Move a task. For a same-board move, pass `columnId` (the target column on the same board). For a cross-board move, pass `targetBoardId` — `columnId` is then optional (server falls back to the target board's default column). If the resulting column has a `taskStatus` set, the task's top-level status auto-updates to match. At least one of `columnId` or `targetBoardId` is required. ## Input [#input] | Property | Type | Required | Description | | --------------- | -------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | | `boardId` | `string` | yes | UUID of the board the task currently belongs to. | | `taskId` | `string` | yes | UUID of the task to move. | | `columnId` | `string` | no | UUID of the target column. Required for same-board moves. Optional when `targetBoardId` is set (server falls back to the target board's default column). | | `targetBoardId` | `string` | no | When set AND different from `boardId`, the task is moved cross-board. The server updates both board and column atomically. | | `sortOrder` | `number` | no | Optional explicit sort position within the resulting column. Omit to append to the end. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "boardId": { "type": "string", "description": "UUID of the board the task currently belongs to." }, "taskId": { "type": "string", "description": "UUID of the task to move." }, "columnId": { "type": "string", "description": "UUID of the target column. Required for same-board moves. Optional when `targetBoardId` is set (server falls back to the target board's default column)." }, "targetBoardId": { "type": "string", "description": "When set AND different from `boardId`, the task is moved cross-board. The server updates both board and column atomically." }, "sortOrder": { "type": "number", "description": "Optional explicit sort position within the resulting column. Omit to append to the end." } }, "required": [ "boardId", "taskId" ], "additionalProperties": false } ``` # publish_items (/docs/reference/mcp/publish_items) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Publish (creator → reviewer tier) one or more resources by id. Optionally trigger reviewer notification emails. Use to surface a batch of finished assets / folders to the reviewer tier in one go. ## Input [#input] | Property | Type | Required | Description | | ----------------------- | ---------- | -------- | ------------------------------------------------------------------------------------- | | `projectId` | `string` | yes | UUID of the project. | | `resourceIds` | `string[]` | yes | Asset / folder UUIDs to publish. min items 1 | | `basePath` | `string` | no | Optional reviewer-tier destination path. Defaults to mirroring the creator-tier path. | | `sendEmailNotification` | `boolean` | no | If true, reviewers receive an email notification. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project." }, "resourceIds": { "type": "array", "items": { "type": "string" }, "minItems": 1, "description": "Asset / folder UUIDs to publish." }, "basePath": { "type": "string", "description": "Optional reviewer-tier destination path. Defaults to mirroring the creator-tier path." }, "sendEmailNotification": { "type": "boolean", "description": "If true, reviewers receive an email notification." } }, "required": [ "projectId", "resourceIds" ], "additionalProperties": false } ``` # rejoin_convo (/docs/reference/mcp/rejoin_convo) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Re-enter a convo as an already-active participant. Returns a fresh Daily.co meeting token without firing "user joined" notifications. Use after a page refresh, network drop, or device switch — never as a substitute for `join_convo` when entering for the first time. ## Input [#input] | Property | Type | Required | Description | | --------- | -------- | -------- | ------------------ | | `convoId` | `string` | yes | UUID of the convo. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "convoId": { "type": "string", "description": "UUID of the convo." } }, "required": [ "convoId" ], "additionalProperties": false } ``` # remove_attachment (/docs/reference/mcp/remove_attachment) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Remove a single asset attachment from a chat message. The asset itself is NOT deleted — only its link to the message. Use to detach the wrong file after a misclick / wrong reference; for a full asset purge use `delete_asset`. ## Input [#input] | Property | Type | Required | Description | | ----------- | -------- | -------- | --------------------------------------------- | | `messageId` | `string` | yes | UUID of the message. | | `assetId` | `string` | yes | UUID of the asset to detach from the message. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "messageId": { "type": "string", "description": "UUID of the message." }, "assetId": { "type": "string", "description": "UUID of the asset to detach from the message." } }, "required": [ "messageId", "assetId" ], "additionalProperties": false } ``` # remove_chat_members (/docs/reference/mcp/remove_chat_members) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Remove users from a member chat. Removed users lose access immediately but message history is preserved for remaining members. To leave a chat yourself, pass the caller's own userId in `memberIds`. ## Input [#input] | Property | Type | Required | Description | | ----------- | ---------- | -------- | ------------------------------------- | | `chatId` | `string` | yes | UUID of the member chat. | | `memberIds` | `string[]` | yes | UUIDs of users to remove. min items 1 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "chatId": { "type": "string", "description": "UUID of the member chat." }, "memberIds": { "type": "array", "items": { "type": "string" }, "minItems": 1, "description": "UUIDs of users to remove." } }, "required": [ "chatId", "memberIds" ], "additionalProperties": false } ``` # remove_reaction (/docs/reference/mcp/remove_reaction) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Remove the caller's reaction from a message. No-op if the caller hasn't reacted. ## Input [#input] | Property | Type | Required | Description | | ----------- | -------- | -------- | -------------------- | | `messageId` | `string` | yes | UUID of the message. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "messageId": { "type": "string", "description": "UUID of the message." } }, "required": [ "messageId" ], "additionalProperties": false } ``` # remove_task_from_board (/docs/reference/mcp/remove_task_from_board) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Detach a task from its board without deleting the task. WRITE OPERATION. After this call the Task row survives but its boardId/columnId are cleared — it becomes a free-standing task (mention-style). Use this when you want to take a task off a board but keep it around (e.g. for re-boarding later). To actually delete a task, no MCP tool exists yet — do it in the UI. ## Input [#input] | Property | Type | Required | Description | | --------- | -------- | -------- | ------------------------------------------------ | | `boardId` | `string` | yes | UUID of the board the task currently belongs to. | | `taskId` | `string` | yes | UUID of the task to detach. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "boardId": { "type": "string", "description": "UUID of the board the task currently belongs to." }, "taskId": { "type": "string", "description": "UUID of the task to detach." } }, "required": [ "boardId", "taskId" ], "additionalProperties": false } ``` # reorder_columns (/docs/reference/mcp/reorder_columns) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Bulk-assign new sort orders to columns on a board. Pass every column you want to position; columns omitted from the array keep their current order. Use after `add_column` when the new column should not land at the end, or when reorganizing a board's flow. ## Input [#input] | Property | Type | Required | Description | | --------- | ---------- | -------- | ------------------------------------------------- | | `boardId` | `string` | yes | UUID of the board. | | `columns` | `object[]` | yes | Columns and their new sort positions. min items 1 | **`columns`** (items) | Property | Type | Required | Description | | ----------- | -------- | -------- | ------------------------------- | | `id` | `string` | yes | UUID of the column. | | `sortOrder` | `number` | yes | New position (lower = earlier). | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "boardId": { "type": "string", "description": "UUID of the board." }, "columns": { "type": "array", "minItems": 1, "items": { "type": "object", "properties": { "id": { "type": "string", "description": "UUID of the column." }, "sortOrder": { "type": "number", "description": "New position (lower = earlier)." } }, "required": [ "id", "sortOrder" ], "additionalProperties": false }, "description": "Columns and their new sort positions." } }, "required": [ "boardId", "columns" ], "additionalProperties": false } ``` # repair_assets (/docs/reference/mcp/repair_assets) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Re-trigger post-processing (thumbnails, transcoding, metadata extraction) for one or more assets. Use when an asset is stuck in a pending state, has a missing thumbnail, or its post-processing previously failed. Does not re-upload — the original file is reused. ## Input [#input] | Property | Type | Required | Description | | ---------- | ---------- | -------- | ---------------------------------------------- | | `assetIds` | `string[]` | yes | One or more asset UUIDs to repair. min items 1 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "assetIds": { "type": "array", "items": { "type": "string" }, "minItems": 1, "description": "One or more asset UUIDs to repair." } }, "required": [ "assetIds" ], "additionalProperties": false } ``` # resolve_public_download (/docs/reference/mcp/resolve_public_download) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Resolve a public-download token (the 10-character code at the end of a nurma.link download URL) to minimal file metadata — `fileName`, `mediaType`, `status`. Use to inspect what a download link points at before handing it to the user. Public endpoint — no auth required, no charge. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | --------------------------------------- | | `token` | `string` | yes | The 10-character public download token. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "token": { "type": "string", "description": "The 10-character public download token." } }, "required": [ "token" ], "additionalProperties": false } ``` # resolve_shortlink (/docs/reference/mcp/resolve_shortlink) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Read-only tool. Resolve a Nurama short-link code (the trailing segment of a [https://nurma.link/](https://nurma.link/)... URL) to its target resource (asset / project / task / chat / message) with ids and visibility tier. Use whenever a user pastes a short link — call this first, then drill into the resolved resource id. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | ------------------------------------- | | `code` | `string` | yes | The short-link code, e.g. `AbCd1234`. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "code": { "type": "string", "description": "The short-link code, e.g. `AbCd1234`." } }, "required": [ "code" ], "additionalProperties": false } ``` # revise_message (/docs/reference/mcp/revise_message) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Edit a chat message. Pass only the fields that change; omit to leave them as-is. `content` accepts the same mention/quote token syntax as `send_message`. Use to fix typos, retract a mistaken claim, or rewrite a bot reply after a tool result lands. ## Input [#input] | Property | Type | Required | Description | | ---------------- | ---------- | -------- | -------------------------------------------------------------------------------------------------- | | `messageId` | `string` | yes | UUID of the message to revise. | | `content` | `string` | no | New body. Same token syntax as `send_message` (`{{mention:UUID}}`, `{{assetMention:UUID}}`, etc.). | | `mentions` | `string[]` | no | User UUIDs referenced via `{{mention:UUID}}`. | | `assetMentions` | `string[]` | no | Asset UUIDs referenced via `{{assetMention:UUID}}`. | | `folderMentions` | `string[]` | no | Folder UUIDs referenced via `{{folderMention:UUID}}`. | | `taskMentions` | `string[]` | no | Task UUIDs referenced via `{{taskMention:UUID}}`. | | `quotes` | `string[]` | no | Message UUIDs being quoted. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "messageId": { "type": "string", "description": "UUID of the message to revise." }, "content": { "type": "string", "description": "New body. Same token syntax as `send_message` (`{{mention:UUID}}`, `{{assetMention:UUID}}`, etc.)." }, "mentions": { "type": "array", "items": { "type": "string" }, "description": "User UUIDs referenced via `{{mention:UUID}}`." }, "assetMentions": { "type": "array", "items": { "type": "string" }, "description": "Asset UUIDs referenced via `{{assetMention:UUID}}`." }, "folderMentions": { "type": "array", "items": { "type": "string" }, "description": "Folder UUIDs referenced via `{{folderMention:UUID}}`." }, "taskMentions": { "type": "array", "items": { "type": "string" }, "description": "Task UUIDs referenced via `{{taskMention:UUID}}`." }, "quotes": { "type": "array", "items": { "type": "string" }, "description": "Message UUIDs being quoted." } }, "required": [ "messageId" ], "additionalProperties": false } ``` # send_message (/docs/reference/mcp/send_message) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Post a new chat message as the bot user. WRITE OPERATION — this is visible to every other participant in the chat and appears under the bot's identity in the audit log. For `@mentions` of human users, pass their userIds in `mentions`. For asset references that should render as clickable chips, pass asset UUIDs in `assetMentions` AND embed the literal token `{{assetMention:UUID}}` in the message content where each chip should appear. ## Input [#input] | Property | Type | Required | Description | | ---------------- | ---------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | `chatId` | `string` | yes | UUID of the destination chat. | | `content` | `string` | yes | Message body. Plain text + markdown + `{{assetMention:UUID}}` / `{{mention:USER_UUID}}` tokens. min length 1 | | `mentions` | `string[]` | no | UUIDs of users referenced via `{{mention:UUID}}` tokens in content. Must match what is embedded in the text. | | `assetMentions` | `string[]` | no | UUIDs of assets referenced via `{{assetMention:UUID}}` tokens. Required for the chip renderer to find the asset. | | `folderMentions` | `string[]` | no | UUIDs of folders referenced via `{{folderMention:UUID}}` tokens in the content. Required for the chip renderer to find the folder. | | `taskMentions` | `string[]` | no | UUIDs of board tasks referenced via `{{taskMention:UUID}}` tokens. Requires the Boards add-on on the workspace; without it the message is rejected. | | `quotes` | `string[]` | no | UUIDs of prior messages to inline-quote at the top of this one. Renders as a quoted-preview block above the body. | | `replyToId` | `string` | no | UUID of a message this is a threaded reply to. Omit to post as a top-level message. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "chatId": { "type": "string", "description": "UUID of the destination chat." }, "content": { "type": "string", "minLength": 1, "description": "Message body. Plain text + markdown + `{{assetMention:UUID}}` / `{{mention:USER_UUID}}` tokens." }, "mentions": { "type": "array", "items": { "type": "string" }, "description": "UUIDs of users referenced via `{{mention:UUID}}` tokens in content. Must match what is embedded in the text." }, "assetMentions": { "type": "array", "items": { "type": "string" }, "description": "UUIDs of assets referenced via `{{assetMention:UUID}}` tokens. Required for the chip renderer to find the asset." }, "folderMentions": { "type": "array", "items": { "type": "string" }, "description": "UUIDs of folders referenced via `{{folderMention:UUID}}` tokens in the content. Required for the chip renderer to find the folder." }, "taskMentions": { "type": "array", "items": { "type": "string" }, "description": "UUIDs of board tasks referenced via `{{taskMention:UUID}}` tokens. Requires the Boards add-on on the workspace; without it the message is rejected." }, "quotes": { "type": "array", "items": { "type": "string" }, "description": "UUIDs of prior messages to inline-quote at the top of this one. Renders as a quoted-preview block above the body." }, "replyToId": { "type": "string", "description": "UUID of a message this is a threaded reply to. Omit to post as a top-level message." } }, "required": [ "chatId", "content" ], "additionalProperties": false } ``` # start_convo (/docs/reference/mcp/start_convo) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Start a new live conversation (video or audio huddle) anchored in a chat. The chat gets a system message announcing the convo and participants get notified. Use when the bot needs to spin up a real-time room — for ad-hoc reviews, design syncs, or anytime async chat is no longer enough. ## Input [#input] | Property | Type | Required | Description | | ----------------------- | ------------------------------------- | -------- | ---------------------------------------------------------------------------------------- | | `chatId` | `string` | yes | UUID of the chat hosting the convo. | | `chatType` | `"topic" \| "member" \| "submission"` | yes | Type of chat the convo is anchored in. | | `convoType` | `"video" \| "audio"` | yes | Convo modality. | | `subject` | `string` | no | Optional title for the convo. | | `notes` | `string` | no | Optional agenda / starting notes. | | `sendEmailNotification` | `boolean` | no | If true, host-chat participants get an email notification in addition to the in-app one. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "chatId": { "type": "string", "description": "UUID of the chat hosting the convo." }, "chatType": { "type": "string", "enum": [ "topic", "member", "submission" ], "description": "Type of chat the convo is anchored in." }, "convoType": { "type": "string", "enum": [ "video", "audio" ], "description": "Convo modality." }, "subject": { "type": "string", "description": "Optional title for the convo." }, "notes": { "type": "string", "description": "Optional agenda / starting notes." }, "sendEmailNotification": { "type": "boolean", "description": "If true, host-chat participants get an email notification in addition to the in-app one." } }, "required": [ "chatId", "chatType", "convoType" ], "additionalProperties": false } ``` # tag_asset (/docs/reference/mcp/tag_asset) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Apply a tag to an asset. The tag must already exist on the asset's owning resource (typically the project) — see `list_tags` / `create_tag` to look up or mint one. ## Input [#input] | Property | Type | Required | Description | | --------- | -------- | -------- | ------------------------- | | `assetId` | `string` | yes | UUID of the asset. | | `tagId` | `string` | yes | UUID of the tag to apply. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "assetId": { "type": "string", "description": "UUID of the asset." }, "tagId": { "type": "string", "description": "UUID of the tag to apply." } }, "required": [ "assetId", "tagId" ], "additionalProperties": false } ``` # tag_board (/docs/reference/mcp/tag_board) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Apply a tag to a board. The tag must already exist on the board's owning resource (typically the project). ## Input [#input] | Property | Type | Required | Description | | --------- | -------- | -------- | ------------------ | | `boardId` | `string` | yes | UUID of the board. | | `tagId` | `string` | yes | UUID of the tag. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "boardId": { "type": "string", "description": "UUID of the board." }, "tagId": { "type": "string", "description": "UUID of the tag." } }, "required": [ "boardId", "tagId" ], "additionalProperties": false } ``` # tag_folder (/docs/reference/mcp/tag_folder) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Apply a tag to a folder. The tag must already exist on the folder's owning resource (typically the project). ## Input [#input] | Property | Type | Required | Description | | ---------- | -------- | -------- | ------------------------- | | `folderId` | `string` | yes | UUID of the folder. | | `tagId` | `string` | yes | UUID of the tag to apply. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "folderId": { "type": "string", "description": "UUID of the folder." }, "tagId": { "type": "string", "description": "UUID of the tag to apply." } }, "required": [ "folderId", "tagId" ], "additionalProperties": false } ``` # tag_submission (/docs/reference/mcp/tag_submission) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Apply a tag to a submission. The tag must already exist on the project. ## Input [#input] | Property | Type | Required | Description | | -------------- | -------- | -------- | ----------------------- | | `projectId` | `string` | yes | UUID of the project. | | `submissionId` | `string` | yes | UUID of the submission. | | `tagId` | `string` | yes | UUID of the tag. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project." }, "submissionId": { "type": "string", "description": "UUID of the submission." }, "tagId": { "type": "string", "description": "UUID of the tag." } }, "required": [ "projectId", "submissionId", "tagId" ], "additionalProperties": false } ``` # tag_task (/docs/reference/mcp/tag_task) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Attach a project-scoped tag to a task. WRITE OPERATION. The tag must already exist in the project; this tool does not create new tags. To see what tags exist, call `list_tags` for the project first. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | ---------------------------------------- | | `taskId` | `string` | yes | UUID of the task to tag. | | `tagId` | `string` | yes | UUID of the project-scoped tag to apply. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "taskId": { "type": "string", "description": "UUID of the task to tag." }, "tagId": { "type": "string", "description": "UUID of the project-scoped tag to apply." } }, "required": [ "taskId", "tagId" ], "additionalProperties": false } ``` # unarchive_member_chat (/docs/reference/mcp/unarchive_member_chat) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Restore an archived member chat to the active list. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | ------------------------ | | `chatId` | `string` | yes | UUID of the member chat. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "chatId": { "type": "string", "description": "UUID of the member chat." } }, "required": [ "chatId" ], "additionalProperties": false } ``` # unfollow_chat (/docs/reference/mcp/unfollow_chat) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Stop following a chat. No-op if not currently followed. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | ----------------- | | `chatId` | `string` | yes | UUID of the chat. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "chatId": { "type": "string", "description": "UUID of the chat." } }, "required": [ "chatId" ], "additionalProperties": false } ``` # unfollow_task (/docs/reference/mcp/unfollow_task) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Have the calling user stop following a task — no further notifications about its activity. WRITE OPERATION but personal — only affects the calling user's notification subscriptions. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | ----------------------------- | | `taskId` | `string` | yes | UUID of the task to unfollow. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "taskId": { "type": "string", "description": "UUID of the task to unfollow." } }, "required": [ "taskId" ], "additionalProperties": false } ``` # unhighlight_message (/docs/reference/mcp/unhighlight_message) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Remove the highlight / pin from a message. No-op if not currently highlighted. ## Input [#input] | Property | Type | Required | Description | | ----------- | -------- | -------- | -------------------- | | `messageId` | `string` | yes | UUID of the message. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "messageId": { "type": "string", "description": "UUID of the message." } }, "required": [ "messageId" ], "additionalProperties": false } ``` # unlink_task (/docs/reference/mcp/unlink_task) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Remove an existing relationship between two tasks. WRITE OPERATION. The relationship is symmetric — the link is removed regardless of which direction it was originally created in. ## Input [#input] | Property | Type | Required | Description | | -------------- | -------- | -------- | ------------------------------------------- | | `taskId` | `string` | yes | UUID of one task in the relationship. | | `linkedTaskId` | `string` | yes | UUID of the other task in the relationship. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "taskId": { "type": "string", "description": "UUID of one task in the relationship." }, "linkedTaskId": { "type": "string", "description": "UUID of the other task in the relationship." } }, "required": [ "taskId", "linkedTaskId" ], "additionalProperties": false } ``` # unpublish_items (/docs/reference/mcp/unpublish_items) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Unpublish (remove from reviewer tier) one or more resources. The creator-tier originals are untouched. ## Input [#input] | Property | Type | Required | Description | | ------------- | ---------- | -------- | ---------------------------------------------- | | `projectId` | `string` | yes | UUID of the project. | | `resourceIds` | `string[]` | yes | Asset / folder UUIDs to unpublish. min items 1 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project." }, "resourceIds": { "type": "array", "items": { "type": "string" }, "minItems": 1, "description": "Asset / folder UUIDs to unpublish." } }, "required": [ "projectId", "resourceIds" ], "additionalProperties": false } ``` # untag_asset (/docs/reference/mcp/untag_asset) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Remove a tag from an asset. No-op if the tag is not currently applied. ## Input [#input] | Property | Type | Required | Description | | --------- | -------- | -------- | -------------------------- | | `assetId` | `string` | yes | UUID of the asset. | | `tagId` | `string` | yes | UUID of the tag to remove. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "assetId": { "type": "string", "description": "UUID of the asset." }, "tagId": { "type": "string", "description": "UUID of the tag to remove." } }, "required": [ "assetId", "tagId" ], "additionalProperties": false } ``` # untag_board (/docs/reference/mcp/untag_board) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Remove a tag from a board. No-op if the tag is not currently applied. ## Input [#input] | Property | Type | Required | Description | | --------- | -------- | -------- | ------------------ | | `boardId` | `string` | yes | UUID of the board. | | `tagId` | `string` | yes | UUID of the tag. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "boardId": { "type": "string", "description": "UUID of the board." }, "tagId": { "type": "string", "description": "UUID of the tag." } }, "required": [ "boardId", "tagId" ], "additionalProperties": false } ``` # untag_folder (/docs/reference/mcp/untag_folder) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Remove a tag from a folder. No-op if the tag is not currently applied. ## Input [#input] | Property | Type | Required | Description | | ---------- | -------- | -------- | -------------------------- | | `folderId` | `string` | yes | UUID of the folder. | | `tagId` | `string` | yes | UUID of the tag to remove. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "folderId": { "type": "string", "description": "UUID of the folder." }, "tagId": { "type": "string", "description": "UUID of the tag to remove." } }, "required": [ "folderId", "tagId" ], "additionalProperties": false } ``` # untag_submission (/docs/reference/mcp/untag_submission) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Remove a tag from a submission. No-op if the tag is not currently applied. ## Input [#input] | Property | Type | Required | Description | | -------------- | -------- | -------- | ----------------------- | | `projectId` | `string` | yes | UUID of the project. | | `submissionId` | `string` | yes | UUID of the submission. | | `tagId` | `string` | yes | UUID of the tag. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project." }, "submissionId": { "type": "string", "description": "UUID of the submission." }, "tagId": { "type": "string", "description": "UUID of the tag." } }, "required": [ "projectId", "submissionId", "tagId" ], "additionalProperties": false } ``` # untag_task (/docs/reference/mcp/untag_task) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Remove a project-scoped tag from a task. WRITE OPERATION. Tag stays alive in the project — only the association with this task is removed. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | -------------------------- | | `taskId` | `string` | yes | UUID of the task to untag. | | `tagId` | `string` | yes | UUID of the tag to detach. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "taskId": { "type": "string", "description": "UUID of the task to untag." }, "tagId": { "type": "string", "description": "UUID of the tag to detach." } }, "required": [ "taskId", "tagId" ], "additionalProperties": false } ``` # update_ai_chat_topic (/docs/reference/mcp/update_ai_chat_topic) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Rename an AI chat topic or toggle its archived state. `workspaceId` is required — the request is rejected if the topic does not belong to that workspace. Pass only the fields that change. ## Input [#input] | Property | Type | Required | Description | | ------------- | --------- | -------- | -------------------------------------------- | | `topicId` | `string` | yes | UUID of the AI chat topic. | | `workspaceId` | `string` | yes | UUID of the workspace the topic lives under. | | `title` | `string` | no | New title. min length 1 | | `archived` | `boolean` | no | Pass true to archive; false to unarchive. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "topicId": { "type": "string", "description": "UUID of the AI chat topic." }, "workspaceId": { "type": "string", "description": "UUID of the workspace the topic lives under." }, "title": { "type": "string", "minLength": 1, "description": "New title." }, "archived": { "type": "boolean", "description": "Pass true to archive; false to unarchive." } }, "required": [ "topicId", "workspaceId" ], "additionalProperties": false } ``` # update_asset (/docs/reference/mcp/update_asset) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Update an asset's name, folder placement, or metadata. Pass only the fields you want to change. Pass `folderId: null` to move the asset to the project root. ## Input [#input] | Property | Type | Required | Description | | ---------- | ---------------- | -------- | ------------------------------------------------------- | | `assetId` | `string` | yes | UUID of the asset. | | `name` | `string` | no | New display name. | | `folderId` | `string \| null` | no | New folder UUID, or `null` to move to the project root. | | `meta` | `object` | no | Arbitrary metadata object — merged into existing meta. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "assetId": { "type": "string", "description": "UUID of the asset." }, "name": { "type": "string", "description": "New display name." }, "folderId": { "type": [ "string", "null" ], "description": "New folder UUID, or `null` to move to the project root." }, "meta": { "type": "object", "description": "Arbitrary metadata object — merged into existing meta." } }, "required": [ "assetId" ], "additionalProperties": false } ``` # update_board (/docs/reference/mcp/update_board) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Rename, redescribe, retier, archive, or reorder a board. Pass only the fields that change. Pass `description: null` to clear it. When narrowing `visibility` would orphan tasks, set `cascade: true` to authorize the cleanup — without it the server returns 409 with `errorData.blockers`. ## Input [#input] | Property | Type | Required | Description | | ------------- | --------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------- | | `boardId` | `string` | yes | UUID of the board. | | `name` | `string` | no | New name. min length 1 | | `description` | `string \| null` | no | New description, or `null` to clear it. | | `visibility` | `"creator" \| "reviewer"[]` | no | New visibility tier set. | | `status` | `"active" \| "archived"` | no | Lifecycle status. | | `sortOrder` | `number` | no | New ordering position among project boards. | | `cascade` | `boolean` | no | Authorize automatic cleanup of dependents when narrowing visibility. Default false; the server 409s if cleanup would be required. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "boardId": { "type": "string", "description": "UUID of the board." }, "name": { "type": "string", "minLength": 1, "description": "New name." }, "description": { "type": [ "string", "null" ], "description": "New description, or `null` to clear it." }, "visibility": { "type": "array", "items": { "type": "string", "enum": [ "creator", "reviewer" ] }, "description": "New visibility tier set." }, "status": { "type": "string", "enum": [ "active", "archived" ], "description": "Lifecycle status." }, "sortOrder": { "type": "number", "description": "New ordering position among project boards." }, "cascade": { "type": "boolean", "description": "Authorize automatic cleanup of dependents when narrowing visibility. Default false; the server 409s if cleanup would be required." } }, "required": [ "boardId" ], "additionalProperties": false } ``` # update_chat_subject (/docs/reference/mcp/update_chat_subject) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Rename a chat. Applies to topic chats and member chats alike. Use after a chat has evolved past its original topic, or when its auto-generated subject is too generic. ## Input [#input] | Property | Type | Required | Description | | --------- | -------- | -------- | ------------------------------------- | | `chatId` | `string` | yes | UUID of the chat. | | `subject` | `string` | yes | The new subject / title. min length 1 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "chatId": { "type": "string", "description": "UUID of the chat." }, "subject": { "type": "string", "minLength": 1, "description": "The new subject / title." } }, "required": [ "chatId", "subject" ], "additionalProperties": false } ``` # update_column (/docs/reference/mcp/update_column) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Rename, recolor, retag, or reposition a single board column. Pass only the fields that change. Pass `description: null` / `color: null` to clear them. `taskStatus: null` unmaps the column from a lifecycle bucket. ## Input [#input] | Property | Type | Required | Description | | ------------------------ | ------------------------------------------------------------- | -------- | ------------------------------------------------- | | `boardId` | `string` | yes | UUID of the board. | | `columnId` | `string` | yes | UUID of the column. | | `name` | `string` | no | New name. min length 1 | | `description` | `string \| null` | no | New description, or `null` to clear. | | `color` | `string \| null` | no | New hex color, or `null` to clear. | | `isDefault` | `boolean` | no | Set true to make this the default landing column. | | `taskStatus` | `"pending" \| "inProgress" \| "complete" \| "closed" \| null` | no | | | `sortOrder` | `number` | no | | | `reviewersCanContribute` | `boolean` | no | | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "boardId": { "type": "string", "description": "UUID of the board." }, "columnId": { "type": "string", "description": "UUID of the column." }, "name": { "type": "string", "minLength": 1, "description": "New name." }, "description": { "type": [ "string", "null" ], "description": "New description, or `null` to clear." }, "color": { "type": [ "string", "null" ], "description": "New hex color, or `null` to clear." }, "isDefault": { "type": "boolean", "description": "Set true to make this the default landing column." }, "taskStatus": { "type": [ "string", "null" ], "enum": [ "pending", "inProgress", "complete", "closed", null ] }, "sortOrder": { "type": "number" }, "reviewersCanContribute": { "type": "boolean" } }, "required": [ "boardId", "columnId" ], "additionalProperties": false } ``` # update_convo (/docs/reference/mcp/update_convo) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Rename a convo or update its notes. Pass only the fields that change. Safe to call on active or completed convos. ## Input [#input] | Property | Type | Required | Description | | --------- | -------- | -------- | ---------------------------------- | | `convoId` | `string` | yes | UUID of the convo. | | `subject` | `string` | no | New title. | | `notes` | `string` | no | New notes / agenda / summary text. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "convoId": { "type": "string", "description": "UUID of the convo." }, "subject": { "type": "string", "description": "New title." }, "notes": { "type": "string", "description": "New notes / agenda / summary text." } }, "required": [ "convoId" ], "additionalProperties": false } ``` # update_folder_name (/docs/reference/mcp/update_folder_name) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Rename a folder. The folder's path-based FileSystem entry is updated atomically, so child assets stay reachable under the new name. ## Input [#input] | Property | Type | Required | Description | | ---------- | -------- | -------- | ----------------------------- | | `folderId` | `string` | yes | UUID of the folder. | | `name` | `string` | yes | New folder name. min length 1 | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "folderId": { "type": "string", "description": "UUID of the folder." }, "name": { "type": "string", "minLength": 1, "description": "New folder name." } }, "required": [ "folderId", "name" ], "additionalProperties": false } ``` # update_member_chat (/docs/reference/mcp/update_member_chat) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Update a member chat's subject or color. Pass only the fields that change. For topic chats (auto-created project / asset chats) use `update_chat_subject` instead. ## Input [#input] | Property | Type | Required | Description | | --------- | -------- | -------- | ------------------------------- | | `chatId` | `string` | yes | UUID of the member chat. | | `subject` | `string` | no | New title. min length 1 | | `color` | `string` | no | New hex color (e.g. `#FF6B35`). | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "chatId": { "type": "string", "description": "UUID of the member chat." }, "subject": { "type": "string", "minLength": 1, "description": "New title." }, "color": { "type": "string", "description": "New hex color (e.g. `#FF6B35`)." } }, "required": [ "chatId" ], "additionalProperties": false } ``` # update_project (/docs/reference/mcp/update_project) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Rename or redescribe a project. Pass `updateSlug: true` if you want the URL slug to be regenerated from the new name (otherwise it stays the same). ## Input [#input] | Property | Type | Required | Description | | ------------- | --------- | -------- | --------------------------------------------------------------------------- | | `projectId` | `string` | yes | UUID of the project. | | `name` | `string` | no | New project name. min length 1 | | `description` | `string` | no | New project description. | | `updateSlug` | `boolean` | no | If true, regenerate the URL slug from the new name. Changes external links. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project." }, "name": { "type": "string", "minLength": 1, "description": "New project name." }, "description": { "type": "string", "description": "New project description." }, "updateSlug": { "type": "boolean", "description": "If true, regenerate the URL slug from the new name. Changes external links." } }, "required": [ "projectId" ], "additionalProperties": false } ``` # update_submission (/docs/reference/mcp/update_submission) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Rename / redescribe / re-version a submission. Pass only the fields that change. ## Input [#input] | Property | Type | Required | Description | | -------------- | -------- | -------- | ----------------------- | | `projectId` | `string` | yes | UUID of the project. | | `submissionId` | `string` | yes | UUID of the submission. | | `subject` | `string` | no | | | `description` | `string` | no | | | `version` | `string` | no | | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "projectId": { "type": "string", "description": "UUID of the project." }, "submissionId": { "type": "string", "description": "UUID of the submission." }, "subject": { "type": "string" }, "description": { "type": "string" }, "version": { "type": "string" } }, "required": [ "projectId", "submissionId" ], "additionalProperties": false } ``` # update_tag (/docs/reference/mcp/update_tag) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Rename or recolor a tag. At least one of `name` or `color` must be provided. The change propagates to every resource the tag is applied to. ## Input [#input] | Property | Type | Required | Description | | -------- | -------- | -------- | ------------------------------- | | `tagId` | `string` | yes | UUID of the tag. | | `name` | `string` | no | New tag name. min length 1 | | `color` | `string` | no | New hex color (e.g. `#FF6B35`). | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "tagId": { "type": "string", "description": "UUID of the tag." }, "name": { "type": "string", "minLength": 1, "description": "New tag name." }, "color": { "type": "string", "description": "New hex color (e.g. `#FF6B35`)." } }, "required": [ "tagId" ], "additionalProperties": false } ``` # update_task_details (/docs/reference/mcp/update_task_details) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Update a task's subject, description, or assignee. WRITE OPERATION — every other project member sees the change immediately. Pass only the fields you want to change. To CLEAR a field (description or assignee), pass it as null explicitly — omitting it leaves the current value alone. ## Input [#input] | Property | Type | Required | Description | | -------------- | ---------------- | -------- | ------------------------------------------------------------------------------------- | | `taskId` | `string` | yes | UUID of the task to update. | | `subject` | `string` | no | New task title (≤ 280 chars). Omit to leave unchanged. min length 1. max length 280 | | `description` | `string \| null` | no | New description, plain text or markdown. Pass null to clear. Omit to leave unchanged. | | `assignedToId` | `string \| null` | no | UUID of the new assignee. Pass null to unassign. Omit to leave unchanged. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "taskId": { "type": "string", "description": "UUID of the task to update." }, "subject": { "type": "string", "minLength": 1, "maxLength": 280, "description": "New task title (≤ 280 chars). Omit to leave unchanged." }, "description": { "type": [ "string", "null" ], "description": "New description, plain text or markdown. Pass null to clear. Omit to leave unchanged." }, "assignedToId": { "type": [ "string", "null" ], "description": "UUID of the new assignee. Pass null to unassign. Omit to leave unchanged." } }, "required": [ "taskId" ], "additionalProperties": false } ``` # update_task_status (/docs/reference/mcp/update_task_status) {/* Generated by scripts/generate.mjs from content/generated. Do not edit. */} Mutating tool: it changes data in Nurama. Available only when the key carries the matching scope. Set a task's top-level status to `pending`, `complete`, or `cancelled`. WRITE OPERATION — visible to every project member and recorded in the task's event log. Use this when the user asks to "close", "complete", or "cancel" a task. To move a task between columns on a board without changing status (e.g. To Do → In Progress, both pending), use `move_task` instead. ## Input [#input] | Property | Type | Required | Description | | -------- | ---------------------------------------- | -------- | --------------------------- | | `taskId` | `string` | yes | UUID of the task to update. | | `status` | `"pending" \| "complete" \| "cancelled"` | yes | New top-level status. | ## JSON Schema [#json-schema] ```json { "type": "object", "properties": { "taskId": { "type": "string", "description": "UUID of the task to update." }, "status": { "type": "string", "enum": [ "pending", "complete", "cancelled" ], "description": "New top-level status." } }, "required": [ "taskId", "status" ], "additionalProperties": false } ```