Resources & Data Types

Understand the BankSync data model: banks, accounts, transactions, balances, investments, loans, enrichments, feeds, jobs, and more.

7 min read

On this page

An overview of every resource in the BankSync data model. Understanding this hierarchy helps you navigate the REST API and MCP tools effectively.

Resource Hierarchy#

All resources are organized under a workspace. The tree below shows how resources relate to each other.

Resource hierarchy
Workspace├── Banks│   └── Accounts│       ├── Transactions│       ├── Balances│       ├── Trades│       ├── Holdings│       └── Loans├── Enrichments│   ├── Rules│   ├── Alerts│   └── Memory├── Feeds│   └── Jobs├── Integrations└── API Keys

Banks#

A bank represents a connection to a financial institution via an open finance provider (Plaid, SaltEdge, or SnapTrade). Each bank connection gives you access to the institution's accounts and data.

Key Fields#

FieldDescription
idUnique bank ID
institutionNamee.g. "Chase"
sourceplaid | saltedge | snaptrade
statusconnected | error
createdAtISO 8601

Accounts#

Each bank connection contains one or more accounts: checking, savings, credit card, investment, loan, etc. Account data is fetched live from the financial institution.

Key Fields#

FieldDescription
idAccount ID
nameAccount name
typechecking, savings, etc.
subtypeMore specific type
currencyISO 4217 code

Transactions#

Transactions are individual account entries: purchases, deposits, transfers, fees, etc. The API supports date-range filtering and cursor-based pagination for large result sets.

Key Fields#

FieldDescription
idTransaction ID
amountSigned amount
descriptionPayee/merchant
dateYYYY-MM-DD
categoryCategorization
pendingtrue/false

Pagination: Use from and to query params for date filtering. For large results, use the cursor returned in the response to fetch the next page.

Balances#

Balances represent the current state of an account. They are fetched live from the financial institution each time you request them.

Key Fields#

FieldDescription
currentLedger balance
availableAvailable to spend
limitCredit limit (if applicable)
currencyISO 4217
asOfTimestamp of balance

Investments#

Investment data is split into two resources: Trades (buy/sell transactions) and Holdings (current positions). Investment data may require additional bank consent.

Trades#

FieldDescription
tickerSymbol (AAPL)
typebuy, sell, dividend
quantityNumber of units
pricePrice per unit
amountTotal value
dateTrade date

Holdings#

FieldDescription
securityNamee.g. "Apple Inc"
tickerSymbol
quantityShares held
currentPriceMarket price
currentValueTotal market value
costBasisOriginal cost

Consent: Some banks require explicit user consent for investment data. If you receive a 503 error, the user must re-authorize the bank connection in the BankSync app.

Loans#

Loan data covers mortgages, auto loans, student loans, and other liabilities. Includes principal balance, interest rate, payment schedule, and maturity date.

Key Fields#

FieldDescription
loanTypemortgage, auto, etc.
principalBalanceOutstanding
interestRatePercentageAPR
nextPaymentAmountNext payment
nextPaymentDueDateDue date

Enrichments#

Enrichments are processing steps that run during every sync. They transform and annotate your financial data as it flows through the pipeline. There are sixteen types, grouped by what they do — see the enrichments overview for the full map:

Grouptype values
Transform datarule, lookup
Guard datafilter, split, transfer_match, dedupe
Watchalert, monitor, budget, recurring, fees, anomaly, digest
AI & learningmemory, ai_categorize, ai_merchant

Key Fields#

