The in-product voice SDK for developers

Three lines of code. One click, and your users are talking to you.

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

From install to first call in minutes

  1. Create a project and get your key.

    Sign up free, create a project, and get a browser-safe pk_ publishable key. Lock it to your domains.

  2. Embed the button.

    Add the default button in three lines, or wire the headless core into your own UI.

  3. Answer in the Inbox.

    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

From a one-line default UI to fully custom, your choice

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 })

Customizable components

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 })

Headless core

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

When a trial user gets stuck, let them reach a human

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.

  • Context comes with the call. Pass metadata such as page path or plan (up to 4 KB) so your agent knows where the user is.
  • Route with queues. Use a queue (e.g. onboarding) to separate call types.
  • Multiple agents, no double-answers. Several agents can be online; each call is claimed by exactly one.
  • Webhooks into your stack. call.ringing, call.answered, call.ended, call.failed are delivered HMAC-signed to your backend for CRM or analytics.
  • When nobody's online the SDK returns no_agent_online, so you can show a fallback contact option.

Security

Designed to live in the browser

  • Publishable keys only in the browser.

    The SDK accepts only pk_ keys and refuses a secret sk_ key.

  • Origin allowlist.

    Restrict which of your domains can start calls with a key.

  • Short-lived, call-scoped media tokens.

    Each call gets a token valid only for that call room, and it expires automatically.

  • Encrypted in transit.

    Audio travels over encrypted WebRTC (DTLS-SRTP).

  • No recordings.

    CallEmbed doesn't record call audio; it stores call records only (time, duration, status).

  • Signed webhooks.

    Every webhook carries an HMAC X-CallEmbed-Signature; destination URLs are SSRF-checked before every delivery.

  • Roles and rate limits.

    Separate admin and agent roles, instant member removal, and API rate limiting.

Simple pricing, by the minute

Start free. Upgrade as you grow. Unlimited agents on every plan.

Free

Free trial: 30 minutes, no credit card required

$0

—

  • Included minutes 30-minute one-time trial (doesn't reset)
  • 1,000-min pack $40
  • Agents · projects Unlimited
Start free

Explore

For your first users

$19 / mo

$190 / yr

  • Included minutes 800 min
  • 1,000-min pack $30
  • Agents · projects Unlimited
Choose Explore

Pioneer

For high volume and many teams

$99 / mo

$990 / yr

  • Included minutes 6,000 min
  • 1,000-min pack $20
  • Agents · projects Unlimited
Choose Pioneer

Enterprise

High volume or custom needs

Custom

Custom

  • Included minutes Volume-based
  • 1,000-min pack Per contract
  • Agents · projects Unlimited
Contact us

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

  • No surprise bills. When your trial or monthly minutes and packs run out, new calls return quota_exceeded. We never charge you automatically, and calls already in progress aren't cut off.
  • Top up anytime. Buy 1,000-minute packs, valid for 12 months from purchase. Monthly included minutes are used first, then packs, oldest first.
  • Monthly included minutes don't roll over. The Free plan is a one-time 30-minute trial per organization; after that, upgrade or buy a minute pack.
  • We email you at 80% and 100% of your minutes.
  • Payments are handled by Paddle, our Merchant of Record, which takes care of sales tax/VAT. Prices in USD, excluding applicable taxes.

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.

FAQ

Do users need an app or a phone number?
No. Calls run in the browser; users just allow microphone access.
How does my team answer?
In the CallEmbed Inbox, a browser page your agents keep open. They go online, and it rings when a call comes in.
Which platforms are supported?
The Web SDK (TypeScript/JavaScript via npm or CDN) today. Mobile SDK coming soon.
Can it call regular phone numbers?
Not today. CallEmbed is browser-to-browser in-product calling, with no PSTN/phone numbers.
Is there an AI voice agent?
No. CallEmbed connects users with real people.
What if no one is online?
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.
Can I match my brand?
Yes. Use CSS variables for color, radius and font, override the text, or hide the branding. Go headless for full control.
Which languages does the UI support?
Traditional Chinese and English built in (locale: 'zh-TW' | 'en'); every string can be overridden.
Do you record calls?
No. We keep call records (time, duration, status) only.
What happens when I run out of minutes?
New calls return quota_exceeded, with no surprise charges. Buy a minute pack or upgrade (see the pricing FAQ).
How do I pay?
By card via Paddle, which handles tax and receipts. [confirm payment methods]
Can I get a refund?
See our Refund Policy. [policy TBD]

Let your users hear a real voice, today.

Sign up free and take your first call in minutes.