Skip to main content

Overview

Org wallets are owned by the organization, created by a Master, and handed to employees through the assignment + provisioning handshake described on Organization. Two visibility rules run through every method on this page:
  • A Master sees every wallet in the organization.
  • An Employee sees only wallets currently assigned to them. Anything else is 403 or 404.

Wallet scope

WalletScope is 'personal' | 'organization'. See Wallet scope on Wallets for what it is and which methods accept it. Passing 'organization' switches share fetches, share rotation, spend authorization, vault lifecycle and orders to their organization equivalents in one step. walletScope is an optional field on SendTransactionInput, SendTokenInput, EstimateFeeInput, ExportWalletInput, CreateMultisigInput, ActivateMultisigInput, CreateOrderInput, CreateSendOrderInput, CreateSettingsOrderInput, SignOrderInput, RejectOrderInput, ExecuteOrderInput, GetOrdersInput, GetOrderByIdInput, and DeleteOrderInput.
When walletScope is omitted, the share fetch tries the personal path first and retries on the org path on 404 or 403. Passing walletScope: 'organization' skips that wasted round trip, so set it explicitly when you know the wallet is org-owned.

Spend authorization

Every send hands the unsigned transaction to the server before the key is rebuilt. The server reads the real recipient, token and amount out of it and returns a single-use authorizationId:
That handle is then sent as spendAuthorizationId on the share request, and the server charges the org’s daily spending limit against its own reading of the transaction rather than a client-reported amount. The two are mutually exclusive: the SDK never sends spendAuthorizationId together with a client-computed spendAmountHuman. This is fully automatic inside sendTransaction; there is no public SDK method for it. When the server replies 400 with body code ERROR_SPEND_NOT_DECODABLE, the SDK falls back to the client-computed context rather than blocking the send. The authorization step also runs the forceAddressBook destination check. See Governance & policies.

Creating and managing org wallets

createOrgWallet runs the same client-side MPC generation as the personal createWallet and then registers the wallet with the backend; the device share is written to shareStore before the method resolves. When mode is omitted the SDK resolves it from the account profile: an account with a recovery phrase takes the shareless seed path, and the resulting OrgWalletItem carries derivationSource: 'seed' with an index. Those fields, with derivationSeedId when the listing has it, are exactly what provisionOrgMemberWalletAccess needs later.

Which phrase a seed wallet comes from

A seed org wallet derives from the organization’s own recovery phrase, or from the Master’s personal phrase while the organization is linked to it. The SDK reads which one applies; pass seedOwnerKind: 'organization' | 'personal' only to pick it yourself. When the organization uses a phrase of its own, that phrase has to exist and be confirmed first: deleteOrgWallet triggers server-side MPC share cleanup and writes an Org Wallet Deleted audit row.

Listing

Pagination on listOrgWallets is opt-in. Omit page and limit and you get the full list with no total, page or limit fields, so do not branch on total being present to decide whether more pages exist. limit is capped at 100. chainTypes filters in both modes.

Balances, UTXOs, history

getOrgWalletPortfolio is the one-wallet form of the batch method. The batch form settles each wallet independently and silently drops failures, so an inaccessible wallet comes back as an empty array, which the SDK turns into a NotFoundError rather than undefined.An Employee without ViewBalances still gets a response from the batch form, but every entry has tokens: [].
OrgWalletUtxosResponse is { utxos: unknown[] }. Entries are chain-specific, since BTC and ADA differ, so cast at the call site based on chainType.

Lower-level building blocks

provisionOrgMemberWalletAccess and acceptOrgWalletAccessWithPassword, described under Employee wallet provisioning on Organization, are convenience wrappers. Split them when the crypto and the HTTP call must happen in different processes:
buildProvisionEmployeeWalletPayload does not call the server; it only produces the encrypted material. buildAcceptEmployeeWalletPayload does read what the Master handed over, but it does not post the accept. You own both HTTP calls in this mode.

Corporate Address Book

The org address book is a separate store from the personal one documented in Address Book, and it is what the forceAddressBook policy whitelists against.
FATF Travel Rule fields are validated server-side and conditionally required:
API-key adds are auto-verified. An entry created through an API key comes back with isVerified: true and immediately counts toward the forceAddressBook whitelist. Browser flows still require OTP confirmation, which is why listOrgAddresses() can return unverified rows. Only isVerified === true entries whitelist a transfer.
UpdateOrgAddressInput deliberately omits address and chainType: both are immutable server-side. UpdateOrgAddressBookEntryInput is that shape plus the addressId the SDK lifts into the path.

Method reference

Last modified on September 30, 2026