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_findReturn 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_findSpending & 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.
| Field | Type | Description |
|---|---|---|
| from | string | Range start (defaults to ~6 months ago). |
| to | string | Range end (defaults to today). |
Transactiontransaction
One expense, income, or transfer on an account.
finance_queryTransactionsFindthrough vritto_findList transactions, optionally filtered by account and date range (newest first, paginated). Use to find or show specific transactions.
| Field | Type | Description |
|---|---|---|
| accountId | string | Filter to one account (ID from finance_queryOverview). |
| tripId | string | Filter to transactions attributed to one Trips-module trip. |
| from | string | Local date YYYY-MM-DD. |
| to | string | Local date YYYY-MM-DD. |
| limit | integer | |
| cursor | string | Opaque 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_updateCreate 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 }.
| Field | Type | Description |
|---|---|---|
| record* | object | |
| record.id | string | Existing transaction ID from finance_queryTransactions to update. Omit to create. |
| record.accountId | string | Account the transaction belongs to (from finance_queryOverview). Required when creating. |
| record.date | string | Transaction date (defaults to today). |
| record.type | one of expense, income, transfer | Default 'expense'. |
| record.amount | number | Positive magnitude; direction comes from type. Required when creating. |
| record.currency | string | |
| record.categoryId | string | Category ID from finance_queryOverview.categories. Omit to leave uncategorized (rules may fill it). |
| record.merchantName | string | e.g. 'Blue Bottle Coffee'. |
| record.payee | string | Person/organization paid or received from, when distinct from the merchant (e.g. a check to a landlord). |
| record.description | string | Bank-statement style description line. |
| record.status | one of cleared, pending | Default 'cleared'. Use 'pending' for transactions that haven't posted yet; reconciliation clears them. |
| record.notes | string | |
| record.transferAccountId | string | Required 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.splits | list of object | Split 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.tripId | string | Trip ID from the Trips module to attribute this spend to a trip. Only pass a real ID. |
| record.tags | list of string | Free-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_deleteDelete (archive) one transaction and reverse its balance effect. Resolve the ID with finance_queryTransactions first. Only for explicit removals.
| Field | Type | Description |
|---|---|---|
| transactionId* | string |
Finance Accountfinance_account
A bank, card, investment, loan, or cash account.
finance_upsertAccountCreate or Updatethrough vritto_create or vritto_updateCreate 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.
| Field | Type | Description |
|---|---|---|
| record* | object | |
| record.id | string | Existing account ID from finance_queryOverview to update. Omit to create. |
| record.name | string | Account name, e.g. 'Chase Checking'. Required when creating. |
| record.type | one of checking, savings, cash, investment, retirement, crypto, other_asset, credit_card, loan, mortgage, line_of_credit, other_liability | Account type (default 'checking'); determines asset vs liability. |
| record.balanceModel | one of ledger, valuation | 'ledger' tracks transactions; 'valuation' tracks a periodic balance snapshot (house, 401k). |
| record.currency | string | ISO-4217 code (default USD). |
| record.openingBalance | number | Starting balance for a ledger account. |
| record.openingDate | string | When the account was opened / the opening balance applies. |
| record.status | one of open, closed, hidden | Default 'open'. Set 'closed' when the user closes an account, closed accounts drop out of net worth. |
| record.creditLimit | number | Credit limit (credit cards / lines of credit). |
| record.interestApr | number | Interest rate / APR %. |
| record.statementDay | integer | Day of the month the statement closes, 1-31 (0 = unset). Liability accounts only. |
| record.paymentDueDay | integer | Day 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.autopayEnabled | boolean | Whether autopay is set up. Does not silence the reminder, it softens it into a 'make sure the funds are there' heads-up. |
| record.minimumPayment | number | Minimum payment due, shown in the reminder. |
| record.paymentReminderDays | integer | Days before the due day to remind (default 3; 0 turns the payment reminder off). |
| record.valuationHistory | list of object | Dated 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.balanceAsOf | string | Date the latest valuation/balance was taken. |
| record.includeInNetWorth | boolean | |
| record.institutionName | string | |
| record.notes | string |
Example input
{
"record": {
"name": "Chase Checking",
"type": "checking",
"balanceModel": "ledger",
"currency": "USD",
"openingBalance": 2400,
"openingDate": "2026-09-01"
}
}finance_reconcileAccountUpdatethrough vritto_updateReconcile 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.
| Field | Type | Description |
|---|---|---|
| accountId* | string | Account ID from finance_queryOverview. |
| realBalance* | number | The true current balance the user asserts. |
| asOf | string | Date the balance was checked (defaults to today). |
finance_deleteAccountDeletethrough vritto_deleteDelete (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.
| Field | Type | Description |
|---|---|---|
| accountId* | string |
Cardcard
A credit, debit, or prepaid card on an account.
finance_upsertCardCreate or Updatethrough vritto_create or vritto_updateCreate 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.
| Field | Type | Description |
|---|---|---|
| record* | object | |
| record.id | string | Existing card ID from finance_queryOverview.cards to update. Omit to create. |
| record.accountId | string | The 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.nickname | string | What the user calls it, e.g. 'Chase Sapphire'. |
| record.cardKind | one of credit, debit, prepaid | Default 'credit'. |
| record.network | one of visa, mastercard, amex, discover, other | |
| record.last4 | string | The LAST 4 DIGITS ONLY, exactly 4 digits, e.g. '4242'. Never accept, store, or ask for a full card number or CVV. |
| record.cardholderName | string | |
| record.expiryMonth | integer | Expiry month 1-12 (0 = unset). A card is valid through the END of this month. Must be set together with expiryYear. |
| record.expiryYear | integer | Four-digit expiry year, e.g. 2029 (0 = unset). Must be set together with expiryMonth. |
| record.status | one of active, expired, replaced, cancelled | Default 'active'. A past expiry reads as 'expired' automatically. |
| record.isPrimary | boolean | |
| record.expiryReminderDays | integer | Days before expiry to remind (default 45; 0 disables the reminder). |
| record.notes | string |
finance_deleteCardDeletethrough vritto_deleteDelete (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.
| Field | Type | Description |
|---|---|---|
| cardId* | string |
Budgetbudget
A month's budgeted amounts per category.
finance_queryBudgetFindthrough vritto_findA month's budget status: budgeted, spent (activity), and available per category, plus unbudgeted spending.
| Field | Type | Description |
|---|---|---|
| month | string | Defaults to the current month. |
finance_upsertBudgetUpdatethrough vritto_updateSet 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.
| Field | Type | Description |
|---|---|---|
| month* | string | Month 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_updateAdd 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' }.
| Field | Type | Description |
|---|---|---|
| record* | object | |
| record.id | string | |
| record.merchantName | string | |
| record.amount | number | |
| record.currency | string | |
| record.cadence | one of weekly, biweekly, monthly, quarterly, semiannual, yearly | |
| record.nextDate | string | Local date YYYY-MM-DD. |
| record.kind | one of bill, income, subscription, loan_payment, transfer | |
| record.categoryId | string | |
| record.accountId | string | |
| record.status | one of active, paused, ended | Default 'active'. Set 'paused' for 'pause my gym membership' and 'ended' when a bill stops for good. |
| record.reminderLeadDays | integer | Days before nextDate to remind. Default 3. |
| record.notes | string |
Example input
{
"record": {
"merchantName": "Rent",
"amount": 2150,
"currency": "USD",
"cadence": "monthly",
"nextDate": "2026-10-01",
"kind": "bill"
}
}finance_deleteRecurringDeletethrough vritto_deleteDelete (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.
| Field | Type | Description |
|---|---|---|
| recurringId* | string |
Spending Categoryfinance_category
A spending or income category.
finance_upsertCategoryCreate or Updatethrough vritto_create or vritto_updateCreate 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.
| Field | Type | Description |
|---|---|---|
| record* | object | |
| record.id | string | |
| record.name | string | Required when creating. |
| record.groupName | string | Section it appears under, e.g. 'Lifestyle'. Reuse an existing group name where possible. |
| record.kind | one of income, expense, transfer | Default 'expense'. |
| record.icon | string | |
| record.color | string | |
| record.parentId | string | Parent category ID for a sub-category. |