{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Position",
"description": "One open position. Numbers are decimal strings (sizes to the market size precision, prices to the market price precision, USD values to 6 decimals); a flat position serializes as `\"0\"`. Hyperliquid rows carry `dex` on HIP-3; Lighter rows carry `account_index`, `account_kind`, and the Lighter fields at the end. Fields a source does not report are null, never estimated.",
"type": "object",
"required": [
"coin",
"cum_funding",
"entry_price",
"leverage",
"liquidation_price",
"liquidation_price_status",
"margin_used",
"mark_price",
"mark_time",
"max_leverage",
"opened_at",
"position_value",
"quality",
"return_on_equity",
"side",
"size",
"snapshot_as_of",
"symbol",
"unrealized_pnl"
],
"properties": {
"account_index": {
"description": "Lighter only: account index, serialized as a string because it can exceed JavaScript integers.",
"type": "string",
"example": "281474976710654"
},
"account_kind": {
"description": "Lighter only: `user`, `insurance`, `settlement`, or `system`. Non-user accounts appear in market routes only with `include_system=true`.",
"type": "string",
"example": "user"
},
"allocated_margin": {
"description": "Lighter only: isolated margin allocated to the position.",
"type": "string",
"nullable": true,
"example": "1200.5"
},
"coin": {
"description": "Alias of `symbol`.",
"type": "string",
"example": "BTC"
},
"cum_funding": {
"description": "Cumulative funding in USD (decimal strings). Null when not reported, including every Lighter row and as-of reconstructions.",
"type": "object",
"required": [
"all_time",
"since_change",
"since_open"
],
"properties": {
"all_time": {
"description": "Funding paid or received over the account lifetime for this coin.",
"type": "string",
"nullable": true,
"example": "-12.345678"
},
"since_change": {
"description": "Funding since the last change in position size.",
"type": "string",
"nullable": true,
"example": "-0.5"
},
"since_open": {
"description": "Funding since the current position opened.",
"type": "string",
"nullable": true,
"example": "-1.25"
}
}
},
"dex": {
"description": "HIP-3 only: the dex the position belongs to.",
"type": "string",
"example": "xyz"
},
"entry_price": {
"description": "Average entry price.",
"type": "string",
"nullable": true,
"example": "64210.5"
},
"finalized": {
"description": "Lighter only: true when every trade behind the row is final (reconciled).",
"type": "boolean",
"example": true
},
"initial_margin_fraction": {
"description": "Lighter only: initial margin fraction at the last trade, as a decimal ratio.",
"type": "string",
"nullable": true,
"example": "0.05"
},
"leverage": {
"description": "Leverage of a position.",
"type": "object",
"required": [
"type",
"value"
],
"properties": {
"type": {
"description": "Margin type: `cross`, `isolated`, or `unknown`. On Lighter this is the margin mode of the position.",
"type": "string",
"example": "cross"
},
"value": {
"description": "Leverage multiple as a decimal string. Null when unknown (Lighter rows and as-of reconstructions).",
"type": "string",
"nullable": true,
"example": "20"
}
}
},
"liquidation_price": {
"description": "Liquidation price as reported for the position. Hyperliquid snapshot rows only.",
"type": "string",
"nullable": true,
"example": "81250"
},
"liquidation_price_status": {
"description": "How `liquidation_price` should be read: `exact`, `not_published_cross`, `changed_since_snapshot`, or `unavailable` (always `unavailable` on Lighter and on as-of reconstructions).",
"type": "string",
"example": "exact"
},
"margin_mode": {
"description": "Lighter only: `cross`, `isolated`, or `unknown`.",
"type": "string",
"example": "cross"
},
"margin_used": {
"description": "Margin allocated to the position in USD. Hyperliquid snapshot rows only.",
"type": "string",
"nullable": true,
"example": "1625.5"
},
"mark_price": {
"description": "Mark price used for value and PnL. Null when no mark is available.",
"type": "string",
"nullable": true,
"example": "65020.1"
},
"mark_source": {
"description": "Lighter only: where the mark came from: `mark`, `last_trade`, `stale_mark`, or `none`.",
"type": "string",
"example": "mark"
},
"mark_time": {
"description": "Time of the mark price.",
"type": "string",
"format": "date-time",
"nullable": true
},
"max_leverage": {
"description": "Maximum leverage allowed for the market. Hyperliquid snapshot rows only.",
"type": "integer",
"nullable": true,
"example": 40
},
"opened_at": {
"description": "Start of the current position lifecycle. Null when it opened before coverage.",
"type": "string",
"format": "date-time",
"nullable": true
},
"position_value": {
"description": "Absolute position value in USD at the mark price.",
"type": "string",
"nullable": true,
"example": "32510.05"
},
"quality": {
"description": "Quality of this row. `complete`, `partial` (a mark or entry is missing, so value and PnL fields are null), or `degraded`. Lighter rows can also read `preliminary` (built from real-time trades not yet reconciled), `unreconciled` (a market with no reconciled trades), or `incomplete`. No row reads `complete` when its own data is not complete, or when its snapshot has a problem that could not be pinned to specific rows. A small number of Hyperliquid positions around three short windows in June and July 2025, where Hyperliquid's published fill data has gaps, read `partial`.",
"type": "string",
"example": "complete"
},
"return_on_equity": {
"description": "Return on equity as a decimal ratio. Hyperliquid snapshot rows only.",
"type": "string",
"nullable": true,
"example": "-0.1245"
},
"side": {
"description": "Position side.",
"type": "string",
"enum": [
"long",
"short"
],
"example": "short"
},
"size": {
"description": "Signed position size in base units (negative is short).",
"type": "string",
"example": "-0.5"
},
"snapshot_as_of": {
"description": "Time the leverage, margin, and funding fields describe, which can differ from the hour. Hyperliquid snapshot rows only.",
"type": "string",
"format": "date-time",
"nullable": true
},
"snapshot_ts": {
"description": "Hour the row describes. Present on hourly history rows only.",
"type": "string",
"format": "date-time"
},
"symbol": {
"description": "Market symbol (HIP-3: `dex:COIN`).",
"type": "string",
"example": "BTC"
},
"unrealized_pnl": {
"description": "Unrealized PnL in USD at the mark price.",
"type": "string",
"nullable": true,
"example": "-404.8"
}
}
}