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

# 🏦 Bank Accounts

> Manage bank accounts for users and receivers to enable fiat payouts in off-ramp and cross-ramp transactions.

***

## Overview

Bank accounts are used to receive fiat payouts in off-ramp and cross-ramp transactions. You can manage bank accounts for **users** directly or for **receivers** (third-party payees). Each bank account is tied to a specific country and must meet that country's validation requirements.

Alternatively, bank details can be provided inline when creating a transaction, without saving them beforehand.

## Requirements by Country

Each country has specific required fields when creating a bank account:

| Country     | Required Fields                                                                      | Notes                                                                                                                                                                                                             |
| ----------- | ------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **MX**      | `accountIdentifier` (18-digit CLABE)                                                 | `bankName` is not allowed                                                                                                                                                                                         |
| **DO**      | `accountIdentifier`, `bankName`, `accountType`, `documentIdentifier`, `documentType` | `accountType`: SAVINGS or CHECKING. `documentType`: PASSPORT, CEDULA, or RNC                                                                                                                                      |
| **US**      | `accountIdentifier`, `bankName`, `routingNumber`, `accountHolder`, `address`         | `routingNumber`: 9-digit ABA. `address` requires `streetLine1`, `city`, `state`, `postalCode`, `country`                                                                                                          |
| **SEPA**    | `iban`, `bic`, `bankName`, `accountHolder`                                           | `accountIdentifier` is not allowed. Covers AT, BE, BG, HR, CY, CZ, DK, EE, FI, FR, DE, GR, HU, IE, IT, LV, LT, LU, MT, NL, PL, PT, RO, SK, SI, ES, SE, IS, LI, NO, CH, GB, MC, SM, AD, VA                         |
| **CN / HK** | `accountIdentifier`, `bankName`, `accountType`, `accountHolder`, `address`           | Cross-ramp **destination only** (USD delivery). `bic` optional (used for SWIFT). Accounts are provider-managed. See [Cross-Ramp → China & Hong Kong destinations](/docs/cross-ramp#china--hong-kong-destinations) |

The `accountHolder` object requires a `type` field (`INDIVIDUAL` or `BUSINESS`). For individuals, provide `firstName` and `lastName`. For businesses, provide `businessName`.

All countries also accept an optional **`alias`** field — a friendly label for the bank account (e.g. `"My savings"`).

### Examples

<Tabs>
  <Tab title="Mexico (MX)">
    ```json theme={null}
    {
      "accountIdentifier": "014680260346007120",
      "country": "MX"
    }
    ```
  </Tab>

  <Tab title="Dominican Republic (DO)">
    ```json theme={null}
    {
      "accountIdentifier": "1234567890",
      "country": "DO",
      "bankName": "Banco Popular",
      "accountType": "SAVINGS",
      "documentIdentifier": "40212345678",
      "documentType": "CEDULA"
    }
    ```
  </Tab>

  <Tab title="United States (US)">
    ```json theme={null}
    {
      "accountIdentifier": "123456789012",
      "country": "US",
      "bankName": "Chase Bank",
      "routingNumber": "021000021",
      "accountHolder": {
        "type": "INDIVIDUAL",
        "firstName": "John",
        "lastName": "Doe"
      },
      "address": {
        "streetLine1": "123 Main St",
        "city": "New York",
        "state": "NY",
        "postalCode": "10001",
        "country": "US"
      }
    }
    ```
  </Tab>

  <Tab title="SEPA">
    ```json theme={null}
    {
      "country": "DE",
      "bankName": "Deutsche Bank",
      "iban": "DE89370400440532013000",
      "bic": "DEUTDEFF",
      "accountHolder": {
        "type": "INDIVIDUAL",
        "firstName": "Hans",
        "lastName": "Mueller"
      }
    }
    ```
  </Tab>

  <Tab title="China (CN)">
    ```json theme={null}
    {
      "country": "CN",
      "accountIdentifier": "6222021234567890123",
      "bankName": "Bank of China",
      "accountType": "SAVINGS",
      "accountHolder": {
        "type": "INDIVIDUAL",
        "firstName": "Wei",
        "lastName": "Zhang"
      },
      "address": {
        "streetLine1": "1 Jianguomenwai Ave",
        "city": "Beijing",
        "postalCode": "100005",
        "country": "CN"
      }
    }
    ```

    Cross-ramp destination only (USD delivery). Add `bic` when delivering via the SWIFT rail. Hong Kong (`HK`) uses the same fields.
  </Tab>
</Tabs>

## User Bank Accounts

Manage bank accounts linked directly to a user.

### Create

Use the [Create Bank Account](/reference/userbankinfopartnerv2controller_createuserbankinfobyuserid) endpoint to add a bank account for a user.

```
POST /api/partner/v2/banks/users/{userId}/accounts
```

### List

Use the [List Bank Accounts](/reference/userbankinfopartnerv2controller_getuserbankinfosbyuserid) endpoint to retrieve all bank accounts for a user. Supports filtering by `country`, `rampType`, and `id`, with pagination via `skip`, `limit`, and `sortBy`.

```
GET /api/partner/v2/banks/users/{userId}/accounts
```

### Delete

Use the [Delete Bank Account](/reference/userbankinfopartnerv2controller_deleteuserbankinfobyuserid) endpoint to soft-delete a bank account. The account will be disabled but existing transactions are not affected.

```
DELETE /api/partner/v2/banks/users/{userId}/accounts/{userBankInfoId}
```

## Receiver Bank Accounts

Manage bank accounts linked to a receiver (third-party payee). The same country requirements apply.

### Create

Use the [Create Bank Account by Receiver](/reference/userbankinfopartnerv2controller_createuserbankinfobyreceiverid) endpoint to add a bank account for a receiver.

```
POST /api/partner/v2/banks/receivers/{receiverId}/accounts
```

### List

Use the [List Bank Accounts by Receiver](/reference/userbankinfopartnerv2controller_getuserbankinfosbyreceiverid) endpoint to retrieve all bank accounts for a receiver.

```
GET /api/partner/v2/banks/receivers/{receiverId}/accounts
```

### Delete

Use the [Delete Bank Account by Receiver](/reference/userbankinfopartnerv2controller_deleteuserbankinfobyreceiverid) endpoint to soft-delete a receiver's bank account.

```
DELETE /api/partner/v2/banks/receivers/{receiverId}/accounts/{userBankInfoId}
```

## Verification (Mexico)

Mexican bank accounts go through a penny testing verification process to confirm account ownership. The verification flow:

1. When a bank account is created with `country: "MX"`, a small deposit (penny test) is initiated.
2. The `verificationStatus` field tracks the result:

| Status        | Description                                                    |
| ------------- | -------------------------------------------------------------- |
| `PENDING`     | Penny test has been initiated, awaiting result                 |
| `VERIFIED`    | Account ownership confirmed                                    |
| `REJECTED`    | Penny test failed, account owner does not match the KYC'd user |
| `CEP_FAILURE` | Bank verification receipt could not be validated               |

3. The `isVerified` boolean indicates the current verification state.
4. If a user attempts an off-ramp with an unverified MX account, the transaction will proceed but may be cancelled and the crypto reimbursed if verification fails.

## Inline Bank Details

When creating off-ramp or cross-ramp transactions, bank information can be provided directly in the request body instead of saving a bank account beforehand:

* **Off-ramp**: Use the `userBankInformation` field in the [Create Off-Ramp](/reference/offramppartnerv2controller_createpartnerofframp) request.
* **Cross-ramp**: Use the `targetBankAccount` field in the [Create Cross-Ramp](/reference/crossramppartnerv2controller_createpartnercrossramp) request.

The same country-specific field requirements apply whether using inline details or saved accounts.

***

## What's Next

* [Create Bank Account (User)](/reference/userbankinfopartnerv2controller_createuserbankinfobyuserid)
* [Create Bank Account (Receiver)](/reference/userbankinfopartnerv2controller_createuserbankinfobyreceiverid)
* [💵 Off-Ramp](/docs/off-ramp)
* [🔄 Cross-Ramp](/docs/cross-ramp)
* [👥 Receivers](/docs/receivers)
