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
| Currency | Account Type | Use Cases |
|---|---|---|
| EUR | SEPA | Europe-wide deposits and payouts |
| GBP | FPS | UK fast payments |
| USD | ACH | US domestic payments |
| NGN | Local | Nigeria 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:
-
Create a checking account:
POST /user/bank-account/bakkt{ "currency": "EUR" } -
Display the returned account details to the user (
iban+bicfor EUR/GBP,account_number+routing_numberfor USD, etc.) along with the account nameBakkt - <User Name>. -
The user transfers funds from their bank externally.
-
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.
-
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" } -
Generate the Plaid link URL and have the user complete the linking flow:
PUT /user/linked-bank-account/link{ "currency": "USD" } -
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 (profile → link → pull). 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