Skip to main content
reply is the official command-line interface for Reply.io. Sign in once and every request runs as you. Today it covers authentication and identity, reply api gives you authenticated access to the full v3 API — no HTTP client, no header wrangling — and reply skills installs Reply’s agent skill packs into your AI assistants. Higher-level commands for sequences, contacts, and the inbox are on the way.

Install

Or run it without installing:

Authenticate

Log in through your browser — no key to copy, no key to rotate:
Prefer an API key? Read it from stdin so it never lands in your shell history:
Keys come from Reply → Settings → API Keys; scopes and key types are covered in Authentication. Inspect and manage the active credential:

Credential precedence

Resolved in strict order, first hit wins:
  1. --api-key <key> flag
  2. REPLY_API_KEY environment variable
  3. the stored credential from reply auth login
The flag and the environment variable are used for that one invocation and are never written to disk.
There is no .env file lookup — export REPLY_API_KEY yourself, or store a credential with reply auth login.

Where credentials live

Credentials are stored as JSON in ~/.config/reply (%APPDATA%\reply on Windows), written 0600 inside a 0700 directory — the same plaintext-file model as gh, aws, and az. OAuth tokens refresh automatically; if a refresh fails the record is cleared and you’re asked to log in again. Tokens and keys are redacted in every command’s output, --verbose included.

Profiles — more than one Reply.io user

A profile is a signed-in account. Profiles let you keep several Reply.io users authenticated at once and switch between them, each with its own stored credential. Most people never need one: the default profile is used until you create another. Name them however you like — account emails work well:
The active profile resolves as --profileREPLY_PROFILE → the profile set with profile use → the built-in default. Manage them after creation:

Teams

A profile can pin a team (workspace). The pinned team is sent as the X-TEAM-ID header, with precedence --team-idREPLY_TEAM_ID → the profile’s team. The team command reads and writes the active profile’s team:
If a call needs a team and you belong to more than one, the API answers with a TEAM_REQUIRED error listing your teams — run reply team use <id> to pin one, or pass --team-id <id> for a single command.

Raw API access

reply api is a raw, authenticated passthrough to any v3 endpoint — the escape hatch for everything the CLI has no dedicated command for yet. Use the path exactly as it appears in the API reference, starting with /v3; the query string goes in the path. A --body switches the method to POST (override with --method), and it accepts inline JSON, @file, or - for stdin.
It prints { "code": <status>, "data": <body> } and exits non-zero on HTTP >= 400. See Using the CLI from agents & scripts for the full machine contract.

Skills

Reply’s outbound expertise ships as three markdown skill packs in reply-skills. reply skills detects the AI assistants on your machine and installs the packs into each one, resolving dependencies itself:
Naming no pack installs all three. Dependencies come along automatically, so adapter pulls core:
Then manage them:
On Claude Code and Codex the packs are installed through the assistant’s own plugin mechanism, so they keep updating through it. Other SKILL.md hosts receive the skills as copied files. Add --json for a machine-readable report and --dry-run to see the plan without changing anything.
“Not yet” means that assistant’s skills directory comes from its own documentation and has not been confirmed by a verification run — the install works, but Reply cannot promise the assistant reads from where the files were put. Those hosts are marked (paths not yet verified) in the report and carry "verified": false in --json.
Removing a pack another installed pack depends on is refused — remove both, or run reply skills remove with no pack to remove everything.
Installing skills is not the same as connecting Reply: reply-adapter needs a Reply.io credential (reply auth login) to do anything. See Reply Skills.

Command reference

Run reply <command> --help for the exact flags of any command — the installed help always matches your version.

reply auth

reply profile

reply team

reply api

reply skills

Pack names accept aliases: core, adapter, runtime. These flags apply to all four subcommands:

Global flags

Environment variables

Why a CLI when there’s REST and MCP?

  • Authentication is the hard part, and it’s solved here. Browser login, token refresh, multiple accounts, and the team header are handled for you — reply api is a curl that is already authenticated as the right user in the right workspace.
  • Coding agents are exceptionally good at shell commands. They get composability — pipes, jq, cron — without writing an HTTP client. See Using the CLI from agents.
  • Scriptable one-offs. Terminal and CI access to the API for work that doesn’t warrant a real integration.

What isn’t in the CLI yet

There are no dedicated commands for sequences, contacts, the inbox, or reporting yet — reach them through reply api today, or use the interface that fits:

Versioning

reply-cli follows semantic versioning, with versions derived from Conventional Commits.
Pre-1.0. While the version is 0.x the CLI is still stabilizing, so — per semver’s 0.x rule — a minor release (0.x.0) may contain breaking changes. Pin an exact version if you need stability before 1.0.0.
From 1.0.0 onward, a major bump is required to remove or rename a command, flag, or argument; change the meaning of an exit code; change the --json / --pretty output shape; change the config format or a REPLY_* environment variable; or raise the minimum Node.js version. New commands, new optional flags, and new fields in --json output are additive and ship in minor releases.