Skip to content
Ledgerline Help

Reconciliation

Updated 15 September 20263 min read

On this page

Reconciliation answers one question: does what Ledgerline recorded agree with what your bank recorded? Ledgerline compares the two every day, matches the lines it can match automatically and gives you a short list of the ones it cannot.

How a run works

A reconciliation run takes two inputs:

  1. Ledger side. Posted entries on the accounts you linked to a bank account.
  2. Bank side. Lines from the bank statement or feed.

Ledgerline matches the lines, labels each one and produces a report. The daily run starts at 04:00 UTC. When it finishes, a reconciliation.completed event is sent. If it finds a difference that needs a person, it also sends reconciliation.discrepancy.

Getting bank data in

Method How
Bank feed Connect the bank account in the dashboard. New lines are pulled each morning before the run.
File import Upload a statement in CAMT.053, MT940, BAI2 or CSV.
API Post lines to POST /v1/reconciliation/imports.
curl https://api.ledgerline.dev/v1/reconciliation/imports \
  -H "Authorization: Bearer $LEDGERLINE_API_KEY" \
  -H "Idempotency-Key: c3a8e1f0-7d24-4b59-a6f2-90b1d5e8c437" \
  -F bank_account_id=bnk_01JA2K6Y8P \
  -F format=camt053 \
  -F file=@statement-2026-09-14.xml

Imports are idempotent at the line level. Uploading the same file twice does not create duplicate lines, because each line is identified by the bank's own reference and booking date.

Matching rules

Ledgerline applies three rules, in order, and stops at the first that succeeds.

Rule Matches when Confidence
Exact The reference and the amount are both identical. Certain
Fuzzy The amount is identical, the booking dates are within 3 days and the counterparty names have a similarity score of at least 0.85. High
Manual You link the lines yourself in the dashboard or API. Your decision

Payouts also carry the rail's trace number, so ACH and SEPA lines usually match exactly. Wires match on the bank reference you supply with the payout.

A line never matches more than once. If two ledger entries could match one bank line, Ledgerline picks the closest in date and leaves the other unmatched.

Match statuses

Status Meaning
matched The bank line and the ledger entries agree.
partially_matched The amounts differ, usually because of a fee or a split. The difference is shown.
unmatched There is no counterpart on the other side.
ignored You decided the line needs no match, such as a bank fee that you book elsewhere.

Working the exceptions

Most runs leave a handful of exceptions. The common causes:

  • Timing. A payout is submitted but the bank has not booked it yet. It will match tomorrow.
  • Fees. The bank deducted a charge. Record it as a transaction and link it.
  • Returns. A returned payout appears as a credit that matches the original debit. See Returns and failed payouts.
  • Unknown deposits. Money arrived that no virtual account explains. Investigate with the sender reference.

Resolve a line from the API with POST /v1/reconciliation/matches and a list of line ids and entry ids, or mark it with POST /v1/reconciliation/lines/{id}/ignore.

Tip

Treat an unmatched line older than three business days as a real problem. Timing differences clear within that window.

Tolerances

By default a difference must be zero to count as matched. You can set a per-bank-account tolerance, for example 100 minor units, so rounding noise does not raise a discrepancy. Tolerances never apply to payouts, only to fee lines.

Reading results

curl "https://api.ledgerline.dev/v1/reconciliation/matches?status=unmatched&limit=100" \
  -H "Authorization: Bearer $LEDGERLINE_API_KEY"

Reading reconciliation results needs the reports:read scope. Exports of results are limited to 10 requests per minute. See Rate limits.