The SignalWire Browser SDK puts voice, video, and chat in a browser without plugins, downloads, or a media server you have to run. It also integrates with powerful AI agents, SWML, and all telephony and communication services SignalWire provides.
How would you like to get started?
Drive everything yourself with @signalwire/js — client.dial(),
observables, your own UI. Best when you want full control over how
the call looks and behaves.
Add <sw-call-widget> or <sw-click-to-call> to a page and you’re
done — a styled, working call UI with one element. Best for
marketing sites, click-to-call buttons, and quick integrations.
If you have Node + npm (or you can drop a <script> tag in an HTML
file), you’re set. You’ll also need a
Subscriber Access Token (SAT) —
mint one from the SignalWire Dashboard’s Subscribers section.
For a quick experiment, or if you’re building a public widget like a chatbot or click-to-call button, you can use an embed token instead. Embed tokens are built primarily for embedded widget applications but work for many other use cases. See Trying it without a backend below.
RxJS is a peer dependency — the SDK uses observables for all reactive state. See the RxJS Primer when you’re ready to dig in.
For a quick script-tag setup, pin a version rather than @latest:
For a no-build setup, load the SDK as an ES module from a CDN that rewrites Node built-ins for the browser (esm.sh, jspm.io, skypack):
If it worked, you’ll see your own camera in localVideo and a
black frame in remoteVideo — /public/test-room is empty until
someone else joins. Open the same page in a second tab to see the
remote stream light up. The browser console should log
status: connected once media is flowing.
If your camera light isn’t on, check the Troubleshooting guide — usually permissions, HTTPS, or a denied microphone prompt.
Embed tokens (c2c_… / c2t_…) are public tokens designed for
embedded widgets — chatbots, click-to-call buttons, in-page call
UIs — but they’re also the fastest way to prototype from a static
HTML file without standing up a backend to mint SATs.
Create one by setting up a Click to Call resource in the dashboard (sidebar → Tools → Click to Call). From the resource you create, copy three values:
/public/support) — what you’ll dialc2c_…) — the embed tokenyourspace.signalwire.com) — from the
API Credentials section of the dashboardPass them to the one-call helper:
embeddableCall builds the client, connects, and dials in a single
call. Embed tokens are safe to expose in client code — see
Authentication for the full token
model.
To accept incoming calls, register the client and watch the inbound list:
Inbound calls require a Subscriber Access Token (SAT) issued for a specific user — embed tokens and guest tokens are outbound-only. The full accept-and-wire pattern, including caller name handling and ringing-UI teardown, lives in Inbound Calls.
Mute, layouts, screen share — flesh out the call UI.
Drop in <sw-call-widget> or <sw-click-to-call> instead.
Mint SATs from your backend and pick a refresh strategy.
Understand the observable patterns the SDK uses.
SignalWire — top-level clientStaticCredentialProvider, EmbedTokenCredentialProvider — credential providersSignalWire.dial() — place an outbound callSignalWire.register() / session.incomingCalls$ — receive callsembeddableCall() — one-call helper for embed tokens