Skip to main content
POST
Match a bank line to a journal entry

Authorizations

Authorization
string
header
required

API key issued per entity via Settings > Developers > API Keys. Each key carries scopes (e.g. orders:read, products:write). Bearer token format: Authorization: Bearer ark_live_ent_Test keys use ark_test_ent_. Both are issued per entity
via Settings > Developers > API Keys.

Headers

Idempotency-Key
string

Deduplicates retried match submissions for 24 hours.

Maximum string length: 255

Path Parameters

entity_id
string<uuid>
required

Body

application/json
bank_transaction_id
string<uuid>
required

The bank transaction to match. Must be unreconciled, not excluded and not pending.

journal_entry_id
string<uuid>
required

The posted journal entry that already carries this cash. Must not be voided, must not be claimed by another bank transaction, and its reversal chain must net to LIVE (even depth). A restored entry, one whose reversal was itself reversed, is live and is accepted.

reconciliation_id
string<uuid> | null

Optional open bank-reconciliation to attach the match to.

difference_reason
string | null

REQUIRED, with difference_gl_account_id, when the entry is a bank deposit ticket whose total differs from this bank line (lane R6-AF). What the difference actually was, in the operator's own words: a check that was deposited but never recorded, a bank correction, a fee. It becomes the adjustment entry's description and its offsetting line's memo. Ignored for every other kind of entry.

Maximum string length: 500
difference_gl_account_id
string<uuid> | null

REQUIRED, with difference_reason, when the entry is a bank deposit ticket whose total differs from this bank line. The postable leaf account the difference belongs to. Must satisfy the usual postability rules and lie in an open period, or the adjustment refuses. Ignored for every other kind of entry.

Response

Match recorded. No journal entry was posted, UNLESS this was a bank deposit ticket whose named difference was posted as its own dated adjustment, which posted_journal_entry: true and the deposit_difference object report.

bank_transaction_id
string<uuid>
journal_entry_id
string<uuid>
entry_number
string | null
matched
boolean
entry_bank_net
number

The entry's signed bank-side net, read from the ledger and comparable to the bank line's signed amount. For an entry that touches ONE bank GL this is the net across that GL, which is what it has always been. For a TRANSFER (an entry touching two or more of this entity's bank GLs and carrying a leg on THIS line's own GL) it is the net on THIS line's GL alone, because the entry-wide net of a transfer is 0.00 by construction. Read entry_bank_gl_count to tell which basis was used, and entry_net_all_bank_gls for the entry-wide figure.

entry_net_all_bank_gls
number

The entry's net across ALL of this entity's bank GL accounts, always, whatever basis entry_bank_net used. Equal to entry_bank_net for a single-bank-GL entry and 0.00 for a transfer. Published so that no integrator that read entry_bank_net before 2026-09-21 loses a number.

entry_bank_gl_count
integer

How many DISTINCT bank GL accounts of this entity the entry touches. 1 for an ordinary entry; 2 for a transfer between your own accounts.

transfer_counterparty
object | null

Present (non-null) only when the entry is a transfer and carries a leg on this line's own bank GL. Names the account holding the far leg, so a confirmation screen can say so without a second call. Null otherwise.

amount_warning
string | null

Set when the bank amount and entry_bank_net differ by more than half a cent, on whichever basis that field used. Advisory, never a refusal.

posted_journal_entry
boolean

Always false. This verb records a link and posts no GL.

book_side
object | null

What the GENERAL LEDGER now says about the money this bank line explains. Added 2026-09-19 by BANKFEED wave 4 lane W4-G, and it is purely additive: no request field changed and no existing response field changed meaning.

A bank reconciliation has two sides. The bank side is reconciliation_status on the bank transaction. The BOOK side is reconciled_at on the journal entry's line on that bank account's GL account, and until this lane no verb outside a statement session ever wrote it, so matched money could read UNCLEARED in the ledger forever.

STILL NO GL IS POSTED. The stamp writes no debit and no credit; the trial balance is identical before and after, and a closed period cannot be moved by it. What it changes is which lines the reconciliation workbench and the bank register's open-items tile still treat as outstanding.

stamped: 0 with a reason is an honest answer, not an error: no_leg_on_bank_gl means the entry carries no line on THIS account's GL (a payout settled to a different account, for example); already_reconciled means a session or a baseline had already cleared it; missing_argument means the record carries no journal entry to stamp.