Skip to main content
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 carry derivationSource: '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.
The backend never sees the phrase or the raw entropy. Neither Trustodian nor you can reset it. If the user loses the phrase and the wallet password, seed wallets are gone.

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 returns SeedAlreadyEstablishedError. 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.
ADA varies the account, not the address leaf. Each Trustodian ADA wallet is an independent CIP-1852 account with its own stake key, so an external restore has to scan accounts for ADA and addresses for the other chains. ADA wallet #1 and above only appear in wallets that enumerate accounts, such as Eternl. Icarus master-key scheme only: a Ledger-scheme wallet derives different ADA addresses from the same phrase.

Creating seed wallets

Once a phrase is established, createWallet routes to the seed path on its own. You do not pass a mode:
The SDK rebuilds the account seed from the wallet password, takes the next free index for the chain, derives the key and registers the resulting address. The key and the seed are wiped when the call returns, and nothing is written to your share store.

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 an ADDRESS_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 with establishRecoveryPhrase:
An organization phrase is always generated. Passing mnemonic throws InvalidInputError.
When the organization’s existing wallets were created from the Master’s personal phrase (availability is personal_seed, or orgSeedOffersPersonalLink(status.organization) returns true), creating the organization’s phrase moves those wallets to the Archive and cannot be undone. The SDK refuses with OrgSeedChoiceRequiredError unless you pass acknowledgeArchive: true. Pass it only after the Master has seen that consequence and confirmed it.

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 throws OrgWalletRequiresOrgSeedError. 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 an awaiting_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

As of SDK v3.0.0, re-displaying an already-established recovery phrase is no longer available over the API-key/SDK transport. sdk.revealRecoveryPhrase(...) throws PermissionDeniedError immediately. The phrase is shown once, at establish time, in the Trustodian app; re-displaying it afterward is available only in the first-party Trustodian web app.

Errors

Full reference: Errors.

Handling rules

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.
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.
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.
Last modified on October 20, 2026