POST https://app.bitgo.com/api/v2/{coin}/wallet/{walletId}/sendcoins with body: {"address": "<destination>", "amount": <amount_in_base_units>, "walletPassphrase": "YOUR_WALLET_PASSPHRASE", "comment": "<memo>"} for single-output sends
For batched sends use POST .../sendmany with {"recipients": [{"address": "...", "amount": ...}]}; BitGo constructs, signs, and broadcasts in one call for hot wallets
If a spend policy triggers, the API returns a pendingApprovalId instead of a transaction hash; retrieve it via GET /api/v2/{coin}/pendingApprovals/{pendingApprovalId}
Approve the pending transaction using a second authenticated API user: PUT /api/v2/{coin}/pendingApprovals/{pendingApprovalId} with {"state": "approved", "walletPassphrase": "APPROVER_PASSPHRASE"}
Once approved, the status transitions to APPROVED and BitGo broadcasts; poll GET /api/v2/{coin}/wallet/{walletId}/transfer/{transferId} to confirm on-chain settlement
For cold or warm wallets, BitGo returns a partially signed transaction (PSBT/half-signed object); the offline signer must complete and return signing via POST /api/v2/{coin}/tx/send
Known gotchas
Amount must be specified in the smallest denomination (satoshis for BTC, wei for ETH); submitting decimal values returns 400 INVALID_AMOUNT
Spend limits configured in the BitGo console apply per transaction and per day; if both are set, the stricter limit triggers approval even if the individual transaction is below the per-tx limit
BitGo Express (local signing service) must be running at the configured host/port for SDK-based signing; connecting to the wrong Express URL signs with the wrong key material silently
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp