x-api-key header, provisioned during onboarding. Everything below is about the signed message that goes with it.
Signing Requests
Every endpoint exceptPOST /commit and POST /borrow/commit requires a signed message proving ownership of user_address. Sign with the user’s Solana keypair (Ed25519) and base64-encode the result. Use the current Unix timestamp in milliseconds.
Every message shares the same prefix; only the Details: line changes:
Read Signing Format
Used by/account/balances, /account/points, /account/pending, /borrow/pending, and /borrow/positions.
- Pass as
signature- except on/borrow/positions, which takes the same message asuser_signature - Accepted within 24 hours of the signed timestamp
Trade Signing Format
Used byPOST /trade/create.
- Pass as
user_signature timestampis second from last, beforejito_tip_amount
Withdraw Signing Format
Used byPOST /withdraw/create.
- Pass as
user_signature timestampis last
One-Time Wallet Signing Format
Used byPOST /borrow/smart-wallet, which creates the one-time wallet a borrowing position lives in. Getting a wallet for a trade is unsigned - GET /trade/one-time-wallet needs only the API key.
- Pass as
user_signature - Valid for 10 minutes
Lending Signing Format
Used byPOST /borrow/initiate.
- Pass as
user_signature - Valid for 10 minutes
- Same value order as the trade format, with
smart_wallet_idfirst:timestampbeforejito_tip_amount
Settle Signing Format
Used byPOST /borrow/settle.
- Pass as
user_signature - Valid for 10 minutes
timestampis last here, unlike the lending format, and there is no tip valuecleanup_leftover_solis rendered as it appears in the JSON body (trueorfalse)
Signing in Code
One helper covers every format - build theDetails: line and pass it in.
Every value you sign must exactly match the value you send in the request body. On the lending endpoints, a timestamp outside its window is rejected with
400, while a mismatched message or the wrong signing key returns 401 - see Handling 401.