rsa4096 key, and store the ciphertext with CoinCover. We never see plaintext, and the private key needed to recover it never leaves our enclave.
If instead you want CoinCover to act as the backup key in a multi-sig wallet, see Add CoinCover as a backup key.
Step 1 — Authenticate
Authenticate with a Bearer token in theAuthorization header — a JWT or a long-lived API key.
Step 2 — Choose HOT or COLD
You choose the environment per key, and it’s fixed for the life of the key.| Environment | When to use it |
|---|---|
HOT | Online generation and storage. Best for high-frequency operations and low-latency access. |
COLD | Offline generation and storage with enhanced isolation. Best for high-value wallets and the strictest security requirements. |
Step 3 — Assign a key
CallPOST /v1/keys with key_type: "rsa4096". Only user_identifier and key_type are required; supply organisation/package only if you want to file the key against your own internal structure.
key_id against your wallet record. The response also carries a signature over the public_key, signed by the generating enclave — verify it with your CoinCover verification key before relying on the key. If verification fails, treat the response as untrusted and escalate.
Step 4 — Encrypt client-side
The public key comes back hex-encoded. Convert it to PEM, then encrypt with RSA-OAEP using SHA-256 as both the hash and MGF1 hash.The checksum must be SHA-256 of the plaintext, not the ciphertext. It’s optional on the standard endpoint, but supplying it lets CoinCover verify the recovered plaintext on retrieval — we recommend always sending it.
Step 5 — Store encrypted data
Send the ciphertext, the plaintext checksum, and the public key toPOST /v1/secure/data.
backup_id. Store it — it’s the handle to find this exact backup again.
For binary backups — encrypted archives, wallet seed files — use POST /v1/secure/file instead. It’s multipart/form-data, expects the file to already be encrypted on your side, and returns a backup_id the same way.
Step 6 — Verify the key and backup
Confirm integrity with the self-serviceverify endpoints, right after assignment and storage and periodically thereafter as a drill.
verify-key returns is_key_valid; verify-backup returns is_backup_valid. Treat a false from either as a hard failure and escalate before relying on the material.
Step 7 — Test before you ship
Run through the going to production checklist before cutting production traffic to live keys. The most common issues:- Hex-to-PEM conversion off by one byte (verify with a known-good public key first)
- OAEP hash and MGF1 hash mismatched (both should be SHA-256)
- Checksum computed over ciphertext rather than plaintext
- Sandbox base URL still set in production config
key_environmentdefaulted toHOTwhere you intendedCOLD
What’s next
Add CoinCover as a backup key
Use a secp256k1 key as the backup key in your multi-sig or MPC wallet.
API reference
Every endpoint, request, and response.