API reference
Every /v1 route, from the OpenAPI spec the server generates.
Base URL https://app.usetruenote.com/v1. Send Authorization: Bearer <token>: a personal access token from Connected agents, or an OAuth access token. The spec is at https://app.usetruenote.com/v1/openapi.json; this page is drawn from it at build time.
curl https://app.usetruenote.com/v1/overview -H "Authorization: Bearer tn_pat_…" - Money is integer cents; days are
YYYY-MM-DD; transaction amounts keep Plaid's sign (positive is money out). - Lists page by keyset: pass the
cursoran answer gives you back. - Errors are JSON with a
codeand a message; 403 names the scope that's missing; 404 is also what someone else's row looks like. - 240 requests a minute per token. Changes are additive; deprecations are announced in the changelog.
Routes
- GET /v1/overview
- GET /v1/accounts
- GET /v1/transactions
- GET /v1/spending
- GET /v1/recurring
- GET /v1/net-worth-history
- GET /v1/holdings
- GET /v1/investment-transactions
- GET /v1/liabilities
- GET /v1/context
- GET /v1/plan
- GET /v1/plan/actuals
- GET /v1/taxes/projection
- GET /v1/tasks
- GET /v1/buckets
- GET /v1/review-items
- GET /v1/bucket-rules
- GET /v1/documents
- POST /v1/documents
- GET /v1/documents/{id}
- GET /v1/documents/{id}/file
- GET /v1/export
- GET /v1/export.zip
GET /v1/overview
Net worth, this month, the plan, bills, goals and the next estimated tax in one call
Needs any read scope. Accounts and entities the token excludes are invisible here, totals included.
Responses: 200, 400, 401, 403, 404
GET /v1/accounts
Accounts with latest balances (debts negative), manual accounts and net worth totals
Needs accounts:read. Accounts and entities the token excludes are invisible here, totals included.
| Parameter | In | Type | Meaning |
|---|---|---|---|
type | query | depository | credit | loan | investment | other | Only accounts of this type |
includeHidden | query | string | Include closed accounts, and accounts the person hid if this token may see hidden accounts |
Responses: 200, 400, 401, 403, 404
GET /v1/transactions
Transactions newest first, filtered, keyset-paged (money in positive)
Needs transactions:read. Accounts and entities the token excludes are invisible here, totals included.
| Parameter | In | Type | Meaning |
|---|---|---|---|
from | query | string | First day (inclusive); default: all history |
to | query | string | Last day (inclusive) |
accountId | query | uuid | |
categoryId | query | A category id (its subcategories included), or `none` for uncategorized | |
entityId | query | uuid | |
merchant | query | string | Merchant or description contains this (any case) |
q | query | string | Description, merchant or note contains this |
minAmountCents | query | integernull | Size at least this, in cents (either direction) |
maxAmountCents | query | integernull | |
direction | query | in | out | Money in or money out |
pending | query | string | |
ownerContribution | query | string | true: only a business's spending paid from a personal account |
limit | query | integer | Rows per page (default 50, max 200) |
cursor | query | string | `nextCursor` of the last page |
Responses: 200, 400, 401, 403, 404
GET /v1/spending
Spending grouped by category, merchant, entity or month: the household's by default (scope=all adds the businesses; entityId picks one)
Needs transactions:read. Accounts and entities the token excludes are invisible here, totals included.
| Parameter | In | Type | Meaning |
|---|---|---|---|
from | query | string | Default: the first of this month |
to | query | string | Default: today |
groupBy | query | category | merchant | entity | month | |
scope | query | household | all | household (default): the personal entities, as the overview's month counts them; all: the household and every business together. Ignored with entityId |
entityId | query | uuid | Only this entity's spending (one business) |
categoryId | query | uuid | Only this category (and its subcategories) |
limit | query | integer | Groups to list (default 25); the rest are summed |
Responses: 200, 400, 401, 403, 404
GET /v1/recurring
Recurring bills, subscriptions and income with next dates and monthly totals
Needs transactions:read. Accounts and entities the token excludes are invisible here, totals included.
| Parameter | In | Type | Meaning |
|---|---|---|---|
direction | query | inflow | outflow | |
includeInactive | query | string |
Responses: 200, 400, 401, 403, 404
GET /v1/net-worth-history
Net worth over time by account type (day, week or month points)
Needs accounts:read. Accounts and entities the token excludes are invisible here, totals included.
| Parameter | In | Type | Meaning |
|---|---|---|---|
from | query | string | Default: a year ago |
to | query | string | Default: today |
interval | query | day | week | month |
Responses: 200, 400, 401, 403, 404
GET /v1/holdings
Investment positions by account, optionally the latest investment transactions
Needs investments:read. Accounts and entities the token excludes are invisible here, totals included.
| Parameter | In | Type | Meaning |
|---|---|---|---|
accountId | query | uuid | |
includeTransactions | query | string | Also the latest investment transactions (buys, sells, dividends) |
Responses: 200, 400, 401, 403, 404
GET /v1/investment-transactions
Investment transactions newest first, filtered by date, account, type, subtype or symbol, keyset-paged, with totals by kind (cash in positive)
Needs investments:read. Accounts and entities the token excludes are invisible here, totals included.
| Parameter | In | Type | Meaning |
|---|---|---|---|
from | query | string | First day (inclusive); default: all history |
to | query | string | Last day (inclusive) |
accountId | query | uuid | |
type | query | buy | sell | cash | fee | transfer | cancel | |
subtype | query | string | Plaid's subtype, any case: dividend, interest, buy, sell, deposit… |
symbol | query | string | Ticker, any case |
q | query | string | Description contains this |
limit | query | integer | Rows per page (default 50, max 200) |
cursor | query | string | `nextCursor` of the last page |
Responses: 200, 400, 401, 403, 404
GET /v1/liabilities
Cards and loans: owed, APR, minimums, due dates
Needs liabilities:read. Accounts and entities the token excludes are invisible here, totals included.
Responses: 200, 400, 401, 403, 404
GET /v1/context
Profile, entities, income sources, goals, categories, rules, notes, plans
Needs context:read. Accounts and entities the token excludes are invisible here, totals included.
Responses: 200, 400, 401, 403, 404
GET /v1/plan
The spending plan: regular take-home split into groups and lines
Needs context:read. Accounts and entities the token excludes are invisible here, totals included.
Responses: 200, 400, 401, 403, 404
GET /v1/plan/actuals
Plan vs actual for a month: household spending per plan group and category line against the plan, the trailing 3 months' average, and spending no line names
Needs context:read, transactions:read. Accounts and entities the token excludes are invisible here, totals included.
| Parameter | In | Type | Meaning |
|---|---|---|---|
month | query | string | A month like 2026-10; default this month |
Responses: 200, 400, 401, 403, 404
GET /v1/taxes/projection
The year's federal tax projected from today: the statement line by line, the refund or amount owed, the extra withholding per paycheck that breaks even, the safe harbor
Needs context:read, transactions:read. Accounts and entities the token excludes are invisible here, totals included.
| Parameter | In | Type | Meaning |
|---|---|---|---|
year | query | integer |
Responses: 200, 400, 401, 403, 404
GET /v1/tasks
The checklist: open tasks by due date (status=done|all for the rest)
Needs context:read. Accounts and entities the token excludes are invisible here, totals included.
| Parameter | In | Type | Meaning |
|---|---|---|---|
status | query | open | done | all |
Responses: 200, 400, 401, 403, 404
GET /v1/buckets
Buckets: each account's virtual split, balances from Truenote's ledger, targets and what's Unassigned
Needs accounts:read, context:read. Accounts and entities the token excludes are invisible here, totals included.
| Parameter | In | Type | Meaning |
|---|---|---|---|
accountId | query | uuid | Only this account's buckets |
includeArchived | query | string | Also archived buckets |
recentEntries | query | integernull | Latest ledger entries per bucket (default 3) |
Responses: 200, 400, 401, 403, 404
GET /v1/review-items
The Review queue: deposits to split, spending that looks like a bucket's, money taken out of a bucketed account, each with a proposal
Needs accounts:read, transactions:read, context:read. Accounts and entities the token excludes are invisible here, totals included.
| Parameter | In | Type | Meaning |
|---|---|---|---|
status | query | open | resolved | open (default): waiting for a decision; resolved: the latest decided |
Responses: 200, 400, 401, 403, 404
GET /v1/bucket-rules
Bucket rules: spending they charge to a bucket automatically, first match wins
Needs accounts:read, context:read. Accounts and entities the token excludes are invisible here, totals included.
Responses: 200, 400, 401, 403, 404
GET /v1/documents
Documents the person uploaded (paystubs, tax forms, statements), newest first
Needs documents:read. Accounts and entities the token excludes are invisible here, totals included.
| Parameter | In | Type | Meaning |
|---|---|---|---|
q | query | string | Words in the name, notes or text (Social Security and account numbers masked) |
kind | query | paystub | w2 | form_1099 | form_1098 | tax_return | benefits | statement | receipt | other | |
taxYear | query | integer |
Responses: 200, 400, 401, 403, 404
POST /v1/documents
Keep a document for the person (multipart: file + metadata, a SaveDocument as JSON)
Needs documents:write. A PDF, PNG, JPEG or WebP image, at most 10 MB; the same file twice is a 409. Its entity, income source and account must be ones this token can see. Example: curl -H 'Authorization: Bearer tn_pat_…' -F file=@paystub.pdf -F 'metadata={"name":"Paystub Oct 16","kind":"paystub","taxYear":2026}' <origin>/v1/documents
Responses: 201, 400, 401, 403, 409, 413
GET /v1/documents/{id}
One document's text (masked, paged by offset); an image's bytes are at /file
Needs documents:read. Accounts and entities the token excludes are invisible here, totals included.
| Parameter | In | Type | Meaning |
|---|---|---|---|
id * | path | uuid | Id |
offset | query | integernull | Where to continue a long text (the last call's nextOffset) |
Responses: 200, 400, 401, 403, 404
GET /v1/documents/{id}/file
A document's file as uploaded (unmasked)
Needs documents:read.
| Parameter | In | Type | Meaning |
|---|---|---|---|
id * | path | uuid | Id |
Responses: 200, 401, 403, 404
GET /v1/export
Everything this token can see, every table, as JSON (truenote-export/1)
Needs accounts:read, transactions:read, investments:read, liabilities:read, context:read. Accounts and entities the token excludes are invisible here, totals included.
Responses: 200, 400, 401, 403, 404
GET /v1/export.zip
The same export as a zip of CSV files, one per table
Needs accounts:read, transactions:read, investments:read, liabilities:read, context:read.
Responses: 200, 401, 403