In-depth developer guides live in docs_guides/:
ChatSDKOptions field, environments, storage, and channel info.FetchThreadList vs Recover, and what the SDK handles for you.WebSocket, Intl, Promise, EventTarget, CustomEvent, JSON, Date, crypto, EventSource, etc.)npm install @nice-devone/nice-cxone-chat-web-sdk
brandId, channelId)environment)import ChatSdk, { EnvironmentName, ChatEvent, ChatEventData } from '@nice-devone/nice-cxone-chat-web-sdk';
// Minimal setup — no persistence or caching
const sdk = new ChatSdk({
brandId: 123,
channelId: 'my-channel-id',
customerId: 'customer-id',
environment: EnvironmentName.EU1,
cacheStorage: null,
storage: null,
});
cacheStorage and storage are required. Pass null if you do not want the SDK to cache or persist anything. For production use, pass real instances so customer identity, scroll tokens and other state survive page reloads:
import ChatSdk, { CacheStorage, EnvironmentName } from '@nice-devone/nice-cxone-chat-web-sdk';
const sdk = new ChatSdk({
brandId: 123,
channelId: 'my-channel-id',
customerId: 'customer-id',
environment: EnvironmentName.EU1,
cacheStorage: new CacheStorage(window.localStorage),
storage: window.localStorage,
});
By default, the SDK will not automatically connect to the server. You need to call the connect() method to establish a connection.
await sdk.connect()
It will return information about the initialized channel, including feature toggle status, translations, file upload restrictions, theme color settings, and more.
await sdk.getChannelInfo()
It will return the online/offline status information for the current channel.
await sdk.getChannelAvailability()
Get or create a Thread instance:
const thread = sdk.getThread('thread-id');
// Optionally recover a thread state (messages) from the server
const threadRecoveredData = await thread.recover();
console.log(threadRecoveredData.messages);
getThread() is synchronous — it returns a Thread (or LivechatThread for livechat channels) without any network call.
await thread.sendTextMessage('Message text');
thread.onThreadEvent(ChatEvent.MESSAGE_CREATED, (event: CustomEvent<ChatEventData>) => {
if (!isMessageCreatedEvent(event.detail)) {
return;
}
const message = event.detail.data.message;
console.log(message);
});
loadMoreMessages() returns null when there are no more messages to load (no scroll token), so the result must be null-checked:
const loadMoreMessageResponse = await thread.loadMoreMessages();
if (loadMoreMessageResponse !== null) {
console.log(loadMoreMessageResponse.data.messages);
}
await thread.lastMessageSeen();
startChat() and endChat() are available only on livechat channels — they are methods of LivechatThread, which is the concrete type returned by sdk.getThread(...) when the channel is configured as livechat. Livechat channel needs to call startChat() method first to start the chat. Customers might end the chat by calling endChat() method.
const thread = sdk.getThread('thread-id') as LivechatThread;
await thread.startChat();
Get position in queue:
sdk.onChatEvent(ChatEvent.SET_POSITION_IN_QUEUE, (event) => {
if (isSetPositionInQueueEvent(event)) {
setQueuePosition(event.detail.data.positionInQueue);
}
});
const threads = await sdk.getThreadList();
const metadata = await thread.getMetadata();
await thread.archive();
await thread.setName('New thread name');
await thread.sendAttachments(fileList);
Send typing events. Can be called multiple times, for example on every keypress:
thread.keystroke();
// Optionally call stopTyping() when the user stops typing or leaves
thread.stopTyping();
Receive typing events:
// Listen for START and STOP typing events
thread.onThreadEvent(ChatEvent.AGENT_TYPING_STARTED, (event: CustomEvent<ChatEventData>) => {
// Do something with the event
});
thread.onThreadEvent(ChatEvent.AGENT_TYPING_ENDED, (event: CustomEvent<ChatEventData>) => {
// Do something with the event
});
sdk.onChatEvent(ChatEvent.ASSIGNED_AGENT_CHANGED, (event) => {
const assignee = event.detail.data.inboxAssignee;
const agentName = `${assignee?.firstName ?? ''} ${assignee?.surname ?? ''}`.trim();
});
Generated using TypeDoc