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, setXO_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 inXO_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.
Clock skew
Reject the request locally if your clock drifts more than ±30 s from server time. UseGET /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.
Related guides
- Smart accounts — signature types, ERC-1271, and the smart-account model.