Crypto-as-a-Service: Fund Go Account through Go Network
Create connections and transfer fiat between Go Accounts on the Go Network. See the Guide.
-
Before you can create a settlement with a new counterparty, you need a Go Account connection. Connections exist between two Go Accounts and are one-way. This involves four substeps:
1.1 List Your Enterprise: List your enterprise in the public directory so other enterprises can find you. API Reference
1.2 Create Listing Entry: Create an entry for your Go Account within your enterprise listing. This enables you and others to create connections between your Go Account and theirs. API Reference
1.3 Get Listing Entry ID: Get the enterprise listing and select the entry that has your Go Account walletId. The listingEntryId is
listingEntries[<index>].id. API Reference1.4 Create Counterparty Connection: Create a connection to your counterparty using your listing entry ID and their target listing entry ID. API Reference
-
BitGo refers to the Go Account that creates a counterparty connection and initiates a settlement as the source Go Account. When a source Go Account creates a settlement, BitGo generates a settlement request that requires approval from both counterparties.
The
quantityfield determines the direction of fund movement: positive values indicate receiving funds, while negative values indicate sending funds from your account. -
If you're sending assets in the settlement, you must sign the settlement to confirm the transaction. However, if you're only receiving assets in a settlement, signing is optional.
This involves two substeps: 3.1 Apply Signature using the JavaScript SDK to generate the signature, and 3.2 Submit Signed Settlement to BitGo. Signing a settlement places the assets in your Go Account into a
heldstate, preventing them from use in other transactions. -
If you configure an approval requirement for settlements, you can't approve a settlement you initiated - another admin must always approve it. This step is only required if your enterprise has approval policies configured for settlements.
// 1. Create a Connection
// 1.1 List Your Enterprise
export SERVICE_USER_TOKEN="<SERVICE_USER_ACCESS_TOKEN>"
export DESCRIPTION="<YOUR_PUBLIC_DESCRIPTION>"
curl -X POST \
https://app.bitgo-test.com/api/address-book/v1/listing/global \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $SERVICE_USER_TOKEN" \
-d '{"description": "'"$DESCRIPTION"'"}'
// 1.2 Create Listing Entry
export SERVICE_USER_TOKEN="<SERVICE_USER_ACCESS_TOKEN>"
export WALLET_ID="<YOUR_WALLET_ID>"
export DESCRIPTION="<YOUR_PUBLIC_DESCRIPTION>"
curl -X POST \
https://app.bitgo-test.com/api/address-book/v1/listing/entry/global \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $SERVICE_USER_TOKEN" \
-d '{
"walletId": "'"$WALLET_ID"'",
"description": "'"$DESCRIPTION"'",
"public": true
}'
// 1.3 Get Listing Entry ID
export SERVICE_USER_TOKEN="<SERVICE_USER_ACCESS_TOKEN>"
export CHILD_ENTERPRISE_ID="<CHILD_ENTERPRISE_ID>"
export USER_ID="<YOUR_USER_ID>"
curl -X GET \
https://app.bitgo-test.com/api/address-book/v1/listing/global \
-H "Authorization: Bearer $SERVICE_USER_TOKEN" \
-H "enterprise-id: $CHILD_ENTERPRISE_ID" \
-H "user-id: $USER_ID"
// 1.4 Create Counterparty Connection
export SERVICE_USER_TOKEN="<SERVICE_USER_ACCESS_TOKEN>"
export CHILD_ENTERPRISE_ID="<CHILD_ENTERPRISE_ID>"
export USER_ID="<YOUR_USER_ID>"
export LISTING_ENTRY_ID="<YOUR_LISTING_ENTRY_ID>"
export TARGET_LISTING_ENTRY_ID="<COUNTERPARTY_TARGET_LISTING_ENTRY_ID>"
export LOCAL_LISTING_ENTRY_DESCRIPTION="<LOCAL_LISTING_ENTRY_DESCRIPTION>"
curl -X POST \
https://app.bitgo-test.com/api/address-book/v1/connections \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $SERVICE_USER_TOKEN" \
-H "enterprise-id: $CHILD_ENTERPRISE_ID" \
-H "user-id: $USER_ID" \
-d '{
"listingEntryId": "'"$LISTING_ENTRY_ID"'",
"localListingEntryDescription": "'"$LOCAL_LISTING_ENTRY_DESCRIPTION"'",
"targetListingEntryId": "'"$TARGET_LISTING_ENTRY_ID"'"
}'
// 2. Create Settlement
export CHILD_ENTERPRISE_ID="<CHILD_ENTERPRISE_ID>"
export ACCOUNT_ID="<YOUR_ACCOUNT_ID>"
export SERVICE_USER_TOKEN="<SERVICE_USER_ACCESS_TOKEN>"
export CONNECTION_ID="<CONNECTION_ID>"
export CONNECTION_UPDATED_AT="<CONNECTION_UPDATED_AT>"
export COUNTERPARTY_ACCOUNT_ID="<COUNTERPARTY_ACCOUNT_ID>"
export CURRENCY="<SENDING_ASSET>"
export QUANTITY="<SENDING_QUANTITY>"
export EXTERNAL_ID="<YOUR_EXTERNAL_ID>"
curl -X POST \
https://app.bitgo-test.com/api/clearing/v1/enterprise/$CHILD_ENTERPRISE_ID/account/$ACCOUNT_ID/settlement \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $SERVICE_USER_TOKEN" \
-d '{
"externalId": "'"$EXTERNAL_ID"'",
"addressBookConnectionId": "'"$CONNECTION_ID"'",
"addressBookConnectionUpdatedAt": "'"$CONNECTION_UPDATED_AT"'",
"assetTransfers": [
{
"currency": "'"$CURRENCY"'",
"quantity": "'"$QUANTITY"'"
}
]
}'
// 3. Sign Settlement (Optional)
// 3.1 Apply Signature
// Use JavaScript SDK or BitGo Express to generate signature
// See JavaScript example for implementation
// 3.2 Submit Signed Settlement
export ENTERPRISE_ID="<YOUR_ENTERPRISE_ID>"
export ACCOUNT_ID="<YOUR_ACCOUNT_ID>"
export SETTLEMENT_ID="<SETTLEMENT_ID>"
export SERVICE_USER_TOKEN="<SERVICE_USER_ACCESS_TOKEN>"
export PAYLOAD="<SETTLEMENT_PAYLOAD>"
export SIGNATURE="<YOUR_PUBLIC_KEY>"
curl -X POST \
https://app.bitgo-test.com/api/clearing/v1/enterprise/$ENTERPRISE_ID/account/$ACCOUNT_ID/settlement/$SETTLEMENT_ID/signing \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $SERVICE_USER_TOKEN" \
-d '{
"payload": "'"$PAYLOAD"'",
"signature": "'"$SIGNATURE"'"
}'
// 4. Approve Settlement (Optional)
export APPROVAL_ID="<APPROVAL_ID>"
export SERVICE_USER_TOKEN="<SERVICE_USER_ACCESS_TOKEN>"
export OTP="<YOUR_OTP>"
curl -X PUT \
https://app.bitgo-test.com/api/v2/pendingApprovals/$APPROVAL_ID \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $SERVICE_USER_TOKEN" \
-d '{
"state": "approved",
"otp": "'"$OTP"'"
}'
// 1. Create a Connection
// 1.1 List Your Enterprise
const BitGoJS = require('bitgo');
const bitgo = new BitGoJS.BitGo({
accessToken: '<SERVICE_USER_ACCESS_TOKEN>',
env: 'test',
});
async function listEnterprise() {
const listing = await bitgo.post('/api/address-book/v1/listing/global').send({
description: '<YOUR_PUBLIC_DESCRIPTION>',
});
console.log('Enterprise Listing:', listing);
return listing;
}
listEnterprise().catch(console.error);
// 1.2 Create Listing Entry
async function createListingEntry() {
const entry = await bitgo.post('/api/address-book/v1/listing/entry/global').send({
walletId: '<YOUR_WALLET_ID>',
description: '<YOUR_PUBLIC_DESCRIPTION>',
public: true,
});
console.log('Listing Entry:', entry);
return entry;
}
createListingEntry().catch(console.error);
// 1.3 Get Listing Entry ID
async function getListingEntryId() {
const listing = await bitgo.get('/api/address-book/v1/listing/global')
.set('enterprise-id', '<CHILD_ENTERPRISE_ID>')
.set('user-id', '<YOUR_USER_ID>')
.send();
console.log('Listing:', listing);
return listing;
}
getListingEntryId().catch(console.error);
// 1.4 Create Counterparty Connection
async function createConnection() {
const connection = await bitgo.post('/api/address-book/v1/connections')
.set('enterprise-id', '<CHILD_ENTERPRISE_ID>')
.set('user-id', '<YOUR_USER_ID>')
.send({
listingEntryId: '<YOUR_LISTING_ENTRY_ID>',
localListingEntryDescription: '<LOCAL_LISTING_ENTRY_DESCRIPTION>',
targetListingEntryId: '<COUNTERPARTY_TARGET_LISTING_ENTRY_ID>',
});
console.log('Connection:', connection);
return connection;
}
createConnection().catch(console.error);
// 2. Create Settlement
async function createSettlement() {
const enterpriseId = '<CHILD_ENTERPRISE_ID>';
const accountId = '<YOUR_ACCOUNT_ID>';
const settlement = await bitgo.post(
`/api/clearing/v1/enterprise/${enterpriseId}/account/${accountId}/settlement`
).send({
externalId: '<YOUR_EXTERNAL_ID>',
addressBookConnectionId: '<CONNECTION_ID>',
addressBookConnectionUpdatedAt: '<CONNECTION_UPDATED_AT>',
assetTransfers: [
{
currency: '<SENDING_ASSET>',
quantity: '<SENDING_QUANTITY>',
},
],
});
console.log('Settlement:', settlement);
return settlement;
}
createSettlement().catch(console.error);
// 3. Sign Settlement (Optional)
// 3.1 Apply Signature
import { BitGoAPI } from '@bitgo/sdk-api';
import { coins } from '@bitgo/sdk-core';
const OFC_WALLET_ID = process.env.OFC_WALLET_ID;
const payload = process.env.PAYLOAD;
const walletPassphrase = process.env.OFC_WALLET_PASSPHRASE;
const bitgoAPI = new BitGoAPI({
accessToken: process.env.TESTNET_ACCESS_TOKEN,
env: 'test',
});
const coin = 'ofc';
bitgoAPI.register(coin, coins.Ofc.createInstance);
async function applySignature() {
const wallet = await bitgoAPI.coin('ofc').wallets().get({ id: OFC_WALLET_ID });
const tradingAccount = wallet.toTradingAccount();
const signature = tradingAccount.signPayload({ payload, walletPassphrase });
console.log('Signature:', signature);
return signature;
}
applySignature().catch(console.error);
// 3.2 Submit Signed Settlement
async function submitSignedSettlement() {
const enterpriseId = '<YOUR_ENTERPRISE_ID>';
const accountId = '<YOUR_ACCOUNT_ID>';
const settlementId = '<SETTLEMENT_ID>';
const result = await bitgo.post(
`/api/clearing/v1/enterprise/${enterpriseId}/account/${accountId}/settlement/${settlementId}/signing`
).send({
payload: '<SETTLEMENT_PAYLOAD>',
signature: '<YOUR_PUBLIC_KEY>',
});
console.log('Signed Settlement:', result);
return result;
}
submitSignedSettlement().catch(console.error);
// 4. Approve Settlement (Optional)
async function approveSettlement() {
const approvalId = '<APPROVAL_ID>';
const approval = await bitgo.put(`/api/v2/pendingApprovals/${approvalId}`).send({
state: 'approved',
otp: '<YOUR_OTP>',
});
console.log('Approval:', approval);
return approval;
}
approveSettlement().catch(console.error);
// 1. Create a Connection
// 1.1 List Your Enterprise Response
{
"id": "9f627592-641f-4300-96c4-819fafb6435a",
"createdAt": "2026-02-09T21:20:05.269Z",
"updatedAt": "2026-02-09T21:20:05.269Z",
"enterpriseId": "698a2f58718d0f73eb4ba9faeb491be0",
"name": "roychon401+30@bitgo.com",
"owner": "698a2f58718d0f73eb4ba9faeb491be0"
}
// 1.2 Create Listing Entry Response
{
"walletId": "698a3d58066a618a569a8dd844c514d4",
"type": "GO_ACCOUNT",
"coin": "ofc",
"discoverable": true,
"featured": false,
"id": "a2a48c3c-5ab1-46ab-bd05-59082576c5c2",
"createdAt": "2026-02-09T21:29:26.194Z",
"updatedAt": "2026-02-09T21:29:26.194Z"
}
// 1.3 Get Listing Entry ID Response
{
"id": "10b51fd8-6ef7-4ad1-8a84-56f84abfec7a",
"createdAt": "2026-01-14T15:31:45.292Z",
"updatedAt": "2026-01-14T15:31:45.292Z",
"enterpriseId": "6967afd69792fa80c629f22bb52caed6",
"name": "Test User",
"description": "abc123",
"owner": "6967afd69792fa80c629f22bb52caed6",
"listingEntries": [
{
"id": "1a7b6239-8412-4702-b000-b40ee5351761",
"createdAt": "2026-01-14T15:31:46.052Z",
"updatedAt": "2026-01-14T15:31:46.052Z",
"walletId": "6967b45a4ffdedb5747d5934e544b94c",
"coin": "ofc",
"type": "GO_ACCOUNT",
"description": "abc123",
"discoverable": false,
"featured": false
}
]
}
// 1.4 Create Counterparty Connection Response
{
"connections": [
{
"id": "eafc174e-d1b9-4baf-ba78-275e6d699850",
"createdAt": "2026-01-14T18:14:20.015Z",
"updatedAt": "2026-01-14T18:14:20.275Z",
"label": "DVP connection",
"status": "ACTIVE",
"createdBy": "abc123",
"updatedBy": "abc123",
"hidden": false,
"type": "DVP",
"ownerListingEntry": {
"id": "abc123",
"createdAt": "2026-01-14T15:31:46.052Z",
"updatedAt": "2026-01-14T15:31:46.052Z",
"walletId": "abc123",
"coin": "ofc",
"type": "GO_ACCOUNT",
"description": "abc123",
"discoverable": false,
"featured": false,
"listing": {
"id": "abc123",
"name": "abc123",
"description": "abc123",
"editable": false
}
},
"targetListingEntry": {
"walletId": "abc123",
"coin": "ofc",
"type": "GO_ACCOUNT",
"description": "abc123",
"discoverable": false,
"id": "abc123",
"createdAt": "2026-01-14T15:31:46.052Z",
"updatedAt": "2026-01-14T15:31:46.052Z",
"featured": false,
"listing": {
"description": "abc123",
"name": "abc123",
"id": "abc123",
"editable": false
}
}
}
]
}
// 2. Create Settlement Response
{
"id": "string",
"requesterAccountId": "abc123",
"status": "pending",
"type": "direct",
"externalId": "abc123",
"bypassCounterpartySigning": false,
"createdAt": "2019-08-24T00:00:00.000Z",
"updatedAt": "2019-08-24T00:00:00.000Z",
"approvalRequests": [
{
"id": "23d3e6c5-72d2-41e8-9e79-8d7e09a19b74",
"accountId": "abc123",
"status": "acknowledged",
"payload": "abc123",
"createdAt": "2019-08-24T00:00:00.000Z",
"updatedAt": "2019-08-24T00:00:00.000Z"
}
],
"settlementTransfers": [
{
"id": "b5f1ab55-b510-4bf6-92cd-214a7e23321",
"sourceTradingAccountId": "abc123",
"destinationTradingAccountId": "abc123",
"currency": "ofctsol",
"quantity": "1",
"txIds": [],
"createdAt": "2019-08-24T00:00:00.000Z",
"updatedAt": "2019-08-24T00:00:00.000Z"
}
],
"requesterAccountName": "abc123"
}
// 3. Sign Settlement (Optional)
// 3.1 Apply Signature Response
"1f2f62b22832940d82819eccc9e2fbcb5339ae863bc9fba4d6cc62f01550fc325a7e007fb8b753d0e862145e716d4a6054f75c2da2b7c2ac5d41679683a4996349"
// 3.2 Submit Signed Settlement Response
{}
// 4. Approve Settlement (Optional) Response
{
"id": "65529448bd87efe59c3b0156ddfce867",
"coin": "tbtc4",
"wallet": "654ec786c07fe8dc0dcfe03916ec5bb0",
"enterprise": "62c5ae8174ac860007aff138a2d74df7",
"state": "approved",
"scope": "wallet",
"approvalsRequired": 1
}