v.2.12.0 - Test Environment
2026-09-15 - Planned deployment to Live
2026-09-01 - Test Environment
Breaking Changes
Traditional Assets - Order Status Enum
The status field and status query filter on the traditional order reads now use TraditionalAssetOrderStatusV2Enum, which removes four statuses the platform never emits. The change stays on the existing endpoints - there is no new URI version; partners already reading these orders continue on the same paths.
- Endpoint:
GET /traditional/orders,GET /traditional/orders/{orderId}, and the/v2traditional order reads - Change: four values removed from the order-status enum in the response and the
statusquery filter -UPDATED,RECONCILIATION_CORRECTION,CANCELLATION_REJECTED,CANCELLATION_ACCEPTED - Required Partner Action: remove those four values from any client-side enum validation or switch/case over the order status before the Live deployment date. No path change is required - the endpoints and URI versions are unchanged. These statuses were never emitted, so no live response payload changes.
Added
Tokenized Assets - eWP Cost Disclosure
The eWP ex-ante (assetType: eWP, symbol TVDY) now returns a full MiFID II cost disclosure - itemised annual holding costs, an aggregate total, and the cumulative cost over the assumed holding period - alongside the immutable snapshot that is retained and rendered as the disclosure PDF.
- Documentation Location: API REFERENCE - Trading - Tokenized Assets
- Endpoint:
POST /wawex/ex-ante - Added field:
costs.holdingCosts[]- itemised annual holding costs in disclosure order (ONGOING_PRODUCT_COSTthenPERFORMANCE_FEE); returned on an eWPBUYonly, omitted on an eWPSELLand on every tracker/ETF response - Added field:
costs.holdingPeriod- cumulative cost over the assumed holding period; eWP only - Added field:
WawexOrderCostInfo.aggregate- aggregate total cost (product costs plus transaction fees); eWP only - New enum:
WawexHoldingCostTypeEnum-ONGOING_PRODUCT_COST,PERFORMANCE_FEE(MiFID II requires the two disclosed separately) - Note: for eWP the
productCosts.terslot carries the aggregate annual product cost - the sum of everyholdingCosts[]entry - not the TER alone; for tracker/ETF assetsterremains0 - Note: on an eWP
SELL,productCosts,totalandtimelineare always present with every value explicitly0; a sale discloses no holding cost
Appropriateness Test - eWP Asset Type
The eWP asset class is now a first-class option in the appropriateness test and trading-profile asset types, so partners can drive an appropriateness check for TVDY the same way they do for security tokens.
- Documentation Location: API REFERENCE - Entities
- New enum value:
AppropriatenessTestAssetTypeEnum-EWP - New enum value:
TradingProfileAssetTypeEnum-EWP
Traditional Asset Order Notification - New Error Codes
The traditional-asset order notification webhook can now report four additional failure reasons, so partners can distinguish these rejection causes without inspecting the free-text message.
- Documentation Location: API REFERENCE - Webhooks
- New enum value:
TraditionalAssetOrderNotificationErrorCodeEnum-POSITION_BLOCKED_BY_OPEN_ORDER,NO_FRACTIONAL_POSITION,SELL_ALREADY_IN_PROGRESS,PRICE_DATA_UNAVAILABLE
Changed
Traditional Assets - Sell-All Split Into Two Orders
POST /traditional/orders/sell-all (introduced in v.2.11.0, not yet Live and not yet integrated by any partner) now settles a position as two disjoint orders instead of one, so the whole-share leg trades on the exchange in the customer's own name and the sub-one-share remainder is disposed separately. This finalises the sell-all contract before it reaches production.
- Documentation Location: API REFERENCE - Trading - Traditional Assets
- Endpoint:
POST /traditional/orders/sell-all - Changed: response is now
SellAllResult(wasCreateOrderResult) and carries two ids -wholeShareOrderIdandfractionOrderId; the two quantities are disjoint and sum to the position - Behavior change: the whole-share leg is an ordinary order - it appears on the
/v1order reads and theTRADITIONAL_ASSET_ORDER_NOTIFICATIONwebhook as well as/v2, and is charged the ordinary exchange sell fee; the fraction leg is not charged again, so the sale pays one fee but issues two trade invoices (the legs fill at two different prices) - Behavior change: cancellation is asymmetric -
DELETEon the whole-share leg responds202(cancelling it leaves a non-zero position), whileDELETEon the fraction leg responds409 - Behavior change: if the whole-share leg fails terminally, the savings plans deactivated by the sell-all are reactivated
- Note: a leg with nothing to sell still resolves - an exactly-whole position rejects the fraction leg, a sub-one-share position rejects the whole-share leg;
PATCHremains501for all traditional orders
Tokenized Assets - eWP Ex-Ante Now Addresses a Recipient
An eWP ex-ante is a legally retained cost disclosure rather than a throwaway quote, so it must resolve the customer it is addressed to. eWP ex-ante is not yet integrated by any partner, so these fields become part of its finalised design rather than a breaking change.
- Documentation Location: API REFERENCE - Trading - Tokenized Assets
- Endpoint:
POST /wawex/ex-ante - Added field:
walletCustomerProductId- required for eWP symbols, rejected with400when absent; ignored for tracker/ETF symbols - Added field:
cashCustomerProductId- required for eWP symbols, rejected with400when absent; ignored for tracker/ETF symbols - Changed:
exchangeCodeis no longer a required field on the execution response - it is returned asTVMfor tracker/ETF instruments and omitted for eWP, which does not trade on an exchange
Traditional Assets - Richer Partial Executions
The partial-execution detail returned on the traditional order reads is expanded.
- Documentation Location: API REFERENCE - Trading - Traditional Assets
- Endpoint:
GET /traditional/orders,GET /traditional/orders/{orderId} - Added field:
PartialExecutionV2addstaxData[],feeAmountandfeeDescriptionto each partial execution
Users - Corrected Query Filters
Three defects in the GET /users query parameters are fixed, two of which affected the running API.
- Documentation Location: API REFERENCE - Users
- Endpoint:
GET /users - Behavior change: the
lastNamefilter now works - the parameter was misspelledlasttName, so a partner sendinglastNamesilently matched nothing - Behavior change: the
emailandglobalIdfilters are unswapped - previously?email=filtered byglobalIdand?globalId=filtered byemail