Skip to main content

Notifications

Customer notifications — the push counterpart of GET /v1/customers/notifications. Requires authentication.

A generic channel: every notification type is pushed here, distinguished by type, with the type-specific fields in a nested data object. The channel is broker-scoped — an authenticated connection receives the notifications of every customer under its broker. Each notification is durable: the same record is retrievable on GET /customers/notifications under the same code.

Today's only type is position_depreciation: a regulatory notice (MiFID II) that the value of a customer's open position has fallen by a further 10% of its initial value. It is evaluated periodically (not on every price tick), so a notice arrives within the evaluation interval of the threshold being crossed.

Subscribe​

{"op": "subscribe", "args": ["notifications"]}

Topic format: notifications (per-broker, not per-symbol).

Notification Message​

{
"channel": "notifications",
"type": "position_depreciation",
"code": "9977c6b4-c9bc-4127-995b-623c6c37502f",
"customer_code": "c1d2e3f4-a5b6-7890-cdef-123456789abc",
"timestamp": "2026-09-10T10:15:00.594620Z",
"data": {
"symbol": "BTCUSDC_PERP",
"side": "long",
"amount": "0.04668",
"currency": "USDC",
"avg_fill_price": "51563.2",
"initial_value": "2406.97",
"mark_price": "45000",
"current_value": "2100.60",
"depreciation_pct": "12.728",
"threshold_pct": 10,
"mark_time": "2026-09-10T10:14:58Z",
"evaluated_at": "2026-09-10T10:15:00Z"
}
}
FieldDescription
typeNotification type; determines the shape of data. Currently position_depreciation
codeNotification identifier — equal to the code of the matching GET /customers/notifications record. Delivery is at-least-once: de-duplicate on it
customer_codeCustomer the notification concerns
timestampWhen the notification was created (created_at on the REST record)
dataType-specific payload (below)

data for type = position_depreciation:

FieldDescription
symbolInstrument symbol
sidelong or short
amountPosition size (absolute), base units
currencyCurrency of the value fields
avg_fill_priceAverage entry price of the exposure still held — the baseline. Quantity-weighted over the fills that built the position; not affected by daily settlement
initial_valueamount × avg_fill_price: the original cost of the exposure still held
mark_priceMark price the position was valued at
current_valueinitial_value plus profit or loss since entry at mark_price. A short depreciates when the price rises
depreciation_pctActual drop as a percentage of initial_value
threshold_pctThe 10% multiple this notification is for: 10, 20, 30, …
mark_timeTime of the mark price used
evaluated_atWhen the valuation ran

Notes:

  • One notification per threshold per position baseline. If several thresholds are crossed between two evaluations, only the highest is sent; a threshold already notified is not sent again if the value recovers and falls past it once more.
  • Increasing a position, flipping its side, or closing and reopening it starts a new baseline (new avg_fill_price), after which thresholds are notified afresh. Reducing a position keeps the baseline.
  • There is no initial snapshot on subscribe — use REST GET /customers/notifications for the history.
  • New notification types may be added over time under the same channel; clients should ignore type values they do not recognise.