Getting started

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

ItemValue
API base URLhttps://app.qustody.io
NetworksQuantum Mainnet (QUANTUM_MAINNET, chain ID 20803) and Quantum Sandbox (QUANTUM_SANDBOX, chain ID 20804)
FormatJSON over HTTPS; timestamps are RFC 3339; IDs are UUIDs
AmountsDecimal integer strings in Qwei / raw token units; never floats
AuthAuthorization: Bearer <keyId>:<secret> — see Authentication
Max request body1 MB
HealthGET/healthz and /readyz (unauthenticated)
Key material is never accepted Qustody rejects any request body that contains private keys, seeds, or mnemonics — before it reaches a handler. There is no API through which the platform can take custody of a signing key.

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