Global options
The flags below apply to every CLI invocation, regardless of subcommand.dualentry --help is the fastest way to see all available commands. You can also run dualentry [resource] --help for help on a specific resource.Authentication commands
The authentication commands manage how the CLI connects to your DualEntry account.
Login runs the OAuth flow against
/public/v2/oauth/authorize/ and /public/v2/oauth/token/, then stores the resulting API key in your system keychain. On a machine with no usable keychain, the CLI falls back to a file, so treat that file as a credential if you are working on a shared host.
For CI/CD or headless environments, set the X_API_KEY environment variable instead. See Configuration below.
Resource commands
The Resource commands section lists all CLI resources grouped by domain.Standard subcommands
Most resources support these subcommands:
Run
dualentry [resource] --help to see the exact flags and required arguments for each subcommand; they vary by resource.
Creating and updating records
create and update both read the record body from a JSON file; there is no way to pass fields directly as flags:
get, update does not strip a display prefix like IN- from its record-ID argument; pass the bare number or ID get shows you, not the prefixed one.
Read-only resources
Several resources are read-only or non-editable and dropcreate and/or update: accounts, companies, budgets, paper-checks, depreciation-books, and workflows support only list and get. inbox is more restricted still, supporting only list, with no get.
Looking up records by number or ID
On resources that carry a record number,get accepts either a number or an ID and works out which you gave it. Two explicit forms are available when you want to be unambiguous:
Resource-specific subcommands
A few subcommands are resource-specific rather than universal:Intercompany journal entry helpers
intercompany-journal-entries validate checks a JSON file offline (line items present, debits equal credits, at least two companies) unless you pass --online, which also confirms every company_id in the file is one you can access:
intercompany-journal-entries template writes a sample payload to stdout, or to a file with --output/-o.
Receivables
Payables
Accounting
Master data
Automation
Bank matching
dualentry bank-match doesn’t follow the list/get/create/update shape above. It has its own subcommands for reconciling bank-feed rows against DualEntry transactions.
bank-transactions list accepts --financial-account-id, --matching-status, --date-from, --date-to, --is-posted/--not-posted, and --include-expired, plus the standard --limit/--offset/--all. suggestions list accepts --financial-transaction-id, --suggestion-type (match or create), and --highest-ranked.
match confirms a 1:1 or partial match with --financial-transaction-id plus exactly one of --transaction-id or --entry-id, or a full 1:1/M:N body via --file/-f (these are mutually exclusive). unmatch takes exactly one of --financial-transaction-id or --match-group-id; unmatching any member dissolves the whole group. template writes to stdout or --output/-o, and accepts --type/-t (1:1, m:n, or partial).
Common flags
The flags below work across multiple resource commands and control output format, pagination, and filtering.Output format
The output format flag toggles between human-readable tables and machine-readable JSON.- Table format (default): a human-readable, column-aligned table rendered with Rich. Best for quick lookups in the terminal.
- JSON format: raw JSON output. Best for scripting, piping to
jq, or feeding into other tools.
Pagination
Three flags control how much alist command returns.
By default,
list commands return one page. Use --all when you need the complete dataset:
--limit and --offset page through a fixed range in a single request. --all fetches every page automatically, issuing one request per page, which is slower than a single page on a large resource.
Filtering
Four filters are available on mostlist commands, though a few resources with hand-rolled list commands (for example accounts) only support --search, and depreciation-books list supports none of them:
Three more are entity filters, and these do vary by resource, because a resource only exposes the ones that make sense for it:
Run
dualentry [resource] list --help to see which entity filters a specific resource accepts.
Configuration
The configuration commands and environment variables below control how the CLI connects to DualEntry.Viewing config
Display your current configuration, including API URL and auth state, with the following command:Setting a custom API URL
config set-url persists a custom API base URL to your config file (~/.dualentry/config.toml), as an alternative to setting DUALENTRY_API_URL every session. Every organization, sandbox or production, is reached at the same https://api.dualentry.com by default; which one you’re working against depends on the API key you authenticate with, not the URL (see Authentication). config set-url exists as an escape hatch for pointing the CLI at a different host entirely:
DUALENTRY_API_URL environment variable, when set, overrides whatever this stores.
Environment variables
Set the variables below to override default CLI behavior, primarily for CI/CD or non-production environments.Exit codes
The CLI returns0 on success and 1 on any error, including a failed request, a missing argument, or an authentication failure. Check the process exit code in scripts rather than parsing output.
Example output
The columns below appear in the table output ofdualentry invoices list: record ID, document number, dates, company, counterparty, currency, financial amounts, and status. Other resources follow a similar table layout with columns relevant to that record type.
Known limitations
The CLI is early-stage software. The current limitations are:- Early version: the CLI is at
v0.1.18at the time of writing; expect evolving commands and occasional rough edges. - Delete is limited to recurring records: no other resource supports
delete, and several (see Resource commands) don’t even supportcreateorupdate. - Performance: some operations may be slow, especially on large datasets.
- Python 3.11+ required: Homebrew handles this automatically; other install methods require you to have Python 3.11+ already installed.