Install & onboarding

View as Markdown

The dial CLI is the fastest way to use Dial and the surface most agents drive. Install it once, sign up, and you’re authenticated for every command.

Install

$npm install -g @getdial/cli

Requires Node 22 or newer. Confirm the install:

$dial --version

Create an account

Dial uses one-time codes — no password. Creating an account needs a verified email and a verified phone number.

$dial auth login you@example.com # emails a 6-digit code
$dial auth verify-otp --code 123456 # verifies your email
$dial auth register-number +14155550123 # texts a 6-digit code
$dial auth verify-otp --number --code 654321 # verifies your phone, finishes setup

Each step prints the command to run next, so you can follow the flow without memorizing it.

register-number requires a number that can receive SMS — use one you keep. A Dial number can’t be used to register a Dial account.

The final step creates your account, issues an API key, saves it locally, and provisions your first phone number. That number starts with a default inbound voice-agent prompt; change it with dial number set.

If you need to pass the email verification explicitly, use --verification-id <id>; otherwise the CLI uses the pending sign-up from the previous step.

Sign in to an existing account

Signing in needs only the email steps — you’re never asked for a phone number again:

$dial auth login you@example.com
$dial auth verify-otp --code 123456

Check your setup

$dial doctor

doctor reports your account, saved key, and number — and tells you the next step if anything is missing. Add --json for machine-readable output.

Where your key is stored

Once verification completes, your key lives in ~/.local/share/dial/auth.v1.json (honoring XDG_DATA_HOME). Every dial command reads it automatically — you never paste your key again. The v1 in the name is the file’s schema version: when an update changes a state file’s shape, the CLI migrates the old file forward on first read, so updates never lose your sign-in.

Pointing at another environment

Set DIAL_API_URL to send CLI requests to a different deployment:

$export DIAL_API_URL=https://api.getdial.ai

Identifying the tool driving the CLI

If you’re embedding the CLI in your own product or agent runtime, set DIAL_USER_AGENT so your traffic is identifiable:

$export DIAL_USER_AGENT="nanoclaw/1.1.1"

Your value is prepended to the CLI’s own User-Agent, which is always still sent:

User-Agent: nanoclaw/1.1.1 @getdial/cli/0.36.0

It never replaces the CLI’s identifier. Use the conventional name/version form. Leave the variable unset and the header goes out unchanged.

Updating

The CLI keeps itself current. At most once an hour, any command spawns a detached background npm install -g @getdial/cli@latest (global npm installs only — npx runs already resolve the latest version on each invocation). The background check never touches a command’s output; its progress lands in ~/.local/state/dial/cli.log. Set DIAL_NO_AUTO_UPDATE=1 to turn it off.

To update on demand:

$dial update

If the background listen service is running, it notices the new version within a couple of minutes and restarts itself onto it.

Uninstall

$dial uninstall

One command removes everything Dial put on the machine — the listen daemon, the installed agent skills, and all local state including the saved API key — then prints the final step:

$npm uninstall -g @getdial/cli

Uninstall is local-only: your account and numbers are untouched. Coming back is the same email flow — dial auth login + dial auth verify-otp.

Next