Skip To Main Content
All modules

Finance

Fields marked * are required. Updates keep every field they are not given. An AI app can ask vritto_describe for the same details, filtered to what its connection may use.

Finance Overviewfinance_overview

Accounts, balances, budgets, reports, and cash flow; read-only summaries.

finance_queryOverviewFindthrough vritto_find

Return the finance overview: accounts (with currentBalance), categories, budgets, recurring items, recent transactions, and a summary (assets, liabilities, netWorth, monthIncome, monthExpense, monthNet). Use for net-worth, balance, cash-flow, and this-month spend questions, and to resolve account/category IDs before any write.

No input.

finance_queryReportFindthrough vritto_find

Spending & cash-flow report over a date range: totals plus spending by category, by merchant, and income vs expense by month. Use for 'how much did I spend on X last month', 'top merchants', and trend questions.

FieldTypeDescription
fromstringRange start (defaults to ~6 months ago).
tostringRange end (defaults to today).

Transactiontransaction

One expense, income, or transfer on an account.

finance_queryTransactionsFindthrough vritto_find

List transactions, optionally filtered by account and date range (newest first, paginated). Use to find or show specific transactions.

FieldTypeDescription
accountIdstringFilter to one account (ID from finance_queryOverview).
tripIdstringFilter to transactions attributed to one Trips-module trip.
fromstringLocal date YYYY-MM-DD.
tostringLocal date YYYY-MM-DD.
limitinteger
cursorstringOpaque nextCursor from the previous page's result. Omit for the first page; pass it back unchanged to fetch the next page.
finance_upsertTransactionCreate or Updatethrough vritto_create or vritto_update

Create or update one transaction. Omit record.id to create (accountId + amount required); include a real record.id from finance_queryTransactions to edit, only sent fields change. Auto-categorization rules run on create. Example: record { accountId, date '2026-07-10', type 'expense', amount 42, merchantName 'Blue Bottle', categoryId }.

FieldTypeDescription
record*object
record.idstringExisting transaction ID from finance_queryTransactions to update. Omit to create.
record.accountIdstringAccount the transaction belongs to (from finance_queryOverview). Required when creating.
record.datestringTransaction date (defaults to today).
record.typeone of expense, income, transferDefault 'expense'.
record.amountnumberPositive magnitude; direction comes from type. Required when creating.
record.currencystring
record.categoryIdstringCategory ID from finance_queryOverview.categories. Omit to leave uncategorized (rules may fill it).
record.merchantNamestringe.g. 'Blue Bottle Coffee'.
record.payeestringPerson/organization paid or received from, when distinct from the merchant (e.g. a check to a landlord).
record.descriptionstringBank-statement style description line.
record.statusone of cleared, pendingDefault 'cleared'. Use 'pending' for transactions that haven't posted yet; reconciliation clears them.
record.notesstring
record.transferAccountIdstringRequired when type is 'transfer'. A transfer is ONE transaction: accountId is the SOURCE (money out) and transferAccountId the DESTINATION (money in), no second transaction is created, and transfers are excluded from income/expense totals. Must differ from accountId.
record.splitslist of objectSplit one transaction across categories. Split amounts MUST sum exactly to the transaction amount; when splits are sent the top-level categoryId is cleared. Not allowed on transfers.
record.tripIdstringTrip ID from the Trips module to attribute this spend to a trip. Only pass a real ID.
record.tagslist of stringFree-form labels for cross-cutting views (e.g. 'reimbursable', 'vacation-2026'). Reuse the user's existing tag spellings where possible.
Example input
{
  "record": {
    "accountId": "acct_checking",
    "date": "2026-09-25",
    "type": "expense",
    "amount": 42.18,
    "currency": "USD",
    "merchantName": "Whole Foods"
  }
}
finance_deleteTransactionDeletethrough vritto_delete

Delete (archive) one transaction and reverse its balance effect. Resolve the ID with finance_queryTransactions first. Only for explicit removals.

FieldTypeDescription
transactionId*string

Finance Accountfinance_account

A bank, card, investment, loan, or cash account.

