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

# Test your browser calling setup with the SDK demo

> Place a real outbound test call from the dashboard's Browser Softphone Demo page at Developer → SDK Live Demo — the supported end-to-end check for the LiveKit/WebRTC softphone path before you embed it in your own app.

# Test your browser calling setup with the SDK demo

The dashboard ships a built-in test-call page, **Developer → SDK Live
Demo**, at `/developer/sdk-demo`. It places a real outbound call from
the browser through LiveKit/WebRTC — the same path the dashboard
softphone and the `Softphone` component in the [Web SDK](/sdks/web)
use — so you can verify your whole browser-calling chain from one
screen.

This page exists to give developers a safe, supported way to place a
test call. The raw SIP-over-WSS register path in the Web SDK depends on
a SIP WSS gateway being provisioned, and in most environments it
is not — a raw SIP client will fail to register. The demo rides the
LiveKit/WebRTC path instead, which works out of the box. To embed the
same path in your own app, follow
[the browser softphone setup guide](/guides/voice-softphone-browser-calling).

<Warning>
  Demo calls are real outbound calls, billed to your organization. Dial a
  sandbox number or your own phone while testing — not a customer.
</Warning>

## Who can open it

Placing a call spends wallet credit, so the page is restricted to the
**owner**, **admin**, and **developer** roles. Agents, viewers, and
billing roles can't reach it. If the page doesn't appear in your
Developer menu, ask an org owner for one of those roles.

## What it exercises

The demo runs the same two-step sequence every browser softphone uses:

1. **Get a LiveKit token** — `POST /voice/softphone/token` joins your
   browser to the organization's voice room and publishes your
   microphone.
2. **Dial the PSTN leg** — `POST /voice/softphone/dial` bridges the
   room to the phone number over the wholesale softswitch.

The page shows the call state (`connecting`, `dialing`, `ringing`,
`on_call`, `reconnecting`, `failed`) and, when a call fails, the
specific reason inline — for example a blocked microphone, a caller ID
your org doesn't own, or a compliance quiet-hours window. The Web SDK
`Softphone` component runs the same sequence internally.

## Place a test call

1. Open **Developer → SDK Live Demo** in the dashboard.
2. **Caller ID (optional):** enter an E.164 number your org owns (for
   example `+14155552671`). Leave it blank and the API picks your first
   dialable number — ownership is enforced either way.
3. **Destination:** enter the destination in E.164 format (for example
   `+15559876543`). Pick a sandbox number or your own phone.
4. Press **Call** and allow the microphone prompt.
5. Watch the state badge through `ringing` into `on_call`, then read the
   result — a failed call shows the specific reason inline, and
   in-call controls let you toggle mute or send DTMF tones.

If the call fails with an ownership error on the caller ID, buy or
port the number first (the caller ID gate is an ownership check, not a
format check). If the microphone prompt never appears, confirm you're
on HTTPS and that the browser has mic permission for the dashboard
origin.

## Where to go next

* [Browser softphone setup](/guides/voice-softphone-browser-calling) —
  register devices, mint credentials, route inbound, and embed the
  softphone in your own app.
* [Web SDK](/sdks/web) — the `Softphone` component and its event map.
* [API reference](/api-reference) — the `/voice/softphone/token` and
  `/voice/softphone/dial` endpoints behind this page.
