Fob
Browse the docs

Query

query run runs an ActualQL query against your budget. Use it when a list command isn't enough: across all accounts, with joins to payee and category names, or with your own filters.

fob-actual query run --table transactions \
  --select date,amount,payee.name,category.name \
  --filter '{"amount":{"$lt":0}}' --order-by date --desc --limit 10
date        amount   payee.name        category.name      id
----------------------------------------------------------------------------------------------
2026-10-03  -45000   Starting Balance  Starting Balances  090a9ac8-905a-4e52-9c11-305bfb1509f4
2026-09-10  -6299    Corner Grocery    Groceries          dd602fe0-20fa-497f-ba01-91372db9565e
2026-09-05  -8423    Corner Grocery    Groceries          79bf3280-f439-44b2-aed4-3fb5ddc0306c
2026-09-01  -180000  Landlord          Rent               02601a62-438b-4cc8-856e-7a56d42a2923

Amounts are Actual's integer minor units here (-6299 is −62.99), and every row includes its id.

Options#

Option
--tabletransactions, accounts, categories, payees, schedules and other ActualQL tables
--select a,b.cColumns, including joined fields such as payee.name and category.name
--filter '<json>'An ActualQL filter. Repeat it to add conditions; all must match
--order-by <field> and --descSort
--limit <n>Maximum rows
--query '<json>' or --file <path>A whole serialized query instead of the options above
--format csvCSV instead of a table
--jsonThe raw result, { "data": [...], "dependencies": [...] }

Filters use ActualQL operators such as $eq, $lt, $gte, $oneof and $like:

# Grocery spending this year
fob-actual query run --table transactions --select date,amount,payee.name \
  --filter '{"category.name":"Groceries"}' --filter '{"date":{"$gte":"2026-01-01"}}'

# Uncategorized transactions in any account
fob-actual query run --table transactions --select date,account.name,payee.name,amount \
  --filter '{"category":null}'

See the ActualQL documentation for every operator, function and table.