Bank Accounts & Custody

Core Endpoints

Bank Account Operations (Custody)

Create and manage Bakkt bank accounts where fiat is held:

Create Account

POST /user/bank-account/bakkt

Create a Bakkt bank account in EUR, GBP, or USD. Returns Virtual IBAN/account details.

List Accounts

GET /user/bank-account/bakkt

View all Bakkt accounts for a user with balances and details.

Get Details

GET /user/bank-account/bakkt/{uuid}

Get specific account with IBAN, BIC, account number, routing number.

Get Balance

GET /user/bank-account/bakkt/{uuid}/balance

View current balance and available funds for an account.

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

Supported Currencies & Regions

Account Creation Currencies

CurrencyVirtual IBANAccount TypeUse Cases
EUR✅ YesSEPAEurope-wide deposits and payouts
GBP✅ YesFPSUK fast payments
USD✅ Yes (Corporate)ACHUS domestic payments
NGN✅ YesLocalNigeria operations

Payout Currencies (via Beneficiaries)

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 Bakkt account:

// 1. Create Bakkt bank account
const account = await bakkt.createBankAccount(sessionId, {
  currency: 'EUR'
});

// 2. Display account details to user
console.log('Deposit to this account:');
console.log('IBAN:', account.iban);
console.log('BIC:', account.bic);
console.log('Account Name:', 'Bakkt - User Name');

// 3. User transfers from their bank
// (External - user does this in their banking app)

// 4. Fiat appears in Bakkt account (custody)
// Monitor via webhook: OUTSIDE_TRANSFER_RECEIVED

ACH Pull (Plaid)

Instant account linking and ACH debit:

Info: ACH Pull is only available for USD accounts.

// 1. Initiate Plaid Link
const payment = await bakkt.createOpenBankingPayment(sessionId, {
  amount: 1000,
  currency: 'USD'
});

// 2. User completes Plaid flow
// (Links their bank account securely)

// 3. ACH debit initiated
// Funds arrive in Bakkt account in 2-3 business days

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

Bakkt Bank Account Details

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

EUR (SEPA)

Virtual IBAN in Malta or Europe

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

Users can receive SEPA transfers from any European bank.

GBP (UK)

UK Account Number + Sort Code

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

Users can receive FPS (Faster Payments) transfers.

USD (US)

Account Number + ABA Routing

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

Receive ACH and wire transfers.

NGN (Nigeria)

Nigerian Account Details

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

Receive local Nigerian bank transfers.

Complete Example: Operating Account

Set up a complete fiat operating account for a user:

// === SETUP (One-time) ===

// 1. Create user (Onboarding API)
const user = await bakkt.onboarding.createUser({
  first_name: 'Alice',
  last_name: 'Smith',
  email: '[email protected]',
  country: 'US',
  target_address: '0x...'
});

const session = await bakkt.onboarding.authenticate(user.user_uuid);

// 2. Create Bakkt USD account (Accounts API)
const account = await bakkt.payments.createBankAccount(session.session_id, {
  currency: 'USD'
});

console.log('User account created:');
console.log('Account:', account.account_number);
console.log('Routing:', account.routing_number);

// === MONEY IN ===

// Option A: User deposits from their bank
// (They transfer to account.account_number)

// Option B: ACH pull via Plaid (USD accounts only)
const achPull = await bakkt.payments.initiateACHPull(session.session_id, {
  amount: 5000,
  linked_account: 'plaid-account-id'
});

// === MONEY OUT ===

// 3. Add beneficiary for payouts
const beneficiary = await bakkt.payments.createBeneficiary(session.session_id, {
  first_name: 'John',
  last_name: 'Doe',
  beneficiary_country: 'US',
  account_details: {
    currency: 'USD',
    account_number: '987654321',
    bank_code: '026009593'
  }
});

// 4. User sends payment to beneficiary
// (Via your UI - debits Bakkt account, credits beneficiary)

Corporate Accounts

All endpoints have corporate variants:

/corporate/{corporate_uuid}/bank-account/bakkt/*
/corporate/{corporate_uuid}/token-preferences

Use Cases:

  • Company treasury accounts
  • Employee payout accounts
  • Multi-currency operations
  • Corporate expense management

Next Steps

Payments & Transfers

Learn about beneficiaries, money movement, and ACH operations

Advanced Features

Exchange rates, webhooks, compliance, and testing

API Reference

Explore all endpoints with interactive examples

Stablecoin API

Convert between fiat and stablecoins