Skip to main content
Self-custody organizations hold their wallet keys under a Master Control Key (MCK) that only the client possesses. The wallet private keys stored in Anchorage Digital’s hardware security modules are encrypted to your MCK, so Anchorage Digital cannot sign a transaction until you supply the matching per-wallet child control key. To authorize a transfer through the API, derive that child control key from your MCK and send it in the Api-Child-Control-Key header of POST /v2/transfers.
Never send the Master Control Key itself to Anchorage Digital. Only the derived per-wallet child control key is transmitted. Perform the derivation on infrastructure you control and treat both keys as secrets.

Derivation inputs

The derivation is deterministic: the same MCK and derivation path always produce the same child control key, so you can derive on demand and avoid storing child keys.

How derivation works

The scheme is standard BIP39 and BIP32, so mature libraries cover all of the cryptography:
  1. Decode the MCK. If you hold the 24-word mnemonic, decode it to the 32-byte entropy (mckFromMnemonic below). If you hold the MCK as a hex string, hex-decode it to the 32 bytes.
  2. Re-encode the entropy as a BIP39 mnemonic and stretch it into the 64-byte BIP39 seed with an empty passphrase.
  3. Create a BIP32 master key from the seed and insert Anchorage Digital’s hardened purpose step 1097753448' as the first step after m. The wallet’s derivationPath is relative to this purpose level.
  4. Derive the remaining path steps and take the resulting node’s 32-byte private key.
  5. Hex-encode those 32 bytes (64 lowercase hex characters) for the Api-Child-Control-Key header.

Derive a child control key

The mnemonic in the examples is a published test key, not a real organization’s MCK. Run your implementation against it and confirm you get the same child control key before using a production Recovery Document.

Use the key in a transfer

  1. Call GET /v2/wallets/{walletId} for the source wallet and read derivationPath from the response.
  2. Derive the child control key and hex-encode it (64 lowercase hex characters).
  3. Include it when creating the transfer:
The Api-Child-Control-Key header is required only for self-custody organizations initiating transfers through the API. The Api-Signature and Api-Timestamp headers carry the standard Ed25519 request signature that POST /v2/transfers always requires; see Signing requests for how to compute them.