> ## Documentation Index
> Fetch the complete documentation index at: https://docs.finta.io/llms.txt
> Use this file to discover all available pages before exploring further.

# 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
```
