Two flavours
A master key is one of two types, interchangeable for every master-key operation. The wiresignature_type selects which one signed the request.
- Secp256k1 (EIP-712)
- Passkey (WebAuthn)
- Curve: secp256k1.
- Public key: 33-byte compressed, base64-encoded in the request body.
- On the wire: the
Base64SignedPayloadenvelope withsignature_type = 1. - You sign: the EIP-712 digest of the payload, with your secp256k1 private key.
Admin vs scoped
A master key carries one of two reaches. Reach is independent of theFullAccess / TradingOnly role the key also carries: the role limits which
operations the key can authorize, reach limits which subaccounts it touches.
Admin master key
Reaches the whole account — every subaccount, present and future. Required to
add or remove other admin keys, add or remove scoped keys, and to root the
unpinned sessions that authorize account-level operations.
Scoped master key
Pinned to one subaccount. Mints sessions only within that subaccount’s reach.
Cannot manage other keys and cannot promote itself or another key to admin.
POST /api/v1/auth/admin-keys/add, .../remove) or a scoped key
(POST /api/v1/auth/scoped-keys/add, .../remove). Scoped keys cannot promote
each other.
Per-account caps
An account holds a limited number of master keys — admin keys per account, scoped keys per subaccount. A request that would exceed the limits is rejected withmaster_key_rejected_invalid. Register the keys you need and avoid churn.
What a master key authorizes
A master key signs account and key-management operations. It does not sign trading or cash writes directly — it mints a session for that.| Operation | Endpoint | Reach required |
|---|---|---|
| Mint a session key | POST /api/v1/auth/sessions | Any master key |
| Revoke a session key | POST /api/v1/auth/sessions/revoke | Any master key (a session it can see) |
| Add / remove an admin key | POST /api/v1/auth/admin-keys/add, .../remove | Admin |
| Add / remove a scoped key | POST /api/v1/auth/scoped-keys/add, .../remove | Admin |
Reading the response
Master-key writes return aRequestAck — { status, processed_at_ns }. The
status is the outcome: these calls return HTTP 200 even on rejection, so a
200 with a rejected_* status is a rejection, not an acceptance. Always read the
body (error model). Master-key statuses:
master_key_added,master_key_removed— applied.master_key_rejected_invalid— the key material or request is invalid.master_key_rejected_unauthorized— the signer is not authorized to manage this key.master_key_rejected_self_removal— a key cannot remove itself.master_key_rejected_last_key— cannot remove the last admin key.