# Kraken Spot API — facts this code relies on (verified 2026-10-21 on docs.kraken.com)
Base https://api.kraken.com/0; public GET /public/{Time,SystemStatus,Assets,AssetPairs,Ticker,OHLC,Depth,Trades};
private POST /private/{Balance,TradeBalance,OpenOrders,ClosedOrders,QueryOrders,TradesHistory,TradeVolume, GetWebSocketsToken,AddOrder,CancelOrder,CancelAll}.
Rate limits: private counter 15/20/20 (starter/intermediate/pro) decaying 0.33/0.5/1 per s; ledger/trade-history
cost 2. Trading engine limiter is separate (add +1, cancel +8…+1 by order age; thresholds 60/125/180).
AssetPairs: ordermin, costmin, tick_size, pair_decimals, lot_decimals, cost_decimals, status
(online|cancel_only|post_only|limit_only|reduce_only), wsname (v1 names, e.g. XBT/USD), leverage lists.
fees/fees_maker are deprecated since 2026-09-08 (always []) → use TradeVolume.
OHLC: interval ∈ {1,5,15,30,60,240,1440,10080,21600}; rows [time, open, high, low, close, vwap, volume, count];
last = cursor for since; ≤ 720 most recent entries, older data not retrievable; last row is the forming bar.
Depth: count 1–500. Trades: count ≤ 1000, last is a ns cursor.
AddOrder: ordertype ∈ market/limit/iceberg/stop-loss/take-profit/…; timeinforce GTC/IOC/GTD/FOK; oflagspost for post-only; cl_ord_id (UUID or ≤18 ascii) XOR userref; validate=true validates without trading.
WebSocket v2 wss://ws.kraken.com/v2: {"method":"subscribe","params":{"channel":"ticker|book|trade|ohlc", "symbol":["BTC/USD"],…}}; book depth ∈ {10,25,100,500,1000}, checksum = CRC32 over top-10 asks (asc) then
bids (desc) with price/qty strings stripped of . and leading zeros; heartbeat ~1/s when idle; one ohlc
interval per symbol per connection (observed Already subscribed to one ohlc interval on this symbol).
No Spot sandbox exists. Private WS (wss://ws-auth.kraken.com/v2, token from GetWebSocketsToken, ~15 min to
first use) is not used yet (Phase 4/5).