> ## Documentation Index
> Fetch the complete documentation index at: https://docs.osvi.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Troubleshooting the chat SDK

> Find the cause from what you or your visitors see

Start from what you see. Each entry names the [error code](/website-chat/error-codes) behind it, which is what the headless client reports.

## The launcher does not appear

1. **Anonymous usage is off** (`public_chat_disabled`). It is off by default. The browser console shows one warning saying so. Switch it on in **Channels → Web widget** and press **Save**, then reload the page. Logged-in chats do not need it.
2. **The script did not load.** Check the browser console and network log for the `widget.js` request. A Content Security Policy must allow the CDN; see [Production setup](/website-chat/production#content-security-policy).
3. **The agent ID is wrong.** It must be the full `agent_…` value from the dashboard, not a bare UUID.
4. **`launcher` is set to `none`.** Then only your own button opens the chat, through `OsviChat.open()`.

If the page-load check itself fails or times out (8 seconds), the launcher still shows, so a network problem appears later as an error inside the panel.

## "This chat is not enabled for this website"

The page's origin is not in **Allowed websites** (`origin_not_allowed`). Compare it exactly, including scheme, host and port: `https://www.acme.com` and `https://acme.com` are different, and `https://*.acme.com` does not cover `acme.com`. An empty list allows no website. On your computer, tick **Allow localhost for testing**. The rules are in [Allowed websites](/website-chat/dashboard-settings#allowed-websites).

## "This chat is unavailable"

The agent is stopped, archived or the ID does not match an agent (`agent_inactive`, `agent_archived`, `agent_not_found`). Start the agent or fix the ID in your snippet.

## "This chat is no longer available"

Anonymous usage was switched off while the panel was open (`public_chat_disabled`). The transcript stays visible and the composer is disabled. Switch it back on to accept new messages.

## "This chat is busy right now"

The agent reached its daily cap of anonymous conversations (`daily_limit_reached`). Only new conversations are refused; conversations already started that day keep working. The cap resets at 00:00 UTC. Raise **Conversations per day**, and check the usage counter for traffic you did not expect; see [Abuse and availability](/website-chat/security#abuse-and-availability).

## "Too many messages" with a countdown

A rate limit was reached (`rate_limited`): 20 messages a minute in one conversation, or 60 an hour from one IP for the agent. The message is sent automatically when the countdown ends, up to three times, then shown as not sent with **Retry**. Visitors behind one office or mobile network share the hourly limit. If real traffic keeps reaching it, contact Osvi AI support.

A "Too many requests. Please try again in a few minutes." message instead means too many new conversations or tokens came from one IP; it is not retried automatically. Custom clients should honour `Retry-After`.

## "This conversation has reached its message limit"

The agent has a per-conversation message limit and this conversation reached it (`session_limit_reached`). The visitor can press **New chat** to continue. If real conversations reach it, raise or turn off **Messages per conversation**. On SDK 0.1.2 the visitor instead sees "Message not sent" with a **Retry** that fails again.

## A logged-in chat does not connect

Your token endpoint failed or returned an invalid token (`token_failed`, `invalid_token`), or the customer ID uses the reserved `web:` visitor format (`invalid_customer_id`). Check that the endpoint returns `token`, `wsUrl` and `expiresAt`, and see [Logged-in users](/website-chat/server-mode).

## The conversation ended or did not resume

The session closed or went dormant after inactivity (`session_closed`, `session_not_found`); start a new chat. Dormant sessions cannot be resumed from the browser. In server mode, your backend starts a fresh session when the SDK calls `getToken({ newSession: true })`.

## The chat forgot a visitor (Safari and private windows)

Anonymous chat remembers a visitor in browser storage. Safari's privacy controls, private windows or clearing site data remove it, so the visitor starts a new chat. Server mode keeps history on your backend and stores nothing in the browser. The keys are listed in [Browser storage](/website-chat/configuration#browser-storage).

## The unread badge is wrong for a returning visitor

The badge is checked on page load, and again when the tab becomes visible (at most every 30 seconds) until the panel is first opened, compared with the `osvi.chat.seen.<agentId>` marker in browser storage. The widget opens no live connection until the panel is opened, so new replies update the badge only after the panel has been opened once on that page.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.