Mainnet runs
production-v0.11.0. This page tracks what is live in production, anchored to the production release that shipped each change; verify the running version at any time with GET / on https://api.arcus.xyz. Changes reach testnet first — see the testnet changelog for what is queued ahead of production.API changes
markTieronGET /v1/markets:FASTmarkets use a 30-second off-hours mark EWMA and a 10-minute band-expansion clock (STANDARD: 2.5 minutes and 1 hour); see Mark tiers.GET /v1/corporateActionsandGET /v1/corporateActions/{market_id}list splits, reverse splits, and stock and cash dividends per market;upcomingCorporateActionsonGET /v1/marketscarries the ones still ahead.
Authentication
POST /v1/transferalso accepts theX-API-Key/X-Timestamp/X-Signatureheaders, with an Ed25519 signature over aTransferV1payload and no bodysignature. A key scoped to one subaccount can transfer only from that subaccount; wallet-signed transfers work as before.
Stability
GET /v1/ordersqueries filtered to a final status (filled, cancelled, rejected, liquidated, ADL) no longer time out on accounts with large order histories.- Signed WebSocket order posts have lower latency.
WebSocket / Order book
- Order acks and rejections are sent ahead of queued subscription data, so a subscription backlog no longer delays them.
- Market-data fan-out is faster under heavy load; message contents and order are unchanged.
API changes
POST /v1/adjustIsolatedMargincan remove an isolated position’s unrealized gains, down to its initial-margin requirement.- A single USDG
POST /v1/withdrawis capped at $1,000,000 and returns400above it; split larger amounts.
Order management
- TP/SL legs attached to an entry order arm when a liquidation fills the entry.
- TP/SL legs attached to an entry order stay in place when the position closes while the entry still rests, and re-arm on its next fill.
Fixes
- A cancelled TP/SL order keeps its limit
priceonGET /v1/orders,GET /v1/order/{orderId}and theorderschannel.
Multi-asset collateral
- Stock Tokens now count at their
multiplier. Each token is valued asmultipliershares for loan capacity, the liquidation line, withdrawals and deposit limits, andsettleLoanand liquidation sales are sized the same way; see The Stock Token multiplier.
API changes
- A
STOP_LOSSorder onPOST /v1/placeOrdercan setreduceOnly: falseto open a position in the trigger direction when it fires;TAKE_PROFITorders and TP/SL legs in a batch still requirereduceOnly: true. - Net deposits and cumulative funding on
GET /v1/account,GET /v1/positionsand WebSocket account snapshots are served from a short-lived cache: net deposits update on every transfer, and cumulative funding can trail by one payment for up to about 15 seconds after each hourly funding payment.
Order management
POST /v1/modifyOrderkeeps the order’sorderId,createdAtand fill state;quantityis the new total size including any filled amount, and a total at or below it is rejected withMODIFY_SIZE_ALREADY_FILLED.- A same-price size decrease keeps queue priority; a price change or size increase rejoins at the back of the queue.
- Each modify arrives on the
orderschannel as aCANCELEDupdate withcancelReason: "MODIFY_CANCELED", then the order’s new state under the sameorderId; if the engine rejects the modified order, the original is removed too, while a request rejected with HTTP400leaves it in place. See Modifying orders. - TP/SL placement checks
stopPriceagainst the mark price, the same price that triggers the order:POST /v1/placeOrderandPOST /v1/batchPlaceOrdersreject a trigger already crossed withInvalidRequest.
Fixes
- Cancelled orders no longer reappear in
GET /v1/openOrdersor theorderssnapshot after a deploy or restart.
Stability
- WebSocket order and cancel acks have lower tail latency.
- Order book updates fan out faster over WebSocket; message contents and order are unchanged.
API changes
POST /v1/placeOrderplaces a single take-profit or stop-loss order whentpslTypeis set, withstopPriceandreduceOnly: true; the response echoesstopPriceandtpslType.sourceAccountIdanddestinationAccountIdonGET /v1/accountTransferUpdatesuse the same 22-byte ID as theaccountTransferUpdateschannel; re-key any stored REST IDs.GET /v1/spotAssetsreturnsmultiplier, the underlying shares per token; it is informational.
API changes
GET /v1/fillsandGET /v1/ordersreturn the last 30 days whenfromis omitted; passfromfor older history.- Subscribe to
bboororaclePriceswiththrottleMs(100,250,500,1000or2000) to receive at most one frame per window. - Each
l2OrderbookUpdatesdelta carriestimestamp, the engine processing time in epoch microseconds, as onbbo. - The WebSocket
rateLimitget-method reports realorder.usedandcancel.used, matchingGET /v1/rateLimit.
Trading
- Off-hours trading bands on
GET /v1/marketsand themarketAttributeschannel match the margin settings the engine enforces.
Stability
- A WebSocket connection that fails API-key authentication 100 times in a row is closed with code
4401; fix the key rather than reconnecting.
Fees
- Separate RWA and crypto schedules: from 2026-10-23 00:00 UTC, RWA perpetuals (equities, commodities, indices) and crypto perpetuals each have their own fee schedule, listed on
GET /v1/markets/feeSchedulesand asfeeTiersonGET /v1/markets. See Fees and the announcement for rates. - Lower tier thresholds: tier volume thresholds are halved on both schedules (
GET /v1/feetiers). - Combined volume: crypto and RWA volume count together toward your tier.
Multi-asset collateral
- Multi-asset collateral (early access): eligible Stock Tokens and WETH (wrapped ETH) can back perp margin through an automatic USDG loan.
- New
GET /v1/spotAssets,GET /v1/lendingAttributes,GET /v1/spotPositions,GET /v1/spotFills,GET /v1/interestandPOST /v1/settleLoan, with thelendingRates,spotPositions,spotFillsandsettleLoanResultschannels;GET /v1/accountcarries the loan fields andPOST /v1/withdrawwithdraws collateral withspotAssetId.
API changes
tradingFeeTieronGET /v1/account/statsreturns your fee tierlevelandfeeDiscountPpm(the referral fee discount, omitted when zero) instead of maker and taker rates.- The
orderschannel snapshot includes recently closed orders from the last 28 days only. - Deposit rows on
GET /v1/accountTransferUpdatesand theaccountTransferUpdateschannel carryrootchainQueueIndex, used to claim a refund for a rejected deposit.
Referrals
- The commission rate schedule lists the Max tier (level 6).
Trading
- Accounts blocked under the Terms of Use can create API keys.
Stability
- Fixed:
avgFillPriceon REST and theordersandaccountWebSocket channels is the exact average fill price instead of being rounded down to a whole tick.
Trading
- Auto-close liquidations charge a per-market liquidation fee, published as
liquidationFeePpmonGET /v1/markets.
API changes
- Every
accountTransferUpdatesevent carriesstatus(APPLIEDorREJECTED), with the reason code inrejectReasonon a rejection. GET /v1/accountTransferUpdatescan return the generic rejection statusREJECTED_UNKNOWN.
Referrals
- An invite code is only for gaining trading access:
POST /v1/affiliate/redeemInviteby a caller who can already trade returns409and the code is not spent. Redemption links you to the code’s owner by address (the owner no longer needs a referral code) and never moves an existing referral. - A caller who cannot trade yet can register on
POST /v1/affiliate/registerAffiliateby spending one of the code owner’s unused invite codes, which grants trading access;403or409when the owner does not allow it or has none left, and502(nothing registered, safe to retry) when the access grant fails. GET /v1/affiliate/infoaddstraderCount, and its referred-volume and commission totals now cover your whole T1/T2/T3 downline, perps only.GET /v1/affiliate/refereesrows addvolumeAllTime, and aparentfilter pages one referee’s sub-tree.POST /v1/affiliate/createCodeandmodifyCodereject a string that is already an invite code with409(“not a valid referral code”).- Spec correction: invite codes are earned on your own lifetime perps volume plus the all-time volume of your direct referees; deeper levels do not count.
Trading
- Accounts blocked under the Terms of Use are close-only: they can cancel orders, place reduce-only
IOCorFOKorders to reduce or close a position, and withdraw. Every other trading request returns403.
Referrals
- Redeeming your own invite code on
POST /v1/affiliate/redeemInvitegrants you trading access if you don’t have it yet; the code is spent and no referral binding is created.
Stability
- Fixed: a market’s leverage change now shows on
GET /v1/marketsas soon as the engine applies it, and markets listed after launch appear on the unfiltered list. - Fixed:
GET /v1/leaderboardno longer reports an overflowedfeesPaidfor traders whose net fees are negative (maker rebates).
API changes
- Markets listed after launch are served like the rest: they appear on prices, mids, candles,
GET /v1/leveragesand the WebSocket channels, and their order rows show the market ticker. - REST list responses carry
total, the number of items in the returned page (not the size of the full result set), onGET /v1/trades,/v1/candles,/v1/orders,/v1/openOrders,/v1/fills,/v1/positions,/v1/funding,/v1/fundingRatesand/v1/accountTransferUpdates. GET /v1/apiKeysis bounded and paginated: keys come back newest first, capped bylimit(default and maximum 1000), andfrom/tofilter oncreatedAtin epoch milliseconds. An invalidlimit,fromortoreturns400.
Stability
- Fixed: the WLFI-USD market’s price-increment tiers now use the correct anchor price.
- Fixed: withdrawals submitted in quick succession no longer stall before being sent on-chain.
Referrals
- The referral program is in the API reference: create, rename and revoke referral codes, register as a referee, and read referees, commissions and claims under
/v1/affiliate/*, plus the commission rate schedule. - Invite codes are live:
GET /v1/affiliate/inviteCodeslists the codes you have earned (one per $1M of lifetime perps volume), andPOST /v1/affiliate/redeemInviteredeems one, granting trading access and binding you as a referee of the code’s owner. - New
GET /v1/leaderboardranks traders by volume, realized PnL or fees over a rolling window. - Referral payouts appear as
REFERRAL_CLAIMtransfers onGET /v1/accountTransferUpdatesand theaccountTransferUpdateschannel.
API changes
- New
GET /v1/fill/{tradeId}: look up the single fill an account owns for a giventradeId. GET /v1/leaderboardaccepts anaddressto return just that trader’s row, and every row carries itsrankon the activesortBycolumn.GET /v1/affiliate/infoaddstotalReferredVolumeAllTime, the lifetime notional volume of all the affiliate’s referees.- Spec correction: the
GET /v1/affiliate/infospec now names the affiliate’s trailing-30-day volume fieldvolume30d, matching what the API already returned (it was documented asrollingVolume). No client change is needed. - New
POST /v1/affiliate/modifyCode: rename your referral code in place; existing referees stay attached. - API keys can be scoped to every subaccount of an address:
POST /v1/createApiKeyandPOST /v1/revokeApiKeyacceptaccountIndex: 255, and key rows onGET /v1/apiKeyscarry anallSubaccountsflag.
Order management
POST /v1/scheduleCancelaccepts an optionalmarketIdto arm a per-market dead man’s switch, independent of the account-wide switch. A wallet may hold a bounded number of armed switches; arming beyond it returns429, and refreshing an armed switch is always allowed.
WebSocket
- Equity and free collateral streamed over WebSocket now net funding that has accrued but not yet settled, matching the values the margin engine uses.
Orders and fills
- Partially filled orders that are then canceled now report
avgFillPrice. ACANCELEDorder withfilledSizeabove zero onGET /v1/orderscarriesavgFillPrice, the volume-weighted price of its fills; until now it was omitted. closedPnlon closing fills is now computed from the cost basis the fill releases. OnGET /v1/fills, a fill that reduces or closes a position reports its notional against the cost basis it releases, minus the fee, instead of using a truncated per-unit average entry price. Opening and add legs still report−fee.- Liquidation fills now report
closedPnl. The liquidated account’s leg of a forced closure (liquidation.methodLIQUIDATION) onGET /v1/fillscarries the realized PnL of the close, net of taker trading fees (the liquidation penalty included infeeis not deducted); until now it read"0". Earlier liquidation fills are not backfilled.
WebSocket
- WebSocket connections now receive a
1001(Going Away) close frame before the server drains them on restart, instead of being closed without a close frame.
Liquidations and risk
- Liquidation orders closed on the book carry the limit price the engine computed for the close, or
0when that limit is not a positive price. - Liquidation updates report the full fee charged, including the liquidated account’s taker trading fees, and forced-close order rows (liquidation and ADL) report
avgFillPrice. - Orders, modifies, and fills that would take a position past the engine’s maximum position notional, one fixed bound for all markets (about $922M), are rejected with
POSITION_SIZE_CAP_EXCEEDED. - A triggered TP/SL order keeps its trigger metadata on its terminal cancel, so
GET /v1/order/{orderId}still shows the stop after an IOC partial fill.
Margin
- Per-account isolated margin is now enabled in production. Set a market to isolated mode with the optional
isolatedflag onPOST /v1/setLeverage, move collateral onto or off an isolated position’s leg withPOST /v1/adjustIsolatedMargin, and read the mode frommarginMode/isolatedon position rows,GET /v1/leverages, and theaccountAttributeUpdateschannel. The API surface shipped inproduction-v0.1.10.0and readCROSS/falsefor every account until now; isolated behaviour is active for all accounts as of this update. Testnet has carried the full mechanics sincetestnet-v1.8.0— see the testnet changelog for the detailedmarginUsed, rejection-reason, and streaming semantics.
WebSocket / Order book
- Subaccounts across the account-scoped channels —
account,positions,orders,userFills,funding,accountTransferUpdates, andaccountAttributeUpdates: an optionalaccountIndex(0–9), part of subscription identity and echoed on every frame. Omit it for subaccount 0. - Position and order rows carry a per-account
sequenceNumber(the same counter asAccountUpdate.sequenceNumber); theorderssnapshot carrieslastSequenceId, matchingpositions.
API changes
- Referral codes are non-resolvable to wallets:
GET /v1/affiliate/myReferrerredacts the referrer address.
Markets
- 13 new crypto markets enabled and tradeable: DOGE, ENA, PUMP, NEAR, PENGU, FARTCOIN, SUI, WLFI, LINK, BNB, TAO, AAVE, UNI.
Breaking changes
from/toonGET /v1/fundingandGET /v1/fundingRatesare epoch microseconds, matching the unit each response reports. Millisecond values are now rejected.
API changes
- New
marketfilter (ticker or numeric id) onGET /v1/prices,GET /v1/mids,GET /v1/positions,GET /v1/leverages, andGET /v1/funding; an unresolvable value returns 400. - New
statusfilter onGET /v1/ordersandGET /v1/openOrders:OPEN,UNTRIGGERED,FILLED,CANCELED,REJECTED,LIQUIDATED,ADL. - New
sidefilter (BUY/SELL) onGET /v1/ordersandGET /v1/fills. Therolefilter onGET /v1/fillsnow matches correctly. netDepositsonGET /v1/accountand theaccountschannel reports real lifetime net deposits.
Order management
- New
POST /v1/scheduleCanceldead man’s switch: arm, refresh, or disarm a per-subaccount deadline; if it elapses the gateway firescancelAllOrdersfor that subaccount. GET /v1/positionsno longer returns 500 when the oracle price read times out.- Position rows and
GET /v1/leveragescarrymarginModeandisolated. When this release shipped both readCROSSandfalsefor every account, as per-account isolated margin was not yet enabled in production; it has since been turned on (see the latest entry above). - Cancel + place: every modify emits CANCELED (cancelReason: MODIFY_CANCELED) then the replacement outcome —PLACED, fills, orREJECTED— under the same orderId. Same-price size decreases keep queue priority. You can expect to see the cancel + place/fill messages on the same GSN but increasing account subsequence numbers for clarity about ordering. Cancels should always arrive first before any fills/place from the newly modified order.
WebSocket / Order book
marketfilter onpositions,orders, anduserFillssubscriptions and on thegetRPCs forfills,orders,positions,leverages,mids, andprices. It is part of subscription identity, sounsubscribemust repeat it.userFillssubscribe acceptsnFills(1–500, default 500) to bound the initial snapshot.isolatedandmarginModeare always present onaccountAttributeUpdatesleverage entries.- A fill could produce a duplicate account snapshot with a repeated
lastSequenceId, and anAccountUpdatecould be applied twice when a snapshot was scheduled.
Markets
- CPER-USD, GME-USD, and QNT-USD are enabled and tradeable, having been listed offline in
production-v0.1.8.
API changes
- New filters on
GET /v1/ordersandGET /v1/fills: amarketparam (ticker or numeric id, case-insensitive).GET /v1/fillsalso gets aroleparam (MAKER/TAKER). The same market filter works onGET /v1/markets. GET /v1/apiKeyswith noaccountIndexnow returns keys for all subaccounts under the address, each tagged with its ownaccountIndex(previously just the default one).
Authentication
- API keys can carry a
withdrawpermission, allowingPOST /v1/withdrawto be authorized with an Ed25519 API-key signature instead of a wallet signature. Keys created through the publicPOST /v1/createApiKeyremain trade-only. POST /v1/createApiKeyandPOST /v1/revokeApiKeyaccept an optional single-usenoncefor replay protection; a replayed nonce returns HTTP 409.
Rate limits
GET /v1/openOrderscosts less against the account rate limit: the per-item charge is now one unit per 50 orders returned, down from one per 20, so a full page costs roughly 2.5× less budget.
WebSocket / Order book
l2Orderbooksubscriptions now support multiple simultaneous aggregation levels per market on one connection. Frames echosigFigs/roundStepso views can be demultiplexed.- Order book snapshots now carry up to 300 price levels (raised cap).
Markets
- MRNA-USD, NBIS-USD, MRVL-USD, BOT-USD, and MSTR-USD enabled. CPER-USD, GME-USD, and QNT-USD listed at 10x leverage, offline.
Market data
- The mark price no longer holds a stale premium when the book is too thin to sample an impact mid. The 2.5-minute impact-mid EWMA previously froze at its last value for as long as depth was missing, then stepped when depth returned; it now decays toward the oracle price during regular trading hours, and toward the sealed RTH settlement price off-hours. Mark price is what margin, unrealized PnL, and liquidations are valued off, so a stale premium moved those too.
Order management
- Fixed a case where a closed position could still read as open. An entry fill and a stop-loss close landing in the same engine tick could be persisted out of order, leaving a flat position showing a size; closing it was then rejected with
REDUCE_ONLY_WOULD_INCREASE. Position rows are now versioned by publish order. - Mark price stability during thin markets — The oracle now falls back to the oracle or settlement price when the orderbook is too thin to sample an impact-mid price, preventing mark price gaps during low-liquidity conditions.
- Increased WebSocket frame buffer — The WebSocket server’s maximum request body size has been increased from 64 KB to 1 MB, reducing connection errors for clients sending larger payloads.
- More reliable position history — Fixed an edge case in position write ordering that could cause duplicate or out-of-order position records under high sequencer throughput.
Breaking changes
from/totime bounds are now epoch microseconds on the endpoints whose timestamps are nanosecond-backed —GET /v1/openOrders,GET /v1/orders,GET /v1/fills,GET /v1/trades, andGET /v1/accountTransferUpdates. Millisecond values are rejected with HTTP 400. Clients that previously sent milliseconds must update.
API changes
GET /v1/openOrdersis now bounded and paginated:limit(1–1000) plusfrom/tooncreatedAt. An account can hold up to 10,000 live orders, so more than one page may be needed.
Authentication
- API keys can be scoped to a non-zero subaccount index.
WebSocket / Order book
userFillsdefault snapshot size increased to 500.
Market data
- Fixed a race that could silently truncate
GET /v1/candlesresponses.
Breaking changes
- Deprecated
*Bpsfee-tier fields removed. UsemakerFeePpm/takerFeePpm(andmaker_fee_ppm/taker_fee_ppm); the values are unchanged.
API changes
GET /v1/marketsexposesminOrderSizeandmaxOrderSizein base-asset units.maxOrderSizeis a per-order gate — reduce-only orders are not exempt.pnlHistoryonGET /v1/portfoliois rebased per timeframe, so each timeframe’s first point is0.
WebSocket / Order book
l2OrderbookacceptssigFigs(2–5) androundStep(1, 2, or 5) to bucket price levels. Bids round down and asks round up, so the displayed spread is never tighter than the true book.- Off-hours trading-band shapes updated;
boundEventis now always present on delta entries, withexitRth/enterRthderived from RTH state. - Fee-tier account attribute updates now fan out to all subaccounts.
API changes
GET /v1/pricesomits OFFLINE markets.GET /v1/marketsadds rolling 24-hourhigh24h/low24hfields.
WebSocket / Order book
- L2 order book now publishes every 200 ms.
Order management
- Fills carry a liquidation/ADL marker, and forced-closure status is consistent between live and persisted views.
Breaking changes
- API-key create/revoke signing migrated to EIP-712, with a dual-accept window during which the legacy scheme still works.
API changes
- New
POST /v1/transferfor internal transfers between subaccounts. GET /v1/account/statsis sectioned, with opt-in fixed 24h/7d/30d windows.- Optional
marketfilter onGET /v1/fills.
Authentication
- API keys are scoped to
(address, publicKey), closing a cross-account revocation path. - Replayed withdrawal nonces are rejected at the gateway — a signed withdrawal is single-use.
- API-key subaccount authorization enforced on
modifyOrder.
Order management
- Maximum order size enforced at the gateway.
- Per-market open-interest caps enforced in the engine.
- TPSL handling corrected after trading-band expansion and liquidations.
Market data
- Fee-tier volume window widened from 14 to 30 days.
priceChange24Hcomputed from mark price rather than trade fills.- Candles priced from mark price; no-trade buckets filled from the BBO mid.
- Off-hours trading behavior reworked, including the EWMA anchor-price fallback.
Referrals
- 5% referral fee discount for referred users.
API changes
GET /v1/candlesserves oracle-priced candles, with oracle OHLC overlaid on no-trade gap buckets.- Affiliate info expanded and a code lookup endpoint added.
Authentication
- Ordersign signature verification enforced on REST
cancelOrderand WebSocketbatchCancelOrders.
Order management
reduceOnlyno longer requiresIOCorFOK.
Rate limits
cancelAllOrderscharges zero IP budget.get/postframes exempt from the WebSocket outbound-message rate limit.
API changes
- Exchange write responses return the account’s remaining rate-limit allowance.
- Rate-limit failures return the client id.
Rate limits
- Order-write endpoints cost zero against the IP bucket; the account-pool cost is configurable.
WebSocket / Order book
setLeveragerejections are surfaced on theaccountAttributeschannel.
Market data
- SOFR-carry funding formula for RWA perps, quoted on the ACT/360 divisor.
- Off-hours endpoints always advertise a distinct next trading bound.
Order management
- Off-hours partial-fill takers are rejected when the limit price violates the trading bound.
- A resting order is preserved when a modify is rejected in pre-flight.
Market data
- Historical 1h and 1d candle volume was repaired for
2025-06-01through2026-06-30. Those buckets had kept stale volume because the rollup only re-derived each aggregate forward from its newest stored bucket, so a 1m re-fetch never reached them. Re-pull any 1h/1d candles cached from that window.
API changes
- Unenforced fields removed from the
GET /v1/marketsresponse.
Market data
- Funding formula corrected.
API changes
- Flat $5 minimum order notional enforced.
- Minimum withdrawal size of $1 enforced.
- Trading stat endpoints added.
- Settlement price and trading bounds surfaced on the market endpoint; open interest added.
Authentication
- API keys upsert by name — re-creating with the same
apiWalletNamerevokes the old key. - Wallet block-list enforced across the trade, withdraw, and key paths.
Order management
- Entry TPSL support, including rejecting
entryTpslchildren when the parent entry order is rejected. - Reduce-only margin check corrected.
Initial mainnet release
- First production release of the Arcus API at
https://api.arcus.xyz.
production-v0.0.1 through production-v0.0.5 covered launch-period stabilization with no separately documented public API changes; production-v0.0.7, production-v0.1.1, and production-v0.1.3 shipped no changes an API trader needs to act on.