Skip to main content
The XO Orderbook uses two layered authentication schemes: signatureType = 3 (XO smart account, ERC-1271) is the only order-signing model accepted by the orderbook today. See Smart accounts for the maker-side detail.

L1 ClobAuth

A four-header EIP-712 wallet signature used to mint, derive, list, and delete API keys.

Headers

Hyphenated forms (Xo-Address, Xo-Signature, etc.) are accepted as a fallback.

Signed struct

EIP-712 domain

Smart-wallet signatures

Smart-wallet signatures are verified via ERC-1271. For XO Privy/ZeroDev smart accounts, set XO_ADDRESS to the smart account; the owner EOA is only the controller and is not the authenticating principal.

L2 HMAC

A four-header per-request signature used by every authenticated endpoint other than the L1 ClobAuth flow.

Headers

Canonical request string

  • timestamp — same value sent in XO_TIMESTAMP.
  • method — uppercase HTTP method (e.g. GET, POST).
  • path — request path including the query string when present.
  • body — raw request body, or empty string for body-less methods.
The signature is then computed as:

Clock skew

Reject the request locally if your clock drifts more than ±30 s from server time. Use GET /time to align.

Creating an API key

1

Sign the ClobAuth struct

Build the ClobAuth(address, timestamp, nonce, message) struct, sign it with the maker key under the ClobAuthDomain EIP-712 domain, and send POST /auth/api-key with the four L1 headers.
2

Persist the triplet

The response returns { apiKey, secret, passphrase }. Store all three; the secret is only shown once.
3

Sign subsequent requests with L2 HMAC

Every authenticated request after the L1 flow uses the four L2 headers above.

WebSocket authentication

The /ws/user channel authenticates with the same L2 HMAC triplet delivered inside the subscribe message body (not as HTTP headers). See the WebSockets section for the subscribe shape.
  • Smart accounts — signature types, ERC-1271, and the smart-account model.