callva is a command-line client for the CallVA External API. Each command is one API operation, every answer is JSON on stdout, and errors are JSON on stderr with a stable exit code. It covers agents, speech-stack presets, agent tools, assets, calls, transcripts, recordings, call analytics, custom fields and field groups, webhook schedules, automations and their triggers, webhook logs, record actions, saved views, issues, knowledge, variables, settings, projects, phone numbers and telephony providers.
It is how an AI agent with a shell operates CallVA: the agent reads callva help once, then drives the platform with commands it can compose, retry and check by exit code. People use it the same way for scripts and one-off fixes.
CLI or MCP?
Use the CLI where the agent has a shell and you can hand it an API key. Use MCP where the agent runs in a chat app and should connect through your own login, bound to one project.
Source
A single MIT-licensed script in the public
ai-cluster-one/capabilities repository.Install
callva is one Python script that runs through uv. uv fetches Python 3.11 or newer and the script’s dependencies on the first run, so uv is the only thing you install yourself.
1
Install uv
Skip this if
uv --version already works.2
Download the callva script
Put it in a directory on your To pin a version, replace
PATH and make it executable:main in the URL with a commit hash from the repository.3
Check it runs
callva help prints the full command contract.Configure it
Run on its own,callva reads three environment variables and nothing else:
string
required
read-only serves every command that only reads. read-write also serves the commands that create, change, delete or run something. Start with read-only and switch when you mean to write.string
required
A CallVA API key. Create one in the dashboard under Settings > API Keys; see Authentication. The key’s role decides what the CLI may do, whatever the mode.
string
required
The API base, ending at
/api/v1. The CLI appends /external itself. Set it to https://api.callva.io/api/v1: the script’s built-in default points at a different host.doctor makes one authenticated request and reports what the key sees:
Project-scoped and organization-wide keys
Project-scoped and organization-wide keys
A project-scoped key works in its own project; you never name the project. Use it for agents.An organization-wide key reaches every project in the organization, so each project-level command names its project with
-f project_id=<id> on lists, or a project_id key inside --data on writes. Creating, changing and deleting projects (projects create|update|put|delete) and adding phone numbers (phone-numbers create) need an organization-wide key.callva doctor and callva projects list take no project filter, so with an organization-wide key they fail with PROJECT_REQUIRED. Check such a key with a project-level read instead, for example callva agents list -f project_id=<id>.What headless mode refuses
What headless mode refuses
In headless mode the CLI reads only its environment. It refuses
--connection, --key-env and --api-url, and every flag that names a local file (--data-file, --content-file, --prompt-file, --config-file, --inputs-file, --args-file, --file, --output): pass content inline, and recordings stream writes audio to stdout. settings reveal, which prints a secret value, is refused in both modes.Headless mode also refuses to run (headless_refused) on a machine where the capabilities manager below has configured callva; use that setup there instead.Using the capabilities manager instead
Using the capabilities manager instead
callva is also published as a capability for the capabilities manager, which installs agent CLIs, keeps their credentials in a vault and lets one project hold several named connections (for example one per organization), each optionally read-only. If you already use it, install and enable it inside a project the manager has initialised (capabilities init), then add a connection; the API key travels on stdin, never on the command line:--connection <id>. callva connections shows where each value resolves from, with secrets masked. Without the manager, the environment variables above are all you need.How commands look
- Filters on lists and analytics are always
-f key=value, repeatable:calls list -f status=complete -f direction=outbound. - Paging on lists:
--per-page N --page N. - Bodies are JSON objects:
--data '{"...": ...}'. - Lists are slimmed to the fields an agent needs; add
--fullfor the raw API response.getcommands always return the full record. callva routesprints every command with its HTTP method and path, and whether it writes. It needs no key and no network.
Common commands
The answers below come from a test project; ids are synthetic.List projects
List calls
Get a call
Read a transcript
Create a custom field
Writes needCALLVA_HEADLESS=read-write and a key whose role may create fields.
callva calls update <call_id> --data '{"appointment_confirmed": true}'. Before deleting a field, callva fields impact <field_id> counts the values it holds. API: Create a custom field; see Custom fields.
List webhook logs
callva calls webhook-logs <call_id> lists the logs of one call, and callva webhook-logs filters lists the values you can filter on. API: List webhook logs; see Webhooks.
Count calls by outcome
--op is one of count, sum, avg, min, max; add --field for the others, --interval day|week|month for a time series, and -f created_at_gte=<date> to bound it. API: Aggregate calls.
Errors and exit codes
An error is one JSON object on stderr:
A write refused in read-only mode looks like this, with exit code
4:
Handing the CLI to an agent
Give the agent a shell withcallva on its PATH and the three environment variables set, and tell it to start with callva help. The help text is written for agents: it states every command, its flags, what each one changes, and which commands write. Then:
- Give it a project-scoped key whose role holds only what the task needs, and
CALLVA_HEADLESS=read-onlyunless it must write. - Let it check its access with
callva doctorbefore it starts. - Let it branch on exit codes rather than parse messages.
Connect over MCP
No shell? Connect a chat agent to one project through OAuth.
API reference
Every operation the CLI calls, with request and response schemas.