Skip to main content
Every request carries an API key as a bearer token:
A missing, malformed, unknown, revoked or expired key always gets the same answer, 401 with code unauthenticated. The API never tells you which part was wrong, so a guessed key learns nothing.

Two kinds of key

A personal key is logged under its owner’s name in the audit log, and can never do more than its owner’s current role allows: demote the person and their key shrinks with them. It stops working the moment they leave the workspace or are suspended (401, or 403 key_owner_inactive). Some operations act as a person and need a personal key. They’re marked x-requires-personal-key in the spec and “Needs a personal key” in the API reference. A workspace key gets 403 personal_key_required:
  • Whispering to the agent, listening in and taking over (/whisper, /operator)
  • Call notes
  • Asking for a number we don’t stock (POST /v1/numbers/requests) and asking for minutes (POST /v1/minutes/requests)
  • Transferring a call to a typed number (to). Workspace keys may transfer only to the agent’s configured destinations (destination_id).

Key format

  • Kallabot stores only a peppered SHA-256 hash of the key. Nobody at Kallabot can read it back, and there is no “show key” button. If you lose a key, make a new one.
  • The dashboard shows the first characters (kb_live_7k2m) and the last four, so you can tell keys apart.
  • Old sk_ and bn- keys from the previous platform no longer work.
Secret scanners can match the kb_live_ prefix. If a key ever lands in a commit or a log, revoke it at once in Settings → For developers → API keys.

Create a key

Keys are created in the dashboard, by a person, never through the API. A leaked key that could mint new keys would be impossible to contain, so the key endpoints accept only a signed-in session. Calling them with an API key returns 403 wrong_auth_plane.
1

Open the keys page

Settings → For developers → API keys. Workspace keys need the owner, admin or developer role. Anyone can make personal keys for themselves under Your personal keys; owners and admins can also see their teammates’ personal keys.
2

Name it after what uses it

For example Website lead form or CRM sync. One key per integration makes revoking one painless.
3

Choose its access

Pick a preset (below). A key can never hold a scope the person creating it doesn’t have.
4

Choose its lifetime

30 days, 90 days or 1 year. Every key expires; the longest a key can live is one year.
5

Copy it once

The full key is shown in this one response and never again.

Access presets

Scopes

A scope answers “may this key do this kind of thing at all?”. Each operation in the API reference lists the scopes it needs, and the OpenAPI spec carries them as x-required-scopes. A key missing one gets 403 insufficient_scope, and the detail names what’s missing.
Scopes decide what a key may do. Which rows it can see is decided separately. An API key sees the whole workspace, unless its access was narrowed to specific agents, in which case it can only use and see those agents.

Agents

Calls

Chat

Knowledge and tools

Numbers

Webhooks and minutes

Dashboard-only scopes

These exist for people signed in to the app. They are not part of the public API and API keys don’t use them: apikey:read, apikey:write, audit:read, audit:export, analytics:report, provider:read, call:listen, whatsapp:read, whatsapp:content, whatsapp:write, whatsapp:reply.

Actions only a person can take

Some actions need a person behind them, even with call:control. Use a personal key for them: whispering, listening in, taking over, transferring to a typed number, and call notes. Saved call views also belong to a person.

IP allowlist

Limit where your keys can be used from in Settings → API keys → Allowed IP addresses. Add up to 20 addresses or ranges (CIDR, like 203.0.113.0/24). A request from anywhere else gets 403 ip_not_allowed, even with a valid key. An empty list means any address.

Rotate a key

Click Roll on a key to rotate it without downtime:
1

Roll the key

Kallabot issues a new key with the same name, scopes, environment and lifetime as the old one. The new key is shown once.
2

Deploy it within 24 hours

The old key keeps working for 24 hours, so you have time to switch every place that uses it.
3

Watch the old key go quiet

The keys list shows each key’s last used time. After 24 hours the old key stops on its own.
Behind the button, rotation accepts a grace period of 0 to 72 hours (grace_hours, default 24), where 0 retires the old key immediately. The dashboard always uses 24 hours. If a key may have leaked, don’t roll it. Revoke it: it stops within seconds, everywhere. Then create a new key. Give a short reason when you revoke; it’s kept in the audit log.

Other ways a key stops working