CLI
apisign-io drives the same API from a terminal. It is a single bundled
file with no dependencies of its own, so npx fetches about 270 KB and runs.
Install
Run it without installing anything:
npx apisign-io --help
Or install it globally so the apisign command is always on your path:
npm install -g apisign-io
bun add -g apisign-io
Requires Node 18 or newer.
Authenticate
apisign auth login --api-key YOUR_API_KEY
Authenticate with an API key. The --browser flow is not wired up yet — the
endpoint it calls does not exist — so --api-key is the way in.
Create keys in the dashboard under Account > API Keys. The permission on the key decides what the CLI can do: a Read Only key can list and read, and nothing else.
| Command | What it does |
|---|---|
apisign auth login --api-key <key> | Authenticate with an API key |
apisign auth status | Show who you are currently authenticated as |
apisign auth logout | Clear stored credentials |
apisign config | Print the current configuration (--json for machines) |
Credentials live in ~/.apisign/config.json.
Templates
apisign template list
apisign template get TEMPLATE_ID
apisign template upload ./nda.md --name "Mutual NDA"
| Command | Options |
|---|---|
template list | --json |
template get <id> | --output <file>, --json |
template create | --file <file>, --name <name>, --interactive |
template update <id> | --file <file>, --name <name> |
template upload <file> | --name <name> |
template delete <id> | --yes to skip the confirmation |
template list and template get also accept ls as an alias.
Contracts
apisign contract create --template TEMPLATE_ID --name "Acme NDA"
apisign contract send CONTRACT_ID --email legal@acme.example
apisign contract logs CONTRACT_ID
| Command | Options |
|---|---|
contract list | --status <draft|sent|signed|cancelled>, --json |
contract get <id> | --output <file>, --json |
contract create | --template <id>, --name <name>, --interactive |
contract send <id> | --email <emails...>, --message <message> |
contract cancel <id> | --reason <reason> |
contract delete <id> | --yes |
contract logs <id> | --json |
contract send takes more than one address — --email a@co.example b@co.example
adds both as signers. Sending charges your balance and emails the signers, so
it is the one command worth being deliberate about.
Scripting
Every read command takes --json, which is the point of the CLI over the
dashboard. Piping into jq gets you things the UI does not offer:
# Every contract still waiting on a signature
apisign contract list --status sent --json | jq -r '.[] | "\(.id) \(.name)"'
# Cancel everything still in draft
apisign contract list --status draft --json \
| jq -r '.[].id' \
| xargs -I{} apisign contract cancel {} --reason "Superseded"
For an agent rather than a shell, use the MCP server — same capabilities, exposed as tools.