finance_upsertAccountCreate or Updatethrough vritto_create or vritto_update

Create or update one account. Omit record.id to create (name required); include a real record.id to update. Set balanceModel 'valuation' for assets you value periodically (house, 401k) and 'ledger' for accounts you track transaction-by-transaction.

FieldTypeDescription
record*object
record.idstringExisting account ID from finance_queryOverview to update. Omit to create.
record.namestringAccount name, e.g. 'Chase Checking'. Required when creating.
record.typeone of checking, savings, cash, investment, retirement, crypto, other_asset, credit_card, loan, mortgage, line_of_credit, other_liabilityAccount type (default 'checking'); determines asset vs liability.
record.balanceModelone of ledger, valuation'ledger' tracks transactions; 'valuation' tracks a periodic balance snapshot (house, 401k).
record.currencystringISO-4217 code (default USD).
record.openingBalancenumberStarting balance for a ledger account.
record.openingDatestringWhen the account was opened / the opening balance applies.
record.statusone of open, closed, hiddenDefault 'open'. Set 'closed' when the user closes an account, closed accounts drop out of net worth.
record.creditLimitnumberCredit limit (credit cards / lines of credit).
record.interestAprnumberInterest rate / APR %.
record.statementDayintegerDay of the month the statement closes, 1-31 (0 = unset). Liability accounts only.
record.paymentDueDayintegerDay of the month the payment is due, 1-31 (0 = unset). Setting this schedules a monthly payment reminder. Liability accounts only, a due day belongs to the credit line, not to a card.
record.autopayEnabledbooleanWhether autopay is set up. Does not silence the reminder, it softens it into a 'make sure the funds are there' heads-up.
record.minimumPaymentnumberMinimum payment due, shown in the reminder.
record.paymentReminderDaysintegerDays before the due day to remind (default 3; 0 turns the payment reminder off).
record.valuationHistorylist of objectDated balance snapshots for a 'valuation' account (house, 401k). WARNING: sending this REPLACES the whole history, read the account's current valuationHistory from finance_queryOverview first and resend it with the new point appended.
record.balanceAsOfstringDate the latest valuation/balance was taken.
record.includeInNetWorthboolean
record.institutionNamestring
record.notesstring
Example input
{
  "record": {
    "name": "Chase Checking",
    "type": "checking",
    "balanceModel": "ledger",
    "currency": "USD",
    "openingBalance": 2400,
    "openingDate": "2026-09-01"
  }
}
finance_reconcileAccountUpdatethrough vritto_update

Reconcile a LEDGER account to the user's stated real balance ('my checking actually has 2,314.50'). Posts an audited 'Balance adjustment' transaction for any difference (never a silent edit) and marks the account's pending transactions cleared. Not for 'valuation' accounts: update those via finance_upsertAccount valuationHistory instead.

FieldTypeDescription
accountId*stringAccount ID from finance_queryOverview.
realBalance*numberThe true current balance the user asserts.
asOfstringDate the balance was checked (defaults to today).
finance_deleteAccountDeletethrough vritto_delete

Delete (archive) one account and its transactions. Resolve the ID with finance_queryOverview first. Only for explicit removals, this hides the account and all its history from active views.

FieldTypeDescription
accountId*string

Cardcard

A credit, debit, or prepaid card on an account.

finance_upsertCardCreate or Updatethrough vritto_create or vritto_update

Create or update one card (credit, debit, or prepaid). Omit record.id to create, accountId is required and must be a real account from finance_queryOverview. Store the LAST 4 DIGITS ONLY, never a full card number or CVV. Setting expiryMonth + expiryYear schedules a reminder before it expires.

