Qustody Developer Documentation
Qustody is non-custodial digital-asset custody for Quantum Chain. Your keys stay with you: every outbound transaction must be approved and signed in EnQlave, the Qustody signer that runs on your side, before Qustody will broadcast it. The platform provides vault and wallet management, policy enforcement, AML screening, audited QRC contract deployment, quantum-safe signature verification, and delivery of state changes via webhooks.
The basics
| Item | Value |
|---|---|
| API base URL | https://app.qustody.io |
| Networks | Quantum Mainnet (QUANTUM_MAINNET, chain ID 20803) and Quantum Sandbox (QUANTUM_SANDBOX, chain ID 20804) |
| Format | JSON over HTTPS; timestamps are RFC 3339; IDs are UUIDs |
| Amounts | Decimal integer strings in Qwei / raw token units; never floats |
| Auth | Authorization: Bearer <keyId>:<secret> — see Authentication |
| Max request body | 1 MB |
| Health | GET/healthz and /readyz (unauthenticated) |
The non-custodial model
sequenceDiagram
participant E as You / EnQlave
participant Q as Qustody
participant C as Quantum Chain
E->>Q: create transaction
Note over Q: policy · screening · quotas
Q-->>E: status PENDING_SIGNATURE
Note over E: review and approve in EnQlave — keys never leave your side
E->>Q: signed approval
Note over Q: verify against enrolled key, fail-closed re-check
Q->>C: broadcast
Q-->>E: webhooks: CONFIRMING → COMPLETED
Qustody stores the transaction intent and the wallet's enrolled public key. It cannot alter what you approved: before broadcast, the transaction is rebuilt from the stored intent and re-verified against your signature. A mismatch fails closed.
Quickstart
1. Create an account
Sign up in the dashboard or via the API, then verify your email. API credentials are issued during onboarding in the dashboard (Keys page); the API itself only lists and rotates keys.
curl -X POST https://app.qustody.io/v1/signup \
-H 'Content-Type: application/json' \
-d '{
"organizationName": "Acme Corp",
"email": "ops@acme.example",
"name": "Acme Ops",
"password": "a-strong-passphrase"
}'
# 201 → {"tenantId":"…","userId":"…","status":"PENDING_EMAIL_VERIFICATION",…}
2. Create a vault and a wallet
curl -X POST https://app.qustody.io/v1/vault/accounts \
-H "Authorization: Bearer $QUSTODY_KEY" \
-H 'Content-Type: application/json' \
-d '{"name": "Treasury", "networkCode": "QUANTUM_SANDBOX"}'
curl -X POST https://app.qustody.io/v1/vault/accounts/$VAULT_ID/wallets/generate \
-H "Authorization: Bearer $QUSTODY_KEY" \
-H 'Content-Type: application/json' \
-d '{"assetIds": ["20804000-0000-4000-8000-000000000001"], "label": "ops-hot"}'
Or register a wallet whose key already lives in your EnQlave signer — see Register an external wallet.
3. Create a transfer
curl -X POST https://app.qustody.io/v1/transactions \
-H "Authorization: Bearer $QUSTODY_KEY" \
-H 'Content-Type: application/json' \
-H "X-Idempotency-Key: $(uuidgen)" \
-d '{
"externalId": "payout-2026-08-001",
"networkCode": "QUANTUM_SANDBOX",
"sourceWalletId": "'$WALLET_ID'",
"destinationAddress": "0x9f8c…",
"assetId": "20804000-0000-4000-8000-000000000001",
"amount": "1000000000000000000"
}'
# 201 → status SUBMITTED, then PENDING_SIGNATURE once policy and screening clear
4. Sign and broadcast
Open EnQlave — it picks up the pending transaction, shows you exactly what you are signing, and submits the signature. How it works (and the roadmap for programmatic signing) is in Signing & EnQlave.
5. Track completion
curl https://app.qustody.io/v1/transactions/$TX_ID \
-H "Authorization: Bearer $QUSTODY_KEY"
# status: SIGNED → BROADCASTING → CONFIRMING → COMPLETED (chainTxHash populated)
Or subscribe to webhooks and receive transaction.status_changed events with HMAC-signed payloads.
Where next
- Authentication — API keys, rotation, scopes, lockout rules
- Tokenization — audited QRC templates, managed QRC20, and verified contract deployment
- Signing & EnQlave — how non-custodial signing works, key enrollment, programmatic options
- Errors & Rate Limits — the error envelope and every numeric code
- Plans & Limits — quotas, 402 responses, mainnet gating

