Withdraw - Custody Multisig

Initiate withdrawals with BitGo-managed signing and video verification. See the Guide.

  1. Initiate the transaction by specifying the transaction details, including video approvers, and sending them to BitGo. BitGo uses the data to build an unsigned transaction.

    If your withdrawal doesn't require policy approval, BitGo receives the unsigned transaction directly. If you have policy rules requiring approvals, the transaction remains pending until approved.

    Note: You can only transact from custody wallets in the production environment. BitGo doesn't sign transactions from custody wallets in testnet.

    API Reference

  2. If your withdrawal requires policy approval, another admin must approve it. Once approved, BitGo rebuilds the unsigned transaction with current fees. Log in to BitGo and schedule video ID verification. Once verification completes, BitGo signs the transaction and broadcasts it to the blockchain.

    API Reference

// 1. Initiate Transaction
export COIN="<ASSET_ID>"
export WALLET_ID="<YOUR_WALLET_ID>"
export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>"
export ADDRESS="<DESTINATION_ADDRESS>"
export AMOUNT="<AMOUNT_IN_BASE_UNITS>"
export VIDEO_APPROVER_1="<PUBLIC_ID_1>"
export VIDEO_APPROVER_2="<PUBLIC_ID_2>"

curl -X POST \
  https://app.bitgo-test.com/api/v2/$COIN/wallet/$WALLET_ID/tx/initiate \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -d '{
    "recipients": [
        {
          "amount": "'"$AMOUNT"'",
          "address": "'"$ADDRESS"'"
        }
      ],
    "videoApprovers": [
      "'"$VIDEO_APPROVER_1"'",
      "'"$VIDEO_APPROVER_2"'"
    ]
  }'
// 2. Approve Transaction (Optional)
export APPROVAL_ID="<APPROVAL_ID>"
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 $ACCESS_TOKEN" \
  -d '{
    "state": "approved",
    "otp": "'"$OTP"'"
  }'
Response
// 1. Initiate Transaction Response
{
  "transfer": {
    "id": "6553ee12d5a49ecc9baccdcbe0563448",
    "coin": "tbtc4",
    "wallet": "6553e933288be490293ae748efafeaaf",
    "type": "send",
    "state": "signed"
  },
  "txid": "e7648c85edac7f9870e511b4ef95b62b1878556791bd52ac715cb2cd4b466e6f",
  "status": "signed"
}

// 1. Initiate Transaction Response (pending approval)
{
  "error": "triggered all transactions policy",
  "pendingApproval": {
    "id": "655686880765186f0b3e9e88e1bdd0f4",
    "state": "pending",
    "approvalsRequired": 1
  }
}

// 2. Approve Transaction Response
{
  "id": "655686880765186f0b3e9e88e1bdd0f4",
  "state": "approved"
}