Before you start
- An agreement and an account with the bank.
- A ledger in the bank’s currency.
- A settlement account and a suspense account for each bank and currency. For Safehaven in NGN, these are
AST:SET:NGN:SHVandLIA:SUS:NGN:SHV. See Ledgers and accounts.
Set up full integration
1
Create API credentials at the bank
Each bank asks for different fields. Its page lists them, and where to find them on the bank’s dashboard.
2
Store the credentials
In the console, open Connections → Integration mode, choose the bank and enter the credentials. PanoQore signs in to the bank with them before it keeps them, and shows the account name the bank reports.
3
Give the bank your webhook URL
The same screen shows the URL the bank posts notices to. It is unique to your workspace and that bank. Paste it into the bank’s dashboard.
4
Ask for full integration
Choose Full integration and give a reason. An approver signs it off. See Integration modes.
Credentials
Credentials are write-only. Nobody can read them back, in the console or through the API. To change them, enter new ones: PanoQore checks them with the bank, and stops using the old ones once the new ones are accepted. Credentials the bank refuses are not stored.The webhook URL
The URL carries a secret that says which workspace a notice is for. Treat it like a password. Replacing it in the console makes a new URL, and the old one stops working at once. Paste the new one into the bank’s dashboard straight away. Until you do, the hourly history pull still picks up every credit, later. A notice is never trusted on its own. Where the bank signs its notices, a notice whose signature does not hold is refused. Every credit in a notice is then confirmed with the bank’s API before it posts.How credits arrive
Every credit, from a notice, the hourly pull or your own code, takes the same path:- It is matched to a bound account number.
- Settlement is debited and the wallet credited, as one entry with
kind: TRANSFER_IN. - A credit already seen, by the bank’s transaction id, posts nothing and reports
DUPLICATE. - A credit that cannot be placed goes to suspense and opens a reconciliation break.
Health
GET /v1/partners reports each bank’s health.
A refusal from the bank, such as an unknown account, still counts as an answer. Only failing to reach the bank, or an error on its side, counts against it. In ledger-only mode without
READ_API, PanoQore does not call the bank, and health is OK.
failingSince, lastAnsweredAt, lastWebhookAt and lastPolledAt say more. When a bank comes back, the next hourly pull posts what was missed.
Statements
WithREAD_API history access, or in full integration, PanoQore pulls yesterday’s statement from the bank each morning, in your workspace’s time zone, matches it and sends operators and approvers the report. Otherwise someone uploads it under Reconciliation → Partner history, or with POST /v1/recon/statements. See Reconciliation.