One-line default UI
mountButton adds a button and call panel in one line, with built-in Traditional Chinese and English.
CallEmbed.mountButton("#talk", { queue })
The in-product voice SDK for developers
Drop a "talk to a human" button into your SaaS. Users speak with your team right in the browser, with no phone number, no app to install, and no leaving your product.
Free trial: 30 minutes, no credit card required. Unlimited agents.
import { CallEmbed } from "@callembed/sdk";
import { mountButton } from "@callembed/sdk/ui";
CallEmbed.init({ publishableKey: "pk_…", apiBaseUrl: "https://<your-api-host>" });
mountButton("#talk", { queue: "onboarding" });
<script src="https://cdn.jsdelivr.net/npm/@callembed/sdk"></script>
<script>
CallEmbed.init({ publishableKey: "pk_…", apiBaseUrl: "https://<your-api-host>" });
CallEmbed.mountButton("#talk", { queue: "onboarding", label: "Talk to a human" });
</script>
Built on LiveKit real-time media infrastructure
How it works
Sign up free, create a project, and get a browser-safe pk_ publishable key. Lock it to your domains.
Add the default button in three lines, or wire the headless core into your own UI.
Your team logs into the CallEmbed Inbox and goes online. When a user clicks, the Inbox rings, and one click answers.
One SDK, three levels of control
mountButton adds a button and call panel in one line, with built-in Traditional Chinese and English.
CallEmbed.mountButton("#talk", { queue })
Theme with CSS variables like --ce-accent, override any text via copy, and hide the CallEmbed branding row.
:root { --ce-accent: …; } · init({ copy, branding: false })
No UI at all. Use startCall plus events (ringing, answered, ended, error) to drive your own interface.
CallEmbed.startCall({ queue, hidePanel: true, on: { answered } })
Web SDK (TypeScript / JavaScript) available today. Mobile SDK coming soon.
Use case
Trial users who get stuck during setup, integration or first use usually just leave. Put a "talk to a human" button on the pages that matter, and they can speak with your team in the moment. Questions get answered and trials get unstuck.
metadata such as page path or plan (up to 4 KB) so your agent knows where the user is.queue (e.g. onboarding) to separate call types.call.ringing, call.answered, call.ended, call.failed are delivered HMAC-signed to your backend for CRM or analytics.no_agent_online, so you can show a fallback contact option.Security
The SDK accepts only pk_ keys and refuses a secret sk_ key.
Restrict which of your domains can start calls with a key.
Each call gets a token valid only for that call room, and it expires automatically.
Audio travels over encrypted WebRTC (DTLS-SRTP).
CallEmbed doesn't record call audio; it stores call records only (time, duration, status).
Every webhook carries an HMAC X-CallEmbed-Signature; destination URLs are SSRF-checked before every delivery.
Separate admin and agent roles, instant member removal, and API rate limiting.
Start free. Upgrade as you grow. Unlimited agents on every plan.
Free trial: 30 minutes, no credit card required
$0
—
For your first users
$19 / mo
$190 / yr
Most popular
For active trials & onboarding
$49 / mo
$490 / yr
For high volume and many teams
$99 / mo
$990 / yr
High volume or custom needs
Custom
Custom
All plans include — Web SDK, all three layers (headless / components / one-line UI) · Agent Inbox · Dashboard · Signed webhooks · Origin allowlist · Members & invites · Unlimited agents and projects
quota_exceeded. We never charge you automatically, and calls already in progress aren't cut off.In Taiwan terms, paid plans work out to about NT$0.53–0.76 per minute (packs NT$0.64–1.28). A Chunghwa Telecom 0800 toll-free line costs the business NT$6.0 per minute at peak when callers dial from a mobile phone, plus a monthly fee per number.¹
¹ Assumes full plan usage; at lower usage the effective per-minute cost is higher. 1 USD = NT$31.88 (Bank of Taiwan spot mid, 2026-10-10). 0800 rates from Chunghwa Telecom's published price list, checked 2026-10-10.
startCall returns no_agent_online, so you can show email or a booking form instead. Unanswered calls time out (90s by default) with no_answer.locale: 'zh-TW' | 'en'); every string can be overridden.quota_exceeded, with no surprise charges. Buy a minute pack or upgrade (see the pricing FAQ).Sign up free and take your first call in minutes.