CLI command reference
This page lists every voicethere command by subject, with its usage line, options, an example, and what the example prints. For install, the release loop, and CI, see @voicethere/cli. For sign-in, see CLI login.
Stdout carries tables and JSON. Progress goes to stderr as [voicethere] …. Where a command accepts --project <id>, it overrides the project from .voicethere/config.json. voicethere <command> --help prints the same options. Checked against @voicethere/cli 0.16.7.
Subjects
logininitorgsorgaccount deletionprojectsprojects environmentprojects secretsprojects settingsprojects session-settingsprojects billing-settingsprojects subscriptionprojects usageprojects voiceprojects voice-advancedprojects widgetprojects metricsprojects logsprojects conversationbuildsourcedeployundeploydeploymentssessionsapi-keys
login
Signs the CLI in and stores credentials in ~/.config/voicethere/credentials.json. The default is browser device approval, which saves a personal API key. Pass a key to skip the browser.
Guide: CLI login
Sign in with browser device approval, or store API keys for CI and automation.
voicethere login [--api-key <key>] [--api-base <url>] [--user-api-key <key>] [--dashboard-cookie <cookie>] [--force] [--no-open]
| Argument / option | Description |
|---|---|
--api-key <key> | Org/project API key (vth_/vthc_) for manual login / automation |
--api-base <url> | API base URL (default: https://app.voicethere.io/api/v1) |
--user-api-key <key> | Personal user API key (vthu_) for manual login |
--dashboard-cookie <cookie> | Legacy browser Cookie header (prefer browser login or --user-api-key) |
--force | Skip credential validation and start browser login |
--no-open | Do not open the verification URL in a browser |
Example
voicethere login --no-open
Example output
[voicethere] Starting browser device login [voicethere] api base: https://app.voicethere.io/api/v1 voicethere-login:status=pending_approval voicethere-login:verification_uri_complete=https://app.voicethere.io/device?user_code=ABCD-EFGH voicethere-login:user_code=ABCD-EFGH Confirm this login in your browser: https://app.voicethere.io/device?user_code=ABCD-EFGH User code: ABCD-EFGH [voicethere] Browser open suppressed (--no-open) [voicethere] Waiting for approval [voicethere] Saved personal API key [voicethere] credentials: /home/you/.config/voicethere/credentials.json [voicethere] active org: 9b1d4e7a-2c35-4f08-a6d3-71e0c58b2a94 voicethere-login:status=completed voicethere-login:active_org_id=9b1d4e7a-2c35-4f08-a6d3-71e0c58b2a94 Logged in. Personal API key saved to /home/you/.config/voicethere/credentials.json (expires in ~90 days).
Lines starting with [voicethere] go to stderr, the rest to stdout. If valid credentials already exist the command prints "Already logged in" and exits, unless you pass --force. Browser login stops with an error while VOICETHERE_API_KEY or VOICETHERE_USER_API_KEY is set, so use --api-key in CI.
init
Scaffolds a local agent workspace from a template and, unless --local-only is set, creates a linked cloud project. It needs credentials unless --local-only is set.
Guide: Agent templates
Scaffold an agent workspace and optionally create a linked cloud project.
voicethere init [dir] [--name <name>] [--slug <slug>] [--template <id>] [--local-only] [--no-install] [--force]
| Argument / option | Description |
|---|---|
[dir] | Target directory (default: current directory) |
--name <name> | Cloud and package display name (default: directory name) |
--slug <slug> | URL-safe project slug (derived from name when omitted) |
--template <id> | Product template from @voicethere/agent, or blank (default: echo) |
--local-only | Write files locally only, with no login, cloud project, or source upload |
--no-install | Skip npm install in the target directory |
--force | Overwrite when package.json already exists |
Example
voicethere init support-agent --template echo --no-install
Example output
[voicethere] Scaffolding echo workspace in /home/you/support-agent [voicethere] Creating cloud project "support-agent" (slug=support-agent, template=echo) [voicethere] Writing .voicethere/config.json [voicethere] project config: /home/you/support-agent/.voicethere/config.json [voicethere] Seeding dashboard Code workspace Next: edit sources, npm run verify, voicethere source push
init prints nothing on stdout. Every line above goes to stderr. With --local-only the cloud steps are skipped and the last line is "Next: npm run verify". It refuses to run when package.json already exists unless you pass --force.
orgs
Lists and switches organizations. These commands need a personal user API key (vthu_) or a legacy dashboard cookie, which browser login provides.
orgs list
List organizations for the signed-in dashboard user.
voicethere orgs list
Example
voicethere orgs list
Example output
* 9b1d4e7a-2c35-4f08-a6d3-71e0c58b2a94 acme Acme Inc. owner 5d0a7c32-91be-4e48-8f16-a2c4b9e07d53 acme-labs Acme Labs member
Columns are tab-separated: active marker (* for the active org), org id, slug, name, and owner or member. Prints "No organizations found." when the list is empty.
orgs use
Set the active organization.
voicethere orgs use <orgId>
| Argument / option | Description |
|---|---|
<orgId> | Organization UUID |
Example
voicethere orgs use 9b1d4e7a-2c35-4f08-a6d3-71e0c58b2a94
Example output
Active organization set to 9b1d4e7a-2c35-4f08-a6d3-71e0c58b2a94
Run this when your account belongs to several orgs and project commands hit the wrong one. With a personal user API key the choice is also saved in the credentials file.
org
Organization actions that change membership or ownership. These need a personal user API key.
org transfer-ownership
Transfer organization ownership to another member.
voicethere org transfer-ownership <newOwnerUserId>
| Argument / option | Description |
|---|---|
<newOwnerUserId> | User UUID of the new owner |
Example
voicethere org transfer-ownership c4a8e2f6-5d17-4b39-8e60-2f9a1d7b3c05
Example output
Ownership transfer complete.
Applies to the active organization. The new owner must already be a member, and you can no longer manage ownership afterwards.
account deletion
Previews and confirms deletion of your own account. Confirmation needs a 6-digit code sent by email. These commands need a personal user API key.
account deletion preview
Show owned orgs and any in-flight deletion job.
voicethere account deletion preview
Example
voicethere account deletion preview
Example output
{
"owned_orgs": [
{
"id": "9b1d4e7a-2c35-4f08-a6d3-71e0c58b2a94",
"name": "Acme Inc.",
"slug": "acme",
"project_count": 3
}
],
"job": null
}Read-only. Check owned_orgs first, because deleting the account affects the orgs you own. job is null when no deletion has been started.
account deletion request-code
Email a 6-digit verification code.
voicethere account deletion request-code
Example
voicethere account deletion request-code
Example output
Verification code sent to your account email.
Run this before account deletion confirm. The code goes to the email address on your account.
account deletion confirm
Confirm deletion with the emailed code.
voicethere account deletion confirm <code> [--wait]
| Argument / option | Description |
|---|---|
<code> | 6-digit verification code |
--wait | Poll until account deletion completes or fails |
Example
voicethere account deletion confirm 123456
Example output
Account deletion queued: 0c9f3b7e-4a62-4d15-b8e1-6f2d7a90c354
Poll with: voicethere account deletion confirm 123456 --wait
{
"ok": true,
"job_id": "0c9f3b7e-4a62-4d15-b8e1-6f2d7a90c354",
"message": "Account deletion queued. Cleanup runs in the background; use --wait to block until finished."
}The code must be exactly 6 digits. With --wait the command prints the queued line, then blocks and ends with "Account deletion completed: <job id>" followed by the status and step lines, or exits with an error if the job fails.
projects
Creates, lists, selects, and deletes agent projects. The active project for a repo is stored in .voicethere/config.json. These commands work with an org API key or a personal user API key.
projects list
List projects in your organization.
voicethere projects list
Example
voicethere projects list
Example output
3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 support-agent Support Agent active_build=b81d5c20-7e94-4a3f-92c6-0d4e1f7a8b35 6a2e8d10-c3f5-4b97-a1d4-9e07b25c3f68 demo-agent Demo Agent active_build=none
Columns are tab-separated: project id, slug, name, and the active build id or none. Prints "No projects found." when the org has no projects.
projects create
Create a new project.
voicethere projects create <name> [--slug <slug>] [--no-link] [--bundle <path>]
| Argument / option | Description |
|---|---|
<name> | Project display name |
--slug <slug> | URL-safe slug (derived from name when omitted) |
--no-link | Do not write .voicethere/config.json in the current repo |
--bundle <path> | Default bundle path stored in .voicethere/config.json (default: dist/agent.js) |
Example
voicethere projects create "Support Agent"
Example output
{
"id": "3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42",
"org_id": "9b1d4e7a-2c35-4f08-a6d3-71e0c58b2a94",
"name": "Support Agent",
"slug": "support-agent",
"active_build_id": null,
"deployed_build_id": null,
"deployed_at": null,
"is_deployed": false,
"created_at": "2026-01-15T10:24:31.000Z"
}The JSON goes to stdout. Unless you pass --no-link, the command also writes .voicethere/config.json and prints a "Using project …" line to stderr. Commit that file so CI does not need projects use.
projects use
Link this repo to a project by writing .voicethere/config.json.
voicethere projects use [projectId] [--slug <slug>] [--name <name>] [--bundle <path>]
| Argument / option | Description |
|---|---|
[projectId] | Project UUID (interactive picker when omitted in a TTY) |
--slug <slug> | Override project slug in local config |
--name <name> | Override display name in local config |
--bundle <path> | Default bundle path (default: dist/agent.js) |
Example
voicethere projects use 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42
Example output
Using project Support Agent (3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42) Saved /home/you/support-agent/.voicethere/config.json
Without a project id the command re-reads the existing config, or opens a picker in an interactive terminal. In CI, always pass the id. When it refreshes an existing config it prints one "Using project … from <path>" line instead of two.
projects show
Show the active project from .voicethere/config.json.
voicethere projects show
Example
voicethere projects show
Example output
{
"path": "/home/you/support-agent/.voicethere/config.json",
"project_id": "3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42",
"project_slug": "support-agent",
"name": "Support Agent",
"bundle": "dist/agent.js"
}Reads the local file only and makes no API call. When no config is found in this directory or a parent, it prints a two-line hint to run voicethere projects use <projectId>.
projects delete
Delete a project and all its builds.
voicethere projects delete [projectId] [--force] [--wait]
| Argument / option | Description |
|---|---|
[projectId] | Project UUID (default: active project from .voicethere/config.json) |
--force | Skip interactive name confirmation |
--wait | Poll until async project deletion completes or fails |
Example
voicethere projects delete 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 --force --wait
Example output
Project deletion queued: 5e1c7a93-0b48-4d26-9f3a-c8d2e6b41f07 project: 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 status: queued Project deletion completed: 5e1c7a93-0b48-4d26-9f3a-c8d2e6b41f07 status: completed step: done
Without --force the command asks you to type the project name, and refuses to run outside a terminal. Without --wait it prints a "Poll with:" line and returns while deletion continues. If the deleted project is the one in .voicethere/config.json, that file is removed. The step value shown is illustrative.
projects environment
Manages the non-secret AGENT_* variables of a project. Every command targets the project in .voicethere/config.json unless you pass --project.
Guide: Agent environment and secrets
projects environment list
List the environment variables of a project.
voicethere projects environment list [--project <id>]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID (default: .voicethere/config.json) |
Example
voicethere projects environment list
Example output
[voicethere] Listing environment variables for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 AGENT_GREETING=Hello from Support Agent AGENT_LANGUAGE=en
The [voicethere] line goes to stderr, the variables go to stdout as KEY=value. Prints "No environment variables." when the project has none.
projects environment view
View one environment variable.
voicethere projects environment view <key> [--project <id>]
| Argument / option | Description |
|---|---|
<key> | Variable name (e.g. AGENT_GREETING) |
--project <id> | Project UUID |
Example
voicethere projects environment view AGENT_GREETING
Example output
[voicethere] Reading AGENT_GREETING for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42
{
"key": "AGENT_GREETING",
"value": "Hello from Support Agent"
}The [voicethere] line goes to stderr and the JSON to stdout. Use it to read a single value in a script instead of parsing the full list.
projects environment create
Create an environment variable.
voicethere projects environment create <key> <value> [--project <id>]
| Argument / option | Description |
|---|---|
<key> | Variable name |
<value> | Variable value |
--project <id> | Project UUID |
Example
voicethere projects environment create AGENT_GREETING "Hello from Support Agent"
Example output
[voicethere] Saving AGENT_GREETING for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42
{
"key": "AGENT_GREETING",
"value": "Hello from Support Agent"
}This sends the same request as environment update, so an existing key is overwritten. The key and the value must not be empty. The [voicethere] line goes to stderr.
projects environment update
Create or update an environment variable.
voicethere projects environment update <key> <value> [--project <id>]
| Argument / option | Description |
|---|---|
<key> | Variable name |
<value> | Variable value |
--project <id> | Project UUID |
Example
voicethere projects environment update AGENT_GREETING "Welcome back"
Example output
[voicethere] Saving AGENT_GREETING for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42
{
"key": "AGENT_GREETING",
"value": "Welcome back"
}Use it to change a value or to create a missing key in one step. The key and the value must not be empty. The [voicethere] line goes to stderr.
projects environment delete
Delete an environment variable.
voicethere projects environment delete <key> [--project <id>]
| Argument / option | Description |
|---|---|
<key> | Variable name |
--project <id> | Project UUID |
Example
voicethere projects environment delete AGENT_GREETING
Example output
[voicethere] Deleting AGENT_GREETING from project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 Deleted AGENT_GREETING
The [voicethere] line goes to stderr and the confirmation to stdout. Code that reads the variable gets no value after the change is applied.
projects secrets
Manages the encrypted AGENT_* secrets of a project. Values are never printed back, only masked. Every command targets the project in .voicethere/config.json unless you pass --project.
Guide: Agent environment and secrets
projects secrets list
List secrets with masked values only.
voicethere projects secrets list [--project <id>]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID |
Example
voicethere projects secrets list
Example output
[voicethere] Listing secrets for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 AGENT_API_KEY ********
The [voicethere] line goes to stderr. Columns are tab-separated: secret name and masked value. The mask shown here is illustrative, the server decides its format. Prints "No secrets." when the project has none.
projects secrets create
Create a secret.
voicethere projects secrets create <name> <value> [--project <id>]
| Argument / option | Description |
|---|---|
<name> | Secret name (e.g. AGENT_API_KEY) |
<value> | Secret value |
--project <id> | Project UUID |
Example
voicethere projects secrets create AGENT_API_KEY "your-api-key-value"
Example output
[voicethere] Creating secret AGENT_API_KEY for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42
{
"name": "AGENT_API_KEY",
"masked_value": "********",
"created_at": "2026-01-15T10:24:31.000Z",
"updated_at": "2026-01-15T10:24:31.000Z"
}The CLI help says to delete and recreate a secret to change its value. The name and the value must not be empty. The [voicethere] line goes to stderr, and the mask shown here is illustrative.
projects secrets delete
Delete a secret.
voicethere projects secrets delete <name> [--project <id>]
| Argument / option | Description |
|---|---|
<name> | Secret name |
--project <id> | Project UUID |
Example
voicethere projects secrets delete AGENT_API_KEY
Example output
[voicethere] Deleting secret AGENT_API_KEY from project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 Deleted secret AGENT_API_KEY
The [voicethere] line goes to stderr and the confirmation to stdout. Delete first and then create again when you need to rotate a value.
projects settings
Reads and changes the runner pool settings of a project, such as warm pool and idle scale-down. Every command targets the project in .voicethere/config.json unless you pass --project.
Guide: Runner settings
projects settings list
List runner settings for the active project.
voicethere projects settings list [--project <id>]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID |
Example
voicethere projects settings list
Example output
[voicethere] Listing runner settings for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 mode=voice warm_pool_enabled=false redis_enabled=false webhooks_enabled=false idle_scale_down_seconds=300 data_only=false shared_child_per_session=false agent_crash_policy=disconnect_all
The [voicethere] line goes to stderr. The command always prints these eight keys in this order, and a key the API does not return prints as undefined. The values above are illustrative.
projects settings set
Set a runner setting.
voicethere projects settings set <name> <value> [--project <id>]
| Argument / option | Description |
|---|---|
<name> | Setting name (mode, warm_pool_enabled, idle_scale_down_seconds, ...) |
<value> | Setting value |
--project <id> | Project UUID |
Example
voicethere projects settings set idle_scale_down_seconds 600
Example output
[voicethere] Setting idle_scale_down_seconds=600 on project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 idle_scale_down_seconds=600
Allowed names are mode, warm_pool_enabled, redis_enabled, webhooks_enabled, idle_scale_down_seconds, data_only, shared_child_per_session, and agent_crash_policy. mode takes voice, data, or voice+data. agent_crash_policy takes disconnect_all or restart_child. idle_scale_down_seconds takes 60 to 86400. The rest take true or false (also 1, 0, yes, no). The [voicethere] line goes to stderr.
projects session-settings
Reads and changes WebRTC idle timeout, crash message, speech-to-text, and conversation storage settings. Changes apply on the next deploy. Every command targets the project in .voicethere/config.json unless you pass --project.
Guide: Session idle timeout
projects session-settings list
List session settings for the active project.
voicethere projects session-settings list [--project <id>]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID (default: .voicethere/config.json) |
Example
voicethere projects session-settings list
Example output
[voicethere] Listing session settings for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 idle_timeout_enabled=true idle_timeout_seconds=30 stt_enabled=true conversation_history_enabled=true
The [voicethere] line goes to stderr. The command prints one key=value line for each setting the project has, so a project without overrides shows fewer lines than this example.
projects session-settings set
Set one session setting.
voicethere projects session-settings set <name> <value> [--project <id>]
| Argument / option | Description |
|---|---|
<name> | Setting name: error_message | idle_timeout_enabled | idle_timeout_seconds | data_only_idle_timeout_seconds | idle_timeout_voice_activity | idle_timeout_dc_inbound | stt_enabled | conversation_history_enabled | conversation_recording_enabled | conversation_recording_metered_overage_enabled |
<value> | Boolean, number, or string (see session-settings --help) |
--project <id> | Project UUID (default: .voicethere/config.json) |
Example
voicethere projects session-settings set idle_timeout_seconds 90
Example output
[voicethere] Setting idle_timeout_seconds for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 idle_timeout_seconds=90
Settings apply on the next deploy, so run voicethere deploy --wait afterwards. Booleans take true, false, 1, 0, yes, or no. idle_timeout_seconds and data_only_idle_timeout_seconds have a default range of 30 to 120, the CLI accepts up to 86400, and the API may reject values above what your organization allows. Setting idle_timeout_enabled to false prints a billing warning to stderr. The [voicethere] line also goes to stderr.
projects billing-settings
Reads and changes project billing toggles and the spend cap. Every command targets the project in .voicethere/config.json unless you pass --project.
Guide: Billing
projects billing-settings list
List billing settings for the active project.
voicethere projects billing-settings list [--project <id>]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID (default: .voicethere/config.json) |
Example
voicethere projects billing-settings list
Example output
[voicethere] Listing billing settings for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 metered_overage_enabled=false conversation_overage_enabled=false agent_log_overage_enabled=false budget_cap_amount=null budget_cap_currency=null effective_metered_overage_enabled=false org_metered_overage_enabled=false org_payment_ready=false org_budget_cap_amount=null org_budget_cap_currency=null validation_warning=null
The [voicethere] line goes to stderr. The first five lines are settings you can change. The last six describe the organization and the effective result, and they are read-only. An unset value prints as null. The values above are illustrative.
projects billing-settings set
Set one billing setting.
voicethere projects billing-settings set <name> <value> [--project <id>]
| Argument / option | Description |
|---|---|
<name> | Setting name: metered_overage_enabled | conversation_overage_enabled | agent_log_overage_enabled | budget_cap_amount | budget_cap_currency |
<value> | Boolean, amount, currency, or null|none to clear (see billing-settings --help) |
--project <id> | Project UUID (default: .voicethere/config.json) |
Example
voicethere projects billing-settings set budget_cap_amount 50
Example output
[voicethere] Setting budget_cap_amount for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 budget_cap_amount=50
The toggles take true, false, 1, 0, yes, or no. budget_cap_amount takes a positive number rounded to two decimals, and budget_cap_currency takes eur or usd. Use null or none to clear either one. The [voicethere] line goes to stderr, and the command prints the new value as key=value on stdout.
projects subscription
Lists the subscriptions of your organization and assigns one to a project. The show and set commands target the project in .voicethere/config.json unless you pass --project.
Guide: Billing
projects subscription list
List organization subscriptions.
voicethere projects subscription list
Example
voicethere projects subscription list
Example output
[voicethere] Listing organization subscriptions b6e0f3a8-2d74-4c19-a853-9e1c7d4f2a06 tier=ultimate status=active project_id=3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 price_id=none 1c8a5d2f-7e93-4b60-8d4a-e2f9b0c3a751 tier=free status=active project_id=none price_id=none
The [voicethere] line goes to stderr. Columns are tab-separated: subscription id, tier (free or ultimate), status (active or canceled), the assigned project id or none, and the price id or none. Prints "No subscriptions found." when the list is empty.
projects subscription show
Show the assigned subscription for a project.
voicethere projects subscription show [--project <id>]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID (default: .voicethere/config.json) |
Example
voicethere projects subscription show
Example output
[voicethere] Reading assigned subscription for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42
{
"project_id": "3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42",
"subscription": {
"id": "b6e0f3a8-2d74-4c19-a853-9e1c7d4f2a06",
"tier": "ultimate",
"status": "active"
}
}The [voicethere] line goes to stderr. "subscription" is null when nothing is assigned. When the API returns them, the object also carries billing_source and a capacity block.
projects subscription set
Assign or clear the subscription for a project.
voicethere projects subscription set <subscriptionId> [--project <id>]
| Argument / option | Description |
|---|---|
<subscriptionId> | Subscription UUID, or 'none' to clear |
--project <id> | Project UUID (default: .voicethere/config.json) |
Example
voicethere projects subscription set b6e0f3a8-2d74-4c19-a853-9e1c7d4f2a06
Example output
[voicethere] Assigning subscription for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42
{
"project_id": "3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42",
"subscription": {
"id": "b6e0f3a8-2d74-4c19-a853-9e1c7d4f2a06",
"tier": "ultimate",
"status": "active"
}
}Get the id from projects subscription list. Pass none (or null) to clear the assignment, and the first line then reads "Clearing subscription for project …". The [voicethere] line goes to stderr.
projects usage
Reads usage credits for one project or as an organization rollup. The top-level voicethere usage command is the same command as projects usage show.
Guide: Billing
projects usage show
Show usage credits for a project, or an organization rollup with --org.
voicethere projects usage show [--project <id>] [--org] [--period <period>] [--from <iso>] [--to <iso>] [--bucket <bucket>]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID (default: .voicethere/config.json) |
--org | Organization rollup instead of a single project |
--period <period> | 24h, 7d, 30d, or utc_month |
--from <iso> | Custom range start (ISO-8601) |
--to <iso> | Custom range end (ISO-8601) |
--bucket <bucket> | hour or day time-series bucket |
Example
voicethere projects usage show --period 7d
Example output
[voicethere] Reading usage for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42
{
"org_id": "9b1d4e7a-2c35-4f08-a6d3-71e0c58b2a94",
"project_id": "3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42",
"period": "7d",
"range_start": "2026-01-08T10:24:31.000Z",
"range_end": "2026-01-15T10:24:31.000Z",
"bucket": "day",
"total_credits": 0,
"totals": [],
"series": [],
"balance": null
}The [voicethere] line goes to stderr and the JSON to stdout. totals holds one entry per usage kind with raw_quantity, millicredits, and credits, and it is empty here. The timestamps are illustrative. Use --from and --to for a custom range.
usage
Show usage credits for the current project or organization.
voicethere usage [--project <id>] [--org] [--period <period>] [--from <iso>] [--to <iso>] [--bucket <bucket>]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID (default: .voicethere/config.json) |
--org | Organization rollup instead of a single project |
--period <period> | 24h, 7d, 30d, or utc_month |
--from <iso> | Custom range start (ISO-8601) |
--to <iso> | Custom range end (ISO-8601) |
--bucket <bucket> | hour or day time-series bucket |
Example
voicethere usage --org --period 30d
Example output
[voicethere] Reading organization usage rollup
{
"org_id": "9b1d4e7a-2c35-4f08-a6d3-71e0c58b2a94",
"project_ids": [
"3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42"
],
"period": "30d",
"range_start": "2025-12-16T10:24:31.000Z",
"range_end": "2026-01-15T10:24:31.000Z",
"bucket": "day",
"total_credits": 0,
"totals": [],
"series": [],
"balance": null
}This is the same command as projects usage show, with the same options. With --org the JSON lists project_ids instead of a single project_id. The timestamps are illustrative, and the [voicethere] line goes to stderr.
projects voice
Shows and changes the speech-to-text and text-to-speech vendors and models of a project, and lists the available VoiceThere models. Every project command targets the project in .voicethere/config.json unless you pass --project.
Guide: Voice vendors
projects voice catalog
List VoiceThere speech-to-text and text-to-speech models from the control plane.
voicethere projects voice catalog [--json]
| Argument / option | Description |
|---|---|
--json | Print full /voice/models JSON (providers + models) |
Example
voicethere projects voice catalog
Example output
[voicethere] Fetching voice catalog
Sherpa STT models (default: en)
────────────────────────────────────────────────────────────────────────
* en en English
bundle=sherpa-onnx-whisper-tiny
Sherpa TTS models (default: en-amy-low)
────────────────────────────────────────────────────────────────────────
* en-amy-low en Amy (low)
bundle=vits-piper-en_US-amy-low
Select with: voicethere projects voice set --interactive
Or: voicethere projects voice set --tts-model-id <id> --stt-model-id <id>
Full JSON: voicethere projects voice catalog --jsonThe model ids, labels, bundles, and defaults come from the control plane, so the rows here are illustrative and your output lists every model. A * marks the default. The [voicethere] line goes to stderr.
projects voice show
Show voice settings for the active project.
voicethere projects voice show [--project <id>]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID |
Example
voicethere projects voice show
Example output
[voicethere] Reading voice settings for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42
{
"stt_provider": "openai",
"tts_provider": "openai",
"stt_model_id": "en",
"tts_model_id": "en-amy-low",
"stt_model": "whisper-1",
"tts_model": "tts-1"
}The [voicethere] line goes to stderr. The JSON may also include stt_language and tts_voice when they are set. The values above are illustrative.
projects voice set
Update voice settings.
voicethere projects voice set [--project <id>] [--stt-provider <id>] [--tts-provider <id>] [--stt-model-id <id>] [--tts-model-id <id>] [--stt-model <name>] [--stt-language <code>] [--tts-model <name>] [--tts-voice <id>] [--interactive]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID |
--stt-provider <id> | STT provider id (voicethere for VoiceThere speech) |
--tts-provider <id> | TTS provider id (voicethere for VoiceThere speech) |
--stt-model-id <id> | VoiceThere STT catalog id (when STT is VoiceThere, provider id voicethere); list via voice catalog |
--tts-model-id <id> | VoiceThere TTS catalog id (when TTS is VoiceThere, provider id voicethere); list via voice catalog |
--stt-model <name> | Cloud STT model name |
--stt-language <code> | Cloud STT language code |
--tts-model <name> | Cloud TTS model name |
--tts-voice <id> | Cloud TTS voice id |
--interactive | Fetch VoiceThere catalog and prompt to select STT/TTS models |
Example
voicethere projects voice set --stt-provider openai --stt-model whisper-1
Example output
[voicethere] Updating voice settings for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 stt_provider=openai stt_model=whisper-1
The change requires a redeploy, so run voicethere deploy --wait afterwards. Options you leave out keep their current value, and stdout echoes only the fields you passed. With --interactive the command asks for providers and VoiceThere models in a terminal and prints the chosen values. The [voicethere] line goes to stderr.
projects voice-advanced
Reads and changes advanced voice pipeline settings: voice activity detection, barge-in, speech-to-text lifecycle, and language identification. Changes apply on the next deploy. Every command targets the project in .voicethere/config.json unless you pass --project.
Guide: Advanced voice settings
projects voice-advanced list
List resolved advanced voice settings for the active project.
voicethere projects voice-advanced list [--project <id>]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID |
Example
voicethere projects voice-advanced list
Example output
[voicethere] Listing advanced voice settings for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 vad.enabled=true vad.provider=energy vad.threshold=0.15 vad.minSpeechDurationMs=250 vad.minSilenceDurationMs=1100 vad.bargeIn.enabled=true tts.speed=0.9 noiseSuppression.enabled=true events.mode=both
The [voicethere] line goes to stderr. The command prints one key=value line for every setting the API returns, and this example is shortened. The values above are illustrative.
projects voice-advanced set
Set one advanced voice setting.
voicethere projects voice-advanced set <name> <value> [--project <id>]
| Argument / option | Description |
|---|---|
<name> | Setting key (vad.enabled | vad.provider | vad.threshold | vad.minSpeechDurationMs | vad.minSilenceDurationMs | vad.speechPadMs | vad.sampleRate | vad.gateStt | vad.gateSttOpenOnPending | vad.sttGateHoldMs | vad.sttListenTimeoutMs | vad.utteranceFinalizeTimeoutMs | vad.bargeIn.enabled | vad.bargeIn.useVad | vad.bargeIn.flushTts | vad.bargeIn.requireSttPartial | vad.bargeIn.minSttPartialChars | vad.bargeIn.agentPlaybackGuardMs | tts.speed | tts.postUtteranceSilenceMs | tts.phraseCache | tts.sentenceCase | debug.ttsTextTrace | connection.reconnectWindowSec | noiseSuppression.enabled | languageId.enabled | languageId.minSpeechMs | languageId.timing | languageId.autoSwitch.enabled | languageId.autoSwitch.replayLastUtterance | languageId.autoSwitch.finalHoldMs | languageId.autoSwitch.minDwellMs | languageId.autoSwitch.confirmUtterances | languageId.autoSwitch.switchVoice | languageId.autoSwitch.waitAudio | languageId.autoSwitch.waitMessage.mode | languageId.autoSwitch.waitMessage.skipWhenReady | languageId.autoSwitch.waitMessage.texts | languageId.autoSwitch.readyMessage.minSwitchMs | languageId.autoSwitch.readyMessage.texts | voice.allowedLanguages | voice.profilesByLanguage | events.mode) |
<value> | New value |
--project <id> | Project UUID |
Example
voicethere projects voice-advanced set vad.bargeIn.requireSttPartial false
Example output
[voicethere] Setting vad.bargeIn.requireSttPartial for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 vad.bargeIn.requireSttPartial=false
The change requires a redeploy, so run voicethere deploy --wait afterwards. Booleans take true, false, 1, 0, yes, or no. Numbers must fall inside the key's range, and keys with a fixed list such as vad.provider or events.mode reject other values. The [voicethere] line goes to stderr.
projects voice-advanced reset
Clear all advanced voice overrides and return to the library defaults.
voicethere projects voice-advanced reset [--project <id>]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID |
Example
voicethere projects voice-advanced reset
Example output
[voicethere] Resetting advanced voice settings for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 reset=defaults
This clears every override at once, not a single key. Like set, it takes effect on the next deploy. The [voicethere] line goes to stderr.
projects widget
Configures and publishes the embeddable voice and chat widget. You edit a draft with set and publish it to the CDN with deploy. Every command targets the project in .voicethere/config.json unless you pass --project.
Guide: Embed widget
projects widget show
Show the widget draft, publish status, and CDN URLs.
voicethere projects widget show [--project <id>] [--cdn-base <url>] [--json]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID |
--cdn-base <url> | Override widget CDN origin |
--json | Output JSON |
Example
voicethere projects widget show
Example output
[voicethere] Loading embed widget config for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 public_id: d2f7a6b1-4c93-4e08-b5a1-7c3e9f0a2d68 publish_status: published published_revision: 3 cdn_url: https://cdn.voicethere.io/widgets/d2f7a6b1-4c93-4e08-b5a1-7c3e9f0a2d68/config.json cdn_url_immutable: https://cdn.voicethere.io/widgets/d2f7a6b1-4c93-4e08-b5a1-7c3e9f0a2d68/r3.json draft: preset=pill-dark position=bottom-right mode=voice launcher_label: Talk to us greeting: Hi, how can I help?
The [voicethere] line goes to stderr. publish_status is one of idle, queued, publishing, published, or failed, and a publish_error line appears after a failed publish. The CDN host is derived from your API base, and --cdn-base or VOICETHERE_WIDGET_CDN_BASE overrides it.
projects widget set
Merge flags into the widget draft and save.
voicethere projects widget set [--project <id>] [--preset <id>] [--position <corner>] [--mode <mode>] [--launcher-label <text>] [--greeting <text>] [--theme-primary <hex>] [--theme-background <hex>] [--theme-text <hex>] [--json]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID |
--preset <id> | pill-dark, pill-light, rounded-card, minimal-bar, or voice-orb |
--position <corner> | bottom-right, bottom-left, top-right, top-left, bottom-center, top-center, center-right, center-left, or custom |
--mode <mode> | chat or voice |
--launcher-label <text> | Launcher button label |
--greeting <text> | Initial greeting text |
--theme-primary <hex> | Theme primary color (#RGB or #RRGGBB) |
--theme-background <hex> | Theme background color |
--theme-text <hex> | Theme text color |
--json | Output JSON |
Example
voicethere projects widget set --preset pill-light --position bottom-left --launcher-label "Talk to us"
Example output
[voicethere] Updating embed widget draft for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 public_id: d2f7a6b1-4c93-4e08-b5a1-7c3e9f0a2d68 publish_status: idle draft: preset=pill-light position=bottom-left mode=voice launcher_label: Talk to us
This only changes the draft, so run projects widget deploy to publish it. Pass at least one field flag or the command fails, and the colors must be hex values such as #1a73e8. Fields you leave out keep their current value. The publish_status shown is illustrative, and the [voicethere] line goes to stderr.
projects widget deploy
Publish the widget draft to the CDN.
voicethere projects widget deploy [--project <id>] [--wait] [--timeout-ms <ms>] [--cdn-base <url>] [--json]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID |
--wait | Poll until publish completes or fails |
--timeout-ms <ms> | Max wait time when using --wait (default: 90000) |
--cdn-base <url> | Override widget CDN origin for printed URLs |
--json | Output JSON |
Example
voicethere projects widget deploy --wait
Example output
[voicethere] Publishing embed widget for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 [voicethere] Waiting for widget publish to complete public_id: d2f7a6b1-4c93-4e08-b5a1-7c3e9f0a2d68 publish_status: published published_revision: 4 cdn_url: https://cdn.voicethere.io/widgets/d2f7a6b1-4c93-4e08-b5a1-7c3e9f0a2d68/config.json cdn_url_immutable: https://cdn.voicethere.io/widgets/d2f7a6b1-4c93-4e08-b5a1-7c3e9f0a2d68/r4.json
Lines starting with [voicethere] go to stderr. Without --wait the command prints public_id, publish_status, the CDN URL, and a "Poll with:" line, then returns. With --wait it exits with an error when the publish fails or the timeout passes.
projects metrics
Reads the same numbers as the Metrics area of the dashboard, one command per tab. The command targets the project in .voicethere/config.json unless you pass --project.
Guide: Project metrics
projects metrics overview
Show session totals, error rate and billable seconds for a window.
voicethere projects metrics overview [--project <id>] [--period <period>] [--start <ISO> --end <ISO>] [--json]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID |
--period <period> | Preset window (1h|6h|24h|7d|30d|mtd; default 24h) |
--start <ISO> | Custom window start (ISO 8601; needs --end) |
--end <ISO> | Custom window end (ISO 8601; needs --start) |
--json | Print the raw API response as JSON |
Example
voicethere projects metrics overview --period 7d
Example output
[voicethere] Reading metrics for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 Project metrics (7d) active sessions: 2 sessions started: 148 sessions ended: 146 sessions failed: 6 error rate: 4.1% billable seconds: 18240 sessions in queue: 0 avg queue wait (s): -
The [voicethere] line goes to stderr and the summary to stdout. Use either --period or --start with --end, not both. The numbers are illustrative.
projects metrics sessions
Show session totals, durations and failures by reason.
voicethere projects metrics sessions [--project <id>] [--period <period>] [--start <ISO> --end <ISO>] [--json]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID |
--period <period> | Preset window (1h|6h|24h|7d|30d|mtd; default 24h) |
--start <ISO> | Custom window start (ISO 8601; needs --end) |
--end <ISO> | Custom window end (ISO 8601; needs --start) |
--json | Print the raw API response as JSON |
Example
voicethere projects metrics sessions --period 24h
Example output
[voicethere] Reading session metrics for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 Session metrics (24h) started: 148 completed: 139 failed: 6 never connected: 3 peak concurrent: 9 (plan limit 20) duration p50/p95 (s): 74 / 312 connect p50/p95 (s): 1.2 / 3.4 Failures by reason agent_crashed 4 idle_timeout 2 End reasons caller_hangup 120 agent_crashed 4
The [voicethere] line goes to stderr and the summary to stdout. Use either --period or --start with --end, not both. The numbers are illustrative. Failures by reason lists the reason keys you can pass to sessions list --reason.
projects metrics agent
Show agent log counts, crashes and top errors.
voicethere projects metrics agent [--project <id>] [--period <period>] [--start <ISO> --end <ISO>] [--json]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID |
--period <period> | Preset window (1h|6h|24h|7d|30d|mtd; default 24h) |
--start <ISO> | Custom window start (ISO 8601; needs --end) |
--end <ISO> | Custom window end (ISO 8601; needs --start) |
--json | Print the raw API response as JSON |
Example
voicethere projects metrics agent --period 24h
Example output
[voicethere] Reading agent metrics for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 Agent metrics (24h) errors: 12 warnings: 31 info: 0 crashes: 4 turns/conversation p50/p95: 6 / 19 Top errors message count model request timed out 7 tool call failed 5
The [voicethere] line goes to stderr and the summary to stdout. Use either --period or --start with --end, not both. The numbers are illustrative.
projects metrics voice
Show speech latency percentiles for a window.
voicethere projects metrics voice [--project <id>] [--period <period>] [--start <ISO> --end <ISO>] [--json]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID |
--period <period> | Preset window (1h|6h|24h|7d; default 24h) |
--start <ISO> | Custom window start (ISO 8601; needs --end) |
--end <ISO> | Custom window end (ISO 8601; needs --start) |
--json | Print the raw API response as JSON |
Example
voicethere projects metrics voice --period 24h
Example output
[voicethere] Reading voice metrics for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 Voice metrics (24h) STT: p50 180 ms, p95 420 ms, p99 610 ms TTS: p50 210 ms, p95 480 ms, p99 700 ms Turn response (speech end to first audio): p50 1100 ms, p95 1900 ms, p99 2600 ms Final to audio (STT final to first audio): p50 620 ms, p95 1200 ms, p99 1700 ms Finalize delay (speech end to STT final): p50 480 ms, p95 700 ms, p99 900 ms TTS first audio: p50 190 ms, p95 430 ms, p99 650 ms
The [voicethere] line goes to stderr and the summary to stdout. Use either --period or --start with --end, not both. The numbers are illustrative. Voice metrics are kept for 14 days; a longer range prints a notice instead of numbers.
projects logs
Lists structured agent logs for a project, or for one conversation. The command targets the project in .voicethere/config.json unless you pass --project.
Guide: Agent logs
projects logs list
List recent agent logs, 20 by default.
voicethere projects logs list [--project <id>] [--limit <n>] [--session <id>] [--q <text>] [--level <level>] [--severity <level>] [--from <ISO>] [--to <ISO>] [--json]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID |
--limit <n> | Max rows when listing project logs (default: 20) |
--session <id> | Filter to one session id (one conversation) |
--q <text> | Search log messages |
--level <level> | Filter by level (debug|info|warn|error) |
--severity <level> | Filter by severity (debug|info|warn|error); alias for --level |
--from <ISO> | Only logs created at or after this ISO 8601 time |
--to <ISO> | Only logs created at or before this ISO 8601 time |
--json | Output JSON |
Example
voicethere projects logs list --level error --limit 2
Example output
[voicethere] Listing last 2 project agent logs 2026-01-15T10:24:31.000Z e7b3c9a2-1d4… error tool call failed 2026-01-15T10:21:07.000Z 4a9d1c7e-b03… error model request timed out
The [voicethere] line goes to stderr. Columns are tab-separated: timestamp, the first 12 characters of the session id (— when there is none), level, and message. With --session the session column is dropped and the first line reads "Listing logs for session <id>". The messages above are illustrative.
projects conversation
Searches, reads, and exports stored voice conversation transcripts. Every command targets the project in .voicethere/config.json unless you pass --project.
Guide: Conversation history
projects conversation list
List recent project conversations, 50 by default.
voicethere projects conversation list [--project <id>] [--limit <n>] [--q <text>] [--period <period>] [--from <iso>] [--to <iso>] [--cursor <token>] [--json]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID |
--limit <n> | Max sessions to return (default: 50) |
--q <text> | Search transcript text or session id |
--period <period> | 24h, 7d, 30d, or utc_month |
--from <iso> | Custom range start (ISO-8601) |
--to <iso> | Custom range end (ISO-8601) |
--cursor <token> | Pagination cursor from a previous list |
--json | Output JSON |
Example
voicethere projects conversation list --limit 2 --period 7d
Example output
[voicethere] Listing last 2 project conversations 2026-01-15T10:20:02.000Z e7b3c9a2-1d4… 6 turn(s) e7b3c9a2-1d46-4f80-a5c7-3b2e8d9f0146 2026-01-14T16:41:55.000Z 4a9d1c7e-b03… 12 turn(s) 4a9d1c7e-b035-4e82-9c16-f7d2a8e3b590
The [voicethere] line goes to stderr. Columns are tab-separated: start time (— when unknown), shortened session id, turn count, and full session id. When more results exist the output ends with "More results available (cursor: …)", and you pass that cursor to --cursor.
projects conversation get
Load the full turn timeline for one session.
voicethere projects conversation get <sessionId> [--project <id>] [--json]
| Argument / option | Description |
|---|---|
<sessionId> | Session id |
--project <id> | Project UUID |
--json | Output JSON |
Example
voicethere projects conversation get e7b3c9a2-1d46-4f80-a5c7-3b2e8d9f0146
Example output
[voicethere] Loading conversation for session e7b3c9a2-1d46-4f80-a5c7-3b2e8d9f0146 Session e7b3c9a2-1d46-4f80-a5c7-3b2e8d9f0146 (2 turn(s)) 2026-01-15T10:20:02.000Z #0 user user_speech_final I need help with my order 2026-01-15T10:20:05.000Z #1 agent agent_speak Sure, what is your order number?
The [voicethere] line goes to stderr. Columns are tab-separated: time, turn number, role (user or agent), event type, and text. The turn numbers and text above are illustrative.
projects conversation search
Search conversation history. This is an alias for list --q.
voicethere projects conversation search <query> [--project <id>] [--limit <n>] [--period <period>] [--from <iso>] [--to <iso>] [--json]
| Argument / option | Description |
|---|---|
<query> | Search transcript text or session id |
--project <id> | Project UUID |
--limit <n> | Max sessions to return (default: 50) |
--period <period> | 24h, 7d, 30d, or utc_month |
--from <iso> | Custom range start (ISO-8601) |
--to <iso> | Custom range end (ISO-8601) |
--json | Output JSON |
Example
voicethere projects conversation search "order number"
Example output
[voicethere] Searching conversation history for "order number" 2026-01-15T10:20:02.000Z e7b3c9a2-1d4… 6 turn(s) e7b3c9a2-1d46-4f80-a5c7-3b2e8d9f0146 Matching turns: 2026-01-15T10:20:05.000Z e7b3c9a2-1d4… #1 agent Sure, what is your order number?
It runs the same code as conversation list with --q set, so the output has the same columns. The Matching turns block appears only when the API returns matching turns, with columns time, shortened session id, turn number, role, and text. The [voicethere] line goes to stderr.
projects conversation export
Export conversation transcripts to a downloadable JSON file.
voicethere projects conversation export [--project <id>] [--session <id>] [--q <text>] [--all] [--period <period>] [--from <iso>] [--to <iso>] [--wait] [-o, --output <path>] [--json]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID |
--session <id> | Export one session by session id |
--q <text> | Export sessions matching transcript text or session id |
--all | Export all conversations (optionally within a time window) |
--period <period> | 24h, 7d, 30d, or utc_month (filter/all modes) |
--from <iso> | Custom range start (ISO-8601) |
--to <iso> | Custom range end (ISO-8601) |
--wait | Poll until the export job completes or fails |
-o, --output <path> | Write downloaded export JSON to this path |
--json | Output final job status as JSON (with --wait) |
Example
voicethere projects conversation export --all --period 30d --wait -o export.json
Example output
[voicethere] Creating conversation export job Conversation export queued: 8d3f6b1a-5c20-4e97-b4a8-0a7e2c9d1f53 project: 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 mode: filter [voicethere] Waiting for conversation export to complete Conversation export completed: 8d3f6b1a-5c20-4e97-b4a8-0a7e2c9d1f53 conversations: 12/12 download expires: 2026-01-16T10:24:31.000Z [voicethere] Writing export to export.json Wrote export JSON to export.json
Pass exactly one of --session, --q, or --all. Lines starting with [voicethere] go to stderr. --output needs --wait, and without --wait the command prints a "Poll with:" line and returns while the export runs. Without --output, --wait prints the download_url (or the job as JSON with --json). The counts and expiry time are illustrative.
build
Validates, uploads, lists, promotes, and downloads agent bundles. Every command except validate needs a login, and the ones that act on a project use the project in .voicethere/config.json.
Guide: @voicethere/cli
build validate
Run the @voicethere/agent sandbox verify on a bundle.
voicethere build validate [file]
| Argument / option | Description |
|---|---|
[file] | Bundle path (default: config bundle or dist/agent.js) |
Example
voicethere build validate
Example output
[voicethere] Validating agent bundle [voicethere] bundle: /home/dev/my-agent/dist/agent.js (default (dist/agent.js)) [voicethere] Running @voicethere/agent verify on bundle [voicethere] Bundle validated: /home/dev/my-agent/dist/agent.js
Use it to check a bundle before you upload it. Every line shown goes to stderr. Between the second and last lines the @voicethere/agent verify tool prints its own output, which is not shown here. The command exits with an error when verify fails.
build list
List uploaded builds for the active project, newest first.
voicethere build list
Example
voicethere build list
Example output
[voicethere] Listing builds for active project [voicethere] project: 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 (project config (/home/dev/my-agent/.voicethere/config.json)) build_id uploaded_at status active message a5d1e8c3-7b24-4f96-8e0a-c3b97d2f1e68 2026-01-15 10:24:31 UTC passed yes shorter silence timeout f0c7b2d9-3e51-4a8c-9d64-18a5e7c2b03f 2026-01-14 16:02:09 UTC passed first production build
The [voicethere] lines go to stderr. Columns are tab-separated: build id, upload time, validation status, "yes" for the active build (empty otherwise), and the build message. Prints "No builds uploaded yet." when there are none. The ids, times, and messages above are illustrative.
build upload
Validate a bundle locally, then upload it as a new build.
voicethere build upload [file] [-m, --message <text>] [--skip-validate] [--print-id]
| Argument / option | Description |
|---|---|
[file] | Bundle path (default: config bundle or dist/agent.js) |
-m, --message <text> | Build label (like a git commit message) |
--skip-validate | Upload without local sandbox verify |
--print-id | Print only the new build UUID on stdout (for scripts / CI) |
Example
voicethere build upload -m "shorter silence timeout" --print-id
Example output
a5d1e8c3-7b24-4f96-8e0a-c3b97d2f1e68
With --print-id, stdout holds only the new build id, so scripts can capture it. Progress lines such as "[voicethere] Uploading agent bundle" and the validation steps go to stderr. Without --print-id, stdout reads "Uploaded build <id>", then "Message: <text>" when you passed -m, "Uploaded at: <time>", and a hint to run voicethere build promote <id>. An upload only stores the build. Promote it, then deploy, to run it.
build promote
Make a build the active build in the control plane.
voicethere build promote [buildId]
| Argument / option | Description |
|---|---|
[buildId] | Build UUID (interactive picker when omitted in a TTY) |
Example
voicethere build promote a5d1e8c3-7b24-4f96-8e0a-c3b97d2f1e68
Example output
[voicethere] Promoting build to active [voicethere] build: a5d1e8c3-7b24-4f96-8e0a-c3b97d2f1e68 [voicethere] project: 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 (project config (/home/dev/my-agent/.voicethere/config.json)) [voicethere] Calling control plane promote API Promoted build a5d1e8c3-7b24-4f96-8e0a-c3b97d2f1e68 for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 Active artifact: builds/3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42/a5d1e8c3-7b24-4f96-8e0a-c3b97d2f1e68/agent.js Control plane updated. Run voicethere deploy --wait to roll out to cloud runners.
Promote only moves the control-plane pointer to that build. Run voicethere deploy --wait afterwards to roll it out to cloud runners. In a script you must pass the build id, because the picker needs a terminal. The [voicethere] lines go to stderr, and the artifact path is illustrative.
build download
Download a compiled agent bundle as JavaScript.
voicethere build download -o, --output <path> [--project <id>] [--build-id <id>]
| Argument / option | Description |
|---|---|
-o, --output <path> | Write bundle to this path (required) |
--project <id> | Project UUID (default: .voicethere/config.json) |
--build-id <id> | Build UUID (default: active or newest passed build) |
Example
voicethere build download -o ./agent.js
Example output
[voicethere] Downloading compiled bundle a5d1e8c3-7b24-4f96-8e0a-c3b97d2f1e68 [voicethere] wrote 48213 byte(s) to /home/dev/my-agent/agent.js /home/dev/my-agent/agent.js
Use it to inspect or archive what is deployed. Without --build-id it picks the active build, or the newest build that passed validation. The first two lines go to stderr, and stdout is the absolute path of the written file. The byte count is illustrative, and the second line adds the server's file name in parentheses when the server sends one.
source
Syncs your agent source with the Code workspace in the dashboard. Push and pull use the project in .voicethere/config.json.
Guide: Dashboard code editor
source push
Upload local workspace sources to the cloud project.
voicethere source push
Example
voicethere source push
Example output
[voicethere] Collecting workspace files from /home/dev/my-agent [voicethere] Uploading 14 file(s) (revision 6) [voicethere] source revision: 7 7
Use it to move local edits into the dashboard Code workspace. The first three lines go to stderr, and stdout is the new revision number. The upload sends the revision it just read from the cloud workspace. The file count and revisions are illustrative.
source pull
Download cloud workspace sources into the local repo.
voicethere source pull
Example
voicethere source pull
Example output
[voicethere] Downloading Code workspace from VoiceThere [voicethere] pulled 14 file(s) at revision 7
Use it to bring dashboard edits into your local checkout. Both lines go to stderr and nothing is printed to stdout. Files with the same path are overwritten in place, so commit or stash local edits first. The file count and revision are illustrative.
source download
Download the saved Code workspace as a zip file.
voicethere source download -o, --output <path> [--project <id>]
| Argument / option | Description |
|---|---|
-o, --output <path> | Write zip to this path (required) |
--project <id> | Project UUID (default: .voicethere/config.json) |
Example
voicethere source download -o ./workspace.zip
Example output
[voicethere] Downloading Code workspace zip from VoiceThere [voicethere] wrote 20480 byte(s) to /home/dev/my-agent/workspace.zip /home/dev/my-agent/workspace.zip
Use it for a backup or to read the workspace without linking a repo. The first two lines go to stderr, and stdout is the absolute path of the zip. The byte count is illustrative, and the second line adds the server's file name in parentheses when the server sends one.
deploy
Promotes the build if needed and rolls it out to cloud runners for the project.
Guide: Rollout modes
Roll the active build out to cloud runners.
voicethere deploy [--project <id>] [--build-id <id>] [--mode <mode>] [--wait]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID (default: .voicethere/config.json) |
--build-id <id> | Build UUID (default: active or newest passed build) |
--mode <mode> | Rollout mode: drain (default; calls in progress finish on the previous version, up to 9 minutes) or force (ends calls in progress right away) |
--wait | Poll until deployment completes or fails |
Example
voicethere deploy --wait
Example output
[voicethere] Starting cloud deployment [voicethere] Calling POST /deployments Deployment queued: 2e9a6c4d-8f13-4b75-a0d2-6c1f8e3b9a47 build: a5d1e8c3-7b24-4f96-8e0a-c3b97d2f1e68 mode: drain status: queued [voicethere] Waiting for rollout to complete Deployment completed: 2e9a6c4d-8f13-4b75-a0d2-6c1f8e3b9a47 build: a5d1e8c3-7b24-4f96-8e0a-c3b97d2f1e68 status: completed
Use --wait in scripts and CI so the command only returns once the rollout has finished. The [voicethere] lines go to stderr. If the rollout fails, the command exits with an error that carries the failure message. Without --wait it prints the queued job and a "Poll with:" line, but running that line starts a new deployment instead of checking the old one. --mode accepts drain or force, and any other value is rejected.
undeploy
Removes the project's runner deployments from the cloud.
Remove the project's cloud runner deployments.
voicethere undeploy [--project <id>] [--wait]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID (default: .voicethere/config.json) |
--wait | Poll until undeploy completes or fails |
Example
voicethere undeploy --wait
Example output
[voicethere] Starting project undeploy [voicethere] Calling POST /projects/3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42/undeploy Undeploy queued: 6b3f1d8a-9c42-4e07-b5a9-d0e4c7a2f815 build: a5d1e8c3-7b24-4f96-8e0a-c3b97d2f1e68 status: queued [voicethere] Waiting for undeploy to complete Undeploy completed: 6b3f1d8a-9c42-4e07-b5a9-d0e4c7a2f815 status: completed
Use it to take the project agent off cloud runners. The [voicethere] lines go to stderr. With --wait the command exits with an error if the undeploy fails. Without --wait it prints a "Poll with:" line, but running that line starts another undeploy instead of checking the first one.
deployments
Lists a project's deploys and shows the timeline of one deploy, with server timestamps in UTC. Timelines are kept for 90 days. Commands use the project in .voicethere/config.json unless you pass one.
Guide: Deployment history
deployments list
List the project's deploys, newest first.
voicethere deployments list [--project <id>] [--limit <n>] [--before <ISO>] [--json]
| Argument / option | Description |
|---|---|
--project <id> | Project UUID (default: .voicethere/config.json) |
--limit <n> | Rows to show, 1 to 50 (default: 20) |
--before <ISO> | Only deploys started before this ISO 8601 time (use the printed next: value to page) |
--json | Output JSON |
Example
voicethere deployments list --limit 2
Example output
[voicethere] Listing last 2 deployments Started (UTC) Build Mode Status By Duration Last event (UTC) 2026-10-17 12:00:00 a1b2c3d4 drain completed alice@example.com 2:05 2026-10-17 12:09:30 2026-10-17 10:30:00 e5f6a7b8 force completed ci-deploy 0:42 2026-10-17 10:30:42 next: --before 2026-10-17T10:30:00.000Z
By is who started the deploy: a user's email or an API key's name (- when unknown; needs CLI 0.16.7). Duration runs from the request to the finish, and Last event is the last recorded step, which for a drain deploy can come minutes after the deploy finished. When more deploys exist the output ends with a next: line; pass that time to --before for the next page. The [voicethere] line goes to stderr, and --json prints the API response unchanged.
deployments show
Show the timeline of one deploy.
voicethere deployments show <deploymentId> [--project <id>] [--json]
| Argument / option | Description |
|---|---|
<deploymentId> | Deploy UUID from deployments list |
--project <id> | Project UUID (default: .voicethere/config.json) |
--json | Output JSON |
Example
voicethere deployments show 2e9a6c4d-8f13-4b75-a0d2-6c1f8e3b9a47
Example output
[voicethere] Showing deployment 2e9a6c4d-8f13-4b75-a0d2-6c1f8e3b9a47 2e9a6c4d-8f13-4b75-a0d2-6c1f8e3b9a47 build a1b2c3d4 drain completed started 2026-10-17 12:00:00 UTC Requested by: alice@example.com 12:00:00 UTC +0:00 Deploy requested mode=drain 12:00:02 UTC +0:02 Rollout started mode=drain 12:01:40 UTC +1:40 New version ready runners=2 12:01:41 UTC +1:41 New calls go to the new version versions=1 12:01:42 UTC +1:42 Previous version finishing its calls runners=2 12:02:05 UTC +2:05 Deploy finished 12:09:30 UTC +9:30 Previous version stopped drained in 7:48
The second line names who started the deploy. Each line after it shows the time in UTC, the time since the request, and what happened. A deploy that was refused shows the reason in plain words. Deploys from before history was recorded list only the request and the result and end with "(start and end only)". The [voicethere] line goes to stderr, and --json prints the API response unchanged.
sessions
Lists voice sessions, shows what one session was billed, and reads or deletes its audio recording. Commands use the project in .voicethere/config.json unless you pass one.
Guide: Conversation recording
sessions list
List sessions for a project, newest first.
voicethere sessions list [projectId] [--project <id>] [--start <n>] [--end <n>] [--failed] [--reason <key>] [--from <ISO>] [--to <ISO>] [--json]
| Argument / option | Description |
|---|---|
[projectId] | Project UUID (default: .voicethere/config.json) |
--project <id> | Project UUID (alias for positional projectId) |
--start <n> | Start index for pagination (default: 0) |
--end <n> | Exclusive end index (default: start + 50 when omitted) |
--failed | Only failed sessions |
--reason <key> | Only sessions that failed with this reason key (implies --failed) |
--from <ISO> | Only sessions created at or after this ISO 8601 time |
--to <ISO> | Only sessions created at or before this ISO 8601 time |
--json | Print the raw page JSON |
Example
voicethere sessions list --start 0 --end 2
Example output
[voicethere] Listing sessions for project 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42 e7b3c9a2-1d46-4f80-a5c7-3b2e8d9f0146 ended billable=84 created=2026-01-15T10:20:02.000Z 4a9d1c7e-b035-4e82-9c16-f7d2a8e3b590 active billable=- created=2026-01-15T10:31:40.000Z Showing 1-2 of 9 sessions
The [voicethere] line goes to stderr. Columns are tab-separated: session id, status (active, ended, or failed), billable seconds (- when not set), an optional reason=<end reason> column, and the creation time. Use the session id with sessions billing and sessions recording. Prints "No sessions found (<total> total)." when the page is empty. The rows and counts are illustrative.
sessions billing
Show billing details for one session.
voicethere sessions billing <sessionId> [--project <id>] [--json]
| Argument / option | Description |
|---|---|
<sessionId> | Session id from sessions list or startSession |
--project <id> | Project UUID (default: .voicethere/config.json) |
--json | Print JSON |
Example
voicethere sessions billing e7b3c9a2-1d46-4f80-a5c7-3b2e8d9f0146
Example output
[voicethere] Fetching billing for session e7b3c9a2-1d46-4f80-a5c7-3b2e8d9f0146 orchestrator_session_id=e7b3c9a2-1d46-4f80-a5c7-3b2e8d9f0146 status=ended billable_seconds=84 end_reason=- billing_started_at=2026-01-15T10:20:04.000Z ended_at=2026-01-15T10:21:31.000Z created_at=2026-01-15T10:20:02.000Z
The [voicethere] line goes to stderr. Stdout is key=value lines, and a field that is not set prints as -. The first key, orchestrator_session_id, is the session id you passed. --json prints the same fields as an object, plus project_id. The values above are illustrative.
sessions recording get
Show a session recording's status, or download its audio.
voicethere sessions recording get <sessionId> [options…]
| Argument / option | Description |
|---|---|
<sessionId> | Session id from sessions list or startSession |
--project <id> | Project UUID (default: .voicethere/config.json) |
--wait | Poll until recording is ready or failed |
--timeout-ms <n> | Max wait time in ms (default: 120000; env VOICETHERE_SESSION_RECORDING_TIMEOUT_MS) |
-o, --output <path> | Write recording audio to this path (requires --wait) |
--format <opus|wav|mp3> | Output audio format when writing --output (default: infer from extension, else wav) |
--json | Output recording metadata as JSON |
Example
voicethere sessions recording get e7b3c9a2-1d46-4f80-a5c7-3b2e8d9f0146 --wait -o call.wav
Example output
[voicethere] Fetching session recording for e7b3c9a2-1d46-4f80-a5c7-3b2e8d9f0146 [voicethere] Waiting for session recording to become ready [voicethere] Writing recording to call.wav [voicethere] Converted recording to wav Wrote 1843244 byte(s) to call.wav
get is the default subcommand, so you can omit it (voicethere sessions recording <sessionId>). Without -o and --json it prints status, format, duration_ms, byte_size, and the play_url when one exists. --output needs --wait, because the recording must be ready first. Lines starting with [voicethere] go to stderr, and the Converted line appears only when the output format is not opus. The byte count is illustrative.
sessions recording delete
Delete a session recording.
voicethere sessions recording delete <sessionId> [--project <id>]
| Argument / option | Description |
|---|---|
<sessionId> | Session id from sessions list or startSession |
--project <id> | Project UUID (default: .voicethere/config.json) |
Example
voicethere sessions recording delete e7b3c9a2-1d46-4f80-a5c7-3b2e8d9f0146
Example output
[voicethere] Deleting session recording for e7b3c9a2-1d46-4f80-a5c7-3b2e8d9f0146 Deleted session recording for e7b3c9a2-1d46-4f80-a5c7-3b2e8d9f0146
Use it to remove a stored recording. The first line goes to stderr.
api-keys
Manages organization API keys. Listing shows only the prefix, and the full key is printed once at creation.
api-keys list
List API keys (prefix and permissions only).
voicethere api-keys list
Example
voicethere api-keys list
Example output
7e2b9d41-6a03-4c58-b1f7-d85c0a3e9246 CI deploy admin vth_a1b2c3… — active 2d8f4a60-b7e3-4915-8c2a-f01d6e93b7a4 Widget client vthc_d4e5f6… Support Agent expired
Columns are tab-separated: key id, name, kind, key prefix, project name (or — for org-wide keys), and status (active, expired, or revoked). Prints "No API keys." when there are none.
api-keys create
Create an API key. The plaintext key is shown once.
voicethere api-keys create --name <name> [--kind <kind>] [--project-id <id>] [--expires-in-days <days>]
| Argument / option | Description |
|---|---|
--name <name> | Display name for the key (required) |
--kind <kind> | admin or client (default: admin) |
--project-id <id> | Project UUID for a client key (overrides the linked project) |
--expires-in-days <days> | Lifetime in days (max 180) |
Example
voicethere api-keys create --name "Widget" --kind client --project-id 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42
Example output
=== API key (shown once — store securely) === vthc_… id: 7e2b9d41-6a03-4c58-b1f7-d85c0a3e9246 kind: client project_id: 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c1f42
The key line is shortened to vthc_… here and prints in full on your terminal. Client keys need a project, either from --project-id or the linked .voicethere/config.json. Admin keys are org-wide and reject --project-id.
api-keys revoke
Revoke an API key by id.
voicethere api-keys revoke <id>
| Argument / option | Description |
|---|---|
<id> | API key UUID |
Example
voicethere api-keys revoke 7e2b9d41-6a03-4c58-b1f7-d85c0a3e9246
Example output
Revoked CI deploy (vth_a1b2c3…)
Get the id from api-keys list. Anything still using the key stops working, so rotate in CI first.