Bank Accounts & Custody

Core Endpoints

Bank Account Operations

Create and manage checking and savings accounts where fiat is held:

Create Checking Account

`POST /user/bank-account/bakkt`

Create a checking account in EUR, GBP, USD, or NGN. Returns account details including account number and routing number (for USD accounts).

Create Savings Account

`POST /user/purse`

Create a savings account (purse) for the user. Savings accounts can only be funded from checking accounts.

> **Note:**
> **Merchant-Gated Feature**: Savings accounts are not enabled for every merchant by default. Access to this endpoint depends on your agreement with Bakkt — please contact your Bakkt account manager to confirm whether savings accounts are part of your contract before integrating.

List All Accounts

`GET /user/accounts`

View all accounts (checking and savings) for a user with basic information (uuid, type).

Get Account Details

`GET /user/accounts/{account_uuid}`

Get detailed account information including balance, account number, routing number (for checking accounts), and account type. Savings accounts do not have routing numbers.

Info:
Account Statements: For PDF statements and conversion history, see the Stablecoin API.

Supported Currencies & Regions

Account Creation Currencies

CurrencyAccount TypeUse Cases
EURSEPAEurope-wide deposits and payouts
GBPFPSUK fast payments
USDACHUS domestic payments
NGNLocalNigeria operations

Payout Currencies (via Recipients)

Supported Currencies:

  • EUR (SEPA - same day to 1 business day)
  • GBP (FPS - same day)
  • USD (ACH - 2-3 business days)
  • NGN (Nigeria) - 1 business day

Note:
International Payouts: For sending to other currencies (PKR, INR, TRY, etc.), use the Stablecoin API third-party off-ramp feature.

Money IN (Deposits)

Bank Transfer

User deposits to their checking account:

  1. Create a checking account:

    POST /user/bank-account/bakkt
    {
      "currency": "EUR"
    }
  2. Display the returned account details to the user (iban + bic for EUR/GBP, account_number + routing_number for USD, etc.) along with the account name Bakkt - <User Name>.

  3. The user transfers funds from their bank externally.

  4. Fiat appears in the account (custody). Monitor via the webhook OUTSIDE_TRANSFER_RECEIVED.

ACH Pull (Plaid)

Instant account linking and ACH debit:
> Info:
ACH Pull is only available for USD accounts.

  1. Create the linked-bank-account profile (one-time per user):

    POST /user/linked-bank-account/profile
    {
      "currency": "USD",
      "investment_objective": "INCOME",
      "annual_income_range": "UNDER_25K"
    }
  2. Generate the Plaid link URL and have the user complete the linking flow:

    PUT /user/linked-bank-account/link
    {
      "currency": "USD"
    }
  3. Initiate the ACH pull from the linked account into the user's checking account:

    POST /user/linked-bank-account/pull
    {
      "currency": "USD",
      "amount": 100.0,
      "source_account_uuid": "<linked-bank-account-uuid>"
    }

    Funds arrive in the Bakkt account in 2-3 business days.

    Info:
    For detailed ACH Pull via Plaid integration, see the Payments & Transfers guide.

Bank Account Details

When you create a checking account, users get real banking details:

EUR (SEPA)

IBAN in Malta or Europe

```json
{
  "uuid": "account-uuid",
  "currency": "EUR",
  "iban": "MT84BAKK00000012345678901",
  "bic": "BAKKMTMT",
  "bank_country": "MT",
  "status": "ACTIVE",
  "account_type": "CHECKING"
}
```

Users can receive SEPA transfers from any European bank.

GBP (UK)

UK Account Number + Sort Code

```json
{
  "uuid": "account-uuid",
  "currency": "GBP",
  "account_number": "12345678",
  "sort_code": "040004",
  "bank_country": "GB",
  "status": "ACTIVE",
  "account_type": "CHECKING"
}
```

Users can receive FPS (Faster Payments) transfers.

USD (US)

Account Number + ABA Routing

```json
{
  "uuid": "account-uuid",
  "currency": "USD",
  "account_number": "123456789",
  "routing_number": "026009593",
  "bank_country": "US",
  "status": "ACTIVE",
  "account_type": "CHECKING"
}
```

Receive ACH and wire transfers.

NGN (Nigeria)

Nigerian Account Details

```json
{
  "uuid": "account-uuid",
  "currency": "NGN",
  "account_number": "1234567890",
  "bank_code": "058",
  "bank_country": "NG",
  "status": "ACTIVE",
  "account_type": "CHECKING"
}
```

Receive local Nigerian bank transfers.

Savings Account

Savings accounts (purses) can only be funded from checking accounts:

```json
{
  "account_uuid": "account-uuid",
  "account_type": "SAVINGS",
  "currency": "USD",
  "balance": 1000.00
}
```

Savings accounts do not have routing numbers or account numbers for external deposits.

Complete Example: Operating Account

Set up a complete fiat operating account for a user.

Setup (one-time)

1. Create user (Onboarding API)

POST /user
{
  "first_name": "Alice",
  "last_name": "Smith",
  "email": "[email protected]",
  "country": "US",
  "target_address": "0x..."
}

Authenticate the user (Onboarding API) to obtain a session_id.

2. Create checking account (Accounts API)

POST /user/bank-account/bakkt
{
  "currency": "USD"
}

The response contains account_number and routing_number for the new checking account.

3. Create savings account (optional)

POST /user/purse
{
  "currency": "USD"
}

Money IN

Option A — Bank transfer: the user deposits from their own bank to the account_number returned above.

Option B — ACH pull via Plaid (USD only) — uses the linked-bank-account flow (profilelinkpull). After the user completes the Plaid link flow:

POST /user/linked-bank-account/pull
{
  "currency": "USD",
  "amount": 5000.0,
  "source_account_uuid": "<linked-bank-account-uuid>"
}

Money OUT

Add a recipient for payouts:

POST /user/bank-account/remote
{
  "account_name": "Main Bank Account",
  "main_recipient": true,
  "recipient_type": "THIRD_PARTY",
  "account_details": {
    "currency": "USD",
    "transfer_method": "ACH",
    "account_number": "987654321",
    "routing_number": "026009593",
    "account_type": "Checking",
    "recipient_relationship": "Customer"
  }
}

The user then initiates a payment via your UI — debiting the Bakkt account and crediting the recipient.

Next Steps

Payments & Transfers

Learn about recipients, money movement, and ACH operations

Advanced Features

Exchange rates, webhooks, compliance, and testing

API Reference

Explore all endpoints with interactive examples