Overview
An organization vault is an ordinary Trustodian multisig whose owners are org wallets and which is tagged with the caller’sorganizationId. It behaves exactly like a personal vault, with the same shapes, signature threshold and order lifecycle, but it is owned and governed by the organization rather than by one user.
The SDK makes that switch with one field:
Organization vaults take no hardware wallet owners. Adding one is refused with
VAULT_OWNER_HARDWARE_ORG_UNAVAILABLE.walletScope is 'organization'.
Visibility: every vault versus mine
An Employee calling
listOrgVaults() gets 403, surfaced as PermissionDeniedError. A Master calling listMyOrgVaults() gets the participation-filtered subset rather than the full inventory, so the two are not interchangeable even for a Master. Deactivated vaults and vaults from other organizations are filtered out of both.
Full-detail reads
listOrgVaultsByChain is callable by Master and Employee alike, and needs any of ViewBalances, VaultManagement or TransactionManagement.History
Creation and activation lifecycle
Every org vault call checks the API key, active organization membership, the member’s role and the key’s permissions. On top of that:- Creation requires a verified identity and 2FA, is Master only, and needs
VaultManagement. - Activation requires 2FA and, where the organization enforces it, KYC. It allows Master or Employee, and needs
VaultManagement.
What creation and activation need
Every chain also takes optional
ownerLabels, one per owner (see
Owners and threshold).
Creation tags the vault to the caller’s organization automatically. The vault is not on chain until
it is activated.
Through the SDK
activateMultisig picks the whole per-chain sequence for you: for Solana it fetches the blockhash from sol/tx/deploy, signs locally, and broadcasts to sol/deploy; for Tron and XRP it uploads the share and then broadcasts. userRef (or runWithUserRef) plus an unlocked session are required, because SOL, TRON and XRP need the activation-share encryption keys. feeQuote is a required field on ActivateMultisigInput.
Rename and delete stay on the personal vault methods (updateMultisigName, deleteMultisig); there is no org twin for either. Owner names work the same way: setOwnerName / resetOwnerName cover organization vaults too, and an employee who can see the vault may name its owners for themselves.
Vault keys for Bitcoin and Cardano
On every other chain an employee signs a vault order with the org wallet they were already given through employee wallet provisioning. Bitcoin and Cardano vaults do not work that way. Each owner sits in the vault on a separate cosigner key, and that key is not the wallet key: it is the vault account key, derived from the Master’s recovery phrase at the seat’saccountIndex. Wallet provisioning never touches it.
So an employee who holds an assigned org wallet and nothing else can open a BTC or ADA vault, see its balance and propose orders, but cannot sign one. They need a second grant, on the vault.
Use isCosignerPoolChain(chainType) to decide whether a vault needs this at all. It covers BTC, BTC_T3 and ADA; everything else is wallet provisioning only.
The handshake
It mirrors the wallet one: the Master hands the key over encrypted to a one-time password, the employee re-encrypts it under their own password. A member can hold more than one seat in the same vault, and each seat is granted separately.1
Read the seats (Master)
seedId and seedOwnerKind name the phrase the seat derives from. xpub (Bitcoin) and paymentKeyHashHex (Cardano) are the public key the seat must reproduce.2
Provision (Master)
tempPassword over the same way you would for a wallet grant.Pass cosignerKeyId from the seat. When a member holds more than one seat in the vault, the call without it throws ClientUpgradeRequiredError rather than guess which seat you meant.3
Accept (Employee)
tempPassword, so the Master hands over one secret instead of one per grant. A seat that fails is reported in the results rather than aborting the rest.
Reading grant status
On a vault row,
vaultKeyAccess aggregates the member’s seats worst first, so a single pending seat keeps the whole vault at pending.
Signing
PassderivationSource from the wallet listing into signOrder:
'seed' means this signer derives it from their own recovery phrase, which is how the seat’s owner signs. Any other value means they do not hold that phrase, so the key can only be rebuilt from the seat’s shares, and that is what an employee’s org wallet comes back as.
An omitted value is read as the share path, since a caller that resolved nothing has not claimed ownership. Pass the value through from the listing rather than hardcoding it or leaving it out, or the seat’s owner takes the employee’s route and gets a seat error instead of a signature.
Send walletPassword on the same call whenever you have it:
Device share not on device; wallet password required for recovery, and you prompt for the password and retry.
Organization orders
Org orders take the same inputs and return the same shapes as personal orders. Only the organization role checks differ. So every order method takes the samewalletScope:
walletScope: 'organization'. See Orders.