Create Go Accounts

Overview

Create a Go Account for each child enterprise in your organization to enable your users to access the Go Network and trade cryptocurrency with BitGo as their sole counterparty. To learn more about the Go Accounts and the Go Network, see BitGo Wallet Types and Go Network Overview.

Creating Go Accounts for child enterprises is similar to creating other wallet types for your own enterprise. However, there are some key differences and steps, outlined below.

Exchange Exchange

Prerequisites

Steps

You can create the Go Account for your child enterprise in one of two ways. The Automated approach leverages an all-in-one endpoint to generate and encrypt the keys, upload them to BitGo, and create the Go Account. If you want a more granular process, we recommend using the Step-by-step approach.

1. Generate Go Wallet

Endpoint: Generate Wallet

export BITGO_EXPRESS_HOST="<YOUR_LOCALHOST>"
export COIN="ofc"
export ACCESS_TOKEN="<SERVICE_USER_ACCESS_TOKEN>"
export LABEL="<YOUR_GO_ACCOUNT_NAME>"
export PASSPHRASE="<SERVICE_USER_LOGIN_PASSPHRASE>"
export CHILD_ENTERPRISE_ID="<CHILD_ENTERPRISE_ID>"
export PASSCODE="<YOUR_ENCRYPTION_CODE>"

curl -X POST \
  http://$BITGO_EXPRESS_HOST/api/v2/$COIN/wallet/generate \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -d '{
    "label": "'"$LABEL"'",
    "passphrase": "'"$PASSPHRASE"'",
    "enterprise": "'"$CHILD_ENTERPRISE_ID"'"
    "type": "trading", # Go Accounts are trading type BitGo wallets
    "passcodeEncryptionCode": "'"$PASSCODE"'", # Encrypts your wallet passphrase
}'
const { BitGo } = require('bitgo');

// Fill in with actual access token
const accessToken = '<SERVICE_USER_ACCESS_TOKEN>';

// Initialize the SDK
const bitgo = new BitGo({
accessToken: accessToken,
env: 'test',
});

// Generate Go Account
async function createGoAccount() {
const goAccount = await bitgo.coin('ofc').wallets().generateWallet({
    label: '<YOUR_WALLET_NAME>',
    passphrase: '<SERVICE_USER_LOGIN_PASSPHRASE>',
    enterprise: '<CHILD_ENTERPRISE_ID>',
    type: 'trading', // Go Accounts are trading type BitGo wallets
    passcodeEncryptionCode: '<YOUR_ENCRYPTION_CODE>'
});

console.log(JSON.stringify(goAccount, undefined, 2));
}

Step Result

BitGo creates a Go Account wallet and returns the wallet data along with the single user keychain.

Note: Please make sure to backup the user keychain - it includes the pub and encryptedPrv keys which are not stored anywhere else.

{
    "wallet": {
        "id": "68f6f18b7af1db4904d979d0d2e5d822",
        "users": [
            {
                "user": "68728b8c66417fe09212fda389cc92c6",
                "permissions": [
                    "admin",
                    "spend",
                    "view",
                    "trade"
                ]
            }
        ],
        "coin": "ofc",
        "label": "your-child-enterprise-go-account",
        "m": 1,
        "n": 1,
        "keys": [
            "68f6f18b8b3ff242f952ceb03a7290a3"
        ],
        "keySignatures": {},
        "enterprise": "68f6abc2b621ab5c1c0b63e4d5da21a0",
        "organization": "68928b9066417fe09212fe9965c88552",
        "bitgoOrg": "BitGo Trust",
        "tags": [
            "68f6f18b7af1db4904d969d0d2e5d822",
            "68f6abc2b621ab5c1c0b63e4d5da21a0"
        ],
        "disableTransactionNotifications": false,
        "freeze": {},
        "deleted": false,
        "approvalsRequired": 1,
        "isCold": false,
        "coinSpecific": {
            "needsKeyReshareAfterPasswordReset": false,
            "pendingSystemInitialization": true
        },
        "admin": {},
        "clientFlags": [],
        "walletFlags": [],
        "allowBackupKeySigning": false,
        "recoverable": true,
        "startDate": "2025-10-21T02:35:55.000Z",
        "type": "trading",
        "buildDefaults": {},
        "customChangeKeySignatures": {},
        "hasLargeNumberOfAddresses": false,
        "hasReceiveTransferPolicy": false,
        "creator": "68728b8c66417fe09211fda389cc48c6",
        "walletFullyCreated": true,
        "config": {},
        "pendingApprovals": []
    },
    "userKeychain": {
        "id": "68f6f18b8b3ff242f952ceb03a7290a3",
        "pub": "xpub661MyMwAqRbcEpSQ8LWmWrDbu3s36XPF3GbZ5MvJiMgDiKCsdmarRuJY6X4CT521BmDYfTmwc6MDazsdu8wBN6fNL9dsY1VzeRwkBvVmcXR",
        "ethAddress": "0x7efb44aeef5583ddc75fff533e27ae59f680d4a2",
        "source": "user",
        "type": "independent",
        "encryptedPrv": "{\"iv\":\"HdF9ZbsQnGmJKnxXzBHouh==\",\"v\":1,\"iter\":10000,\"ks\":256,\"ts\":64,\"mode\":\"ccm\",\"adata\":\"\",\"cipher\":\"aes\",\"salt\":\"FU5QOdz7p7h=\",\"ct\":\"8wKjkJ8Gh5L6AwmzdwEbjaPkO+IoaCDnjcQceFcbZ+PvkTHHH4v6rlbbHIwt6fdsXikrH6I3mhgHYgGf871xYFNjUkbyEAZ/xUPQEtk46G6w6/rH1S8ZXuxkJ/PTHhiKDIl5P+7dd1+KEO8BtLoJCiFlkZiMuP5=\"}"
    },
    "responseType": "GoAccountWalletWithUserKeychain",
    "warning": "Be sure to backup the user keychain -- it is not stored anywhere else!",
    "encryptedWalletPassphrase": "{\"iv\":\"wek1Ha/Po/aUAI/FnJCFtx==\",\"v\":1,\"iter\":10000,\"ks\":256,\"ts\":64,\"mode\":\"ccm\",\"adata\":\"\",\"cipher\":\"aes\",\"salt\":\"J37ZHREx7e9=\",\"ct\":\"px189Udy+8/joIi1EsYZRzuQS2C7j+p=\"}"
}

2. Create Receive Address

Endpoint: Create Address

export WALLET_ID="<YOUR_WALLET_ID>"
export ACCESS_TOKEN="<SERVICE_USER_ACCESS_TOKEN>"
export ON_TOKEN="<OFF-CHAIN_ASSET_ID>"

curl -X POST \
  "https://app.bitgo-test.com/api/v2/ofc/wallet/$WALLET_ID/address" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -d '{
    "onToken": "'"$ON_TOKEN"'", # For example, `ofctsol` for off-chain test Solana
  }'
const { BitGo } = require('bitgo');

// Fill in with actual access token
const accessToken = '<SERVICE_USER_ACCESS_TOKEN>';

// Initialize the SDK
const bitgo = new BitGo({
  accessToken: accessToken,
  env: 'custom',
  customRootURI: 'https://app.bitgo.com',
});

// Get Go Account
const walletId = '<GO_ACCOUNT_WALLET_ID>';
const existingWallet = await bitgo.coin('ofctsol').wallets().get({ id: walletId });

// Use the appropriate wallet instance to create new address
const address = await wallet.createAddress();
console.log(JSON.stringify(address, undefined, 2));

Step Result

You created a new receive address for your Go Account for a specific asset.

{
  "id": "67ec59c0929b08484faecc752f542d8c",
  "address": "HNohgG7TsPkqBhWxxmbE1dRzuNrxSfFfdxuwxYwmMTxm",
  "chain": 0,
  "index": 397,
  "coin": "ofc",
  "token": "ofctsol",
  "wallet": "68f6f18b7af1db4904d979d0d2e5d822"
}

Next Steps

Enable your users to deposit assets into their Go Account, place trade orders, and withdraw their assets:

  1. Deposit Assets
  2. Place Trade Orders
  3. Withdraw from Go Account (Manual) or Withdraw from Go Account (Simple)

See Also