Changelog
v22.0.0
devnet: 2026-10-18 19:01 UTC
mainnet: 2026-10-19 16:01 UTC
- Positive unrealized PnL now counts towards the margin available for placing
orders: OMF changes from
min(AV, TV) / PONtoAV / PON. - Withdrawals and transfers still use the stricter
min(AV, TV), so unrealized gains cannot leave the account. Withdrawals also cap leverage at 10x. These limits are likely to be relaxed in the future. See Margin. - Take-all liquidation routes each position to its market's backstop account. Take-all fees, receipt rounding, and funding-index updates in receipts are corrected.
- api: take-all liquidation history records one row per transferred market,
with its
marketId, backstop, health transition, and system fee. A take-all without positions records a single quote-balance row. - api:
/healthno longer includes the RFQstalledandstaleMarketssection. Don't require it when parsing health. - BREAKING protobuf:
TakeAllTakerResult.taken_balancesandTakeAllBalanceare removed. Stop reading them, and decode the remaining taker and position results with the v22 schema. - BREAKING ts: take-all results drop
takenBalances. Read each taker'stakenPositionsinstead. - ts: use
@n1xyz/nord-ts@0.8.1for the v22 generated schema. - Snapshots are written as V14. Snapshot consumers need a V14 decoder; keep a separate decoder for older snapshots. Upgrading nord-ts does not update binary snapshot parsing.
nord-ts version: 0.8.1
v21.0.0
devnet: 2026-09-17 14:01 UTC
mainnet: 2026-09-24 11:01 UTC
This release adds attached take-profit and stop-loss orders, including OCO pairs, and migrates oracle pricing to Pyth Pro with support for custom feeds.
- Added take-profit and stop-loss triggers to CLOB order placement, including atomic orders. These child triggers close a position when their price condition is met. They remain pending while the parent rests and activate when eligible after fills. An OCO (one-cancels-the-other) pair links two children so that successful execution of one cancels the other.
- BREAKING protobuf:
EditTriggerandAtomicEditTriggerbecomeReplaceTriggerandAtomicReplaceTrigger. Add-trigger actions now carrymarket_idoutsideTriggerRecord;referrermoves inside it.Intentis removed. Remove, replace, and execute payloads identify the trigger bytrigger_idwithout separate owner or market fields. - BREAKING protobuf: trigger receipts use
TriggerMutationReceiptandtrigger_replaced. Order placement and cancellation receipts exposetriggers.placed,triggers.activated, andtriggers.cancelled; the old placementcancelled_triggersfield is removed. - BREAKING api:
GET /account/{account_id}/triggersreturns pending and active triggers with parentorderId,sibling, andmarketModefields. Filter fororderId === nullto select active triggers.GET /triggers/activeis removed; there is no replacement endpoint covering all accounts. - BREAKING api: trigger placement-history cursors now use
action_id_sub_action_id_trigger_id. PassnextStartInclusiveback unchanged. Trigger history dropsintentand addsorderIdandmarketMode. - BREAKING ts: atomic
editTriggerbecomesreplaceTrigger.NordUser.removeTrigger()accepts onlytriggerId. Order placement accepts attachedtriggers, and placement/cancellation results includetriggerMutations. Trigger history types useTriggerHistCursor. - rfq: placement accepts an optional referrer ID, including through the SDK.
- api: order history includes the
timedoutfinalization reason. Position history correctly records closes after multiple fills in one action. - Increased the encoded action size limit from 1,024 to 1,648 bytes, plus 64 bytes for the signature.
To migrate, regenerate protobuf and API bindings, update trigger actions and receipt handling, and replace global trigger queries with account-specific queries where applicable.
nord-ts version: 0.8.0
v20.0.0
devnet: 2026-08-07 04:01 UTC
mainnet: 2026-08-07 19:01 UTC
This release activates RFQ markets on mainnet and makes fee configuration aware of market type and execution mode. Existing CLOB order placement remains compatible, but RFQ, fee-administration, liquidation, and raw protobuf integrations must migrate to the v20 shapes below.
- BREAKING protobuf:
RfqPlaceOnly.baseand the nestedFillTypeandPartialFillmessages are removed. Sendsize, optionalminimal_fill, and optionalis_reduce_onlydirectly onRfqPlaceOnly.RfqTradenow carries optionalminimum_size,maximum_size, andis_reduce_onlydirectly. - BREAKING protobuf:
RfqFillStatusandFillRFQResult.statusare removed. Determine whether a real execution occurred from the optionalexecutionpayload. Sampling responses omit it. - BREAKING protobuf: replace
AddFeeTier,UpdateFeeTier, andUpdateAccountsTierwithAddFeeTierType,UpdateFeeTierType, andUpdateAccountsFeeTierTypeMode. The replacementFeeTierTypeConfighas separate CLOB and RFQ maker and taker rates for each market type. Regenerate protobuf bindings because the new action and receipt cases use new field numbers. - BREAKING protobuf:
TakeAllPositionsResultnow contains a repeatedtakerslist. Each taker entry contains its account ID, balances, positions, and order updates. Consumers must iterate the list instead of reading one top-level taker. - protobuf:
SetBackstopAccountand its receipt now includemarket_mode, and theErrorenum addsCONFIG. - api: market-live responses can include separate
rfqandclobsections. Historical order rows now includeclientOrderId, andGET /account/{account_id}/orders/openreturns current open-order history records. These additions do not remove the existing account or market routes. - BREAKING ts: RFQ partial-fill sizes are decimal values,
NordUser.takePositions()returnstakers, and fee-tier admin methods use the new market-type-aware protobuf actions. Upgrade to@n1xyz/nord-ts@0.7.4before submitting v20 RFQ, liquidation, or fee-administration actions.
To migrate, regenerate protobuf code from the v20 schema, update exhaustive action and receipt switches for the new cases, replace the removed RFQ wrapper messages, and add fixtures for multi-taker liquidation receipts. Applications that only read existing CLOB account, market, orderbook, and WebSocket fields do not need a wire-format migration.
nord-ts version: 0.7.4
v19.0.0
devnet: 2026-07-29 17:01 UTC
mainnet: 2026-08-02 11:01 UTC
This release includes breaking changes to atomic actions as well as backend support for our upcoming RFQ feature.
- BREAKING protobuf: Atomic V2 is removed.
Action.atomic_v2,AtomicV2,AtomicSubactionV2, andAtomicPlacementRequestare no longer available. Regenerate your protobuf bindings and sendAction.atomic.- Put each
AtomicSubactiondirectly inAtomic.actions. - Replace
delegator_account_idwithtarget_account_id. (field number remains32) - Move
ReduceOrderLiquidation.target_account_idto its parentAtomicSubaction. - For self-targeted actions, omit
target_account_idanduse_key. - For vault actions, use
vault_account_idas the target and setuse_key = true. - For liquidation actions, use the liquidation account ID as the target and leave
use_keyunset orfalse.
- Put each
- BREAKING protobuf:
VAULT_PREVIOUS_EPOCH_WITHDRAWALS_NOT_PAYABLEis removed from theErrorenum. - protobuf:
SpecialAccountnow includesCLAIM_VAULT.VaultSyncEpochsReceiptnow includesvault_account_id. - BREAKING ts: Atomic subactions now use
targetAccountIdanduseKey. RemovedelegatorAccountIdandplacement. - BREAKING ts: Use
await nord.getProtonClient(). Direct access throughnord.protonClientis no longer available. Proton initialization now starts on first use. - BREAKING api:
GET /account/systemnow returns{ actionId, feeVault, claimVault }. It previously returned the fee-vault balance array. - api: Trade and order history responses now include
marketMode. - ws: Account
fillskeys now useorderId:makerId:rawPrice. Code that readsObject.values(fills)continues to work. Code that looks up fills by key must change.
nord-ts version: 0.7.3
v18.0.0
devnet: 2026-07-21 10:01 UTC
mainnet: 2026-07-28 13:01 UTC
- BREAKING api:
GET /account/{account_id}now returns open-orderclientOrderIdasstring | nullinstead ofnumber | null. - BREAKING api: WebSocket
client_order_id,taker_client_order_id[], and deprecatedsender_tracking_idvalues now serialize as numeric strings instead of numbers. - Added
RefreshSessionto allow a session to refresh itself up to some maximum deadline while maintaining the same session ID. - Added
SelfRevoketo allow a session to revoke itself. CreateSessionnow accepts an optionalrefresh_deadlineparameter and returns the effective expiry and refresh deadline.- ts:
NordUser.refreshSession()now returns{ sessionId, expiry, refreshDeadline? }instead ofvoid. - api:
GET /user/{pubkey}session objects now include optionalrefreshDeadline.
nord-ts version: 0.7.0 to 0.7.2
v17.0.0
devnet: 2026-06-29 09:01 UTC
mainnet: 2026-06-30 09:01 UTC
- Atomic actions are expanding: trigger add/edit/remove is moving into atomic actions.
- Trigger history pagination now supports sub_action_id.
- Increased action timestamp staleness threshold from 60s to 120s.
- Relaxed oracle unfreeze price-change threshold from 0.5% to ~1.33% per timestamp unit.
- Added referrer tracking, i.e. builder codes.
- Added taker-side client order ID to WebSocket messages.
- Rate now has two buckets:
/actionand all other endpoints. We will be announcing new rate limits as we adjust them. - Introduced vaults. See the API reference for vault endpoints. Briefly:
- HTTP:
GET /vaults/*,GET /account/{account_id}/vault-user-states,GET /account/{account_id}/history/vault/* - ws: subscribe with
vault@{vault_id}, receives Vault update payload with latest full vault state.
- HTTP:
nord-ts v0.5.1:
- Adds centralized math utilities and updated trading function types.
- Adds trigger add/edit/remove support in atomics.
nord-ts v0.6.0:
- Introduces ActionsV2 with the new placement interface instead of delegator_id.
- Placement must now be explicit; see the module docs.
- User actions for deposit and withdrawing to/from vaults.
- On refresh session you can specify expiry timestamp.
Both v0.5.1 and v0.6.0 are compatible with v17 of nord.