# Create a manual account
Source: https://docs.finta.io/api-reference/accounts/create-a-manual-account
/api/v2/openapi.json post /accounts
Create a manual (non-synced) account the user tracks by hand, including liability accounts (credit, student, mortgage). Only manual accounts can be created.
# Delete a manual account
Source: https://docs.finta.io/api-reference/accounts/delete-a-manual-account
/api/v2/openapi.json delete /accounts/{accountId}
Soft-close a manual account. Only manual accounts can be deleted; the account moves to `closed` status and keeps its transactions and balance history.
# Get account
Source: https://docs.finta.io/api-reference/accounts/get-account
/api/v2/openapi.json get /accounts/{accountId}
Returns a single bank account by Finta account ID.
# List account balance history
Source: https://docs.finta.io/api-reference/accounts/list-account-balance-history
/api/v2/openapi.json get /accounts/{accountId}/balance-history
Returns stored daily balance snapshots for a single account. Supports cursor pagination.
# List accounts
Source: https://docs.finta.io/api-reference/accounts/list-accounts
/api/v2/openapi.json get /accounts
Returns bank accounts from durable Finta data only. Does not call live providers.
# List balance history
Source: https://docs.finta.io/api-reference/accounts/list-balance-history
/api/v2/openapi.json get /accounts/balance-history
Returns stored daily balance snapshots across accounts. Supports cursor pagination.
# Update a manual account
Source: https://docs.finta.io/api-reference/accounts/update-a-manual-account
/api/v2/openapi.json patch /accounts/{accountId}
Update a manual account's name, type, currency, mask, balance, or liability data. Only manual accounts can be updated; bank-synced accounts are read-only. Updating the balance records a balance-history snapshot for today.
# List bank connections
Source: https://docs.finta.io/api-reference/bank-connections/list-bank-connections
/api/v2/openapi.json get /bank-connections
Returns bank connections from durable Finta data only. Does not call live providers.
# Batch update categories
Source: https://docs.finta.io/api-reference/categories/batch-update-categories
/api/v2/openapi.json post /categories/batch
Update multiple categories at once (max 250). Name, group, and description are editable on any category except Mercury's, which is read-only. Unknown or read-only IDs are skipped.
# Create a category
Source: https://docs.finta.io/api-reference/categories/create-a-category
/api/v2/openapi.json post /categories
Create a new manual category.
# Delete a category
Source: https://docs.finta.io/api-reference/categories/delete-a-category
/api/v2/openapi.json delete /categories/{id}
Delete a manual category. Transactions assigned to this category will become uncategorized.
# List categories
Source: https://docs.finta.io/api-reference/categories/list-categories
/api/v2/openapi.json get /categories
Returns stored transaction categories from durable Finta data only.
# Update a category
Source: https://docs.finta.io/api-reference/categories/update-a-category
/api/v2/openapi.json patch /categories/{id}
Update a category's name, group, or description. All three are editable on any category except Mercury's, which is read-only. Edits to a Plaid category persist across future syncs.
# Create a category group
Source: https://docs.finta.io/api-reference/category-groups/create-a-category-group
/api/v2/openapi.json post /category-groups
Create a category group. Names are normalized (trimmed, internal whitespace collapsed) and must be unique per user, compared case-insensitively.
# Delete a category group
Source: https://docs.finta.io/api-reference/category-groups/delete-a-category-group
/api/v2/openapi.json delete /category-groups/{id}
Delete a category group. Categories in the group are kept and become ungrouped (their `categoryGroupId` and `group` are cleared).
# List category groups
Source: https://docs.finta.io/api-reference/category-groups/list-category-groups
/api/v2/openapi.json get /category-groups
Returns the authenticated user's category groups in display order (sortOrder first, then name). Cursor-paginated.
# Update a category group
Source: https://docs.finta.io/api-reference/category-groups/update-a-category-group
/api/v2/openapi.json patch /category-groups/{id}
Rename a category group or change its sort order. Renaming also updates the `group` name on every category in the group.
# Health Check
Source: https://docs.finta.io/api-reference/health/health-check
/api/v2/openapi.json get /health
Returns API health status. Public endpoint; does not require authentication.
# List holdings
Source: https://docs.finta.io/api-reference/investments/list-holdings
/api/v2/openapi.json get /holdings
Returns stored investment holdings from durable Finta data only. Does not call live providers.
# List investment transactions
Source: https://docs.finta.io/api-reference/investments/list-investment-transactions
/api/v2/openapi.json get /investment-transactions
Returns stored investment transactions from durable Finta data only. Supports cursor pagination.
# List securities
Source: https://docs.finta.io/api-reference/investments/list-securities
/api/v2/openapi.json get /securities
Returns securities referenced by the authenticated user holdings or investment transactions. Does not call live providers.
# Current API user
Source: https://docs.finta.io/api-reference/me/current-api-user
/api/v2/openapi.json get /me
Returns the authenticated user. Useful for verifying API keys, storage mode, and integration setup.
# Archive a transaction rule
Source: https://docs.finta.io/api-reference/rules/archive-a-transaction-rule
/api/v2/openapi.json delete /rules/{ruleId}
Archive a transaction rule. Archived rules no longer run but remain retrievable with includeArchived.
# Create a transaction rule
Source: https://docs.finta.io/api-reference/rules/create-a-transaction-rule
/api/v2/openapi.json post /rules
Create a new transaction rule that auto-categorizes or hides stored transactions.
# List transaction rules
Source: https://docs.finta.io/api-reference/rules/list-transaction-rules
/api/v2/openapi.json get /rules
Returns the authenticated user's transaction rules. Active rules are returned by default.
# Run transaction rules
Source: https://docs.finta.io/api-reference/rules/run-transaction-rules
/api/v2/openapi.json post /rules/run
Run transaction rules over stored transactions. Omit ruleIds to run all active rules.
# Update a transaction rule
Source: https://docs.finta.io/api-reference/rules/update-a-transaction-rule
/api/v2/openapi.json patch /rules/{ruleId}
Update a transaction rule's conditions, outcomes, or priority. At least one field must be provided.
# Batch update transactions
Source: https://docs.finta.io/api-reference/transactions/batch-update-transactions
/api/v2/openapi.json post /transactions/batch
Update multiple transactions at once (max 250). Currently supports setting or clearing categoryId per transaction.
# List transactions
Source: https://docs.finta.io/api-reference/transactions/list-transactions
/api/v2/openapi.json get /transactions
Returns stored transactions from durable Finta data only. Supports cursor pagination. Deleted transactions are excluded by default.
# Update a transaction
Source: https://docs.finta.io/api-reference/transactions/update-a-transaction
/api/v2/openapi.json patch /transactions/{id}
Update fields on a single transaction. Currently supports setting or clearing categoryId.
# API Keys
Source: https://docs.finta.io/api/v2/api-keys
Create, manage, and scope API keys for the Finta API.
API keys authenticate your requests to the Finta API. You can create as many keys as you need — one per project, environment, or integration — and manage them from [API settings](https://app.finta.io/settings/api).
## Creating a key
1. Go to [API settings](https://app.finta.io/settings/api).
2. Click **Create Key**.
3. Give it a descriptive name (e.g. *Production*, *Personal scripts*).
4. Optionally restrict which accounts the key can access (see [Account scope](#account-scope) below).
5. Click **Create Key** — the secret is shown **once**. Copy it now.
Creating a key enables [Storage Mode](/getting-started/storage-mode) automatically if it isn't already on.
## Naming keys
Every key has a name. Use names that make it obvious where each key is used so you can safely rotate or delete individual keys without guessing what depends on them.
To rename a key after creation, click **Rename** next to it in [API settings](https://app.finta.io/settings/api).
## Account scope
By default, a key can access all of your accounts, including any you connect in the future. You can restrict a key to a specific set of accounts — useful for isolating what a particular integration or script can see.
### Setting scope when creating a key
In the **Create Key** dialog, turn off **Share all accounts** and select the accounts you want the key to access.
### Editing scope after creation
1. Open [API settings](https://app.finta.io/settings/api).
2. Click **Edit scope** next to the key.
3. Toggle **Share all accounts** or check/uncheck individual accounts.
4. Click **Save**.
Changes take effect immediately — no need to rotate the key.
### How scope is enforced
When a key has a restricted scope, any request for an account outside that scope returns `404 NOT_FOUND`, the same as if the resource does not exist. This avoids leaking that the account exists at all.
An empty scope (all accounts) is the default and includes accounts you add in the future.
## Rotating a key
Rotating generates a new secret and immediately invalidates the old one. The key's **name and account scope are preserved** — only the secret changes.
1. Click **Rotate** next to the key in [API settings](https://app.finta.io/settings/api).
2. Confirm the rotation.
3. Copy the new secret — it is shown **once**.
4. Update any applications using the old key before closing the dialog.
## Deleting a key
Deleting a key permanently invalidates it. Any application using that key will stop working immediately.
1. Click **Delete** next to the key in [API settings](https://app.finta.io/settings/api).
2. Confirm deletion.
This cannot be undone. If you want to cycle the secret without disrupting integrations, use **Rotate** instead.
# Authentication
Source: https://docs.finta.io/api/v2/authentication
How to authenticate requests to the Finta API.
All API endpoints (except `GET /health`) require a Bearer token in the `Authorization` header.
```bash theme={null}
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://api.finta.io/v2/me
```
API keys start with the `finta_` prefix. Generate and manage them from [API settings](https://app.finta.io/settings/api).
## Verify your key
Call `GET /me` to confirm your key is valid and Storage Mode is enabled:
```bash theme={null}
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://api.finta.io/v2/me
```
```json theme={null}
{
"userId": "550e8400-e29b-41d4-a716-446655440000",
"email": "you@example.com",
"storageMode": true
}
```
If Storage Mode is off, the response will be `403 STORAGE_MODE_REQUIRED`. Enable it from [Data settings](https://app.finta.io/settings/data) or by creating a new API key (which enables it automatically).
## Account scope
Each API key can be scoped to a subset of your bank accounts. When a key has a restricted scope, requests for accounts outside that scope return `404 NOT_FOUND` — the same response as if the resource does not exist — to avoid leaking that the account exists.
A key with no scope restriction can access all of your accounts, including any you add in the future.
When a scoped key creates a new account (for example a manual account via `POST /accounts`), that account is automatically added to the key's scope so the key can read and manage it. The same applies to scoped OAuth clients.
See [API Keys](/api/v2/api-keys) for how to configure scope.
# Data Types
Source: https://docs.finta.io/api/v2/data-types
Shapes of objects returned by the Finta API.
## Account liability data
Account responses include a `liability` field when Finta has stored liability data for the account — either synced from a provider (e.g. Plaid) or set on a [manual account](/api/v2/overview#manual-accounts). It is `null` for depository, investment, and other accounts without debt metadata.
When creating or updating a manual account, the `liability` object in the request body uses the same shape shown below (set `type` to `credit`, `student`, or `mortgage`).
```json theme={null}
{
"id": "account_123",
"name": "Credit Card",
"type": "credit",
"currentBalance": 1200,
"liability": {
"type": "credit",
"minimumPaymentAmount": 35,
"nextPaymentDueDate": "2026-06-15",
"lastPaymentAmount": 40,
"lastPaymentDate": "2026-05-15",
"lastStatementBalance": 1200,
"interestRate": 19.99,
"isOverdue": false,
"aprs": [
{
"aprType": "purchase_apr",
"aprPercentage": 19.99,
"balanceSubjectToApr": 1000,
"interestChargeAmount": 15
}
]
}
}
```
### Student loans
Student loan liabilities include `loanStatus`, `repaymentPlan`, `pslfStatus`, payoff dates, origination details, and year-to-date interest/principal paid.
```json theme={null}
{
"type": "student",
"minimumPaymentAmount": 125,
"nextPaymentDueDate": "2026-06-20",
"interestRate": 5.5,
"loanName": "Federal Student Loan",
"loanStatus": { "type": "repayment", "endDate": null },
"repaymentPlan": { "type": "standard", "description": "Standard Repayment" },
"pslfStatus": {
"paymentsRemaining": 80,
"paymentsMade": 40,
"estimatedEligibilityDate": "2032-01-01"
}
}
```
### Mortgages
Mortgage liabilities include `interestRateType`, `nextMonthlyPayment`, escrow, PMI, prepayment penalty, property address, maturity, past-due, origination, and year-to-date interest/principal paid.
```json theme={null}
{
"type": "mortgage",
"minimumPaymentAmount": 1800,
"nextPaymentDueDate": "2026-07-01",
"interestRate": 6.25,
"interestRateType": "fixed",
"nextMonthlyPayment": 1800,
"escrowBalance": 3500,
"hasPmi": false,
"propertyAddress": {
"street": "123 Main St",
"city": "San Francisco",
"region": "CA",
"postalCode": "94105",
"country": "US"
}
}
```
# Overview
Source: https://docs.finta.io/api/v2/overview
Access your Finta financial data programmatically with the REST API.
The Finta API lets you read your stored financial data — accounts, transactions, balances, holdings, investment activity, and bank connections — from any HTTP client or script.
It also supports a focused set of writes: managing **manual accounts** (create, update, and close accounts you track by hand, including liability accounts like credit cards, student loans, and mortgages), creating and editing manual **categories**, recategorizing **transactions**, and managing **rules**. See the [Reference](/api/v2/openapi) for every endpoint.
* **Base URL:** `https://api.finta.io/v2`
* **Format:** JSON
* **Authentication:** Bearer token (API key)
## Manual accounts
Most accounts in Finta sync automatically from a connected bank. **Manual accounts** are ones you maintain yourself — cash, a property, a private loan, or a credit card you'd rather track by hand.
* `POST /accounts` creates a manual account. Set `currentBalance` to the amount owed for liabilities, and pass a `liability` object (`type` of `credit`, `student`, or `mortgage`) to record debt details.
* `PATCH /accounts/{accountId}` updates the name, type, currency, balance, or liability data. Updating the balance records a balance-history snapshot for that day.
* `DELETE /accounts/{accountId}` closes the account (soft delete): it moves to `closed` status but keeps its transactions and balance history.
Only manual accounts can be created, updated, or deleted — bank-synced accounts are read-only and return `400` on a write. Manual account changes automatically sync to any connected destinations (Airtable, Notion, Google Sheets, etc.) the account is linked to.
If your API key (or OAuth client) is scoped to a specific set of accounts, an account it creates is automatically added to that allowlist, so the same credential can read and manage it right away.
## Requirements
| Requirement | Details |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| **Active subscription** | API access is available on Standard and Pro plans. |
| **Storage Mode** | The v2 API reads from data Finta has already synced and stored. Creating an API key from the dashboard enables Storage Mode automatically. |
| **API key** | Generate one from [API settings](https://app.finta.io/settings/api). |
## Rate limits
| Plan | Limit |
| -------- | -------------------------- |
| Standard | 200 requests / minute |
| Pro | Higher limits (contact us) |
Requests that exceed the limit return `429 RATE_LIMITED`. The response may include a `retryAfter` field (seconds).
## Errors
Most errors use a structured envelope:
```json theme={null}
{
"error": {
"code": "STORAGE_MODE_REQUIRED",
"message": "Storage mode must be enabled to use the v2 API"
}
}
```
| Code | HTTP | When |
| ----------------------- | ---- | ------------------------------------------- |
| `BAD_REQUEST` | 400 | Invalid parameters or body |
| `STORAGE_MODE_REQUIRED` | 403 | Storage mode is off |
| `SUBSCRIPTION_REQUIRED` | 403 | Subscription inactive or canceled |
| `NOT_FOUND` | 404 | Resource missing or not owned by the caller |
| `RATE_LIMITED` | 429 | Rate limit exceeded |
| `PROVIDER_UNAVAILABLE` | 502 | Upstream provider error |
| `INTERNAL_ERROR` | 500 | Unexpected server error |
`401` responses use a plain string rather than the envelope:
```json theme={null}
{ "error": "Missing or invalid Authorization header" }
```
## OpenAPI spec
The full OpenAPI spec is available at:
```text theme={null}
https://api.finta.io/v2/openapi.json
```
# Manage Connection
Source: https://docs.finta.io/bank-connections/gocardless/manage-connection
Manage your GoCardless open banking connection in Finta. Re-authorize expired consent, understand the 90-day cycle, and troubleshoot connection issues.
GoCardless connections are managed from the **Accounts** page in the Finta dashboard. Each card shows your institution name, linked accounts, and the last sync time.
## Connection status
GoCardless syncs daily. If everything is working, you don't need to do anything.
If Finta shows a **Reconnect** button on the connection card, your open banking consent has almost certainly expired.
## Why GoCardless connections expire
PSD2 (the European open banking regulation) requires you to re-authorize third-party access to your bank data roughly every 90 days. Your bank sets the exact window, but 90 days is standard.
This isn't something Finta controls. When consent expires, Finta loses access until you go through the authorization flow again.
While disconnected, syncs pause. Your existing data stays intact.
## Re-authorizing a connection
When you see the **Reconnect** button:
1. Click **Reconnect** on the affected connection
2. Your browser redirects to your bank's authorization page
3. Log in and approve access for Finta
4. Your browser returns to Finta and syncing resumes
Each re-authorization creates a new consent agreement. Finta links it to your existing connection, so your sync history and destination mappings carry over.
The bank authorization page is hosted by your bank, not by Finta or GoCardless. Your credentials go directly to your bank's secure website.
## Other actions
Click the **three-dot menu** (⋮) on any connection card to access these options:
### View syncs
See a history of all syncs for this connection, including timestamps and whether they succeeded or failed.
### Set sync start date
Control how far back Finta pulls historical data. If you only need recent data, set a more recent start date to keep your destination focused.
### Remove connection
Permanently disconnect this bank from Finta. This removes the connection and all associated account data.
Removing a connection is permanent. You'll need to go through the full GoCardless authorization flow again if you want to reconnect the same bank later.
## Troubleshooting
**Reconnect button keeps appearing:** You may not have completed the full authorization on your bank's site. Some banks also require approval through their mobile app rather than the browser.
**Authorization page shows an error:** This is usually a temporary issue with your bank's open banking service. Wait a few minutes and try again. If it keeps failing, check your bank's status page or contact them directly.
**Missing transactions after reconnecting:** GoCardless syncs daily, so it can take up to 24 hours for the first post-reconnect sync to run and backfill any missed transactions.
## Next steps
See all supported providers
Set up where your data syncs to
# Manage Connection
Source: https://docs.finta.io/bank-connections/mercury/manage-connection
Manage your Mercury bank connection in Finta. Re-authorize expired OAuth tokens, enable real-time syncing, and troubleshoot connection issues.
Mercury connections are managed from the **Accounts** page in the Finta dashboard. The connection shows your Mercury organization name, linked accounts, and the last sync time.
## Connection status
Mercury syncs in real time via webhooks. When a transaction posts to your Mercury account, Finta picks it up within minutes.
If Finta shows a **Reconnect** button, the OAuth authorization has expired.
## Why Mercury connections expire
Finta connects to Mercury through OAuth. Mercury's access tokens expire periodically, but Finta refreshes them automatically in the background. If the refresh token itself expires — usually after a long period of inactivity — you'll need to re-authorize manually.
While disconnected, syncs pause. Your existing data stays intact.
## Re-authorizing a connection
When you see the **Reconnect** button:
1. Click **Reconnect** on the affected connection
2. Finta redirects you to Mercury's authorization page
3. Log in and approve access for Finta
4. Your browser returns to Finta and syncing resumes
Finta links the refreshed authorization to your existing connection, so your sync history and destination mappings carry over. Any transactions that came in while the connection was down get backfilled.
Finta only requests read access to your Mercury data. Your credentials go directly to Mercury's site and are never stored by Finta.
## Enabling real-time syncing
If you see an **Enable real-time** button instead of a Reconnect button, the webhook for instant updates hasn't been set up yet. Click it to activate — after that, Finta gets transaction updates as they happen rather than on a periodic schedule.
## Other actions
Click the **three-dot menu** (⋮) on any connection card to access these options:
### View syncs
See a history of all syncs for this connection, including timestamps and whether they succeeded or failed.
### Set sync start date
Control how far back Finta pulls historical data. If you only need recent data, set a more recent start date to keep your destination focused.
### Remove connection
Permanently disconnect Mercury from Finta. This removes the connection and all associated account data.
Removing a connection is permanent. You'll need to go through the full Mercury OAuth flow again if you want to reconnect.
## Troubleshooting
**Reconnect button keeps appearing:** Make sure you completed the full authorization on Mercury's site. If Mercury's page shows an error, try again. If the problem persists, check that your Mercury account is in good standing.
**Transactions not syncing in real time:** Check if the **Enable real-time** button is showing on your connection card. If it is, click it to set up webhooks. If real-time is already enabled and transactions are delayed, Finta also runs periodic backfill syncs to catch anything webhooks miss.
**New Mercury accounts not appearing:** If you opened a new account in Mercury after connecting to Finta, click **Reconnect** to re-authorize. The new account gets picked up during that flow.
## Next steps
See all supported providers
Set up where your data syncs to
# Bank Connections
Source: https://docs.finta.io/bank-connections/overview
Connect your banks, credit cards, investment accounts, and payment processors to Finta. Supports Plaid, GoCardless, Mercury, and Stripe.
A bank connection is an authorized link between Finta and one of your financial accounts. Once connected, Finta automatically syncs your transactions, balances, and other financial data to your destinations.
You can connect as many accounts as your plan allows and route them to different destinations based on how you want to organize your data.
## Providers
Finta supports four providers. The right one depends on where your accounts are and what type of data you need.
| Provider | Region | What it connects | How it syncs |
| -------------- | ---------- | ----------------------------------------------------------------- | ----------------------------------------------------- |
| **Plaid** | US, Canada | Thousands of banks, credit cards, investment and loan accounts | Webhook-triggered when your bank reports new activity |
| **GoCardless** | Europe, UK | Banks via open banking across the UK and Europe | Daily scheduled sync |
| **Mercury** | US | Mercury business bank accounts | Real-time via webhooks |
| **Stripe** | Global | Charges, customers, invoices, subscriptions, Issuing transactions | Real-time via webhooks |
### When to use which provider
* **Plaid** is the default for US and Canadian bank accounts. It covers the widest range of institutions including checking, savings, credit cards, investments, and loans.
* **GoCardless** is for European and UK bank accounts. It uses open banking, which means your bank authorizes Finta directly (no screen-scraping).
* **Mercury** is for Mercury customers who want a direct integration. It provides real-time updates instead of the daily sync you'd get connecting Mercury through Plaid.
* **Stripe** is for syncing your Stripe business data. It pulls in charges, customers, products, prices, subscriptions, and invoices.
## How automatic syncs work
After connecting an account, Finta keeps your data in sync automatically. The method depends on the provider:
**Webhook-driven (Plaid, Mercury, Stripe):** These providers notify Finta when something changes. A new transaction posts to your bank account, and Finta picks it up within minutes. Mercury and Stripe send real-time webhooks. Plaid sends update notifications that trigger a sync.
**Scheduled (GoCardless):** Finta runs a daily sync to pull the latest transactions and balances. Some European banks also have rate limits on how often data can be fetched, so daily is the most reliable cadence.
Where supported, Finta also runs periodic backfills to catch anything webhooks might miss.
## Connecting your first account
Click **Connect Account** from the Accounts page in the Finta dashboard. Search for your institution and Finta will show you the available provider. Follow the prompts to securely authorize access.
Finta requests read-only access to your financial data. Bank usernames and passwords are never stored by Finta—authentication is handled via OAuth tokens managed by the provider's own security infrastructure.
# AI Categorization
Source: https://docs.finta.io/bank-connections/plaid/ai-categorization
Understand what the "Use AI Categorization" toggle does in your Categories table settings and how to turn it on or off.
When you set up a destination that includes a Categories table, Finta can use Plaid's AI to automatically assign spending categories to your transactions. This behavior is controlled by the **Use AI Categorization** toggle in your Categories table settings.
## Where to find it
1. Open your [Finta dashboard](https://app.finta.io) and click a destination in the sidebar.
2. Click the **Categories** row in the Synced Tables section.
3. The **Use AI Categorization** toggle appears near the top of the settings panel that slides in.
This toggle only appears if your destination includes a Plaid bank connection. It is not shown for Mercury, GoCardless, or Stripe connections, which handle categories differently.
## What it does
**When turned on:** Plaid's AI analyzes each transaction and assigns a category — such as Food and Drink, Travel, or Shopping. During each sync:
* The categories Plaid assigned are written to your Categories table in the destination.
* Each transaction in your Transactions table is linked to its Plaid category.
**When turned off:** Transactions sync without any AI-assigned category. During each sync:
* No category data is passed to your Transactions table from Plaid.
* No new rows are written to your Categories table.
Turning off AI Categorization does not delete existing category rows already written to your destination. Rows that were synced before you toggled the setting off will remain. Only future syncs are affected.
## Turning it off
If you prefer to categorize transactions yourself — using [rules](/getting-started/quickstart) or manually — you can turn off AI Categorization to keep Plaid's categories out of your destination entirely.
1. Open the Categories table settings for your destination (see above).
2. Toggle **Use AI Categorization** off.
3. Click **Save**.
The next sync will run without Plaid categories. Transactions added after that point will not have a category assigned from Plaid.
# Plaid: Connect a Bank
Source: https://docs.finta.io/bank-connections/plaid/connect-bank
Connect a US or Canadian bank, credit card, or investment account to Finta using Plaid. Finta never sees or stores your bank credentials.
Finta uses [Plaid](https://plaid.com) to connect US and Canadian financial institutions. Plaid handles authentication directly with your bank, so Finta never sees or stores your username or password.
## Before you start
Make sure you have a Finta account and an active subscription. Standard plans support up to 10 bank connections. Pro plans support unlimited connections.
## How to connect a bank
1. Go to the **Accounts** page in the [Finta dashboard](https://app.finta.io)
2. Click **Add Bank Connection**
3. In the dialog, search for your bank or financial institution
4. Select your institution from the results
5. Choose the data you want from that institution — **Transactions**, **Investments**, and/or **Liabilities** (only the types your institution supports are shown), then click **Continue**
6. Plaid Link opens in a secure overlay — enter your bank login credentials
7. If your bank uses multi-factor authentication, complete the MFA step
8. Select the accounts you want to sync to Finta
9. Click **Continue** to finish
Finta immediately pulls your account data and begins syncing. The first sync may take a minute or two depending on how much history your bank makes available.
Finta requests read-only access to your financial data. Your bank credentials are handled entirely by Plaid and are never transmitted to or stored by Finta.
## Choosing what data to connect
After you select an institution, Finta asks **"What data do you want?"** and shows the data types that institution supports through Plaid:
* **Transactions** — bank, cash, and card transaction history
* **Investments** — brokerage accounts, holdings, securities, and investment activity
* **Liabilities** — loans and credit liability balances
Pick the types that match the accounts you want to sync, then click **Continue**. Choosing the right data types up front helps Plaid show the correct accounts — and avoids the "no accounts found" error covered below.
Select only the data types you actually have at that institution. For a brokerage like Robinhood, choose **Investments**; for a checking account, choose **Transactions**. Selecting more types than an account supports can cause Plaid to return no accounts. See [Plaid Says You Have No Accounts](/bank-connections/plaid/no-accounts-found).
## What data Finta syncs
After connecting, Finta syncs the following data depending on the account type:
| Account type | Data synced |
| ------------------- | ------------------------------------------- |
| Checking / Savings | Transactions, balances |
| Credit cards | Transactions, balances |
| Investment accounts | Holdings, investment transactions, balances |
| Loans | Balances |
## After connecting
Your connection appears on the **Accounts** page. Finta syncs automatically whenever Plaid notifies us of new activity at your bank — usually within minutes of a transaction posting.
You don't need to trigger syncs manually. If you want to route this connection's data to a destination, see [Create a Destination](/destinations/create-destination).
## Plan limits
| Plan | Bank connections allowed |
| -------- | ------------------------ |
| Standard | Up to 10 |
| Pro | Unlimited |
If you're on the Standard plan and have already connected 10 bank connections, you'll be prompted to upgrade to Pro before adding more.
## Troubleshooting
**Can't find your institution:** Search by the full bank name or the name shown on your bank's website. Some banks operate under a different name in Plaid (e.g., a regional credit union may be listed under its full legal name). If your institution doesn't appear, it may not be supported by Plaid.
**Login fails during Plaid Link:** Double-check your credentials on your bank's website first. If your bank recently required a password update or security verification, complete that on the bank's site before trying again in Finta.
**MFA not working:** Make sure you have access to the phone number or authenticator app associated with your bank account. Some banks require you to approve the connection from their mobile app.
**"No eligible accounts" / "No matching accounts found":** Plaid couldn't find accounts that match every data type you selected. Exit Plaid, start over, and this time select fewer data types — for example, **Investments** only for a brokerage. See [Plaid Says You Have No Accounts](/bank-connections/plaid/no-accounts-found) for the full fix.
**Connection succeeds but no accounts appear:** Some account types (certain business accounts, newer account types) may not be available through Plaid even if the connection is successful. Use the **Update accounts** option from the three-dot menu on the connection card to see all available accounts.
## Next steps
Re-authenticate, add accounts, and troubleshoot an existing connection
Set up where your synced data goes
# Manage Connection
Source: https://docs.finta.io/bank-connections/plaid/manage-connection
Manage your Plaid bank connection in Finta. Re-authenticate expired credentials, add or remove accounts, view sync history, and troubleshoot connection issues.
After connecting a bank account through Plaid, you can manage it from the **Accounts** page in the Finta dashboard. Each connection shows your institution name, linked accounts, and the last time data was synced.
## Connection status
A healthy connection syncs automatically whenever your bank reports new activity. You don't need to do anything.
If something needs attention, Finta shows a **Reconnect** button on the connection card. This means one of two things:
* **Credentials expired:** You changed your bank password, or your bank requires periodic re-authentication.
* **Consent expiring:** Some banks require you to reauthorize access periodically. Finta warns you 7 days before consent expires.
Until you reconnect, Finta can't sync new data from that connection.
## Re-authenticating a connection
When you see the **Reconnect** button:
1. Click **Reconnect** on the affected connection
2. Plaid Link opens with your institution pre-selected
3. Enter your updated bank credentials (or confirm MFA)
4. The connection is restored and syncs resume automatically
This is the most common support issue with Plaid connections. Banks periodically lock out third-party access as a security measure. After reconnecting, your syncs pick up where they left off.
## Adding or removing accounts
If you opened a new account at the same bank, or want to stop syncing a specific account, use the **Update accounts** option.
1. Click the **three-dot menu** (⋯) on the connection card
2. Select **Update accounts**
3. Plaid Link opens and shows all available accounts at that institution
4. Check or uncheck accounts to add or remove them
5. Close the modal to save your changes
New accounts are added to Finta immediately. Removed accounts are deleted from Finta along with their synced data.
Update accounts only changes which accounts are linked to Finta. It doesn't affect your actual bank accounts in any way.
## Other actions
Click the **three-dot menu** (⋯) on any connection card to access these options:
### View syncs
See a history of all syncs for this connection, including timestamps, duration, and whether they succeeded or failed. Useful for troubleshooting if data seems out of date.
### Set sync start date
Control how far back Finta pulls historical data. By default, Finta syncs up to 2 years of transaction history. If you only need recent data, set a more recent start date to keep your destination focused.
### Report missing data
If you notice transactions or accounts that should be syncing but aren't, use this option to flag the issue. Finta's support team will investigate the data gap.
### Remove connection
Permanently disconnect this bank from Finta. This removes the connection and all associated account data. Your destinations will no longer receive updates from this bank.
Removing a connection is permanent. You'll need to go through the full Plaid Link flow again if you want to reconnect the same bank later.
## Troubleshooting
**"Reconnect" keeps appearing after re-authenticating:** Your bank may require you to update your password on their website first. Log in to your bank directly and check for any security alerts or password change requirements, then try reconnecting in Finta.
**Last sync date seems old:** Check if the connection needs re-authentication (look for the Reconnect button). If the connection is healthy, try a manual sync from your destination page. Some banks have delays in reporting new transactions to Plaid.
**Missing accounts after connecting:** Use **Update accounts** from the three-dot menu to see all available accounts at that institution. Some account types (like business accounts or certain investment accounts) may not be available through Plaid.
## Next steps
See all supported providers
Set up where your data syncs to
# Plaid Says You Have No Accounts
Source: https://docs.finta.io/bank-connections/plaid/no-accounts-found
What to do when Plaid can't find accounts to connect. Exit Plaid, start over, and select fewer data types — or use Finta's one-click retry.
When you connect a bank through Plaid, Finta first asks which types of data you want — **Transactions**, **Investments**, and/or **Liabilities**. Plaid then only connects accounts that support **every** data type you picked. If none of your accounts match all of them, you'll see a "no accounts" error.
The fix is almost always the same: **try again with fewer data types.** The error shows up in one of two places, so here's how to recognize each and exactly what to do.
## 1. If Plaid shows "No eligible accounts"
Most often, the error appears **inside the Plaid window** — a screen with a red ✕, the heading **"No eligible accounts,"** and a black **Return** button. This is Plaid's own screen, so Finta can't add a retry button to it. You need to exit and start over.
The exact wording can vary (for example, "We didn't find any checking or savings accounts at this institution"). Any "no eligible accounts" message from Plaid is handled the same way.
**What to do:**
Tap **Return** (or the **✕** in the top corner) to exit Plaid and go back to Finta.
On the **Accounts** page, click **Add Bank Connection** again and search for and select the same institution.
On the **"What data do you want?"** step, check **only** the data type that matches the account you're connecting — ideally just one:
* **Investments** for a brokerage or retirement account
* **Transactions** for a checking, savings, or credit card account
* **Liabilities** for a loan or credit account
Click **Continue** and finish connecting in Plaid. With a narrower request, your matching accounts should now appear.
## 2. If Finta shows "No matching accounts found"
Sometimes Plaid hands the error back to Finta instead of showing its own screen. In that case, Finta shows a notification — **"No matching accounts found"** — with a button to retry automatically:
> **No matching accounts found**
> We couldn't find active accounts at your bank that match Transactions and Investments. Try a smaller data request.
>
> **Try Investments only →**
**What to do:** Click the retry button — for example, **"Try Investments only"** (Finta fills in the specific data type). Finta reopens Plaid with just that one data type, so there's no need to start over manually. If you originally selected more than two types, Finta offers a separate retry option for each one.
## Why this happens
Plaid only shows accounts that support **all** of the data types you requested, so an account has to match every one of them to appear. Ask for more types than your account supports, and Plaid returns nothing.
This is most common at **brokerages** like Robinhood, Schwab, Fidelity, or Vanguard. If you select both **Transactions** and **Investments** but your account only holds investments, no account supports transactions — so Plaid reports no accounts, even though your investment data would connect fine on its own.
When in doubt, connect **one data type at a time**. You can always add another connection for the same institution later if you need more than one type of data.
## Still seeing the error?
If you selected **only one data type** and still get a "no accounts" error, Plaid couldn't find any account at that institution that supports the data you asked for. This can happen if the account is brand new, isn't fully set up at the institution yet, or isn't supported by Plaid for that data type.
At this point, please [contact support](mailto:hello@finta.io). It helps to mention the institution name and which data type you selected — Finta logs the details of each connection attempt, so support can trace exactly what Plaid returned and help from there.
## Related
Walk through connecting a bank and choosing data types
Re-authenticate, add accounts, and troubleshoot existing connections
# Reconnect
Source: https://docs.finta.io/bank-connections/reconnect
Why bank connections disconnect, what happens to your data, and how to reconnect each provider in Finta.
Bank connections break occasionally. It's usually fixable in under a minute, and your data stays put while a connection is down.
## Why connections disconnect
The cause depends on your provider:
* Your bank password changed, so the stored authorization is no longer valid.
* Your bank requires periodic re-confirmation of access for third-party apps.
* European banks through GoCardless require re-authorization every \~90 days under open banking regulations.
* Mercury uses OAuth tokens that can expire after a long period of inactivity.
* Stripe connections break if the restricted API key is deleted, rotated, or loses its permissions.
## What happens to your data
Syncs pause while a connection is down. No new transactions or balances come in. Everything already synced to your destinations stays as-is, and once you reconnect, Finta backfills any transactions it missed.
You'll get an email when a connection needs attention. The **Reconnect** button also shows up on the affected card on the Accounts page.
## How to reconnect
Find your provider:
US and Canadian banks — re-authenticate through Plaid Link
European and UK banks — re-authorize through your bank
Mercury accounts — re-authorize through Mercury OAuth
Stripe accounts — update your restricted API key
## If reconnection doesn't work
1. Check your bank directly. Log in and look for pending security alerts, password requirements, or account restrictions.
2. Email us at [hello@finta.io](mailto:hello@finta.io) or find us on [Discord](https://link.finta.io/discord).
# Manage Connection
Source: https://docs.finta.io/bank-connections/stripe/manage-connection
Manage your Stripe connection in Finta. Update your API key, understand required permissions, and troubleshoot connection issues.
Stripe connections are managed from the **Accounts** page in the Finta dashboard. The connection shows your Stripe account name and the last sync time.
## Connection status
Stripe syncs in real time via webhooks. New charges, invoices, and account activity come in automatically.
If your API key is revoked, rotated, or loses permissions, syncs start failing. Fix it by updating the key.
## Updating your API key
1. Go to the **Accounts** page in the [Finta dashboard](https://app.finta.io)
2. Click the **three-dot menu** (⋮) on your Stripe connection
3. Select **Update API Key**
4. In the [Stripe Dashboard](https://dashboard.stripe.com/apikeys), create a new restricted key with the permissions listed below
5. Copy the new key (it starts with `rk_live_`) and paste it into the dialog
6. Click **Update Key**
Syncing picks back up once the new key is validated.
## Required permissions
| Permission | Access |
| --------------------- | ------ |
| All Core resources | Read |
| All Connect resources | Read |
| All Billing resources | Read |
| Webhook Endpoints | Write |
Use a restricted key (`rk_live_...`), not a secret key (`sk_live_...`). Finta only needs the permissions listed above.
## Other actions
Click the **three-dot menu** (⋮) on any connection card to access these options:
### View syncs
See a history of all syncs for this connection, including timestamps and whether they succeeded or failed. Useful for troubleshooting if data seems out of date.
### Set sync start date
Control how far back Finta pulls historical data. If you only need recent data, set a more recent start date to keep your destination focused.
### Remove connection
Permanently disconnect Stripe from Finta. This removes the connection and all associated data.
Removing a connection is permanent. You'll need to create a new restricted key and go through the setup process again if you want to reconnect.
## Troubleshooting
**"API Key is invalid":** Make sure you copied the full key. Restricted keys start with `rk_live_`. If you just rotated the key, the old one is already invalidated.
**"Missing permissions":** Double-check your restricted key in the Stripe Dashboard. The most commonly missed permission is **Write** on **Webhook Endpoints** — Finta needs it to receive real-time updates.
**Syncs failing after key rotation:** The old key Finta was using is gone. Use **Update API Key** from the three-dot menu to add the new one.
## Next steps
See all supported providers
Set up where your data syncs to
# Chart Types
Source: https://docs.finta.io/charts/chart-types
Configure Metric, Bar, Line, and Donut charts from your Finta data.
Finta supports four chart types. Each reads from a single Notion database and measures a **Value** field, with type-specific options for grouping and time.
Finta stores expenses as **negative** amounts and income as **positive**
amounts. Keep this in mind when choosing a value field — and use a
[filter](/charts/filters) to separate spending from income when you want a
clean breakdown.
## Metric
A single headline number — for example, total spend this month.
| Option | Description |
| -------------------------------- | ------------------------------------------------------------------------------------------------------ |
| **Value** | The field to measure. |
| **Calculation** | Sum, Average, Min, or Max. |
| **Date field** & **Granularity** | Optional. Bucket the metric by day, week, month, quarter, or year. |
| **Compare to previous period** | Show the change versus the prior period, with an up/down indicator. |
| **Show increase as positive** | Controls whether an increase is styled as good (green) or bad (red) — useful for spending vs. revenue. |
## Bar
Compare a value across categories or over time.
| Option | Description |
| --------------- | --------------------------------------------------------------------------------------- |
| **Value** | The field to measure. |
| **X-Axis** | The field to plot along the bottom (a category, or a date field for a time series). |
| **Calculation** | How to aggregate values within each bar. |
| **Group By** | Optional. Split each bar into a series by a second field. |
| **Stacked** | When grouping, stack the series into a single bar instead of placing them side by side. |
## Line
Track one or more series over time.
| Option | Description |
| --------------- | ------------------------------------------------------- |
| **Value** | The field to measure. |
| **X-Axis** | Usually a date field; also supports categorical axes. |
| **Calculation** | How to aggregate values at each point. |
| **Group By** | Optional. Plot a separate line per value of this field. |
## Donut
Show how a total breaks down across categories.
| Option | Description |
| ----------------- | --------------------------------------------------------------------------------- |
| **Value** | The field to measure. |
| **Group By** | The field that defines each slice (for example, **Category**). |
| **Slice minimum** | Slices smaller than this share of the total are combined into an **Other** slice. |
Donut slices are sized by the absolute magnitude of each category's total, and the center shows the absolute combined total, so a spending breakdown reads naturally even though Finta stores expenses as negative numbers. Filter out income first for the cleanest breakdown.
# Create a Chart
Source: https://docs.finta.io/charts/create-a-chart
Build a chart from a Notion database, preview it live, and get an embed link.
You can create a chart from any Notion destination that has finished its first sync. Charts read from the databases Finta syncs into your Notion workspace, so make sure the data you want to chart is already there.
## Open the chart editor
In your [Finta dashboard](https://app.finta.io), select your Notion destination from the sidebar.
Select **Charts** under **Extensions**, then click **Create Chart**.
The editor has a live **Preview** on the left and the configuration panel on the right. The preview updates as you change the configuration.
The editor is designed for a larger screen. For the best experience, build
charts on a desktop or laptop.
## Configure the chart
Enter a **Title**. Use **Show Title?** to control whether the title appears
in the embedded chart.
Pick **Metric**, **Bar**, **Line**, or **Donut**. The configuration fields
below change to match the type — see [Chart types](/charts/chart-types).
Choose the Notion database to chart. This is the **Table** Finta syncs your
data into (for example, **Transactions**).
Choose the **Value** field to measure (such as **Amount**) and, depending on
the chart type, an **X-Axis** field, a **Group By** field, and a
**Calculation** (Sum, Average, Min, or Max).
Click the filter icon in the **Data** section to limit the rows the chart
includes. See [Filters](/charts/filters).
The live preview reads the first 100 rows from your database so it stays fast.
The published chart uses your full dataset.
## Save and embed
When the preview looks right, click **Create Chart**. Finta saves the chart and shows a **Chart Created** dialog containing the embed link:
```
https://app.finta.io/charts/
```
Copy that link and paste it into Notion (or anywhere that supports embeds). See [Embed in Notion](/charts/embed-in-notion) for the full walkthrough.
## Edit or delete a chart
From the **Charts** list you can:
* **Edit** — open any chart to change its configuration; the preview and embed update immediately.
* **Copy link** — grab the embed URL again without reopening the chart.
* **Delete** — remove one or more charts. Deleting a chart breaks any embeds pointing to it.
# Embed in Notion
Source: https://docs.finta.io/charts/embed-in-notion
Add a live Finta chart to any Notion page.
Every chart you create has a public embed link. Pasting that link into Notion renders the chart inline and keeps it up to date automatically.
## Get the embed link
When you create a chart, the **Chart Created** dialog shows its link. You can also copy it any time from the **Charts** list using **Copy link**, or by opening the chart and using the embed button.
The link looks like:
```
https://app.finta.io/charts/
```
## Add it to a Notion page
In your Notion page, type `/embed` and select **Embed**.
Paste your Finta chart link and click **Embed link**.
Drag the block's edges to size the chart within your page.
The chart renders directly in the page, matching Notion's light or dark appearance.
## How refreshing works
Finta caches each chart's data so embeds load quickly, and refreshes it in the background. The embedded chart shows when it was last updated, and includes a **Refresh** button to pull the latest data on demand.
The embed link is public — anyone with the link can view the chart. It shows
only the data in that single chart, not your account or other destinations.
Treat the link like any other shareable URL.
## Other tools
The embed link is a standard URL, so it also works anywhere that supports embedding a web page — including Coda, dashboards, and many wikis.
# Filters
Source: https://docs.finta.io/charts/filters
Narrow a chart down to exactly the rows you want to show.
Filters let you limit the data a chart includes — for example, a single account, one category, or a date range. They use the same field types and conditions as Notion's own database filters.
## Add a filter
In the chart editor, click the filter icon in the **Data** section.
Click **Add Filter**, then choose a **field**, a **condition**, and a
**value**.
Add additional rows to combine conditions. The preview updates as you go.
## Conditions by field type
The available conditions depend on the field you pick:
| Field type | Conditions |
| --------------- | ----------------------------------------------------------------------- |
| Text / Title | Is, Is Not, Contains, Starts With, Ends With, Is Empty, Is Not Empty |
| Number | Equals, Does Not Equal, Greater Than, Less Than (and or-equal variants) |
| Select / Status | Is, Is Not, Is Empty, Is Not Empty |
| Checkbox | Is checked / Is not checked |
| Date | Before, After, On or Before, On or After, Is Empty, Is Not Empty |
| Relation | Contains, Does Not Contain |
## Examples
**Category** Is Not **Income** — exclude income so a donut or bar shows a
clean expense breakdown.
**Account** Is **Checking** — chart a single account.
**Date** On or After a start date — focus on a recent period.
**IsPending** Is not checked — show only settled transactions.
Filters are saved with the chart, so the embedded version always reflects the
same view you built in the editor.
# Charts Overview
Source: https://docs.finta.io/charts/overview
Build live charts from your synced Finta data and embed them anywhere — starting with Notion.
Charts turn the financial data Finta syncs into your destination into live, embeddable visualizations. Build a chart once, then drop it into a Notion page (or anywhere that supports embeds) and it stays up to date automatically.
Charts are currently available for **Notion** destinations. Each chart reads
directly from one of the databases Finta syncs to your Notion workspace.
## How charts work
A chart is defined by three things:
1. **A source database** — one of the Notion databases Finta syncs (for example, your **Transactions** database).
2. **A configuration** — the chart type and which fields to measure and group by.
3. **An optional filter** — narrow the data down to exactly what you want to show (for example, a single account or category).
When you create a chart, Finta gives you a public embed link. That link renders the chart from your live data and refreshes on its own, so the people viewing it always see current numbers without you exporting or pasting anything.
## Chart types
A single headline number, with an optional comparison to the previous period.
Compare a value across categories or over time, grouped or stacked.
Track one or more series over time.
Show how a total breaks down across categories.
See [Chart types](/charts/chart-types) for how to configure each one.
## Where to find charts
Open a Notion destination from your [Finta dashboard](https://app.finta.io) and select **Charts** in the sidebar. From there you can create, edit, copy embed links for, and delete charts.
## Next steps
Walk through building your first chart end to end.
Add a live chart to any Notion page.
# Create a Destination
Source: https://docs.finta.io/destinations/create-destination
Set up a Notion, Airtable, Google Sheets, or Coda destination and start syncing your financial data in minutes.
A destination connects your bank accounts to a productivity tool. Finta creates the tables, keeps the data in sync, and sends you an email when the first sync is done.
To get started, go to your [Finta dashboard](https://app.finta.io) and click **New Destination**.
## Step 1: Choose your tool
Select the tool you want to sync data to:
| Tool | Authorization |
| ----------------- | --------------------------------- |
| **Notion** | OAuth |
| **Airtable** | OAuth |
| **Google Sheets** | OAuth |
| **Coda** | API token via the Finta Coda Pack |
Click the tile for your tool to continue.
## Step 2: Authorize access
Finta needs permission to create or write to content in your workspace.
**For Notion, Airtable, and Google Sheets:**
1. Click **Connect** to open the OAuth flow
2. Sign in to your account if prompted
3. Grant Finta the requested permissions
4. Select a connected account if you have more than one
Once connected, choose where Finta should write data:
* **Notion:** Select a page. New Finta databases will be created inside it.
* **Airtable:** Select a base. Finta will create or link tables within it.
* **Google Sheets:** Pick an existing spreadsheet or let Finta create a new one.
**For Coda:**
Coda uses the [Finta Coda Pack](https://coda.io/packs/finta) instead of OAuth. Enter your Finta API token when prompted inside Coda. See the Coda Pack instructions for the full setup flow.
## Step 3: Select accounts
Choose which bank accounts to include in this destination. All connected accounts are listed here, grouped by institution.
Select any combination of accounts. You can add more later from the destination settings.
If you don't have any bank connections yet, click **Add Bank Connection** to connect your first institution before continuing.
## Step 4: Configure tables
Finta gives you two ways to set up tables:
**Automatic (recommended)**
Pick what you want to track and Finta creates or links the tables automatically. Choose one or more:
* **View Account Balances** — institutions, accounts, and balance history
* **Track Spending** — accounts plus transactions and categories (requires a bank connection with transaction access)
* **Monitor Investments** — accounts, holdings, securities, and investment transactions (Plaid with investments enabled)
* **Manage Customers and Subscriptions** — Stripe customers, subscriptions, products, and prices
* **Review Invoices and Payments** — Stripe customers, invoices, line items, products, and prices
Only the options relevant to your connected accounts are shown.
**Manual**
Map Finta's data tables to existing tables in your workspace. Use this if you have a specific structure you want to preserve or if you're connecting to tables that already have data. Click **Manually set up tables** to switch to this mode.
## Step 5: Name your destination
Give the destination a nickname so you can identify it later (for example, "Business Finances — Notion" or "Personal Budget — Google Sheets").
You can also set a **sync start date** to control how far back Finta pulls historical data. By default, Finta syncs up to 2 years of transaction history, subject to institution limits and available history. Set a more recent date if you only want data from a certain point forward.
Click **Create Destination** to finish.
## What happens next
Finta starts your first sync immediately. Depending on how many accounts and years of history you selected, this can take a few minutes. You may receive a completion email depending on your notification settings.
After the first sync, Finta keeps your data up to date automatically. New transactions, updated balances, and investment changes flow into your destination without any manual work. You can also trigger a manual sync at any time from the destination page.
**Coda works differently.** Instead of Finta pushing data, you sync from within your Coda doc by clicking the sync button on the Finta pack tables.
## Next steps
Rename, configure, and manage your destination
Learn how syncs work and what data is available
# Custom Transaction Categories with Rules
Source: https://docs.finta.io/destinations/custom-transaction-categories
Override auto-assigned categories on transactions using the Rules engine. Assign your own category labels to any transaction based on merchant name, amount, or description.
Finta automatically assigns categories to your transactions based on what your bank reports. If you want to use your own category names instead — or assign categories that match your personal budget system — the **Rules** engine lets you do exactly that.
## How it works
A Rule has two parts:
* **Conditions** — the criteria a transaction must match (e.g., merchant name contains "Whole Foods")
* **Outcome** — what happens when a transaction matches (e.g., set Category to "Groceries")
When you run a rule, Finta looks at every transaction in your destination, applies the conditions, and updates any matching transactions.
## Setting up a rule
Go to your destination in Finta, then click **Rules** in the sidebar. Click **Create Rule** to start.
### Step 1: Add a condition
Choose one or more conditions to identify the transactions you want to categorize:
| Condition | What it matches |
| ------------------------ | ------------------------------------------------- |
| **Merchant Name** | The merchant name (e.g., "Whole Foods", "Amazon") |
| **Summary** | The transaction description |
| **Original Description** | The raw description from your bank |
| **Amount** | The transaction amount (inflow or outflow) |
| **Account** | A specific account |
| **Transaction Day** | Day of the month (1–31) |
Each condition supports operators like **contains**, **equals**, **starts with**, **greater than**, **regex**, and more. Multiple conditions are combined with AND logic.
**Example:** To match all grocery store visits at Whole Foods:
* Condition: **Merchant Name** → **contains** → `Whole Foods`
### Step 2: Set the outcome
Click **Next** to move to outcomes. Click **Add Outcome** and select **Update Category**.
A dropdown appears showing all categories currently in your destination's Categories table. Select the category you want to assign.
**Don't see the category you need?** Type it in the search box and click **Create \[Name] Category**. Finta will add it to your Categories table in real time and use it for this rule.
### Step 3: Run the rule
Click **Create Rule**. On the next screen, click **Run Rule** to apply it immediately to all existing transactions in your destination. Any transaction that matches your conditions will have its category updated.
New transactions that sync in the future will also have the rule applied automatically.
## Does the category need to exist first?
**When you have a Categories table configured:** the dropdown shows only categories that already exist in your destination. You can create new ones on the fly by typing the name — Finta creates the category entry and assigns it in one step.
**When you don't have a Categories table configured:** the outcome shows a plain text input. You can type any string, but since there's no Categories table to link to, the value won't connect to a category record.
For the best experience — especially in Notion and Airtable where Category is a relation field — make sure your destination has a Categories table set up.
## Worked example
**Goal:** Stop using Plaid's auto-category for grocery transactions and assign a custom "Groceries" label instead.
1. Go to your destination → **Rules** → **Create Rule**
2. Add condition: **Merchant Name** contains `Whole Foods`
3. Click **Next** → **Add Outcome** → **Update Category**
4. Type `Groceries` in the search box, then click **Create Groceries Category**
5. Click **Create Rule**, then **Run Rule**
Result: all existing Whole Foods transactions get "Groceries" as their category, and new ones will too.
## Tips
**Use multiple conditions for precision.** If a merchant name matches transactions you don't want to recategorize, add a second condition (like an amount range) to narrow the match.
**Rules run in priority order.** If a transaction matches multiple rules, the highest-priority rule wins. You can reorder rules from the Rules page.
**Rules apply at sync time.** After your initial run, rules automatically apply to new transactions as they come in — you don't need to re-run manually.
## Two kinds of rules
Finta has two rule layers that work together:
* **Transaction rules** apply to your data *stored in Finta*. They run when transactions sync into Finta and shape what every consumer sees: the API, the [MCP](/mcp/overview), and **every** destination. Manage them via the API (`/api/v2/rules`) or the MCP (`create_rule`, `run_rules`). They can set a category, set a merchant name, or hide a transaction. A transaction you've categorized by hand is never recategorized by a rule.
* **Destination rules** (the ones on this page) apply *when Finta writes to one specific destination*. They layer on top of transaction rules, so you can customize a single destination. For example, mapping to a different category name in Airtable, or filling a custom field that only exists in that table.
If you only use a destination, you only need destination rules. If you use the API or MCP (with [Storage Mode](/getting-started/storage-mode) on), transaction rules give you categorization that follows your data everywhere.
# Manage Destination
Source: https://docs.finta.io/destinations/manage-destination
Rename your destination, view settings, and manage your synced data in Finta.
After creating a destination, you can manage it from the destination page in your [Finta dashboard](https://app.finta.io). Click any destination in the sidebar to open its settings.
## Rename a destination
Click the destination name at the top of the page to open the edit dialog.
Type a new name and click **Save**. The name updates immediately across the sidebar and page heading.
# Destinations
Source: https://docs.finta.io/destinations/overview
Sync your financial data to Notion, Airtable, Google Sheets, or Coda. Finta pushes transactions, balances, and investment data to the tools you already use.
A destination is where your financial data goes. You connect your bank accounts on one side and your productivity tool on the other. Finta handles everything in between, keeping your data in sync automatically.
You can create multiple destinations to send the same bank data to different tools. Track personal spending in Notion while running business analytics in Google Sheets, all from the same bank connection.
## Supported destinations
| Destination | Syncs to | Authorization |
| ----------------- | --------------------------- | ------------------------- |
| **Notion** | Databases within a page | OAuth |
| **Airtable** | Tables within a base | OAuth |
| **Google Sheets** | Sheets within a spreadsheet | OAuth |
| **Coda** | Sync tables within a doc | API token (via Coda Pack) |
## What data can sync
The data types available depend on which bank connections you have:
**From Plaid, GoCardless, and Mercury connections:**
* **Accounts** — balances and account details across all your institutions
* **Transactions** — spending, income, and transfers with merchant names and categories
* **Holdings** — investment positions with current values (Plaid only)
* **Investment transactions** — buys, sells, and dividends (Plaid only)
**From Stripe connections:**
* **Customers** — your Stripe customer records
* **Products and prices** — your product catalog
* **Subscriptions** — active and past subscriptions with line items
* **Invoices** — invoice records with line items
## How syncs work
When you create a destination, Finta sets up the tables and fields in your chosen tool automatically. Your first sync runs immediately after setup.
After that, syncs happen automatically whenever your bank reports new activity. New transactions, updated balances, and investment changes flow into your destination without any manual work. You can also trigger a manual sync anytime from the destination page.
**Coda works differently.** Coda destinations use the Finta Coda Pack with sync tables. Instead of Finta pushing data, you sync from within your Coda doc by clicking the sync button on the Finta pack tables.
## Automatic vs. manual table setup
When creating a destination, you can choose between two configuration methods:
**Automatic (recommended):** Pick what you want to track (spending, balances, investments, Stripe data) and Finta creates the tables and fields for you.
**Manual:** Map Finta's data tables to existing tables in your workspace. Use this if you have a specific structure you want to preserve or if you're connecting to tables that already have data.
## Next steps
To get started, create a destination from your Finta dashboard. Select your tool, authorize access, and Finta will handle the rest. You can also trigger a manual sync at any time from the destination page.
# Pricing & Plans
Source: https://docs.finta.io/getting-started/pricing
Finta offers a 7-day free trial, a Standard plan for personal use, and a Pro plan for power users and businesses. No credit card required to start.
Finta has two paid plans plus a free trial. Every new account starts with full access for 7 days, no credit card required.
## Free trial
When you create an account, you get 7 days to try everything Finta offers. The trial includes all features with no restrictions. You can connect banks, set up destinations, create rules, and run syncs just like a paid user.
If you don't subscribe before the trial ends, your bank connections are disconnected. Your destination configuration and sync history are preserved, but you'll need to reconnect your banks when you subscribe.
## Plans
| | Standard | Pro |
| --------------------- | --------- | ---------- |
| **Monthly** | \$7/month | \$15/month |
| **Annual** | \$70/year | \$150/year |
| **Bank connections** | Up to 10 | Unlimited |
| **Destinations** | Unlimited | Unlimited |
| **AI categorization** | ✓ | ✓ |
| **Rules engine** | ✓ | ✓ |
| **API access** | — | ✓ |
| **Priority support** | — | ✓ |
Both plans include all data types (transactions, balances, holdings, investment transactions) and all destination integrations (Notion, Airtable, Google Sheets, Coda).
A bank connection is one institution, not one account. If you have a checking and savings account at the same bank, that counts as one connection.
## How to subscribe
1. Go to **Settings → Billing** in the Finta dashboard
2. Choose Standard or Pro
3. Toggle between monthly and annual billing
4. Complete payment through Stripe
Annual billing saves you roughly 17% compared to paying monthly.
## Managing your subscription
Active subscribers can manage their subscription by clicking **Manage Billing** on the Settings → Billing page. This opens the Stripe billing portal where you can:
* Update your payment method
* Switch between monthly and annual billing
* Upgrade from Standard to Pro
* View past invoices
* Cancel your subscription
If you cancel, you keep access until the end of your current billing period. Your bank connections and destinations stay configured, so you can resubscribe later without setting everything up again.
## Next steps
Set up your first sync in under 5 minutes
Questions? Reach out to our team
# Quick Start Guide
Source: https://docs.finta.io/getting-started/quickstart
Create your Finta account, connect your bank, and set up your first destination in minutes.
This guide walks you through setting up Finta from scratch. By the end, your financial data will be syncing automatically to the tool of your choice.
## Step 1: Create your account
Go to [app.finta.io](https://app.finta.io) and create a free account. You can sign up with Google or enter your email to receive a one-time login code.
New accounts start with a free trial so you can explore everything before subscribing.
## Step 2: Connect your bank accounts
After signing up, you'll be prompted to connect your first bank account.
Click **Connect Account** and search for your bank. Finta supports over 10,000 banks and financial institutions through several providers:
* **Plaid** for US banks, credit cards, and investment accounts
* **GoCardless** for European banks via open banking
* **Mercury** for Mercury business bank accounts
* **Stripe** for Stripe charges, customers, and invoices
Select your institution from the search results and follow the prompts to securely log in. Finta only has read-only access to your data and never stores your bank credentials.
You can connect multiple accounts from different banks. There's no limit during your trial.
## Step 3: Set up a destination
A destination is where your financial data gets synced to. Finta supports four tools:
* **Notion** — syncs to databases
* **Airtable** — syncs to bases
* **Google Sheets** — syncs to spreadsheets
* **Coda** — syncs via the Finta pack
After connecting your bank, the onboarding flow walks you through destination setup:
### Choose your tool
Select which tool you want to sync your data to.
### Authorize access
Connect your account for the tool you selected. For Notion, Airtable, and Google Sheets, you'll authorize via OAuth. For Coda, you'll enter an API token.
Then choose whether to let Finta create a new workspace (spreadsheet, database, or page) for you, or select an existing one.
### Select accounts
Choose which of your connected bank accounts should sync to this destination. All accounts are selected by default, but you can uncheck any you want to exclude.
### Pick what to sync
Choose what you want to use this destination for. Options depend on your connected accounts:
* **View Account Balances** — track balances across all accounts
* **Track Spending** — sync transactions for budgeting and expense tracking
* **Monitor Investments** — sync holdings and investment transactions
* **Manage Customers and Subscriptions** — Stripe customer and subscription data
* **Review Invoices and Payments** — Stripe invoice data
Finta creates the tables and structure for you automatically based on your selections.
### Configure settings
Give your destination a name and set a sync start date. The start date controls how far back Finta pulls historical transactions (defaults to 7 days ago, but you can change it).
Click **Create Destination** and Finta kicks off your first sync.
## Step 4: Wait for your first sync
Your initial sync starts immediately after setup. Depending on how many accounts you connected and how far back your start date goes, this can take a few minutes.
You'll receive an email when your first sync is complete. You can also check progress from your destination page in the Finta dashboard.
## What happens next
After the first sync, your data stays up to date automatically. Plaid connections sync whenever your bank reports new activity. Mercury, GoCardless, and Stripe connections sync on a regular schedule. No manual work required.
From your destination page, you can:
* **Manually refresh** your data anytime using the sync button
* **Add more accounts** to an existing destination
* **Create additional destinations** to send the same data to multiple tools
## Optional: Set up rules
Once your data is flowing, you can create rules to automatically categorize and clean up your transactions. Rules run every time new data syncs, so transactions get categorized without any manual effort.
Head to your destination page to start creating rules.
# Storage mode
Source: https://docs.finta.io/getting-started/storage-mode
Storage mode allows Finta to store your financial data to improve uptime and unlock advanced features.
By default, Finta works in **pass-through mode** — when a sync runs, we fetch data directly from your bank or payment provider and push it to your destination. It works great, but Finta isn't holding onto any of your data in between.
**Storage mode** changes that. When it's on, Finta keeps a copy of your financial data on our end. That opens up a few things that aren't possible in pass-through mode:
* **API and MCP access** — use the Finta API or connect Finta as an MCP tool for AI assistants and developer workflows
* **Syncs keep running through bank errors** — if a bank connection has an issue, your last-known data is already stored, so your destinations stay up to date
* **Better uptime when providers are down** — if your bank's API has an outage, Finta can still serve your data instead of failing
## What Finta stores
When storage mode is on, Finta maintains the following:
| What | Description |
| -------------------- | -------------------------------------------------------- |
| **Bank connections** | Your connected accounts and their status |
| **Accounts** | All of your accounts, including ones you've closed |
| **Transactions** | Your transaction history |
| **Categories** | Spending categories attached to your transactions |
| **Securities** | Instruments in your investment accounts |
| **Holdings** | Your current portfolio positions and investment activity |
## Getting started
Turn storage mode on from [Settings → Data](https://app.finta.io/settings/data). Finta will immediately start pulling in your history — you can watch the progress per connection on that page. Once the backfill is done, storage mode is fully active.
## FAQs
### How long does the initial sync take?
If you have a lot of history, it could take a few minutes. Head to [Settings → Data](https://app.finta.io/settings/data) for a real-time status update on each connection.
### What happens when I turn storage mode off?
We delete all of your stored financial data from our database — transactions, holdings, categories, everything. Your bank connections and accounts themselves are not affected, so your destinations will still sync normally. We just won't be holding a copy of your data anymore.
When we say delete, we mean it. There are no soft deletes. If you turn storage mode off and then back on again, Finta will start a fresh backfill from scratch.
### What happens if I close my account?
Closing your Finta account automatically deletes all of your stored financial data as well. Same rule applies — it's a hard delete, not an archive.
# What is Finta?
Source: https://docs.finta.io/getting-started/what-is-finta
Finta syncs your financial data to the tools you already use. Connect banks, credit cards, investments, and payment processors to Notion, Airtable, Google Sheets, and Coda.
Finta connects your financial accounts to the productivity tools you already use. It pulls transactions, balances, and investment data from your banks and payment processors, then syncs everything to Notion, Airtable, Google Sheets, or Coda automatically.
No CSV exports. No manual data entry. Your financial data stays up to date in the tools where you actually work.
## How it works
1. **Connect your accounts** — Link your banks, credit cards, and investment accounts through Plaid, or connect directly to Stripe, Mercury, or GoCardless.
2. **Choose a destination** — Pick where you want your data to go: Notion databases, Airtable bases, Google Sheets spreadsheets, or Coda docs.
3. **Sync automatically** — Finta keeps your data in sync on a schedule you control. New transactions, updated balances, and investment changes flow into your destination without any manual work.
## Data providers
Finta supports multiple ways to connect your financial accounts:
| Provider | What it connects |
| -------------- | ---------------------------------------------------------------------------------------------- |
| **Plaid** | 12,000+ banks and financial institutions (checking, savings, credit cards, investments, loans) |
| **Stripe** | Stripe charges, customers, invoices, and Issuing transactions |
| **Mercury** | Mercury bank accounts for startups and businesses |
| **GoCardless** | Open banking connections for European bank accounts |
## Destinations
Your financial data can sync to any of these tools:
* **Notion** — Syncs to databases with full support for properties, relations, and formulas
* **Airtable** — Syncs to bases with custom fields, linked records, and automations
* **Google Sheets** — Syncs to spreadsheets with support for custom formulas
* **Coda** — Available as a native Coda pack with sync tables
You can connect the same accounts to multiple destinations at once. Track personal spending in Notion while running business analytics in Google Sheets, all from the same bank connection.
## Key features
### Rules engine
Create custom rules that automatically categorize and transform your transactions as they sync. Match transactions by name, amount, or other criteria, then apply categories, rename merchants, or tag expenses. Rules run every time new data syncs, so your data stays organized without manual work.
### Charts
Visualize your financial data with embeddable charts in Notion. See income vs. expenses, spending by category, and account balance trends directly inside your workspace.
### Multi-account management
Connect unlimited accounts across all your financial institutions and manage them from a single dashboard. Route different accounts to different destinations based on how you want to organize your data.
## Security
Finta is designed with a read-only approach — it can read your financial data but cannot move money or modify your accounts. Your bank credentials are never stored by Finta directly. All bank connections are handled by Plaid, Stripe, Mercury, or GoCardless, each of which maintains their own security infrastructure and compliance programs.
Data transferred between your accounts and your destinations is encrypted in transit. For full details on how your data is handled, see our [Privacy Policy](https://finta.io/privacy) and [Terms of Service](https://finta.io/terms).
## Next steps
Get started with Finta
Questions? Reach out to our team
# Introduction
Source: https://docs.finta.io/introduction
Welcome to Finta documentation
# Welcome to Finta
Finta syncs your financial data from banks and payment processors to your favorite productivity tools like Airtable, Notion, Google Sheets, and Coda.
This documentation is currently being rebuilt. Check back soon for comprehensive guides and tutorials.
## Need Help?
* Email us at [hello@finta.io](mailto:hello@finta.io)
* Join our [Discord community](https://link.finta.io/discord)
# Set up your Finta GPT
Source: https://docs.finta.io/mcp/chatgpt
Connect your Finta financial data to a personal ChatGPT assistant in a few minutes.
Build a personal ChatGPT that can read your Finta financial data and help you organize it — spot spending patterns, find subscriptions, categorize transactions, and more. The GPT is private to your account and uses your personal API key.
Your financial data is sent to OpenAI to generate responses. Review [OpenAI's privacy policy](https://openai.com/policies/privacy-policy) to understand how they handle it.
## Prerequisites
* A Finta account on a paid plan (API access requires Standard or Pro)
* A ChatGPT account (Plus or higher — Custom GPTs require a paid plan)
## Step 1 — Get your Finta API key
1. Go to [app.finta.io/settings/api](https://app.finta.io/settings/api).
2. Click **Create API key**, give it a name (e.g. "My GPT"), and copy the key.
Generating an API key automatically enables **Storage Mode**, which is required for the GPT to read your data. If you had Storage Mode off, Finta begins syncing your accounts in the background.
## Step 2 — Create a new Custom GPT
1. In ChatGPT, click your profile icon → **My GPTs** → **Create a GPT**.
2. Skip the **Create** tab and go straight to **Configure**.
3. Give your GPT a name and description, e.g.:
* **Name:** Finta
* **Description:** Query my personal Finta financial data.
## Step 3 — Add the Finta action
1. Scroll down to **Actions** and click **Create new action**.
2. In the **Schema** box, click **Import from URL** and paste:
```text theme={null}
https://app.finta.io/api/v2/openapi.chatgpt.json
```
ChatGPT imports the schema and shows the available operations.
3. Under **Authentication**, choose **API Key**:
* **Auth Type:** Bearer
* **Header Name:** `Authorization`
* **API Key:** paste the Finta API key you copied in Step 1
4. Click **Save** at the top right.
## Step 4 — Add the GPT instructions
Go back to **Configure**, paste the following into the **Instructions** box, and click **Save**:
```
You are Finta's assistant. You can read the user's financial data and make safe updates through the Finta actions.
Writes: For any write action (updating a transaction's category, batch updating transactions, creating or updating categories), first summarize the intended change and ask the user to confirm — unless the user has already explicitly confirmed the exact change in the same message. For batch updates, identify and summarize the affected records before making the change. After a write, report exactly what the API says changed; do not invent or infer additional changes. Generate one UUID per intended write and reuse the same idempotency_key for all retries of that write so retries don't double-apply.
Never delete data, and never modify billing, subscriptions, credentials, or bank connections. You cannot change transaction amounts or account ownership.
Analysis: When analyzing spending, income, or net worth, state the date range and accounts included. Use listTransactions with a date range whenever the user names a period (this month, last month, last 90 days, etc.) and listCategories to explain spending groups. Do not give tax, legal, or investment advice as certainty.
```
## Step 5 — Test it
Click **Preview** (top right) and try a few prompts:
* "What did I spend the most on this month?"
* "Find my recurring subscriptions."
* "Show my uncategorized transactions from the last 30 days."
* "Categorize all Sweetgreen transactions this month as Restaurants."
* "What changed in my net worth over the last 90 days?"
The GPT will call Finta's API to answer. If it asks you to sign in or shows an auth error, double-check that you pasted the API key correctly in Step 3.
## What the GPT can do
| Action | Details |
| --------------------------- | ------------------------------------------- |
| Read accounts & balances | Current balances, balance history over time |
| Read transactions | Filter by date, category, merchant, amount |
| Read holdings & investments | Securities, investment transactions |
| Categorize transactions | Update one or batch-update many |
| Manage categories | Create and rename categories |
The GPT cannot move money, delete data, or access billing or bank credentials.
## Keeping your data in sync
The GPT reads from Finta's stored data. Finta syncs your accounts automatically (typically nightly).
## Revoking access
To revoke the GPT's access, delete the API key from [app.finta.io/settings/api](https://app.finta.io/settings/api). The GPT will stop working immediately. You can also delete the Custom GPT from ChatGPT at any time.
# Connect your AI client
Source: https://docs.finta.io/mcp/connect
Add Finta MCP to Cursor, Claude Desktop, or any MCP client using OAuth.
Finta MCP uses OAuth for authentication. On first use, your client opens a Finta sign-in window — approve access and the connection is remembered.
**Server URL (all clients):**
```text theme={null}
https://mcp.finta.io/mcp
```
## Cursor
Add Finta to `~/.cursor/mcp.json`:
```json theme={null}
{
"mcpServers": {
"finta": {
"url": "https://mcp.finta.io/mcp"
}
}
}
```
Restart Cursor or reload MCP servers. Cursor prompts for OAuth the first time you use Finta — sign in to Finta and approve access.
Some Cursor versions also accept an HTTP transport with an explicit type:
```json theme={null}
{
"mcpServers": {
"finta": {
"type": "http",
"url": "https://mcp.finta.io/mcp"
}
}
}
```
## Claude Desktop
In Claude Desktop, open **Settings → Connectors → Add custom connector** and add a remote (HTTP) server with this URL:
```text theme={null}
https://mcp.finta.io/mcp
```
Claude opens the Finta OAuth flow automatically on first connection. The same custom-connector flow works in Claude on the web.
## Claude Code
Add Finta as an HTTP MCP server from your terminal:
```bash theme={null}
claude mcp add --transport http finta https://mcp.finta.io/mcp
```
The first time you use a Finta tool, Claude Code prompts you to authenticate — sign in to Finta and approve access.
## VS Code Copilot
Add Finta to `.vscode/mcp.json` in your workspace (or your user settings):
```json theme={null}
{
"servers": {
"finta": {
"type": "http",
"url": "https://mcp.finta.io/mcp"
}
}
}
```
Reload MCP servers, then approve the Finta OAuth sign-in when prompted.
## Other clients
Any client that supports remote MCP over HTTP can connect with the same URL (`https://mcp.finta.io/mcp`), including OpenAI Codex and other MCP-compatible assistants. Point the client at the URL and complete the Finta sign-in when prompted.
## Manage your connections
You can connect more than one AI client at the same time — each sign-in is its own connection. Manage them all from the **MCP** page in the Finta dashboard ([app.finta.io/mcp](https://app.finta.io/mcp)):
* **Switch between connected clients** — every connected tool appears in the list; select one to see its details.
* **Choose which accounts each client can read** — leave *Share all accounts* on to grant access to every account (including ones you add later), or turn it off to pick specific accounts. Changes are saved when you click **Save** and take effect immediately — there's no need to disconnect and re-run the OAuth flow.
* **Disconnect a tool** — revokes its access right away.
During the initial sign-in you can also choose which accounts a client may access on the consent screen; the MCP page lets you change that selection at any time afterward.
# FAQ
Source: https://docs.finta.io/mcp/faq
Common questions about Finta MCP, Storage Mode, authentication, and supported clients.
## Why do I need Storage Mode?
MCP reads from **Finta's stored copy** of your financial data — the same storage layer that powers the Finta API — not directly from your bank on every question. Storage Mode keeps accounts, transactions, balances, and investments synced so tools can answer quickly without provider round-trips.
Turn Storage Mode on from [Settings → Data](https://app.finta.io/settings/data). See [Storage mode](/getting-started/storage-mode) for what Finta stores and how backfill works.
## How do I authenticate?
Finta MCP uses **OAuth** — there's no token to copy or paste. The first time your client connects, it opens a Finta sign-in window; approve access and the connection is remembered. You can see and revoke connected apps anytime from [Settings → MCP](https://app.finta.io/settings/mcp).
## I'm getting an auth error in Cursor or Claude
Try these steps:
1. Remove the Finta MCP server from your client config.
2. In the Finta dashboard, open [Settings → MCP](https://app.finta.io/settings/mcp) and revoke the old connection under **Connected apps** if it's shown.
3. Add the server again with URL `https://mcp.finta.io/mcp` and complete the OAuth sign-in flow from scratch.
Also confirm MCP is enabled and your subscription is active — both are required for tool calls to succeed.
## Which AI clients are supported?
Any client that supports the MCP specification over HTTP can connect to Finta, including:
* Cursor
* Claude Desktop
* OpenAI Codex
* VS Code Copilot (with MCP support)
* Other MCP-compatible assistants and IDEs
## Can MCP move money or make changes?
Finta MCP **never moves money** and never changes your bank connections or destination settings. It can read your financial data and help you stay organized: categorize transactions, manage the spending categories you've created, and create, update, or close **manual accounts** — accounts you track by hand, not ones synced from a bank. Bank-synced accounts stay read-only. See [Available tools](/mcp/tools) for the exact read and write tools.
## Can I connect more than one AI client?
Yes. Each client you sign in is its own connection, and they can all be active at once. Open the **MCP** page in the dashboard ([app.finta.io/mcp](https://app.finta.io/mcp)) to switch between your connected clients and manage each one independently.
## Can I change which accounts a client can see after connecting?
Yes — you don't have to reconnect. On the **MCP** page, select the client and use **Account access**: leave *Share all accounts* on to share everything (including accounts you add later), or turn it off to pick specific accounts. Changes are saved when you click **Save** and apply to the client's next request.
# Overview
Source: https://docs.finta.io/mcp/overview
Query your live Finta financial data from Claude, Cursor, Codex, and other MCP-compatible AI tools.
Finta's MCP server lets AI tools read your stored financial data — accounts, transactions, balances, holdings, investment activity, and bank connection status — and help you organize it: categorize transactions and manage the manual accounts and categories you create. Connect once from Cursor, Claude Desktop, Codex, VS Code Copilot, or any client that supports the [Model Context Protocol](https://modelcontextprotocol.io), then ask questions in natural language. Finta never moves money.
You can connect several AI clients at once and control which accounts each one can read — manage everything from the **MCP** page in the dashboard ([app.finta.io/mcp](https://app.finta.io/mcp)). See [Manage your connections](/mcp/connect#manage-your-connections).
## Requirements
* **Active Finta subscription** — MCP is available on paid plans.
* **Storage Mode enabled** — MCP reads from data Finta has already synced and stored. It does not call your bank in real time on each tool call. That keeps responses fast and predictable for AI workflows. If Storage Mode is off when you enable MCP, Finta can turn it on and backfill your connections automatically.
Learn more about what gets stored in [Storage mode](/getting-started/storage-mode).
## MCP server URL
```text theme={null}
https://mcp.finta.io/mcp
```
Use this URL when adding Finta to your MCP client.
## Get started
1. Turn on [Storage Mode](https://app.finta.io/settings/data) if it is not already on.
2. Open [MCP](https://app.finta.io/mcp) in the Finta dashboard and copy the server URL.
3. Follow the [connection guide](/mcp/connect) for your AI client — most clients sign you in with OAuth automatically, so there's no token to copy.
Once connected, see [Available tools](/mcp/tools) for what you can ask your assistant to do.
# Available tools
Source: https://docs.finta.io/mcp/tools
MCP tools for reading accounts, transactions, balances, holdings, and investments — and for categorizing your transactions.
Once connected, your AI tool can call any of these tools. You do not need to invoke them manually — the client discovers them and chooses the right tool based on your questions.
Tools read from Finta storage (requires [Storage Mode](/getting-started/storage-mode)). High-volume tools support filters and pagination via cursor parameters in the tool schema. Most tools are read-only; a small set of **write** tools let your assistant categorize transactions, manage your spending categories, and manage manual accounts. Finta MCP never moves money or changes your bank connections or destination settings.
## Read tools
| Tool | What it does | Example prompt |
| ------------------------------- | -------------------------------------------------------------------------------- | ----------------------------------------------- |
| `whoami` | Returns your Finta user and MCP setup status | "Am I connected to Finta?" |
| `list_bank_connections` | Lists your bank connections with status and error state | "Which of my banks are connected?" |
| `list_accounts` | Lists bank accounts with balances | "What accounts do I have?" |
| `get_account` | Gets a single account by ID | "Show me details for my Chase checking account" |
| `list_liabilities` | Lists accounts with debt details, payment amounts, due dates, and interest rates | "Show me all my debt" |
| `list_transactions` | Lists cash transactions, filterable by account, date, and category | "What did I spend on groceries last month?" |
| `list_categories` | Lists transaction categories | "What categories does Finta use?" |
| `list_category_groups` | Lists the groups categories are organized into | "How are my categories grouped?" |
| `list_accounts_balance_history` | Daily balance history across accounts | "Show me my net worth over the last 6 months" |
| `get_account_balance_history` | Daily balance history for one account | "How has my savings account balance changed?" |
| `list_securities` | Lists securities in investment accounts | "What stocks do I hold?" |
| `list_holdings` | Lists investment positions with quantities | "What's in my portfolio?" |
| `list_investment_transactions` | Lists investment transactions (buys, sells, dividends) | "What trades did I make this year?" |
Good liability prompts:
* "What are my minimum payments this month?"
* "What's the interest rate on my student loans?"
* "Show me all my debt"
## Write tools
These tools change your data in Finta. They're limited to managing the accounts and categories you've created and categorizing transactions.
| Tool | What it does | Example prompt |
| --------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------- |
| `update_transaction` | Sets or clears the category on a transaction | "Categorize that Amazon charge as Office Supplies" |
| `batch_update_transactions` | Updates many transactions at once (up to 250) | "Categorize all my Starbucks transactions as Coffee" |
| `create_account` | Creates a manual account, including liability accounts | "Add a manual account for my \$12,000 car loan" |
| `update_account` | Updates a manual account's name, balance, or liability data | "Set my cash account balance to \$400" |
| `delete_account` | Closes (soft-deletes) a manual account | "Close my old manual savings account" |
| `create_category` | Creates a new manual category | "Add a category called Software Subscriptions" |
| `update_category` | Renames or edits a category's group/description (Mercury categories are read-only) | "Rename my Misc category to Uncategorized" |
| `delete_category` | Deletes a manual category | "Delete the Test category" |
| `batch_update_categories` | Updates many categories at once (up to 250) | "Group all my software categories together" |
Write tools only affect data you manage yourself:
* **Accounts** — only manual (user-created) accounts can be created, updated, or deleted. Accounts synced from your bank or payment provider are read-only, and manual account changes sync automatically to any connected destinations.
* **Categories** — any category's name, group, or description can be edited except Mercury categories, which are read-only and managed by the provider. Only manual (Finta-created) categories can be created or deleted. You can also change the category assigned to any transaction.
Good manual-account prompts:
* "Create a manual mortgage account for my house at 6.5% interest with a \$300,000 balance"
* "Update my manual credit card balance to \$1,500"
* "Track my cash on hand as a manual account with \$250"
## Rule tools
Rules let your assistant set up automatic categorization that sticks. A rule has **conditions** (e.g. merchant name contains "Whole Foods") and **outcomes** (set the category, set the merchant name, or hide the transaction). Rules apply to your stored transactions now, when you run them, and automatically as new transactions sync in.
| Tool | What it does | Example prompt |
| ------------- | ----------------------------------------------------------------------------- | -------------------------------------------- |
| `list_rules` | Lists your transaction rules | "What rules do I have set up?" |
| `create_rule` | Creates a rule that auto-categorizes, renames, or hides matching transactions | "Always categorize Whole Foods as Groceries" |
| `run_rules` | Applies rules to your existing transactions and reports how many changed | "Apply my rules to all my past transactions" |
A typical flow: the assistant calls `create_rule` (using a category id from `list_categories` or `create_category`), then `run_rules` to backfill your history. When several rules match, the one with the lowest priority number wins. A transaction you've categorized by hand is never recategorized by a rule.
# Categories
Source: https://docs.finta.io/your-data/categories
One set of categories across every bank — view, create, group, and rename the categories Finta assigns to your transactions.
Categories are how you group your transactions. The Categories page shows every category you can use: the starter set Finta gives you, the ones you create yourself, and any your banks add. Finta, your [rules](/your-data/rules), and the [API](/api/v2/overview) and [MCP](/mcp/overview) all assign these categories to transactions.
Categories live under **Your data** in the sidebar and require [storage mode](/getting-started/storage-mode).
## One set of categories, every bank
When you turn on storage mode, Finta creates a starter set of categories — Groceries, Restaurants, Rent, Paycheck, and so on — already sorted into groups like **Food & Dining** and **Housing**.
Your banks' own categorization maps onto that same set as transactions sync in, so a checking account at one bank and a credit card at another both file their coffee runs under **Coffee & Tea**. You get one taxonomy to rename, group, and build [charts](/charts/overview) on, instead of one per bank.
A few things sit outside that set:
* **Bank categories with no good match** keep the name your bank gave them, rather than being filed somewhere misleading — but they still land in one of your groups. They show up on this page alongside the rest, and you can rename and regroup them like any other.
* **Mercury** manages its own categories and re-sends them on every sync, so Mercury categories are read-only in Finta for now.
* **Transactions that arrive with no category at all** stay uncategorized until you or a [rule](/your-data/rules) sets one.
## Create a category
1. Go to **Your data → Categories** and click **New category**.
2. Enter a name. For **Group**, pick one of your existing groups from the suggestions, or type a new name to create one.
3. Click **Create**.
## Groups
A group collects related categories — Groceries, Restaurants, and Coffee & Tea all sit under **Food & Dining**.
Groups are records of their own, not a label copied onto each category. So:
* **One group per name.** Point two categories at the same group and both land in the same one. Capitalization and extra spaces don't spawn a duplicate — "food & dining" and "Food & Dining" are the same group.
* **A rename reaches everything.** Rename a group and every category in it comes along; nothing is left behind on the old name.
* **Order is yours to set.** Each group carries a sort order, so your groups can be listed in an order you choose rather than alphabetically.
* **Deleting a group keeps its categories.** They simply become ungrouped, and their transactions stay put.
In the app you set a category's group when you create it. Renaming, reordering, and deleting the groups themselves happens through the [API](/api/v2/overview), at `/v2/category-groups`.
Over [MCP](/mcp/overview), `list_category_groups` lists your groups, and `create_category` and `update_category` set a category's group by name — so you can ask your assistant to move a category into a group, or to start a new one, without leaving the chat. Mercury's categories are the exception here too: they're read-only, so they can't be moved.
## Rename a category
Open a category's menu and choose **Rename**. You can rename the categories Finta created and the ones synced from your bank alike — Mercury's are the one exception.
Your edits stick. Renaming a category — or moving it to a different group — survives future syncs; Finta won't overwrite it with the bank's original name.
## Delete a category
You can delete categories you or Finta created. Open the category's menu and choose **Delete**. Any transactions in that category become uncategorized.
Categories synced from your bank can't be deleted, since your bank keeps sending them. You can always rename them instead.
## How transactions get a category
A transaction's category can come from three places, in order of precedence:
1. **Your bank**, which provides a default category when it's available. It lands in your set of categories as described [above](#one-set-of-categories-every-bank).
2. **A rule**, which can override the bank's category. See [Rules](/your-data/rules).
3. **You**, by setting it yourself in the app, the API, or the MCP. A category you set by hand always wins, and rules won't change it.
# Rules
Source: https://docs.finta.io/your-data/rules
Automatically categorize, rename, or hide transactions with rules that run on your stored data.
Rules let you clean up your transactions automatically. Each rule watches for transactions that match conditions you set, then applies an outcome, like setting a category or hiding a transaction.
Rules run on the data Finta stores for you, so they require [storage mode](/getting-started/storage-mode). Because they shape your stored data, their results show up everywhere your data goes: in the app, the [API](/api/v2/overview), the [MCP](/mcp/overview), and every destination you sync to.
Find Rules under **Your data** in the sidebar (it appears once storage mode is on).
## How a rule works
A rule has two parts:
* **Conditions** decide which transactions match. You can match on the merchant, description, amount, account, and more. When you add more than one condition, a transaction has to match all of them.
* **Outcomes** decide what happens to a matching transaction. A rule can set the category, set the merchant name, or hide the transaction.
## Create a rule
1. Go to **Your data → Rules** and click **New rule**.
2. Under **When**, choose a condition and fill in a value. Add more conditions to narrow things down.
3. Under **Then**, choose one or more outcomes.
4. Click **Save rule**.
### Conditions you can match on
| Condition | What it matches |
| ------------------------ | --------------------------------------------- |
| **Merchant** | The merchant name (for example, "Sweetgreen") |
| **Summary** | The transaction description |
| **Original Description** | The raw description from your bank |
| **Amount** | The amount, as an inflow or outflow |
| **Account** | A specific bank account |
| **Transaction Day** | The day of the month (1 to 31) |
### Outcomes you can apply
| Outcome | What it does |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Set category** | Assigns one of your [categories](/your-data/categories) |
| **Set merchant** | Replaces the merchant name (great for cleaning up messy bank descriptions) |
| **Hide transaction** | Excludes the transaction from your default views and from default API and MCP results (you can still opt in to hidden items with `includeHidden`) |
## Run a rule
New rules apply automatically to transactions as they sync in. To apply a rule to transactions you already have, click **Run all rules**, or open a single rule's menu and choose **Run this rule**. Finta tells you how many transactions were scanned, matched, and updated.
Running rules is safe to repeat. A transaction that already matches the desired outcome is left as is.
## Good to know
* **You're always in control.** If you set a transaction's category by hand (in the app, the API, or the MCP), a rule will never change it.
* **When two rules conflict, the lower priority number wins.** Set a rule's priority in the editor.
* **Rules vs. Sync rules.** The rules here apply to your stored data and reach every destination. If you also sync to a destination, that destination has its own **Sync rules** for customizing what gets written there. See [Custom transaction categories](/destinations/custom-transaction-categories).