Your integration never establishes the personal phrase. An account cannot be issued an API key
until it has registered, set a wallet password and created or imported a recovery phrase in the
Trustodian app, so the seed already exists by the time the SDK runs. This page covers what that
means for you: the derivation paths, reading the state, and the errors.
An account whose root is a hardware wallet has no recovery phrase. Its wallets derive on the device,
and
establishRecoveryPhrase throws HardwareAccountRefusedError (SEED_ROOT_IS_HARDWARE). See
Hardware Wallets.What the account seed is
Wallets on a Trustodian account are not independent keys. The account has one BIP39 recovery phrase behind it, the account seed, and the SDK derives every wallet from that seed on a standard path, at its own HD index per chain. There is one secret to protect for the whole account, not one per wallet. The seed is split 2-of-3 and rebuilt from the wallet password when a key is needed. The wallets themselves are shareless: they carryderivationSource: 'seed', a derivationPath and a per-chain index, nothing is written to your share store for them, and a signing key is re-derived on demand and wiped when the call returns.
The recovery phrase is the last resort. If it and the wallet password are both lost, the wallets are gone.
The phrase is portable. Derivation uses the standard paths, so the same phrase imported into
MetaMask, Phantom, Trust, Eternl, Xaman, Sparrow or TronLink produces the same addresses. A phrase
set up in the Trustodian web app can also carry a BIP39 passphrase. The SDK derives with it, and an
external wallet needs the same passphrase to produce the same addresses.
Lifecycle
getRecoveryPhraseStatus() returns { established, verified }; hasRecoveryPhrase() is the boolean shortcut. Both report on the account the API key resolves to.
Establishing, verification and import
The account holder generates or imports the phrase once and completes a one-time verification step, both during app onboarding. Attempting to establish a second phrase returnsSeedAlreadyEstablishedError.
Use getRecoveryPhraseStatus() to assert the state if you need to.
Derivation paths
Wallets are derived on the standard path for each chain, at a per-chain index.Creating seed wallets
Once a phrase is established,createWallet routes to the seed path on its own. You do not pass a mode:
Signing with a seed wallet
Signing re-derives the key from the account seed instead of reading shares. The address check still applies: a derived key that does not reproduce the wallet address raises anADDRESS_MISMATCH error and never signs.
A wallet always signs with the phrase it was created from, personal or organization. The SDK never falls back to another phrase.
Because it rebuilds the seed, signing a seed wallet needs the wallet password unless
seedEntropyCache is on. With no password and no cache the SDK fails closed rather than deriving
blind. See the cache trade-off.Organization recovery phrase
An organization can have a recovery phrase of its own, separate from its Master’s personal phrase. It belongs to the Master’s account and opens with the same wallet password. Organization wallets derive from it; personal wallets keep deriving from the personal phrase.Reading the state
getSeedStatus() returns the state of both phrases:
organization is null for anyone who is not the Master of an organization. The method returns
null when the status is not available.
Creating it
The Master creates the organization’s phrase withestablishRecoveryPhrase:
mnemonic throws InvalidInputError.
The Archive
Once the organization has its own phrase, the organization wallets created from the personal phrase form its Archive. They keep working: they can still send, receive and sign. New organization vaults accept only wallets of the organization’s phrase, and offering a wallet from the Archive as an owner throwsOrgWalletRequiresOrgSeedError.
The Archive is not accessState: 'archived'. Its wallets derive from the Master’s current personal
phrase and stay active; archived marks wallets of a phrase that was replaced, which can no longer
sign vault orders. See Wallet generations.
An organization wallet is in the Archive when availability is available and the wallet has
derivationSource: 'seed' with seedOwnerKind: 'personal'.
What stays in the web app
Linking an organization to the personal phrase, entering anawaiting_phrase phrase again,
replacing, recovering and revealing a phrase are available only in the Trustodian web app. The SDK
never does any of them, and never creates a phrase you did not ask for. The typed errors below say
which web app action is needed.
Revealing the phrase
Errors
Full reference: Errors.
Handling rules
Never persist the phrase
Never persist the phrase
Not in your database, not in a cache, not in a session store, not in a queue message. The one
legitimate destination is the end user’s own eyes, once, at establish time.
Never log it, and audit your serializers
Never log it, and audit your serializers
Structured loggers, APM tools and error trackers serialize objects wholesale. Make sure the
variable holding
mnemonic is never inside anything that gets serialized, including an error’s
details.Show it once, and say so
Show it once, and say so
The phrase is shown once, at onboarding. If the user did not write it down, the only way back is
a gated, audited reveal in the Trustodian web app — your integration cannot retrieve it. Tell them
that on the screen where you show it.