---
title: "Bank & Reconciliation API"
description: "Automate GL reconciliation through the REST API: import bank statements, open reconciliation sessions, accept suggested matches and manage bank rules."
url: "https://bareledger.app/guides/api-bank"
category: "Developers & API"
updated: "2026-11-06"
publisher: "BareLedger (Syneria Technologies OPC)"
---

# Bank & Reconciliation API

> Bank accounts, statement imports, reconciliation sessions, suggested matches and bank rules, in the order a reconciliation actually runs.

Gated by `feature:bank_reconciliation` on the route group.

## Bank Accounts

| Method & Path | Permission | Purpose | Side effects |
|---|---|---|---|
| `GET bank-accounts` | `bank.view` | List, with unmatched-line counts | Account number and IBAN come back only as `has_account_number`/`account_number_masked` and `has_iban`/`iban_masked` (last 4) |
| `POST bank-accounts` | `bank.manage` | Create | Validates the linked GL account is active/postable/asset; audit |
| `PATCH bank-accounts/{bank}` | `bank.manage` | Update | Same GL validation; audit |
| `POST bank-accounts/{bank}/reveal` | `bank.reveal_account_number` | Reveal decrypted account number and IBAN | POST-only (never in URL); audit `bank.account_number_revealed` (values never logged) |
| `GET bank-accounts/{bank}/lines` | `bank.view` | Statement lines with matches, filterable | — |

## Statement Import

| Method & Path | Permission | Purpose | Side effects |
|---|---|---|---|
| `POST bank-accounts/{bank}/import-file` | `bank.import` | Multipart CSV/OFX import with column mapping | Parses & imports lines |
| `POST bank-accounts/{bank}/import` (legacy) | `bank.import` | Import from parsed JSON | Dedupes via SHA-256 hash |

## Reconciliation Sessions

| Method & Path | Permission | Purpose | Side effects |
|---|---|---|---|
| `GET/POST bank-accounts/{bank}/reconciliations` | `bank.view`/`bank.reconcile` | List / start a session | — |
| `GET bank-reconciliations/{reconciliation}` | `bank.view` | Detail + lines | — |
| `POST bank-reconciliations/{reconciliation}/complete` | `bank.reconcile` | Complete/lock session | TOTP step-up (`totp_code`) if `require_totp_for_posting`; locks matched lines |
| `POST bank-reconciliations/{reconciliation}/reopen` | `bank.reconcile` | Reopen a completed session | TOTP step-up |
| `DELETE bank-reconciliations/{reconciliation}` | `bank.reconcile` | Delete session | — |

## Matching

| Method & Path | Permission | Purpose | Side effects |
|---|---|---|---|
| `POST bank-lines/{line}/match` \| `/unmatch` \| `/exclude` \| `/restore` | `bank.reconcile` | Manage a line's match state | — |
| `POST bank-lines/{line}/create-entry` | `bank.reconcile` | Draft a fee/interest journal entry from a line | Creates a journal entry that enters the normal maker-checker workflow |
| `GET bank-lines/{line}/suggestions` | `bank.view` | Rules-based suggested matches | — |
| `GET bank-lines/{line}/candidates` | `bank.view` | Unmatched ledger candidates for manual matching | — |
| `POST bank-accounts/{bank}/apply-rules` | `bank.reconcile` | Apply matching rules on demand | Auto-matches per configured rules |

## Rules

| Method & Path | Permission | Purpose |
|---|---|---|
| `GET/POST bank-rules`, `PATCH/DELETE bank-rules/{rule}` | `bank.view`/`bank.manage` | CRUD auto-match rules |
