pk_live_...) are public credentials that the
embeddable web widget uses from the browser. Unlike secret API keys,
they are scoped to a specific agent (or a webhook that will dynamically
resolve one) and gated to a list of allowed origins — safe to ship in
your front-end code.
Each key is associated with exactly one of:
mode = "agent": fixed binding to an agent id. Simplest setup.mode = "webhook": the widget calls yourcall.incomingwebhook to dynamically resolve an agent per visitor.
Endpoints
Publishable key object
List publishable keys
Create a publishable key
Allowed-domain rules
- An exact match:
example.com - A wildcard match:
*.example.com(matchesapi.example.combut not bareexample.com) localhostand127.0.0.1are always allowed during local dev, regardless of the list- Bare wildcards (
*or*.*) are rejected with400 - At least one entry is required — passing an empty array returns
400 allowed_domains: "At least one allowed domain is required."
201 Created with the new Publishable key object.
The key field is included on creation and is retrievable later
via GET — publishable keys are public by design.
Update / delete
PATCH accepts any subset of name, allowed_domains, mode,
agent_id, webhook_url, is_enabled. Switching between modes
requires providing the new required field (agent_id or
webhook_url).
DELETE sets is_active=false — the key stops working but remains
visible in list responses so you can audit prior deployments. There is
no hard delete.
Transfer a publishable key
Related
Widget overview
How the widget uses
pk_live_ keys at runtime.Dynamic webhook config
Shape the
call.incoming webhook must respond with in webhook mode.