Documentazione API Finch

Read your own Finch data from your own scripts, spreadsheets, and dashboards: accounts, balances, and transactions — read-only, with a personal API key.

Getting started

  1. 1Download the Finch app from the App Store or Google Play and complete onboarding.
  2. 2On the Home screen, tap the Menu icon (three lines, top right), scroll down, and select API keys.
  3. 3Turn on API access and tap Generate API key. Follow the steps below.
  4. 4Copy the key (it is shown once) and use it with the Quickstart below.

Overview

Plans
API access is available on all paid plans (Premium, Premium Europe, Platinum, and referral Premium). On the free plan, the app displays an upgrade prompt. If a plan lapses, an existing key stops working (PAID_PLAN_REQUIRED).
What it reads
Accounts, balances, transactions, and your AI allowance. Every current endpoint is GET; nothing can be modified or written.
Authentication
Include your personal API key in the Authorization header: Authorization: Bearer fnch_sk_live_...
Personal use only
Keys are restricted to the account holder’s personal access. Every response includes: X-Finch-Data-Policy: personal-use-only
Freshness
Reading an account automatically triggers a bank refresh if the data is stale, subject to bank-specific rate limits. See Data Freshness.

Get your API key

API keys are generated solely within the Finch app. There is no web sign-in.

  1. 1
    Go to Menu › API keys in the Finch app and switch on API access.
  2. 2
    Tap Generate API key.
  3. 3
    Name it (up to 60 characters, e.g., “My laptop”).
  4. 4
    Select Permissions (at least one):
    • accounts:read — accounts and balances
    • transactions:read — transactions
  5. 5
    Choose Expiry: 30, 60, 90 days (90 days maximum).
  6. 6
    Confirm Personal Access: the key is strictly for your own use and will not be shared or connected to third-party apps or services.
  7. 7
    Copy the key. It is displayed once and copied to your clipboard. Finch stores only a secure hash, so it cannot be displayed again. If misplaced, revoke it and generate a new key.
Finch app: Menu › API keys
Menu › API keys
Finch app: Generate API key
Generate API key
Finch app: Name your key
Name your key
Finch app: Choose permissions
Choose permissions

Management rules

  • Key limit: maximum 5 active keys. Generating a 6th fails until an existing key expires or is revoked.
  • Immediate revocation: revoke individually or via Revoke all keys. The change takes effect instantly.
  • Audit information: the app lists each key’s name, prefix, active permissions, expiration date, last-used timestamp, and last IP address.

Quickstart

Base URL: https://api.fjnch.ch/v1

Replace YOUR_API_KEY in every sample with your actual API key.

1. Check your key

curl https://api.fjnch.ch/v1/me \
  -H "Authorization: Bearer YOUR_API_KEY"

2. List your accounts

curl https://api.fjnch.ch/v1/accounts \
  -H "Authorization: Bearer YOUR_API_KEY"

3. Read an account’s transactions

accountId is required. Returns a plain array, newest first. Replace ACCOUNT_ID with an account ID from step 2. The Python and Node.js examples continue from step 2 and use its accounts variable.

curl "https://api.fjnch.ch/v1/transactions?accountId=ACCOUNT_ID" \
  -H "Authorization: Bearer YOUR_API_KEY"

API reference

GET/v1/meaccounts:read

Returns { uid, currency, tier, scopes }. Fast key verification; never triggers a bank refresh.

GET/v1/accountsaccounts:read

Returns an array of active Account objects (owned or shared). Refreshes stale accounts first.

GET/v1/accounts/{id}accounts:read

Returns a single Account. Refreshes first if stale.

GET/v1/transactions?accountId={id}transactions:read

Returns an array of Transaction objects for the specified account, newest first. Refreshes the account first if stale.

GET/v1/transactions/{id}transactions:read

Returns a single Transaction with resolved category and tag names.

GET/v1/usageaccounts:read

Returns your AI budget allowance status: { aiBudget, rateLimit, guest }.

Object models

Account object

Account object fields
FieldTypeDescription
idstringUnique identifier. Use with /v1/accounts/{id} and /v1/transactions?accountId=.
labelstring | nullUser-defined account name.
type, subTypestring | nullAccount classification (e.g., bank, investment, crypto, asset).
institutionNamestring | nullName of the financial institution (e.g., UBS Switzerland AG).
ibanLast4string | nullLast 4 characters of the IBAN. Full IBAN is never exposed.
currencystringISO currency code for the account balance.
balancenumberCurrent account balance.
balanceInBaseCurrencynumber | nullConverted balance, populated only if the account currency differs from your base currency.
baseCurrencystring | nullYour base currency setting.
connectedbooleantrue if linked to a bank connection; false for manual or asset accounts.
syncStatusstring | nullSYNCED, SYNCING, FAILED, or NEEDS_REAUTHORIZATION (re-link in the app).
lastSyncedAtnumber | nullEpoch timestamp in milliseconds of the last successful bank sync.
tickersarrayList of holdings (investment accounts only).

