Summarise transactions
Totals over the same transactions /transactions lists, using the same filters,
grouped by a period bucket and at most one other dimension.
What it counts is fixed and cannot be overridden, so the figures agree with the totals ThinkOut shows. Transfers between the workspace’s own accounts, transactions excluded by the user, and duplicates are all left out. Split transactions are counted through their pieces, never through the original, so nothing is counted twice.
None of those distinctions appear on /transactions, which reports movements rather
than cash flow. Summing a list will therefore not reproduce these figures, and is not
meant to.
Amounts are converted to currency, defaulting to the workspace currency. Each
transaction converts at the rate for its own date. The conversion object on the
response says what was done.
Rows grouped by period alone carry what the cash flow screen shows for that period:
the flows, and the starting balance, transfers, excluded movements and final balance
of the accounts in scope. Rows grouped by a second dimension carry the flows only,
since a balance per counterparty or category means nothing. totals covers the
whole window, so a caller never adds rows.
Filters stack: bank_id, account_id, category_id, counterparty_id, label_id
and direction may all be given together and combine with AND, and each id filter
takes several ids that combine with OR. Grouping is the narrower thing: a period
bucket and at most one more dimension. Marketing spend on one project per month is
one call with two filters and no group_by; spend per category and per label at
once is two calls.
Three shapes of question, three requests:
Inflows and outflows per month, with balances
GET /transactions/summary?from=2026-03-01&to=2026-04-30&interval=month
Top counterparties this quarter
GET /transactions/summary?from=2026-07-01&to=2026-09-30&interval=month&group_by=counterparty&direction=outflow
Cash flow by month for one bank's accounts
GET /transactions/summary?from=2026-03-01&to=2026-08-31&interval=month&bank_id=5d6e7f80-9a1b-4c2d-8e3f-4a5b6c7d8e9f
The response examples below show the first two.
The window is always explicit. There are no named periods here; a caller that wants “last quarter” computes the two dates and passes them, and the response echoes them.
Authorizations
A workspace API key created in ThinkOut settings. One key reads one workspace.
Query Parameters
First day of the window, inclusive.
Last day of the window, inclusive.
The period bucket rows are grouped into. A period bucket for report rows. The same buckets the ThinkOut cash flow screen offers.
day, week, month A second dimension to group by, alongside the period bucket. At most one. Omit it to get one row per period.
A dimension to group report rows by, alongside the period bucket.
category, counterparty, label, account, activity, direction Currency to report totals in. Defaults to the workspace currency. The conversion
object on the response says whether conversion happened and on what basis.
ISO 4217 alphabetic currency code.
^[A-Z]{3}$"RON"
Only rows on the accounts fed by these bank connections. Comma-separated for several.
Only rows on these accounts. Comma-separated for several.
Only rows in these categories. Comma-separated for several. On transactions this also matches a split transaction whose pieces are in one of them, even though the row itself carries no category.
Only rows carrying at least one of these labels. Comma-separated for several.
Only rows attributed to these counterparties. Comma-separated for several.
Whether money comes in or goes out.
On a transaction or a forecast it follows the sign of amount and can never
disagree with it. It is present so that responses can be grouped and read without
inspecting signs.
inflow, outflow Response
The summary.
"summary"The window actually computed, after resolving any macro or stored relative dates.
What was done to make amounts comparable.
A dimension to group report rows by, alongside the period bucket.
category, counterparty, label, account, activity, direction false when nothing matched. Distinguishes "no transactions here" from totals
that genuinely came to zero.
The whole window added up, after the same exclusions as the rows.