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

# Statement upload

> Reconcile against a bank's statement by sending the file.

Upload a bank's daily statement and PanoQore matches it against the ledger at once. Use it for a bank PanoQore cannot read, or one you keep in ledger-only mode without read access.

| | |
| - | - |
| Connector id | `statement-upload` |
| Kind | `GENERIC` |
| Status | Available |
| Mode | Ledger-only |
| Currencies | NGN, USD, GBP, CAD |

## Capabilities

| Capability | Status |
| - | - |
| CSV and JSON Lines files | Available |
| Matching and breaks | Available |
| MT940 and camt.053 | Planned |

## Before you upload

* The bank is set up as a partner of your workspace, and holds the statement's currency.
* A settlement account for that bank and currency, such as `AST:SET:NGN:SHV`.
* A key with `recon:write`, or a person in the console.

## Upload

A statement covers one bank, currency and day. Send it with `POST /v1/recon/statements`, or in the console under **Reconciliation → Partner history**.

```bash theme={null}
CONTENT=$(base64 < statement.csv)
curl -X POST "$PANOQORE_URL/v1/recon/statements" \
  -H "Authorization: Bearer $PANOQORE_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"partner":"safehaven","currency":"NGN","businessDate":"2026-11-01","format":"CSV","content":"'"$CONTENT"'","closingBalance":"250000"}'
```

`content` is the file, base64 encoded, at most 50 MB. `format` is `CSV` or `JSONL`.

## File format

Banks write statements their own way, so PanoQore looks for columns under the names banks use.

```text theme={null}
reference,amount,direction,account_number,narration,date
000013261005091207,2500.00,credit,0123456789,Inbound,2026-11-01
```

* The reference can be `reference` or `session_id`, among others.
* Separate `credit` and `debit` columns work in place of `amount` and `direction`.
* Amounts are in major units, unless the column is `amount_minor`.
* `closingBalance` in the request is in minor units.

## What happens next

Matching runs as soon as the file arrives. Each line is matched to the ledger by its reference, and each difference opens a break for someone to look at. See [Reconciliation](https://docs.panoqore.com/guides/reconciliation.md#breaks).

A day can be sent once. A repeat gets `ALREADY_REQUESTED`. After more credits arrive, match the day again with `POST /v1/recon/runs`.

If your workspace uploads a bank's statements, the morning reconciliation report marks a day late until it arrives.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.