Skip to main content
GET
cURL

Authorizations

X-Monaco-Signature
string
header
required

Ed25519 session-key request signing. Every authenticated request carries three headers: X-Monaco-PublicKey (64-char lowercase-hex session public key), X-Monaco-Timestamp (Unix milliseconds, within 30s of server time), and X-Monaco-Signature (hex ed25519 signature). The signature is over METHOD\npath?query\ntimestamp_ms\nSHA256_hex(body), where the body hash is the SHA-256 of the empty byte string when there is no body. Obtain the session keypair from POST /api/v1/auth/challenge followed by POST /api/v1/auth/verify.

Path Parameters

positionId
string
default:2b1a5f9c-0000-4000-8000-000000000002
required

Response

OK

positionId
string | null
markPrice
string | null
indexPrice
string | null
unrealizedPnl
string | null
liquidationPrice
string | null

Liquidation mark-price threshold. In ISOLATED mode, this is the position/risk-bucket threshold. In CROSS mode, it is conditional: it varies only this position's mark while all other marks in the cross risk bucket remain unchanged. Other position marks, funding, realized PnL, fees/reserves, and collateral can change it. Treat an absent or blank value as unavailable, never as zero.

marginRatio
string | null

Account distress ratio: maintenance margin required divided by equity (higher is closer to liquidation). Equity that is zero or negative has no meaningful quotient, so an account that still owes a maintenance requirement reports the maximum-decimal sentinel (79228162514264337593543950335, maximal distress) rather than zero or a negative value, and an account with no open maintenance requirement reports zero. Clamp the sentinel before display.

maintenanceMarginRequired
string | null

Maintenance margin required by this position at mark_price using the market maintenance-margin rate. Zero when the position has no open exposure.

initialMarginRequired
string | null

Initial margin required by this position at mark_price, honoring both its effective leverage and the market initial-margin floor. Zero when the position has no open exposure.

updatedAt
string | null

RFC 3339 instant at which this position was last MUTATED — a fill, collateral transfer, funding settlement or close — as the producer that owns the position recorded it. It is NOT the instant the response was built: polling an unchanged position returns the same value, and an oracle reprice does not move it. For an OPEN position every surface reports the same instant — the list, the detail read, the risk read, the WebSocket positions snapshot, and the live position_update frames.

Two cases come from the persistence clock instead and differ from the matching engine's by the persistence lag: a TERMINAL row (the live position_update frame carries the engine's close instant, this field carries the stored one), and any position read after a matching-engine restart. Accurate to that lag, not to the microsecond.

A third case is not lag-bounded: an OPEN row read while the matching engine is unreachable falls back to the row's own lifecycle columns (close, then last funding, then open), so a position filled repeatedly since it opened reports its opening instant until funding settles. The live position_update frame is unaffected.

Display metadata. version is the reconciliation key; ordering position state by this field is never correct.