Domains & security

Seny enforces an origin allowlist on every voice connection so nobody can embed your widget on a site you don't control and burn through your credits.

Adding allowed domains

Open the Permissions tab on any agent and scroll to the Allowed domains section, then add the domains where you want the widget to work. Subdomains are automatically included, so adding example.com also permits www.example.com and app.example.com. (Channels → Web chat shows the same list read-only.)

If the list is empty, the widget accepts connections from anywhere — fine for testing but not what you want in production.

How the allowlist is enforced

  1. The embedded script opens a WebSocket to Seny's voice broker with an Origin header set by the browser.
  2. The broker extracts the hostname from Originand checks it against the agent's allowlist.
  3. If the host matches one of your entries (or a subdomain of one), the session is allowed to start. Otherwise the connection closes with code 1008 and a origin not allowedmessage in the browser console.

Development origins

Only localhost, 127.0.0.1, and Seny's own dashboard and test surfaces bypass a configured allowlist, so you can develop locally and use the in-app test panel without touching it. Third-party playgrounds and tunnels (CodePen, ngrok, *.vercel.app, and the like) get no special treatment — they work only while your allowlist is empty. Once you add a production domain, add any staging or preview hosts you still need alongside it.

Credit isolation

Every conversation debits credits from the organization that owns the agent, not from a shared pool. If an abusive page bypasses your allowlist somehow, the blast radius is one agent's credit pool. (Client workspaces on reseller billing draw from the parent organization's pool by design.)

Rate limits

Seny applies per-plan concurrency caps so a runaway site can't saturate your quota:

  • Free trial — 2 concurrent conversations
  • Starter — 10 concurrent
  • Growth — 50 concurrent
  • Scale — 500 concurrent
  • Enterprise — custom

When the cap is hit, new connections are rejected with WebSocket code 1013 (try again later). The visitor sees a connection error and can retry once a slot frees up.

Data privacy

Voice calls are recorded — visitor and agent on separate stereo channels — and each recording is available for playback on the conversation page, alongside the transcript and tool calls. Redaction rules (Settings → Redaction) can strip sensitive values from transcripts before they're stored.