Skip to main content
Most problems show up in two places: the browser console, and the error passed to your onError callback. The call window itself shows a generic message, such as Unable to start the call. Please try again., so always check the console or onError for the real cause. A refused call start looks like this:
The number in parentheses is the HTTP status; the text after it is the API’s message. Messages say “campaign” because agents used to be called campaigns.

Error messages

The widget doesn’t appear

The script tag needs data-agent (or the legacy data-campaign) or data-token. Without one, it doesn’t create a widget and logs nothing. Check the attribute name and that the value isn’t empty.
[CallerWebSDK] Invalid JSON in data-vars attribute. or ... data-theme attribute. means the attribute isn’t valid JSON. Wrap the attribute in single quotes and use double quotes inside: data-vars='{"name":"Jane"}'.
Check the Network tab. Ad blockers or a Content Security Policy can block https://cdn.callers.ai. See the CSP list in the overview.
That’s expected: the launcher is hidden until you call call(). With hidden: true, nothing is shown at all until you call show().

The call doesn’t connect or has no audio

If the visitor blocks the microphone, the call can’t connect and ends immediately (onCallEnded fires). Ask them to allow the microphone from the site settings icon in the address bar and try again. Make sure the page is served over HTTPS, and inside an <iframe> add allow="microphone".
Browsers block audio that doesn’t start from a user action. Call call() from a click or tap handler, not on page load or after an await that runs long after the click. Also check the visitor hasn’t turned off the speaker (isDeafened()).
Check isMuted(). Text conversations start with the microphone muted; turning it on switches to voice. Some corporate networks block WebRTC traffic; try another network to confirm.
The SDK hangs up if the call isn’t answered within 30 seconds. Check that the agent answers a test call from the dashboard.
AI noise suppression is on by default. If you pass your own noiseSuppression object, leave browserEchoCancellation on. Headphones help on laptops.

Local development

Allowed domains are stored without ports, so http://localhost:3000 never matches. Use token authentication locally, or test in the playground.
The data-vars snippet from the dashboard contains placeholders. Replace them with real values from your page or template before the HTML reaches the browser.

Bot protection

Make sure your page’s hostname is listed on the Turnstile widget in Cloudflare, and that https://challenges.cloudflare.com isn’t blocked. Errors from the in-browser check are Captcha verification failed, Captcha verification expired or Captcha verification timed out.
Intended: with bot protection on, visitors close and reopen the widget so each conversation gets a fresh check.

Avatars

Avatars only appear on voice calls. Look for console warnings starting with Avatar or WebCall: invalid avatar name. If the model can’t load (blocked by CSP or a content blocker), the call continues without the avatar.
The avatar falls back to the CPU automatically. It still works, but may be less smooth on older devices. webCall.avatarStats.backend shows webgpu or wasm.

Still stuck?

Send support@callers.ai the agent ID, the page URL, the full onError message, and the session ID from webCall.getUsername() (read it during the call).

Playground

Reproduce the problem; the playground explains failed calls in plain language.

Authentication

Domain allowlists and token rules.

Bot protection

Turnstile setup and the web-call config endpoint.

Troubleshooting

Problems on the agent side: dialing, audio, webhooks.