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:
- Ledger side. Posted entries on the accounts you linked to a bank account.
- 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
submittedbut 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.
Related
- The monthly record you reconcile against: Statements and exports.
- How balances are defined: Account balances.