Fund Go Account - ACH Deposit (BitGo Integration)
Fund your Go Account with an ACH deposit using BitGo-hosted Plaid Link. See the Guide.
-
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.
-
Create a Plaid Link token for your end user's enterprise that you can use to initialize the Plaid Link widget in your application.
-
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 thelinkTokenwith BitGo to complete the bank account linking process. -
Retrieve the linked bank account to obtain the
bankAccountIdneeded to initiate the ACH deposit. -
Initiate a new bank transfer using the Go Account
walletIdandbankAccountIdas counterparties. The sameenterpriseIdmust own both thewalletIdandbankAccountId. -
You can check the transfer status, settlement timestamps, and other details of the transfer. ACH deposits typically settle within 1–2 business days.
// 1. 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"
}'
// 2. Create Plaid Link Token
export SERVICE_USER_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 $SERVICE_USER_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"enterpriseId": "'"$ENTERPRISE_ID"'",
"androidPackageName": "'"$ANDROID_PACKAGE_NAME"'",
"redirectUri": "'"$REDIRECT_URI"'"
}'
// 3. 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 SERVICE_USER_TOKEN="<SERVICE_USER_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 $SERVICE_USER_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.
}'
// 4. 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"
// 5. 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"'"
}'
// 6. 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"
// 1. Get Transfer Limit Response
{
"id": "string",
"maximumTransferAllowed": "string",
"maximumTransferAllowedBase": 0,
"noLimit": true,
"transferDirection": "in",
"transferType": "ach-us"
}
// 2. Create Plaid Link Token Response
{
"data": {
"token": "string",
"expiration": "2026-09-22T00:00:00.000Z"
}
}
// 4. 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"
}
]
}
// 5. 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"
}
// 6. 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"
}