Crypto-as-a-Service
Fund Go Accounts
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 |
Plaid Link
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
- Get Started
- Create Go Accounts
- Set Up Fiat Reserve
- For ACH transfers, you must have a Plaid account. Contact your BitGo Customer Success Manager (CSM) to set up your Plaid credentials.
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 CookbookSelect 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"
}
2. Create Plaid Link Token
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"
}
1. Integrate Plaid Link
For guidance on how to integrate Plaid Link, see the Plaid documentation.
2. 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"
}
3. Create Processor Token
For guidance on how to create the processor token (processor_token), see the Plaid documentation.
4. Pass Processor Token to BitGo
Endpoint: Create bank transfer method from Plaid processor token
export ACCESS_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/processor-token \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"enterpriseId": "'"$ENTERPRISE_ID"'",
"processorToken": "'"$PROCESSOR_TOKEN"'"
}'
Step Result
{
"data": {
"bankTransferMethodId": "string"
}
}
5. 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"
}
]
}
6. 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.
Instant Credit
Instant Credit
Instant cedit (instantCreditLiability) enables your users to receive funds in their Go Account immediately after initiating an ACH deposit, without having to wait for the deposit to settle.
For instant credit to be enabled, your fiat reserve must have a sufficient balance to cover the minimum threshold.
How It Works
- When your end user initiates a deposit with instant credit enabled, BitGo performs a risk analysis using data from the linked Plaid account.
- If approved, BitGo credits their Go Account immediately and the fiat is immediately available.
- Once the ACH transfer fully settles, the instant credit transaction automatically reconciles.
Monitoring Instant Credit Liability
Transfers with instant credit count against your reserve account balance. You can check the instantCreditLiability field on individual transfers to determine how much of your reserve is currently committed.
Note
Instant Credit is not guaranteed. If the risk analysis returns an unfavorable result, the deposit proceeds normally with standard settlement timing.
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"'",
"instantCreditLiability": true # Option to enable immediate deposits
}'
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"
}
7. 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"
}
Other Payment Rails
Payment rails, such as wire or SEPA, vary by jurisdiction. These are reliable ways to fund Go Accounts with high-value or international deposits. BitGo provides deposit instructions specific to each enterprise and Go Account. These transfers work best for:
- Large-value deposits.
- Time-sensitive transfers.
- International fiat inflows.
1. Get Deposit Info
Get deposit details for BitGo bank accounts. Banks vary by Go Account jurisdiction. EU residents also have access to a Virtual International Bank Account Number (vIBAN).
Endpoint: Get deposit info
export CURRENCY="<FIAT_CURRENCY_ASSET_ID>"
export GO_ACCOUNT_ID="<GO_ACCOUNT_WALLET_ID>"
export ACCESS_TOKEN="<SERVICE_USER_ACCESS_TOKEN>"
curl -X GET \
https://app.bitgo-test.com/api/v2/bankaccounts/deposit/info?currency=$CURRENCY&goAccountId=$GO_ACCOUNT_ID \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $ACCESS_TOKEN"
export type Fee {
amount: string
individualFees:
{
type: "static" | "variable",
amount: string
}[]
}
export type BankAccount {
id: string;
description?: string;
idHash: string;
currency: string;
accountNumber: string;
token: string;
name: string;
shortCountryCode: string;
enterpriseId: string;
trustOrg: string;
ownerName: string;
verificationState: string;
createdAt: string;
ownerAddressLine1: string;
ownerAddressLine2?: string;
ownerAddressCityLocality?: string;
ownerAddressStateProvince?: string;
ownerAddressPostalCode?: string;
ownerAddressCountryCode: string;
bankAddressLine1: string;
bankAddressLine2?: string;
bankAddressCityLocality?: string;
bankAddressStateProvince?: string;
bankAddressPostalCode?: string;
bankAddressCountryCode: string;
virtualDepositOnly: boolean;
type: string;
routingNumber?: string;
swiftCode?: string;
accountType: string;
fee: Fee
}
export type DepositInfo = {
memoId: string;
bankAccounts: BankAccount[];
};
Step Result
Save the memoId. BitGo uses this ID to link deposits to Go Accounts.
{
"bankAccounts": [
{
"accountNumber": "123456789",
"accountType": "checking",
"address": "Ste 1400, Phoenix, AZ 85004, United States of America",
"address1": "Ste 1400, Phoenix, AZ 85004, United States of America",
"bankAddressCityLocality": "Phoenix",
"bankAddressCountryCode": "US",
"bankAddressLine1": "Ste 1400",
"bankAddressPostalCode": "85004",
"bankAddressStateProvince": "AZ",
"createdAt": "2026-07-22T19:39:01.484372Z",
"currency": "tfiatusd",
"enterpriseId": "68cc07a26b0eb871423ef15781d99121",
"fee": {
"amount": "1000",
"individualFees": [{ "amount": "1000", "type": "static" }]
},
"feeInfo": {
"amount": "1000",
"bank": "customers_cubix_api",
"coin": "tfiatusd",
"type": "static"
},
"id": "b23bbce8-dad1-41dd-ac71-4fd9bcd0a58b",
"idHash": "1d6fd97db569ff2b",
"name": "WESTERN ALLIANCE BANK",
"owner": {
"name": "BitGo Bank & Trust",
"address1": "2443 Ash Street, Suite 200, Palo Alto, CA 94306, United States of America"
},
"ownerAddress": "2443 Ash Street, Suite 200, Palo Alto, CA 94306, United States of America",
"ownerAddressCityLocality": "Palo Alto",
"ownerAddressCountryCode": "US",
"ownerAddressLine1": "2443 Ash Street",
"ownerAddressLine2": "Suite 200",
"ownerAddressPostalCode": "94306",
"ownerAddressStateProvince": "CA",
"ownerName": "BitGo Bank & Trust",
"routingNumber": "122105980",
"shortCountryCode": "US",
"token": "ofctusd",
"trustOrg": "BitGo Trust",
"type": "wire",
"verificationState": "approved",
"virtualDepositOnly": false
}
],
"memoId": "NKNKASPXVH"
}
2. Deposit Fiat Currency
Initiate the transfer from your bank app or API. Review the documentation provided by your bank or contact them to learn more.
Important
Ensure your deposit includes the memo ID returned in the previous step.
Step Result
The balance of fiat currency in your Go Account updates with the deposited amount. The deposited balance is immediately available for trades.
Go Network
If your end users have a fiat balance in another Go Account you control, you can simply make a Transfer Between Go Accounts.
Next
You can verify successful deposits by calling the Get Account Balance endpoint.
See Also
- API Reference: Build a Transaction
- API Reference: Create a Bank Transfer
- API Reference: Create Plaid Link token
- API Reference: Exchange Plaid Public Token
- API Reference: Get a Bank Transfer
- API Reference: Get bank account
- API Reference: Get Deposit Info
- API Reference: Get Enterprise Transfer Limits
- API Reference: List Bank Accounts
- API Reference: List Enterprise Transfer Limits
- API Reference: Send Half-Signed Transaction
- API Reference: Update Pending Approval
- Nacha Operation Rules
- Plaid Link