Skip to main content

Event structure

Every event is a JSON object:
{
  "block": 70873194,
  "timestamp": 1774938185046,
  "type": "cancel",
  "user": "0x034d4f0b00827e4ac77d910071377f707ddd23d3",
  "asset": "SOL",
  "asset_id": 5,
  "data": {
    "cancels": [
      {"asset": 5, "oid": 366057443270}
    ]
  },
  "network": "mainnet"
}

Fields

FieldTypeAlways PresentDescription
blocknumberYesHyperLiquid L1 block number
timestampnumberYesUnix timestamp in milliseconds
typestringYesAction type (see Action Types)
dataobjectYesAction-specific data
networkstringYes"mainnet" or "testnet"
userstringNoHex address of the user who submitted the action
assetstringNoHuman-readable asset name (e.g., "BTC", "SOL")
asset_idnumberNoNumeric asset identifier

Coverage

  • user is present on 100% of mainnet events, ~98% on testnet
  • asset and asset_id are present on trading actions but not on account actions like setReferrer or scheduleCancel
  • 100% asset name coverage across all market types

Asset ID encoding

RangeTypeExample
0-228Perpetual futures0 = BTC, 1 = ETH, 5 = SOL
10000-10306Spot pairs10000 = PURR, 10001 = HFUN, 10009 = TRUMP
110000-170000+Spot margin variants110029 = GUP, 150001 = HFUN
1900000+Prediction market outcomesHIP-4 outcome tokens (testnet only)
Spot margin variant IDs (110000+, 120000+, 140000+, 150000+, 170000+) represent the same underlying token in different margin modes. hypernode resolves all variants to their base token name automatically.

Timestamp

The timestamp field is Unix milliseconds. To convert:
const date = new Date(event.timestamp);
// 2026-03-31T03:09:45.046Z
from datetime import datetime
dt = datetime.fromtimestamp(event["timestamp"] / 1000)