JavaScript Chat SDK

Use the isomorphic chat client without React.

Last reviewed

JavaScript Chat SDK

Use the JavaScript Chat SDK when you want the chat client without React. It works in browsers, React Native, and server-side proxy code with fetch.

How authentication works

Chat requests always use a JWT bearer token created by your app.

Before you create the client, configure your backend or auth provider to mint a JWT for the signed-in user. That token must be intended for your getuserfeedback.com app:

aud: https://getuserfeedback.com/v1/apps/{appId}sub: your user id

If your getuserfeedback.com app uses a custom JWT claim mapping, include exactly one claim that maps to userId. The examples use sub, which is the default.

Your app should fetch that token from your own auth flow, then pass it to the client. The SDK sends the token on each API request:

Authorization: Bearer <token>

getuserfeedback.com verifies the token and uses the signed user id to decide which conversations to return. See User authentication for issuer, JWKS, audience, and claim setup.

1. Install

npm install @getuserfeedback/chat

2. Create the client

TypeScriptchat-client.ts
import { createChatClient } from "@getuserfeedback/chat";export const chat = createChatClient({auth: {jwt: {token: await fetchGetUserFeedbackChatToken(),},},});

Refresh the token when your auth provider rotates it:

await chat.configure({auth: {jwt: {token: await fetchGetUserFeedbackChatToken(),},},});

Clear auth on logout:

await chat.configure({auth: {jwt: null,},});

The default API base URL is https://api.getuserfeedback.com/v1.

If you proxy requests through your backend, pass your own absolute baseUrl:

const chat = createChatClient({baseUrl: "https://app.example.com/api/chat/v1",auth: {jwt: {token: await fetchAppSessionToken(),},},});

Custom baseUrl values are used exactly, including any path prefix. Your backend should authenticate that app session token, then call getuserfeedback.com with a JWT minted for your getuserfeedback.com app and that user.

3. List conversations

const { conversations, nextCursor } = await chat.conversations.list({limit: 25,});

Load the next page with the returned cursor:

if (nextCursor) {const nextPage = await chat.conversations.list({cursor: nextCursor,limit: 25,});}

4. List messages

const { messages, nextCursor } = await chat.messages.list({conversationId: conversations[0].id,limit: 50,});

5. Send a message

const { message } = await chat.messages.send({conversationId: conversations[0].id,text: "Hello from my app.",});

Handle errors

Failed API responses throw ChatApiError.

import { ChatApiError } from "@getuserfeedback/chat";try {await chat.conversations.list();} catch (error) {if (error instanceof ChatApiError) {console.log(error.status, error.code, error.message);}}

Next