Skip to main content
Website embed is not the Developer API. The secret API key starts phone calls from your server. The public widget key starts in-browser voice on sites you allow.
Do not paste the Developer API key into a website, WordPress snippet, or frontend JavaScript. Anyone who can view the page could place billed phone calls. Website install uses the public widget key only.

Corner bubble

Default launcher. A mic button in the bottom corner. Click it to open the agent.

Your website UI

Keep your own card or button. Click it and the agent starts speaking.

Ready-made card

Drop a tap-to-talk card anywhere on the page. It stays there. It does not follow scroll.

Setup in the dashboard

Settings → Web Embed generates the exact snippet. You do not need to write it by hand.
  1. Open Settings → Web Embed.
  2. Turn Enable website embed on (Pro plan).
  3. Click Generate key and copy the tvk_pk_… value.
  4. Add 1 entry per website domain (e.g. https://www.acme.com) to authorize it, and pick a Default Fallback Agent. Localhost is always allowed for testing.
  5. Copy the snippet for Corner bubble, Your website UI, or Ready-made card.
The same public widget key is used on every site. To run different agents on the same site, pass data-agent-id. If you omit it, the default fallback agent for that domain is used. Requested agents must belong to your workspace or the session is rejected. Existing installs that only set data-public-key, data-agent-id, and data-position keep the corner bubble. Custom UI and the ready-made card are opt-in with data-ui.

Calls, billing, and webhooks

Conversations are stored in Call Logs with origin web embed. Billing uses those call logs the same way as other voice minutes (duration and tokens). If the workspace has a webhook URL under Settings → Developer API, the usual post-call webhook still fires. The payload includes origin: "web embed".

Multiple websites

  • One domain, many agents: add 1 domain entry (e.g. https://www.acme.com). Pass data-agent-id="AGENT_UUID" on each snippet. If it is omitted, the Default Fallback Agent for that domain is used.
  • Many domains: add an entry per domain under Settings → Web Embed.
  • Agents must belong to your workspace. Other workspaces’ IDs are rejected with 403 Forbidden.

Domain allowlist

The public key only works on origins you list. Use:
  • A full origin: https://www.acme.com
  • A host: acme.com
  • A wildcard subdomain: *.acme.com
If a site is missing from the list, the widget refuses to start.

Script attributes

Regenerating the widget key

Regenerate key on Web Embed replaces the stored key. Update data-public-key on every website that embeds the agent.