add_goal_contribution
ChatGPTPut money into one of the user's saving goals. Use it when the user says they are setting money aside for a goal they already have.
add_transaction
ChatGPTAdd a new financial transaction (income or expense) for the user. Use this when the user says things like 'I spent...', 'I earned...', 'I paid...', 'Add expense...', etc. accountId is optional — uses the default account if not provided. For 5 or more transactions use add_transactions instead (a loop of this tool is slow, burns rate limit and gives the user no chance to review); this tool does not create accounts or categories. The result includes viewUrl — after summarising what was written, show it to the user as a link labelled "View in ZeniFlow" (in the user's language).
add_transactions
ChatGPTCreate multiple transactions in one call, on accounts and categories the user already has — required when adding 5 or more. It never creates accounts or categories: an unknown category rejects the whole batch, so call create_category first and try again. You must send declaredCount and declaredTotal (income positive, expense negative); if they do not match the rows you sent, nothing is written — that check protects the user from a truncated or invented list. The result includes viewUrl — after summarising what was written, show it to the user as a link labelled "View in ZeniFlow" (in the user's language).
create_category
ChatGPTCreate a spending or income category, but only after checking whether one already exists. If a category with the same name already exists it is returned instead of creating a duplicate. Call this when add_transactions rejects a batch because a category is missing. To create a sub-category, pass parentId: the id of a top-level category from get_categories (one whose parentId is null). A sub-category always takes its parent's categoryType, and only two levels exist — a sub-category cannot have children.
create_transfer
ChatGPTMove money between two of the user's own accounts as a proper double-entry transfer. Never do this with two separate add_transaction calls — that produces two unlinked records and wrong reports. The result includes viewUrl — after summarising what was written, show it to the user as a link labelled "View in ZeniFlow" (in the user's language).
delete_transaction
ChatGPTDelete a transaction by its ID. This is destructive — only call it after the user has explicitly confirmed they want that specific transaction removed, and pass confirm=true.
get_account_summary
ChatGPTGet the total balance summary across all accounts (assets, liabilities, net worth). Use when the user asks 'How much money do I have?', 'What's my total balance?', 'Net worth?', etc.
get_accounts
ChatGPTGet all accounts of the user. Use when the user asks 'What accounts do I have?', 'Show my accounts', 'List my accounts', etc.
get_budgets
ChatGPTRead the user's budgets with how much has been spent against each one. Call this whenever the user asks what they have left to spend, whether they are over budget, or how a category is tracking this month. Pass budgetId for one budget's detail; omit it for a summary of all active budgets.
get_categories
ChatGPTGet all available transaction categories (income, expense, debt, loan, etc.). Use this to find the correct categoryId before adding a transaction. Always call this first when adding a transaction and the user hasn't specified a category ID.
get_category_breakdown
ChatGPTTotals grouped by category for a period. Use this instead of fetching all transactions and adding them up yourself — it is faster, cheaper, and matches what the app shows the user.
get_current_user
ChatGPTWho the assistant is connected as: the ZeniFlow account (email, name) and which assistant app holds this connection. Call it when the user asks which account they are connected with, and before a large write if they seem unsure which book you are writing into. It never returns balances or transactions.
get_debts
ChatGPTMoney the user owes and money owed to them, grouped by person. This returns names of other people — treat it as sensitive and only surface what the user asked for. Pass contactId for one person's full history.
get_financial_summary
ChatGPTGet a comprehensive financial summary including total income, expenses, balance, breakdown by account/currency/category. Use when the user asks for an overview of their finances.
get_monthly_report
ChatGPTGet a detailed monthly financial report with daily breakdown. Use when user asks about a specific month's finances, e.g. 'How was my spending in January?'
get_saving_goals
ChatGPTThe user's saving goals with progress toward each target. Pass goalId for one goal's contribution history.
get_spending_trend
ChatGPTSpending and income over time, aggregated by the server. Use this for 'how has my spending changed', 'am I spending more than last month', or any question about direction over a period.
get_subscriptions
ChatGPTThe user's recurring subscriptions and what they cost. Pass upcomingDays to get only the ones charging within that many days — use it for 'what is coming out of my account soon'.
get_transaction_stats
ChatGPTGet financial statistics summary: total income, total expense, balance. Use when the user asks 'How much have I spent?', 'What's my balance?', 'Summary of this month', etc.
get_transactions
ChatGPTGet a list of transactions for the user. Supports filtering by account, date range, category, etc. Use when the user asks about their spending history, recent transactions, etc.
get_yearly_report
ChatGPTA full year of income, expense, and net by month. Use it for year-in-review questions or comparing months across a year.
update_transaction
ChatGPTChange an existing transaction's amount, category, date, or note. Use this to fix a mistake instead of deleting and re-adding — deleting loses the transaction's ID and any debt-tracking link attached to it. The result includes viewUrl — after summarising what was written, show it to the user as a link labelled "View in ZeniFlow" (in the user's language).