# HYPERLIQUIDATED A read-only terminal for Hyperliquid, and a JSON API over the same data. It watches the venue's public trade feed, keeps what every print did to every wallet, and answers questions about it. It holds no exchange key, it places nothing, it sizes nothing, and no route here calls Hyperliquid. Base URL: http://127.0.0.1:8791 Everything is GET. Everything is JSON except this file. Errors are {"error": "...", "path": "..."} with a 4xx/5xx status. ## The three words. They never change meaning. tracked the wallets WE watch: anyone who has printed since meta.feed_started_ms. NEVER the venue's total. Every aggregate says which of the two it is. anchored the position was read from Hyperliquid's own clearinghouseState. The number is exact. It does NOT mean fresh. inferred our running net since our tape started. It is NOT a position. The screen renders it with a ~. anchoring a fourth state, on the tape only: the context walk has not reached this print yet, so we are not going to pretend we know. Exactly one of anchored / inferred / anchoring is true for any row. ## Time and units _ms milliseconds since the Unix epoch, UTC. Every v2 timestamp is _ms. _s seconds. Some v1 routes also carry a bare `ts`, which is SECONDS. _usd dollars. _pct percent, already multiplied by 100. A "window" is rolling and ends now: 24h is the last 24 hours, not since midnight. ## The horizon: 48 hours The `tape` table is pruned at 48h. A print's price, size, dollar value, buyer, seller and counterparty exist only for the last 48h. Kept for ever: tape_ctx (what each print did to each wallet), coin_min (per-coin per-minute OHLC and flow), fills, wallet_snap, coin_snap. So a 24h replay is complete, a 48h one may not be, and there is no 72h one. For anything older than 48h use /api/v2/history and /api/v2/coin_history. ## The ten questions, and the one route for each 1. What just printed, and what did it do to that wallet? GET /api/v2/tape?after_ts_ms=&after_tid=&limit= 2. Tell me the moment something new prints. GET /api/v2/tape?after_ts_ms=&after_tid=&wait=25 3. What happened in this coin further back than 48 hours? GET /api/v2/history?coin=BTC&from_ms=&to_ms= 4. What did price and flow do, minute by minute? GET /api/v2/coin_history?coin=BTC&res=1m&from_ms=&to_ms= 5. What has this wallet actually traded? GET /api/v2/wallet//fills?from_ms=&to_ms= 6. How big is this wallet's book, and how has it moved? GET /api/v2/books/ -- every leg, its events, how well we read it (older history: /api/v2/wallet//snapshots?from_ms=&to_ms=) 6b. Which big books are offloading, building, flipping RIGHT NOW? GET /api/v2/book_events?window=24h&ev=offload -- the whale tape; poll with after_ts_ms=&after_id= for only what is new 6c. Who holds the most in this coin, and which way? GET /api/v2/coin_books?coin=XRP 6d. The biggest books on the venue, by how much they lean on it? GET /api/v2/books?sort=influence 7. What exactly does every field mean? GET /api/v2/openapi.json 8. Is the data behind, or broken? GET /api/health -- feed_age_s > 60 is an outage; anchor.walk_lag_ms > 60000 means the position effects are stale. 9. What is happening right now, in sentences? GET /api/pulse?minutes=15 10. Who got liquidated, and who is close? GET /api/liqs?hours=24 -- among TRACKED wallets, not the venue's total. Also useful, all v1: /api/venue_tape (newest-first, built for a screen), /api/replay?coin=X&hours=24 (one coin, one call), /api/coinstory/, /api/wallet/, /api/markets, /api/traders, /api/lanes (coverage and freshness per lane), /api/selfcheck (our own arithmetic report) and /api/bots (who we call a machine, and what that flag edits on the screen). ## The poll budget Do not poll harder than 1 request per second. You are reading SQLite on one small box, and one impatient client can slow it for everybody. For incoming prints use wait= on /api/v2/tape instead of a tight loop: it holds the request open for up to 25 seconds and returns the instant there is something. Poll /api/health, not the heavy pages, to ask if we are alive. Every integer parameter is clamped; asking for more does not get you more. ## What you will not find here No badge, no score, no verdict, no forecast, no signal. A rule is named as an edge only after 7 days AND 40 events in its class AND the same sign in both halves AND beating a wallet-shuffled null; until then /api/setups says "unscored" and says why. A coverage percentage travels with every aggregate, because a number without its denominator is an assertion. An empty column means we could not look, not that nobody qualified.