Skip to main content
Funding covers how money moves between your user’s bank account and their investment wallet. Bluum supports ACH transfers via Plaid and manual bank transfers.

Deposit methods

MethodHow it worksSettlement
ACH via Plaid (ach)Automated pull from linked bank account1-3 business days
Manual Bank Transfer (manual_bank_transfer)User initiates a transfer from their bank using provided instructionsVaries (1-5 business days)
Before using ACH deposits, the user must link a bank account through Plaid Link. This is a two-step process: Your backend requests a Plaid Link token from Bluum:
curl -X POST "$BASE_URL/accounts/$ACCOUNT_ID/funding-sources/plaid/link-token" \
  -H "Authorization: Basic $AUTH" \
  -H "Content-Type: application/json" \
  -d '{ "enable_hosted_link": false }'

2. Exchange the public token

Your frontend launches Plaid Link with the token. After the user selects their bank, Plaid returns a public_token to your frontend. Send it to Bluum:
curl -X POST "$BASE_URL/accounts/$ACCOUNT_ID/funding-sources/plaid/connect" \
  -H "Authorization: Basic $AUTH" \
  -H "Content-Type: application/json" \
  -d '{ "public_token": "public-sandbox-abc123" }'
The response includes the linked bank account details (itemId, accountId) needed for deposits and withdrawals.
Your Frontend                    Your Backend                   Bluum API
     │                                │                            │
     │                                │──── Create Link Token ────►│
     │                                │◄─── link_token ───────────│
     │◄─── Launch Plaid Link ────────│                            │
     │──── User selects bank ────────►│                            │
     │──── public_token ─────────────►│                            │
     │                                │──── Exchange Token ───────►│
     │                                │◄─── Bank account details ──│
Set enable_hosted_link: true for a Plaid-hosted redirect flow. The response includes a hosted_link_url you redirect the user to, instead of embedding the Plaid Link widget.

Deposit lifecycle

pending → processing → received → completed

                        failed
StatusMeaning
pendingDeposit created, not yet initiated
processingACH transfer initiated with the bank
receivedFunds received, awaiting final settlement
completedFunds available in wallet
failedTransfer failed (insufficient funds, bank rejection)

Withdrawal lifecycle

pending → processing → submitted → completed
    │                       │
 canceled                failed
Withdrawals in pending status can be canceled.

Manual bank transfers

For manual_bank_transfer deposits, the response includes bank details and a reference code:
{
  "method_details": {
    "referenceCode": "BLUUM-ABC123XY",
    "bankDetails": {
      "bankName": "Choice Financial Group",
      "accountName": "Bluum Finance, Inc.",
      "accountNumber": "202534766488",
      "routingNumber": "091311229",
      "instructions": "Include reference code \"BLUUM-ABC123XY\" in your transfer memo."
    }
  },
  "expires_at": "2025-06-22T10:45:00.000Z"
}
Display the bank details and reference code to your user. The deposit expires at expires_at if funds are not received.

Wire details PDF

Download a formatted PDF with wire transfer instructions for a manual bank transfer deposit:
curl -X GET "$BASE_URL/accounts/$ACCOUNT_ID/deposits/$DEPOSIT_ID/wire-details" \
  -H "Authorization: Basic $AUTH" \
  --output wire-details.pdf
The PDF includes domestic transfer details (and international SWIFT details if configured). Only available for deposits with method manual_bank_transfer.

Idempotency

Always include an Idempotency-Key header on deposit and withdrawal requests:
curl -X POST "$BASE_URL/accounts/$ACCOUNT_ID/deposits" \
  -H "Idempotency-Key: dep-unique-request-id-123" \
  ...
If a request is retried with the same idempotency key, Bluum returns the original response instead of creating a duplicate transfer. See Idempotency for details.

Key endpoints

MethodPathDescription
POST/accounts/{id}/funding-sources/plaid/link-tokenCreate Plaid Link token
POST/accounts/{id}/funding-sources/plaid/connectExchange Plaid public token
GET/accounts/{id}/funding-sourcesList linked funding sources
POST/accounts/{id}/depositsCreate a deposit
GET/accounts/{id}/deposits/{deposit_id}Get deposit status
POST/accounts/{id}/deposits/{deposit_id}/cancelCancel a pending deposit
GET/accounts/{id}/deposits/{deposit_id}/wire-detailsDownload wire details PDF
POST/accounts/{id}/withdrawalsCreate a withdrawal
GET/accounts/{id}/withdrawals/{withdrawal_id}Get withdrawal status
POST/accounts/{id}/withdrawals/{withdrawal_id}/cancelCancel a pending withdrawal