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.

CommandWhat it does
apisign auth login --api-key <key>Authenticate with an API key
apisign auth statusShow who you are currently authenticated as
apisign auth logoutClear stored credentials
apisign configPrint 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"
CommandOptions
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
CommandOptions
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.