-o, -y, -m and -c are the only short flags in the CLI.
Global
unbound and unbound-cli — the same program. Requires Node 18 or later.
Account
Omit
--api-key on login and a browser opens instead. That flow times out after 120 seconds, so pass --api-key on a headless machine.
Health
doctor exits non-zero when a tool is tampered, your API key is invalid, or CLAUDE_CONFIG_DIR is set-but-empty or points somewhere other than your install. The last two fail the run with every tool healthy — see Doctor.
Setup
Tool names.
cursor, copilot, augment, claude-code, claude-code-subscription, claude-code-gateway, gemini-cli, codex, codex-subscription, codex-gateway, roo-code, cline, kilo-code, custom-access.
Constraints. --subscription and --gateway are mutually exclusive and apply only to Claude Code and Codex. --all cannot be combined with explicit tool names. Scope follows privileges — there is no scope flag; run under sudo for org-wide.
unbound setup runs a per-tool installer written in Python, so Python 3 must be on your PATH. Without it, setup exits with Python 3 not found. Instruction-only tools — roo-code, cline, kilo-code, custom-access — don’t need it.Policies
--user and --group are booleans; <id> is a required positional. --group treats the id as a user-group id, --user is the default.
There is also a raw-config pair, unbound policy create and unbound policy update <id>, taking --name, --type <COST|MODEL|SECURITY> and --config <json> (all three required on create) plus --scope-groups <ids>, --scope-tools <types>, --priority <n> and --enabled / --no-enabled. Prefer the type-specific commands below — the CLI’s own help says so.
Cost and security
--guardrail, --route and --error-route are repeatable. policy security update does not accept the create-time type flags — guardrail and routing changes go through --config '<json>'.
Tool policies
Both create commands require a mode. Pass
--prompt for AI assist or --no-ai for raw flags; with neither the command exits 2. --field is repeatable and ANDed. --action is one of AUDIT, BLOCK, WARN, REQUIRE_SLACK_APPROVAL, and BLOCK or WARN always requires --custom-message.
Users and groups
Analytics and exports
Datasets:
terminal, mcp-actions, unsanctioned, mcp-servers.
Shared flags: --time-window · --start / --end · --tool · --user · --risk · --policy · --format <table\|json\|csv> · --json · -o · --limit · --offset · --wide.
Per-dataset flags — this is the part that surprises people:
Passing one where it isn’t accepted fails with
unknown option.
Limits. --limit defaults to 20, caps at 100 for a table and 1,000 for JSON, and over the cap the command exits rather than clamping. -o requires --format json or --format csv. Custom date ranges must be used in pairs and span 90 days or less. Exports cap at 25,000 rows and are kept for 6 hours.
Both need Admin or Analytics Viewer.
Chat
No flags starts an interactive session.
--json, -o and -c each require a non-empty -m. -c takes the conversation_id from a previous reply. Messages cap at 4,000 characters. Needs Admin, Analytics Viewer or Manager.
Discovery
On Linux use
systemctl --user status unbound-scheduled.timer; on Windows Get-ScheduledTask -TaskName "ai.getunbound.scheduled".
Configuration
Settings live at
~/.unbound/config.json.
Environment variables
Exit codes
The direct installers
unbound setup calls also use 3, but there it means the device is MDM-managed and the install was skipped. unbound setup reports that as a skip rather than passing the code through.
