Metrics
The data slices behind net worth, cash flow and every report in Walletguide, and why you should ask them instead of summing transactions.
Every number the app shows comes from a slice: a named computation that runs on the server over the full history. There are seventeen of them, and they are the same code the dashboard and the reports use, so an answer from the API is the answer in the app.
curl -s -X POST -H "Authorization: Bearer $WALLETGUIDE_API_KEY" \
-H 'content-type: application/json' -d '{"period":"ytd"}' \
"https://api.walletguide.com/wallets/$W/data/netWorthTimeSeries"Why not add the rows up yourself
Because you would get a different number, and nothing would tell you.
A list route is paginated, so you would be summing a page. Beyond that, several rules live in the engine rather than on the row. A split transaction has a parent that must not be counted alongside its children. A transfer between two of your own accounts is two rows and zero net change. Offset and balance categories exist to correct a total rather than contribute to it. A holding in another currency converts at the rate for its date, not today's.
The slices apply all of that. Raw rows are for showing transactions, not for totalling them.
What there is
| Slice | Answers |
|---|---|
netWorthTimeSeries | What it was worth, bucketed by month or day |
networthAtDate | What it was worth on one date |
netWorthByAsset | Which assets make it up |
netWorthByAssetAccess | The same, grouped by how liquid it is |
assetPerformance | What each asset did over a window |
cashFlowTimeSeries | In and out, over time |
cashFlowByCategory | In and out, by category |
categoryBreakdown | Where the money went |
categoryAverages | What a category usually costs |
expensesByMerchant | Who it went to |
merchantActivity | Each merchant's average month, and when it was last paid |
categoryActivity | Each category's average month, and when it was last used |
topExpenses | The largest of them |
profitLoss | Income against expenses |
planVsActual | The plan against what happened |
periodDetails | One period, in full |
transfers | Movement between your own accounts |
cryptoHoldingsValue | Crypto positions and their value |
securityHoldingsValue | Securities positions and their value |
Each is a route under /wallets/{walletId}/data/, with its own parameters. See the reference for the exact shapes, or walletguide data --help.
Periods
Most slices take a period, either a named window or an explicit one:
{ "period": "ytd" }
{ "period": { "startDate": "2026-01-01", "endDate": "2026-03-31" } }Named windows: today, yesterday, 7days, 30days, 3months, 6months, 1year, mtd, ytd, lastWeek, lastMonth, lastYear, thisYear, thisAndNextYear, allTime. Omitting it altogether means the whole history, from the earliest transaction to today.
Asking for several at once
A dashboard wants six numbers, and six round trips is five too many. data/batch takes them together and shares the loaded engine between them:
curl -s -X POST -H "Authorization: Bearer $WALLETGUIDE_API_KEY" \
-H 'content-type: application/json' \
-d '{"slices":[
{"type":"netWorthTimeSeries","period":"1year"},
{"type":"categoryBreakdown","period":"30days"}
]}' \
"https://api.walletguide.com/wallets/$W/data/batch"The results come back in the order you asked. This is what the app itself does on every page load.
Permissions
A slice needs the read permissions of the data it draws on, and its reference page lists them. A batch with one slice the key may not read is refused as a whole, with a 403 naming the missing permission, so leave out what the key cannot see rather than asking for it.
The income and expense slices (cashFlowTimeSeries, cashFlowByCategory, categoryBreakdown, profitLoss and expensesByMerchant) need financials read for the whole wallet (expensesByMerchant transactions read too). Scoped with assetIds they become figures per asset, which need assets read as well. Their reference pages list both; a key with financials read alone can call them without assetIds.