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"
}
}
| Field | Description |
|---|---|
type | Notification type; determines the shape of data. Currently position_depreciation |
code | Notification identifier — equal to the code of the matching GET /customers/notifications record. Delivery is at-least-once: de-duplicate on it |
customer_code | Customer the notification concerns |
timestamp | When the notification was created (created_at on the REST record) |
data | Type-specific payload (below) |
data for type = position_depreciation:
| Field | Description |
|---|---|
symbol | Instrument symbol |
side | long or short |
amount | Position size (absolute), base units |
currency | Currency of the value fields |
avg_fill_price | Average entry price of the exposure still held — the baseline. Quantity-weighted over the fills that built the position; not affected by daily settlement |
initial_value | amount × avg_fill_price: the original cost of the exposure still held |
mark_price | Mark price the position was valued at |
current_value | initial_value plus profit or loss since entry at mark_price. A short depreciates when the price rises |
depreciation_pct | Actual drop as a percentage of initial_value |
threshold_pct | The 10% multiple this notification is for: 10, 20, 30, … |
mark_time | Time of the mark price used |
evaluated_at | When 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/notificationsfor the history. - New notification types may be added over time under the same channel;
clients should ignore
typevalues they do not recognise.