Skip to main content
An agent is a versioned JSON config: who it is, how it sounds, how it listens, what it knows and what it can do. The same agent answers your phone numbers, places outbound calls, takes browser calls and replies on chat channels.

The lifecycle

  • Draft. Every save writes a draft version. Callers never hear a draft.
  • Publish. Makes the current draft the live version. From then on, new calls and chats use it. Calls already in progress keep the version they started with.
  • Versions. Every published version is kept. GET /v1/agents/{agent_id}/versions lists them, and POST …/versions/{version_id}/revert turns an old one into a new draft.
  • Archive. DELETE archives the agent, with a required reason. It’s never a hard delete, because calls and audit records still point at it. Archived agents stop taking calls and drop out of the default list.
The agent object tells you where it stands:

A complete config

Every field is optional and has a server default. The smallest valid agent is {"config": {"prompt": "…"}}. A realistic one:

Config reference

The full schema, with every field and its limits, is in the API reference under Agents. The blocks you’ll use most:
Speech recognition. The defaults are tuned for Gulf callers who switch between English, Arabic, Urdu and Hindi mid-sentence.
The voice. Voices come from Cartesia (model sonic-3.6). The easiest way to pick one is in the dashboard’s voice picker, where you can hear each voice and clone your own; then copy its id into tts.voice.
When the agent decides the caller has finished, and how human it sounds.
Google connections are made in the dashboard; their ids come from there.
What the summary step looks for once a call or chat ends. Results arrive on the call (disposition, summary, extracted) and in the call.analyzed webhook.
Any JSON you like. It’s echoed back on every call record, so you can tie calls to your own systems.

Transfers

call.transfer lists the people the agent may hand a phone call to. The agent picks by id and never dials a number a caller gives it.
Transfers need Kallabot’s call bridge on your phone line. It’s rolling out workspace by workspace; where it isn’t on yet, the agent tells callers it can’t transfer them and offers a call back instead.

Fields that are refused

A config that asks for something the runtime doesn’t do yet is refused with 422 unsupported_capability, never silently ignored. Today that’s memory (cross-call memory) and a webhooks block (webhooks are set up with POST /v1/webhooks instead). Unknown fields are refused with invalid_request.

Validate before you save

POST /v1/agents/validate compiles a config exactly as a save would, without saving it. It returns every finding and the config with all defaults filled in.
path is a JSON Pointer into your config, so an editor can show each finding on its field. Errors block publishing; warnings don’t.

Common tasks

Webhooks for agents

agent.created, agent.updated, agent.published and agent.archived fire on every change, from the API or the dashboard. See Events.