Transaction object

Transaction object fields
FieldTypeDescription
idstringUnique transaction ID.
labelstring | nullMerchant, counterparty, or transaction title.
descriptionstringRaw bank narrative; returns an empty string if unavailable.
datenumberBooking date as an epoch timestamp in milliseconds.
amountnumberUnsigned transaction value. Cash direction is defined by direction or type.
direction"in" | "out" | nullCash flow relative to the filtered account: in = credit, out = debit.
typestringdebit or credit. Matches direction.
senderAccountIdstring | nullSource account ID if within your connected accounts; null for external sources.
receiverAccountIdstring | nullDestination account ID if within your connected accounts; null for external payees.
currencystring | nullTransaction ISO currency code.
categorystring | nullCategory ID (e.g., preset_food_drinks, preset_transfer).
categoryNamestring | nullHuman-readable category title.
tags, tagNamesstring[]Tag IDs and their human-readable labels.
accountsstring[]Associated internal account IDs.

Data freshness

Calling /accounts, /accounts/{id}, or /transactions automatically checks the age of the account data. If it is older than the bank’s refresh window, Finch fetches fresh data before responding.

Paid banks

24 hours

1 refresh per window. Charge per sync, e.g., UBS and ZKB.

Swiss banks

15 minutes

1 refresh per window. Swiss open banking network.

Standard banks

6 hours

1 refresh per window. All other banks, e.g., Revolut and N26.

Requests within the window serve cached data without changing lastSyncedAt. Polling faster will not update your data.

  • Shared quota: refresh windows are shared with the mobile app. A script refresh counts toward the app’s rate limits and vice versa.
  • Per-call banks: each refresh consumes one monthly plan refresh, just like pull-to-refresh in the app. Once depleted, API reads return stored data until the quota resets.
  • Timeout: if a bank does not respond within 25 seconds, the API falls back to stored data.

Data from Swiss banks

Swiss banks, including UBS, ZKB, and PostFinance, enforce strict personal-access restrictions.

  • Filtered responses: withheld accounts are omitted from /accounts, return 404 on /accounts/{id} and /transactions?accountId=, and their transactions are excluded. The rest of the response remains unaffected.
  • Notifications: you receive a push notification in the Finch app whenever Swiss bank data is filtered from an API call.

Limits and errors

  • Rate limit: 120 requests per minute per key (sliding window). Exceeding this returns HTTP 429 with retryAfterSeconds.
  • Security lockout: repeated failed requests using invalid or missing keys temporarily block the originating IP address.
  • Quota envelope: app limits apply identically to API requests.

Standard error payload

All API errors return a standardized JSON structure:

{
  "statusCode": 403,
  "code": "INSUFFICIENT_SCOPE",
  "message": "This API key does not have the 'transactions:read' scope.",
  "correlationId": "1792...",
  "timestamp": "2026-10-16T12:00:00.000Z",
  "path": "/v1/transactions"
}

HTTP status codes

Finch API HTTP errors
StatusCodeReason
400—Missing a required parameter, e.g., accountId on /v1/transactions.
401—Missing, invalid, expired, or revoked API key, or blocked IP address.
403INSUFFICIENT_SCOPEKey lacks the necessary permissions for this endpoint.
403PAID_PLAN_REQUIREDActive account plan does not include API access.
403—Account is temporarily suspended or locked.
404—Unknown account or transaction ID, or an account withheld by Swiss bank IP filters.
429RATE_LIMITEDMore than 120 requests per minute. Check retryAfterSeconds.

What the API will not do

  • No write operations: cannot create, update, re-categorize, move, or delete any data.
  • No connection management: cannot link or unlink bank connections.
  • No multi-user access: cannot access third-party data.
  • No webhooks / OpenAPI spec: push notifications and automated spec downloads are not supported.

Security best practices

  • Treat keys like passwords: keys use the fnch_sk_live_ prefix. Never commit them to source control, paste them into URLs, or share screenshots containing keys.
  • Least privilege: use the shortest expiration period feasible and assign only the required scopes.
  • Revoke immediately: if exposure is suspected, revoke the affected key instantly in the Finch app.
  • Personal use compliance: do not link API keys directly to third-party services or assistants.

When using the Finch API, the Terms & Conditions and the Privacy Policy apply.

Connecting an AI assistant

Finch MCP Server Instructions

Access & Support

Need help generating or using your personal API key? Contact Finch support for help with access, permissions, or unexpected responses.

Get Support