> ## 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.

# Connecting a bank

> Store credentials, give the bank your webhook URL, and watch the connection.

An admin installs a bank from the console: open **Connections → Banks, PSPs and custody**, choose **Browse connectors**, open the bank and choose **Install**. It starts in ledger-only mode with uploaded statements, so PanoQore does not call the bank until you set up full integration below.

## 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:SHV` and `LIA:SUS:NGN:SHV`. See [Ledgers and accounts](https://docs.panoqore.com/concepts/ledgers-and-accounts.md).

## 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](https://docs.panoqore.com/connectors/integration-modes.md).

## 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:

1. It is matched to a bound account number.
2. Settlement is debited and the wallet credited, as one entry with `kind: TRANSFER_IN`.
3. A credit already seen, by the bank's transaction id, posts nothing and reports `DUPLICATE`.
4. A credit that cannot be placed goes to suspense and opens a reconciliation break.

See [Named accounts and inbound credits](https://docs.panoqore.com/guides/named-accounts.md).

## Health

`GET /v1/partners` reports each bank's `health`.

| `health` | Meaning |
| - | - |
| `OK` | The bank answers PanoQore. |
| `DELAYED` | The bank has not answered for less than 10 minutes. |
| `DOWN` | The bank has not answered for 10 minutes or more. |

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

With `READ_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](https://docs.panoqore.com/guides/reconciliation.md).


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