Skip to main content
Bank linking uses Plaid to securely connect the user’s bank account for ACH transfers. This is a frontend + backend flow involving Plaid Link.

Flow overview

Your Frontend                    Your Backend                   Bluum API
     │                                │                            │
     │  User clicks "Link Bank"       │                            │
     │───────────────────────────────►│                            │
     │                                │── POST link-token ────────►│
     │                                │◄── { link_token } ─────────│
     │◄── Open Plaid Link ───────────│                            │
     │                                │                            │
     │  User selects bank & logs in   │                            │
     │                                │                            │
     │── public_token ───────────────►│                            │
     │                                │── POST connect ───────────►│
     │                                │◄── { bank details } ───────│
     │◄── "Bank linked!" ────────────│                            │
Your backend requests a 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 }'
Response:
{
  "status": "success",
  "data": {
    "link_token": "link-sandbox-abc123def456",
    "hosted_link_url": null
  }
}
Use the Plaid Link SDK with the token:
const { open } = usePlaidLink({
  token: linkToken, // from step 1
  onSuccess: (publicToken, metadata) => {
    // Send publicToken to your backend
    exchangeToken(publicToken);
  },
  onExit: (err, metadata) => {
    // User closed Plaid Link
  }
});
Set enable_hosted_link: true to get a Plaid-hosted URL instead. Redirect the user to hosted_link_url — no Plaid SDK needed. Useful for mobile apps or simpler integrations.

Step 3: Exchange the public token

After the user completes Plaid Link, send the public_token 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-abc123def456" }'
Response:
{
  "status": "success",
  "data": {
    "item": {
      "itemId": "item_abc123",
      "institutionName": "Chase Bank",
      "accounts": [
        {
          "accountId": "acc_1234567890",
          "accountName": "Checking Account",
          "accountType": "depository",
          "mask": "0000"
        }
      ]
    }
  }
}
Store itemId and accountId — you’ll need them for deposits and withdrawals.

Managing funding sources

# List linked funding sources
curl -X GET "$BASE_URL/accounts/$ACCOUNT_ID/funding-sources" \
  -H "Authorization: Basic $AUTH"

# Get a specific funding source
curl -X GET "$BASE_URL/accounts/$ACCOUNT_ID/funding-sources/$FUNDING_SOURCE_ID" \
  -H "Authorization: Basic $AUTH"

Multiple bank accounts

Users can link multiple bank accounts. Each connect call adds a new funding source. When making deposits or withdrawals, specify which bank account to use via plaid_options.item_id and plaid_options.account_id.

Next steps