Overview

Your end users can transfer fiat currency from their bank account to their Go Accounts using multiple payment rails, depending on jurisdiction.

Supported Payment Rails

Jurisdiction Currency Payment Rails
United States USD ACH debit, domestic and international wire transfers, Go Network
Europe EUR SEPA Instant, SEPA, BLINC transfers, Go Network
Singapore USD, SGD FAST, International Wire

BitGo uses Plaid Link for ACH deposits. Plaid Link enables you to verify your end users' bank funding sources and connect them to BitGo without handling or storing sensitive account details. Once connected, they can authenticate with their financial institution, select the account they want to connect, and transfer fiat currency to their Go Account.

Note

When transacting from bank accounts, ensure ticker symbols use the fiat prefix. To learn more, see Asset Ticker Symbols.

Prerequisites

Cookbooks

Need just the steps? Expand a cookbook below to get started:

Fund Go Account - ACH Deposit (BitGo Integration)Open Cookbook Fund Go Account - ACH Deposit (Plaid Integration)Open Cookbook Fund Go Account - Wire TransferOpen Cookbook Fund Go Account (Go Network)Open Cookbook

Select Funding Rail

ACH Deposit

ACH deposits are available only for USD transfers from US bank accounts. ACH deposits are best for:

  • Small-to-medium size deposits.
  • User experiences with a debit-based model (also known as a pull model).
  • Transfers that can wait 1–2 business days to settle.

ACH deposits have a 5 business day hold. During this period, withdrawing or moving the principal is disabled — this includes staking, transfers, or any other movement. However, trading and withdrawing profits are both allowed.

Warning:

ACH unauthorized returns must stay below 0.5% of total debit in order to comply with Nacha Operation Rules. If you exceed this threshold, BitGo may suspend your ACH access.

Select ACH Flow

There are two distinct integration flows for ACH deposits, depending on if you have an integragtion with Plaid. Select the flow that works best for you.

1. Get Transfer Limit

The transfer limit is the amount you can deposit using ACH per calendar day and resets every day at 12am EST.

Endpoint: Get Enterprise Transfer Limits

export ENTERPRISE_ID="<YOUR_ENTERPRISE_ID>"
export ACCESS_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 $ACCESS_TOKEN" \
  -d '{
      "id": "01982d49-9f0d-7c50-847a-e04ea8a63165",
      "maximumTransferAllowed": "2500.00",
      "maximumTransferAllowedBase": 250000,
      "noLimit": false,
      "transferDirection": "in",
      "transferType": "ach-us"
}'

Step Result

{
  "id": "string",
  "maximumTransferAllowed": "string",
  "maximumTransferAllowedBase": 0,
  "noLimit": true,
  "transferDirection": "in",
  "transferType": "ach-us"
}

Create a Plaid Link token for your end user's enterprise that you can use to initialize the Plaid Link widget in your application.

If your application runs on a mobile device, include the androidPackageName and redirectUri parameters to support OAuth redirect flows.

Endpoint: Create Plaid Link token

export ACCESS_TOKEN="<SERVICE_USER_ACCESS_TOKEN>"
export ENTERPRISE_ID="<YOUR_ENTERPRISE_ID>"
export ANDROID_PACKAGE_NAME="<YOUR_ANDROID_PACKAGE_NAME>"
export REDIRECT_URI="<YOUR_REDIRECT_URI>"

curl -X POST https://app.bitgo-test.com/api/tradfi/v1/plaid/link/token \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "enterpriseId": "'"$ENTERPRISE_ID"'",
    "androidPackageName": "'"$ANDROID_PACKAGE_NAME"'",
    "redirectUri": "'"$REDIRECT_URI"'"
  }'

Note

If you haven't configured your Plaid credentials, the server responds with 428 Precondition Required. Contact your BitGo CSM to complete Plaid set up.

Step Result

Use the returned token to render the Plaid Link widget in your application. For rendering guidance, refer to the Plaid documentation.

{
  "data": {
    "token": "string",
    "expiration": "2026-09-22T00:00:00.000Z"
  }
}

3. Exchange Plaid Public Token

After your end users select their bank accounts in the Plaid widget, Plaid returns a public token (publicToken) to your application. Exchange this token along with the linkToken with BitGo to complete the bank account linking process.

Endpoint: Exchange Plaid Public Token

export ENTERPRISE_ID="<YOUR_ENTERPRISE_ID>"
export LINK_TOKEN="<LINK_TOKEN_FROM_STEP_1>"
export PUBLIC_TOKEN="<PUBLIC_TOKEN_FROM_PLAID>"
export ACCESS_TOKEN="<ACCESS_TOKEN>"
export IP_ADDRESS="<IP_ADDRESS>"

curl -X POST https://app.bitgo-test.com/api/tradfi/v1/plaid/link/token/exchange \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "enterpriseId": "'"$ENTERPRISE_ID"'",
    "linkToken": "'"$LINK_TOKEN"'",
    "publicToken": "'"$PUBLIC_TOKEN"'",
    "ipAddress": "'"$IP_ADDRESS"'" # IP address of the end user who completed Plaid Link. Optional, but provide this value to improve the users Instant Credit trust score.
  }'

BitGo fetches the selected bank accounts asynchronously. BitGo adds them to your end user's account within a few seconds.

4. Get Bank Account

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

Endpoint: List bank accounts

export ACCESS_TOKEN="<ACCESS_TOKEN>"

curl -X GET \
  https://app.bitgo-test.com/api/v2/bankaccounts \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Step Result

{
  "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"
    }
  ]
}

5. Create Bank Transfer

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

Note

The test environment caps ACH deposits at $2,500/day and $10,000/week per enterprise.

Endpoint: Create a Bank Transfer

export ACCESS_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 $ACCESS_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": "'"$AMOUNT_TO_DEPOSIT"'",
    "bankAccountId": "'"$BANK_ACCOUNT_ID"'",
    "transferDirection": "in",
    "walletId": "'"$WALLET_ID"'"
  }'

Step Result

{
  "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"
}

6. Get Bank Transfer (Optional)

You can check the transfer status, settlement timestamps, and other details of the transfer.

Endpoint: Get Bank Transfer

export TRANSACTION_ID="<TX_ID>"
export ACCESS_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 $ACCESS_TOKEN"

Step Result

ACH deposits typically settle within 1–2 business days.

{
  "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"
}

Next

You can verify successful deposits by calling the Get Account Balance endpoint.

See Also