FieldDescription
idEnrichment ID
nameDisplay name
typeOne of the sixteen values above
enabledActive toggle
dataTypetransactions, balances, etc. (inert for workspace-scoped types)
feedIdsScoped feeds
allFeedsApply to all feeds
orderPosition within the enrichment's pipeline stage
ruleConfigRules: conditions + actions
alertConfigAlerts: conditions + destinations
memoryConfigMemory: pattern + target fields
lookupConfigLookup Table: match field, match mode, target field, entries
filterConfigFilter: conditions to exclude on
splitConfigSplit: conditions + the lines to split into
transferMatchConfigTransfer Matcher: window + tag/suppress action
dedupeConfigDuplicate Screen: window + flag/suppress action
monitorConfigFeed Monitor: stale-sync + no-records checks, destinations
budgetConfigBudget: dimension, metric, window, threshold, direction
recurringConfigRecurring Registry: price-increase, new, missed-charge checks
feesConfigFee Ledger: creep threshold + destinations
anomalyConfigAnomaly Detector: new-merchant, spike, velocity checks
digestConfigDigest: cadence, hour (UTC), tone, destinations
aiCategorizeConfigAI Categorizer: target field, taxonomy, confidence threshold
aiMerchantConfigMerchant Cleanup: options (no required configuration)

Exactly one type-specific config block is allowed, and it must match type — sending ruleConfig on a filter enrichment is rejected.

Ruleset actions: a rule action is a discriminated union on kindset (a static value, and the default when kind is absent), template (interpolate other fields), regexExtract (write a capture group), case (upper / lower / title) and math (abs / negate / round2). The in-app rule editor writes plain set actions; the derived kinds are API-only today. Regex patterns are safety-checked on save.

Alert destinations: email (recipients), slack (incoming-webhook URL), and webhook (URL plus optional headers). The sms shape exists in the wire format for stored legacy documents but is rejected on create and update — nothing delivers SMS yet. Slack and webhook URLs are masked in API responses (they are bearer secrets); send the masked value back unchanged to keep the stored URL.

Singleton types: memory, transfer_match and recurring are one-per-workspace and keyed deterministically, so creating one again via the API replaces the existing one rather than failing with a conflict. Every other type can have multiple instances — scope them per feed with feedIds.

Plan tiers: creating an enrichment is gated on your plan (basic / advanced / all) and returns 403 for a type the plan does not carry. The AI types additionally need the AI entitlement (Professional and above). See Changing your plan.

Feeds#

A feed is a data pipeline configuration that syncs financial data from a source (bank accounts) to a destination (Notion, Google Sheets, Airtable, etc.). Feeds define what data to sync, how to map fields, and when to run.

Key Fields#

FieldDescription
idFeed ID
nameHuman-readable name
sourceSource type
dataTypetransactions, balances, etc.
sourceConfigSource settings
destinationConfigDestination settings
fieldMappingsField mapping rules
scheduleCron schedule

Jobs#

A job represents a single execution of a feed sync. Jobs progress through these states:

in_progress → completed | failed | cancelled

Key Fields#

FieldDescription
idJob ID
statusCurrent state
createdAtWhen created
startedAtWhen execution began
completedAtWhen finished
transactionsProcessedRow count

Sync Modes#

When triggering a sync via POST /feeds/:fid/sync, the sync mode depends on the feed's data type and the parameters you provide:

  • Incremental (cursor-based): Default for transaction feeds. Syncs only new data since the last sync. No request body needed.
  • Date range: Pass startDate and endDate (YYYY-MM-DD) in the request body. Required for trade feeds, optional for transaction feeds.
  • Snapshot: Balance, holdings, and loan feeds always sync the latest snapshot. No request body needed.

Concurrency: Only one job can be active per feed at a time. Triggering a sync while one is already running returns a 409 error.

Integrations#

Integrations are connected destination apps: Notion, Google Sheets, Airtable, Excel, and others. Feeds use integrations as their sync destination. You can list and disconnect integrations via the API.

API Keys#

API keys grant programmatic access to the BankSync API and MCP server. Each key has a set of permission scopes that control what it can access. See the Authentication guide for details on creating and managing API keys.

Note: API key management (creating and revoking keys) requires an authenticated session. Keys cannot self-manage: use the BankSync web app.

Use this page with your AI assistant

Every BankSync doc is available as plain Markdown for agents and LLMs.