Testnet moves to our new Rust trading engine
Polyester Testnet now runs on our new Rust matching engine, with new account and trading cells. It's built for lower, steadier latency and greater stability, and it's our biggest update since Testnet launched.
New
- Stops can follow the index price: stop-loss, take-profit and trailing stops can watch the index instead of the last trade, so one odd trade can't set them off
- More ways to buy on a trigger: buy-side trailing stops with a maximum price, and market orders on buy stops with an optional slippage cap
- Automatic withdrawals on a schedule, from hourly to monthly
- Five more candle timeframes: 3m, 2h, 6h, 8h and 3d
- Orders show more: exact average price, quote used and total fees
- For bots: batch orders over the trading WebSocket, a private WebSocket for order updates, and fetching missed trades by trade ID
Better
- Attached take-profit and stop-loss share one exit, so they can't both sell your position
- Lowering an order's size at the same price keeps your place in the queue
- Clearer refusals: order errors name the field to fix, and market orders say exactly why they were refused
What changes for you
- Attached take-profit and stop-loss now lock funds: you can't sell or withdraw the locked amount until you reduce or cancel them
- Self-trade prevention now covers all sub-accounts of one owner
- API users and market makers: order updates moved to
/v1/ws/private, the SBE schema is now 36, and REST fields and parameters were renamed. Review the 48 changes that need attention below.
Changes to the API that may require updates to your integration.
Edits that would activate a waiting trailing stop or immediately fire an active one now return TRIGGER_WOULD_TRIGGER_IMMEDIATELY and preserve its existing settings.
What you need to do
Clients that relied on immediate activation or firing must handle TRIGGER_WOULD_TRIGGER_IMMEDIATELY on edits and the corresponding FAILED outcome after creation. Choose an unreached activation price or a distance whose trigger price has not been reached. To start trailing immediately, omit the activation price on create or explicitly set it to zero on edit.
REST clients also receive route-specific quantity and price precision rejections, changing how batch creation and preview responses must be handled.
What you need to do
Update REST clients to inspect individual batch-create results and preview admissible/rejection fields instead of expecting HTTP 400 for these precision errors. Handle PRICE_TICK_SIZE instead of INVALID_ARGUMENT for affected modify, batch-replace, and attached trailing-stop limit prices.
REST order errors now include field-level validation details. Some error codes and REST and ConnectRPC field paths have changed, requiring updates for clients that match those values.
What you need to do
Update clients that match INVALID_ARGUMENT for affected POST /v1/orders precision errors to handle QTY_STEP_SIZE or PRICE_TICK_SIZE. REST batch and preview violation paths now use REST names such as items[2].limitGtc.price. ConnectRPC path matching must use order.base_qty_scaled instead of order.qty_scaled, the selected limit variant's price_ticks field instead of order.execution.price_ticks, and indexed batch-replace paths. Accept optional violations in REST problem responses. Excess fractional digits that are all zeros still return INVALID_ARGUMENT.
Attached take-profit, stop-loss and trailing-stop exits now reserve the funds they need. Sell orders with attached trailing stops must also specify a maximum buy-back price.
What you need to do
For sell orders with attached trailing stops, provide trailingStop.limitPrice in REST or TrailingStopPolicy.limit_price_ticks in protobuf requests; omit it on buy orders. Read this maximum through GetTrigger, since parent order reads do not yet return it. Reduce or cancel protection before using its reserved funds elsewhere.
Affected REST endpoints now accept only camelCase query parameter names. Clients using snake_case names must update their requests to preserve filtering and pagination.
What you need to do
Replace affected snake_case query names with their documented camelCase equivalents, including subaccountId, accountCode, groupBy, pageToken, timestampMin, timestampMax, idempotencyKey, zippedAssetId, assetId, groupId, startTsSec, endTsSec, orderBy, includeSparklines, sparklineIntervals, vaultAccountId, startTime, endTime, flowKind, flowState, txRef, ownerAccountId, smartAccountAddress, polyesterChainIds, zippedAssetIds, unifiedAssetIds, lookupKind, and chainId. Removed names are ignored: optional filters or cursors no longer apply, while requests supplying required identifiers only under old names fail validation. Use symbol, such as symbol=BTC-USDT, for trigger and fee-rate filters. Handle UNKNOWN_SYMBOL on spot fee-rate reads. ConnectRPC request field names do not require changes.
Trading integrations now receive rejection codes consistent with API errors and distinct cancellation reasons across order reads and authenticated streams.
What you need to do
Replace terminalReasonCode and terminalReason on order responses, and reasonCode on private order events, with rejectReason or cancelReason according to status or event kind. Regenerate protobuf clients for the removed fields. Regenerate trading WebSocket SBE codecs for schema 7 version 33: OrderEvent removes reasonCode, shifts subsequent field offsets, and adds rejectReason and cancelReason. Update clients together with the server upgrade; old numeric reason mappings are incompatible.
WebSocket connections now enforce session, connection, and reconnect-rate limits.
What you need to do
Trading WebSocket sessions are now limited to 16 per API key and 64 per account by default. A new session above either limit is refused with HTTP 429 and TOO_MANY_SESSIONS_API_KEY or TOO_MANY_SESSIONS_ACCOUNT. Market-data and private WebSocket connections are also limited per client address, including how quickly a client may reconnect. Reuse sessions, close the ones you no longer need, and back off after a 429 instead of reconnecting immediately.
USDT- and USDC-quoted pairs default to a maximum market-order value of 1,000,000 quote units.
What you need to do
Clients submitting market orders above the published maxMarketNotionalQuote must reduce their size, accounting for buy-side slippage.
REST clients must update batch replacement payloads and trailing-stop request fields and response parsing.
What you need to do
Replace items[].newPriceTicks with items[].newPrice on POST /v1/orders/replace-batch, sending the intended decimal price, such as "28334.99". Replace trailingDistanceTicks with trailingDistance in REST order and trigger requests and response parsing, using decimal quote-asset price deltas such as "0.5". trailingDistanceBps and maxSlippageTicks remain unchanged. ConnectRPC contracts are unchanged.
Frequent cancel-all callers gain capacity aligned with their account’s configured cancellation budget, while integrations must handle a changed retry response.
What you need to do
Handle listingStatus on cancel-all responses across HTTP and WebSocket integrations. Do not interpret an empty retry listing as zero cancellation requests. Preserve the initial listing if needed, use open-order reads to refresh current state, and use a fresh request identity for a new cancellation. SBE WebSocket consumers must update for public schema version 29.
Canceling an exit order created by an attached take-profit or stop now cancels that leg instead of allowing it to fire again. With OCO enabled, both attached legs end.
What you need to do
Update clients that expect HTTP 503 for ATTACHED_EXIT_WORKING to handle HTTP 400 / FailedPrecondition and retry after the exit ends. Workflows that relied on exit cancellation to re-arm attached protection must explicitly configure protection again.
If a market stops responding, new orders for it are now refused within about a second with a retryable "market busy" error, and no funds are held for them. Orders already submitted complete when the market recovers, and other markets are unaffected.
What you need to do
New orders, order modifications and trigger or ladder creations for a market that has stopped responding are now refused with the retryable PAIR_BACKLOGGED error (HTTP 503; Connect unavailable) instead of being accepted and held; handle it by retrying with backoff until the market resumes. Cancels are unaffected.
Clients can opt into market-specific resync notifications to keep their private trading connection open while other markets continue streaming. SBE integrations must update to schema 28.
What you need to do
Update SBE encoders and decoders to tradews schema 28; schema 27 requests are rejected. To recover without reconnecting, implement MarketResync handling and Orders API reconciliation before enabling marketResync in Subscribe. Clients without the opt-in must continue reconnecting and reconciling after a 1012 close.
Market makers refreshing quotes frequently avoid replacement rejections caused by completed modifications consuming their outstanding-request allowance.
What you need to do
Update clients relying on the former 120-second batch replay window. After 60 seconds, reconcile individual orders instead of retrying an old batch to discover its result. An unavailable batch-status record does not prove rejection. Use fresh request IDs for new work.
Order-stream integrations now receive account snapshots and sequenced updates in JSON or protobuf, with cursor-based reconnection and explicit readiness signals.
What you need to do
Move order subscriptions from /connection/websocket to /v1/ws/private and select polyester.v1.json or polyester.v1.proto. Authenticate with the existing realtime connect token and obtain subscription tokens using private:spot:orders:<account> without suffixes. Update message parsing for the public orders.v1.Order format, implement subscription-token refresh, install snapshots at snapshotEnd, and wait for ready before relying on the stream. Replace batch-replace channel subscriptions with GetBatchReplaceStatus and order updates.
Trading APIs return more specific rejection codes and clearer WebSocket error messages. Trigger cancellation error handling requires a client update.
What you need to do
Update API bindings and error handlers for the expanded error codes. Replace references to TRIGGER_CANCEL_REJECTED (44) with handling for TRIGGER_STATUS_INVALID (45) and TRIGGER_NOT_MODIFIABLE (46). Adjust HTTP status and retry handling for the revised responses.
Adds batch order creation, replacement, and cancellation over protobuf and SBE. SBE clients must upgrade to schema version 19.
What you need to do
Coordinate SBE client updates to trading WebSocket schema version 19 with the server rollout. Earlier schema versions are rejected.
Order creation and replacement failures involving a zero order identifier now report a specific client error instead of a generic server error.
What you need to do
Update binary trading WebSocket codecs and outgoing message headers from SBE schema version 15 to 16, and support rejection code INVALID_ORDER_ID (80). Earlier schema versions are rejected.
Order API and WebSocket clients receive specific rejection codes for pair limits and replacements at or below the filled quantity.
What you need to do
Update SBE trading WebSocket clients to schema version 13 and handle rejection codes 74 (MAX_QTY), 75 (MAX_NOTIONAL) and 76 (QTY_AT_OR_BELOW_FILLED). Command frames using earlier schema versions are rejected.
Open-order policy limit rejections now return HTTP 400 instead of 429. Trading WebSocket errors more accurately identify invalid quantities and prices.
What you need to do
Update clients that expect HTTP 429 or resource_exhausted for POLICY_MAX_OPEN_ORDERS to handle HTTP 400 or invalid_argument. Adjust WebSocket error handling for BAD_QTY and BAD_PRICE.
Market trades, account trades, ledger transfers, and trigger events now use ordered event batches to reduce realtime backlog under trading load.
What you need to do
On the market trades, account trades, ledger transfers and trigger event streams, every message is now a batch: JSON messages carry {"events":[...]} even for a single event, and protobuf messages use MarketTradeBatch, UserTradeBatch, TransferRowBatch or TriggerEventBatch. Process events in array order and de-duplicate them by event identity. If a subscription cannot be recovered, reload current state over REST. An omitted isDebit on a transfer means false.
API clients retrying a trigger create after INTERNAL_ERROR may now receive CONFLICT_DUPLICATE_CLIENT_TRIGGER_ID (code 47), even for an identical request.
What you need to do
Update trigger-create retry handling to reconcile after INTERNAL_ERROR and handle code 47 by using a new client trigger ID when a replacement is needed. Do not assume a failed create leaves its ID reusable.
Each account can hold up to 100 pending or active triggers per market, including at most 15 TWAP orders and five ladder orders.
API-key refusals on session-only wallet withdrawals, auto-withdraw rule changes, and portfolio equity reads now return AUTH_SESSION_KIND_NOT_ALLOWED instead of PERMISSION_DENIED.
What you need to do
If your client matches PERMISSION_DENIED for API-key refusals on CreateWalletTradingWithdraw, SetAutoWithdrawRule, DisableAutoWithdrawRule, GetPortfolioEquitySnapshot, or GetPortfolioEquityHistorySeries, update it to match AUTH_SESSION_KIND_NOT_ALLOWED. Read the REST code field or ConnectRPC auth.v1.AuthErrorDetail. Match error codes instead of refusal message text, and use a session token for these operations.
Claiming daily testnet rewards now requires a verified Discord or X account.
What you need to do
If neither account is verified, open the daily reward dialog and complete Discord or X verification before claiming.
Authorized API-key callers can retrieve subaccount details without the previous 503 error, and optional sections now require explicit query parameters.
What you need to do
Remove includeBalances and dependencies on the balances response field. Retrieve balances separately through GetBalances. Replace snake_case REST query names with camelCase and explicitly enable each required expansion.
API integrations must use an interactive session to manage saved destinations and tags, and REST authentication refusals now use structured problem responses.
What you need to do
Use interactive sessions for address-book mutations. Update REST error handling to accept application/problem+json and read its top-level code field.
Accounts with neither provider verified receive guidance when claiming, while available reward information remains visible.
What you need to do
If neither provider is verified, verify your X or Discord account before starting a new Daily Claim.
API clients can now distinguish an unreadable trigger from a readable trigger with no event history.
What you need to do
Handle NOT_FOUND instead of treating every empty history response as a valid trigger. Check the trigger ID and selected subaccount, and retry UNAVAILABLE responses.
API clients should use GetBalances.reserved to retrieve aggregate held trading amounts per asset.
What you need to do
Remove ListHolds calls, /v1/holds wrappers, and references to ListHoldsRequest, HoldRow, and ListHoldsResponse when updating clients. Use GetBalances or GET /v1/balances and read each asset's reserved amount for aggregate held trading funds.
REST clients can now use the same self-trade prevention field when reading trigger lists and individual triggers.
What you need to do
Update clients that read stpMode from GET /v1/triggers to read selfTradePreventionMode instead; REST order responses continue to use stpMode.
API clients can now filter triggers using status=CANCELED or status=ARMED and trigger events using eventType=FIRED without receiving an invalid-filter error.
What you need to do
Update affected clients to use the exact values listed in the REST API reference: replace status=STATUS_CANCELED with status=CANCELED, eventType=EVENT_FIRED with eventType=FIRED, and side=buy with side=BUY. Omit optional filters instead of sending an UNSPECIFIED value.
REST integrators must update timestamp parsing for affected order responses and spot pair schedules; Connect clients are unaffected.
What you need to do
Parse the affected timestamp fields as RFC 3339 strings instead of reading seconds/nanos properties, and handle absent listingAt or delistingAt fields when no schedule exists. For integer order timestamps, the unchanged tsNs and acceptedTsNs fields remain available. Decimal fields retain their existing units; newQtyScaled remains a scaled integer.
The generated API reference no longer advertises unsupported whiteboards, chart drawing layers, or saved layouts.
What you need to do
Whiteboard, chart drawing-layer and saved-layout APIs are no longer part of the public API or its reference. They were never supported: remove any integration that depends on them, as they may change or stop responding without notice.
REST clients must update response parsers because 12 price, quantity and volume fields have new names while retaining their existing decimal-string values.
What you need to do
Update GET /v1/spot/markets/overview response parsing: lastPriceTicks → lastPrice; indexPriceTicks → indexPrice; high24hTicks → high24h; low24hTicks → low24h; volume24hBaseScaled → volume24hBase; volume24hQuoteScaled → volume24hQuote; volume24hUsdScaled → volume24hUsd; bestBidTicks → bestBid; bestBidQtyScaled → bestBidQty; bestAskTicks → bestAsk; bestAskQtyScaled → bestAskQty; sparklines[].closeTicks → sparklines[].close. Keep decimal parsing unchanged; do not apply additional tick or scale conversion.
Repeating a cancel after an order has ended now returns ORDER_ALREADY_TERMINAL instead of another ACCEPTED response.
What you need to do
Update cancel retry handlers that expect ACCEPTED to treat ORDER_ALREADY_TERMINAL as already done. Read the order to determine how it ended. Prefer order IDs for later retries, and respect rate-limit responses.
Fixed average execution prices being rounded down to a whole price tick, improving accuracy for orders filled across multiple price levels.
What you need to do
REST clients that restrict avgPx to nine decimal places must accept up to 18. ConnectRPC and WebSocket clients can adopt avg_price_e18 for higher-precision average prices.
Ledger reads now return specific errors for invalid subaccount selectors, and private trade WebSocket messages consistently include the fee rebate indicator.
What you need to do
Restart any REST subaccount transfer listing that encounters a page-token error using a token issued before this update. Omit the subaccount selector to use the authenticated default account, and handle INVALID_SUBACCOUNT_ID for invalid selectors.
Traders reducing an order’s total quantity through batch replacement keep its order ID and queue position when its price and client order ID stay unchanged.
What you need to do
Clients that assume every admitted batch item has a replacementOrderId must handle AMENDED by continuing to track oldOrderId. To force replacement, use POST /v1/orders/modify with behavior: REPLACE_ONLY.
API clients reconciling an order submission after a lost response can now obtain the existing order’s ID directly from a duplicate rejection when known.
What you need to do
SBE trading WebSocket clients must update to schema version 32; frames using other versions are rejected. REST and protobuf clients can adopt the optional field without changing their existing duplicate-handling flow.
Single and batch order submissions now return ORDER_CREATE_OUTCOME_UNKNOWN (303) when confirmation is lost, telling API clients to check whether orders were accepted before retrying.
What you need to do
Update SBE WebSocket decoders to schema version 30 and handle ORDER_CREATE_OUTCOME_UNKNOWN (303) as an uncertain outcome rather than an automatic retry signal.
REST and Connect clients can distinguish missing confirmations for single orders, batch orders, and triggers from definite submission failures.
What you need to do
Update retry handlers to recognize codes 303/304 and reconcile orders or triggers using their client IDs before submitting replacements; a missing lookup result does not prove creation failed. For batches, repeat the same request ID and payload within 15 minutes, or read back every item; repeating after that window can create orders again.
Integrations still using the previous private order stream must switch to /v1/ws/private to receive order updates.
What you need to do
Move order subscriptions from /connection/websocket to /v1/ws/private using the ORDERS channel and either polyester.v1.json or polyester.v1.proto. Continue requesting the account subscription token with the base private:spot:orders:<account> channel name.
Immediately after a successful create or edit, clients receive the acknowledged trigger configuration or a retryable UNAVAILABLE response while the read catches up.
What you need to do
Update GetTrigger retry handling to retry UNAVAILABLE responses during catch-up rather than relying on retries of NOT_FOUND.
API clients now receive an explicit unknown-outcome response when a cancellation or modification was sent but its confirmation did not arrive in time.
What you need to do
Handle codes 297 and 298 as unknown outcomes rather than confirmed failures. Connect clients receive deadline_exceeded with the structured order error code. Reconcile order state before retrying, or resend the Cancel All After heartbeat.
SBE trading WebSocket rejections now correctly distinguish absent rate-limit information from quota failures.
What you need to do
Devnet and testnet clients using generated SBE codecs should regenerate them from the corrected tradews-v12.xml. Determine rate-limit metadata presence from weight and remaining capacity; a zero retry delay is valid for a quota rejection.
The validation applies when creating or modifying standalone trailing stops and trailing stops attached to buy orders.
What you need to do
If your integration submits max_slippage_bps=10000 for a trailing stop that sells, use a value from 1 through 9999 when creating or modifying it.
Guard Signer management operations now consistently require session authentication. API keys can still read signer status.
What you need to do
If your integration creates Guard Signer wallets using an API key, use an authorized session token instead. API-key status reads require no change.
Trading WebSockets now support batch order creation, replacement, and cancellation. Attached exits now reserve funds, and private order updates move to a sequenced stream with snapshots and cursor-based reconnection.
Edits that would activate a waiting trailing stop or immediately fire an active one now return TRIGGER_WOULD_TRIGGER_IMMEDIATELY and preserve its existing settings.
A trailing stop submitted with an activation price already reached by its watched price now ends FAILED, sends no order, and releases its reserved funds. Equality counts as reached. Changing an active stop’s trailing distance is also refused if the resulting trigger price is already reached. The same checks apply to attached trailing stops on orders with an executable fill. To start trailing immediately, omit the activation price when creating the stop or clear it when editing.
REST clients also receive route-specific quantity and price precision rejections, changing how batch creation and preview responses must be handled.
Exact decimals such as "1.500" for a two-decimal quantity are accepted subject to normal order validation. Excess nonzero digits in base quantities or tick-checked prices produce QTY_STEP_SIZE or PRICE_TICK_SIZE with field violations. Batch creation rejects only the affected item; previews return HTTP 200 with admissible:false and a rejection. Modify and batch-replace requests with overly precise tick-checked prices return HTTP 400 PRICE_TICK_SIZE, with batch replacement still refusing the whole request.
REST order errors now include field-level validation details. Some error codes and REST and ConnectRPC field paths have changed, requiring updates for clients that match those values.
Order API problem responses include an optional violations array with fieldPath, ruleId, and message. REST violations identify REST request fields, including indexed batch items and preview rejections. For POST /v1/orders, quantities with nonzero digits beyond the supported scale now return QTY_STEP_SIZE; limit prices and supported attached-risk prices with nonzero digits beyond their scale return PRICE_TICK_SIZE instead of INVALID_ARGUMENT. ConnectRPC quantity and limit-price violations now identify the actual request fields, and batch-replace attached-risk violations include the item index.
Attached take-profit, stop-loss and trailing-stop exits now reserve the funds they need. Sell orders with attached trailing stops must also specify a maximum buy-back price.
Protection reserves appear in reserved balances and cannot be used by other orders or withdrawals. Buy orders reserve purchased coins as fills settle; sell orders reserve quote funds for their buy-back exits, including any required amount at order creation. Both legs share one reserve, which adjusts as protection changes and releases when it ends. Fill credits enter trading balances after settlement is recorded. A trailing buy-back exit fills only at or below its declared maximum.
Affected REST endpoints now accept only camelCase query parameter names. Clients using snake_case names must update their requests to preserve filtering and pagination.
The changes cover balances and history, transfers, chain analytics and flows, deposit addresses, market overview, QuickSwap reads, address-book reads, rewards, and pagination. API-key and address-book reads now honor subaccountId, and address-book reads honor minimumViewRevision. Spot fee-rate requests for unknown or unavailable symbols return HTTP 400 with UNKNOWN_SYMBOL. Trigger and fee-rate filtering continues to use symbol with the trading pair name.
Trading integrations now receive rejection codes consistent with API errors and distinct cancellation reasons across order reads and authenticated streams.
Rejected orders expose rejectReason using ErrorCode, while canceled orders expose cancelReason using CancelReason. These replace the previous terminal reason fields. REST omits unset reasons and returns names such as POST_ONLY_CROSS and USER_REQUEST. Replacement events identify the ended order with cancellation reason REPLACED. Batch replacement status uses the same public rejection names, and nine additional error codes describe trigger refusals.
WebSocket connections now enforce session, connection, and reconnect-rate limits.
Trade WS rejects connection attempts above API-key or account session limits with HTTP 429 and TOO_MANY_SESSIONS_API_KEY or TOO_MANY_SESSIONS_ACCOUNT. Closing an unused session frees capacity. Realtime and private WebSocket endpoints also apply connection and reconnect-rate limits per client address.
USDT- and USDC-quoted pairs default to a maximum market-order value of 1,000,000 quote units.
Market orders above the configured cap return MAX_NOTIONAL. Buys are valued at their protection price including slippage, while sells use their reference price; fees are excluded. GET /v1/spot/config exposes maxMarketNotionalQuote as a decimal string, omitted when uncapped. This cap does not apply to limit orders.
REST clients must update batch replacement payloads and trailing-stop request fields and response parsing.
POST /v1/orders/replace-batch now accepts newPrice as a decimal price in quote asset units. Trailing stops use trailingDistance as a decimal price delta across order and trigger requests and responses. Requests using the removed newPriceTicks or trailingDistanceTicks names return 400 BAD_REQUEST.
Frequent cancel-all callers gain capacity aligned with their account’s configured cancellation budget, while integrations must handle a changed retry response.
Retries with the same identity and criteria within 120 seconds preserve the original submission status, counts and acceptance timestamp, but return no historical order list and request no additional cancellations. The new listingStatus field distinguishes INCLUDED initial responses from NOT_RETAINED_READ_OPEN_ORDERS retries. Initial responses list up to 200 orders; use order updates for final outcomes and open-order reads for current state.
Canceling an exit order created by an attached take-profit or stop now cancels that leg instead of allowing it to fire again. With OCO enabled, both attached legs end.
This applies to individual cancellation, cancel-all and cancel-all-after. With OCO disabled, the other leg continues protecting the remaining position. Changing only OCO preserves existing leg IDs, arming and trailing-stop tracking. Editing, pausing or resuming attached legs while an exit is working now returns ATTACHED_EXIT_WORKING (292) as HTTP 400 / FailedPrecondition instead of HTTP 503 / Unavailable; removing a leg remains allowed.
If a market stops responding, new orders for it are now refused within about a second with a retryable "market busy" error, and no funds are held for them. Orders already submitted complete when the market recovers, and other markets are unaffected.
Clients can opt into market-specific resync notifications to keep their private trading connection open while other markets continue streaming. SBE integrations must update to schema 28.
Enable marketResync alongside orders or executions in Subscribe to receive MarketResync messages identifying the affected symbol and recovery reason. Reconcile that market’s orders and executions through the Orders API before applying subsequent events, which may repeat reconciled state. Notifications precede resumed events and may arrive even for markets the account does not trade. Without the opt-in, private-event sessions receive a WebSocket 1012 close when a market requires resynchronization. A single market’s interruption no longer blocks new connections while the service is starting up.
Market makers refreshing quotes frequently avoid replacement rejections caused by completed modifications consuming their outstanding-request allowance.
Batch replacement admission results can now be replayed for 60 seconds from acceptance, reduced from 120 seconds. Individual modification request IDs remain reserved while pending and for 60 seconds after the answer; identical retries replay that answer, while changed contents conflict.
Order-stream integrations now receive account snapshots and sequenced updates in JSON or protobuf, with cursor-based reconnection and explicit readiness signals.
The previous private order and batch-replace channels are retired. The replacement stream provides complete order records, including attached risk, and sends a fresh snapshot when a reconnect cursor cannot resume. Batch-replace progress is available through GetBatchReplaceStatus and individual order updates.
Trading APIs return more specific rejection codes and clearer WebSocket error messages. Trigger cancellation error handling requires a client update.
Trigger cancellation refusals now return TRIGGER_STATUS_INVALID (45) or TRIGGER_NOT_MODIFIABLE (46), replacing TRIGGER_CANCEL_REJECTED (44). Cancel-all and cancel-all-after distinguish venue rate limiting (429 SYSTEM_RATE_LIMITED) from invalid server replies (500 INTERNAL_ERROR). Trigger REST precondition failures and duplicate conflicts return 400 and 409 respectively, replacing 502. Additional codes identify order validation, capacity, market availability and trigger failures.
Adds batch order creation, replacement, and cancellation over protobuf and SBE. SBE clients must upgrade to schema version 19.
Submit up to 20 creates or 50 replacements or cancellations per batch, with results returned in request order. Replacements must target one trading pair. Busy responses or missing acknowledgements may follow partial execution; retry with the same request identity and unchanged items.
Order creation and replacement failures involving a zero order identifier now report a specific client error instead of a generic server error.
Single-order failures return HTTP 400 over REST or invalid_argument over ConnectRPC, while batch results identify the rejected item. Binary trading WebSocket clients must use SBE schema version 16, which adds INVALID_ORDER_ID as rejection code 80.
Order API and WebSocket clients receive specific rejection codes for pair limits and replacements at or below the filled quantity.
Rejections distinguish MAX_QTY, MAX_NOTIONAL and QTY_AT_OR_BELOW_FILLED. Order reads and realtime updates also identify orders ended by a quantity change at or below the filled amount. Busy-pair rejections tell clients to retry shortly.
Open-order policy limit rejections now return HTTP 400 instead of 429. Trading WebSocket errors more accurately identify invalid quantities and prices.
POLICY_MAX_OPEN_ORDERS now uses invalid_argument in ConnectRPC. Invalid-sizing WebSocket rejections use BAD_QTY, and SBE responses preserve BAD_QTY and BAD_PRICE. The public order error contract also defines MAX_QTY and MAX_NOTIONAL separately from the subaccount policy notional limit; their availability is not established by this change.
Market trades, account trades, ledger transfers, and trigger events now use ordered event batches to reduce realtime backlog under trading load.
JSON publications use {"events":[...]} even for a single event. Protobuf publications use the corresponding batch message. Transfer updates and transfer history also expose a stable transferId for matching and updating transfer legs.
API clients retrying a trigger create after INTERNAL_ERROR may now receive CONFLICT_DUPLICATE_CLIENT_TRIGGER_ID (code 47), even for an identical request.
After a failed create, list triggers and reconcile using the client trigger ID before submitting a replacement with a new ID. Identical retries of an accepted create continue to return the same trigger.
Each account can hold up to 100 pending or active triggers per market, including at most 15 TWAP orders and five ladder orders.
Attached take-profit, stop-loss and trailing legs count toward the total. Requests exceeding a limit are rejected with a specific limit error; capacity becomes available when an existing trigger ends. An order whose attached protective legs would exceed the total is rejected in full.
The limits apply even without an account policy, with defaults of 1,000 resting orders per account and 200 per market.
GTC and GTD orders count toward the caps; IOC, FOK and market orders do not. Account policies can lower the limits. Replacing an order preserves its place, and ending an order frees capacity. Orders exceeding a cap are rejected with MAX_OPEN_ORDERS_TOTAL or the new MAX_OPEN_ORDERS_PER_PAIR error (306). Each ladder level counts, and limit TWAP slices are also subject to the caps.
API clients can choose the last traded price or the market’s index independently for each attached take-profit, stop-loss, or trailing stop.
Set trigger_price_source to INDEX_PRICE to use the market’s index; omitted values continue to use the last traded price. Order reads and history include the selected source when returning the attached policy. Changing the source replaces that attached stop. On markets without an index, a new order requesting index-based protection is rejected before any fill; adding it through a modify cancels the existing order, and earlier fills remain valid. Mark price is unsupported.
API clients can select index pricing for standalone stop-loss, take-profit and trailing-stop orders while last-trade pricing remains the default.
Trailing stops use the selected price for activation, tracking and triggering. Index-based stops remain armed while the index is stale or unavailable; creating one on a market without an index fails with an index-price-unavailable reason. Trigger reads and realtime updates report the selected source. Changing the source requires cancelling and recreating the trigger.
Market-data clients can recover trades missed during a live-stream interruption in oldest-first order, including across restarts.
GET /v1/spot/markets/{symbol}/trades accepts afterTradeId, with after_trade_id available through GetTrades. Responses include a completeness boundary, a continuation cursor and trade-ID epoch endings. Continue with nextAfterTradeId; if it matches the requested cursor, retry later with backoff. This mode cannot be combined with time, side or page-token filters.
Standalone stop-loss and take-profit triggers now also accept buy market orders, with funds reserved when the trigger is created.
Set a market child's slippage cap in basis points or absolute price units, update or clear it while the trigger is live, and retrieve it through trigger Get/List responses. Omitting or clearing the cap uses the trading pair's default market slippage. Buy triggers reserve funds for their maximum purchase price plus fees; changing the trigger price or cap adjusts that reservation. Price gaps can result in partial or no execution. This change covers standalone triggers.
Market-data API clients can request these intervals for historical candles and subscribe to matching live updates.
The new intervals support spot and reference candle history, plus optional inclusion of the current open candle. Live candle updates are available in JSON and Protobuf. All buckets use UTC; 8h candles start at 00:00, 08:00 and 16:00, while 3d candles follow three-day boundaries counted from January 1, 1970.
QuickSwap TWAP swaps on trading routes now execute as a series of protected orders spread over the requested duration; bridge routes remain market-only. Missed slots are skipped rather than sent late, and anything left untraded at the deadline is returned or refunded with a clear reason. TWAP quotes require a minimum deposit large enough for every slice to be a valid order.
Traders can track the lowest trade price after activation and buy when the price rises by their chosen trailing distance.
Buy trailing stops require a maximum purchase price and submit an immediate-or-cancel limit order when triggered. An optional slippage cap can lower that limit further. Funds are reserved upfront, including applicable fees, and any reservation the submitted order does not need is released immediately. If prices jump above the maximum, the stop still triggers but cannot fill above it. The maximum is fixed when created and appears in trigger reads and realtime updates.
Adds authenticated API support to quote, execute, and track asset conversions on supported direct spot pairs using Trading balances.
Quotes show estimated output, minimum output, price impact, and the account’s applicable taker fee, with no additional Swap fee. Quotes expire after 30 seconds and reserve no liquidity; confirmation checks current prices against the accepted minimum. Repeated confirmations with the same terms and idempotency key return the same Swap. Status responses show settled amounts, fees, and completed, partial, or failed outcomes. API-key and subaccount policies must grant SWAP permission.
Open your VIP badge in the account dashboard or desktop wallet menu to see your tier, fee rates, and progress toward the next tier.
The new popover shows your tier’s maker and taker rates alongside progress for 30-day trading volume and average portfolio value. Preview the next tier’s rates and open the full fee schedule. Overall VIP progress now reflects whichever metric is closest to its target.
Repeating a cancel after an order has ended now returns ORDER_ALREADY_TERMINAL instead of another ACCEPTED response.
This applies to REST and ConnectRPC. Repeats while cancellation is still in progress remain ACCEPTED. Cancels naming the wrong market return ORDER_UNKNOWN when the market can still be verified; older ended orders may return ORDER_ALREADY_TERMINAL. Every cancel retry counts against the cancel rate limit. Cancelling by client order ID more than a minute after the order ends may return ORDER_UNKNOWN.
Fixed average execution prices being rounded down to a whole price tick, improving accuracy for orders filled across multiple price levels.
REST avgPx now returns up to 18 decimal places, rounded half to even, across open orders, order history and single-order reads. ConnectRPC and private WebSocket orders include avg_price_e18, scaled by 10^18; avg_price_ticks retains its existing precision. With no fills, REST returns "0" and avg_price_e18 is unset.
Ledger reads now return specific errors for invalid subaccount selectors, and private trade WebSocket messages consistently include the fee rebate indicator.
Balance, balance-history, equity-history and transfer reads reject zero subaccount selectors with INVALID_SUBACCOUNT_ID. REST also returns this code for malformed selectors, with HTTP 400; Connect returns invalid_argument with structured error details. Private spot-trade WebSocket JSON always includes feeIsRebate, including false when no rebate applies. REST transfer pagination now binds continuation tokens to the selected subaccount.
Traders reducing an order’s total quantity through batch replacement keep its order ID and queue position when its price and client order ID stay unchanged.
POST /v1/orders/replace-batch, Connect BatchReplaceOrders and trading WebSocket batch replacement now amend eligible orders in place. Leaving the price unset or resending the current price allows an amend when total quantity does not increase and the client order ID stays unchanged. These items return actionTaken: AMENDED with oldOrderId and no replacementOrderId. A different price, larger total quantity or different client order ID still produces REPLACED with a successor order ID.
API clients reconciling an order submission after a lost response can now obtain the existing order’s ID directly from a duplicate rejection when known.
Single and batch create rejections expose optional existingOrderId in REST and existing_order_id in typed Connect and protobuf WebSocket errors, with equivalent SBE WebSocket fields. HTTP 409 and Connect AlreadyExists remain unchanged. Use GetOrder to check the existing order’s current state; the field may be absent for duplicates detected within the same batch before an order is assigned.
Single and batch order submissions now return ORDER_CREATE_OUTCOME_UNKNOWN (303) when confirmation is lost, telling API clients to check whether orders were accepted before retrying.
For a single order, reconcile using its client order ID or open orders before resubmitting. For a batch, check every item or resend the same correlationId and identical items within 15 minutes to recover results without duplicate admission. A batch-level UNAVAILABLE response can still follow accepted items and must also be reconciled.
REST and Connect clients can distinguish missing confirmations for single orders, batch orders, and triggers from definite submission failures.
A submitted request whose confirmation is lost or late returns HTTP 504 / Connect deadline_exceeded with ORDER_CREATE_OUTCOME_UNKNOWN (303) or TRIGGER_CREATE_OUTCOME_UNKNOWN (304), indicating that creation may have succeeded. An uncertain batch returns no per-item results.
Integrations still using the previous private order stream must switch to /v1/ws/private to receive order updates.
Subscriptions to retired private order channels now return permanent bad-request error code 107 instead of succeeding without delivering updates, including protobuf and batch-replace variants.
Immediately after a successful create or edit, clients receive the acknowledged trigger configuration or a retryable UNAVAILABLE response while the read catches up.
Applies to standalone triggers and attached take-profit, stop-loss and trailing-stop legs, including configuration changes, pauses and cancellations. Fill quantities and other market-driven updates can still lag briefly.
API clients now receive an explicit unknown-outcome response when a cancellation or modification was sent but its confirmation did not arrive in time.
These responses use HTTP 504 with ORDER_CANCEL_OUTCOME_UNKNOWN (297) or ORDER_MODIFY_OUTCOME_UNKNOWN (298), indicating that the change may still apply. This covers single and batch requests, Cancel All, and Cancel All After. Unknown batch outcomes include no per-order results; read every affected order before retrying. For Cancel All, read open orders; for Cancel All After, resend the heartbeat.
SBE trading WebSocket rejections now correctly distinguish absent rate-limit information from quota failures.
For rejections unrelated to rate limits, weight, retry delay, policy version, and rate-limit classification fields now carry their documented zero values. This prevents absent retry information from appearing as an enormous delay. Quota failures retain their rate-limit metadata even when the retry delay is zero. The public schema remains version 12 with the same message layout.
The validation applies when creating or modifying standalone trailing stops and trailing stops attached to buy orders.
Requests setting a selling trailing stop’s maximum slippage to 100% now return ERROR_CODE_MAX_SLIPPAGE_INVALID. Positive caps up to 99.99% remain accepted, while attached trailing stops that buy still permit 100%. Rejected modifications leave the existing stop unchanged.
Traders can now see the applicable exit slippage in Confirm Order and Trigger Details for attached market take-profit and stop-loss orders.
Each market exit shows Max Slippage labelled “(market default)”, using the trading pair’s default for the exit’s buy or sell side. Trigger Details preserves explicitly configured slippage values, and limit exits remain unchanged.
Traders using Fix for a missing amount on market or limit orders now receive an amount that meets the form’s minimum order value.
The suggested amount accounts for the order price, market-sell slippage protection, and applicable fees when buying with a quote-currency budget. Market amount fields also use the corrected minimum when leaving a zero value. Insufficient-balance checks still apply.
Traders with fee discounts can more clearly distinguish their effective maker and taker rates from their VIP tier rates.
In the order form’s Fees row, the lightning icon sits directly beside the discounted rates, and the VIP badge sits beside the crossed-out base rates.
Trading-hours traits are also hidden when trades exist but their hourly breakdown is missing.
Checkpoint recaps omit unsupported trading and portfolio traits, hide activity figures when there is nothing to report, and center no-data labels within empty charts. Headline punctuation stays attached to the preceding word.
When a trailing stop has no distance, entering a slippage cap or buy-back limit no longer makes it appear in the order review.
Confirm Order now omits attached take-profit and stop-loss orders without a positive trigger price, and trailing stops without a positive distance, matching what will actually be placed.
Stop Loss Buy and Take Profit Sell now show one validation message when traders enter a trigger price of zero in market or limit orders.
The trigger field shows only “Trigger price must be greater than 0.” and its Fix action, removing the extra market-direction error. Positive trigger prices still receive the applicable market-direction validation.
One trader's rejected take-profit or stop-loss exit no longer unexpectedly interrupts other users' orders on the same market.
This fixes a rare case where a quantity-step increase leaves a completed parent order with no tradable quantity while its protective exit is pending. If that exit is rejected, the affected protective orders end with a quantity-step failure and release their reserved balance.
This fixes a rare interruption affecting traders on a pair when an attached take-profit or stop-loss is refused after the remaining position becomes too small to trade.
The refused attempt is recorded before the affected protective orders end with a quantity-step failure, leaving the remaining balance available.
REST and ConnectRPC clients now receive specific price-increment errors even when a trigger modification omits the optional symbol.
PUT /v1/triggers/{triggerId} returns PRICE_TICK_SIZE with a tick_size violation identifying triggerPrice or activationPrice when that price does not align with the trading pair’s increment, leaving the trigger unchanged. REST trigger error explanations also use REST field names and decimal price units.
Edits to stop-loss, take-profit and trailing-stop triggers now reject resulting orders that fail the pair’s minimum rules, preserving the existing trigger and reserved funds.
Validation checks the pair’s current minimum quantity, quantity step and minimum order value. Changing an order’s quantity also checks any attached protective orders it retains. Rejected trigger edits return MIN_QTY, QTY_STEP_SIZE or MIN_NOTIONAL through PUT /v1/triggers/{trigger_id} and ModifyTrigger, with a message confirming that nothing changed.
This affects order, withdrawal and internal-transfer requests while newly granted permissions are still taking effect.
Permission checks now isolate concurrent traffic by API key, preventing one key from blocking other keys’ checks. Requests may still require retries while permission updates take effect or during overall overload.
A rare take-profit and stop-loss handoff now finishes without interrupting account trading when the remaining position falls below the quantity increment.
Both protective orders finish and release their reserved funds when the exit is canceled during this handoff, leaving the remaining quantity available in the balance.
This applies when an entry order’s final fill settles while its protective exit is pending or working, leaving a remainder below that exit’s market minimums.
Once the exit fills its full original quantity, the triggered take-profit, stop-loss or trailing stop completes and its OCO sibling is cancelled. The trigger no longer attempts another exit for the dust, fails, and leaves its sibling running. Exits reduced by amendment or ended before filling completely retain their existing behavior.
Trading clients receive a retryable error when an API-key or subaccount permission update is still taking effect.
Affected order requests now return Unavailable instead of a final permission denial after trading permissions have been granted. Clients can retry while the update takes effect; requests refused during that interval are not executed.
After an order finishes and its fills settle, attached exits below the applicable trading minimums now end immediately when no exit is pending or working.
If no exit has run, an affected trigger shows Failed with a minimum quantity or minimum order value reason; another attached trigger that meets its minimums stays active. If an earlier exit has finished and the remainder is below its minimums, its trigger completes and the paired trigger is cancelled.
API clients can now retrieve the configured maximum buy-back price for a sell order’s attached trailing stop in order details, open orders, and order history.
GET /v1/spot/orders/{order_id}, GET /v1/orders/open, and GET /v1/orders/history return the optional attachedRisk.trailingStop.policy.limitPrice as a decimal price. The field is omitted for trailing stops attached to buy orders.
Attached take-profit and stop-loss triggers re-arm for the remaining quantity when the exchange cancels their working exit during account recovery.
Unfilled ladders whose levels are canceled solely during account recovery now finish as Completed with zero execution and no user-cancellation reason. Attached exits can fire again on a later qualifying price update. Manual cancellations and the dead man’s switch retain their existing behavior.
Previously accepted trailing stops and TWAP orders can resume after a restart even when newer creation rules reject their original settings.
Trailing stops retain their saved terms, and TWAP orders retain their planned slice counts when restored after creation rules tighten.
Traders paying spot buy fees in the quote currency can size orders using their account’s effective fees once those rates load.
Balance checks and maximum order sizing now account for market-specific fee discounts, including when editing orders. Post-only buys reserve maker fees, while other buys reserve the higher of maker and taker fees. Standard rates apply until account rates load.
Under Expire Taker self-trade prevention, attached take-profit, stop-loss and trailing-stop orders wait while another of your orders remains first in line at the best price.
New trades and index-price updates no longer generate repeated cancelled exit orders while the blocker remains. Once it clears or loses its place, the exit fires once if its trigger condition still holds, without requiring a fresh price crossing.
Traders can submit market and immediate-or-cancel limit buys with attached protection when specifying how much of the quote asset to spend.
Take-profit, stop-loss and trailing-stop protection follows the quantity actually bought as fills settle, including partial fills, subject to trading minimums and quantity steps.
Developers can identify the invalid request field or rejected ladder order when a trigger request is refused.
Error responses now include available field violations with fieldPath, ruleId, and message. Paths use REST request field names, and rejected ladder orders include a zero-based order index.
Triggers refused by a halted market now explain their failure even when the create request already returned success.
Trigger details, lists, event history and authenticated WebSocket updates now report the existing MARKET_HALTED failure reason instead of an unknown or blank value.
For newly created spot pairs, GET /v1/spot/config now suggests order-book grouping sizes matched to each pair’s minimum price increment.
Suggested grouping sizes start at the pair’s tick size and increase tenfold across five options, supporting low-priced pairs without a fixed 0.01 minimum. Existing pairs retain their current settings.
New price instruments no longer inherit historical prices from a removed instrument.
Re-adding the same instrument preserves its own price history, keeping historical prices associated with the correct asset.
REST open-order and order-history responses now omit submittedMaxQuoteDebit when the order was not sized by a quote amount.
Previously, these lists returned "0" for an unsubmitted quote budget, which could cause clients to misidentify quantity-sized orders as quote-sized. Submitted quote budgets continue to appear with their original values.
Fixed a rare issue that could leave trade settlement processing blocked indefinitely during recovery.
Stalled settlement operations now time out, allowing processing to restart from confirmed progress.
Order reads now expose the quote amount used by fills and recorded fee totals, helping clients calculate how much of a quote-sized buy remains unspent.
REST orders include cumQuote, with the equivalent cum_notional field in ConnectRPC and private order updates. Order history and single-order reads with execution history also include feeTotal, net of rebates. Fee totals may briefly trail fills; compare feeTotal.qty with cumQty before treating them as complete. Open-order reads, state-only single-order reads and private updates omit fee totals. For quote-sized buys, clients add quote-denominated fees to cumQuote, subtract net rebates, or use cumQuote alone when fees are paid in base.
Unused reserves from filled, cancelled or expired orders are released sooner, reducing temporary insufficient-funds rejections when placing the next order.
Buy orders release unused reserves from better execution prices and unused slippage allowances when they end. Partially filled orders that are cancelled or expire release reserves for their unfilled remainder. Excess fee reserves are released as fills settle.
Fixed attached take-profit and stop-loss quantities when a market order fills at multiple prices and its take-profit fires before all fills settle.
Active attached legs now reflect the remaining settled position even while an exit order is working. Later-settling fills can receive an additional exit after the earlier exit ends, provided the trigger condition still holds. A leg’s displayed quantity can therefore exceed its current exit order’s quantity.
Fixed a settlement issue that could eventually interrupt trading after prolonged activity.
Improves trading continuity by preventing settlement bookkeeping from accumulating unnecessarily as trades complete.
Fixed missing timestamps in REST order book responses when a book is still being built or has been invalidated.
GET /v1/orderbook/{symbol} now includes ts: 0 when the snapshot timestamp is unavailable, keeping responses consistent with the published schema and preventing parsing failures in generated clients. The API reference clarifies that ts is zero while available is false.
Ladders now report Canceled with a User Request reason when their orders are canceled by the user before any quantity fills, instead of reporting Completed.
The status updates once all planned levels have ended. This includes individual cancellations, cancel-all, and the user’s dead man’s switch. Trigger history and realtime updates include the cancellation reason. Ladders with any filled quantity still report Completed once their remaining levels end.
Trigger history and realtime updates now explain refused attempts that leave a trigger active.
A new FIRE_REFUSED event includes the attempt sequence, refusal reason, and firing price when available. It covers attached take-profit, stop-loss, and trailing-stop attempts waiting on market conditions or minimum order requirements, plus trigger attempts awaiting retry after rate limits or account repair. The trigger remains armed or running; refusals that end it continue to appear as FAILED. These events are available through REST, ConnectRPC, and WebSocket trigger updates.
Buys sized by a quote amount now report Filled when their remaining budget cannot buy another quantity step, instead of reporting Canceled.
Applies to market and limit immediate-or-cancel buys. A spent-budget buy finishes with no cancel reason. Orders stopped by insufficient liquidity, price protection or the maximum order quantity while budget remains available for another whole step retain their canceled outcome and executed fills.
Markets with less than 24 hours of trading history now measure price changes from their first trade instead of incorrectly reporting zero.
Market overview responses and live updates use a reference price with minute-level granularity. For markets that began trading within the last 24 hours, the reference is their first trade. Change remains zero before any trades occur and until the first minute of trading has closed.
Attached trailing-stop validation now identifies maximum-price mistakes with specific error codes and field details.
Order creation, previews, and batch creation now report BAD_PRICE when a maximum is supplied on a BUY parent or falls below activation, TRIGGER_BUY_REQUIRES_LIMIT when missing on a SELL parent, and PRICE_TICK_SIZE when misaligned with the market’s tick size. Modify and batch-replace requests include field details for tick-size and activation-price errors; side-related errors return BAD_PRICE without field details.
ConnectRPC, gRPC and gRPC-web clients can now distinguish authentication failure reasons on order, trigger and ledger read APIs.
Authentication errors now include a readable message and a typed auth.v1.AuthErrorDetail identifying issues such as an invalid signature, clock skew, missing headers, expired or disabled API keys, or an IP restriction. Browser gRPC-web clients can also read these details. Requests without credentials retain AUTH_AUTHENTICATION_REQUIRED. REST authentication responses remain unchanged.
Market halts now produce clear order and trigger cancellations. This release also fixes misleading order-history entries, stale trigger reads, and funding for attached exit protection.
Open orders and triggers, including attached take-profit and stop-loss legs, now end with MARKET_HALTED when their market halts; earlier fills remain valid. Orders submitted after a halt receive a visible rejection. Refused order modifications leave the original order unchanged without adding a phantom rejected order to history, and batch status reports each item's refusal reason. After an acknowledged trigger modification, pause or resume, reads return the updated state or a retryable unavailable response while catching up. Attached exit protection correctly reserves settlement proceeds, including fractional amounts left after fees. VIP qualification no longer remains blocked for 30 days by missing price history immediately after an environment reset.
A previously selected Good Til Date expiry no longer blocks limit orders after switching to Good Til Canceled, Immediate Or Cancel, or Fill Or Kill.
The selected expiry is preserved when switching away from Good Til Date and validated again when switching back. An invalid expiry still blocks Good Til Date orders.
Trigger creation now rejects orders that fail supported trading-pair minimum checks before arming them or reserving funds.
Stop-loss, take-profit and trailing-stop requests check quantity and quantity increments, plus minimum order value where it can be determined. TWAP validation checks slice size rather than total size. Orders with attached protective legs receive equivalent checks during creation, preview and updates that install legs. Rejections explain the quantity, increment or value issue. Sell trailing stops check quantity only; market TWAP value checks wait until execution when no usable quote is available.
Clearing a trading pair’s listing or delisting schedule now correctly updates eligibility for new orders and triggers.
Cancelling a scheduled delisting or removing a future listing time no longer causes otherwise eligible orders and triggers to be rejected using the old schedule.
Buys entered as a quote amount, such as USDT, now use your account’s applicable fee rate when fees are paid in that same asset.
Accounts with lower trading fees can spend closer to their entered amount instead of leaving extra funds unspent. Total spending, including fees, remains capped at that amount, subject to available liquidity, price protection and order limits.
Fixed a rare case where reading a standalone trigger immediately after modifying, pausing, or resuming it could return its previous configuration or status.
GetTrigger now returns state reflecting the acknowledged change, or a retryable UNAVAILABLE response while the update becomes readable.
Buy and Sell buttons now reflect the current price range, and excessive level counts show an explanation even while Levels has focus.
Leaving Max Price, choosing a percentage preset, or adjusting the range on the chart now refreshes the price-range error. Correcting the range clears stale errors, while equal or reversed prices disable submission. Level counts that exceed the range show the error and Fix option without requiring you to leave Levels; empty values and 1 still defer new error messages until focus leaves.
Fixed missing order outcomes and account reads that could remain unavailable after a market halted.
Orders admitted but subsequently refused by a halted market now appear as REJECTED with MARKET_HALTED in order history and the private feed. Existing working orders, attached legs, and active triggers show their canceled outcomes. Affected accounts can resume reading orders across other markets, including after a restart.
External reference pricing stops refreshing a market’s last quote when incoming updates cannot be processed.
Affected quotes resume after valid data arrives from Kraken, Binance, Binance.US, OKX, Bybit, Bitstamp or Gemini. When the affected market can be identified, other markets continue updating. Otherwise, the feed reconnects to recover.
The trading WebSocket SBE reference now explains when BatchReplaceOrders amends an order in place or replaces it with a new order.
Amendments that keep the price and client order ID without increasing total quantity retain the order ID and queue priority. Replacements receive a new order ID and reset queue priority. Reducing total quantity to or below the filled quantity ends the order without a successor. This corrects documentation of existing behavior; trading behavior and message formats are unchanged.
Fixed an issue where initial price-history gaps after an environment reset could block portfolio-based VIP tier updates for up to 30 days.
Hours before price history begins no longer block VIP qualification. The fixed 30-day averaging period and safeguards for subsequent price gaps remain unchanged.
Refused order modifications no longer create extra rejected orders in history. Batch status now reports each item's rejection reason.
When a modification is refused, such as a post-only price change that would cross, the original order remains unchanged and no replacement order appears in history. GetBatchReplaceStatus reports items rejected after admission as REJECTED with the refusal code, no action taken, and replacement_order_id set to 0. Admission counts and replayed admission responses remain unchanged.
Trigger records now distinguish cancellations caused by a halted market.
Active stop-loss, take-profit, trailing-stop, TWAP and ladder triggers, including attached legs, receive a market-halted cancellation reason and completion time. Parent order records also reflect canceled attached legs while preserving previously completed order outcomes and fills.
Open orders on a halted market now appear as canceled with the MARKET_HALTED reason, while retaining earlier fills.
Order history records cancellations at the market’s halt timestamp and preserves them across recovery. Trade WebSocket sessions receive a market resync notification, or reconnect through the existing resync flow, to refresh order state.
Fixed reserve calculations for attached take-profit, stop-loss, and trailing-stop orders as fills settle and orders change.
Reserves now include fractional amounts remaining after fees paid in the purchased asset. Order changes also account correctly for funds already reserved for an exit replacement, avoiding incorrect insufficient-funds rejections while requiring enough funds for increased protection.
When a Coinbase update cannot be processed, the affected market’s Coinbase quotes pause until a fresh order-book snapshot is accepted.
This prevents subsequent quotes from being calculated from an incomplete Coinbase order book and repeatedly refreshed as current index-price inputs.
Fixed heatmaps that could show identical bid and ask prices when the actual order book had a spread.
Newly generated heatmap data keeps bid and ask bands separate when the best bid is below the best ask. Best bid, best ask and midpoint values now reflect actual order prices. Heatmap resolution and API response fields remain unchanged.
Swap and QuickSwap buy legs now spend up to their budget at available prices while respecting price protection and market limits.
Better prices can deliver more destination assets instead of leaving the slippage allowance unspent. Buy quotes reflect current order-book depth, fees and quantity steps, and maximum amounts account for market order-size limits. Small rounding remainders may remain; liquidity and price limits can prevent the full amount from trading.
When an open order is partly filled, an exit refusal caused by trading minimums now preserves its attached protection for later fills.
Attached stop-loss, take-profit and trailing stops remain Running after an exit is refused for minimum quantity, minimum value or quantity-step requirements. Price updates do not repeatedly retry the same refused quantity. Later fills resize the protection, allowing the next qualifying price update to trigger another exit attempt. If the original order ends with the same refused quantity remaining, the affected protection fails once with the refusal reason.
Fixed attached take-profit, stop-loss and trailing exit quantities being understated when a buy fills in multiple parts with fees paid in the purchased asset.
Exit sizing now accounts for fractional amounts across fills before rounding down to the market’s permitted quantity step. This prevents repeated rounding losses from leaving additional inventory outside attached protection, including after an order replacement.
Buy and sell ladders on LTC-USDT and DOGE-USDT now handle totals that do not divide evenly across levels while preserving the requested quantity.
Each level rounds down to the pair’s quantity increment, and the final level receives the remainder. For example, 0.4 LTC across three levels becomes 0.133333, 0.133333 and 0.133334 LTC. Each level must still meet the pair’s order requirements.
Fixed a case that could delay trade settlement when requests were retried during a processing backlog.
A retry arriving while the original settlement is still completing can now share its outcome, avoiding an unnecessary capacity-related delay.
Clients consuming order events receive the corrected sequence in both JSON and Protobuf when an order executes immediately.
Acceptance now carries a lower version than subsequent fills. Partially filled immediate-or-cancel orders report ACCEPTED, then their FILLED events, then CANCELED for the remaining quantity.
Fixed index-price gaps caused by normal differences in external venues’ price increments.
Index prices now account for each venue’s minimum price increment when evaluating spreads and price differences. This helps keep prices available for low-priced assets when qualifying quotes previously exceeded percentage-based limits. Limits on wide spreads and off-market prices remain in place.
When cancelling many TP/SL orders, temporary rate limits now trigger automatic retries before a failure is reported.
After a partial cancellation, the dialog’s total and per-pair counts show only orders eligible for retry. If rate limits persist, the error message asks you to wait and try again.
Fixed understated USD portfolio values when asset prices are converted through an intermediate currency.
Portfolio calculations used for VIP qualification now retain conversion precision, improving accuracy for low-priced assets. Prices below the supported precision are treated as unavailable for valuation without reusing the previous hour’s portfolio value.
For pairs with very small price increments, grouping controls display values such as 0.000000001 consistently across desktop and mobile.
The selected grouping displays as a plain decimal and matches the corresponding option in the dropdown, context menu, and mobile settings.
Requests made immediately after creating or attaching a subaccount policy now distinguish temporary syncing delays from permission refusals.
Affected reads, transfers, withdrawals and subscription requests can wait up to two seconds before returning a retryable unavailable error. Order submissions return UNAVAILABLE immediately while the policy is syncing, and trading WebSocket sessions stay open. Retry unavailable responses with backoff.
Cancelling ladder, TWAP or attached exit orders now completes when another order’s good-till-date deadline has just passed.
Orders due to expire are closed before the strategy’s remaining orders are cancelled, preventing this timing condition from halting the market. The fix also covers OCO switches that cancel a resting exit order.
Fixed an issue that could cause unnecessary settlement delays when a settlement request was retried while still processing.
Retried requests now use the original settlement’s outcome, avoiding additional retries when that settlement has already succeeded.
Swap and QuickSwap minimum amounts now account for order size requirements at the protection price. Signed-in Swap buy quotes also show more accurate expected output and fees.
Amounts below the calculated minimum are rejected before a Swap is created, preventing size-related failures after confirmation. For signed-in buys, expected output reflects the quantity the order buys at its price limit after fees. At better prices, that quantity costs less and the unspent source amount stays in the account. Quotes remain estimates and reserve no liquidity.
Traders and API clients can see when attached take-profit, stop-loss, or trailing-stop protection first becomes live through trigger history and WebSocket updates.
Each attached leg records one ARMED event when it first starts protecting the parent order’s filled quantity, including when protection is attached after a fill. Protection paused before the fill records ARMED upon resume. Later fills and subsequent pauses or resumes do not repeat the event. Attached trailing stops continue to report ACTIVATED when tracking begins.
Clients resuming or modifying a trigger can now distinguish a different listed trading pair from a symbol that is not listed.
REST and Connect return TRIGGER_SYMBOL_MISMATCH for a different listed pair and UNKNOWN_SYMBOL for an unlisted pair. Both cases return HTTP 400, with invalid_argument on Connect, and leave the trigger unchanged.
Clients requesting attached take-profit, stop-loss, or trailing-stop state receive the same arming time as the corresponding trigger.
Attached protection no longer reports a later arming timestamp in the parent order than in trigger details. For attached trailing stops, the parent order also reflects the updated arming time when the activation price is reached.
A rejected level no longer makes the whole ladder fail when other levels have traded and all level orders have ended.
The ladder remains Running while any level order is open. Completed does not mean fully filled: executed quantity, executed levels and individual order statuses show what traded. When every level is rejected before placement, the ladder ends as Failed with the first rejection reason.
GetTrigger and ListTriggers can now return terminal trigger states when those reads require historical data.
Fixes history-backed reads for stop-loss, take-profit, trailing-stop, TWAP and ladder triggers, including their recorded status and version.
Standalone and attached stop-loss and take-profit market orders can execute through price gaps within their applicable slippage limits.
Slippage limits are measured from the firing price, using the requested cap or the market’s default. Buy orders also retain their reserved spending maximum. Orders may fill partially or remain unfilled beyond these limits; attached protection re-arms for the remaining quantity. Generated market orders no longer carry a client reference price, while trigger events retain the firing price.
Order REST responses now omit inapplicable enum fields instead of returning UNSPECIFIED, matching the public API schema.
Direct orders omit origin.triggerType in order details, open orders, and order history. Cancel-all-after omits effectiveScope.side when covering both buy and sell orders. Rejected batch-replacement items omit actionTaken. Order API errors also correctly identify internal failures and spot-read policy denials.
Fixed stale trigger lists immediately after acknowledged trigger and order updates.
Trigger lists now check that active triggers reflect acknowledged creates, modifications, pauses and attached-trigger changes. When updates are still catching up, the API returns a retryable UNAVAILABLE response instead of outdated trigger settings or parent-order associations.
Certain permanent internal-transfer failures now return a precondition error instead of temporary service unavailability.
Affected requests are recorded as refused rather than left pending for retry, giving API clients a definitive failure response.
Traders can see attached protection change after an order fills, including pauses, resumes and failures.
Historical order reads that include attached protection now reflect its status changes instead of leaving take-profit and stop-loss at Created until the final outcome.
Traders can still update trigger prices for take-profit and stop-loss orders attached to a parent order.
The Edit Trigger dialog no longer offers a slippage cap for attached market take-profit and stop-loss orders, preventing unsupported cap changes from being submitted. Standalone market triggers and trailing stops retain slippage editing. Unsupported order changes now display “This change isn't supported for this order.”
Traders can confirm quantity increases when their available balance covers the additional funds needed beyond the order’s existing reservation.
Modify Order now checks only the additional reservation needed for a change. MAX and the amount slider also account for funds already reserved by the order and quantities already filled, preventing them from sizing edits using free balance alone. Increases exceeding the available funds remain blocked.
This affects index-price stop-loss and take-profit orders attached to an entry order when market restrictions prevent execution.
Repeated price updates no longer resend an unchanged running status while the same restriction blocks execution. Attached protective orders remain armed and can trigger on the first qualifying price update after trading resumes.
Fixed avoidable delays in order acknowledgements after periods of low trading activity.
Orders submitted after a quiet period can receive faster responses on affected trading infrastructure. This reduces delays caused by idle processing without changing order behavior.
Traders can resume placing orders after a temporary market restriction blocks a pending attached take-profit or stop-loss exit.
Fixes an unintended market stoppage when a pending attached exit encounters cancel-only, reduce-only, or halted trading. The affected protective leg remains active and can trigger on a qualifying price update after trading resumes.
Trigger responses now include a version field so clients can reconcile API reads with realtime updates.
After editing an order with attached take-profit or trailing-stop protection, replayed updates no longer replace newer trigger states with older ones. Stop and trailing-stop realtime timestamps reflect the state’s actual update time. Clients can compare each trigger’s version across GetTrigger, ListTriggers and realtime updates, keeping the highest version; list results can briefly lag, and reconnects can repeat earlier updates.
Traders face shorter interruptions when pending fills must settle before new orders can execute.
After an unexpected restart, trade settlement resumes sooner, reducing temporary order refusals and pauses across trading pairs.
Cancels that specify the wrong trading pair now return ORDER_UNKNOWN and leave the order active. Replace-batch requests reject only the mismatched item, allowing valid items to proceed.
The cancellation rule applies when targeting an order by order ID or client order ID, including batch-cancel items. The trading pair remains optional for cancellations; omitting it uses the order's own pair.
A limit order for 0.00015 BTC at 90,000 USDT now displays 13.50 USDT instead of 13.49 USDT.
Corrects displayed order values in Open Orders and Order Details, including the details drawer. Filled values and the value shown in Order History also receive the correction. Open Orders now shows at least two decimal places for order values.
Reducing an order’s quantity while resending its current price now amends the order in place, preserving its order ID and queue priority.
AMEND_ONLY accepts these changes instead of rejecting them as requiring replacement. Resending only the current price leaves the order unchanged. Increasing quantity, changing the client order ID, or selecting REPLACE_ONLY still requires replacement.
Traders regain order reads and live order updates sooner when both copies of their account data require recovery.
Recovery now skips an unnecessary waiting period when neither copy can restore the other, while affected order data remains unavailable until recovery completes.
Developers receive listing times consistent with spot configuration, and date-added sorting follows those times.
Market overview uses each pair’s configured listing time and reflects subsequent corrections or removal of that time. Delayed updates cannot restore an outdated listing date.
Trigger reads reject zero-valued ID filters instead of silently ignoring them, and return consistent errors for invalid parent order IDs.
Listing triggers with a zero or invalid parentOrderId returns HTTP 400 with INVALID_ORDER_ID on REST, or invalid_argument with ERROR_CODE_INVALID_ORDER_ID on Connect. A zero subaccountId is rejected when listing triggers, retrieving a trigger, or reading trigger events; REST returns INVALID_SUBACCOUNT_ID, while Connect returns ERROR_CODE_INVALID_ARGUMENT.
Order book snapshots now report whether their depth is current, and QuickSwap and Swap use this status when calculating quotes.
The new available field distinguishes a current book with no liquidity from a book that is temporarily unavailable. Unavailable snapshots contain no price levels and can be requested again later. QuickSwap and Swap exclude unavailable books from pricing, regardless of their sequence number.
Accounts trading through a temporary service interruption spend less time waiting for pending fills to settle.
Settlement catches up sooner after service resumes, reducing backlog-related order refusals while preserving each account's fill order.
Traders regain order reads and live updates without an unnecessary recovery delay following certain market restarts.
Fixes a case where order reads returned catching-up errors and private WebSocket order updates remained paused after trading resumed.
Traders face fewer prolonged settlement backlogs when balance updates take longer during busy periods.
Settlement allows slow balance updates to finish before treating an attempt as failed, reducing unnecessary retries and temporary order refusals. Interrupted settlement attempts are also detected sooner so pending work can be retried promptly.
Fixed an issue that could prevent trading from resuming after a second trading pair was added.
Both the existing pair and the newly added pair can now resume trading.
Matched trades earning maker rebates can settle after periodic fee collection without waiting for new trading fees to accumulate.
Fixes a case where an unpaid maker rebate left a matched trade unsettled and order funds reserved after the order had filled or ended.
Traders can continue submitting orders in existing markets when another trading pair is assigned alongside them.
Prevents the brief trading interruption caused by assigning a new pair while existing markets are running; the new pair still waits to complete activation.
Fixes temporary insufficient-funds rejections caused by counting quote-currency trading fees twice after a buy fills.
Applies to both maker and taker buys whose fees are paid in quote currency. Those fees no longer temporarily reduce the funds available for subsequent orders beyond their actual cost.
Improved the reliability of trading settings after new pairs are added during maintenance.
When additional pairs are added to an existing group of markets, existing markets continue receiving trading-setting updates after the restart, while the new pairs receive their initial settings.
Improved fee handling when trading services recover from an interruption.
Trades using standard trading fees now wait for fee configuration recovery to complete before settlement resumes.
Traders can cancel an attached take-profit or stop-loss immediately after creating its parent order without a temporary-unavailable error caused by creation still completing.
Cancellation now proceeds during the brief interval after an attached trigger receives its ID but before order creation finishes. Cancelling the take-profit leaves the attached stop-loss active, including when the parent order fills immediately.
Order-book heatmap updates also recover when a newly listed trading pair experiences a brief initialization delay.
Order history and heatmap updates resume automatically when the temporary delay clears within the recovery window, preventing a new listing from leaving updates stopped across existing pairs.
Temporary setup delays for a newly listed trading pair no longer stop account fill and trigger-event delivery.
Applies to authenticated real-time subscriptions for root accounts and subaccounts when temporary market initialization delays resolve within the recovery window.
Fixed an order-count limit that could prevent accounts with sustained high trading activity from placing further orders.
Accounts can now continue placing orders beyond the previous per-account limit. Public order ID formats remain unchanged, with no client integration changes required.
Fixed cases where growing account numbers could prevent accounts from placing or canceling orders.
VIP and custom rate-limit settings are retained without crowding out other accounts. Accounts with valid access can cancel orders when their rate-limit policy is unavailable, while cancellation rate limits still apply. New account creation now returns a capacity error when available trading capacity is exhausted.
Fixed an issue where the private order WebSocket could omit a filled order’s final take-profit and stop-loss statuses.
When take-profit completed and its paired stop-loss was canceled, subscribers could miss the final update even though order history showed the outcome. The stream now includes the final order revision before removing the order from the live view.
Fixed an issue that could interrupt market-data updates when multiple trading pairs were processed together.
New trading activity could unexpectedly stop market-data publishing for affected pairs. This fix prevents that interruption when updates arrive between processing steps.
Fixed trading reservations remaining locked after an affected market stops for recovery.
Pending requests are resolved, and reservations for unfilled orders and live triggers are released. Orders with executed trades retain their reservations until settlement completes, then release the remaining funds.
Reduced delays in real-time fill updates on quiet spot markets.
Authenticated account trade subscriptions receive fill updates more promptly after settlement, including during periods of low trading activity.
WebSocket subscribers receive the latest market snapshot once its volume data becomes valid, without requiring another market change.
Market overview updates remain pending while volume data is missing or stale and are retried on subsequent publication cycles.
Fixed an issue that could prevent new accounts and subaccounts from placing orders as the platform’s account count grew.
Account configuration capacity is now managed independently, preventing unrelated accounts from exhausting it. The change also preserves fee-related credits that arrive before a recipient’s account setup completes.
Reduced duplicate trading updates after realtime service interruptions.
Fill and trigger updates now retain better duplicate detection through service recovery. Rare duplicates remain possible during prolonged recovery, so clients should continue handling repeated events by identity.
Fixed a recovery case where looking up a reused client order ID could return an older completed order.
When a newer accepted order finishes during recovery, lookups preserve its identity and retrieve its details from history when available. Affected private order subscriptions resynchronize their state.
Fixed a submission conflict that could prevent internal transfers between trading accounts from appearing on chain and delay later transfer records.
Affected records can now recover automatically, allowing queued records to continue processing. Recovery checks for existing on-chain records before retrying to avoid duplicates.
Routine cleanup during restart recovery no longer leaves affected markets refusing new order requests.
Fixes a recovery failure that could require an additional operator restart before traders could place orders again.
Traders retain access to healthy markets when a restart leaves another pair unable to process orders.
New orders on the affected pair may still be refused until it recovers.
Temporary data availability errors are retried automatically so traders can receive live updates once the new market is ready.
Live candle updates recover from brief failures during trading pair listings. Recovery is bounded, so prolonged or permanent failures can still interrupt updates.
A temporary interruption to one trading pair’s settled execution updates no longer immediately disconnects every private WebSocket session.
Clients subscribed to marketResync receive a notification for the affected pair before its execution updates resume after a read failure, keeping their connection open. Clients without that opt-in still reconnect and resynchronize on recovery. Temporary health-check failures alone no longer trigger a resync.
After a restart, traders can submit orders once balances are up to date even if withdrawal or internal-transfer processing remains delayed.
Delayed withdrawal and transfer processing no longer keeps otherwise ready accounts from resuming trading.
Fixed an issue that could prevent newly listed pairs from becoming available for trading.
Trading services can now process catalog updates that previously blocked activation of newly listed pairs.
Reduced interference between accounts during bursts of order activity, including batch replacements and cancellations.
Order submissions and cancellations now have separate per-account concurrency allowances, helping cancellations remain available during heavy submission activity. Requests refused at the account limit return OVERLOADED without being admitted and can be retried after an outstanding request completes.
Fixed an issue that could leave a trading pair rejecting new orders after a temporary interruption.
Affected pairs can now resume processing pending commands after routine maintenance, including when the pair has little trading activity while other pairs remain busy.
Traders can continue placing orders and triggering stop-loss orders on existing markets while a newly listed market starts up.
Only the newly listed market waits until it is ready to accept orders; its startup no longer blocks trading on other markets.
Order placement no longer fails during a partial service outage.
Order placement now recovers automatically when part of the service stops responding, including when a response stalls partway through.
Fixed an issue that could leave accounts unable to place or modify orders when settlement processing fell behind.
Related settlement balance updates now take effect together, preventing this catch-up condition from leaving affected accounts frozen.
Fixed an issue where an invalid fee update could interrupt trade settlement.
Settlement keeps the last valid fee settings when an update cannot be read, and subsequent valid updates continue to apply.
API clients can identify when a disabled market caused a stop-loss, take-profit, trailing stop, TWAP, ladder, or attached exit to be canceled.
Trigger details, lists, and event history now return named cancellation reasons for disabled markets: PAIR_DRAIN_TRIGGER, PAIR_DRAIN_TWAP, PAIR_DRAIN_LADDER, and PAIR_DRAIN_ATTACHED_LEG.
Fixed an issue under load where an order could disappear from the live WebSocket view without showing its filled, canceled, or rejected outcome.
When an order ends and leaves the live view in the same update, that update now includes its final order revision alongside its removal. Clients should process orders before removedOrderIds within each update. The message format is unchanged.
Fixed a bottleneck that could delay or temporarily pause order acceptance during heavy settlement activity.
Reduces settlement-related processing delays while preserving balance calculations.
Disabling a market automatically cancels its active strategies and releases unused reserved funds once outstanding fills settle.
Cancellation covers resting orders, stop-loss, take-profit, trailing-stop, TWAP and ladder strategies, including attached protective orders. Replacements on cancel-only and reduce-only markets now identify the applicable restriction. Market orders on closed markets report the trading restriction before quote availability is checked.
Traders can submit bulk cancellations and arm cancel-on-timeout for listed pairs even before those pairs are available for trading.
Cancel-all requests, including dry runs, accept listed pairs with no trading activity and report zero matching orders there. Unknown symbols remain rejected. Modifications that require replacing a non-post-only order on a post-only pair now return PAIR_POST_ONLY instead of PAIR_DISABLED; quantity-only reductions remain allowed.
Editing a take-profit or stop-loss trigger now shows a warning when the selected price could cause it to execute immediately.
The warning appears beneath the trigger price when available market data indicates the trigger condition is already met. It is advisory: you can still save the change.
Traders and API clients can retrieve historical order book heatmaps without a previous timed-out read causing an unrelated request to fail.
The fix covers historical heatmap snapshots, updates, and the anchors used to continue into live data.
Rejected edits preserve the previous trigger price and existing protection.
The check includes equality and uses the last-trade or index price the trigger watches. ModifyTrigger returns ERROR_CODE_TRIGGER_WOULD_TRIGGER_IMMEDIATELY (302). Standalone CreateTrigger requests still receive initial acceptance, then end FAILED with TRIGGER_FAILURE_REASON_TRIGGER_WOULD_TRIGGER_IMMEDIATELY (244), without placing an order and with reserved funds released. Attached TP/SL changes are also checked when an order has fills left to protect; attachments on new or unfilled orders are unchanged. Prices crossed after creation is submitted can still trigger normally.
API consumers can distinguish TWAP rollover, cancel-all-after expiry, and strategy cleanup from cancellations requested directly by a user.
GET /v1/orders/history reports TWAP_ROLLOVER (20) when a TWAP cancels its resting slice for the next slice, DEAD_MANS_SWITCH (18) when cancel-all-after expires, and STRATEGY_CANCEL (21) when a strategy cancels its child orders during cleanup or exit coordination. Direct user cancellations retain USER_REQUEST (2).
Resume and modify requests can use the trigger’s stored trading pair, while API keys restricted to specific markets must still supply its symbol.
POST /v1/triggers/{id}/resume accepts an empty body. Resume and PUT /v1/triggers/{id} also accept symbol through the ?symbol= query parameter. Supplying conflicting symbols in the query and body returns 400 BAD_REQUEST without changing the trigger.
Traders reducing a partially filled order now see a single quantity-limit message explaining the filled amount and minimum remaining order size.
The message shows the minimum valid total quantity and offers a Fix action to set it. Entering exactly the filled amount also displays guidance to cancel the order.
Canceling or modifying a finished order now explains that the order has ended, whether identified by order ID or client order ID.
The error message now reads: “The order has already ended (filled, canceled or expired).” The public API error description matches this wording; error codes and transport statuses are unchanged.
Ladder notifications now distinguish fully filled, partially filled, and zero-fill outcomes.
Ladders that end without fills show “Ladder ended” with zero filled quantity and levels. Partial outcomes show the filled quantity and level count against their totals. Fully filled ladders show “Ladder filled,” and cancellation notifications include any quantity already filled.
Traders reaching the account’s cancel-all limit now receive guidance explaining the 120-second retry window.
REST, Connect and WebSocket refusals identify cancel-all as the affected operation, confirm that the request changed nothing, and advise retrying after earlier cancel-all requests leave the window. The public REQUEST_RECEIPTS_EXHAUSTED error code and existing limits remain unchanged.
Traders now see cancellation or rejection reasons in the placement notification when a newly submitted order cannot proceed.
The success notification updates in place when an order is canceled or rejected shortly after submission, including unfilled market orders and rejected post-only orders. If the outcome arrives before the submission confirmation, only the outcome notification appears.
In Modify Order, traders can edit Client Order ID only alongside a change that replaces the order.
The field enables when changing the price, increasing the amount, or choosing Replace Only alongside an order change. In-place amendments keep the existing ID. Submitting an unchanged form no longer shows an update error.
Filled and partially filled limit orders now show their executed value even after a price edit.
Order History calculates Order Value using average fill price multiplied by filled quantity. The optional Cost column in Open Orders uses the same calculation.
API clients receive new trading pairs and changed order book grouping settings after temporary interruptions without waiting for a service restart.
Pair status, price increments and minimum order sizes also catch up automatically when configuration updates resume, instead of remaining stale until restart.
Traders using linked take-profit and stop-loss orders can submit the remaining quantity without a false insufficient-funds rejection immediately after a take-profit fill settles.
When the stop-loss triggers after a partial take-profit, the remaining position is no longer temporarily treated as unavailable because of the earlier fill.
Market makers who promptly consume updates can cancel more than 256 resting orders, up to the 10,000-order account limit, without losing their private stream.
The cancellation acknowledgement precedes individual cancellation updates for each order, and the same connection remains available for subsequent commands.
Markets such as ETC-USD can retain an index price when at least two fresh, qualified venues agree despite wide spreads elsewhere.
Venue quotes with excessive bid–ask spreads are excluded before checking price agreement. Index prices remain unavailable when fewer than two qualified venues agree.
API clients receive asset metadata changes made during recovery from a temporary interruption without waiting for a service restart.
Fixes a case where the asset list, asset names, and market-data volume precision could remain stale after an interruption.
Market makers sending overlapping SBE trading commands can receive fills and order updates without unrelated pending commands blocking delivery and causing a disconnect.
Fixes private-stream queue overflows caused by continuously pipelined commands delaying queued updates. Each command’s acknowledgement still precedes its own events, and acknowledgements and events each retain their order. Existing overflow disconnect and resynchronization behavior remains.
API clients receive 404 when a trigger is confirmed absent, while temporary history delays remain retryable.
Requests for nonexistent trigger IDs no longer repeatedly return “Order history is catching up” after absence has been confirmed.
Individual order lookups and open-order lists can proceed while earlier reads are still waiting, reducing avoidable delays during heavy server load.
Requests continue to require current order state and return a retryable error when that state cannot be confirmed; timeouts remain possible under load.
Reduced delays in order lookups and open-order lists for accounts with many completed orders.
Improved lookup performance by order ID and client order ID, and reduced interruptions to order reads while completed orders are processed in bulk.
Fixed an intermittent delay that could leave attached trailing stops, take-profit and stop-loss orders waiting several seconds to become active after their parent order filled.
Attached exits now activate more promptly once the parent fill settles, reducing the window in which a trailing stop could miss a price peak and reversal.
Improved available-balance handling during withdrawals and internal transfers.
Transferred amounts remain reserved until the account reflects the completed movement, keeping available balances consistent while balance updates are pending.
Protobuf trading WebSocket clients now receive cancel-all statuses that reflect the requested mode even when no orders match or every cancellation fails.
Dry-run requests return DRY_RUN even with zero matching orders. Live requests return SUBMITTED even when every cancellation fails, with failure counts preserved so clients can identify unsuccessful cancellations.
This fixes immediate lookups of replacement take-profit triggers returned by a successful order protection edit.
GetTrigger waits for the accepted trigger's state to become readable. If catch-up exceeds the read deadline, it returns a retryable unavailable response.
This fixes a regression that could block new orders on active accounts during ordinary sustained trading.
Trade-related balance updates remain in trade order, including after a restart.
Changes to a resting order’s take-profit, stop-loss, or trailing stop now apply together with any price or quantity edit, or the entire edit is rejected.
A rejected edit preserves the existing order and its protection. Exhausted trigger capacity returns TRIGGER_CAPACITY_REACHED so clients can retry later; an unsupported index-price source returns TRIGGER_PRICE_SOURCE_UNSUPPORTED.
Pending trade settlements no longer accumulate increasing retry delays while their requests cannot be delivered during a connection outage.
Settlement automatically resumes when the connection returns, without carrying forward retry delays from requests that were never delivered.
Newly listed trading pairs produce live and historical candles from their first available trade.
Existing markets continue receiving candle updates while a new pair becomes ready, and trades received before readiness are included when its candles begin.
Traders can continue receiving trades, order books and candles for ready pairs while another pair awaits its data feeds.
Each newly listed pair starts supplying market data independently once its required feeds are available.
Improved settlement recovery after temporary confirmation failures.
Settlement processing can retry interrupted confirmations automatically, helping avoid extended delays after brief infrastructure disruptions.
Reduced prolonged order-entry failures caused by temporary infrastructure disruptions.
Fixed a recovery issue that could interrupt placing, modifying, and canceling orders when configuration updates were temporarily unavailable. Affected services now recover automatically when those updates resume.
When a fill is permanently refused settlement, its reserved funds release after the order ends instead of remaining unavailable indefinitely.
The refused fill moves no funds and no longer blocks settlement of later fills for the affected accounts. Reservations release once the order has ended and every fill has a final settlement outcome. The order retains its filled quantity; this change adds no customer notification.
Attached take-profit and stop-loss orders now trigger when they become active if the latest eligible price already meets their trigger condition.
Previously, a price move during settlement could leave an attached exit waiting for another price update. Newly activated legs now check the latest eligible price, including when additional fills restore a remaining position. Activation still waits for settlement; price moves that reverse before activation remain outside this fix.
Clients can distinguish stale or missing order data from current data while updates for other orders continue.
The private orders WebSocket sends Unavailable with reason ORDER_UNAVAILABLE and the affected public order IDs in order_ids (orderIds in JSON). The list updates as affected orders change, including for new subscriptions, and Available signals when the subscription is current again.
Both traders can recover reserved balances automatically when a fill's settlement record is skipped.
The affected trade remains in history without transferring assets. Its reserved funds are released when the order ends and its fills have been accounted for.
Corrected a price validation issue that could exclude eligible trades from VIP volume calculations.
Affected trades can now be included during scheduled historical recalculation, allowing VIP qualification to recover automatically without manual intervention.
Ladder creation errors now identify which order was rejected and why.
REST and ConnectRPC responses name the rejected ladder order and its reason, such as insufficient funds. ConnectRPC error details also identify the affected level and its rejection code, making failures easier to diagnose.
Fixed cases where temporary service interruptions or restarts during startup could leave affected markets unavailable until manual intervention.
Affected markets can now recover automatically after these interruptions clear, including restarts that interrupt market initialization.
Developers creating TWAP orders receive distinct duration and interval error codes through REST and ConnectRPC.
A duration below 1000 ms returns TWAP_DURATION_INVALID; a slice interval below 100 ms or above the duration returns TWAP_INTERVAL_INVALID. When both are invalid, duration is reported first. REST returns HTTP 400, while ConnectRPC returns InvalidArgument with the specific error code.
Traders receiving live updates avoid repeated fill and trigger notifications when recent events are resent during recovery.
Duplicate suppression covers settled-fill updates and trigger events, including JSON and Protobuf feeds. Protection applies to recent events; existing client-side handling of duplicate events remains necessary for older replays or restarts.
Traders experience shorter history delays when heavy trading creates a backlog of completed orders.
Reduces delays in recording completed orders, terminal trigger outcomes, and trigger events for history reads.
Spot charts and public candle APIs use the previous close for intervals starting after rollout, across all timeframes.
High and low include the opening price, even when no trade in the interval reached it. A market’s first candle opens at its first trade, and intervals without trades remain flat with zero volume. Existing history is not rewritten, and candles already open at rollout retain their original opening price until they close.
Affected markets catch up on missed trading activity once the interruption ends, instead of leaving trade history and candle charts frozen.
Fixes a case where a temporary market-data outage stopped updates indefinitely while trading continued.
Longer-interval charts retain earlier prices and volume when a minute or hour closes following a restart.
Fixes missing pre-restart trades in live candles, including 2-hour, 4-hour, daily, weekly and monthly intervals. For markets that first traded during the restart minute, candles of three minutes or longer also retain those trades instead of becoming flat with zero volume.
Traders using TradingView charts now receive live candle updates again after the market data connection recovers or encounters a stream error.
The chart automatically reloads candle data and resumes live updates when recovering from an interruption.
Private trade and trigger streams also pick up newly listed spot markets automatically.
New markets are included from their first fills and trigger updates, while processing continues for existing markets.
Spot traders can switch between Standard and Advanced layouts while order book and recent trade updates stay connected.
Charts reuse current candle history during brief layout switches and continue receiving live updates. Fresh history is requested again if the live connection is interrupted.
Traders now see matching text sizes for the order type and status in the order details header.
The correction applies to both the desktop dialog and mobile drawer.
When an order's current state becomes temporarily unavailable, affected reads can recover automatically without waiting for another order update.
Recovery is retried periodically and restores affected reads once current order state can be verified, while other order updates continue processing.
Traders continue receiving new order-history updates after temporary connection failures that previously required manual recovery.
Recovery now skips identical repeated history records so processing can continue, with the same protection applied to trigger history.
API clients receive a retryable UNAVAILABLE error when a matching live order’s current state cannot be read.
Open-order requests now fail explicitly instead of returning stale order data or silently omitting an affected live order. Order-history requests also fail when an affected order appears on the requested page. REST returns HTTP 503 with code UNAVAILABLE; retry the same request. Orders outside the requested market filters do not block the list.
Rejected price changes leave the original order and its attached protection unchanged.
For limit buys, attached take-profit triggers must stay strictly above the order price and stop-loss triggers strictly below it; limit sells use the reverse. Creation and edits reject prices equal to or beyond these boundaries, including direct trigger edits while the parent order is working. You can update the order price and protection together when the resulting prices are valid. No minimum distance is required.
Swaps refused because an index price is unavailable now report MARKET_UNAVAILABLE.
If this refusal occurs, the swap can finish with a failure result instead of remaining in reconciliation. Its failure reason identifies market unavailability rather than a generic order rejection.
Traders can adjust protection after a full entry fill or a partial fill with the remainder canceled.
Change the attached trailing stop’s distance, activation price or slippage cap while retaining its tracked peak and protected quantity. Edits remain unavailable while an exit is being placed or remains active.
Fixed a timeout edge case that could delay reference-price history from becoming available.
History recovery can now continue when a brief availability check times out after data has been received. Historical data must still be verified before recovery is considered complete.
The fix applies to buy and sell orders, including standalone orders, attached TP/SL, and attached TP/SL edits.
Take-profit-limit and stop-loss-limit prices can be below, equal to, or above their trigger price. Existing trigger-direction checks remain in place.
Fixes trading interruptions caused by delayed responses for paused or not-yet-active stops, and prevents temporary post-only restrictions from permanently ending attached stop-loss orders.
An attached stop-loss blocked by post-only mode remains armed and can trigger again on a qualifying trade after the market reopens. Delayed responses for paused or not-yet-active triggers preserve their current state without interrupting the market.
Fixed order placement failures caused by expired client order IDs continuing to consume order capacity.
New orders can reclaim expired IDs even when other accounts have older records. Order previews also account for this reclamation. Orders created by fired stops and attached risk controls count toward trigger capacity while open and for 60 seconds after ending.
Fixed cases where order matching, timed order expiry, or replacing an expiring order could halt trading on an affected market.
Orders matching across multiple counterparties and batches of timed order expirations now complete without these interruptions. Replacing an order that expires during processing returns a rejection without halting the market.
Orders with attached trailing stops now reject invalid caps before acceptance, and trailing-stop updates enforce the same limit as creation for both buy and sell orders.
Explicit percentage-based slippage caps must be between 1 and 9,999 basis points; 10,000 returns ERROR_CODE_MAX_SLIPPAGE_INVALID. Setting zero during an update still clears the cap. API descriptions also clarify how attached take-profit and stop legs share the remaining filled position and coordinate exits.
API clients checking batch replacements under heavy activity can retrieve results throughout the existing replay window.
Status lookups no longer lose recent batches because other batches were submitted, and restarting the reader preserves results that have not expired.
Buy orders paying fees in the purchased asset now size attached take-profit and stop-loss exits to the market’s quantity step, leaving smaller remainders in the balance.
Exit rejections such as minimum-quantity or insufficient-balance failures now show Failed with a reason, while sibling protection can continue protecting the remaining quantity. Temporary market or system refusals remain eligible to retry. If a finished parent order leaves only a remainder below one quantity step and no exit has occurred, its attached protection ends with a quantity-step failure.
Trigger list, detail, and realtime updates now include the recorded closing instant for cancellations and failures.
This covers stop-loss, take-profit, trailing, TWAP, and ladder triggers, including user cancellations and OCO sibling cancellations. The completedAt field matches the terminal event timestamp and remains absent while a trigger is active.
Developers requesting candle history now receive up to the requested number of closed candles, with the current open candle included only when requested and available.
With sufficient history, limit=3 returns three closed candles; includeIncomplete=true can add one current open candle within the requested range. Historical candles returned by GetCandles now report isClosed=true, while the open candle reports false.
Removing a take-profit or stop-loss leg while its limit exit is resting now preserves the exit’s attached-order classification in order history.
The cancelled exit remains linked to its parent whether it was unfilled or partially filled. Replacing an exit preserves that relationship, and replacing its parent updates the relationship to the replacement order.
Fixed a scheduling delay that could postpone candle close updates when trading activity paused.
Candle completion now follows whole-second boundaries instead of inheriting a delay from the previous input's timing. This scheduling correction also survives service recovery.
Order history now identifies attached exits canceled before they start working as belonging to their parent order rather than a standalone trigger.
This covers exits canceled when another protective trigger takes over or when their trigger is canceled during submission, including after the parent order is replaced.
Fixes a case where routine maintenance left new order records, recent trades and candle data missing from history.
History updates can resume automatically after background processing is reassigned, without waiting for the affected processing to restart.
Fixed an issue where delayed updates could replace newer spot and reference candle data with stale values.
Completed candles now retain their latest values when older updates arrive after a processing interruption or retry. Longer chart intervals also use the latest candle values when calculating prices, volumes, and trade counts.
The fix addresses temporary read failures that became more frequent as completed orders accumulated.
Fetching open orders and individual order details no longer encounters the periodic interruption addressed by this fix.
Traders receive continuing market-data updates after temporary processing failures that previously could stop price and candle updates.
Recovery also prevents previously processed trades from changing index-price calculations a second time.
Fixed unnecessary QuickSwap failures when account readiness is briefly delayed.
Affected swaps now wait and retry automatically, allowing them to proceed once the account is ready. Orders awaiting confirmation remain tracked even if confirmation arrives after the execution deadline.
Fixed errors when retrieving triggers and their event history through the orders API client prefix.
GetTrigger, ListTriggers, and ListTriggerEvents requests using /api/orders-api-write now reach the supported read endpoints instead of returning an unimplemented error.
Clients replacing order data from private WebSocket updates receive attached protection details from the first pending version.
Initial pending updates include attached take-profit, stop-loss and trailing-stop settings, trigger identifiers and whether the protective orders cancel each other. This prevents the initial update from making configured protection appear absent.
Order history now identifies take-profit, stop-loss, and trailing-stop exits as attached protection and includes the order they protect.
When a protected order is replaced, subsequent exit records reference its replacement, preserving the relationship in historical order reads.
Attached stop-loss and trailing-stop orders can now take over the remaining position without an insufficient-funds rejection caused by the previous take-profit order.
When the stop triggers, the remaining take-profit order is cancelled and the protective exit is sized to the remaining position, even before earlier fills settle. This applies to both OCO-linked and independent attached exits.
QuickSwap rejects unsupported TWAP requests before issuing a deposit address and routes previously credited TWAP deposits through the normal return process.
TWAP quote and create requests return ROUTE_UNSUPPORTED with an explicit message to use market execution. Previously accepted TWAP deposits are processed for return without trading, subject to the usual withdrawal requirements.
Open orders no longer temporarily disappear or show older details when a live order stream switches connections during recovery.
The stream preserves order updates already delivered while reconnecting or handing over an active subscription.
When a ladder order is too small and the amount is entered in the quote asset, the submit button now shows the total needed to meet every level’s minimum.
The displayed minimum accounts for the lowest-priced level and rounds up to an amount you can enter. For example, a two-level ladder spanning 80,000–80,100 with a 5 USDT minimum per level shows “Minimum 10.01 USDT”. Base-asset amounts retain the per-level quantity message.
Submitting with Enter or after a market price change now uses the slice count and interval shown in the order summary.
When the slice count needs adjustment, submitting the order also updates the Slices field and shows a notice explaining the correction.
Traders and market makers can submit batch creates, replacements, and cancellations when their remaining rate-limit budget covers only part of the batch.
Eligible items within the available budget can proceed, while excess items receive individual rate-limit rejections. If no item fits, the entire request remains rate-limited, with retry timing calculated for one item.
Queries by order ID or client order ID can resolve once history catches up after recovery, even when no further trading occurs.
Missing orders return not found once history is complete; requests remain retryable while history is incomplete. Order history also uses each order’s latest version, preventing delayed updates from showing an older status or fill quantity.
Order and transfer forms also distinguish small nonzero amounts from zero and preserve decimal percentages while you type.
Percentages between 99% and 100% display as 99%, while those between 0% and 1% display as 1%. Transfers just below a large balance no longer incorrectly show 100%. Typed decimal percentages determine the amount, with the percentage display rounding when you leave the field.
This fixes temporary catch-up errors when reading orders after replacing attached take-profit or trailing-stop protection, including on partially filled orders.
Affected order reads can complete without waiting for unrelated trading activity to refresh the account’s order state.
Order changes that may still apply now report an unknown outcome instead of a generic service-unavailable error.
The trading WebSocket returns ORDER_CANCEL_OUTCOME_UNKNOWN (297) for unconfirmed cancellations, including Cancel All and batch cancellations, and ORDER_MODIFY_OUTCOME_UNKNOWN (298) for unconfirmed modifications and batch replacements. The Orders API also returns HTTP 504 with code 298 when a modification exceeds the venue’s confirmation window. These responses mean the change may still apply: read the affected orders, or open orders after Cancel All, before retrying.
Cancel, pause, resume, and modify requests now identify when a change may have applied despite a missing confirmation.
These requests return HTTP 504 with TRIGGER_CONTROL_OUTCOME_UNKNOWN when their outcome cannot be confirmed. Read the trigger’s current state before retrying, because the requested change may still apply.
Rejected amendments and replacements leave the active slice unchanged, while quantity increases within the TWAP's remaining amount remain allowed.
A slice's unfilled quantity cannot exceed what its TWAP still needs to execute, accounting for fills already completed. Oversized edits return CHILD_QTY_EXCEEDS_REMAINING (296); an increase to exactly the remaining quantity is still permitted.
API clients receive retryable UNAVAILABLE errors when an order’s current state cannot be read or its final history is still catching up.
Affected lookups retrieve ended orders from their exact history record, including when a client order ID has been reused. Batch replacement status also returns UNAVAILABLE instead of reporting an unconfirmed working or admitted state.
Fixed cases where duplicate settlement updates or updates for closed orders could unnecessarily block further trading on an account.
Already processed fills are handled without reducing reserved funds again, and late updates do not reopen closed order holds. These cases no longer prevent the affected account from placing or modifying orders.
Stop-Limit and Take-Profit-Limit execution-price edits now return HTTP 400 with TRIGGER_CHILD_PRICE_NOT_MODIFIABLE and leave the trigger unchanged.
Requests that include an execution-price change are rejected in full, even when they also include a valid trigger-price change. To use a different execution price, cancel the trigger and create a new one.
API users can also manage automatic cancel-all timers scoped to a disabled trading pair without a pair-disabled error.
CancelAllOrders and CancelAllAfter no longer reject requests solely because the selected pair is disabled, including cancellation previews and timer arming, refresh, and disarming. Unknown symbols remain rejected.
Trading continues when an individual trigger receives a stale or unexpected execution result.
Unexpected trigger setup failures release reserved funds. The public trigger API now includes CHILD_ORDER_INCONSISTENT for failures where a trigger’s child order does not match its request.
Traders on the same market can receive settled fills while an earlier trade involving other accounts is being retried.
Trades that depend on the delayed settlement continue waiting and resume automatically when it succeeds. A prolonged backlog can still pause settlement across the market.
Fixed candle opens, highs, and lows that could include a previous interval’s closing price even when no trade reached that price.
Live and closed spot candles now derive their prices from trades within the interval. Empty intervals continue to stay flat at the previous close with zero volume, without affecting the price range of a larger interval containing trades.
Improved recovery for transfers between Trading accounts when processing confirmation is temporarily unavailable.
Transfers with an unconfirmed outcome continue to be retried until their result can be verified, reducing incorrect failure outcomes during service interruptions.
REST trigger lists now honor parentOrderId and return only triggers attached to the specified order.
GET /v1/triggers now applies the parent-order filter consistently with ConnectRPC, including across paginated results. An account-owned parent with no triggers returns an empty list. Malformed parentOrderId values return HTTP 400 with INVALID_ORDER_ID.
Trades involving an asset you have not previously held can recover after a temporary failure preparing its trading balance.
Affected trades can complete on retry instead of remaining permanently unsettled after the temporary setup failure.
Traders cancelling during a pending order edit now cancel whichever version remains active, including when using a newly assigned client order ID.
An accepted cancellation covers both the original order and its pending replacement, whether the edit succeeds or is rejected. This prevents either version from remaining on the order book after cancellation is processed.
Fixes historical trading candles stopping after new markets are added and protects candle values during routine service handoffs.
Historical candle processing continues when market subscription changes interrupt processing. Successful service handoffs prevent an older update from replacing a newer candle value.
After an amended or replaced slice fills the target quantity, the parent TWAP completes once no slice remains open.
Completion can occur before every planned slice has been placed. The completed TWAP retains its actual executed quantity and submits no further slices.
When an order or execution update cannot be read, only identifiable affected accounts are asked to reconnect and resynchronize.
Other accounts continue receiving subsequent updates, and new connections remain available. Affected sessions close with WebSocket code 1012 and a resync-required message.
Orders created with take-profit and stop-loss or trailing-stop protection now show all accepted protections together once setup finishes.
Initial protection updates stay together even if the order fills or is canceled during setup. If one protection is rejected, the accepted protection appears when setup finishes.
Traders and API clients encounter fewer temporary missing-trigger results immediately after a pair becomes available.
Trigger lookups and lists pick up newly listed pairs without waiting for a long idle polling cycle to finish.
Traders and API clients avoid an intermittent temporary-unavailability error on their first order-details request after an idle period.
Applies to order lookups by order ID or client order ID; temporary errors remain possible while connectivity recovers.
Traders using attached take-profit and stop-loss orders avoid market-wide interruptions when overlapping exits are pending or being replaced.
Waiting protective orders resume monitoring the remaining filled quantity after the earlier exit is resolved.
Traders and API clients also receive the submitted quote-spend limit before an accepted order reaches the order book.
Pending order reads preserve whether an order was submitted as a limit or market order, including after service recovery.
Order responses now report OCO as false after you remove the attached take-profit, stop-loss, or trailing-stop leg, including on filled parent orders.
OCO remains true for a linked take-profit and stop pair when one fires and automatically cancels the other, preserving the pairing in the completed order record.
Filled orders now return requested take-profit and stop-loss details while those protections remain active.
When an order fills before its attached protections finish, its history entry retains their configuration, status and one-cancels-the-other setting.
Order reads and live updates now show replacement orders only once their confirmed state includes inherited fill quantities.
Replacement orders no longer appear temporarily as pending orders in open-order lists or WebSocket snapshots and updates. Looking up an unconfirmed replacement by order ID or client order ID returns not found. Batch replacement progress can still report pending while processing continues.
Fixed a failure when a QuickSwap buy’s minimum output rounds below the smallest supported unit.
Applies to direct buys and buys following an initial sell. Execution remains subject to market minimums and price protection.
Traders requesting attached take-profit, stop-loss or trailing-stop details receive final outcomes even when protection ends after the original order fills.
Historical order records retain the final attached protection state instead of remaining at the original fill’s earlier state.
Single and batch order requests now accept attached take-profit, stop-loss or trailing-stop protection instead of rejecting supported configurations.
Protection activates against settled fills. Requests to install new or replacement protection while an existing exit order is working return ATTACHED_EXIT_WORKING, indicating that clients can retry after the exit completes.
API clients receive HTTP 429 for affected order submissions, allowing them to distinguish throttling from service outages.
Early rejections now preserve the intended rejection reason for affected order submissions and previews, including those with attached protective orders, while retaining available rate-limit and retry guidance.
Order rejections with an unrecognized reason now return INTERNAL_ERROR instead of being reported as service unavailable.
Affected Orders API requests return HTTP 500 for REST or internal for ConnectRPC, with INTERNAL_ERROR in batch item results. Trading WebSocket responses also use INTERNAL_ERROR. Unrecognized rejection reasons are no longer misclassified as rate-limit errors when quota metadata is present.
API clients can retrieve batch replacement results that previously returned a status-not-found error immediately after admission.
Results include per-item acceptance, rejection and subsequent order progress, with corresponding realtime updates. The corrected flow retains batch status for two minutes after admission.
API clients exceeding their account’s order placement quota now receive rate-limit information instead of a service-unavailable error.
Affected single-order requests return HTTP 429 rather than HTTP 503, with quota, remaining allowance, and retry timing metadata.
When a capped trailing stop fires, the Orders API now reports the resulting order as MARKET/IOC with its configured slippage cap in ticks or basis points.
Order reporting now reflects the submitted market-order intent while execution continues to respect the configured slippage cap.
Single-order submissions over protobuf and SBE trading WebSockets now receive the account rate-limit error when their quota is exhausted.
Affected requests return RATE_LIMIT_EXCEEDED with quota and retry-delay information instead of a misleading service-unavailable error.
Fixed an issue where creating a TWAP strategy could stop order status, order history, and trigger updates for the affected market.
Newly created TWAP strategies are now correctly recorded before their first slice executes. Certain unexpected trigger transitions also no longer block subsequent market updates.
Invalid fee updates no longer interrupt spot settlement when valid fee settings are already available.
Settlement retains the last valid fee settings when a fee or VIP configuration update fails validation. During startup, an incomplete newer VIP fee policy is skipped in favor of an older valid policy.
Traders can hide RSI and its moving-average line from the chart legend without removing the indicator’s settings.
Existing chart settings and saved indicator sets are carried forward automatically.
Market orders without a client reference price now use fresh bid or ask prices, and mixed-pair batches price each order using its own trading pair.
Client reference prices are checked against the current bid or ask before any buy-side pricing cushion, avoiding incorrect STALE_QUOTE rejections. Orders without a client reference price are rejected with MARKET_PRICE_UNAVAILABLE when the required quote is missing, empty, or stale; other batch items can still proceed. The missing-price error message now applies correctly to both buys and sells.
Traders no longer lose ongoing market-data updates indefinitely when an affected pair’s feed connection becomes unusable.
The feed automatically reconnects and refreshes the order book and best bid and ask, allowing updates to resume without a service restart.
A replacement that leaves no quantity to trade now cancels the original order and rejects the replacement without stopping trading for the pair.
Fixes a rare failure during batch replacements after earlier items generate many fills.
Improved retry handling for withdrawals and Trading-to-Trading transfers after interruptions.
Retried requests retain their original timing during recovery, keeping expiry handling consistent.
Traders and API clients can submit and preview valid orders without intermittent failures caused by earlier requests.
Fixes a cause of unexpected internal errors during order submission and preview, including previews that specify a maximum quote spend.
Traders and market-data subscribers receive continuous depth updates without a recurring interruption during active trading.
Fixes a source of dropped order-book updates that unnecessarily paused incremental updates and forced a full refresh.
Orders that would exceed the total quantity limit at a price are now rejected individually, preserving existing orders.
A rejected replacement or modification leaves the original order and its queue position unchanged. The Orders API and trading WebSocket report PRICE_LEVEL_QUANTITY_LIMIT for affected order placements and modifications. Orders that bring the total exactly to the limit remain eligible to rest. A smaller quantity or another price may allow the request to proceed.
Fixed missing order-book depth and best bid/ask updates and improved recovery after market-data publisher restarts.
Restores book updates for affected markets and allows updates to reconnect when their publisher returns.
Fixed a failure that could leave account, funding, and trading APIs unavailable until services were manually restarted.
Affected services now trigger automatic restart and reload current configuration when configuration updates stop unexpectedly, allowing recovery once dependencies are available again.
Authenticated subscribers receive replacement-order progress even when order updates arrive before the batch admission confirmation.
Batch-replace updates reflect working, filled, canceled or rejected replacement orders instead of remaining admitted in this case. Repeated admission confirmations also preserve progress already reported.
API clients receive InvalidArgument on Connect or HTTP 400 VALIDATION_ERROR on REST when a client-provided trigger ID exceeds the limit.
The clientTriggerId limit counts UTF-8 bytes, so non-ASCII characters may use multiple bytes each; 36 ASCII characters fit within the limit.
Clients tracking batch order replacements now receive the filled status when a replacement is accepted and filled at the same timestamp.
Live batch status advances from working to terminal for these immediate fills, while older updates cannot move a completed replacement back to working.
Traders using Arabic or Persian browser locales now see valid dates on trading charts.
Chart date labels now handle locales with non-Latin digits or different calendars, and month names default to English to match dates elsewhere in the app.
Traders can type decimal prices and percentages below 1 when setting take-profit and stop-loss conditions in the order form.
Entries such as 0.08 in price mode and 0.5 in percentage mode remain intact as you type, without clearing at the initial zero.
Order rejections now return more accurate error codes and consistent statuses across REST and ConnectRPC.
Invalid order sizing now returns BAD_QTY (HTTP 400) instead of INTERNAL_ERROR (HTTP 500). Fee-ceiling rejections return RISK_LIMIT, while permission and temporary fee-availability failures return PERMISSION_DENIED and UNAVAILABLE. Order modification conflicts involving duplicate client order IDs or reused idempotency keys now return HTTP 409.
Traders regain funds reserved for an order replacement when its rejection arrives after the request has timed out.
This covers replacements rejected after the original order was cancelled and replacements rejected while the original order was still being accepted.
Traders can place orders on pairs with available capacity even when another pair reaches its resting-order limit.
Resting-order capacity is now independent for each trading pair. A pair that reaches its limit can still reject additional orders on that pair.
Traders repeatedly placing and cancelling orders on large books avoid progressively slower order handling.
New good-till-cancelled and good-till-date orders are also rejected before executing trades when resting-order capacity is exhausted, preventing partial fills followed by cancellation of the remainder for that reason. Immediate-or-cancel orders can still execute at capacity.
This fixes a restart timing issue affecting order placements, replacements and cancellations that could leave funds reserved.
Affected requests now resume processing during recovery without waiting for another restart. Quantity edits submitted before an order is restored may receive a temporary busy result and can be retried after recovery.
Traders can keep placing orders when reducing a resting order’s quantity coincides with its final fill.
Fixes a timing issue where the fill completed before the quantity reduction was confirmed, leaving the account unable to place further orders.
Traders who amend or replace an order immediately after placing it no longer risk leaving a rejected order pending with unused funds reserved.
Rejected orders retain the correct rejection reason, and outstanding edits finish without leaving replacement orders pending. Rapid edits during placement or replacement also preserve the correct order quantities and fill results.
Traders cancelling recently submitted orders during a service restart no longer encounter cancellations confirmed before the original submission is processed.
This prevents a delayed submission from leaving an order active after its cancellation has already been confirmed.
After a trading restart, recovery resumes eligible resting orders and cancels unexecuted immediate orders, releasing their reserved funds.
Accepted GTC and GTD orders interrupted before execution resume processing after recovery. Unsent market, IOC and FOK orders are canceled instead of executing late. Recovery also handles pending edits and cancellations while avoiding duplicate submission of requests already awaiting an outcome.
Traders using last-trade-price triggers avoid false activation when a previously processed trade is received again.
A newly armed stop-loss no longer activates at a historical trade price after the market has moved away; new trades still activate it when its price condition is met.
Fixed an issue where catching up on a large settlement backlog could halt an affected market and repeatedly prevent recovery.
Markets now process accumulated settlement updates gradually, including after a restart. A delayed market no longer blocks settlement updates for other markets.
Unfilled market, immediate-or-cancel and fill-or-kill quantities are canceled during restart recovery, preserving completed fills and releasing the remaining reserved funds.
Pending resting-order submissions, edits and cancellations are recovered after a trading engine restart, while already-filled orders are prevented from executing again. Market, immediate-or-cancel and fill-or-kill orders also reject amendments and replacements.
The fix also covers overlapping cancel-all requests, allowing other accounts to continue placing orders on the same trading pair.
Fixes a failure where cancelling many open orders could leave orders active and prevent all accounts from placing new orders on the affected pair.
Immediate orders accepted before an order-service restart but first received during recovery are now canceled without a fill instead of executing late.
Applies to unexecuted market, immediate-or-cancel (IOC), and fill-or-kill (FOK) orders stranded before the restart. Reserved funds are released when these orders are canceled. Previously executed fills are preserved. This change does not introduce a general execution deadline.
This fixes requests rejected while a previous large cancellation was still processing, including requests from accounts with no open orders.
Retries of an in-progress cancellation now wait for its result instead of receiving an immediate busy response.
Trades executed while order processing is interrupted now appear in trade history once processing resumes.
Recovered fills update order status and proceed to settlement without being applied twice, and stop-loss conditions crossed by those fills are processed after recovery.
The fix applies when an open slice ends without a fill after its TWAP has been cancelled.
This sequence no longer prevents subsequent orders and triggers from progressing or causes later order requests to fail.
Accepted single-order and explicit-order batch cancellations are automatically retried after a trading service restart.
This fixes cases where an acknowledged cancellation left an order active after a restart interrupted processing. Cancellation remains asynchronous: order updates or order queries confirm the final outcome.
Once a trading pair is reported stopped, new orders are rejected before reserving funds, preventing additional balances from being tied up.
Affected requests receive a retryable unavailable error. Batch cancellations can still proceed for healthy pairs while rejecting items for the stopped pair.
Canceling a Ladder’s remaining child orders now marks the Ladder Canceled instead of Completed.
Once all child orders have ended, the Ladder is Completed only when every child filled. A rejected child results in Failed; otherwise, a canceled child results in Canceled. Executed quantity and level progress are preserved. Cancellation reasons now identify self-trade prevention when it determines the Ladder’s outcome.
Standalone stop-loss and take-profit orders now report their armed state and arming timestamp when recovered before that state was saved.
Recovered orders publish their armed state without waiting for another order update, and the recorded arming time persists across subsequent restarts.
API clients receive HTTP 503 instead of HTTP 500 when batch cancellation remains pending or trigger cancellation encounters a temporary service outage.
Affected requests now return UNAVAILABLE so clients can recognize temporary failures and retry. Pending single-order and batch modifications receive the same retryable classification.
New placements without attached protective orders are retried automatically when a restart interrupts processing after acceptance.
Affected orders recover automatically instead of remaining missing while their funds stay reserved, and repeated recovery attempts avoid creating duplicate orders.
This fixes standalone stop-loss and take-profit orders whose creation is processed more than once.
Trigger API responses preserve the original armedAt timestamp when duplicate processing occurs for the same activation.
Execution updates arriving during cancellation no longer make these orders appear active again, including after service recovery.
Fills received during cancellation retain their executed quantities while preserving the canceled status. A late final fill also no longer changes a canceled TWAP order to completed.
Traders using attached take-profit, stop-loss or trailing-stop orders retain the cancelled status when cancellation overlaps activation or a trailing-stop threshold update.
Affected protective orders remain cancelled in order status and after a service restart, including when cancellation occurs because the other linked protective order fires.
Traders watching busy markets receive current candle snapshots without accumulating minutes of delayed updates.
Live candle streams send the latest available update for each market and timeframe when updates back up. Closed-candle updates remain ordered and are preserved.
Order lookups and history now agree during status updates on the same API instance.
History withholds orders still shown as open and uses newer completed-order information when available. History pages may contain fewer orders than requested, including none; continue while nextPageToken is present. Reads across different API instances can still briefly differ.
Order creation and updates now apply the trading pair’s price increments to attached take-profit, stop-loss and trailing-stop activation prices.
Validation covers trigger prices and take-profit or stop-loss limit-order prices, including batch requests. Invalid prices are rejected with PRICE_TICK_SIZE instead of rounded. Rejected updates preserve the existing order and its attached protection.
Clients can reconcile rejected batch replacements with their requests, including wrong-market rejections and mixed accepted and rejected batches.
POST /v1/orders/replace-batch preserves the submitted order ID in oldOrderId for rejected items and always includes itemIndex, including zero. When clientOrderId identifies no order, oldOrderId is omitted. Rejected and cancel-only items omit replacementOrderId instead of returning "1".
Spot traders and API consumers receive fresher trade history and live updates during heavy trading.
Recovery also suppresses repeated live trade updates and allows candle updates to continue when previously processed trades are replayed, without counting those trades again.
Orders created by standalone stop-loss and take-profit triggers retain their existing fund reservations when trading services restart.
Recovery preserves reservations for open triggered orders without reserving the same funds twice, including when a restart interrupts trigger activation.
This fixes cancellations submitted while standalone stop-loss and take-profit triggers are becoming active.
Affected triggers remain cancelled after a restart, preventing later price movements from placing an order from a cancelled trigger.
Traders using the standard spot trading layout can scroll overflowing panel tabs when space is limited.
Panel controls stay visible beside overflowing tabs, and selecting a tab scrolls it into view.
Order matching continues when trade updates fall behind during recovery or a temporary slowdown.
Delayed trade updates catch up in sequence once the slowdown clears.
Traders cancelling a standalone trigger immediately after creation no longer receive a false not-found response that leaves it active with funds reserved.
Cancellation now takes effect even when it arrives before the newly created trigger finishes initializing. Repeated cancellations and delayed updates no longer release the same reservation twice. Pause, resume and edit requests during initialization return a retryable error.
Traders and API clients can receive pending order state updates when realtime delivery recovers, even after a restart during the interruption.
Full delivery queues now pause incoming updates instead of discarding them. This applies to authenticated JSON and Protobuf order streams for root accounts and subaccounts; recovery can deliver the latest order state in place of superseded updates.
Temporary delivery failures no longer stop live market streams or immediately discard balance, transfer, fill and trigger notifications.
Affected updates are retried when delivery resumes. Failed order updates are also retried, with newer order states taking precedence over older failed updates.
Improved settlement recovery to avoid unnecessary interruptions to trading.
Retries after delayed confirmations or service restarts preserve completed trade updates while allowing unfinished settlement work to recover.
Traders submitting orders during sustained activity experience less delay when balance processing falls behind.
Addresses a bottleneck that could progressively slow new order submissions as trading activity continued.
Changes to attached protective orders now wait briefly for an ongoing parent order edit, reducing temporary unavailable errors.
Take-profit and stop-loss cancellations submitted together can both proceed. Editing, pausing, and resuming attached triggers also wait briefly when the parent order is being modified; requests can still fail if the wait expires. Cancelling an old trigger ID after an order replacement leaves the replacement trigger active.
This fixes a restart-related issue when cancellation overlaps a fill or the creation of a triggered order.
The fix also covers trigger-generated orders cancelled before receiving a fill, preventing released funds from becoming reserved again after restart.
The fix covers recovery when fill updates arrive out of order or are received more than once.
Reserved funds reflect completed fills after recovery, and reservations fully consumed by those fills are released.
The fix covers single and batch replacements of good-till-date orders, including partially filled orders.
When the original order expires before a replacement takes effect, the replacement is rejected instead of remaining pending, and the original order retains its expiry outcome.
Traders using TWAP or ladder orders now have immediately filled orders counted toward strategy progress.
Fixes an intermittent issue where a TWAP could remain running after its final slice filled. Ladder orders also correctly update executed quantity and completed levels when fills arrive immediately.
The fix applies to both maker and taker orders filled across multiple trades.
Unused reserved funds become available only after earlier fills settle successfully, including when a fill needs to be retried.
Pending quantity reductions, cancellation-only edits, and completed batch replacements retain their progress when trading services restart.
Pending edits can resolve after recovery, and completed replacements remain recorded even while other items in the same batch are unfinished.
Trade settlement retries now preserve the original amounts and fees after a service interruption.
When a trade has already settled but its confirmation was interrupted, recovery uses the original settlement outcome—even if fee settings have since changed—without moving funds again.
Affected traders can place new orders after a service restart when earlier orders have already released their reserved funds.
Fixes a recovery error that could leave an affected account unable to place orders across all trading pairs.
Traders continue to see subsequent orders on the same trading pair after replacing a single order.
The fix also preserves order updates when processing resumes after a restart.
Standalone and attached sell trailing stops now submit an order when their slippage allowance reaches or exceeds the trigger price.
Affected stops use an immediate-or-cancel limit order at the lowest valid price tick; execution still depends on available liquidity and order acceptance. Overlapping edits, cancellations, pauses or resumes of attached protection and its parent order now receive a retryable unavailable response. Brief protection-update delays no longer block unrelated order requests.
Orders no longer generate redundant status updates when their placement is retried during recovery.
Recovery retries preserve existing order state, including committed changes to attached take-profit and stop-loss orders. Pending cancellations and delayed fills continue to produce order updates.
Fixed an extra unchanged pending-order update when placing orders with attached take-profit, stop-loss, or trailing-stop protection.
Real-time order updates no longer include the redundant pending update caused by initial placement of a protected order.
Traders can remove take-profit and stop-loss protection immediately after adding it without the intermittent internal error caused by delayed order updates.
Removal briefly waits for the latest protection settings to become available. If the wait expires, the API returns a temporary unavailable response while processing continues automatically.
Traders can continue placing orders with existing available funds while recent fills update their account balances.
Funds reserved for orders and withdrawals still count against available funds, and pending settlement credits are excluded from balance checks. Prolonged settlement delays can still temporarily prevent new orders.
Traders can continue placing orders when settlement of a completed trade is retried after a delayed confirmation.
Prevents repeated settlement processing from causing unexpected order rejections on affected accounts.
Adding take-profit, stop-loss, or trailing-stop protection now returns an error when an existing parent order cannot provide usable exposure.
The rejected protection update applies no protection changes. Requests waiting for a parent order to become available continue to retry.
Traders adding take-profit, stop-loss, or trailing-stop protection immediately after placing an order now receive automatic retries for a brief processing delay.
This fixes an intermittent internal error when protection was added before the newly placed order was ready to accept it. If the delay persists, the request returns a temporary-unavailability response while reconciliation continues.
Traders cancelling many unfilled orders at once avoid extra delays before reserved funds become available for reuse.
Fixed a backlog issue that delayed fund release during large cancel-all requests.
Traders using attached take-profit, stop-loss or trailing-stop orders receive current protection details in order reads and live updates, including after the parent fills.
Fixes a recovery issue that could delay live order updates and removes temporary order-read failures caused by waiting for attached protection data. Replacement orders also avoid showing the previous order’s protection before their own protection is ready.
Traders can cancel attached take-profit or stop-loss protection after rearming even when the paired leg has just completed or been cancelled.
Cancelling one active leg leaves the remaining active leg running independently. Requests that cannot resolve a recent state change within the retry window return temporary unavailability instead of an internal error.
Improved Trading withdrawal handling during delayed confirmations, retries, and service restarts.
Applies to withdrawals from Trading to Funding and external chains. Pending withdrawals remain tracked through confirmation delays, and available balances update consistently when withdrawals settle or incur failure fees.
This protection also covers trigger reservations, preventing delayed duplicate reservation updates from reducing available trading funds.
New orders may be temporarily rejected when reservation tracking reaches capacity; this restriction clears automatically once completed reservations can be safely cleared.
Traders placing orders or receiving fills experience fewer delays when tens of thousands of orders are cancelled in a short burst.
Addresses cancellation-related pauses that could also delay other accounts trading at the same time.
Traders pausing, resuming, or modifying order-attached take-profit, stop-loss, and trailing-stop triggers now receive success only with a status confirmed for that request.
If confirmation is delayed, the response waits briefly for the matching update; if confirmation remains unavailable, it returns an error instead of reporting success with an earlier status.
API clients now receive HTTP 503 UNAVAILABLE instead of HTTP 500 when a cancel-all reply exceeds the server’s waiting period.
Cancellation may still be processing when this error arrives; retries should reuse the same request_id and cancellation criteria.
Traders pausing, resuming, or editing attached take-profit and stop-loss triggers receive the resulting status even when background updates lag.
Fixes successful pause responses that could still report RUNNING after the parent order filled, with corresponding corrections for resume and edit responses.
Traders receiving live spot updates are protected from older order and trigger states resurfacing during recovery.
Older updates no longer make recently completed orders appear open again. Trigger updates also filter stale states while allowing attached take-profit, stop-loss and trailing-stop protection to reactivate for remaining exposure.
Traders can continue placing orders when background forwarding of recorded order activity stalls or catches up after restarting.
Fixes a source of temporary order rejections caused by delays in background order processing.
Pending order cancellations recover more reliably after trading engine restarts.
Outstanding cancellations are automatically retried after a restart, reducing duplicate cancellation processing during recovery. Failed deliveries are retried when the engine reports progress. Orders remain pending cancellation until their outcome is confirmed.
Fixed a restart recovery issue that could leave affected trading accounts unable to submit new orders after a service interruption during batch processing.
Recovery can now complete when it verifies that an interrupted batch was incomplete and all preceding complete batches have been processed.
Order placement and cancellation processing no longer pause solely because background order recording is restarting or catching up.
When trading itself restarts, matching waits for recent order outcomes to be recovered before reopening the order book.
Improved protection against inconsistent spot order states when status updates cannot be delivered.
Processing now stops when an acceptance, rejection, or cancellation update fails after retries are exhausted. Expiration updates for restored good-till-date orders remain queued for retry.
Traders can preview the nearest valid slice count, interval, and size per slice before leaving the Slices field.
For example, entering 7 slices for a 15-minute order previews 6 slices every 2 minutes 30 seconds. The input keeps the typed value until you leave the field, then updates to match the preview.
Completed orders retain subsequent updates even when settlement does not generate another fill event.
Order updates preserve their processing order when fills and cancellations overlap, and older records cannot displace newer versions.
Traders can keep viewing other open orders when delayed take-profit or stop-loss cancellation updates arrive.
Fixed temporary account-wide open-order read failures after cancelling an order with attached protection. Delayed protection updates also no longer cause the cancelled order’s lookup to incorrectly report temporary unavailability.
Fixed a shutdown timing issue that could prevent order and trade updates from resuming after a service restart.
Improves recovery of order state and market-data updates following service interruptions.
Traders opening multiple tabs no longer get duplicate markets when default favorites are added.
Previously saved duplicates also appear only once in the trading sidebar’s Favorites list, without requiring manual cleanup.
Traders and API subscribers continue receiving order updates when recovery encounters a pending replacement, including changes to attached take-profit and stop-loss settings.
Fixes a recovery failure that could interrupt authenticated order updates after a replacement. Updates wait until the replacement is accepted before exposing its state.
PolyChart now resumes drawing automatically when the browser restores graphics rendering after an interruption.
Fixes charts remaining blank after graphics rendering recovers and prevents errors when adding indicators during the interruption.
Market buys entered as a spend amount now account for applicable fees and a small price buffer when showing the minimum required amount.
The order form blocks amounts below the adjusted minimum. Minimum-value rejection messages also provide clearer guidance to increase the amount, including when fees cause the shortfall.
Fixed ladder sell sizing so the available-balance shortcut and 100% slider preserve the full quantity allowed by the trading pair’s increment.
Ladder totals no longer need to divide evenly across levels. The per-level quantity preview shows an approximate amount when the final level includes a remainder.
Traders can edit attached take-profit and stop-loss thresholds after recovery without failures caused by prematurely discarded SELL order state.
Fixes a recovery edge case affecting replaced SELL orders when settlement remains delayed beyond the normal retention period.
Traders can update attached take-profit and stop-loss prices after a market or immediately filled limit SELL order settles.
Editing either protection leg saves the new threshold while preserving the other leg’s configuration and their one-cancels-the-other link.
After an order fills, traders can pause its attached take-profit and stop-loss triggers through REST or Connect without receiving a false “Trigger not found” error.
Paused triggers stop evaluating execution conditions and can be resumed. Pausing one exit preserves its link to the other exit, which can continue operating.
API clients receive distinct rejection codes for an order-symbol mismatch and request-ID reuse with a changed payload.
POST /v1/orders/modify now returns HTTP 404 ORDER_UNKNOWN when a listed symbol does not match the target order, and HTTP 400 CONFLICT_IDEMPOTENCY_KEY_REUSE when a requestId is reused with a different payload. Rejected requests leave the order unchanged, while identical retries continue to return the original outcome.
Recovered spot order updates now respect the latest removal of attached take-profit and stop-loss orders.
Delayed updates no longer republish outdated attached protection when the order changes during recovery. The correction applies to both JSON and Protobuf order subscriptions.
Traders using attached take-profit or stop-loss protection avoid a brief trading interruption when the parent order fills before protection setup finishes.
Order completion now waits for attached protection setup and resumes automatically, including when recovering a replaced order.
Traders paying buy fees in the purchased asset now have attached protective exits sized to the quantity actually received.
Attached take-profit and stop-loss sell quantities account for entry fees deducted from the purchased asset and round down to the market’s quantity step, preventing those exits from consuming additional existing holdings. Buys with fees paid in the quote asset retain their full purchased quantity for protection.
Buy and sell TWAP orders now retain cumulative filled quantities when a slice receives multiple fills, keeping execution totals accurate.
Previously, filled quantity could be undercounted, causing later slices to exceed the remaining order quantity. The fix preserves recorded fills so subsequent slices respect the requested total.
Improved the reliability of API-key settings, account policies, and subaccount permissions during service restarts.
Affected account, trading, and funding APIs complete access-setting initialization before reporting themselves ready.
Fixed an issue that could leave one attached take-profit or stop-loss leg active when both legs of an OCO pair were cancelled simultaneously.
Cancellation requests also avoid premature failure responses when confirmation arrives before the request deadline. Requests that exceed their deadline can still have an uncertain outcome.
Fixed an issue that could interrupt private real-time order and trigger updates during slow recovery.
Orders with attached take-profit, stop-loss, or trailing-stop conditions can now recover complete updates without losing information already retrieved during recovery.
Open-order requests no longer fail because attached-trigger information is missing for an order that has already ended.
GET /v1/orders/open and its ConnectRPC equivalent can return remaining open orders in this situation, while excluding stale entries for orders that have ended.
Affected trading pairs can recover their bids and asks after missed market updates without a service restart.
Fixes a recovery loop that could leave populated markets showing no bids or asks while updates continued arriving. Order book snapshots and live updates resume once a valid full snapshot restores the book.
Market orders now return validation errors when their maximum slippage cannot produce a valid execution price.
Trailing stops with invalid slippage bounds fail without placing an order and report a specific failure reason. Protected prices also round to the pair’s price increments within the requested slippage tolerance.
Ladder orders now check the minimum order value at the lowest price in the range, catching configurations that previously passed validation and then failed.
If the lowest-priced level falls below the pair’s minimum order value, the form blocks submission and shows the required minimum per level. Validation accounts for the pair’s allowed quantity increments.
Touchscreen laptops with a hover-capable touchpad or mouse can now access the Trade page at desktop widths without a short browser window triggering the mobile warning.
Narrow windows and touch-only phones in short landscape viewports continue to show the desktop-only notice.
Fixed rounding issues when switching order amounts between base and quote assets, and improved precision for small quote amounts.
Converted quote totals now round up to preserve minimum order amounts. When switching a market buy to quote entry, rounding alone no longer pushes an otherwise affordable amount above the available trading balance; the budget and estimated quantity adjust to fit. Minimum-order messages, order values, and TWAP slice costs respect quote-asset precision. Trailing-stop slippage caps entered in quote units now support the pair’s price precision.
Large order book quantities now use compact notation sooner, and the Market Trades widget supports narrower layouts.
Size and Total values of 100,000 or more now use compact notation to prevent column overflow. The Market Trades widget can be narrowed to 254 pixels, down from 300 pixels.
Order book price grouping now defaults to each pair’s smallest available increment and saves your selection separately for each pair.
Switching trading pairs restores the grouping selected for that pair. If no selection is saved or the saved increment is unavailable, the smallest available increment is used. Previous shared grouping preferences reset to these defaults.
Fixes a failure that could interrupt traders’ live order updates after a restart when processing extensive completed-order history.
Recovery also checks the current order state before resending updates for attached take-profit and stop-loss orders, preventing superseded attachments from reappearing.
Traders replacing partially filled buy or sell orders now reserve funds based on the quantity still available to execute.
Applies to price-only replacements and replacements that increase or decrease the total quantity. Previously filled quantities no longer inflate the replacement’s reservation, leaving excess funds available for trading.
Historical reference candles now complete reliably even when one source’s older history is incomplete.
Historical reference candles are checked against their source data. Previously observed candles cannot be silently replaced with empty history, and unresolved intervals stay marked incomplete until they are recovered.
Traders can adjust live take-profit and stop-loss prices without cancelling and recreating their protection.
Valid edits now update attached TP/SL triggers after the parent order fills. Cancelling one trigger preserves the surviving trigger’s latest settings, and parent-order edits that omit protection changes retain existing TP/SL settings.
Traders and API clients making successive edits to the same order now receive the outcome and identifiers belonging to their latest request.
A delayed or duplicate result from an earlier edit no longer makes a later replacement appear to be an amendment, return the previous order ID, or omit the replacement’s attached protection trigger IDs.
Changing a trailing stop’s activation price now starts trailing when the current last-traded price already satisfies the new condition, without requiring another trade.
The stop enters the armed state, publishes its calculated trigger price, and records an activation event in its history. Sell and buy trailing stops also activate when the last-traded price equals the activation price.
Traders and market makers refreshing quotes in bulk avoid a cause of replacement timeouts after sustained trading activity.
Replacement receipts can now arrive while unrelated order updates are being processed.
Traders modifying filled or canceled orders receive an explicit rejection in both individual and batch requests.
Affected requests return ORDER_ALREADY_TERMINAL, with consistent results when retried. Mixed batches can still replace eligible live orders while rejecting closed orders.
Spot trading recovery now waits for retained order updates to be saved before restoring the order book.
This fixes a recovery case where an already filled order could return to the book and match again. New order processing pauses when order recording becomes unavailable and resumes automatically after recovery, while commands already being processed continue.
In the standard trading layout, resizing the order book with panels side by side now preserves the Trades panel’s width within panel size limits.
Widening Trades using the divider can now draw on available chart space once the order book reaches its minimum width. Trades also has a minimum width to prevent excessive shrinking.
Fixed an issue that caused 24-hour USD trading volume to disappear intermittently from market overview responses and live updates.
USD volume calculations now preserve small traded amounts and correctly handle larger volumes that previously appeared unavailable. REST, Connect, and WebSocket responses retain consistent values and distinguish zero volume from unavailable data.
The order slider and Available Balance shortcut now preserve the trading pair’s supported quantity precision.
Selecting 100% fills the full available sell quantity when it matches the pair’s quantity increment, including balances with eight decimal places. Other percentages also avoid premature truncation to six decimal places.
Newly listed spot markets now take their correct positions in Gainers and Losers lists based on the percentage shown.
Sorting the 24h Change column now uses the displayed percentage, including for new listings. Market summary lists resolve equal changes by trading volume, then trading pair.
Trading charts now apply delayed candle updates even after a newer candle has started.
Updates that arrive out of order now refresh existing candles or fill missing candles within the loaded time range, preserving chronological order and updating price and volume data.
Chart timestamps now retain seconds when hovering over the latest candle on timeframes shorter than one minute.
The fix keeps crosshair and selected drawing time labels consistent with the chart’s candle interval.
Fixed cases where chart adjustments and form edits could overwrite your latest take-profit or stop-loss input.
When you change an order’s entry price or quantity, related TP/SL values recalculate according to your latest price, percentage, or P&L input. Clearing an input or changing its unit resets the selected setting without clearing the other.
Traders can open a new order review without an earlier submission’s delayed response dismissing it or displaying an unrelated error.
Each new confirmation starts with fresh loading, error, and checkbox states. Delayed responses from dismissed confirmations no longer change the current review or save the preference to skip future confirmations.
Reopened order and trigger cancellation dialogs no longer close or show outdated messages when an earlier cancellation finishes.
Cancellation dialogs now ignore Escape while a request is processing. Reopening bulk order cancellation requests a fresh order count and clears previous retry state.
Fixed stale form state and duplicate saves when editing stop-loss, take-profit, and trailing-stop triggers.
Reopening the editor clears abandoned edits, and a save finishing for a previously opened trigger no longer closes the current editor. Trigger prices, trailing distances in quote currency, and activation prices that round to zero at the market’s price increment are blocked before saving.
On mobile, the main value now carries an explicit label for trigger price, trailing distance or amount.
Mobile and desktop trigger details now show a larger pair icon with the trading pair, Buy or Sell, trigger type and status together. On desktop, Modify appears beside the status when available, and the trigger ID and copy button move to the footer.
Traders can check post-only status in Order Details or the optional Post Only column in Open Orders and Order History.
Post-only orders show “GTC” instead of “GTC · PO” in the TIF column. The separate Post Only column remains hidden by default.
Traders can see the selected Last or Index reference value when configuring stop, take-profit limit, conditional and trailing stop orders.
Pair statistics now include Index Price, with loading placeholders and an Unavailable state when no index value exists. Advanced TP/SL shows Index price when either leg selects Index, keeping Last price visible when another populated leg uses Last.
API documentation now explains that cancel-all and the dead-man switch cancel open orders, including orders placed by triggers, while armed stops and running TWAPs can continue placing orders.
The documentation explains how to stop automated trading: list live triggers, cancel each trigger with CancelTrigger, then cancel all orders. It also clarifies that matchedOrders counts open orders placed by triggers, not triggers themselves. Trading behavior and API formats are unchanged.
WebSocket clients can identify a trigger’s trading pair and strategy directly from each JSON event without an additional lookup.
Every activation, arming, firing, failure, cancellation and update event includes symbol and triggerType. Cancellation and update events also retain the correct trigger type in both JSON and Protobuf when a trigger has been idle for an extended period.
Traders benefit when accumulated fills are waiting to settle after a burst of activity.
Pending trade settlements are processed faster during backlog recovery while preserving settlement order for each account.
Improved acknowledgement throughput for SBE trading sessions with multiple commands in flight.
Command acknowledgements remain in submission order, and related private events continue to arrive after their command’s acknowledgement. No client changes are required.
Trading fee and maker rebate entries now identify the fee account as their counterparty. Settlements awaiting rebate funding retry automatically.
Fee payments show the fee account as the destination, and maker rebates show it as the source. When rebate funding is temporarily unavailable, the affected settlement remains pending and retries until funding becomes available.
Developers and market makers can check order-size limits and default open-order caps before submitting orders.
Each pair includes maximum limit-order quantity, market-order quantity and order notional as decimal strings, with unlimited maxima omitted. The response also reports default resting-order caps per pair and across the account; account-specific limits may be lower. Defaults are 200 resting orders per pair, 1,000 per account and a maximum order notional of 5,000,000 quote units for USDT- and USDC-quoted pairs.
Market makers can submit order bursts on one connection while command processing and acknowledgements preserve submission order.
SBE sessions can keep multiple commands in flight, pausing reads when the session limit is reached. Related private events still follow their command’s acknowledgement. Consecutive modifications of the same order should wait for the previous outcome. If a command’s outcome is unknown or it could not be sent, the session returns its rejection and closes with code 1013; clients should reconcile orders before reconnecting and resending.
Visitors on phones and tablets see a trading preview that matches the selected page theme.
The homepage displays light or dark trading artwork on screens narrower than 1,024 pixels, with adjusted market-header alignment.
Traders can compare spot markets by their displayed 24-hour USD volume in the desktop sidebar and mobile market picker.
Volume replaces the full asset name beneath each pair. Header menus offer sorting by pair, volume, price or 24-hour percentage change, with direction arrows and a Clear sort option for the active sort. Volume can be sorted highest or lowest first, while markets with unavailable volume remain last. Touch screens get larger sort controls.
Traders and API clients can distinguish recovery-related trigger cancellations from user-requested cancellations.
The trigger API now reports ACCOUNT_REPAIR when the exchange cancels a trigger during account recovery. Open orders on the affected market are canceled as part of the same recovery; orders and triggers can be placed again once trading resumes.
API clients can verify the account, symbol and side recorded when arming or refreshing automatic order cancellation.
CancelAllAfter responses now include effectiveScope on REST and ConnectRPC. A zero or omitted symbol ID means all symbols; an unspecified or omitted side means both sides. Disabling the switch returns no scope. The reported scope describes the armed switch; refreshing or disabling it does not change cancellations already in progress.
Orders from a root account and all its subaccounts now share one self-trade prevention scope.
When orders within that scope cross, the incoming order’s mode determines whether the resting order, incoming order, or both are cancelled. The default remains cancellation of the resting order. Orders from different root accounts remain eligible to match.
Clients recording fills can now distinguish complete execution records from trade history that is still catching up after a fill.
GetOrder adds executions_complete, exposed as executionsComplete on GET /v1/spot/orders/{order_id}. With execution history enabled, it is true when recorded trade quantities across all pages match the order’s cumulative filled quantity. Responses continue returning the trades available so far; clients can read again when the flag is false. The flag is always false when execution history is disabled, and it does not indicate transfer completeness.
Open Orders, Order History and Trade History now default to all pairs and restore your saved selection when you return to a trading page.
Clearing a pair filter restores all pairs for that page. Previously saved Open Orders and Order History pair filters reset to All once, while other saved table settings remain. These order tables show loading placeholders until saved filters are available, preventing an initial flash of unfiltered rows. Quantity columns omit unnecessary trailing zeros, and USDT order values and costs display up to two decimal places.
Traders experience shorter queued-order delays when a market catches up after an interruption or lengthy trading operation.
Queued orders can progress in batches while retaining their original processing order, reducing the wait for a backlog to clear.
Trading-pair status changes now take effect without a restart, with an explicit halted status visible through the API.
Halted pairs reject new orders and trigger orders with MARKET_HALTED while allowing existing orders to be canceled. Spot configuration reports PAIR_STATUS_HALTED, represented as HALTED in REST. Applied halts remain effective after a restart.
High-volume clients sharing an IP address can encounter order request throttling sooner.
Lower limits apply across order submission, preview, modification and cancellation requests. Requests exceeding the limits receive HTTP 429 responses. Per-account quotas are unchanged.
REST and WebSocket trading clients receive up to 200 affected orders, oldest first, including client order IDs when present.
POST /v1/orders/cancel-all returns cancelledOrders, totalCancelled, and truncated; WebSocket acknowledgements also include the listing and indicate truncation. The 200-entry limit applies only to the response: cancellation is requested for every matching order. Responses confirm acceptance, with final states reported through order updates. Dry runs return counts without cancelling or listing orders.
Each trading account can run five additional concurrent TWAP orders on the same market.
The limit increases from 15 to 20 concurrent TWAP orders per market in each trading account. A twenty-first order is rejected until an existing TWAP completes or is cancelled, freeing a slot.
A temporary interruption affecting one trading pair now limits order-read unavailability to accounts with orders or pending activity on that pair.
Affected requests automatically try another replica and return a retryable catching-up response if their data remains unavailable. Unrelated accounts continue receiving normal order lookup and open-order results.
Subscribers to /ws/trade.sbe receive individual order updates and fills using the existing event formats and timestamps.
Live order updates no longer coalesce intermediate status changes, and duplicate events are filtered out. When a stream gap is detected, affected connections close with a resynchronization message so clients can refresh their order state.
Daily rewards can now be paid directly to an active subaccount you own.
Choose a destination using the optional subaccountId field when claiming through the daily rewards API. Omitting it keeps payouts to your root account. The limit remains one claim per root account per UTC day. Once created, a claim keeps its original destination across retries, and claim and status responses report the selected subaccount. Shared subaccounts owned by another account cannot be selected.
Traders and API clients receive retryable errors when recent order activity or order history is still catching up.
Order details, open orders, and batch replacement status use current order state. Order history excludes orders still active and refreshes outdated attached stop-loss and take-profit information when newer state is available. Order lookups check completed-order history before reporting an order as missing.
Ladder creation checks every planned level before admission and rejects the whole request if any level fails, identifying the level and reason.
Supports linear ladders with 2–100 levels and rejects invalid ranges or quantities insufficient to populate every level. Cancelling a ladder removes its remaining live orders. The number of live triggers allowed on the busiest markets is lower.
Traders can access open orders, triggers, and order history as each newly listed pair’s data becomes available.
Existing pairs continue updating while new pairs are added, and retained records created before a new pair becomes available are picked up automatically.
Adds order amendments, replacements, and batch processing, with reduced additional balance reservations during replacement.
Supports batches of up to 20 order creations or 50 cancellations or replacements, with individual results and no rollback of successful items. Batch replacements must target one market.
Expanded support for spot order-book depth and best bid/ask updates.
Order-book feeds publish a current snapshot before incremental updates after startup or restart, helping consumers resume with consistent market data.
Order and trigger requests now identify gateway configuration failures separately from temporary service outages.
Affected requests return GATEWAY_MISCONFIGURED (77), with guidance to contact support because retrying will not resolve the issue. Order previews rejected by rate limits now preserve the rate-limit response and retry metadata.
Traders get faster rejection processing when liquidity within a limit order’s price cannot cover its full quantity.
Fill-or-kill orders continue to require a complete fill, with the same rejection reason and self-trade prevention rules.
Good-till-date orders valid when processing begins remain eligible throughout that operation, even if their deadline passes while it runs.
Orders already due to expire are removed before matching begins. The same expiry decision applies throughout order placement and replacement, including matching against resting orders.
Improved processing efficiency for fill-or-kill (FOK) limit orders.
FOK orders retain their existing all-or-nothing execution behavior, price priority, self-trade prevention rules, and expiry handling.
Desktop traders with chart orders enabled can see offscreen price summaries and compact TWAP progress badges.
Orders outside the visible price range are grouped into one badge at each chart edge, showing the nearest price and a count of additional levels; clicking brings that price into view. TWAP badges show slice counts and progress shading, while hovering reveals the full label, available controls and slice markers.
Your last confirmed maximum slippage percentage is restored for each trading pair when you return in the same browser.
Confirm a percentage in Max Slippage to save it for that pair. Pairs without a saved preference use their default percentage. Slippage caps entered as quote-currency amounts are not saved.
Trading services now wait for previously recorded order updates before restoring state after a restart.
Trading pairs whose recovery data cannot be validated remain paused, while unaffected pairs can resume processing.
Orders already being processed have time to receive acceptance, rejection or cancellation results, reducing cases left showing pending after maintenance.
Graceful shutdown now allows up to two seconds for outstanding order results; this does not guarantee recovery from abrupt interruptions or prolonged outages.
A backlog in one market no longer forces other markets to wait for its current batch of trades to finish settling.
Trade outcomes remain ordered within each market, and markets continue to share available settlement capacity.
Queued trades settle more efficiently during bursts of trading activity.
Settlement processing handles trade backlogs more efficiently while preserving each trade’s original settlement result when retried.
Traders and market makers benefit when bursts of matched trades create a settlement queue.
Queued trades can settle in parallel while settlement confirmations remain in match order and follow successful settlement.
Reduced background processing overhead during large order cancellations.
More efficient recovery of reserved funds for canceled or rejected orders with no fills reduces interference with ongoing order activity. Existing release safeguards and retries remain in place.
Traders receive submission counts while matching orders continue cancelling asynchronously, including for large order books.
Orders placed after acceptance are excluded, while selected orders remain covered if modified afterward. Check order updates or GetOpenOrders to confirm cancellation completion. The response reports matched orders, submitted cancellations and cancellations that could not be submitted.
Trading API clients can also receive an already-terminal response when individually cancelling older completed orders by order ID or client order ID.
New and replacement orders cannot reuse a client order ID while it remains retained for that account after an earlier order finishes. The extended retention is best effort and has no fixed duration.
API consumers requesting protection details receive take-profit, stop-loss, and trailing-stop settings and status updates even after the parent order finishes.
Historical orders retain protection prices, trailing settings, lifecycle timestamps, resulting child order references, and one-cancels-the-other linkage. Removed protections are excluded from configured settings.
Clients placing or cancelling orders receive a temporary-unavailability response when request capacity remains fully occupied.
Requests that exceed the capacity wait limit are rejected before submission for processing, and earlier caller deadlines still apply.
Traders and automated clients avoid cancellation lookup delays caused by accumulated completed orders.
Canceling an open order by its client order ID no longer requires searching through retained completed orders.
Improved the reliability of historical order records and their attached trigger details.
Filled, canceled, and rejected orders are preserved more reliably when history processing is delayed. Repeated updates to completed triggers refresh their existing historical records, improving consistency of attached stop-loss, take-profit, and trailing-stop details.
Transfer, withdrawal, and trading screens now explain unavailable actions more clearly and reflect the selected subaccount’s permissions.
Transfer restrictions follow the selected source account, with explanations for unavailable destinations and account swaps. Permitted transfers between a subaccount’s own Funding and Trading balances remain available when transfers to other accounts are disabled. Withdrawals default to Trading balances when the Funding source is unavailable. Eligible users can open permission settings directly from restriction messages. The permissions page also preserves nonconflicting edits when settings change elsewhere and identifies conflicting changes for review.
Market order forms now show both Order Size and Order Value, with estimates marked by ≈.
When entering a quantity, the order value is marked as approximate. When entering a total, the calculated order size is marked as approximate.
Live candle streams also advance during quiet periods and replace provisional values with final prices and volumes for the same timestamp.
A delay processing one market’s candles no longer blocks candle processing for other markets. Recent one-second candle requests refresh sooner when the latest closed candle has not yet arrived.
Order book quantities now retain trailing zeros for more consistent column alignment.
Size and Total values use fixed decimal places for the selected asset unit. Large quantities shown in compact notation consistently display two decimal places.
Switch accounts directly from global search, find more relevant results, and preview appearance choices with the keyboard.
Signed-in users can open Switch Account to search their accounts, see account avatars, and select an account. Search ranking favors exact names and market symbols and gives recent selections a boost. Settings now appear under Actions, while navigation destinations have a Pages tab. Fonts, themes, and trading colors support keyboard previews before selection.
Account page headers now have a solid lower edge and tighter spacing beneath them.
Removed the scroll fade effect while keeping headers pinned as you scroll through account pages.
Order details dialogs are wider, with larger Trades and Transfers tabs and refined spacing.
The wider layout also applies when opening related order details. Tab labels are larger and aligned to the left, making order activity easier to browse.
Automatic withdrawals now support recurring payouts of selected assets to whitelisted external addresses, with schedules from hourly to monthly. API-key requests to session-only account APIs now return a consistent session-required error, and daily testnet rewards require a verified Discord or X account.
API-key refusals on session-only wallet withdrawals, auto-withdraw rule changes, and portfolio equity reads now return AUTH_SESSION_KIND_NOT_ALLOWED instead of PERMISSION_DENIED.
Affected REST responses retain HTTP 403 and application/problem+json, with the new authentication code. ConnectRPC responses retain permission_denied and provide auth.v1.AuthErrorDetail. Session-required refusal messages are standardized to "interactive session required", including VIP status, checkpoints, effective subaccount permissions, and guard-signer operations.
Claiming daily testnet rewards now requires a verified Discord or X account.
Verify either account directly from the daily reward dialog, then continue to claim. Accounts that already have Discord or X verified can proceed directly. You can postpone verification and return later.
Root accounts and subaccounts can automatically withdraw selected assets to whitelisted external-chain addresses in their original currencies.
The ConnectRPC API supports UTC schedules, per-asset minimums and payout ceilings, and withdrawal run history with outcomes and transaction hashes. Below-minimum balances and fractional on-chain units remain on the account. Creating, changing or disabling a rule requires an authorized session and fresh MFA; appropriately permitted API keys can read rules and runs.
Clients using funding, account, rewards, and realtime-token REST endpoints can now decode authentication refusals through the standard JSON problem format.
Affected responses use application/problem+json with type, title, status, detail, and code fields. Authentication refusals retain HTTP 401. Rewards refusals now return structured JSON instead of plain text, preserving the unauthenticated message in detail. Realtime subscription authorization errors also include problem fields while retaining their existing codes and HTTP statuses.
Withdrawal requests made immediately after an API-key or subaccount permission grant now receive a retryable response while the change takes effect.
Affected requests return SERVICE_UNAVAILABLE (HTTP 503 or Connect Unavailable), allowing clients to retry instead of treating access as permanently denied. These refused attempts do not create withdrawals or reserve funds.
Deposits and withdrawals for unaffected accounts continue updating Funding balances even when many other accounts have transactions awaiting processing.
A large backlog on one chain no longer blocks Funding balance updates for unrelated accounts on that chain or other chains. Accounts with unresolved transactions continue waiting for those transactions to be processed.
API-key clients receive a retryable error when newly granted transfer permissions are still taking effect.
Trading-to-Trading transfers now return SERVICE_UNAVAILABLE with HTTP 503, or unavailable over ConnectRPC, during this brief delay so clients can retry.
Account ID and smart-account address filters now find newly processed Trading-to-Trading transfers from affected accounts.
New transfer flow summaries include the correct ownerAccountId and smartAccountAddress so either selector can find them. This change does not repair existing affected records.
Pending deposit and withdrawal updates continue in order once a temporary chain connection problem clears.
Brief chain timeouts and connection interruptions no longer cause an additional recovery delay before funding progress updates resume.
Fixed stale recipient balances after Funding → Trading transfers to another account.
Balances in the transfer form and wallet menu now update automatically for the main account and subaccounts, even when the recipient account is not currently selected.
Queued withdrawals avoid redundant waiting after payments in an earlier batch have succeeded.
Withdrawal confirmation and retry behavior for unsuccessful payments remain unchanged.
Transfers between Unified Trading and Funding now trigger automatic Funding balance updates without a page reload.
Automatic refreshes also cover deposits and withdrawals involving Funding, with follow-up refreshes to allow for settlement delays.
Customers can retry the same withdrawal request before its signed deadline once a temporary refusal clears, without creating a new request.
Temporary refusals, including too many withdrawals or transfers in progress, return a retryable error. Permanent refusals, such as insufficient funds, return their specific error on the initial attempt.
Account owners can retrieve their testnet season recaps when selecting a newly created subaccount after its account data has synchronized.
Subaccount fee-rate responses also use the parent account’s VIP tier, and transfer and funding histories preserve deleted subaccounts’ original identifiers.
QuickSwap deposits sent to a retired deposit address are now flagged for manual recovery instead of showing an automatic return.
Affected deposits show MANUAL_RECOVERY with reason DEPOSIT_ADDRESS_RETIRED and are not swapped or returned automatically. Contact support with your transaction details to request recovery. The QuickSwap’s final status remains unchanged.
Wallet users can retry the same withdrawal after a temporary submission failure without completing fresh MFA again.
Applies when the failure occurs before the withdrawal request is saved. Retries must retain the same withdrawal details and idempotency key, and the original MFA verification must remain valid.
After a temporary service failure, signed-in users can retry the identical rule change using their existing MFA verification while it remains valid.
Applies to creating, updating, and disabling automatic withdrawal rules. Retrying a completed request returns its saved rule version without creating another version; a different change or expired verification requires fresh MFA.
QuickSwap payouts now continue retrying after temporary timeouts instead of requiring manual intervention solely because the outcome is unknown.
Payouts can resume when services recover, without earlier timeouts consuming the retry allowance for subsequent balance or fee updates. Recovery also completes interrupted cleanup of small leftover balances.
Transfers between Trading accounts now release the sender’s reservation before reporting acceptance, including when completion resumes after an interruption.
Fixes cases where a completed transfer left its amount reserved in the sender’s Trading balance. Retrying an interrupted completion also preserves the accepted outcome of a transfer that already completed.
API clients receive a retryable conflict when concurrent requests compete to create the same withdrawal.
POST /v1/chain/trading-withdraws now returns HTTP 409 with Aborted for these conflicts, allowing clients to retry using the same idempotency key.
Reduced unnecessary delays to Funding balance updates when many unrelated accounts have pending movements.
Eligible updates for unaffected accounts can continue while affected accounts wait for their pending movements to resolve.
Fixed a condition that could stall withdrawals and internal transfers when an individual request encountered a processing error.
Subsequent valid requests can continue processing without waiting for the affected request to be resolved.
On networks with a configured expiry window, deposits never observed on-chain now end as dropped with an explicit reason.
If the source transaction is later observed on-chain, the deposit resumes and its previous drop reason is cleared. Deposits already observed on-chain are excluded from this expiry.
Withdrawals rejected during validation remain readable from history with their final status and rejection reason.
A later update to an already failed withdrawal no longer causes persistent 503 errors when retrieving its flow details.
Deposit, withdrawal and transfer responses now identify prolonged inactivity so clients can distinguish stalled flows from those progressing normally.
Flow summaries return isDelayed=true and estimatedCompletionUnixMs=0 when progress exceeds the expected wait plus a grace period. The threshold accounts for outstanding confirmations and source-chain block times. Delayed flows remain open and can resume normally; terminal flows are never marked delayed.
In “To another Polyester user,” verifying your own account now shows an error beneath Destination Account when both sides select Funding or both select Trading, even before choosing an asset.
The message explains that source and destination must be different accounts, and Transfer remains disabled for that selection. Switching between Funding and Trading clears this error, allowing valid transfers to proceed when other requirements are met.
Deposits, withdrawals and transfers that fail during balance settlement retain the initiating account’s smart account address.
Affected flow summaries and details preserve the original account ownership when reporting the failure.
Withdrawals and transfers made immediately after moving funds from Trading to Funding now wait for the incoming credit to be recorded.
Transfers back to Trading, transfers to other users, and Funding withdrawals resume automatically once the preceding credit is recorded, without duplicate processing. Movements involving unrelated Funding accounts can continue while that credit is pending.
Deposit and withdrawal details and lists remain readable when a failure includes an unrecognized reason code.
Affected flows retain their failure status and show a general rejection or processing-error message. Public API and realtime responses use the existing REJECTION_UNMAPPED or ERROR_UNMAPPED values instead of an unknown numeric code.
Fixed interrupted withdrawals that could leave funds unavailable or report acceptance without scheduling payment.
Stalled withdrawals interrupted before acceptance now automatically release held funds without requiring a client retry. Retrying a reserved withdrawal with the same idempotency key schedules its execution before confirming acceptance.
The withdrawal form offers “Add to address book” only after validation succeeds for the selected network, including for non-EVM addresses.
External Address Book forms now show network-specific placeholders, such as “Bitcoin Testnet address,” for non-EVM networks; EVM networks retain the 0x example.
Withdrawal and internal-transfer transaction details can catch up after a restart without recovery stalling on a large backlog.
Late transaction details retain their order, and interrupted history updates remain available for retry rather than being skipped.
Once processing reaches funds reservation, Trading-to-Trading transfers continue after a timeout or disconnect without requiring a client retry.
Interrupted transfers resume automatically after a service restart. Retrying with the same idempotency key returns the accepted result when the transfer has already completed.
After address changes, deposits and withdrawals retain the current asset mapping and its configured minimum amounts.
Deposit-address mappings also follow address changes, including capitalization-only updates, without losing the current account association.
Whitelisted withdrawal and internal-transfer destinations now show the shield aligned with the address text and copy icon.
Corrected the vertical alignment of the whitelist shield in address book rows.
Customers withdrawing to external chains no longer have to wait for manual intervention when interrupted fee updates leave withdrawals blocked.
Previously available network fees remain usable while updates reconnect automatically, preventing a temporary interruption from leaving withdrawals unavailable indefinitely.
Creating a deposit address or listing addresses for a specific suspended network now returns FailedPrecondition with the message "deposits on this chain are unavailable".
Unfiltered address lists exclude networks where deposits are disabled, even when an address already exists. Unknown or unsupported chain IDs continue to return InvalidArgument.
Deposits and withdrawals that need updated network or asset information can receive those changes without waiting for a manual service restart.
Previously, a connection interruption could leave network and asset information stale indefinitely; updates now resume automatically after connectivity returns while existing information remains available.
Flow history and transaction lookups retain access to subsequent pages when a transfer resumes during a request.
Transfer details show the current status after a previously dropped transfer resumes. History filters use the latest recorded outcome, preventing obsolete dropped entries from reappearing.
Funding flow API responses preserve completed outcomes when older pending updates are replayed after a restart.
Outdated pending updates no longer cause completed withdrawals to be treated as open again during startup recovery.
Users submitting a valid withdrawal no longer briefly see an insufficient-balance warning when their available balance updates during submission.
The withdrawal amount stays valid while submission is in progress and after it succeeds; if submission fails, normal balance validation resumes.
Deposits to a Funding account can continue while a transaction involving another account or asset awaits resolution.
A delayed transaction no longer blocks other users’ deposits merely because they share the same bridge. Transactions affecting the same Funding balance still wait in order.
Transfers confirmed on-chain now wait for earlier Funding credits when balance updates arrive out of order.
This prevents out-of-order updates from leaving an otherwise valid transfer without its expected Trading credit.
Withdrawals from Trading to Funding or external chains resume progress tracking when temporarily unavailable request information becomes available.
Affected withdrawal records survive restarts while awaiting the missing information, allowing unrelated accounts to continue processing. Recovery also avoids skipping earlier withdrawals after an interruption. This change does not restore previously lost records.
Deposits already included in restored funding balances no longer reopen as pending during recovery.
Deposits still in progress at the reset remain tracked so they can settle afterward.
When blockchain data arrives late during startup, affected transfers wait for the missing data and resume processing automatically once it becomes available.
Fixes a startup issue that could omit deposits or withdrawals when blockchain records arrived out of order or contained gaps. Missing records are requested again automatically so processing can continue in order.
Deposits, withdrawals, and transfers can now reach their final history entry after a restart when an early status step arrives before the remaining transfer data.
Recovery preserves early status steps until the matching update arrives, preventing that arrival order from leaving a transfer permanently missing from history.
QuickSwap API documentation now identifies 250,000 gas as a recommendation for native EVM deposits, rather than an enforced minimum.
Gas requirements can vary by network and deposit address. The updated guidance explains that first-time deposits on some networks require more than 21,000 gas, insufficient gas can cause an on-chain failure with network fees still charged, and unused gas is not charged. Returned values and deposit processing remain unchanged.
Withdrawals from Trading now recover automatically when their outcome is processed before the funds reservation is confirmed.
Failed withdrawals release held funds minus applicable fees, while successful withdrawals complete their balance updates. This prevents new occurrences of this timing issue; it does not repair previously stuck withdrawals.
Inconsistent deposit, withdrawal, or transfer records no longer prevent unrelated funding statuses and history from updating.
Affected updates can recover automatically when consistent information becomes available, including during recovery after a restart. Completed transfers retain their completed status while their details are repaired.
Fixed an issue where a Funding-to-Trading transfer could miss its Trading credit when bundled with another account’s withdrawal.
Transfers are now attributed independently within shared transactions. Bridge credits awaiting complete transaction information are retained across restarts and processed automatically when that information arrives. If an earlier Funding-to-Trading transfer appears to be missing its Trading credit, contact support to have it reviewed.
Subsequent deposits, withdrawals and transfers continue processing when a previously recorded movement reappears with conflicting details.
The original recorded movement, balances and flow outcome remain unchanged when the conflicting duplicate is rejected.
Fixed incorrect transaction references when multiple withdrawals share one on-chain transaction.
Funding and Trading withdrawals now retain the reference to their own withdrawal event, including when updates arrive out of order or are reprocessed. This keeps bundled withdrawals individually traceable.
This fixes transfer and withdrawal status after service restarts and delayed transaction updates.
Pending flow lists no longer retain settled transfers or withdrawals after a restart. Late fee or destination transaction updates preserve the settled outcome. Flow detail requests can return 503 Unavailable when current information is incomplete, rather than returning an outdated outcome or incorrectly reporting the flow missing.
Withdrawals confirmed on-chain after a submission timeout or processing interruption now settle their reserved balance and update their completion status.
This covers withdrawals processed individually or together. A transaction hash may appear in withdrawal progress before the network receives the transaction. Withdrawals already left unsettled by the previous version are not automatically repaired.
This affects withdrawals from Trading to Funding or an external chain when transaction submission is interrupted.
Affected withdrawals retry automatically when no payout occurred, while completed payouts finish settlement after a send timeout or restart without leaving funds held. Withdrawals already stuck before this update are not repaired automatically.
Real-time account and transfer updates retain known smart-account addresses after username or avatar changes.
Fixes a case where updating profile information could cause subsequent updates to contain an empty account address.
Independent requests from trading accounts can continue processing while another request encounters a temporary error.
Separate requests from the same account can also proceed, while processing steps belonging to the retrying request remain ordered.
Withdrawal and internal-transfer whitelist views now synchronize more reliably with on-chain changes.
Updates received during account setup are retained and applied automatically once setup completes. Delayed or repeated updates preserve the latest whitelist state.
Subscribers to deposit, withdrawal, and transfer updates are protected against delayed replays of previously reported final outcomes.
Delayed replays no longer recreate a finished flow with incomplete activity details after it leaves recent history. Newer status changes continue to appear.
API-key and wallet clients can read quota and retry information when transfers from Trading are rate limited, including from browser applications.
Rate-limited responses from POST /v1/chain/trading-withdraws and POST /v1/chain/trading-withdraws:wallet include quota, remaining allowance, reset timing and policy-version headers alongside Retry-After. The REST error body also includes structured rate_limit details, and browsers can access the response headers.
Trading-to-chain API requests with more decimal places than the destination token supports are rejected before funds are reserved.
Rejected requests return AMOUNT_EXCEEDS_ROUTE_PRECISION with an invalid_argument status, preventing network fee loss from unsupported amount precision. For a token with six decimals, withdrawal amounts must use at most six decimal places.
Internal transfer and Trading withdrawal APIs now retry certain temporary failures automatically and provide explicit guidance when clients should retry.
Affected internal transfer requests now return HTTP 503 with SERVICE_UNAVAILABLE and Retry-After: 1, instructing clients to reuse the same idempotency key. Affected withdrawal requests also return SERVICE_UNAVAILABLE with Retry-After: 1 and guidance to retry the same request while processing continues.
Users with corrupted saved search history can select a withdrawal asset and source account without clearing their browser data.
Unavailable withdrawal source accounts also appear dimmed when balances are hidden, making empty or disabled sources easier to identify.
Fixed an issue that could prevent new QuickSwaps from receiving a deposit address.
QuickSwap creation now avoids conflicts with previously issued addresses. Unrecoverable address conflicts return ADDRESS_CONFLICT with the affected swap ID (HTTP 409 for REST), with guidance to create a new QuickSwap using a new idempotency key.
When a deposit fee cannot be calculated, the form now shows “Unavailable” with a Retry option to refresh network information.
Deposit asset and chain searches now distinguish between no matching results and no available options. Deposit contract-address searches use standard asset rows and automatically select the chain when there is exactly one match. Withdrawal chain menus show applicable maximum amounts beside chain names, and the deposit network refresh notice has a clearer Retry control.
Support can now return eligible QuickSwap deposits using the token and network on which they were received.
Deposits remain held until support initiates a return. Returns require a supported asset and network and a valid predeclared return address; withdrawal minimums and fees apply. The swap status shows return progress and lists the withdrawal using the received token and network.
Interrupted QuickSwap payouts remain retryable after temporary balance-check failures.
A temporary balance-check failure during payout recovery no longer causes the payout to require manual recovery. The payout can continue through normal retries once balance checks recover.
Withdrawals from Trading to Funding or external chains now reject amounts that exceed current withdrawal capacity before reserving funds.
The error advises submitting a new request later or withdrawing a smaller amount. Repeating an already accepted request continues to return the existing withdrawal.
Fixed an issue where a QuickSwap payout containing service fees could block deposit and withdrawal status updates.
Affected flows could remain at the request stage even as on-chain activity progressed. This change prevents the payout-processing failure that stalled subsequent status updates.
Eligible QuickSwap bridge deposits larger than the quoted amount can now proceed to payout instead of being incorrectly placed on hold.
Bridge payouts now follow the amount actually credited, subject to applicable fees. Previously held swaps are not automatically retried by this change.
Fixed QuickSwap payout failures caused by amounts with more decimal places than the payout token supports.
Destination payouts, refunds, and returns now round down to whole token units supported by their routes. Smaller remainders are treated as rounding dust.
QuickSwap payouts now include the XRP destination tag, fixing a rejection that could leave funds unpaid after a deposit.
The fix covers swap proceeds, returned source funds, and refunds sent to XRP Ledger addresses requiring a destination tag.
QuickSwap bridge payout status now reports the amount delivered to the destination address without overstating it by the service fee.
Completed payouts reflect the delivered amount after service and network fees, matching the destination-chain transfer.
Fixed a deposit-routing issue that could leave QuickSwap deposits on hold instead of starting the swap.
QuickSwap deposits wait for ready processing capacity, preventing holds caused by incomplete deposit-routing setup.
Completed and failed transfers now recover their final status updates after an interruption during processing.
Fixes cases where live transfer progress could remain unfinished even though transfer history already recorded the outcome.
Deposit and withdrawal configuration now omits disabled asset routes, including those on enabled networks.
Clients using the deposit and withdrawal configuration API no longer receive disabled asset variants as supported options.
Available balances in the transfer dialog and amounts in transfer history now follow each asset’s display precision.
This corrects decimal formatting for assets whose display precision differs from their transfer input precision or the previous history default.
This fixes a keyboard handling error when entering withdrawal addresses or transfer recipients in Phantom’s Android browser.
Address-book fields now ignore keyboard events with missing key information, preventing an error during typing.
Withdrawal journey details now include the known destination-chain delivery transaction, making outgoing funds easier to trace.
Confirmed replacement transactions remain reflected in withdrawal details, including after completion and service recovery. Withdrawal fees, settled amounts and completion status are preserved.
Fixes an issue where deposit flow details could omit a charged fee when status updates arrived out of order.
Settled deposit fees retain their amount, asset, and settled status in lifecycle API responses. This change does not automatically repair previously affected historical flows.
Requests moving funds from Trading to Funding or an external chain now explain when an interrupted initial attempt is still being resolved.
Retry the same request while processing continues. Once an unaccepted withdrawal has finished recovery and its funds are released, the API asks you to submit a new request. Final failure updates wait for confirmed fund release.
Previously processed withdrawals can finish recovery when a system restart causes their completion to be retried.
Recovery also preserves completed internal transfers and released fund reservations without applying the same movement again.
Fixed an issue where reopening deposit, withdrawal, or transfer details could show the previously viewed transaction.
Switching transactions now shows the selected transaction or its loading state, including when reopening the dialog during its closing animation.
Fixed unexpected scroll behavior when opening deposit links that automatically update the selected asset or network in the URL.
Automatic URL updates now preserve normal navigation scroll behavior, including when returning to the deposit page through browser history.
Using Max for transfers from Unified Trading no longer rounds the amount above the available balance.
Transfer amounts now round down to the asset’s supported precision, preventing failures caused by tiny fractional balance remainders.
Improved address verification and dialog reopening, with clearer load errors and entry controls.
Address and account lookups now ignore outdated results after you change the destination. Reopening a closing dialog loads the newly requested entry. Failed address book loads offer Retry, and filters with no results show clearer messages. Deleting an entry asks for confirmation, while unavailable create, delete, and copy actions explain permission restrictions.
Fixed confirmation, cancellation, and retry handling in withdrawal whitelist and GuardSigner dialogs.
Reopened dialogs now keep delayed results from earlier requests from closing the new dialog. Failed whitelist changes remain available to retry, and GuardSigner setup waits for the requested operation to finish before reporting completion. Address book whitelist updates now clearly indicate when an update was submitted but confirmation is still pending.
Improved deposit address retries, dialog reopening, and returning to deposits after login.
Failed address requests keep their error and Retry option when you revisit the same network during setup. Deposit links preserve your requested asset while supported assets load. Reopening the deposit dialog starts fresh, and deposits interrupted by login resume with the requested asset.
Withdrawal API permission errors now identify the policy action an API key needs.
Errors now name missing permissions, such as READ_AUTO_WITHDRAW, while retaining PERMISSION_DENIED. The public auto-withdraw documentation clarifies that API keys need READ_AUTO_WITHDRAW or MANAGE_AUTO_WITHDRAW to read rules and runs, and can read only their own account.
Mobile users can open their connected wallet directly while a transfer or withdrawal awaits approval.
When a wallet app link is available, the confirmation dialog shows Open followed by the wallet’s name alongside Cancel, providing a manual way to reach the approval request.
Developers can identify the correct explorer for deposit and withdrawal transactions without inferring the network from a flow step’s source.
Flow steps include milestoneTxChainId, and their activities include txChainId. These values match chains returned by GET /v1/chain/deposit-withdraw/config, identifying the source chain for deposits and destination chain for withdrawal delivery transactions. Empty references and ledger settlement identifiers have no transaction chain. Previously processed flows may lack these fields.
The link opens an address book form with the destination and network prefilled, the active account selected, and whitelisting switched on.
When a matching saved entry is found, the form opens that entry for editing. Whitelist errors remain visible when leaving the address field, allowing the link to be clicked.
API key creation, sub-account setup, MFA, and withdrawal whitelist forms now use scrollable sheets sized for mobile screens.
The same layout applies to choosing a username, accepting terms, editing feedback submissions, and viewing the fee schedule. Fee schedule headings and spacing also adapt to smaller screens, and dialogs opened within a sheet stack above it.
Account holders can also set an optional USD minimum for each asset payout, keeping smaller amounts on the account for a later run.
Hourly schedules check at a chosen minute each hour and create no run when every payout is below its minimum. Biweekly schedules follow an anchor week, while monthly schedules use the last day of shorter months when necessary. All schedule times use UTC. When a USD minimum applies, missing or stale prices skip the affected payout and record the reason in run history.
QuickSwap now automatically returns wrong-asset, wrong-network and below-minimum deposits when the return route and address are valid.
These deposits are returned without trading, using the asset and network they arrived on. The API shows RETURNING followed by RETURNED, with WRONG_ASSET or DEPOSIT_BELOW_MINIMUM. Deposits that cannot be returned remain HELD for support. Amounts below the return minimum are not sent and show REFUND_BELOW_MINIMUM.
Account holders see less delay in transfer history and live notifications when many transfers are waiting to be processed.
Transfer amounts, notification contents, and the types of transfers shown remain unchanged.
Transfer History now shows asset logos, symbols, and names in a visible Asset column.
The Asset column appears between Time and Amount, making transfers involving different assets easier to identify.
Daily testnet reward claims now resume automatically after successful Discord or X verification once the verification confirmation closes.
Verification appears when you select Claim, with clearer instructions for each provider. The X confirmation no longer closes automatically and includes a Done button and a reminder to remove the verification code from your bio. The claim screen also shows a live reset countdown when available. If a resumed claim fails, it returns to the claim screen with an error so you can retry.
Failed transfers to Trading now show clearer explanations for common rejection reasons.
Messages explain when transfers are disabled for an asset, temporarily paused, or rejected because of an invalid amount. Each message states that nothing was moved, and invalid-amount errors prompt you to review the amount and try again.
Improved withdrawal form reopening, address validation recovery, and confirmation handling.
Reopening the withdrawal dialog starts a fresh form, even during its closing animation. After a whitelist-related rejection, the destination is rechecked when refreshed whitelist data becomes available. Wallet prompts stay within the confirmation dialog while it closes, and dismissing a failed confirmation clears its error from the form.
Accounts now offer private testnet season recaps and let external campaign reward recipients submit payout destinations through the authenticated rewards API. Daily Claims now require X or Discord verification.
Authorized API-key callers can retrieve subaccount details without the previous 503 error, and optional sections now require explicit query parameters.
GET /v1/auth/subaccounts/{id} and GetSubaccount no longer accept includeBalances or return balances. REST expansions use includeApiKeys, includeMembers, includeInvites and includePolicy, defaulting to false and remaining subject to caller permissions. Invitation filtering uses invitesDirection; snake_case query names are ignored.
API integrations must use an interactive session to manage saved destinations and tags, and REST authentication refusals now use structured problem responses.
Creating, updating, deleting or copying saved destinations and managing address-book tags require an interactive session; API keys retain read access. REST authentication refusals return application/problem+json with a top-level code: AUTH_AUTHENTICATION_REQUIRED for HTTP 401 or AUTH_SESSION_KIND_NOT_ALLOWED for HTTP 403.
Accounts with neither provider verified receive guidance when claiming, while available reward information remains visible.
Either verified provider is sufficient; both are not required. New claim requests without verification return SOCIAL_VERIFICATION_REQUIRED with the message “verify your X or Discord account to claim”. Existing claims continue processing if verification later changes.
Signed-in testnet account owners can retrieve recorded trading activity, VIP achievements, funding flows, and balances for past seasons.
Returns all recorded checkpoints newest first, covering the root account and its subaccounts, with an empty list when none exist. Recaps include daily activity, trading-hour heatmaps, earned badges, portfolio history, and season results. Access requires a signed-in session; API keys are not accepted. Money uses decimal strings, with incomplete values flagged and unavailable USD valuations omitted.
Recipients of external Testnet campaign awards can provide their payout address through the authenticated rewards API.
Submitting an address requires a session token and fresh MFA verification, saves the destination once, and makes the award ready for payout without transferring funds. Award reads now include the payout network, saved destination, fulfillment revision, and transaction ID once delivery is recorded.
Guard Signer management operations now consistently require session authentication. API keys can still read signer status.
Wallet creation, signing, batch signing, rotation and export reject API-key authentication with PermissionDenied and AUTH_SESSION_KIND_NOT_ALLOWED. Authorized session access remains available.
You can also return to the checkpoints list while a recap is loading, fails to load, or cannot be found.
The back arrow now appears before the recap loads, keeping the checkpoint title aligned across loading, error, not-found, and loaded states.
On slow connections, loading indicators remain visible while Polybots load in checkpoint cards, recaps, and video previews.
Changing the Polybot or card finish restarts the loading indicator, which clears when the video loads or reports a failure.
Accounts with overlapping referral discounts now use the active discount with the latest start time for spot fee rates and charges.
Discounts starting less than a millisecond apart remain distinct, so updating or removing one no longer overwrites or removes another.
Developers requesting approval for external withdrawal whitelist changes now receive an error when a destination exceeds its network’s address-length limit.
Validation applies to both additions and removals, including batch requests. One invalid destination rejects the entire batch without producing approvals. Address lengths are measured after hex decoding and must fit the network’s configured maximum, subject to a 128-byte ceiling.
Accounts holding newly listed assets can continue qualifying when the initial partial pricing hour is their only missing evidence.
VIP qualification now considers each asset’s own pricing history, so an older asset’s history cannot turn a new listing’s first partial hour into a pricing gap. That partial hour contributes no estimated portfolio value; genuine pricing gaps remain subject to qualification checks.
Session and API-key callers with READ_BALANCES permission can once again retrieve balances alongside subaccount details.
Set includeBalances=true on GET /v1/auth/subaccounts/{subaccount_id} to include balances in the response. Balance access follows the caller’s role and applicable policies. If requested balances are temporarily unavailable, the request returns a structured, retryable 503 error.
Fixed an error when leaving subaccount pages and corrected rendering issues in VIP history charts.
Navigating away from subaccount pages, including permissions, now avoids an error caused by account information becoming unavailable during the transition. Checkpoint VIP history charts also handle repeated tiers and show shared date labels only once.
Improved fresh MFA confirmation handling for Guard Signer actions.
When an approval, batch approval, signer rotation, or wallet export needs a new MFA confirmation, the API now consistently returns an MFA-required response.
Subaccount membership actions now reject requests that would change the owner's membership role.
Requests targeting the owner through member invitations, role changes, or removal return a clear owner-role-locked error. Previously issued invitations to the owner cannot be accepted, but can still be declined or cancelled.
Developers calling session-only daily-claim and reward-award endpoints now receive an explicit explanation that an interactive session is required.
API-key requests now return AUTH_SESSION_KIND_NOT_ALLOWED with the message "interactive session required" instead of a misleading 401. REST responses use application/problem+json; Connect responses use permission_denied with the same auth code. This covers daily-claim status and claiming, reward-award listing, and reward destination updates. Missing or ambiguous credentials continue to receive 401.
Subaccount realtime streams now notify affected members when their access is removed, granted, or changed.
An explicit removed flag lets integrations remove inaccessible subaccounts from their lists without a full refresh. Membership updates apply in stream order, even when the subaccount’s revision and updated_at remain unchanged.
Balance requests made immediately after creating and attaching a subaccount policy now wait briefly instead of incorrectly denying access.
Session and API-key requests wait up to two seconds, bounded by the request deadline. If the policy remains unavailable, REST returns HTTP 502 and Connect returns unavailable, allowing clients to retry.
Developers receive structured error reasons for affected account, API-key, policy, address-book, VIP and checkpoint requests while HTTP statuses remain unchanged.
Affected REST errors use application/problem+json with type, title, status, detail and code fields. Session-only reads rejected for API-key credentials return AUTH_SESSION_KIND_NOT_ALLOWED. The API reference now labels API-key listing and detail reads as requiring a session token, matching existing access rules.
Users can now add passkeys when their browser or authenticator omits optional connection information.
Passkey registration now accepts missing or empty transport information instead of returning an internal error, allowing affected users to complete MFA setup.
Developers can call GET /v1/balances/history with ledger=USDT or ledger=usdt to retrieve history for that asset.
Known numeric ledger IDs remain supported. Unknown symbols or IDs return HTTP 400 with guidance on accepted values. Omit ledger to retrieve all assets; an explicit ledger=0 is rejected.
Login and account APIs now distinguish retryable service outages from internal errors.
During authentication database outages, affected wallet-login, profile, MFA, API-key and subaccount requests now return HTTP 503 / Connect UNAVAILABLE with AUTH_TEMPORARILY_UNAVAILABLE (46) when processing failed without making a change. Failures with uncertain outcomes continue to return internal errors.
Developers can distinguish unexpected failures from temporary unavailability when updating sub-accounts or managing their members.
Unexpected sub-account update and membership failures return HTTP 500 with AUTH_INTERNAL_ERROR. Protected account changes that cannot start because of temporary unavailability return HTTP 503 with AUTH_TEMPORARILY_UNAVAILABLE and can be retried. Authentication REST responses also preserve the appropriate error status when errors are wrapped.
Wallet login and subaccount creation now report temporary signing unavailability with clear retry guidance instead of a generic internal error.
Affected requests return HTTP 503 with AUTH_TEMPORARILY_UNAVAILABLE (46). After service recovers, wallet login can reuse the same signed challenge while it remains valid.
The fix also prevents intermittent errors when creating, rotating, or exporting guard signer wallets while other requests are in progress.
Temporary service failures return retryable unavailability errors.
Testnet users holding faucet tokens in funding or trading accounts no longer lose their eligible assets’ hourly valuation for portfolio history and VIP qualification.
Faucet tokens are excluded from portfolio valuation without causing a pricing failure or a stale carried-forward total. Accounts holding only these tokens correctly have a portfolio value of zero.
Holding or moving non-tradable faucet tokens no longer causes missing season-end values and results in testnet recaps.
Faucet tokens remain listed by amount in balances, deposits, withdrawals and daily claims, and their operations still count. They are excluded from USD totals and marked as excluded from value in the checkpoint API. Hourly portfolio charts may still show approximate values.
New account and subaccount creation now returns a clear error when supported account capacity is exhausted.
Affected creation requests return RESOURCE_EXHAUSTED with the message “no new accounts can be created.”
People claiming Litecoin rewards now see an error when their payout address fails its checksum check.
Claims accept valid mainnet addresses beginning with ltc1, L, or M. Addresses beginning with 3 receive a specific unsupported-address message, and the address field highlights the mainnet requirement.
Traders can continue qualifying for VIP tiers when a valid USD conversion is available despite an unusable price on another conversion path.
USDT-quoted trades can still count toward VIP volume when the USDT/USD price is valid but an unrelated USDC/USD price is unusable. If one conversion path fails, another valid path can supply the price.
Fixed a cause of intermittent errors during wallet sign-in for new accounts and API-key creation.
These operations now handle delayed responses and simultaneous requests more reliably. Canceling one request no longer interrupts shared work needed by other requests.
Fixed an issue that could cause API key and policy requests to fail when processed concurrently.
Affected operations now handle concurrent requests more reliably. Temporary signing failures return AUTH_TEMPORARILY_UNAVAILABLE with HTTP 503 instead of an internal error, allowing callers to retry without saving partial changes.
Fixed an issue that could block wallet login and authenticated account requests when configuration updates were interrupted.
Wallet login, session requests, and API-key-authenticated account reads can continue during these interruptions. Rate-limit information may still be temporarily unavailable until updates resume.
API key details, policy views and sub-account invitations now catch up automatically after a service interruption.
Changes made during an interruption appear after recovery, including updated key labels and statuses, policy changes and invitation cancellations.
People signing in through the login dialog or connect page now see code delivery and verification errors directly below the relevant input.
Email and verification code errors are associated with their fields for assistive technology and announced as alerts. The verification code field also has an accessible label, and Google sign-in errors remain separate from email errors.
Tapping an entry in your main or sub-account address book now opens its details and available actions.
Phone rows show the entry name, shortened address, network badge for external addresses, and whitelist status. The details drawer provides editing, sharing, deletion, and copying to another address book where available. Visible alerts explain restrictions on creating or changing entries.
Traders no longer need another account change to refresh balances when a recoverable update is missed.
Recovery automatically refreshes trading balances and amounts reserved for orders, triggers, withdrawals and transfers. After failover, it also restores current reservation states and recently released reservations within the retained recovery history.
When verifying with an MFA recovery code, the Verify button stays disabled for entries containing fewer or more than 12 letters and digits.
The recovery code field now shows XXXXXX-XXXXXX as its example format, and hyphens and spaces remain ignored when counting characters.
Reduces delays in making new API keys available when large batches of account updates are being processed.
New API-key changes can progress more quickly through queued account updates, reducing the wait before they appear in API-key reads.
Accounts with complete hourly history can qualify for higher volume-based VIP tiers using priced settled volume even when some executions lack USD prices.
Missing prices do not reduce the previous automatic volume tier or introduce estimated contributions. GET /v1/vip/status reports completeness and incomplete-hour counts separately for settled volume and average portfolio value. Volume with price-only gaps is returned as a lower bound; incomplete average portfolio value is withheld. Missing hours or other volume defects continue to preserve the previous automatic volume tier.
Affected claims can now complete automatically after the underlying funding or payout configuration issue is resolved.
Pending claims retain their original rewards and retry on schedule without requiring a new claim. Retries also recognize payouts that already completed.
Fixed API keys continuing to appear unused after successful authentication.
API key details and lists now expose an approximate last-used timestamp after successful authentication. Updates may take a few minutes to appear.
Affected claims can finish on an automatic retry without users needing to claim the reward again.
Expired or previously released payout attempts can be retried after checking whether the reward was paid. Already-paid rewards are recognized as complete without another payment; uncertain outcomes remain pending for reconciliation.
Customers updating withdrawal or transfer whitelists can complete approvals when a brief chain indexing delay clears during automatic retries.
Affected approval checks now retry temporary chain indexing failures; if the failure persists, the approval API reports temporary unavailability.
Recorded claims now distinguish payout delays from available rewards and continue retrying automatically without another claim submission.
Daily Claim status reports PAYOUT_DELAYED with an optional payoutDelayReason for recognized payout failures, or PROCESSING for other pending failures. Paused campaign payouts return CLAIM_PAYOUT_UNAVAILABLE (HTTP 503). Existing claims retain their original rewards and retry automatically; users can check their status while waiting.
Affected daily rewards remain pending with their original amounts while automatic payout retries become less frequent.
Affected claim requests now return CLAIM_TEMPORARILY_UNAVAILABLE, including repeat requests during the retry delay. Automatic retries start after about one minute and progressively slow to hourly attempts. This change alone does not complete already stuck payouts.
Addresses interrupted updates that could leave 30-day trading volume and average portfolio value unavailable in VIP status.
Recent activity is refreshed before historical catch-up, and interrupted recovery can resume. Qualification metrics remain unavailable until the required history is complete.
Developers creating or renaming API keys receive a field-specific error when a label contains '<' or '>'.
The response returns INVALID_ARGUMENT with the message "label must not contain '<' or '>'", matching sub-account label validation.
Bots and other API clients avoid temporary authentication failures when account owners update or reassign API-key or sub-account policies.
This also covers creating a policy and immediately assigning it. If updating the affected keys fails, the policy change is rolled back without leaving those keys disabled.
Delegated members can continue viewing a shared subaccount after their role changes.
Subaccount reads retain the member’s updated role instead of incorrectly reporting that the subaccount was not found.
Already signed-in users who reopen a Google sign-in callback return to their saved destination or the spot markets page.
The page waits for session restoration before continuing, preventing stale sign-in links from sending authenticated users back to sign-in with an error.
Recipients now see the corrected dollar value when revealing or claiming a HYPE giveaway reward.
The displayed campaign value changes from $50.00 to $25.00; the HYPE quantity continues to come from each reward award.
When adding or editing a saved destination on mobile, the form scrolls while Cancel and save actions stay visible at the bottom.
Mobile address book editors now open as full-screen drawers with destination and details sections stacked vertically. Whitelist confirmations open from the bottom and prevent dismissal while confirmation is processing. Desktop editors also gain a scrollable form body.
Wallet login and subaccount creation now tell callers to retry the same signed challenge when verification is temporarily unavailable.
Recognized verification timeouts and connection failures return Unavailable without consuming the challenge. Callers can resubmit the same signed challenge while it remains valid.
Reward recipients also get an automatic dialog when a delivered award loads, once per device.
Reward cards display the fixed campaign value without an approximation symbol. Zcash claim forms now explicitly request a Transparent Address starting with t1 and limit input to 35 characters.
This applies to both the Unified Trading and Funding tabs while balances are loading on the trading page.
The Asset and Equity columns now use the table’s standard loading placeholders.
Signed-in testnet reward recipients can submit their payout address using their existing session token.
SetMyRewardDestination and PUT /v1/rewards/awards/{award_id}/destination now require only session authentication. The destination remains write-once, and saving it prepares the award for payout without transferring funds.
Fixed social verification dialogs extending beyond the visible browser area on short screens.
X verification now keeps the Verify button reachable while allowing instructions to scroll. Discord verification also gains scrollable content when vertical space is limited.
Signed-in users can retrieve account and sub-account details for accounts created while services are starting.
Fixes a startup timing issue that could leave affected account lookups returning unavailable after startup completed.
Inviter text now displays without vertical clipping in incoming sub-account invitations.
Text in the “Invited by” column has more vertical space, keeping letters from being cut off.
Clicking the wallet control with a mouse or pen now opens the account dashboard, and visible asset icons open the Assets tab.
Touch taps continue to toggle the wallet menu, while Enter and Space preserve keyboard menu access. Clicking the token icons beside Assets now displays your holdings.
When an X account is already linked to another Polyester account, verification returns a specific failure that applications can recognize.
GET /v1/auth/social/verification now includes an error_code field, returning AUTH_SOCIAL_ACCOUNT_ALREADY_LINKED for this conflict alongside an explanatory last_error message.
X account verification now handles repeated checks more reliably and shows clearer feedback for unsuccessful attempts.
Checks already queued or underway continue checking for a result without resubmitting. Expired, cancelled, or failed attempts display the relevant message, including guidance to obtain a new code when the previous one expires.
Accept and Decline are disabled for an invitation while its response is pending, preventing rapid presses from submitting it twice.
Declining an invitation that is no longer pending now shows an informational message and refreshes the invitation list instead of displaying an error.
Fixed selected trading pairs disappearing from API-key and subaccount permission drafts when market listings refresh.
Pairs that become unavailable during editing remain selected and display an availability warning. Availability warnings use different wording from subaccount policy conflicts and clear when a pair becomes available again.
Onboarding no longer completes unexpectedly when a username claim finishes after onboarding has been interrupted.
If you disconnect, switch accounts, or onboarding closes and reopens while your username is being claimed, the delayed result no longer completes onboarding for the changed account or closes the reopened dialog.
Fixed unexpected closures and stale information when reopening sub-account member dialogs.
Invitation, role-editing, and MFA requirement dialogs now retain the current selection when an earlier request finishes. Reopened invitation dialogs start with an empty recipient field, and earlier success timers no longer close the new dialog.
Eligible testnet users can choose their main account or an active subaccount they own to receive daily paper trading funds.
The “Credit to” picker appears when multiple eligible accounts are available, with the main account selected by default. The account issue banner and related reward-claim restrictions have been removed.
Testnet traders can collapse card customization beneath the recap and share buttons, while supported mobile shares include their checkpoint statistics.
Mobile cards render at higher resolution, with View recap and Share side by side above an initially expanded Customize card section. Loading placeholders reserve space for the card and controls. Share captions include VIP tier, traded volume and equity when available; desktop sharing sends the file alone. Share videos use larger card framing and export at 30 fps.
The desktop and mobile wallet menus now list accounts by balance, highest first, making funded accounts easier to find.
The order settles once balances finish loading or after two seconds, keeping live balance updates from moving rows while you choose an account. Accounts awaiting balances initially appear last, and failed balance loads display a warning with an explanation.
The Checkpoints overview now lists only saved recaps, removing the “In progress” placeholder card.
Season dates and the recap’s “Final value” date follow your time zone preference. The “Checkpoint saved” timestamp also shows the corresponding time zone abbreviation. Daily activity labels remain in UTC.
Session-authenticated clients can determine whether continued polling could reveal new campaign awards or payout updates.
The flag is true while a campaign can publish awards or the account has awards awaiting a destination, ready for payout, or failed and retryable. When false, clients can pause interval polling and check again on page load or focus. No next-check time is provided.
Recipients can open Litecoin’s website directly from the badge on their reward claim card.
The card displays the Litecoin logo and name beside Polyester branding, with the Litecoin badge turning blue on hover or keyboard focus.
Users can navigate between subaccount pages while keeping the current tab and query parameters.
The account name opens a searchable list, displayed as a popover on desktop and a bottom drawer on mobile. Transfer, Switch and Rename are grouped in the actions menu. Mobile users can also copy the account ID and, with the required permissions, rename, enable or disable the subaccount. The MFA requirement setting remains in the Security tab.
Users revealing a Litecoin reward now see embossed logos and a focused glow around the central emblem.
The blue scratch-off cover adds fine grain, directional highlights, and a raised card edge.
Account navigation now labels the page “API Keys,” and copying a Key ID briefly highlights it in green.
The API keys list has a simplified header with a “Filter API keys” field. On small screens, sub-account permission controls stack beneath their descriptions, and permission timestamps stay on one line.
The Assets tab lets you see which assets are held in Funding and which are held in Trading, with separate amounts and estimated USD values.
Funding is selected initially, and each view lists assets by USD value, largest first. Empty views explain whether to deposit or transfer from Funding to trade. Asset search appears when the account holds more than three assets across both views.
Account balance reads and live updates now reflect changes to trading, reserved, and available amounts after funding and order activity.
Reserved amounts include funds held for orders, triggers, withdrawals, and internal transfers; available amounts equal the trading balance minus reservations, floored at zero.
Recipients are guided to use a personal wallet or exchange HYPE deposit address that supports HyperEVM mainnet.
The address hint now explicitly tells recipients using an exchange deposit address to select HyperEVM as the deposit network.
Recipients now see guidance that centralized exchange deposit addresses are supported for HyperEVM reward destinations.
Delivered reward transaction links now open HyperEVMScan, and the HYPE reward claim card displays Beluga branding with a link to its website.
On phones, pending invitations show the inviter and role with inline accept and decline actions.
Member invitations open in a popover on desktop and a bottom drawer on mobile, with address book selection and role icons. Existing subaccount links redirect to the renamed pages. Font and localization lists scroll to the current selection when opened. GuardSigner key export adds a dedicated retry screen and automatically conceals the revealed key after 30 seconds or when the tab is hidden.
Opening VIP progress from the desktop wallet menu now displays the panel with a background and border suited to its position above the menu.
The VIP progress panel uses consistent popover styling while loading, displaying progress, or showing an error, and the desktop wallet menu now participates in the same visual layering.
Reward recipients now see t1 and tex1 examples when entering a payout address.
The placeholder reads “t1… or tex1…”, clarifying existing support for both transparent address formats without changing which addresses are accepted.
Recipients can now enter a mainnet tex1 transparent address when claiming a Zcash reward.
The reward address field accommodates tex1 addresses, and validation messages list both t1 and tex1 as supported formats.
Reward recipients also see the awarded token in the navigation button that opens their reward.
The reward claim form now shows a labeled “Replay scratch” button without requiring a hover, and replay remains unavailable while a claim is submitting. The navigation reward button uses a scratch-ticket design on wider screens and a token icon on compact screens. The daily reward button waits for reward availability to load, avoiding a brief appearance before an award takes its place.
Signed-in users can see newly available rewards and payout status changes sooner while using the app.
Reward information now refreshes automatically every minute instead of every five minutes, updating reward prompts and the reward dialog.
View and copy Polyester account IDs directly from Internal Address Book rows and entry details.
Account IDs appear before smart-account addresses, with dedicated copy buttons and confirmation feedback. Entry details clearly separate Account ID, Smart account, and Username. Entries without an available account ID show no account-ID copy action.
Welcome onboarding now takes users to their account dashboard, and testnet daily reward failures show clearer guidance.
Users with unfinished welcome onboarding now land on the account dashboard after signing in. The final onboarding action is labeled “Dashboard.” Daily reward messages explain when to retry, sign in again, or check back tomorrow, and identify claims already in progress or account restrictions.
Account and subaccount equity charts now offer 3-month and 6-month views.
Choose from 24H, 1W, 1M, 3M, and 6M when reviewing equity history. The 1Y option has been removed from these charts.
The public changelog is now available through REST, with endpoints for posts and filterable changes. REST contracts also adopt RFC 3339 order timestamps and renamed trigger and market-overview fields, alongside more consistent response schemas, errors, and WebSocket handling.
API clients can now distinguish an unreadable trigger from a readable trigger with no event history.
GET /v1/triggers/{trigger_id}/events now returns HTTP 404 with NOT_FOUND for unknown triggers or triggers outside the caller’s account or selected subaccount, matching Get Trigger. ListTriggerEvents returns the corresponding NOT_FOUND error. Readable triggers without events still return a successful empty list. Requests immediately after trigger creation may return retryable UNAVAILABLE (HTTP 503).
API clients should use GetBalances.reserved to retrieve aggregate held trading amounts per asset.
The unsupported ListHolds method, which previously returned UNIMPLEMENTED, and its request and response types have been removed from the public API. Individual hold identifiers and expiry times have no public replacement.
REST clients can now use the same self-trade prevention field when reading trigger lists and individual triggers.
Each trigger returned by GET /v1/triggers now exposes selfTradePreventionMode instead of stpMode, matching GET /v1/triggers/{trigger_id}; the mode values are unchanged.
API clients can now filter triggers using status=CANCELED or status=ARMED and trigger events using eventType=FIRED without receiving an invalid-filter error.
Trigger status, triggerType and eventType filters, order-side filters for open orders, order history and trades, and the order-history status filter now accept only documented, case-sensitive values. Older prefixed spellings, lowercase values and UNSPECIFIED values return HTTP 400. Omit eventType to retrieve all event types.
REST integrators must update timestamp parsing for affected order responses and spot pair schedules; Connect clients are unaffected.
The ts field returned by POST /v1/orders/cancel, /cancel-all, /cancel-all-after, /modify and /cancel-batch, and acceptedTs returned by POST /v1/orders/replace-batch, now use UTC RFC 3339 strings instead of seconds/nanos objects. GET /v1/spot/config also returns pairs[].listingAt and pairs[].delistingAt as RFC 3339 strings and omits them when unscheduled. Trade responses from GET /v1/spot/trades and GET /v1/spot/orders/{order_id} now include feeIsRebate when false. The REST reference clarifies decimal asset units, corrects required and optional fields for order modification and batch replacement, and provides corrected quantity, price, timeout and time-filter examples.
The generated API reference no longer advertises unsupported whiteboards, chart drawing layers, or saved layouts.
Removes reference entries for whiteboard sharing, drawing layers and inboxes, layouts, and layout-template subscriptions. Documentation navigation also omits empty groups, including Workspace.
REST clients must update response parsers because 12 price, quantity and volume fields have new names while retaining their existing decimal-string values.
Prices remain decimal strings in quote asset units, quantities remain in base asset units, and volumes retain their base, quote or USD units. Sparkline close prices also use a renamed field. ConnectRPC and WebSocket contracts are unchanged.
Developers can retrieve published changelog posts and filter individual changes through a public REST API.
Use GET /v1/changelog/posts to list posts, GET /v1/changelog/posts/{slug} to retrieve a complete post, and GET /v1/changelog/changes to query changes. Lists support pagination, and changes can be filtered by category, audience, product area, publication time, post, and whether action is required. JSON responses use base58 change identifiers and support ETag-based conditional requests.
REST order requests authenticated with a session token now distinguish bodies exceeding 256 KiB from malformed requests.
Oversized requests to order creation, preview, modification, replacement and cancellation endpoints now return HTTP 413 with code REQUEST_TOO_LARGE instead of HTTP 400 BAD_REQUEST. Responses use application/problem+json, matching the existing behavior for API-key requests.
REST candle responses now include all required fields when a candle series is empty, preventing parsing failures in clients generated from the published API schema.
GET /v1/spot/markets/{symbol}/candles returns candles: [] and referenceCandles: [] for empty series, plus nextPageToken: "" when no further page exists. Empty referenceCandles and nextPageToken fields are also included in populated responses. The API documentation now correctly describes symbol as a trading pair name such as BTC-USDT.
Public API documentation now explains validation requirements in plain language and makes existing field limits easier to find.
ConnectRPC descriptions retain readable validation messages, including time-range requirements. ConnectRPC and REST descriptions also clarify existing address, memo, authorization-message, and signature requirements. API behavior and validation limits are unchanged.
The public Connect OpenAPI specification now lists JSON as the only error response format.
Removed incorrectly advertised binary protobuf error responses from 65 public API operations. Successful responses continue to list both JSON and protobuf. This corrects the specification without changing runtime API behavior.
Developers now get consistent firing-price explanations across REST, Connect and WebSocket trigger-event references.
For stop-loss and take-profit triggers, the firing price is the price that crossed the trigger threshold; for trailing stops, it is the trailing threshold when fired; for ladders, it is the level price. This price also anchors a market child order’s slippage cap. Returned values and trading behavior are unchanged.
The REST reference now lists supported query parameters without misleading filters or duplicate parameter names.
Removed unsupported symbolId filters and duplicate camelCase parameter names from affected trading, chain analytics, and QuickSwap reference pages. Trigger cancellation explicitly documents its optional subaccountId query parameter.
REST API responses now retain required fields when their values are empty, false, or zero, aligning responses with their OpenAPI schemas.
Required fields include empty strings, zero counts, false flags, and empty arrays. Trigger slippage and trailing-distance alternatives are optional in the schema, with only the selected alternative returned, including when its value is zero. Unset optional trigger timestamps are omitted.
The public API reference now more accurately identifies which operations require session tokens, accept API keys, or need no credentials.
Address-book entry and tag changes and guard-signer wallet creation are documented as session-only. Trading withdrawals at POST /v1/chain/trading-withdraws are documented as API-key-only; session callers use /v1/chain/trading-withdraws:wallet. Unified asset balance and zipped asset supply analytics reads are documented as requiring no credentials. These corrections describe existing authentication behavior.
REST clients now receive absent fields when trigger events have no child order or orders have no batch-replace request.
Trigger-event childOrderId and order batchRequestId are omitted when inapplicable instead of returning "1". The REST reference also documents that postOnly defaults to false for ladders and stop-loss/take-profit limit children, and clarifies that ladder and TWAP triggers support cancellation but cannot be modified, paused or resumed.
API clients receive a consistent error format when no operation matches the requested path and HTTP method.
These responses use application/problem+json with type, title, status, detail and code fields, including the NOT_FOUND code and HTTP status 404.
Generated REST examples leave constrained optional filters empty to avoid invalid automatic filter combinations.
For GET /v1/spot/trades, examples no longer automatically fill orderId, lineageId, or throughGeneration. You can select these filters explicitly; throughGeneration requires lineageId, and orderId and lineageId are mutually exclusive.
Protobuf and SBE clients retain healthy pipelined sessions while connections that stop receiving responses or answering heartbeats are closed.
By default, connections close when an individual response write stalls for 10 seconds, or when 60 seconds pass without a completed response write or received pong. Quiet clients remain connected by answering heartbeat pings; disconnected clients should reconnect and resynchronize their account state.
Clients that stop consuming private order and execution updates are disconnected once their pending event buffer fills.
The connection now closes even when sending an update has stalled, allowing the client to detect the interruption and resynchronize its account state.
The POST /v1/orders/preview reference now describes resolved quantities and protective price bounds as decimal strings in asset units.
The reference removes the promise of quote debit and fees. It describes resolvedBaseQty in base asset units and protectedPriceBound in quote asset units per base asset unit, clarifying that the boundary is not an expected fill price. This corrects documentation without changing the API response.
Developers and market makers can look up error descriptions and transport statuses for order reads and writes in the generated API reference.
The reference restores missing Orders error catalogs and uses runtime classifications for documented HTTP and ConnectRPC statuses, including REST-specific exceptions. It also includes market-data, market-overview and order-book error catalogs.
GetQuickSwap now includes additional deposits sent to a completed swap’s address, marked RETURN_ONLY with a reason.
Deposit records include the source transaction, detection time, and available amount, asset and confirmation information, including information received later. The swap remains completed. RETURN_ONLY does not confirm a completed refund; return transactions and their hashes are not yet included in withdrawals.
This fixes missing flow history when viewing a smart-account address in Polyester Scan or filtering the public API by address.
Address-based filtering now returns the account's pending and completed flows, including deposit and withdrawal history.
Clients using /v1/ws/private can distinguish malformed sync requests from unknown subscriptions by their error codes.
A sync request without an id now returns INVALID_REQUEST. Requests with an id for an unknown subscription continue to return SUBSCRIPTION_UNKNOWN and echo that id. Stalled WebSocket connections are also disconnected when the shutdown deadline expires.
Developers calling GET /v1/rate-limits or GET /v1/trading/rate-limits can continue receiving limits from a usable previous configuration when a configuration update is rejected.
Fallback applies both at startup and during live updates. If no usable configuration exists, rate-limit lookups still return an unavailable error.
QuickSwap now reports EXECUTING and an execution start time only when trading begins.
Deposits held or returned before trading move directly from CREDITED to HELD or RETURNING. Bridge-only transfers move directly to PAYING_OUT. These flows no longer show misleading execution progress.
REST and ConnectRPC clients now receive a quantity error when an order is rejected for invalid sizing.
Invalid sizing returns HTTP 400 with BAD_QTY instead of INTERNAL_ERROR. Order modifications rejected for duplicate client order IDs or conflicting idempotency keys now consistently return HTTP 409.
Generated REST requests no longer automatically prefill optional query filters with synthetic values that can cause validation errors.
The default GET /v1/spot/trades example omits orderId, lineageId, and throughGeneration. The reference clarifies that orderId and lineageId are mutually exclusive and that throughGeneration requires lineageId. Explicit examples and documented defaults are preserved.
Developers now have corrected guidance on balance units, candle pagination, and interpreting order updates across the public API reference.
The reference explains that omitted account selectors use the bound subaccount for subaccount-scoped API keys, and that account balances use fixed 18-decimal units. Columnar candle pages run oldest-first within each page, with continuation toward older candles. Order versions cover execution state independently of fee totals, and cancel-all submission counts do not guarantee cancellation before execution. These documentation corrections leave runtime behavior and request and response formats unchanged.
API clients can use per-market reserve rates to calculate the quote balance needed for buy orders and inspect how effective trading fees are calculated.
Each market now includes separate fee reserve rates for ordinary and post-only limit orders. The breakdown exposes VIP tier rates, market multipliers, and applicable account and referral discounts, including their effective periods. An optional nextChangeAt timestamp identifies the earliest scheduled component change so clients can refresh their rates.
Developers and market makers can now find invalid-request responses and the 256 KiB request-body limit in the public REST OpenAPI specification.
Order write endpoints now document HTTP 400 for malformed or refused requests and HTTP 413 REQUEST_TOO_LARGE for oversized bodies. Trigger creation, modification, pause, and resume endpoints now document HTTP 413 alongside their existing HTTP 400 responses. These responses use application/problem+json; this update documents existing behavior.
Developers calculating quote amounts spent or unspent now have an explicit precision caveat for pairs whose base quantity scale exceeds nine decimal places.
The order API reference clarifies that each fill’s quote amount settles rounded down to 18 decimal places. cumQuote equals the settled quote amount before fees when the base quantity scale is at most nine; above that, it can exceed settlement by less than 1e-18 quote units per fill. This documentation update covers open orders, order history and individual order reads; returned values and settlement behavior are unchanged.
The public Changelog API adds support for Market data, QuickSwap and Rewards filters, plus product-area labels on post sections.
Integrations can filter changes using MARKET_DATA, QUICKSWAP and REWARDS, with up to 10 distinct surface filters per request. GetPost sections can include a surface for grouping or labeling content. REST omits this field when no recognized product area is available.
Developers reading balances, equity history or transfers receive error wording that applies consistently to REST and Connect requests.
Invalid or unknown subaccount errors now refer to “The subaccount ID” instead of “subaccount_id”. Error codes, HTTP statuses and request and response formats are unchanged.
Developers can distinguish account concurrency refusals from quota exhaustion using the documented status codes and response metadata.
OVERLOADED means the request was not admitted: ConnectRPC returns HTTP 429 with RESOURCE_EXHAUSTED, while REST returns HTTP 503. These responses omit Retry-After and RateLimit-* headers; retry after an outstanding request completes. Quota exhaustion remains HTTP 429 with RATE_LIMIT_EXCEEDED and quota metadata.
Developers recovering an earlier trigger creation result now have explicit guidance for retries after the trigger ends.
The contract clarifies that client trigger IDs are scoped to a sub-account, pair and trigger type. Identical requests return the same trigger while it is active and for 60 seconds after completion, cancellation or failure; conflicting requests within that window are rejected. After expiry, clients should use ListTriggers to recover the earlier result because reusing the ID can create a new trigger. This documents the existing behavior.
Public VIP tier and trading rate-limit catalogs now support ConnectRPC GET requests with conditional cache validation.
Clients can retrieve both catalogs using GET and revalidate cached responses with ETag and If-None-Match, receiving 304 Not Modified when content is unchanged. Successful responses retain the 60-second cache policy. Existing POST requests remain supported.
The public API reference now specifies a minimum reservation of 60 seconds after an order ends, replacing the previously documented 15 minutes.
Reservation can last longer than 60 seconds, so reuse is not guaranteed immediately afterward. If an ID is still reserved, reconcile the existing order with GetOrder and retry with a new client order ID. This corrects documentation without changing order processing.
Developers can distinguish successful ladder execution from cancellation or failure when interpreting trigger responses.
The reference now explains that a ladder completes only when every child order fills, describes cancellation causes beyond user requests, and confirms that executed quantity is retained after completion, cancellation or failure.
API consumers can now see that orders already being canceled count as submitted cancellations rather than failures.
The field descriptions explain that matched orders exclude orders placed after request acceptance, cancellation completes asynchronously, and dry runs report only matched counts. Failed cancellations identify orders the request could not cover; if those orders remain open, submit a new cancel-all request with a fresh request_id. This change updates documentation without changing cancellation behavior.
Polyester Scan now offers a dedicated brand kit with downloadable logos, guidelines, and mobile-friendly asset previews. Search and transaction displays are more reliable, and address links now work in older browsers.
Find branding materials for articles, marketing campaigns, and social profiles in dedicated pages on both sites.
Download logo assets individually or as a ZIP, copy logos to the clipboard, and consult brand guidelines. Polyester also includes typography and colors, imagery, searchable token artwork, and avatars. Right-click either site's header logo for copying, downloads, and guidelines.
Visitors see loading failures sooner when statistics counters or charts receive a 4xx response.
Counters and individual charts now stop automatic retries after a rejected request and display their existing error messages.
Users in affected browsers can view address links that lead to Polyester Scan or an external chain explorer without a rendering error.
Explorer link resolution now handles browsers missing a newer URL parsing feature while preserving the appropriate destination for each chain.
Polyester Scan also updates search history clearing, keyboard navigation, and links between asset and chain pages.
Chain transactions retain their details heading when a related flow cannot be found or loaded. Clearing recent searches in a filtered view preserves history from other categories. Search category selection moves the highlight to the selected category’s first result. Unified asset pages accept asset symbols as well as IDs, and asset and chain names link to their detail pages. Token pages show source contract information or native asset labels and link to the associated unified asset.
Table loading overlays no longer overlap surrounding page controls.
Loading overlays stay layered within their tables, including on the Accounts and Transactions pages.
Visitors to the Polyester and Polyester Scan brand kits can tap asset previews on small screens to access SVG files.
Logo and wordmark variants now appear in two columns on smaller screens, placing light and dark versions side by side. Download and copy controls remain available through hover on larger screens or keyboard focus.
The API reference now provides clearer service navigation and richer request details, including parameter examples and previously missing nested schemas. REST examples also use valid, consistent ID formats.
Developers using the API reference now see base58 identifiers in request paths, query parameters and JSON bodies.
Public identifier examples, including subaccount, owner and policy IDs, now match the REST API’s expected encoding. Example IDs still need to be replaced with IDs from the target environment.
The API reference now organizes services into dedicated QuickSwap, Rewards, Changelog, and Testnet sections.
QuickSwap services appear under QuickSwap, reward campaigns under Rewards, and checkpoints and daily claims under Testnet. Swap appears under Trading. REST and ConnectRPC references use consistent groupings.
Developers can inspect previously missing request and response structures in the per-service OpenAPI documents for address books, API keys, authentication and subaccounts.
Referenced nested objects now include their schema definitions, allowing documentation readers and OpenAPI tools to resolve those structures.
Visitors with saved appearance preferences see their selected light, dark, or system mode immediately when opening documentation and pre-rendered announcement pages.
Saved font selections also apply before the page first appears, while custom themes and trading colors continue to load afterward.
Developers using the API reference now see base58 ID examples that match REST parameter requirements.
Generated parameter examples use the documented REST format and are omitted when they cannot be converted safely. The trigger pause endpoint also includes matching request and response examples.
Developers using the public REST reference now see a consistent trigger ID throughout the pause example and PAUSED as the successful response status.
The URL, request body, and response examples use the same trigger ID, replacing inconsistent IDs and the incorrect CREATED response example.
API reference navigation now groups QuickSwap, Rewards, and Testnet services into dedicated sections.
QuickSwap services appear under QuickSwap, reward campaigns under Rewards, and checkpoints and daily claims under Testnet. Swap appears under Trading, and Testnet is listed last. REST and ConnectRPC references use consistent service groupings.
Developers can use sample filters, pagination values, and identifiers when exploring requests in the API playground.
Examples now cover order history, triggers, market data, funding flows, and account queries. Order and trigger lookup examples use base58 identifiers matching their documented formats.
Developers can now find guidance on social-verification failures, trigger slippage failures, and duplicate market-trade events.
Trade-history documentation explains how to list all account fills and combine order filters. Market-trade stream documentation advises deduplicating replayed events by matchId. Trigger pause examples now show a paused response.
The mobile menu now lets you compare gateway latency and switch regions, while scheduled maintenance notices show local downtime and offer five games with pause and saved best scores. Pages also require less startup data, with additional browser and responsive-layout fixes.
Users can compare gateway latency and switch between the regions available on their network from the navigation drawer.
Expand Gateway to see latency in milliseconds and a checkmark beside the selected region. Switching gateways reloads the page. If the selection cannot be saved, the menu displays an error asking users to allow cookies and try again.
Advance notices show upcoming downtime in your local time zone, and the maintenance page automatically returns you to your requested page when maintenance ends.
Dismissible notices announce scheduled maintenance. The maintenance page shows an expected return time during the scheduled window and offers Bounce, Stack, Squash, Candles, and Flap, with saved best scores and a mute control.
During scheduled maintenance, visitors also see larger text and a layout that adapts to desktop and portrait windows.
The game menu fits its contents and expands when a game starts. Maintenance text and games appear side by side in windows at least 768 pixels wide and at least as wide as tall; stacked layouts vertically center the text and game menu together.
Signed-in users can now access both links from the More menu on narrower desktop screens.
When the desktop navigation hides the Docs and Announcements buttons, both destinations now appear in More. On wider screens, they remain in the main navigation.
People using outdated browsers receive update instructions, while unsupported in-app browsers show steps to open Polyester in Chrome.
The notice includes a copyable page link and, for Chrome users, a direct update link. Browser guidance appears in English.
Touchscreen users with wide landscape viewports can access app content previously covered by the desktop-only notice.
The notice now appears only at viewport widths of 767px or less; touch input and a short viewport no longer activate it or lock page scrolling.
Visitors whose browsers cannot play the homepage video now see cycling coin images while the headline continues animating.
Fallback images appear when video playback fails or no initial frame appears within three seconds, with smooth transitions between coins.
Visitors see the announcements carousel only when announcements are available for their environment.
When announcements are disabled, the home page omits both the announcement cards and their preceding divider.
Fixed inconsistent theme styling when loading Polyester in Firefox.
Pages now retain their intended theme appearance when page styles load in a different order.
Players can finish an active or paused game and view their final score before returning to Polyester.
When maintenance ends, the page displays a back-online notice and a Continue to Polyester button for players with a game open. Leaving the game returns them to Polyester, while visitors outside a game return automatically. Bounce also becomes progressively harder over the first 90 seconds, with a shrinking ball and faster movement.
Users opening the app on slow or metered connections have less startup data to download.
Reduces the initial app download by keeping optional functionality out of the startup code.
Traders download less navigation data when opening a trading page, with the same menus and account links available.
Account navigation icons no longer contribute to the initial app download through the shared mobile navigation links.
During scheduled downtime, choose between five games and keep your best score even when you quit or restart a run.
The menu shows each game's best score and highlights your last selection. Pause manually or automatically when switching tabs or leaving the window, then resume with a 3-2-1 countdown. Controls sit above the playfield, keeping mute accessible after game over and scores clear of game graphics. The layout scales to short and landscape screens, and clicking mute no longer interrupts Space-key play.
Polyester pages include less repeated styling data, allowing browsers to reuse cached styles across page loads.
This reduces page response sizes and repeated downloads of larger stylesheets when those styles are already cached.
Polyester’s 404 page now features updated background imagery and animation in light and dark modes.
When you visit a missing page, the updated visuals appear both before and during animation playback.
The homepage engine illustration now supports touch interaction, with repeated clicks or taps adding faster animation and more highlights.
Interact with a chain icon to animate its connection, or the central engine to animate all connections. Repeated presses build up the effects, which gradually settle after release.