yuki
CLI client for the Yuki bookkeeping SOAP API.
Yuki is a Dutch bookkeeping SaaS used for accounting, VAT returns, and document archiving. This CLI lets you query your administration, find missing invoices, and upload documents — from the terminal or as part of automated workflows.
Note: This project is not affiliated with or endorsed by Yuki Software.
Install
Or via pip:
Both install the yuki binary.
Setup
- Get a Yuki API key from your Yuki portal under Settings > API keys.
- Run
yuki initand paste your key when prompted. The CLI discovers your administrations and writes the config to~/.config/yuki/config.toml.
Non-interactive (for scripting):
To rotate your API key later:
Quick start: find missing invoices
The main workflow is finding bank transactions that don't have a matching invoice in Yuki:
# Show bank debits without matching invoices for Q1 2025
This cross-references bank transactions against outstanding creditor items, booked archive documents, and known counterparty names. The output shows unmatched transactions with their date, amount, counterparty, and description.
For each unmatched item, you can check if the invoice is already in the archive, and upload it if not:
# Check if an invoice already exists
# Upload an invoice (Yuki auto-sorts it)
# Or upload to a specific folder with metadata
Commands
Querying
Gap analysis
Uploading
Global flags
| Flag | Description |
|---|---|
--admin <name> |
Override default administration |
--format table|json |
Output format (auto-detects TTY) |
--quiet |
Suppress informational output |
Periods
The --period flag accepts:
2025— full year2025-Q1— quarter2025-03— single month
Agent use
When stdout is not a TTY (piped or called by an agent), output defaults to JSON. Errors are also structured JSON on stderr. Exit codes: 0 success, 1 general error, 2 auth error, 3 not found, 4 rate limited.
The documents exists command exits with code 3 when no matching document is found, making it easy to use in scripts and agent workflows.
Config
~/.config/yuki/config.toml:
= "your-api-key"
= "company_name"
# Skip these counterparties in `check unmatched` (case-insensitive substring match)
= [
"Belastingdienst",
"ING bankkosten",
]
[]
= "domain-uuid"
= "admin-uuid"
Development
make check # Run clippy + fmt check + tests
make build # Debug build
make release # Release build
make fmt # Format code
make install # Install to ~/.cargo/bin/
License
MIT