- Brand
- Fold
- Category
- Finance
- Primary Subcategory
- Personal Finance & Budgeting Aggregators
Integration details
Description
Fold helps users securely review their own transactions, accounts, investments, recurring expenses, credit profile, and savings through ChatGPT.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Personal Finance & Budgeting Aggregators
- Secondary Subcategories
- None listed
- Brand
- Fold
- Access
- Account required
- First tracked
- 2026-07-07
- Tool count
- 39
- Market
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Agent DiscoverabilityChatGPT Discoverability ScoreUpdated dailyThe first to track the ChatGPT, Claude, Muse, Grok & Google ecosystems, with the largest database on the core platforms. Tracked daily since .
0/100
Invisible#38of 86
in Personal Finance & Budgeting Aggregators- Picked
- 0.0/100
- Found
- 0.0/100
- Positioned
- –/100
Get alerts for Fold
Get updates when Fold’s Discoverability Score or category rank changes.
Competing in ChatGPT Personal Finance & Budgeting Aggregators
View Category39 tools agents can invoke
Adds transactions to ONE of the calling user's transaction groups. Inputs (both required): group_id (the group's UUID — must be a group the user is a member of; find it via list_groups), transaction_ids (1-50 transaction UUIDs — find them via list_transactions). Fails with a clear error when the group does not exist / the user is not a member, or when any transaction is hidden (the whole batch is rejected — nothing is added). Transactions already in the group are skipped silently, so re-sending the same call is safe (idempotent). Response: the updated group summary (same shape as one list_groups row) with the incoming/outgoing counts and amounts recomputed after the insert. This tool WRITES to the user's data — call it only when the user explicitly asks to add transactions to a group.
Adds a custom entry — an asset or liability the user tracks by hand in the Fold app (a flat, a car, gold, money lent out, a loan from family). WRITES to the user's data, so confirm with the user before calling unless they have clearly already asked for this exact entry. Inputs: name, type, kind and current_value (all required), and optionally ownership_percentage (default 100), net_worth_enabled (default true), notes and opening_date. kind is 'ASSET' or 'LIABILITY' and is PERMANENT — it cannot be changed afterwards, so get it right: LOANS can be either — 'ASSET' for money the user lent to someone (owed TO them), 'LIABILITY' for a loan they took (owed BY them). current_value is the entry's FULL value in INR and is never negative: enter a liability as a POSITIVE amount (₹2L owed is 200000, kind 'LIABILITY'). When the user owns only part of it, pass the whole value plus ownership_percentage (a ₹1 crore flat owned 50-50 is current_value 10000000, ownership_percentage 50); net worth counts current_value × ownership_percentage / 100. opening_date backdates the opening value — when that value was true, e.g. the purchase date; YYYY-MM-DD is the start of that day in the user's timezone, YYYY-MM-DDTHH:MM[:SS] is read in the user's timezone, and an RFC 3339 timestamp with an offset is taken as given. It defaults to now and cannot be in the future. Each plan allows a limited number of custom entries; at the limit the call fails with the counts and nothing is written. NOT IDEMPOTENT: calling twice creates TWO entries. If a call comes back unclear — a timeout, an error you cannot read — do NOT retry it; check list_custom_entries for whether it already landed. Output: entry_id and entry (same shape as list_custom_entries). To undo, call delete_custom_entry on entry_id.
Creates a NEW transaction group for the calling user — a user-named collection of transactions such as "Goa trip", "Wedding" or "Flat expenses", the same groups list_groups returns and the Fold app shows — optionally seeding it with transactions. The user owns the new group and is its only member. Distinct from refund groups (list_refund_groups), which this tool does not create. WRITES to the user's data, so confirm with the user before calling unless they have clearly already asked for this exact group. Inputs: name (required; 1-255 characters, leading/trailing whitespace trimmed) and transaction_ids (optional; up to 50 transaction UUIDs from list_transactions, duplicates collapsed; omit to create an empty group). Call list_groups FIRST: group names are not unique, so a name the user already has creates a second, separate group with the same name. To put transactions into a group that already exists, use add_transactions_to_group instead. Rejected, with nothing created, when the name is blank or too long, when any transaction is hidden, or when any transaction id does not exist. NOT IDEMPOTENT: each successful call creates a new group. Never retry after an error or an unclear result (a timeout, an error you cannot read) without first checking list_groups for the group. Output: group_id (the new group's UUID, always set on success — pass it to add_transactions_to_group to add more, or to list_transactions as group_ids to see what is inside) and group (the new group's summary, same shape as one list_groups row, with the incoming/outgoing counts and amounts of the transactions it was seeded with). group is null only when the group was created but reading it back failed — the group still exists under group_id, so treat that as a failed READ, never a failed create, and do not call this tool again.
Adds a transaction to the calling user's Cash on hand — the manual cash ledger in the Fold app, for spends and receipts that never touch a bank account or card. WRITES to the user's data, so confirm with the user before calling unless they have clearly already asked for this exact transaction. Inputs: account (required; must be 'cash_on_hand'), amount (required; greater than 0 and less than 1,000,000,000, always positive), type (required; 'debit' for cash going out, 'credit' for cash coming in), date (required), category_id (required, from list_categories — its `type` must cover the direction: OUTGOING for a debit, INCOMING for a credit), and optionally subcategory_id (from list_categories, under that category), notes, excluded_from_cash_flow and account_in. A merchant is required, given EXACTLY one way. Call find_merchant_to_tag FIRST and pass the result's id and type back unchanged as merchant_id + merchant_type. Use create_new_merchant (a plain canonical name, e.g. "Chai Point", not "chai with Ravi") ONLY when nothing there fits: it creates a merchant that appears in the user's merchant picker from then on (or reuses their own one of that name), so tell the user when merchant_resolution.outcome is "created". create_new_merchant is rejected when the name is already one of Fold's catalog merchants — the error names that merchant's id and type; pass those as merchant_id + merchant_type instead. date: YYYY-MM-DD or YYYY-MM-DDTHH:MM[:SS] are read in the USER's timezone; an RFC 3339 timestamp with an offset is taken as given. A bare date is recorded at the current time of day on that date (so today means now). account_in works as on update_transaction: it may move the transaction into the month before or after the month of date, no further. Rejected (nothing is written) for: a future date; a date more than 2 years before the user joined Fold; an account other than 'cash_on_hand'; a category in the wrong direction, one the user's plan does not include, or a subcategory that is not under it; an account_in outside the one-month window; both or neither merchant inputs. NOT IDEMPOTENT: calling twice creates TWO transactions. If a call comes back unclear — a timeout, an error you cannot read — do NOT retry it; check with list_transactions sources=['manual'] whether it already landed. Side effects: the Cash on hand balance changes by the amount (down for a debit, up for a credit) — unless the date is before the user set Cash on hand up (see counts_toward_balance). Filing under the self-transfer category always excludes the transaction from cash flow, as the app does, overriding excluded_from_cash_flow=false. Output: transaction_id (always set on success), transaction (same shape as list_transactions; null only if the create succeeded but reading it back failed — treat that as a failed READ, never a failed create), merchant_resolution ({outcome: 'picked' | 'created' | 'reused', id, name, type}), cash_on_hand ({balance, is_set_up} after the write), and counts_toward_balance. counts_toward_balance=false means the date is before the user set up Cash on hand, so the balance did not change; tell the user. To undo, call delete_transaction on transaction_id.
Permanently DELETES one of the calling user's custom entries (user-added assets and liabilities — see list_custom_entries) together with its whole value history. WRITES to the user's data and cannot be reversed as such, so confirm with the user before calling unless they have clearly already asked to delete this exact entry. Input: entry_id (required; from list_custom_entries). An id that is not the user's is rejected as not found. An entry with documents attached (document_count > 0) is REFUSED — documents can only be removed in the Fold app, so ask the user to delete that entry there. NOT IDEMPOTENT: once deleted, calling again with the same id fails with not found. Never retry blindly on an unclear result — check list_custom_entries first. Output: deleted_entry_id, undo ({name, type, kind, current_value, ownership_percentage, net_worth_enabled, notes, opening_date} — the shape create_custom_entry takes), history_points_deleted, and note. Passing undo to create_custom_entry recreates the entry under a NEW entry_id with its latest value as the opening value at the original opening_date; any intermediate value changes (history_points_deleted − 1 of them) cannot be restored, so its past net-worth history reads as flat. Tell the user this before deleting an entry with more than one history point.
Permanently DELETES one of the calling user's Cash on hand transactions — one added by hand to the manual cash ledger (source 'manual'). WRITES to the user's data and cannot be reversed as such, so confirm with the user before calling unless they have clearly already asked to delete this exact transaction. Input: transaction_id (required; a UUID from list_transactions or get_transaction). Only Cash on hand transactions can be deleted: a bank or credit-card transaction is rejected (those come from the user's accounts), and so is a split CHILD — merge it back with merge_split instead. An id that is not the user's is rejected as not found. What is lost: the row and anything attached to it, including receipts, which are gone for good. The response's `undo` carries the transaction's fields in the shape create_transaction takes — passing them back recreates it, but under a NEW id. Transaction-group membership can then be restored with add_transactions_to_group using unlinked.group_ids. Refund-group and recurring-expense links CANNOT be restored through these tools, so before deleting a transaction that has them, WARN the user — check get_transaction / list_transactions for refund_group_id and group_ids first. NOT IDEMPOTENT: once deleted, calling again with the same id fails with not found. Never retry blindly on an unclear result — check with list_transactions sources=['manual'] first. Side effects: the Cash on hand balance changes back by the amount, and any refund group the transaction was in is recalculated. Output: deleted_transaction_id, undo ({account, amount, type, date (RFC 3339), category_id, subcategory_id, merchant_id, merchant_type, notes, excluded_from_cash_flow, account_in} — merchant_id / merchant_type are null when the transaction had no merchant, and category_id is null when it had no category; create_transaction requires both, so pick them afresh — find_merchant_to_tag for the merchant, list_categories for the category — before replaying), unlinked ({group_ids[], refund_group_id, recurring_cycle_ids[]} — the links the transaction had), cash_on_hand ({balance, is_set_up} after the delete), and counts_toward_balance. counts_toward_balance=false means the deleted transaction did not count toward the balance (typically because it was dated before the user set up Cash on hand), so the balance is unchanged; tell the user. Recreating from undo follows create_transaction's rules, so it is not always an exact copy: a self-transfer is always recreated excluded from cash flow (the app's create rule), even if the user had since included it; and an old merchant stored as type 'f1' is recreated as a copy in the user's own merchants.
Finds merchants the calling user could file a transaction under, so you can pick a specific one and pass it to update_transaction. Same candidate list the merchant picker in the Fold app shows. THIS DOES NOT SEARCH THE USER'S TRANSACTIONS OR THEIR SPENDING. For 'how much did I spend at X' use list_transactions or get_spending_summary — this tool returns merchant records and knows nothing about their money. Inputs: query (required) — the merchant name to look for, matched as a substring; near (optional) — the area to look in, in the user's own words ('Koramangala, Bangalore'). Only pass near when the user has actually said WHERE the place is; it affects map results only. Output: count, places_searched, and merchants[] ({id, name, type, address}), best-tier first. type is one of 'custom' (a merchant this user created), 'generic' (a KIND of counterparty — Cafe, Autorickshaw, Myself), 'fold' (a brand in Fold's catalog, which carries a logo and a default category), 'f1' (a merchant seen on this user's own transactions), or 'external' (a place on the map). Results are ordered by tier, NOT by relevance: the user's own merchants come first, then Fold's catalog, then merchants derived from their transactions. Prefer the earliest plausible match — a 'fold' brand is a better tag than a look-alike the user happens to have. To use a result, pass its id AND type back to update_transaction as merchant_id and merchant_type, unchanged. The two belong together: for an 'external' merchant the id is a map place id rather than a Fold record id, so neither field means anything without the other. address is null except on 'external' results, where it is what tells two outlets of the same brand apart. Map results come LAST and only fill what the tiers above left empty, so a 'fold' brand always outranks a look-alike shop on the map. A text search for a big brand will return some office or franchise — prefer the catalog entry. places_searched=false means map results were not included at all (no maps key configured), so a shop the user has never tagged before will be missing — say so rather than concluding it does not exist. Read-only.
Returns the calling user's Cash on hand — the manual cash ledger in the Fold app. No inputs. Output: balance (the Cash on hand balance the app shows), is_set_up, opening_balance and opened_at (RFC 3339; both null until the user sets Cash on hand up), and currency ('INR'). Before setup, balance is the plain sum of every Cash on hand transaction (credits minus debits); after setup it is the opening balance plus the transactions since opened_at. Setting Cash on hand up — entering the opening balance — is done by the user in the app, not through these tools. Net worth counts Cash on hand only after setup, so get_net_worth shows a cash_on_hand of 0 for a user who has not set it up even when this balance is not 0. To see the individual transactions, use list_transactions with sources=['manual']. Read-only.
Returns the user's credit-bureau snapshot. A user can connect more than one bureau (Equifax and CIBIL today), so `bureaus` carries ONE ENTRY PER CONNECTED BUREAU — each with that bureau's score, indicator band (Poor/Fair/Good/Excellent), point change vs its own previous report, rank copy, last/next refresh dates, high/medium/low-impact factor breakdown (payment history, credit utilization, credit history, credit mix, recent inquiries, disputes), monthly score history, and AI-generated headline summary. Inputs: include_factors, include_history, include_accounts_summary (all bool, default true; send false to skip an expensive section). Bureaus score the same borrower off their own separate reports, so different scores across entries is NORMAL and is not a data error — report them separately, never average or sum them. `connected_bureaus` lists the bureau names present. The bureau-scoped keys at the TOP level (score, bureau, indicator, rank_copy, point_change, refreshed_at, next_refresh_at, factors, history, summary) repeat the PRIMARY bureau's entry — the sole connected bureau, or Equifax when several are connected. They duplicate one entry in `bureaus`; they are never an aggregate. When the user has more than one bureau connected, say which bureau a score belongs to rather than presenting the top-level score as their only one. accounts_summary is the per-loan-group accounts rollup (credit cards / home loans / personal loans / auto loans / education loans / business loans / other) with totals + active/closed splits + sanctioned limit + oldest-account age. It covers ONE bureau only — the one named in accounts_summary_bureau, which matches the primary bureau. The same real-world account is reported separately by each bureau, so this rollup is never summed across bureaus, and it may describe a different bureau than a score the user asks about — name the bureau when quoting it. When the user has NOT connected a credit bureau the response carries connected=false and every other field at its zero value (score=0, indicator/bureau/rank_copy empty, refreshed_at/next_refresh_at null, factors/summary/accounts_summary_bureau null, bureaus/connected_bureaus/history/accounts_summary empty) — branch on connected before reading score. No personal details (no name, DOB, PAN, addresses, phone, occupation, income) are surfaced. Use when the user asks 'what's my credit score', 'what's my CIBIL score', 'what's my Equifax score', 'how did my credit score change', 'why is my credit score low', 'what's hurting my credit score', or any credit-bureau question. Read-only.
Fetches one of the calling user's custom entries (user-added assets and liabilities — see list_custom_entries) with its value history. Input: entry_id (required; from list_custom_entries). Output: entry (same shape as a list_custom_entries row) and history[] ({recorded_at, current_value, ownership_percentage, type}, oldest first). The first point is the opening value at opening_date; every later point is a change to the value, ownership or type, dated when it was made. Net worth history carries each entry's last recorded value forward day by day. Attached documents are counted (entry.document_count) but cannot be opened through these tools. An unknown entry_id is an error. Read-only.
Returns the calling user's Employee Provident Fund (EPF / PF / Employee Provident Fund) snapshot — total balance with per-share split (employee + employer + pension), the most recently declared EPF interest rate and the financial year it applies to, last/next refresh dates, the per-employer service history (joining/exit dates, tenure, masked member id), the per-(employer, financial year) yearly breakdown (opening/closing balances, contributions, withdrawals, interest credited), and an opt-in tail of the 50 most-recent passbook transactions. Inputs: include_employers, include_yearly_breakdown (both bool, default true), include_recent_transactions (bool, default false — opt in when the user asks about specific contributions / withdrawals). Output is always a single snapshot. When the user has NOT connected an EPF account the response carries connected=false and every other field at its zero value (total_balance/shares/rate=0, financial_year empty, refreshed_at/next_refresh_at null, all arrays empty; currency is always "INR") — branch on connected before reading total_balance. No personal details are surfaced (no UAN, name, phone, Aadhaar, PAN, DOB, gender, email, bank account, IFSC, verification timestamps). EPF member IDs are masked to the last 4 characters. Use when the user asks 'what's in my EPF', 'how much PF do I have', 'show my Provident Fund', 'what's the EPF interest rate', 'how long did I work at X', 'how much was credited to EPF last year', or any EPF/PF question. For net-worth aggregates that include EPF alongside other assets, use get_net_worth. Read-only.
Returns mutual fund portfolio insights: market-cap split (large/mid/small/other), asset allocation (equity/debt/other), top sectors, and top securities. Useful for analyzing diversification and concentration.
Returns a one-shot summary of the calling user's mutual fund portfolio: total invested, total current value, gain/loss, gain/loss percentage, holdings count, and a per-asset-category breakdown.
Returns the user's current net worth as a single snapshot — headline total, per-class breakdown across all 12 asset / liability classes, and a liquid / investments / other / debt rollup. Use when the user asks 'what is my net worth', 'how much am I worth', 'what are my total assets', 'what's my total debt', or any cross-asset aggregate. Output: total (assets − liabilities), currency, as_of (latest refresh timestamp across included rows; falls back to snapshot generation time when no included row carries a refresh stamp), assets[] and liabilities[] (each row has class, amount as a positive magnitude, class_enabled, included_accounts, excluded_accounts), and a groups rollup (liquid = bank + cash_on_hand; investments = fixed_deposits + mutual_funds + holdings + nps + epf + ppf; other = manual_assets; debt = credit_card_debt + loans + manual_liabilities; liquid + investments + other − debt = total). Asset classes: bank, fixed_deposits, mutual_funds, holdings, ppf, nps, epf, cash_on_hand, manual_assets. Liability classes: credit_card_debt, loans, manual_liabilities. manual_assets / manual_liabilities are the user's manual instruments (called 'custom entries' in the app) — values they typed in themselves (a flat, a car, gold, money lent out, a loan from family). Each entry is an asset or a liability by the kind the user chose, regardless of its type (a 'Loan'-type entry can be money owed TO the user), and counts current_value × ownership %. Their display_name is the entry's name with its type, e.g. 'Flat in Pune (Property)'. For each entry's full value, ownership share and value history, use list_custom_entries / get_custom_entry. Account inclusion follows the user's net-worth settings — both the class-level toggle (users.net_worth.<class>_enabled; one manual_instruments_enabled toggle covers both manual classes) and the per-account toggle (for bank, credit_card_debt, fixed_deposits, loans, manual_assets, manual_liabilities). Each entry in included_accounts and excluded_accounts carries a server-formatted display_name (e.g. 'HDFC Bank Account ••1234', 'Axis Magnus ••5678', 'ICICI Home Loan ••9999') the AI should echo verbatim, plus issuer / nickname / last_four for custom phrasing. Excluded rows surface with reason 'user_excluded' (user toggled this account off), 'class_disabled' (the whole class is off), or 'parent_excluded' (addon child card following its excluded parent card), so the AI can answer 'why isn't X in my net worth?' and 'what would it be if I re-enabled Y?'. Addon (child) credit cards follow their parent card's toggle as a group: when included they carry included_via_parent (the parent's account_id) and contribute no amount of their own — the parent row carries the whole family's debt. Mutual funds, holdings (stocks), nps, epf, ppf, cash_on_hand have no per-account flag — included_accounts and excluded_accounts are always empty for those classes. Net worth change over time will be a separate tool — this one returns a snapshot only. Read-only.
Returns the user's net worth over a resolved time window — an aggregated daily total series, a per-class start/end change rollup (with per-account include/exclude rosters for the six classes that carry per-account toggles), and an opt-in per-class daily series. Use when the user asks 'how is my net worth trending', 'how much did I grow this year', 'why is my net worth down', 'which class drove the change', or any net-worth-over-time question. Inputs: range ('3m' default, '6m', '1y', or 'custom'), start_date/end_date (YYYY-MM-DD, required only when range='custom'), include_per_class_graph_data (default false). Range '3m' / '6m' / '1y' resolve against today (UTC). The server hard-caps any requested window at ~1 year — a custom range wider than 1 year is REJECTED with a clear error (not silently clamped) so you know to ask for a tighter window. Output: range (the resolved value), start_date / end_date (the resolved bounds), currency ('INR'), summary { start_total, end_total, change_value, change_percent, per_class[] }, graph_data[] (aggregated daily total series, always emitted), per_class_graph_data[] (per-class daily series; ALWAYS emitted as an array — empty when include_per_class_graph_data=false; when true, one row per class in a stable order). summary.change_percent is a fractional ratio (0.12 == 12 %), NOT a 0-100 figure; same for per-class change_percent. ChangePercent is 0 when start is 0 (we never surface infinity/NaN). Per-class rows cover all 12 classes (bank, fixed_deposits, mutual_funds, holdings, ppf, nps, epf, cash_on_hand, manual_assets, credit_card_debt, loans, manual_liabilities). Each row carries class, class_enabled, start, end, change_value, change_percent, included_accounts, excluded_accounts. manual_assets / manual_liabilities are the user's manual instruments (called 'custom entries' in the app) — values they typed in themselves (a flat, a car, gold, money lent out, a loan from family); each entry is an asset or a liability by the kind the user chose, regardless of its type, and its value is current_value × ownership %. Each entry's last recorded value carries forward day by day; get_custom_entry returns one entry's own history points. For liability classes (credit_card_debt, loans, manual_liabilities), start/end and the per-class graph values are reported as POSITIVE magnitudes (the AI sees '₹50k owed' not '-₹50k'). They still SUBTRACT from the aggregated graph_data totals — graph_data is sign-preserving net worth, summary.per_class is sign-flipped for readability. Account inclusion follows the same rules as get_net_worth: the class-level toggle (users.net_worth.<class>_enabled; one manual_instruments_enabled toggle covers both manual classes) AND the per-account toggle for bank / credit_card_debt / fixed_deposits / loans / manual_assets / manual_liabilities. Excluded reasons are 'user_excluded' (per-account toggle off), 'class_disabled' (class flag off), 'pending_connection' (bank account still in first sync), or 'parent_excluded' (addon child card following its excluded parent). Addon (child) credit cards follow their parent card's toggle as a group: when included they carry included_via_parent (the parent's account_id) and contribute no amount of their own — the parent row carries the whole family's debt. The other six classes (mutual_funds, holdings, ppf, nps, epf, cash_on_hand) have no per-account toggle — included_accounts and excluded_accounts are always empty for those classes. For the CURRENT snapshot (today's headline number + breakdown), use get_net_worth — this tool returns history; get_net_worth returns the current state. Read-only.
Returns the calling user's NPS (National Pension System / pension scheme) snapshot — total value across accounts, per-account totals + per-tier rollup (Tier 1 retirement pot + Tier 2 voluntary), and (opt-in) per-scheme list + per-asset-class allocation breakdown. Inputs: include_schemes, include_allocation (both bool, default true; send false to skip an expensive section). Output: connected, total_value (sum of Tier 1 + Tier 2 across all accounts), currency ("INR"), accounts[] (always present — most users have 1 NPS account but the shape supports N). Each account carries masked_pran (masked PRAN — full PRAN is never surfaced), account_status (lowercase "active" or "consent_revoked"), last_fetched_at, total_value, tier_1 / tier_2 (each with current_value, holdings_count, allocation_type lowercase "auto" / "manual" / "" when no tier row), schemes (object with tier_1[] / tier_2[] arrays of {scheme_name, scheme_code, manager_name, asset_class lowercase "equity"/"corporate"/"government"/"alternative", units, nav, current_value, allocation_pct, returns_one_year_pct / returns_five_year_pct nullable; null when include_schemes=false), allocation (object with tier_1[] / tier_2[] arrays of {asset_class, allocation_pct normalised to 100 per tier, current_value, value-weighted returns_one_year_pct / returns_five_year_pct nullable}; null when include_allocation=false). Each tier's allocation always carries 4 rows (equity, corporate, government, alternative) — empty tiers project to 0% across all 4. Performance is NAV-based (no XIRR/CAGR), matching what the iOS app renders. On the not-connected path: connected=false, total_value=0, accounts=[] — branch on connected before iterating accounts. No personal details are surfaced (no PRAN beyond masked, no holder name, DOB, PAN, email, address, mobile, nominee or KYC status). Use when the user asks 'what's in my NPS', 'how much pension do I have', 'show my National Pension System', 'what's my NPS allocation', 'how is my Tier 1 / Tier 2 doing', or any NPS / pension question. For net-worth aggregates that include NPS alongside other assets, use get_net_worth. Read-only.
Returns the calling user's PPF (Public Provident Fund / 15-year tax-saving deposit) snapshot — provider, masked account number, opening and current balance, the PPF interest rate in effect today, account age, maturity date / days-to-maturity, current-FY contributions / withdrawals / interest credited, the lifetime-most-recent contribution and interest-credit dates, and (opt-in) the recent transactions tail. Inputs: include_recent_transactions (bool, default false — opt in when the user asks about specific contributions / withdrawals). Output is always a single snapshot — schema enforces one PPF account per user. When the user has NOT recorded a PPF account the response carries connected=false and every other field at its zero value (balances/rate=0, dates zero, masked_account_number/last_*/balance_updated_at null, provider_name/account_status/current_fy_label empty, recent_transactions=[]; currency is always "INR") — branch on connected before reading current_balance. MaturityDate is opened_on + 15 years. PPF accounts can be extended in 5-year blocks past maturity (the user files a Form H) — extension blocks are NOT modelled in the schema, so AI consumers asking about extensions should treat maturity_date as the FIRST maturity date. account_status is the lowercase wire value: "active" (open) or "archived" (user archived but didn't delete). DELETED rows are never surfaced. masked_account_number is "••" + last 4 (e.g. "••1234") when the user entered an account number; null otherwise. No PAN, DOB, holder name, address or other PII is exposed. Use when the user asks 'what's in my PPF', 'how much have I contributed to PPF this year', 'when does my PPF mature', 'how much PPF interest did I get', 'what's the current PPF rate', or any PPF question. For net-worth aggregates that include PPF alongside other assets, use get_net_worth. Read-only.
Summarise the calling user's spending for one calendar month (or full year, if month is omitted) — the same numbers iOS shows on the home-tab Spending Summary widget. Inputs: month (1-12, optional), year (optional; both default to the current month/year in the user's timezone), include_icon_breakdown (default false). Account inclusion follows the user's spending-summary widget settings; excluded accounts are listed in the response. Each excluded_accounts row carries account_id, account_type, reason, name, last4, is_closed, closed_at and track_from. When explaining an exclusion, say a card or account is CLOSED when is_closed is true (with closed_at) — never describe a closed card only as 'excluded by settings'. Spending before an account's track_from date (see also list_bank_accounts) is untracked by the user's choice, not zero spend; mention the cutoff when it bears on the period asked about. Output: total_amount, categories (each with category_id, category_name, amount, percentage_of_total, transaction_count, and — when include_icon_breakdown=true — an icons[] drill-down), untagged + no_merchant buckets (each with amount, percentage_of_total, transaction_count; null on a zero-spend period), and the included_account_ids / excluded_accounts inventory so the AI can explain which accounts were considered. Percentages are ratios in [0, 1], NOT 0-100. Read-only.
Returns a one-shot summary of the calling user's stocks and ETF portfolio: total current value, ETF value, equity value, total shares, total holdings, and number of demat accounts. Read-only.
Returns the user's total bank balance — the sum of balances across their primary bank accounts. Use when the user asks 'what's my total balance', 'how much money do I have in bank', 'how much across all my accounts', or similar aggregate-bank-balance questions. Output: total (the headline number), currency, as_of (most-recent refresh timestamp among included accounts; null when none included), included_accounts (id, bank_name, balance for each account that contributed), and excluded_accounts (id, bank_name, balance, reason for each excluded account — letting the AI explain 'why isn't X in the total' or 'what would it be if I included Y'). Reason is one of: "user_excluded" (user opted this account out via the app), "passively_tracked" (account is not actively managed and lives in the other-accounts surface), "pending_connection" (first data sync hasn't completed; balance is null). For per-account questions ('what's my HDFC balance'), use list_bank_accounts. For net worth or asset/liability questions, use get_net_worth. For credit card outstanding, use list_credit_cards. Read-only.
Fetch the full detail of one of the calling user's transactions by its id. The row has the same shape list_transactions returns. In particular `amount` is the ORIGINAL figure — not reduced by refunds, and still the full pre-split total on a split parent — while `effective_amount` (COALESCE of remaining_refund_amount, remaining_amount, amount) is the figure that counts towards spending; prefer it whenever the transaction has been refunded or split. `split_type`, `remaining_amount` and `parent_transaction_id` describe this transaction's place in a split, if any. Returns found=false when no such transaction belongs to the user.
Returns the user's connected bank accounts with per-account current balance. One row per account. Fields per row: id, bank_name, nickname (nullable, user-set label), masked_number, holder_name (nullable), account_type (nullable; e.g. SAVINGS, CURRENT), balance (current balance; null while the account is still connecting), currency, is_secondary (true for accounts the user connected via a different phone number — still their own money), is_pending_connection (true while the first data sync hasn't completed; balance is null in that state), tracking ("ACTIVELY" for a primary account; "PASSIVELY" or "PASSIVELY_WITH_TRANSACTIONS" for an account the user keeps but doesn't actively manage), last_refreshed_at, is_closed + closed_at (null when open or unknown), and track_from (YYYY-MM-DD or null). track_from is a data cutoff the user chose: transactions before that date are not tracked anywhere in Fold, so a period before it means no data, NOT zero activity. USE THIS for per-account questions: 'what bank accounts do I have', 'what's my X balance', 'any accounts still connecting', 'when was my Y last refreshed'. DO NOT USE THIS for cross-account aggregations. For 'total balance', 'net worth', 'cashflow', or any sum across accounts, use the dedicated aggregation tools — those apply per-account include/exclude rules that this tool ignores. For credit cards, use list_credit_cards. Read-only.
Lists Fold's category catalog — the tags a transaction can be filed under — with each category's subcategories (called icons in the app) nested underneath. Call it to find the category id to pass to a transaction update. The catalog is GLOBAL: these are Fold's categories, not ones the user created, and there is nothing to create or rename here. No inputs. Output: count and categories[] ({id, name, type[], subcategories[] ({id, name})}), ordered by category name. type lists the transaction directions the category may be applied to — 'INCOMING', 'OUTGOING', or both — and is enforced on write: filing a credit under an OUTGOING-only category is rejected. Category NAMES ARE NOT UNIQUE — 'Return' exists twice, once per direction — so always pass the id, never the name. subcategories is always present and may be empty. Categories the caller's plan does not include are omitted, so every id returned here is one the update path will accept. Read-only.
Lists the user's credit cards with current billing-cycle details: outstanding amount, minimum payment, payment due date, available credit, and whether the previous cycle is paid. Cards may be linked as an addon family (see `relationship`: role PARENT with child_account_ids, or role CHILD with parent_account_id). An addon family shares one statement: the PARENT card's `outstanding` carries the whole family's dues and CHILD cards report 0 — never add a child's cycle totals on top of its parent's. A CHILD card's reconciled cycle `total_amount_due` is the family's combined bill (not child-specific); only its unreconciled `amount_spent_this_cycle` is the child's own spend. Bills are paid on the parent card only. `holder_name` is the cardholder name as the issuer printed it on the parsed statement; null when no name is on record. Closed cards are listed after the open ones with is_closed true and closed_at; their current_cycle, previous_cycle and outstanding are null. They are history only (e.g. to resolve an account_id seen on an older transaction): refer to them as closed and never give bill, due-date or payment guidance for them. Use this for any question about CC bills or due dates. Read-only.
Lists the calling user's custom entries — assets and liabilities they added to Fold by hand because no bank or account feed covers them: a flat or a plot, a car, gold, a stake in a business, crypto, collectables, money lent to a friend, a loan taken from family. No inputs. Each entry carries entry_id, name, type (PROPERTY, VEHICLE, INVESTMENTS, GOLD, RETIREMENT, BUSINESS, CRYPTO, COLLECTABLES, LOANS or OTHER), kind ('ASSET' or 'LIABILITY' — what decides whether it adds to or subtracts from net worth, regardless of type), current_value (the entry's FULL value), ownership_percentage (the user's share, 0-100), counted_value (current_value × ownership_percentage / 100, rounded to 2 decimals — the figure net worth counts), net_worth_enabled (this entry's own net-worth toggle), notes (null when none), document_count (documents attached in the app), opening_date (when the opening value was recorded; null only for old entries with no recorded history), created_at and updated_at (RFC 3339, in the user's timezone). Liabilities are stored as POSITIVE amounts — a ₹5L loan taken shows current_value 500000 with kind 'LIABILITY' — and are subtracted only when net worth is computed. The class-wide on/off switch for custom entries and their totals (manual_assets / manual_liabilities) live in get_net_worth and get_net_worth_history; an entry with net_worth_enabled=true still does not count when that class switch is off. For one entry's value history, use get_custom_entry. Ordered assets first, then by type, newest first. Read-only.
Lists the user's fixed deposits with a roll-up summary header (count, total principal, total maturity, total interest on maturity, principal-weighted average interest rate). One row per FD, sorted by maturity date (soonest first). Inputs: status ('active' default, 'archived', or 'all' — case-insensitive; DELETED rows are never returned), limit (1-200, default 100). Per-FD fields: account_id, institution_name, nickname (nullable, user-set label), masked_account_number (nullable), display_name (server-formatted human label like 'HDFC Bank Salary FD ••1234' the AI can echo verbatim), principal_amount, maturity_amount, interest_rate (annual %), interest_on_maturity, opening_date / maturity_date (YYYY-MM-DD), tenure (years/months/days), days_to_maturity (signed; negative when already matured), status ('active' or 'archived'), is_matured, auto_renews, account_type (lowercase, e.g. 'fixed' / 'recurring' / 'sweep'), interest_payout (nullable, lowercase), interest_computation (lowercase). The summary header aggregates the SAME row set returned in the body, so the totals always match the inventory. USE THIS for any FD question: 'what FDs do I have', 'when do my FDs mature', 'what's my total FD principal', 'do I have any archived FDs', 'how much interest will I earn from my FDs'. For net worth that rolls FDs in alongside other assets and honours per-account widget toggles, use get_net_worth. Personal/holder details (name, DOB, PAN, email, mobile, KYC status, IFSC, branch) are deliberately omitted. Read-only.
Lists the calling user's transaction groups — user-created collections of transactions (e.g. a trip, a home renovation, shared flat expenses) used to track project or shared spending. Input (optional): status ('ACTIVE' default, or 'ARCHIVED'; case-insensitive). Each row carries id, name, status, is_pinned, incoming_count / incoming_amount (credits), outgoing_count / outgoing_amount (debits), created_at, and transactions_updated_at (the group's latest-activity timestamp — the same value the app sorts the groups list by; rows are returned in that order, most recent first). The rollups are user-scoped: only transactions on accounts the user can see count, hidden transactions are excluded, and cash-flow-excluded transactions follow the group's own include-in-totals preference — the numbers match what the user sees in the Fold app. Response: groups[] and count (== len(groups)). To see what is inside a group, pass its id to list_transactions as group_ids. Read-only.
Lists the calling user's mutual fund holdings, one row per scheme (ISIN), with units, invested amount, current value, gain/loss, asset category, plan name, and risk profile. Supports an optional case-insensitive asset_category filter and a limit (1-100, default 100).
Lists the user's mutual fund transactions (buys/sells), with optional filtering by type and free-text search. Cursor-based pagination: the first call omits cursor; subsequent calls pass the next_cursor value from the previous response. next_cursor is nil when there are no more pages.
Lists the calling user's recurring expenses (subscriptions, bills, EMIs), sorted by upcoming due date. Filter by status (ACTIVE/ARCHIVED/STOPPED; default ACTIVE). Cursor-based pagination. Read-only.
Lists the calling user's refund groups — user-created links between one or more spends and the refunds / returns / reversals that offset them (a returned order, a cancelled booking, a reimbursed expense). One row per group, most recently updated first. Distinct from list_groups, which returns the user's transaction groups. Inputs: statuses (optional; any of 'ACTIVE', 'SETTLED', 'SURPLUS', case-insensitive; omit for all three). Per-group fields: id, name, status, net_amount, left_to_settle, transaction_count. net_amount is the stored settlement figure — the sum of the group's credits MINUS the sum of its debits — so it is NEGATIVE while part of a spend is still un-refunded, 0 once refunds exactly cover the spends, and positive when refunds exceeded them. status is derived from that sign: 'ACTIVE' (net_amount < 0, a refund is still outstanding), 'SETTLED' (0), 'SURPLUS' (> 0, refunded more than was spent). left_to_settle is max(0, -net_amount) — the un-refunded remainder as a POSITIVE figure, and 0 for SETTLED and SURPLUS groups. Quote left_to_settle when the user asks how much is still to come back; quote net_amount only when a signed figure is wanted. transaction_count counts only transactions the user can still see — hidden transactions, and transactions on deleted or passively-tracked accounts, are not counted — so it can legitimately read 0 for a group that still exists. A transaction belongs to at most one refund group, and a group holds at most 200 transactions. Groups saved WITHOUT a name are not returned: treat this as the user's named refund groups, not an exhaustive account of every refund link they have made. Linking a refund rewrites how the member transactions count towards spending: each spend carries its un-refunded remainder, and the refund credits consumed offsetting those spends are excluded from cash flow so they do not read as income. get_spending_summary and compare_spending_periods already apply that netting, so a fully refunded spend contributes 0 to spending totals there and needs no adjustment by you. To see what is inside a group, pass its id to list_transactions as refund_group_ids — that returns both the spends and the refunds, each row carrying its own remaining_refund_amount. USE THIS when the user asks 'what am I still waiting on a refund for', 'how much is yet to be refunded', 'which refunds have come through', or any refund / return / reimbursement question. Read-only.
Lists the calling user's stocks and ETF holdings, merged by ISIN, sorted by current value descending. Supports a limit (1-100, default 100). Read-only.
Lists the user's stocks and ETF transactions (buys, sells, bonuses, splits, dividends, rights, others), most recent first. Optional filters: type, holding_id. Cursor-based pagination — pass next_cursor from a prior call to fetch the following page. Read-only.
List the calling user's own financial transactions. Filters (all optional): limit (1-100, default 25), cursor (opaque pagination token from next_cursor), type ('debit' or 'credit'), start_date / end_date (YYYY-MM-DD, inclusive / exclusive), exclude_non_cashflow (hide transfers / loan repayments / internal moves), bookmarked_only (only the transactions the user has bookmarked), sort_by ('date' default, or 'amount'), sort_order ('desc' default, or 'asc'), account_ids (one or more bank/credit-card account UUIDs), sources ('bank', 'credit_card', and/or 'manual'), category_ids / subcategory_ids (UUIDs), refund_group_ids (UUIDs from list_refund_groups — returns exactly the transactions linked to those refund groups, both the spends and the refunds that offset them), and group_ids (UUIDs from list_groups — returns the transactions the user has filed into those transaction groups). For both group filters an unknown id is not an error, it simply matches nothing. Sort dimensions MUST stay constant across pages of the same cursor walk — the cursor pins a value of the sort column, so changing sort_by/sort_order between pages would silently skip / re-emit rows. Each row carries two timestamps: `date` is when the transaction actually happened (bank-reported time, used for ordering and the date-range filter); `account_in` is a USER-CONTROLLED override that moves the transaction into a different calendar month for cash-flow / spending-summary accounting — for example, a salary credited Jan 31 can be moved into February so it counts under Feb's cash flow. `account_in` is null when the user hasn't moved the transaction; when present, it overrides `date` for monthly accounting only (not for ordering or the date-range filter). The get_spending_summary tool already applies COALESCE(account_in, date) server-side. Each row also carries `account_id` (the bank/credit-card/manual account this transaction belongs to — join key for list_bank_accounts / list_credit_cards results), a nested `category` envelope (null when the transaction is uncategorised; otherwise {id, name, subcategory} where the inner subcategory ({id, name}) is null when the user has not picked an icon under the category), `excluded_from_cash_flow` (true when the transaction is hidden from cash-flow / spending totals — transfers, loan repayments, internal moves, or user-marked exclusions; the same flag that the `exclude_non_cashflow` input filters on), and `is_bookmarked` (true when the user has bookmarked the transaction; the flag `bookmarked_only` filters on). Two refund fields complete each row: `refund_group_id` (the refund group this transaction is linked to, or null — a transaction is in at most one; resolve the name via list_refund_groups) and `remaining_refund_amount` (the un-refunded remainder of a spend a refund group has offset: 0 when refunds covered it entirely, the shortfall when they covered part, null when refund netting has not touched this row). `group_ids` lists the transaction groups this transaction has been filed into — an array (a transaction can be in several), empty when it is in none; resolve names via list_groups. Three split fields complete each row. A user can SPLIT a spend — carving child transactions out of it, each taking its own category, merchant and notes, while the original row keeps the leftover. `split_type` is 'PARENT' on that original row, 'CHILD' on a carved-off piece, and null when splitting never touched the transaction. `remaining_amount` is the parent's own leftover, the part still carrying the parent's category and notes (null on children and on non-split rows). `parent_transaction_id` points a child back at its parent (null otherwise) and is the only reliable way to group a split back together. This tool returns a parent and its children as SEPARATE sibling rows. `amount` is always the ORIGINAL figure in both directions: it is NOT reduced by refunds, and on a split PARENT it is still the full pre-split total even though that transaction's children are returned as their own rows alongside it. Use `effective_amount` for anything you sum — it is COALESCE(remaining_refund_amount, remaining_amount, amount), the exact figure the spending engines resolve, and the only field that reconciles with get_spending_summary. Summing `amount` instead overstates refunded spend and double-counts every split. Response: transactions[] (this page), count (this page's size, == len(transactions)), total_matched (count across ALL pages of the filter — populated only when truncation was detected; on the non-truncated path it is 0 and count IS the true total), and next_cursor (opaque pagination token; null when there are no more pages). Returns only transactions the user can already see in the Fold app. Without account_ids, bank transactions come only from actively tracked accounts (the app's main feed). A bank account that list_bank_accounts reports with tracking 'PASSIVELY_WITH_TRANSACTIONS' is left out of that feed — pass its id in account_ids to read its transactions. Accounts with tracking 'PASSIVELY' (balance only) have no transactions here. A bank account with a `track_from` cutoff (see list_bank_accounts) has no transactions before that date anywhere in Fold — the user chose not to track that period, so treat it as untracked, never as zero spend. For manual transactions (source 'manual'), account_id is the user's Cash on hand; filter them with sources=['manual'] rather than account_ids. Read-only.
Lists individual recurring-expense cycle instances (single payments) within a date range, sorted by due date. Includes UPCOMING/OVERDUE/PAID statuses and projects future cycles for dates beyond the backfill window. Default range: today to today + 30 days. Read-only.
Merges a split CHILD transaction back into its parent, undoing one split_transaction call. WRITES to the user's data, so confirm with the user before calling unless they have clearly already asked for this. Input: transaction_id (required) — the UUID of the CHILD leg to merge back, a transaction whose `split_type` is "CHILD". Passing the PARENT's id, or any transaction that is not a split child, is rejected. This DELETES the child transaction and everything that was ever added to it — its notes, its receipts, its own category and merchant. That is NOT recoverable: splitting again creates a fresh child, it does not bring the old one back. What returns to the parent is only the amount. The parent itself, and the original spend, are untouched. Merging the LAST remaining child resets the parent entirely: its `split_type` and `remaining_amount` go back to null and it stops being a split at all. The parent view returned shows whichever of those two states applies, so read it rather than assuming. Refused when the PARENT has since been linked to something that assumes a fixed amount — a recurring-expense cycle, a credit-card bill, or a refund group — because handing the amount back would contradict that link. Not idempotent in the way that matters: once the child is gone, calling again with the same id fails with 'transaction not found'. Never retry blindly on an unclear result — re-read with get_transaction first. Output: parent (the parent as it now stands, same shape as list_transactions) and merged_amount (the amount handed back to it). parent is null only when the merge succeeded but reading the parent back afterwards failed — treat that as a failed READ, not a failed merge.
Splits one of the calling user's transactions by carving a piece off it — the same split the Fold app offers on a transaction. WRITES to the user's data, so confirm with the user before calling unless they have clearly already asked for this exact split. This is CARVE-OFF, NOT divide-into-N. One call creates ONE child transaction of the amount you name and the parent keeps whatever is left in its `remaining_amount`. There is no 'split into 3 equal parts' operation and the amounts you pass do not have to sum to anything: to split a 900 lunch three ways, call this TWICE for 300 each, and the 300 still sitting on the parent IS the third piece. Inputs: transaction_id (required — the PARENT's UUID, from list_transactions or get_transaction), amount (required), and optionally category_id / subcategory_id from list_categories to file the child under. OMIT category_id to let the child inherit the parent's category; pass an EMPTY STRING to leave the child uncategorised instead, the same way an empty string clears a field on update_transaction. amount must be at least 0.01 and STRICTLY LESS than what the parent has left: its `remaining_amount` once it has been split at least once, otherwise its `amount`. A parent always keeps a positive remainder, so a split that would consume the whole transaction is rejected — read the parent with get_transaction first when you are not sure what is left. A parent may carry at most 20 children. NOT IDEMPOTENT: calling twice carves TWO children, not one. If a call comes back unclear — a timeout, an error you cannot read — do NOT retry it. Call get_transaction on the parent and look at `remaining_amount` and the child rows to see whether the split already landed. There is deliberately NO merchant input and NO notes input here. The child INHERITS the parent's merchant, and notes are NEVER inherited (a note written about the whole transaction does not describe the slice). To give the child its own merchant or its own note, call update_transaction on the child_transaction_id this returns. The child inherits everything else too — the account, the date, the cash-flow flag, the receipts, and the parent's category unless category_id is given — and it joins EVERY transaction group the parent is in, so a group's total still covers the whole of what was spent. These transactions CANNOT be split and the call is rejected with the reason: manual transactions (entered by hand rather than fetched from a bank), a transaction that is itself a split CHILD (splits do not nest), credit-card bill payments and transactions linked to a credit-card bill, hidden transactions, transactions inside a refund group, and transactions linked to a recurring-expense cycle. Output: child_transaction_id (the new child's UUID — pass it to update_transaction to tag it further), child, and parent (both in the same shape list_transactions returns; the parent as it NOW stands, with split_type "PARENT" and a reduced remaining_amount). child and parent are null only in the rare case where the split succeeded but reading the rows back afterwards failed — child_transaction_id is still the id that was created, so treat a null view as a failed READ and never as a failed split. To undo a split, call merge_split on the child.
Changes one of the calling user's custom entries (user-added assets and liabilities — see list_custom_entries). WRITES to the user's data — the change is what they will see in the Fold app, so confirm with the user before calling unless they have clearly already asked for this exact change. Inputs: entry_id (required) plus any of name, type, current_value, ownership_percentage, notes and opening_date; at least one is required and an omitted field is left untouched. notes="" clears the note. current_value stays a positive amount for a liability. A change to current_value, ownership_percentage or type records a NEW history point dated today (the moment of the call), so it says 'the value is now X' — it cannot backdate a value. Sending the value the entry already has records nothing. opening_date moves only the OPENING value's date (the first history point) and must be strictly before the entry's created_at; it accepts the same formats as on create_custom_entry. A few old entries have no recorded opening value (opening_date null) and their opening_date cannot be set. kind cannot be changed: to turn an asset into a liability or back, delete the entry and create it again. The net-worth toggle and attached documents are managed in the Fold app, not here. Output: entry (as it now stands, same shape as list_custom_entries) and previous — for each field you sent, its value BEFORE this call, in this tool's own input shape (fields you did not send are null; notes is "" when there was none). Passing previous back undoes the change, but history is not erased: undoing a value change adds ANOTHER history point dated today rather than removing the one this call added. Restoring a previous opening_date normally works too; in the rare case it is refused for not being strictly before created_at, tell the user and leave the opening date as it is.
Re-tags the calling user's own transactions: notes, category, subcategory, merchant, whether they count towards cash flow, which month they are accounted in, and whether they are bookmarked. WRITES to the user's data — the change is what they will see in the Fold app, so confirm with the user before calling unless they have clearly already asked for this exact change. Inputs: transaction_ids (required, 1-25 UUIDs from list_transactions, all the caller's own) plus any of notes, category_id, subcategory_id, merchant_name, remove_merchant, excluded_from_cash_flow, account_in, is_bookmarked. At least one of those eight is required, and every one given is applied to EVERY listed transaction — so batch only transactions that should all end up the same. Clearing vs leaving alone: an omitted field is left untouched, an empty string CLEARS it (notes, category_id, account_in). remove_merchant unsets the merchant and cannot be combined with merchant_name. excluded_from_cash_flow takes the transactions out of (true) or back into (false) cash-flow and spending totals — the same toggle as the app. It is refused, and the whole call fails, for a bank transaction linked to a credit-card bill or a credit inside a refund group, because their exclusion is already derived. Setting a category can also change this flag on its own: filing a transaction as a self-transfer excludes it, moving it off self-transfer includes it again. account_in moves transactions into another calendar MONTH for cash-flow and spending-summary accounting without changing when they happened — a salary credited Jan 31 accounted into February, say. Pass a date as YYYY-MM-DD (read in the user's timezone) or an RFC 3339 timestamp; only the month it lands in matters. It may move a transaction ONE month either way at most — into the month before or the month after the one it happened in — and a date further out is refused, failing the whole call. A date inside a transaction's own month clears that transaction's override rather than duplicating it, and an empty string clears it outright. is_bookmarked bookmarks (true) or un-bookmarks (false) the transactions, the same toggle as the app. category_id / subcategory_id come from list_categories. A category only accepts transactions in a direction its `type` lists, so an INCOMING transaction cannot be filed under an OUTGOING-only category. There are two ways to set the merchant, and they cannot be combined. merchant_name is free text, matched EXACTLY (case-insensitively) against the user's own merchants and Fold's catalogs; when nothing matches, a new custom merchant is CREATED with that name and appears in the user's merchant picker from then on — a real side effect beyond these transactions, so prefer the plain canonical name ("Swiggy", not "Swiggy order 4th Aug") and tell the user when merchant_resolution.outcome is "created". merchant_id + merchant_type instead names a SPECIFIC merchant from find_merchant_to_tag — use that pair when the name is ambiguous, when a particular outlet is meant, or when you want Fold's catalog brand rather than whatever an exact name match happens to hit. Pass both back exactly as that tool returned them. Output: updated_count, transactions[] (the rows as they now stand, same shape as list_transactions), previous[] ({id, category_id, subcategory_id, notes, merchant_id, merchant_type, excluded_from_cash_flow, account_in, is_bookmarked} as they were BEFORE this call — pass these back to undo it), and merchant_resolution ({outcome, id, name, type}, null when merchant_name was not given). The whole call fails if any transaction id is not the caller's, so a partial update never happens silently. Some tag rules are applied server-side and may change more than was asked: filing a transaction as a self-transfer also sets its merchant to "Myself", and moving it off self-transfer clears that merchant again. Read `transactions` in the response rather than assuming the patch applied verbatim.
Fold ChatGPT Plugin FAQ
How the directory, categories and Discoverability Score work.
Read the methodologyHow do I improve Fold's ChatGPT Plugin discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are Fold alternatives on ChatGPT?
As of 2026-11-02, Fold competes with Finances, AI Expense, Aurio Money Calculators, Aurio Statement Analyzer, BankPilot, Bankrate, BetterOff, Bilance and 77 more in ChatGPT Personal Finance & Budgeting Aggregators, ranked by public Discoverability Score.
Where does Fold rank in Personal Finance & Budgeting Aggregators on ChatGPT?
As of 2026-11-02, Fold ranks #38 of 86 in ChatGPT Personal Finance & Budgeting Aggregators with a Discoverability Score of 0/100 (Invisible).
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.