Nurama Developers

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
ParameterTypeDescription
apiKeystringBot API key in the format nrm_bot_{prefix}_{secret}.
optionsBotClientOptionsConfiguration overrides.
Returns

default

Properties

PropertyModifierTypeDescription
aiChatreadonly{ createTopic: Promise<AiChatCreateTopicResponse>; deleteTopic: Promise<AiChatGetTopicResponse>; getTopic: Promise<AiChatGetTopicResponse>; listTopics: Promise<AiChatListTopicsResponse>; updateTopic: Promise<AiChatGetTopicResponse>; }-
aiChat.createTopicpublicPromise<AiChatCreateTopicResponse>-
aiChat.deleteTopicpublicPromise<AiChatGetTopicResponse>-
aiChat.getTopicpublicPromise<AiChatGetTopicResponse>-
aiChat.listTopicspublicPromise<AiChatListTopicsResponse>-
aiChat.updateTopicpublicPromise<AiChatGetTopicResponse>-
assetreadonlyAssetMethods-
boardreadonly{ 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.addColumnpublicPromise<BoardColumn>-
board.addExistingTaskToBoardpublicPromise<Task>-
board.createBoardpublicPromise<Board>-
board.createBoardTaskpublicPromise<Task>-
board.deleteBoardpublicPromise<{ deletedTaskIds: string[]; disposition: string; message: string; reassignedTaskIds: string[]; }>-
board.deleteColumnpublicPromise<void>-
board.followBoardpublicPromise<Board>-
board.getBoardpublicPromise<BoardWithTasks>-
board.getBoardTaskspublicPromise<Task[]>-
board.getProjectBoardspublicPromise<Board[]>-
board.getProjectTaskspublicPromise<any>-
board.moveTaskpublicPromise<Task>-
board.removeTaskFromBoardpublicPromise<Task>-
board.reorderColumnspublicPromise<BoardColumn[]>-
board.tagBoardpublicPromise<Board>-
board.unfollowBoardpublicPromise<Board>-
board.untagBoardpublicPromise<Board>-
board.updateBoardpublicPromise<Board>-
board.updateColumnpublicPromise<BoardColumn>-
chatreadonly{ 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.addAttachmentspublicPromise<AttachmentUploadRecord[]>-
chat.addMemberspublicPromise<ChatMember>-
chat.archiveMemberChatpublicPromise<ChatMember>-
chat.createAssetChatAndMessagepublicPromise<any>-
chat.createMemberChatpublicPromise<ChatMember>-
chat.createMessagepublicPromise<ChatMessage>-
chat.createMessageShortLinkpublicPromise<{ code: string; shortUrl: string; }>-
chat.createReactionpublicPromise<ChatMessage>-
chat.createTopicChatpublicPromise<Chat>-
chat.deleteChatpublicPromise<void>-
chat.deleteMemberChatpublicPromise<void>-
chat.deleteMessagepublicPromise<ChatMessage>-
chat.fetchLinkPreviewspublicPromise<LinkPreviewResponse>-
chat.followChatpublicPromise<void>-
chat.getAddableMemberspublicPromise< | AddableMembersByScope | Membership[]>-
chat.getChatpublicPromise<Chat>-
chat.getChatByTopicIdpublicPromise<Chat>-
chat.getMemberChatpublicPromise<ChatMember>-
chat.getMentionableAssetspublicPromise<PaginatedResponse<Asset>>-
chat.getMentionableFolderspublicPromise<PaginatedResponse<Folder>>-
chat.getMentionablePublicspublicPromise<PaginatedResponse<MentionablePublic>>-
chat.getMentionableSubmissionspublicPromise<PaginatedResponse<MentionableSubmission>>-
chat.getMentionableTaskspublicPromise<PaginatedResponse<any>>-
chat.getMentionspublicPromise<PaginatedResponse<ChatMessage>>-
chat.getMessagepublicPromise<ChatMessage>-
chat.getMessagespublicPromise<PaginatedResponse<ChatMessage>>-
chat.getRepliespublicPromise<PaginatedResponse<ChatMessage>>-
chat.getScopeAddableMemberspublicPromise< | AddableMembersByScope | Membership[]>-
chat.getUsersMemberChatspublicPromise<PaginatedResponse<ChatMember>>-
chat.getWorkspaceProjectChatspublicPromise<any[]>-
chat.highlightMessagepublicPromise<ChatMessage>-
chat.removeAttachmentpublicPromise<ChatMessage>-
chat.removeMemberspublicPromise<ChatMember>-
chat.removeReactionpublicPromise<ChatMessage>-
chat.reviseMessagepublicPromise<ChatMessage>-
chat.unarchiveMemberChatpublicPromise<ChatMember>-
chat.unfollowChatpublicPromise<void>-
chat.unhighlightMessagepublicPromise<ChatMessage>-
chat.updateChatSubjectpublicPromise<Chat>-
chat.updateMemberChatpublicPromise<ChatMember>-
chat.updateMemberChatIconpublicPromise<{ chat: ChatMember; } & AttachmentUploadRecord>-
configreadonlyConfigMethods-
convoreadonly{ 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.completeConvopublicPromise<CompleteConvoResponse>-
convo.deleteConvopublicPromise<void>-
convo.getChatConvospublicPromise<Convo[]>-
convo.getConvopublicPromise<GetConvoResponse>-
convo.getProjectConvospublicPromise<Convo[]>-
convo.getScopeConvospublicPromise<GetScopeConvosResponse>-
convo.joinConvopublicPromise<JoinConvoResponse>-
convo.leaveConvopublicPromise<LeaveConvoResponse>-
convo.rejoinConvopublicPromise<JoinConvoResponse>-
convo.startConvopublicPromise<StartConvoResponse>-
convo.updateConvopublicPromise<UpdateConvoResponse>-
folderreadonly{ getFolder: Promise<Folder>; getFoldersAssets: Promise<PaginatedResponse<Asset>>; tagFolder: Promise<Folder>; untagFolder: Promise<Folder>; updateFolder: Promise<Folder>; updateFolderIcon: Promise<any>; }-
folder.getFolderpublicPromise<Folder>-
folder.getFoldersAssetspublicPromise<PaginatedResponse<Asset>>-
folder.tagFolderpublicPromise<Folder>-
folder.untagFolderpublicPromise<Folder>-
folder.updateFolderpublicPromise<Folder>-
folder.updateFolderIconpublicPromise<any>-
invitereadonly{ acceptInvite: Promise<AcceptInviteResponse>; cancelInvite: Promise<Invite>; getInviteById: Promise<Invite>; getInvites: Promise<PaginatedInvitesResponse>; getInvitesForResource: Promise<Invite[]>; inviteUser: Promise<Invite>; resendInvite: Promise<Invite>; }-
invite.acceptInvitepublicPromise<AcceptInviteResponse>-
invite.cancelInvitepublicPromise<Invite>-
invite.getInviteByIdpublicPromise<Invite>-
invite.getInvitespublicPromise<PaginatedInvitesResponse>-
invite.getInvitesForResourcepublicPromise<Invite[]>-
invite.inviteUserpublicPromise<Invite>-
invite.resendInvitepublicPromise<Invite>-
membershipreadonly{ 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.addRolepublicPromise<Membership>-
membership.deleteMembershippublicPromise<void>-
membership.getMyMembershipspublicPromise<Membership[]>-
membership.getProjectLastSeenpublicPromise<GetLastSeenResponse>-
membership.getProjectMembershipspublicPromise<MembershipReport>-
membership.getProjectMentionableUserspublicPromise<Mentionable[]>-
membership.getWorkspaceLastSeenpublicPromise<GetLastSeenResponse>-
membership.getWorkspaceMembershipspublicPromise<MembershipReport>-
membership.leaveResourcepublicPromise<void>-
membership.removeRolepublicPromise<Membership>-
notificationreadonly{ getNewNotificationCount: Promise<NotificationCountResponse>; getNewNotificationCountBulk: Promise<NotificationCountBulkResponse>; getNewNotifications: Promise<PaginatedNotificationResponse>; getNotifications: Promise<PaginatedNotificationResponse>; getUsersLastNotificationsSeen: Promise<LastSeenResponse>; updateUsersLastSeen: Promise<LastSeenResponse>; }-
notification.getNewNotificationCountpublicPromise<NotificationCountResponse>-
notification.getNewNotificationCountBulkpublicPromise<NotificationCountBulkResponse>-
notification.getNewNotificationspublicPromise<PaginatedNotificationResponse>-
notification.getNotificationspublicPromise<PaginatedNotificationResponse>-
notification.getUsersLastNotificationsSeenpublicPromise<LastSeenResponse>-
notification.updateUsersLastSeenpublicPromise<LastSeenResponse>-
productreadonly{ getSuggestedCurrency: Promise<{ country: string | null; currency: SupportedCurrency; locked?: boolean; supported: SupportedCurrency[]; }>; getWorkspaceProducts: Promise<Product[]>; listPlans: Promise<Product[]>; }-
product.getSuggestedCurrencypublicPromise<{ country: string | null; currency: SupportedCurrency; locked?: boolean; supported: SupportedCurrency[]; }>-
product.getWorkspaceProductspublicPromise<Product[]>-
product.listPlanspublicPromise<Product[]>-
projectreadonlyProjectMethods-
publicreadonly{ 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.createPublicAssetChatMessagepublicPromise<CreatePublicAssetChatMessageResponse>-
public.createPublicChatMessagepublicPromise<ChatMessage>-
public.createPublicTopicChatMessagepublicPromise<CreatePublicAssetChatMessageResponse>-
public.downloadAssetspublicPromise<DownloadSignedUrlData[]>-
public.getPublicAssetpublicPromise<PublicAssetResponse>-
public.getPublicChatpublicPromise<Chat | null>-
public.getPublicChatMessagespublicPromise<PublicChatMessagesResponse>-
public.getPublicDownloadUrlpublicPromise<PublicDownloadUrlResponse>-
public.getPublicEmbedFilespublicPromise<PublicEmbedFilesResponse>-
public.getPublicFileSystempublicPromise<PublicFileSystemDetailsResponse>-
public.getPublicItemspublicPromise<PublicFileSystemResponse>-
public.getPublicItemsAtPathpublicPromise<PublicFileSystemResponse>-
public.recordAccessActivitypublicPromise<void>-
public.resolvePublicDownloadpublicPromise<ResolvePublicDownloadResponse>-
settingsreadonly{ 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.cleanupOrphanedSettingspublicPromise<{ message: string; removedCount: number; }>-
settings.getAllResourceSettingspublicPromise<{ resourceSettings: ResourceSettings[]; }>-
settings.getEffectiveSettingspublicPromise<EffectiveSettings>-
settings.getResourceSettingspublicPromise< | ResourceSettings | { message: string; }>-
settings.resetResourceSettingspublicPromise<{ message: string; }>-
settings.updateResourceSettingspublicPromise<{ message: string; settings: ResourceSettings; }>-
shortlinkreadonly{ resolveShortLink: Promise<ResolveShortLinkResponse>; }-
shortlink.resolveShortLinkpublicPromise<ResolveShortLinkResponse>-
socketreadonly{ 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.connectpublic(channel, options) => Promise<SocketChannel>Connect to a socket channel
socket.connectPublicpublic(publicToken, options) => Promise<SocketChannel>Connect to a public socket channel without authentication
socket.disconnectpublic(channel) => Promise<void>Disconnect from a socket channel
socket.disconnectAllpublic() => Promise<void>Disconnect from all channels
socket.emitpublic(channel, event, data?) => voidEmit an event to a connected channel
socket.emitWithAckpublic(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.isConnectedpublic(channel) => booleanCheck if connected to a channel
socket.onReconnectpublic(channel, callback) => voidRegister 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.onReconnectFailedpublic(channel, callback) => voidRegister a callback for when Socket.IO exhausts all reconnection attempts
socket.subscribepublic<T>(channel, event, callback) => Promise<void>Subscribe to an event on a channel
socket.subscribePublicpublic<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.unsubscribepublic(channel, event, callback?) => voidStop 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.
storagereadonly{ getStorageChart: Promise<ChartDataResponse>; getStorageRecord: Promise<StorageRecord>; }-
storage.getStorageChartpublicPromise<ChartDataResponse>-
storage.getStorageRecordpublicPromise<StorageRecord>-
tagreadonly{ createTag: Promise<Tag>; deleteTag: Promise<Tag>; getTags: Promise<Tags>; updateTag: Promise<Tag>; }-
tag.createTagpublicPromise<Tag>-
tag.deleteTagpublicPromise<Tag>-
tag.getTagspublicPromise<Tags>-
tag.updateTagpublicPromise<Tag>-
taskreadonly{ 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.acknowledgeAllTaskspublicPromise<AcknowledgeAllTasksResponse>-
task.acknowledgeTaskpublicPromise<Task>-
task.bulkCreatepublicPromise<BulkCreateTasksResponse>-
task.deleteTaskpublicPromise<void>-
task.followTaskpublicPromise<Task>-
task.getMyTaskspublicPromise<GetTasksResponse>-
task.getTaskEventspublicPromise<GetTaskEventsResponse>-
task.getTaskLinkspublicPromise<TaskLink[]>-
task.getUnacknowledgedTaskCountpublicPromise<UnacknowledgedTaskCountResponse>-
task.linkTaskpublicPromise<TaskLink>-
task.tagTaskpublicPromise<Task>-
task.unfollowTaskpublicPromise<Task>-
task.unlinkTaskpublicPromise<void>-
task.untagTaskpublicPromise<Task>-
task.updateTaskDetailspublicPromise<Task>-
task.updateTaskStatuspublicPromise<Task>-
taskRelationreadonly{ createTaskRelation: Promise<TaskRelation>; deleteTaskRelation: Promise<void>; getRelationsForChat: Promise<PaginatedTaskRelations>; getRelationsForMessage: Promise<PaginatedTaskRelations>; getTaskRelations: Promise<PaginatedTaskRelations>; }-
taskRelation.createTaskRelationpublicPromise<TaskRelation>-
taskRelation.deleteTaskRelationpublicPromise<void>-
taskRelation.getRelationsForChatpublicPromise<PaginatedTaskRelations>-
taskRelation.getRelationsForMessagepublicPromise<PaginatedTaskRelations>-
taskRelation.getTaskRelationspublicPromise<PaginatedTaskRelations>-
versionreadonly{ getCommitHash: Promise<CommitResponse>; getHealth: Promise<HealthStatus>; }-
version.getCommitHashpublicPromise<CommitResponse>-
version.getHealthpublicPromise<HealthStatus>-
workspacereadonlyWorkspaceMethods-

Interfaces

BotClientOptions

Properties

PropertyTypeDescription
baseURL?stringOverride the default bot API URL (https://bot.nurama.com).
cacheDurationSeconds?numberCache duration in seconds. Default: 5
debug?booleanEnable debug logging. Default: false
enableCache?booleanEnable response caching. Default: true
fetch?(input, init?) => Promise<Response>Custom fetch implementation. Defaults to global fetch.
websocketURL?stringOverride the default bot WebSocket URL (https://bot-ws.nurama.com).

On this page