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

# List institutions

> Every bank and neobank an NGN recipient can hold, with the institution code each one is identified by.

An NGN recipient is identified by an institution code such as `GTBINGLA` or `OPAYNGPC`. This endpoint returns every valid code, so you can populate a bank picker instead of guessing. A wrong code fails at order creation, and the codes are not derivable from the bank's name.

NGN is the only currency with an institution list. KES, GHS, and UGX recipients are identified by `method` plus a phone number, till, or paybill, so there is nothing to look up. See [recipients](/offramp/recipients).

## Endpoint

```text theme={null}
GET https://merchant.minisend.xyz/api/offramp/institutions
```

```text theme={null}
Authorization: Bearer ms_live_your_key_here
```

Requires the `offramp` scope.

## Query parameters

<ParamField query="currency" default="NGN" type="string">
  Currency to list institutions for. `NGN` is the only supported value, and it is the default, so you can omit this entirely.
</ParamField>

## Example

<CodeGroup>
  ```bash cURL theme={null}
  curl https://merchant.minisend.xyz/api/offramp/institutions?currency=NGN \
    -H "Authorization: Bearer ms_live_your_key_here"
  ```

  ```javascript Node.js theme={null}
  const res = await fetch(
    'https://merchant.minisend.xyz/api/offramp/institutions?currency=NGN',
    { headers: { 'Authorization': 'Bearer ms_live_your_key_here' } }
  );

  const { institutions } = await res.json();

  // The `code` is what an order needs.
  const opay = institutions.find((i) => i.name === 'OPay');
  console.log(opay.code); // OPAYNGPC
  ```
</CodeGroup>

## Response (200)

```json theme={null}
{
  "currency": "NGN",
  "count": 171,
  "institutions": [
    { "code": "ABNGNGLA", "name": "Access Bank", "type": "bank" },
    { "code": "GTBINGLA", "name": "Guaranty Trust Bank", "type": "bank" },
    { "code": "OPAYNGPC", "name": "OPay", "type": "bank" },
    { "code": "PALMNGPC", "name": "PalmPay", "type": "bank" }
  ]
}
```

<ResponseField name="currency" type="string" required>
  The currency the list applies to.
</ResponseField>

<ResponseField name="count" type="integer" required>
  Number of institutions returned.
</ResponseField>

<ResponseField name="institutions" type="array" required>
  <Expandable title="institution">
    <ResponseField name="code" type="string" required>
      Pass this as `recipient.institution` when you create an order or validate an account.
    </ResponseField>

    <ResponseField name="name" type="string" required>
      Display name. Show this in your bank picker.
    </ResponseField>

    <ResponseField name="type" type="string" required>
      Classification of the destination. Currently `bank` for every entry, including neobanks like OPay and PalmPay.
    </ResponseField>
  </Expandable>
</ResponseField>

<Note>
  The list changes rarely and is cached for six hours, so it is safe to call whenever you render a form. Caching it on your side for a day is also fine. What you should not do is hardcode the codes, because a bank that gets added or renamed will silently stop matching.
</Note>

## Errors

| Status | Meaning                                                                  |
| ------ | ------------------------------------------------------------------------ |
| `400`  | Unsupported currency. Only `NGN` has an institution list                 |
| `403`  | Key lacks the `offramp` scope or off-ramp is not enabled on your account |
| `502`  | The institution list could not be loaded. Retry shortly                  |
