Skip to main content

Overview

The zero CLI provides full access to 0 Finance from your terminal. All commands output JSON for easy scripting and piping.
zero <command> [subcommand] [options]
You can also use the alias zero-bank.
Transfers, savings actions, and crypto moves create proposals that require dashboard approval.

Authentication

zero auth connect

Open the browser to connect the CLI and store the API key automatically.
zero auth
zero auth connect
zero login
OptionRequiredDescription
--base-urlNoBase URL (default: https://www.0.finance)
--no-browserNoPrint URL instead of opening a browser
--manualNoSkip callback and paste the API key manually

zero auth login

Store your API key and configure the CLI manually.
zero auth login --api-key sk_live_xxx
zero auth login --api-key sk_live_xxx --base-url https://custom.0.finance
OptionRequiredDescription
--api-keyYesYour workspace API key
--base-urlNoAPI base URL (default: https://www.0.finance)

zero auth whoami

Show the current workspace context.
zero auth whoami

zero auth logout

Remove stored credentials.
zero auth logout

Configuration

zero config show

Show the current config path, base URL, and key prefix.
zero config show

zero config set

Update stored configuration values.
zero config set --base-url http://localhost:3050
zero config set --api-key sk_live_xxx

Debugging

Use --debug to see request URLs and the base URL being used.
zero --debug auth whoami

Balance

zero balance

Show your spendable, earning, and idle USDC balances on Base.
zero balance
Output:
{
  "idle_balance": "3200.00",
  "earning_balance": "4220.50",
  "spendable_balance": "7420.50",
  "safe_address": "0x954A329e1e59101DF529CC54A54666A0b36Cae22",
  "chain": "base"
}
Use zero savings positions to include vault-level breakdowns.

Bank Accounts

zero bank accounts list

List all saved bank accounts.
zero bank accounts list

zero bank accounts create

Create a saved bank account from a JSON file.
zero bank accounts create --json ./account.json
account.json (IBAN example):
{
  "account_name": "Acme EUR",
  "bank_name": "Commerzbank",
  "account_holder_type": "business",
  "account_holder_business_name": "Acme Corp",
  "country": "DE",
  "city": "Berlin",
  "street_line_1": "Friedrichstr. 1",
  "postal_code": "10117",
  "account_type": "iban",
  "iban_number": "DE89370400440532013000",
  "bic_swift": "COBADEFFXXX",
  "is_default": true
}
For US accounts, set account_type to "us" and include account_number and routing_number. For individual accounts, provide account_holder_first_name and account_holder_last_name.

Bank Transfers

zero bank transfers propose

Propose a bank transfer for approval.
zero bank transfers propose \
  --amount 1000 \
  --currency usd \
  --bank-account-id ba_xxx \
  --reason "Contractor payment for January"
OptionRequiredDescription
--amountYesAmount in USDC
--currencyYesDestination currency (usd or eur)
--bank-account-idYesSaved bank account ID
--reasonNoReason for the transfer
IBAN accounts require --currency eur. US bank accounts require --currency usd.
Transfers create proposals that require approval in the dashboard before executing.
Transfers require completed KYC. If KYC is missing, the command returns an error asking the user to complete verification.

zero bank proposals list

List pending transfer proposals.
zero bank proposals list
zero bank proposals list --include-completed
OptionDescription
--include-completedInclude completed proposals

zero bank proposals dismiss

Dismiss a transfer proposal.
zero bank proposals dismiss --proposal-id prop_xxx

Invoices

zero invoices create

Create a new invoice.
zero invoices create \
  --recipient-email [email protected] \
  --recipient-name "Acme Corp" \
  --amount 2500 \
  --currency USD \
  --description "Q1 consulting services" \
  --due-date 2026-02-15 \
  --notes "Payment terms: Net 30"
OptionRequiredDescription
--recipient-emailYesClient’s email address
--recipient-nameNoClient’s name
--amountYesInvoice amount
--currencyYesCurrency code (USD, EUR, etc.)
--descriptionYesLine item description
--due-dateNoDue date (YYYY-MM-DD)
--notesNoAdditional notes

zero invoices list

List invoices with optional filters.
zero invoices list
zero invoices list --status pending --limit 10
OptionDescription
--statusFilter by status (db_pending, pending, paid, canceled)
--limitMaximum number of results

zero invoices get

Get a specific invoice.
zero invoices get --invoice-id inv_xxx

zero invoices update

Update an existing invoice.
zero invoices update \
  --invoice-id inv_xxx \
  --amount 3000 \
  --description "Updated scope"
OptionRequiredDescription
--invoice-idYesInvoice ID
--recipient-emailNoUpdate recipient email
--recipient-nameNoUpdate recipient name
--amountNoUpdate amount
--currencyNoUpdate currency
--descriptionNoUpdate description

zero invoices send

Send an invoice to the recipient.
zero invoices send --invoice-id inv_xxx

Transactions

zero transactions list

List transaction history.
zero transactions list
zero transactions list --status completed --limit 50
OptionDescription
--statusFilter by status (pending, completed, failed)
--limitMaximum number of results

zero transactions get

Get transaction details.
zero transactions get --transaction-id tx_xxx

Attachments

zero attachments add

Attach a file to a transaction.
zero attachments add \
  --transaction-id tx_xxx \
  --transaction-type offramp \
  --file ./receipt.pdf
OptionRequiredDescription
--transaction-idYesTransaction ID
--transaction-typeYesTransaction type (offramp or invoice)
--typeNoAlias for --transaction-type
--fileYesPath to file
--content-typeNoMIME type (auto-detected if omitted)

zero attachments list

List attachments.
zero attachments list
zero attachments list --transaction-id tx_xxx
OptionDescription
--transaction-idFilter by transaction ID
--transaction-typeFilter by type (offramp or invoice)
--limitMaximum number of results

zero attachments remove

Remove an attachment.
zero attachments remove --attachment-id att_xxx

Payment Details

zero payment-details show

Show payment details for receiving funds (USD ACH + EUR IBAN).
zero payment-details show
Output:
{
  "payment_details": {
    "hasAccounts": true,
    "accountTier": "full",
    "hasCompletedKyc": true,
    "usdAccount": {
      "type": "us_ach",
      "currency": "USD",
      "bankName": "Mercury",
      "routingNumber": "123456789",
      "accountNumber": "000123456789",
      "beneficiaryName": "0 Finance FBO Jane Doe"
    },
    "eurAccount": {
      "type": "iban",
      "currency": "EUR",
      "bankName": "Commerzbank",
      "iban": "DE89370400440532013000",
      "bicSwift": "COBADEFFXXX",
      "beneficiaryName": "0 Finance FBO Jane Doe"
    },
    "workspaceInfo": {
      "companyName": "Acme Corp",
      "firstName": "Jane",
      "lastName": "Doe"
    }
  },
  "message": "These are the bank account details for receiving payments."
}

zero payment-details share

Email your payment details to someone.
zero payment-details share \
  --recipient-email [email protected] \
  --recipient-name "Jane Smith"

Crypto Transfers

zero crypto transfers propose

Propose a crypto transfer.
zero crypto transfers propose \
  --to 0x742d35Cc6634C0532925a3b844Bc9e7595f... \
  --token-address 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 \
  --amount 100 \
  --token-symbol USDC \
  --token-decimals 6 \
  --chain-id 8453 \
  --reason "Partner payment"
OptionRequiredDescription
--toYesRecipient wallet address
--token-addressYesToken contract address
--amountYesToken amount
--token-symbolNoToken symbol (e.g., USDC)
--token-decimalsNo*Token decimals (required for non-USDC tokens)
--chain-idNoChain ID (defaults to 8453/Base if omitted)
--reasonNoReason for transfer
If --token-address is the Base USDC contract, you can omit --token-decimals and it will default to 6.

zero crypto proposals list

List crypto transfer proposals.
zero crypto proposals list
zero crypto proposals list --include-completed
OptionDescription
--include-completedInclude completed proposals

zero crypto proposals dismiss

Dismiss a crypto proposal.
zero crypto proposals dismiss --proposal-id prop_xxx

Savings

zero vaults list

List supported yield vaults.
zero vaults list

zero savings deposits propose

Propose a deposit into a yield vault.
zero savings deposits propose \
  --vault-address 0x... \
  --amount 1000 \
  --reason "Earning yield on idle funds"

zero savings withdrawals propose

Propose a withdrawal from a yield vault.
zero savings withdrawals propose \
  --vault-address 0x... \
  --amount 500 \
  --reason "Need funds for payment"
Vault addresses must come from zero vaults list (Base USDC vaults).

zero savings proposals list

List savings proposals.
zero savings proposals list
zero savings proposals list --include-completed
OptionDescription
--include-completedInclude completed proposals

zero savings positions

Show idle balance, earning balance, and vault positions.
zero savings positions
Output:
{
  "idle_balance": "420.50",
  "earning_balance": "2000.00",
  "spendable_balance": "2420.50",
  "safe_address": "0x954A329e1e59101DF529CC54A54666A0b36Cae22",
  "chain": "base",
  "vault_positions": [
    {
      "vault_address": "0x...",
      "vault_name": "Morpho USDC",
      "balance_usd": 2000
    }
  ]
}

Admin Commands

Admin commands require an admin token. Set ZERO_FINANCE_ADMIN_TOKEN or use --admin-token.

zero users create

Provision a new user.
zero users create \
  --email [email protected] \
  --admin-token adm_xxx
OptionRequiredDescription
--emailYes*User email (required if no phone)
--phoneYes*User phone (required if no email)
--wallets-jsonNoPath to wallets JSON array
--admin-tokenNoAdmin token (or set ZERO_FINANCE_ADMIN_TOKEN)

zero users show

Get user details.
zero users show --user-id did:privy:xxx --admin-token adm_xxx

zero users wallets pregenerate

Pregenerate wallets for a user.
zero users wallets pregenerate \
  --user-id did:privy:xxx \
  --wallets-json ./wallets.json \
  --admin-token adm_xxx
OptionRequiredDescription
--user-idYesPrivy user DID
--wallets-jsonNoPath to wallets JSON array
--admin-tokenNoAdmin token (or set ZERO_FINANCE_ADMIN_TOKEN)

zero api-keys create

Create an API key for a workspace.
zero api-keys create \
  --workspace-id ws_xxx \
  --created-by did:privy:xxx \
  --name "Production API Key" \
  --admin-token adm_xxx
OptionRequiredDescription
--workspace-idYesWorkspace ID
--created-byYesPrivy user DID that owns the key
--nameNoFriendly name for the key
--expires-atNoISO expiration date (e.g. 2026-12-31)
--admin-tokenNoAdmin token (or set ZERO_FINANCE_ADMIN_TOKEN)

Tips

JSON output

All commands output JSON. Pipe to jq for formatting:
zero balance | jq .spendable_balance

Scripting

Use the CLI in scripts:
#!/bin/bash
BALANCE=$(zero balance | jq -r .spendable_balance)
if (( $(echo "$BALANCE > 10000" | bc -l) )); then
  zero savings deposits propose \
    --vault-address 0x... \
    --amount 5000 \
    --reason "Auto-deposit excess funds"
fi

Error handling

Non-zero exit codes indicate errors. Error messages are printed to stderr:
zero invoices get --invoice-id invalid_id || echo "Invoice not found"