$npx -y skills add asterdex/aster-skills-hub --skill aster-api-websocket-v3WebSocket market + user data streams for Aster Futures API v3. Subscription model, stream names, listenKey. Use when implementing real-time market or user events (orders, balance, positions). listenKey = signed; see aster-api-auth-v3.
| 1 | # Aster API WebSocket |
| 2 | |
| 3 | **Base:** wss://fstream.asterdex.com. **Raw:** `/ws/<streamName>`. **Combined:** `/stream?streams=name1/name2/...` → `{"stream":"<name>","data":<payload>}`. Stream names **lowercase** (e.g. btcusdt). |
| 4 | |
| 5 | **Limits:** 24h; ping 5 min → pong within 15 min; 10 msg/s; max 200 streams. |
| 6 | |
| 7 | ## Market: subscribe / unsubscribe |
| 8 | |
| 9 | JSON: **Subscribe** `{"method":"SUBSCRIBE","params":["btcusdt@aggTrade","btcusdt@depth"],"id":1}` → `{"result":null,"id":1}`. **Unsubscribe:** `UNSUBSCRIBE` + params. **List:** `LIST_SUBSCRIPTIONS`. `id` = unsigned int. |
| 10 | |
| 11 | ## Stream names (market) |
| 12 | |
| 13 | | Stream | Description | |
| 14 | |--------|-------------| |
| 15 | | `<symbol>@aggTrade` | Aggregate trades (100ms) | |
| 16 | | `<symbol>@depth` | Diff. book depth (250/500/100ms: `@depth@500ms`, `@depth@100ms`) | |
| 17 | | `<symbol>@depth5`, `@depth10`, `@depth20` | Partial book depth | |
| 18 | | `<symbol>@kline_<interval>` | Kline (e.g. 1m, 1h); interval as in REST | |
| 19 | | `<symbol>@markPrice`, `<symbol>@markPrice@1s` | Mark price (3s or 1s) | |
| 20 | | `!markPrice@arr`, `!markPrice@arr@1s` | All symbols mark price | |
| 21 | | `<symbol>@miniTicker` | 24h mini ticker (500ms) | |
| 22 | | `!miniTicker@arr` | All mini tickers (1000ms) | |
| 23 | | `<symbol>@ticker` | 24h ticker (500ms) | |
| 24 | | `!ticker@arr` | All tickers (1000ms) | |
| 25 | | `<symbol>@bookTicker` | Best bid/ask (real-time) | |
| 26 | | `!bookTicker` | All book tickers | |
| 27 | | `<symbol>@forceOrder` | Liquidation snapshot (1000ms) | |
| 28 | | `!forceOrder@arr` | All liquidations | |
| 29 | |
| 30 | ## User data stream |
| 31 | |
| 32 | 1. **Start:** `POST /fapi/v3/listenKey` (signed) → `{ "listenKey": "..." }`. If account already has active listenKey, same key returned and validity extended 60 min. |
| 33 | 2. **Connect:** `wss://fstream.asterdex.com/ws/<listenKey>`. |
| 34 | 3. **Keepalive:** `PUT /fapi/v3/listenKey` (signed) at least every **<60 min** (e.g. every 30 min). |
| 35 | 4. **Close:** `DELETE /fapi/v3/listenKey` (signed). |
| 36 | |
| 37 | User data events are **not guaranteed in order** during heavy load; order updates by event time `E`. |
| 38 | |
| 39 | **Events:** `ACCOUNT_UPDATE` (balance/position), `ORDER_TRADE_UPDATE`, `ACCOUNT_CONFIG_UPDATE` (leverage, multi-asset, position mode), `MARGIN_CALL`, `listenKeyExpired`. |
| 40 | |
| 41 | ## Order book sync (depth stream) |
| 42 | |
| 43 | 1. Connect to `btcusdt@depth` (or combined). |
| 44 | 2. Buffer incoming events. |
| 45 | 3. Get snapshot: `GET /fapi/v3/depth?symbol=BTCUSDT&limit=1000`. |
| 46 | 4. Drop events with `u` < snapshot `lastUpdateId`. |
| 47 | 5. First valid event: `U` ≤ `lastUpdateId` and `u` ≥ `lastUpdateId`. |
| 48 | 6. Then each event’s `pu` must equal previous event’s `u`; else re-sync from step 3. |
| 49 | 7. Quantity in events is **absolute**; quantity 0 means remove that price level. |
| 50 | |
| 51 | Payload shapes: [reference.md](reference.md). |