FieldTypeDescription
record*object
record.idstringExisting card ID from finance_queryOverview.cards to update. Omit to create.
record.accountIdstringThe account this card spends from (from finance_queryOverview.accounts). REQUIRED when creating: a credit card points at its credit_card account; a debit card points at the checking/savings account it draws on. A card never holds its own balance.
record.nicknamestringWhat the user calls it, e.g. 'Chase Sapphire'.
record.cardKindone of credit, debit, prepaidDefault 'credit'.
record.networkone of visa, mastercard, amex, discover, other
record.last4stringThe LAST 4 DIGITS ONLY, exactly 4 digits, e.g. '4242'. Never accept, store, or ask for a full card number or CVV.
record.cardholderNamestring
record.expiryMonthintegerExpiry month 1-12 (0 = unset). A card is valid through the END of this month. Must be set together with expiryYear.
record.expiryYearintegerFour-digit expiry year, e.g. 2029 (0 = unset). Must be set together with expiryMonth.
record.statusone of active, expired, replaced, cancelledDefault 'active'. A past expiry reads as 'expired' automatically.
record.isPrimaryboolean
record.expiryReminderDaysintegerDays before expiry to remind (default 45; 0 disables the reminder).
record.notesstring
finance_deleteCardDeletethrough vritto_delete

Delete (archive) one card and cancel its reminders. Resolve the ID from finance_queryOverview.cards first. Only for explicit removals, the account it spends from is untouched.

FieldTypeDescription
cardId*string

Budgetbudget

A month's budgeted amounts per category.

finance_queryBudgetFindthrough vritto_find

A month's budget status: budgeted, spent (activity), and available per category, plus unbudgeted spending.

FieldTypeDescription
monthstringDefaults to the current month.
finance_upsertBudgetUpdatethrough vritto_update

Set budgets for one or more categories in a month. Pass month (YYYY-MM) and lines [{ categoryId, budgeted, rollover }] for ONLY the categories being changed, the month's other budget lines are kept as they are, and their rollover flags are untouched. Omitting rollover on a line keeps that category's existing setting. To clear a category's budget, send it with budgeted 0 and rollover false.

FieldTypeDescription
month*stringMonth YYYY-MM.
lines*list of object
Example input
{
  "month": "2026-10",
  "lines": [
    {
      "categoryId": "cat_groceries",
      "budgeted": 600
    }
  ]
}

Recurring Bill or Incomerecurring_item

A repeating bill, subscription charge, or income.

finance_upsertRecurringCreate or Updatethrough vritto_create or vritto_update

Add or update a recurring bill or income. Omit record.id to create (merchantName required). Example: record { merchantName 'Rent', amount 2200, cadence 'monthly', kind 'bill', nextDate '2026-08-01' }.

FieldTypeDescription
record*object
record.idstring
record.merchantNamestring
record.amountnumber
record.currencystring
record.cadenceone of weekly, biweekly, monthly, quarterly, semiannual, yearly
record.nextDatestringLocal date YYYY-MM-DD.
record.kindone of bill, income, subscription, loan_payment, transfer
record.categoryIdstring
record.accountIdstring
record.statusone of active, paused, endedDefault 'active'. Set 'paused' for 'pause my gym membership' and 'ended' when a bill stops for good.
record.reminderLeadDaysintegerDays before nextDate to remind. Default 3.
record.notesstring
Example input
{
  "record": {
    "merchantName": "Rent",
    "amount": 2150,
    "currency": "USD",
    "cadence": "monthly",
    "nextDate": "2026-10-01",
    "kind": "bill"
  }
}
finance_deleteRecurringDeletethrough vritto_delete

Delete (archive) one recurring bill/income series and mark it ended. Resolve the ID from finance_queryOverview.recurring first. Only for explicit removals, to temporarily stop a bill, set status 'paused' via finance_upsertRecurring instead.

FieldTypeDescription
recurringId*string

Spending Categoryfinance_category

A spending or income category.

finance_upsertCategoryCreate or Updatethrough vritto_create or vritto_update

Create or update a spending/income category ('add a category called Pets'). Omit record.id to create (name required); include a real record.id from finance_queryOverview.categories to rename/regroup. Check existing categories first to avoid duplicates.

FieldTypeDescription
record*object
record.idstring
record.namestringRequired when creating.
record.groupNamestringSection it appears under, e.g. 'Lifestyle'. Reuse an existing group name where possible.
record.kindone of income, expense, transferDefault 'expense'.
record.iconstring
record.colorstring
record.parentIdstringParent category ID for a sub-category.