Fund Go Account - ACH Deposit (Plaid Integration)

Fund your Go Account with an ACH deposit using client-hosted Plaid Link. See the Guide.

  1. Initialize and launch the Plaid Link flow in your frontend application using the Plaid SDK.

  2. The transfer limit is the amount you can deposit using ACH per calendar day and resets every day at 12am EST. In the test environment, the system limits ACH deposits to $2,500/day and $10,000/week per enterprise.

    API Reference

  3. After your end users select their bank accounts in Plaid Link, generate a processor token from Plaid for BitGo.

  4. Pass the processor token received from Plaid to BitGo to create the bank transfer method for your end user.

    API Reference

  5. Retrieve the linked bank account to obtain the bankAccountId needed to initiate the ACH deposit.

  6. Initiate a new bank transfer using the Go Account walletId and bankAccountId as counterparties. The same enterpriseId must own both the walletId and bankAccountId.

    API Reference

  7. You can check the transfer status, settlement timestamps, and other details of the transfer. ACH deposits typically settle within 1–2 business days.

    API Reference

// 1. Integrate Plaid Link
// Complete this step in your application using the Plaid SDK/API
// 2. Get Transfer Limit
export ENTERPRISE_ID="<YOUR_ENTERPRISE_ID>"
export SERVICE_USER_TOKEN="<SERVICE_USER_ACCESS_TOKEN>"

curl -X GET \
  https://app.bitgo-test.com/api/tradfi/v1/enterprise-transfer-limits/$ENTERPRISE_ID/usd/ach-us/in \
  -H "Authorization: Bearer $SERVICE_USER_TOKEN" \
  -d '{
      "id": "01982d49-9f0d-7c50-847a-e04ea8a63165",
      "maximumTransferAllowed": "2500.00",
      "maximumTransferAllowedBase": 250000,
      "noLimit": false,
      "transferDirection": "in",
      "transferType": "ach-us"
}'
// 3. Create Processor Token
// Complete this step in your application using the Plaid SDK/API
// 4. Pass Processor Token to BitGo
export SERVICE_USER_TOKEN="<SERVICE_USER_ACCESS_TOKEN>"
export ENTERPRISE_ID="<END_USERS_ENTERPRISE_ID>"
export PROCESSOR_TOKEN="<END_USERS_PROCESSOR_TOKEN>"

curl -X POST https://app.bitgo-test.com/api/tradfi/v1/plaid/link/token \
  -H "Authorization: Bearer $SERVICE_USER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "enterpriseId": "'"$ENTERPRISE_ID"'",
    "processorToken": "'"$PROCESSOR_TOKEN"'"
  }'
// 5. Get Bank Account
export SERVICE_USER_TOKEN="<SERVICE_USER_ACCESS_TOKEN>"

curl -X GET \
  https://app.bitgo-test.com/api/v2/bankaccounts \
  -H "Authorization: Bearer $SERVICE_USER_TOKEN"
// 6. Create Bank Transfer
export SERVICE_USER_TOKEN="<SERVICE_USER_ACCESS_TOKEN>"
export AMOUNT="<AMOUNT_TO_DEPOSIT>"
export BANK_ACCOUNT_ID="<BANK_ACCOUNT_ID>" # ID from previous step. 
export WALLET_ID="<GO_ACCOUNT_WALLET_ID>"

curl -X POST https://app.bitgo-test.com/api/tradfi/v1/bank-transfers \
  -H "Authorization: Bearer $SERVICE_USER_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": "'"$AMOUNT_TO_DEPOSIT"'",
    "bankAccountId": "'"$BANK_ACCOUNT_ID"'",
    "transferDirection": "in",
    "walletId": "'"$WALLET_ID"'",
    "instantCreditLiability": true # Option to enable immediate deposits
  }'
// 7. Get Bank Transfer (Optional)
export TRANSACTION_ID="<TX_ID>"
export SERVICE_USER_TOKEN="<SERVICE_USER_ACCESS_TOKEN>"

curl -X GET https://app.bitgo-test.com/api/tradfi/v1/bank-transfers/$TX_ID \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SERVICE_USER_TOKEN"
Response
// 2. Get Transfer Limit Response
{
  "id": "string",
  "maximumTransferAllowed": "string",
  "maximumTransferAllowedBase": 0,
  "noLimit": true,
  "transferDirection": "in",
  "transferType": "ach-us"
}

// 4. Pass Processor Token to BitGo Response
{
  "data": {
    "bankTransferMethodId": "string"
  }
}

// 5. Get Bank Account Response
{
  "memoId": "string",
  "bankAccounts": [
    {
      "type": "ach",
      "routingNumber": "string",
      "accountType": "checking", 
      "id": "string", // Bank account id used for the next step,
      "description": "Nickname for Bank Acount", // User-provided description of the account.
      "name": "Bank Name"
    }
  ]
}

// 6. Create Bank Transfer Response
{
  "amount": "string",
  "applyInstantCredit": true,
  "bankAccountId": "string",
  "createdAt": "2026-04-09T17:17:30.615Z",
  "enterpriseId": "string",
  "estimatedEffectiveOn": "2026-04-09",
  "id": "string",
  "instantCreditLiability": true,
  "memoId": "string",
  "settledAt": "2026-04-09T17:17:30.615Z",
  "status": "initiated",
  "transferDirection": "in",
  "transferType": "ach-us",
  "txid": "string",
  "walletId": "string"
}

// 7. Get Bank Transfer (Optional) Response
{
  "amount": "string",
  "applyInstantCredit": true,
  "bankAccountId": "string",
  "createdAt": "2026-04-10T15:31:57.502Z",
  "enterpriseId": "string",
  "estimatedEffectiveOn": "2026-04-10",
  "id": "string",
  "instantCreditLiability": true,
  "memoId": "string",
  "settledAt": "2026-04-10T15:31:57.502Z",
  "status": "initiated",
  "transferDirection": "in",
  "transferType": "ach-us",
  "txid": "string",
  "walletId": "string"
}