Changelog
All notable changes to the DLTM Derivatives API.
This changelog follows Keep a Changelog conventions.
2026-07-16 — v1.12.1
Fixed
balance-changesWebSocket channel — mark-to-market movements now carrytransaction_type: "settlement", matching thetypethe same ledger row carries onGET /transactions. They were previously published under the internal nameremarking; clients matching onremarkingmust switch tosettlement.
2026-07-13 — v1.12.0
Added
GET /v1/customers/transactions— broker-scoped transaction ledger across all customers, with an optionalcustomer_codequery parameter to scope to one customer. Responses cover all transaction types (deposit,withdrawal,trade,settlement,funding) newest-first with cursor pagination (after/before, populatedresponse_metadata); liquidation/auto-deleveraging fills are reported as plaintraderows andstatusis limited topending/completed/cancelled.balance-changesWebSocket channel —transaction_typegainsliquidationandauto_deleveraging: forced fills (exchange liquidation engine / auto-deleveraging) are now labeled instead of arriving as plaintrademovements. Same message shape astrade(total_amount = realised_pnl - fee).balance-changesWebSocket channel —symbolis now also present on trade-family movements (trade,liquidation,auto_deleveraging), so a movement can be tied to its instrument/position without joining against thetradesfeed. Forced fills carry noreference_id(there is no client order), makingsymbolthe position reference.
Changed
GET /v1/customers/{code}/transactionsis served from the same internal ledger as the new broker-scoped endpoint: identical row semantics, and the previously ignoredafter/beforecursor parameters now paginate.
Deprecated
GET /v1/customers/{code}/transactions— superseded byGET /v1/customers/transactions?customer_code={code}. The endpoint keeps working but will be removed in a future major version.
2026-07-09 — v1.11.0
Changed
- Breaking —
GET /v1/customers/{code}/transactions: ontrade,liquidationandauto_deleveragingrows,total_amount(and its deprecated duplicateamount) is now the fill's net cash movement (realised_pnl−fee, absolute value, at full precision) — the same quantity thebalance-changesWebSocket publishes astotal_amount. It was previously the traded notional (price × quantity) rounded to 2 decimals.directionon those rows now carries the sign of the cash movement (previously it encoded the order side: buy =credit, sell =debit). GET /v1/customers/{code}/transactionsno longer returns a secondtraderow per fill sourced from the exchange's collateral journal; each fill appears exactly once.
Added
GET /v1/customers/{code}/transactions—total_amount, the authoritative movement field going forward, named after itsbalance-changesWebSocket counterpart (signed there; absolute here, withdirectioncarrying the sign). It currently duplicatesamount, which is deprecated.GET /v1/customers/{code}/transactions— new fields mirroring thebalance-changesWebSocket:realised_pnlandreference_id(the client-supplied order id) on trade-type rows,mark_priceonsettlementrows, andfunding_rateonfundingrows.max_leverageonGET /v1/customers/{code}/margin-profile— the maximum leverage a customer may select when placing an order. Orders requesting a higher leverage are rejected with a validation error, as are in-range values with no exact integer-percent initial-margin representation (currently only leverage 11). Currently a platform-wide constant ("13"); per-customer limits are planned.
Deprecated
amounton transaction rows — replaced bytotal_amount(currently an exact duplicate); it will be removed in an upcoming release. Migrate tototal_amount.max_leverageonGET /v1/instrumentsrows — never populated (always an empty string); it will be removed in an upcoming release. Usemax_leverageonGET /v1/customers/{code}/margin-profileinstead, which carries the leverage cap enforced at order entry.
2026-07-06 — v1.10.0
Added
PUT /v1/customers/{code}/fee-profile— set a customer's fee schedule across all instruments in one request. Accepts the samemaker_feeandtaker_feebody as the per-instrumentPUT /v1/customers/{code}/fee-profile/{symbol}endpoint (both in basis points) and returns the customer's fullFeeProfileListwith the updated schedule for every instrument.
2026-06-17 — v1.9.0
Added
- WebSocket
balance-changes— real-time balance ledger movements, the push counterpart ofGET /v1/customers/{code}/transactions. Private, broker-scoped channel: an authenticated connection receives movements for every customer under its broker. Each message'scodeequals the matching/transactionsrow'scode(and the/trades/tradesWScodefor trade and trade-fee movements), so a balance change can be joined back to its ledger entry.balanceandbalance_as_ofcarry the resulting end balance and are present only oncompletedevents. Subscribe with{"op": "subscribe", "args": ["balance-changes"]}.
2026-06-15 — v1.8.0
Changed
- Breaking — the order
statusenum was reworked on both the REST order schema and the WebSocketorderschannel:- Added
partially_filled— an order that has been partially executed and is still resting on the book. Such orders previously reportedopen. - Removed
canceled_partially_filled— an order canceled after a partial execution now reportscanceled. Inspectfilled_amount(andfilled_quote) to tell whether any quantity filled before the cancellation.
- Added
2026-05-25 — v1.7.0
Added
cash_amounton order entry (POST /v1/customers/{customer_code}/orders) — place market and limit orders by notional value in the quote currency instead of contract size. Mutually exclusive withamount(exactly one is required for market and limit orders), must be a positive number, and requirestime_in_force: IOC(the default when omitted;FOKandGTCare rejected). Not supported for stop/take-profit order types. The notional is resolved into a contract quantity and filled immediately.cash_amountandfilled_quoteon order responses — both the REST order schema and the WebSocketorderschannel now echo the requested notional (cash_amount, present only for cash orders) and report the cumulative filled notional (filled_quote).PUT /v1/customers/{code}/fee-profile/{symbol}— set a customer's per-instrument fee schedule. Acceptsmaker_feeandtaker_feein the request body and returns the updatedFeeProfileItemfor the symbol.
Changed
amountis no longer required on order entry — supplycash_amountinstead for market/limit orders. It remains required for all other order types.FeeProfileItem.maker_feeandtaker_fee(returned byGET /v1/customers/{code}/fee-profile) are documented as basis points (e.g."2"= 0.02%). The previous "decimal fraction" wording and the"0.0002"/"0.0005"examples were inaccurate; the underlying values have always been bps. Behaviour is unchanged.
2026-05-11 — v1.6.0
Added
- WebSocket
orderbook-stream:{symbol}— multi-level orderbook snapshot followed by atomic update batches. Each update message carries one or morechanges({action: new|change|delete, type: bid|ask, price, amount}) that should be applied together.amountis"0"ondelete. Public channel, no authentication required. - WebSocket
market-trades:{symbol}— real-time anonymous trade tape. One envelope per trade. Field set mirrors the RESTPublicTradeschema returned byGET /v1/market-trades, so the same parser can be used for both. Public channel, no authentication required. - WebSocket error codes:
ORDERBOOK_STREAM_UPSTREAM_ERROR,ORDERBOOK_STREAM_UPSTREAM_REJECT,MARKET_TRADES_UPSTREAM_ERROR,MARKET_TRADES_UPSTREAM_REJECT. Channel-scoped — only the affected subscription is torn down, not the whole client connection. Clients should re-issuesubscribeto recover.
Changed
- WebSocket documentation reorganised into three sections in the sidebar: Connection, Public channels, and Private channels.
2026-05-05 — v1.5.0
Breaking changes
- Removed
GET /v1/instruments/{symbol}. UseGET /v1/instruments?symbol={symbol}instead — it returns the same instrument inside a single-record list (or an empty list / 400 for unknown symbols, mirroring the/v1/tickersfilter semantics). - Removed
GET /v1/instruments/{symbol}/leverage_brackets. The single-tier brackets it returned were derivable from theinit_margin_req,maint_margin_req, andmax_leveragefields already present on each instrument record fromGET /v1/instruments. Instrument.statusenum changed: removedsettled; addedpost_only(limit orders only, matching disabled) andtrade_halt(new orders rejected). The same enum applies to thestatusquery filter on/v1/instruments.
Added
symbolquery parameter on/v1/instruments. Supports the same pipe-separated literal and*wildcard syntax as/v1/tickers.
2026-05-04 — v1.4.0
Breaking changes
- Removed
GET /v1/customers/{code}/margin-requirements/{symbol}— subsumed by the extended margin-profile response (see Added below).
Added
- Optional
leveragefield onPOST /v1/customers/{code}/orders— positive integer (^[1-9][0-9]*$) in[1, 13]. The broker translates it to a per-instrument initial-margin override on the subaccount before placing the order. The override persists across subsequent orders on the same instrument until a different leverage is supplied. instrument_marginsarray on theMarginProfileresponse (GET /v1/customers/{code}/margin-profile) — one entry per instrument with a non-default initial margin, each carryingsymbol,leverage, andinitial_margin.
Changed
- Margin / IM string fields (
MarginProfile.initial_margin/maintenance_margin,MarginProfile.instrument_margins[].initial_margin,Instrument.init_margin_req/maint_margin_req,LeverageBracket.init_margin_req/maint_margin_req) are now formatted with 2-decimal precision (e.g."0.12") instead of 6-decimal ("0.120000"). Numerically equivalent — clients parsing as decimal are unaffected.
2026-04-29 — v1.3.0
Added
- Wildcard support in
symbol,underlying, andquote_currencyfilters on/v1/tickersand/v1/instruments— values may use*(matches any sequence of characters, including empty). Matching is case-insensitive and anchored to the full string. Existing exact and pipe-separated values continue to work.
2026-04-09 — v1.2.0
Breaking changes
- Removed
stop_pricefield from all order schemas — replaced bytrigger_price,stop_loss_price,take_profit_price, andtrigger_price_type - Removed
stop_pricefrom amend order request stop_lossandtake_profitorder types now usetrigger_priceinstead of the removedstop_price
Added
- New order types:
stop_loss_limit,take_profit_limit,take_profit_stop_loss trigger_pricefield — trigger price for stop_loss, stop_loss_limit, take_profit, take_profit_limit ordersstop_loss_pricefield — stop-loss price for take_profit_stop_loss combo orderstake_profit_pricefield — take-profit price for take_profit_stop_loss combo orderstrigger_price_typefield —trade_price(for stop/TP types) ormark_price(for combo type)- Mechanical types
stop_marketandstop_limitin order responses and WebSocket updates - Advanced orders now included in list open orders response
- Server-side validation of required fields and allowed trigger price types per order type
Fixed
- WebSocket
ordersandtradestopics no longer require a symbol suffix — aligned implementation with documented per-account behavior
2026-04-03 — v1.1.0
Breaking changes
- All enum values are now snake_case (e.g.
MarginCall→margin_call,StopLoss→stop_loss,Buy→buy) - Renamed
/customers/{code}/leverageto/customers/{code}/margin-profile - Removed
/customers/{code}/risk-limitsendpoint - Removed
realised_pnlfrom account summary response - Removed
expiryfield andFuture/Optionfrom instrument types - Removed
typequery parameter from/instruments - Transaction types changed: removed
funding_payment,realised_pnl,adjustment; addedsettlement,funding,auto_deleveraging
Added
typefield on customer trades (trade,liquidation,auto_deleveraging)initial_marginandmaintenance_marginfields on margin profilesettlementandfundingtransaction types from collateral adjustmentsbeforepagination parameter for historical trades
Fixed
- Historical trades now default to
sort=ascand validate requiredfrom/toparameters - Currency fields now correctly show
USDCinstead ofUSD - WebSocket
tradestopic is now per-account (no symbol suffix required)
2026-03-31 — v1.0.0
Added
- Initial public release