BotClient
BotClient class reference.
Classes
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
import BotClient from '@nurama/sdk/bot';
const bot = new BotClient(process.env.NURAMA_BOT_API_KEY!);
const workspaces = await bot.workspace.listWorkspaces();Constructors
Constructor
new default(apiKey, options?): default;Parameters
| Parameter | Type | Description |
|---|---|---|
apiKey | string | Bot API key in the format nrm_bot_{prefix}_{secret}. |
options | BotClientOptions | Configuration overrides. |
Returns
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 | - |
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[]>; 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>; followChat: Promise<void>; getAddableMembers: Promise< | AddableMembersByScope | Membership[]>; getChat: Promise<Chat>; getChatByTopicId: Promise<Chat>; getMemberChat: Promise<ChatMember>; getMentionableAssets: Promise<PaginatedResponse<Asset>>; getMentionableFolders: Promise<PaginatedResponse<Folder>>; getMentionablePublics: Promise<PaginatedResponse<MentionablePublic>>; getMentionableSubmissions: Promise<PaginatedResponse<MentionableSubmission>>; getMentionableTasks: Promise<PaginatedResponse<any>>; getMentions: Promise<PaginatedResponse<ChatMessage>>; getMessage: Promise<ChatMessage>; getMessages: Promise<PaginatedResponse<ChatMessage>>; getReplies: Promise<PaginatedResponse<ChatMessage>>; getScopeAddableMembers: Promise< | AddableMembersByScope | Membership[]>; getUsersMemberChats: Promise<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>; } | - |
chat.addAttachments | public | Promise<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> | - |
chat.followChat | public | Promise<void> | - |
chat.getAddableMembers | public | Promise< | AddableMembersByScope | Membership[]> | - |
chat.getChat | public | Promise<Chat> | - |
chat.getChatByTopicId | public | Promise<Chat> | - |
chat.getMemberChat | public | Promise<ChatMember> | - |
chat.getMentionableAssets | public | Promise<PaginatedResponse<Asset>> | - |
chat.getMentionableFolders | public | Promise<PaginatedResponse<Folder>> | - |
chat.getMentionablePublics | public | Promise<PaginatedResponse<MentionablePublic>> | - |
chat.getMentionableSubmissions | public | Promise<PaginatedResponse<MentionableSubmission>> | - |
chat.getMentionableTasks | public | Promise<PaginatedResponse<any>> | - |
chat.getMentions | public | Promise<PaginatedResponse<ChatMessage>> | - |
chat.getMessage | public | Promise<ChatMessage> | - |
chat.getMessages | public | Promise<PaginatedResponse<ChatMessage>> | - |
chat.getReplies | public | Promise<PaginatedResponse<ChatMessage>> | - |
chat.getScopeAddableMembers | public | Promise< | AddableMembersByScope | Membership[]> | - |
chat.getUsersMemberChats | public | Promise<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> | - |
config | readonly | 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<Asset>>; tagFolder: Promise<Folder>; untagFolder: Promise<Folder>; updateFolder: Promise<Folder>; updateFolderIcon: Promise<any>; } | - |
folder.getFolder | public | Promise<Folder> | - |
folder.getFoldersAssets | public | Promise<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>; cancelInvite: Promise<Invite>; getInviteById: Promise<Invite>; getInvites: Promise<PaginatedInvitesResponse>; getInvitesForResource: Promise<Invite[]>; inviteUser: Promise<Invite>; resendInvite: Promise<Invite>; } | - |
invite.acceptInvite | public | Promise<AcceptInviteResponse> | - |
invite.cancelInvite | public | Promise<Invite> | - |
invite.getInviteById | public | Promise<Invite> | - |
invite.getInvites | public | Promise<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>; getProjectMemberships: Promise<MembershipReport>; getProjectMentionableUsers: Promise<Mentionable[]>; getWorkspaceLastSeen: Promise<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> | - |
membership.getProjectMemberships | public | Promise<MembershipReport> | - |
membership.getProjectMentionableUsers | public | Promise<Mentionable[]> | - |
membership.getWorkspaceLastSeen | public | Promise<GetLastSeenResponse> | - |
membership.getWorkspaceMemberships | public | Promise<MembershipReport> | - |
membership.leaveResource | public | Promise<void> | - |
membership.removeRole | public | Promise<Membership> | - |
notification | readonly | { getNewNotificationCount: Promise<NotificationCountResponse>; getNewNotificationCountBulk: Promise<NotificationCountBulkResponse>; getNewNotifications: Promise<PaginatedNotificationResponse>; getNotifications: Promise<PaginatedNotificationResponse>; getUsersLastNotificationsSeen: Promise<LastSeenResponse>; updateUsersLastSeen: Promise<LastSeenResponse>; } | - |
notification.getNewNotificationCount | public | Promise<NotificationCountResponse> | - |
notification.getNewNotificationCountBulk | public | Promise<NotificationCountBulkResponse> | - |
notification.getNewNotifications | public | Promise<PaginatedNotificationResponse> | - |
notification.getNotifications | public | Promise<PaginatedNotificationResponse> | - |
notification.getUsersLastNotificationsSeen | public | Promise<LastSeenResponse> | - |
notification.updateUsersLastSeen | public | Promise<LastSeenResponse> | - |
product | readonly | { getSuggestedCurrency: Promise<{ country: string | null; currency: SupportedCurrency; locked?: boolean; supported: SupportedCurrency[]; }>; getWorkspaceProducts: Promise<Product[]>; listPlans: Promise<Product[]>; } | - |
product.getSuggestedCurrency | public | Promise<{ country: string | null; currency: SupportedCurrency; locked?: boolean; supported: SupportedCurrency[]; }> | - |
product.getWorkspaceProducts | public | Promise<Product[]> | - |
product.listPlans | public | Promise<Product[]> | - |
project | readonly | 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>; getPublicEmbedFiles: Promise<PublicEmbedFilesResponse>; getPublicFileSystem: Promise<PublicFileSystemDetailsResponse>; getPublicItems: Promise<PublicFileSystemResponse>; getPublicItemsAtPath: Promise<PublicFileSystemResponse>; recordAccessActivity: Promise<void>; resolvePublicDownload: Promise<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> | - |
public.getPublicEmbedFiles | public | Promise<PublicEmbedFilesResponse> | - |
public.getPublicFileSystem | public | Promise<PublicFileSystemDetailsResponse> | - |
public.getPublicItems | public | Promise<PublicFileSystemResponse> | - |
public.getPublicItemsAtPath | public | Promise<PublicFileSystemResponse> | - |
public.recordAccessActivity | public | Promise<void> | - |
public.resolvePublicDownload | public | Promise<ResolvePublicDownloadResponse> | - |
settings | readonly | { cleanupOrphanedSettings: Promise<{ message: string; removedCount: number; }>; getAllResourceSettings: Promise<{ resourceSettings: ResourceSettings[]; }>; getEffectiveSettings: Promise<EffectiveSettings>; getResourceSettings: Promise< | ResourceSettings | { message: string; }>; resetResourceSettings: Promise<{ message: string; }>; updateResourceSettings: Promise<{ message: string; settings: ResourceSettings; }>; } | - |
settings.cleanupOrphanedSettings | public | Promise<{ message: string; removedCount: number; }> | - |
settings.getAllResourceSettings | public | Promise<{ resourceSettings: ResourceSettings[]; }> | - |
settings.getEffectiveSettings | public | Promise<EffectiveSettings> | - |
settings.getResourceSettings | public | Promise< | ResourceSettings | { message: string; }> | - |
settings.resetResourceSettings | public | Promise<{ message: string; }> | - |
settings.updateResourceSettings | public | Promise<{ message: string; settings: ResourceSettings; }> | - |
shortlink | readonly | { resolveShortLink: Promise<ResolveShortLinkResponse>; } | - |
shortlink.resolveShortLink | public | Promise<ResolveShortLinkResponse> | - |
socket | readonly | { connect: (channel, options) => Promise<SocketChannel>; connectPublic: (publicToken, options) => Promise<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> | Connect to a socket channel |
socket.connectPublic | public | (publicToken, options) => Promise<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>; getStorageRecord: Promise<StorageRecord>; } | - |
storage.getStorageChart | public | Promise<ChartDataResponse> | - |
storage.getStorageRecord | public | Promise<StorageRecord> | - |
tag | readonly | { createTag: Promise<Tag>; deleteTag: Promise<Tag>; getTags: Promise<Tags>; updateTag: Promise<Tag>; } | - |
tag.createTag | public | Promise<Tag> | - |
tag.deleteTag | public | Promise<Tag> | - |
tag.getTags | public | Promise<Tags> | - |
tag.updateTag | public | Promise<Tag> | - |
task | readonly | { acknowledgeAllTasks: Promise<AcknowledgeAllTasksResponse>; acknowledgeTask: Promise<Task>; bulkCreate: Promise<BulkCreateTasksResponse>; deleteTask: Promise<void>; followTask: Promise<Task>; getMyTasks: Promise<GetTasksResponse>; getTaskEvents: Promise<GetTaskEventsResponse>; getTaskLinks: Promise<TaskLink[]>; getUnacknowledgedTaskCount: Promise<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> | - |
task.acknowledgeTask | public | Promise<Task> | - |
task.bulkCreate | public | Promise<BulkCreateTasksResponse> | - |
task.deleteTask | public | Promise<void> | - |
task.followTask | public | Promise<Task> | - |
task.getMyTasks | public | Promise<GetTasksResponse> | - |
task.getTaskEvents | public | Promise<GetTaskEventsResponse> | - |
task.getTaskLinks | public | Promise<TaskLink[]> | - |
task.getUnacknowledgedTaskCount | public | Promise<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>; deleteTaskRelation: Promise<void>; getRelationsForChat: Promise<PaginatedTaskRelations>; getRelationsForMessage: Promise<PaginatedTaskRelations>; getTaskRelations: Promise<PaginatedTaskRelations>; } | - |
taskRelation.createTaskRelation | public | Promise<TaskRelation> | - |
taskRelation.deleteTaskRelation | public | Promise<void> | - |
taskRelation.getRelationsForChat | public | Promise<PaginatedTaskRelations> | - |
taskRelation.getRelationsForMessage | public | Promise<PaginatedTaskRelations> | - |
taskRelation.getTaskRelations | public | Promise<PaginatedTaskRelations> | - |
version | readonly | { getCommitHash: Promise<CommitResponse>; getHealth: Promise<HealthStatus>; } | - |
version.getCommitHash | public | Promise<CommitResponse> | - |
version.getHealth | public | Promise<HealthStatus> | - |
workspace | readonly | WorkspaceMethods | - |
Interfaces
BotClientOptions
Properties
| Property | Type | Description |
|---|---|---|
baseURL? | string | Override the default bot API URL (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). |