Skip to main content
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.
production-v0.11.0

API changes

Authentication

  • POST /v1/transfer also accepts the X-API-Key / X-Timestamp / X-Signature headers, with an Ed25519 signature over a TransferV1 payload and no body signature. A key scoped to one subaccount can transfer only from that subaccount; wallet-signed transfers work as before.

Stability

  • GET /v1/orders queries 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.
production-v0.10.0

API changes

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.
production-v0.10.0

Fixes

production-v0.10.0

Multi-asset collateral

  • Stock Tokens now count at their multiplier. Each token is valued as multiplier shares for loan capacity, the liquidation line, withdrawals and deposit limits, and settleLoan and liquidation sales are sized the same way; see The Stock Token multiplier.
production-v0.10.0

API changes

  • A STOP_LOSS order on POST /v1/placeOrder can set reduceOnly: false to open a position in the trigger direction when it fires; TAKE_PROFIT orders and TP/SL legs in a batch still require reduceOnly: true.
  • Net deposits and cumulative funding on GET /v1/account, GET /v1/positions and 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/modifyOrder keeps the order’s orderId, createdAt and fill state; quantity is the new total size including any filled amount, and a total at or below it is rejected with MODIFY_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 orders channel as a CANCELED update with cancelReason: "MODIFY_CANCELED", then the order’s new state under the same orderId; if the engine rejects the modified order, the original is removed too, while a request rejected with HTTP 400 leaves it in place. See Modifying orders.
  • TP/SL placement checks stopPrice against the mark price, the same price that triggers the order: POST /v1/placeOrder and POST /v1/batchPlaceOrders reject a trigger already crossed with InvalidRequest.

Fixes

Stability

  • WebSocket order and cancel acks have lower tail latency.
  • Order book updates fan out faster over WebSocket; message contents and order are unchanged.
production-v0.9.0-1

API changes

production-v0.9.0-1

API changes

  • GET /v1/fills and GET /v1/orders return the last 30 days when from is omitted; pass from for older history.
  • Subscribe to bbo or oraclePrices with throttleMs (100, 250, 500, 1000 or 2000) to receive at most one frame per window.
  • Each l2OrderbookUpdates delta carries timestamp, the engine processing time in epoch microseconds, as on bbo.
  • The WebSocket rateLimit get-method reports real order.used and cancel.used, matching GET /v1/rateLimit.

Trading

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.
production-v0.8.0-1

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/feeSchedules and as feeTiers on GET /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.
production-v0.8.0-1

Multi-asset collateral

production-v0.8.0-1

API changes

  • tradingFeeTier on GET /v1/account/stats returns your fee tier level and feeDiscountPpm (the referral fee discount, omitted when zero) instead of maker and taker rates.
  • The orders channel snapshot includes recently closed orders from the last 28 days only.
  • Deposit rows on GET /v1/accountTransferUpdates and the accountTransferUpdates channel carry rootchainQueueIndex, used to claim a refund for a rejected deposit.

Referrals

Trading

  • Accounts blocked under the Terms of Use can create API keys.

Stability

  • Fixed: avgFillPrice on REST and the orders and account WebSocket channels is the exact average fill price instead of being rounded down to a whole tick.
production-v0.7.0

Trading

production-v0.5.0-1

API changes

production-v0.7.0

Referrals

  • An invite code is only for gaining trading access: POST /v1/affiliate/redeemInvite by a caller who can already trade returns 409 and 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/registerAffiliate by spending one of the code owner’s unused invite codes, which grants trading access; 403 or 409 when the owner does not allow it or has none left, and 502 (nothing registered, safe to retry) when the access grant fails.
  • GET /v1/affiliate/info adds traderCount, and its referred-volume and commission totals now cover your whole T1/T2/T3 downline, perps only. GET /v1/affiliate/referees rows add volumeAllTime, and a parent filter pages one referee’s sub-tree.
  • POST /v1/affiliate/createCode and modifyCode reject a string that is already an invite code with 409 (“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 IOC or FOK orders to reduce or close a position, and withdraw. Every other trading request returns 403.
production-v0.6.0

Referrals

  • Redeeming your own invite code on POST /v1/affiliate/redeemInvite grants 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/markets as soon as the engine applies it, and markets listed after launch appear on the unfiltered list.
  • Fixed: GET /v1/leaderboard no longer reports an overflowed feesPaid for traders whose net fees are negative (maker rebates).
production-v0.5.0-1

API changes

  • Markets listed after launch are served like the rest: they appear on prices, mids, candles, GET /v1/leverages and 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), on GET /v1/trades, /v1/candles, /v1/orders, /v1/openOrders, /v1/fills, /v1/positions, /v1/funding, /v1/fundingRates and /v1/accountTransferUpdates.
  • GET /v1/apiKeys is bounded and paginated: keys come back newest first, capped by limit (default and maximum 1000), and from / to filter on createdAt in epoch milliseconds. An invalid limit, from or to returns 400.

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.
production-v0.4.0-2

Referrals

production-v0.4.0-2

API changes

  • New GET /v1/fill/{tradeId}: look up the single fill an account owns for a given tradeId.
  • GET /v1/leaderboard accepts an address to return just that trader’s row, and every row carries its rank on the active sortBy column.
  • GET /v1/affiliate/info adds totalReferredVolumeAllTime, the lifetime notional volume of all the affiliate’s referees.
  • Spec correction: the GET /v1/affiliate/info spec now names the affiliate’s trailing-30-day volume field volume30d, matching what the API already returned (it was documented as rollingVolume). 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/createApiKey and POST /v1/revokeApiKey accept accountIndex: 255, and key rows on GET /v1/apiKeys carry an allSubaccounts flag.

Order management

  • POST /v1/scheduleCancel accepts an optional marketId to 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 returns 429, 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.
production-v0.4.0-2

Orders and fills

  • Partially filled orders that are then canceled now report avgFillPrice. A CANCELED order with filledSize above zero on GET /v1/orders carries avgFillPrice, the volume-weighted price of its fills; until now it was omitted.
  • closedPnl on closing fills is now computed from the cost basis the fill releases. On GET /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.method LIQUIDATION) on GET /v1/fills carries the realized PnL of the close, net of taker trading fees (the liquidation penalty included in fee is not deducted); until now it read "0". Earlier liquidation fills are not backfilled.
production-v0.3.0

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 0 when 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.
production-v0.2.0

Margin

  • Per-account isolated margin is now enabled in production. Set a market to isolated mode with the optional isolated flag on POST /v1/setLeverage, move collateral onto or off an isolated position’s leg with POST /v1/adjustIsolatedMargin, and read the mode from marginMode/isolated on position rows, GET /v1/leverages, and the accountAttributeUpdates channel. The API surface shipped in production-v0.1.10.0 and read CROSS/false for every account until now; isolated behaviour is active for all accounts as of this update. Testnet has carried the full mechanics since testnet-v1.8.0 — see the testnet changelog for the detailed marginUsed, rejection-reason, and streaming semantics.
production-v0.2.0

WebSocket / Order book

API changes

Markets

  • 13 new crypto markets enabled and tradeable: DOGE, ENA, PUMP, NEAR, PENGU, FARTCOIN, SUI, WLFI, LINK, BNB, TAO, AAVE, UNI.
production-v0.1.10.0

Breaking changes

API changes

Order management

  • New POST /v1/scheduleCancel dead man’s switch: arm, refresh, or disarm a per-subaccount deadline; if it elapses the gateway fires cancelAllOrders for that subaccount.
  • GET /v1/positions no longer returns 500 when the oracle price read times out.
  • Position rows and GET /v1/leverages carry marginMode and isolated. When this release shipped both read CROSS and false for 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

  • market filter on positions, orders, and userFills subscriptions and on the get RPCs for fills, orders, positions, leverages, mids, and prices. It is part of subscription identity, so unsubscribe must repeat it.
  • userFills subscribe accepts nFills (1–500, default 500) to bound the initial snapshot.
  • isolated and marginMode are always present on accountAttributeUpdates leverage entries.
  • A fill could produce a duplicate account snapshot with a repeated lastSequenceId, and an AccountUpdate could 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.
production-v0.1.8

API changes

  • New filters on GET /v1/orders and GET /v1/fills: a market param (ticker or numeric id, case-insensitive). GET /v1/fills also gets a role param (MAKER/TAKER). The same market filter works on GET /v1/markets.
  • GET /v1/apiKeys with no accountIndex now returns keys for all subaccounts under the address, each tagged with its own accountIndex (previously just the default one).

Authentication

Rate limits

  • GET /v1/openOrders costs 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

  • l2Orderbook subscriptions now support multiple simultaneous aggregation levels per market on one connection. Frames echo sigFigs/roundStep so 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.
production-v0.1.7

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.
production-v0.1.6

Breaking changes

API changes

  • GET /v1/openOrders is now bounded and paginated: limit (1–1000) plus from/to on createdAt. 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

  • userFills default snapshot size increased to 500.

Market data

production-v0.1.5

Breaking changes

  • Deprecated *Bps fee-tier fields removed. Use makerFeePpm/takerFeePpm (and maker_fee_ppm/taker_fee_ppm); the values are unchanged.

API changes

  • GET /v1/markets exposes minOrderSize and maxOrderSize in base-asset units. maxOrderSize is a per-order gate — reduce-only orders are not exempt.
  • pnlHistory on GET /v1/portfolio is rebased per timeframe, so each timeframe’s first point is 0.

WebSocket / Order book

  • l2Orderbook accepts sigFigs (2–5) and roundStep (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; boundEvent is now always present on delta entries, with exitRth/enterRth derived from RTH state.
  • Fee-tier account attribute updates now fan out to all subaccounts.
production-v0.1.4

API changes

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.
production-v0.1.2

Breaking changes

  • Fee-tier fields renamed from bps to ppm.

Market data

  • Spread filter applied to BBO candles.
production-v0.1.0-quiesce

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

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.
  • priceChange24H computed 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.
production-v0.0.9-skhy-cc

API changes

  • GET /v1/candles serves 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 cancelOrder and WebSocket batchCancelOrders.

Order management

  • reduceOnly no longer requires IOC or FOK.

Rate limits

  • cancelAllOrders charges zero IP budget.
  • get/post frames exempt from the WebSocket outbound-message rate limit.
production-v0.0.9

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

  • setLeverage rejections are surfaced on the accountAttributes channel.

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.
production-v0.0.8

Market data

  • Historical 1h and 1d candle volume was repaired for 2025-06-01 through 2026-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.
production-v0.0.6

API changes

Market data

  • Funding formula corrected.
production-v0.0.4

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 apiWalletName revokes the old key.
  • Wallet block-list enforced across the trade, withdraw, and key paths.

Order management

  • Entry TPSL support, including rejecting entryTpsl children when the parent entry order is rejected.
  • Reduce-only margin check corrected.
production-v0.0.0

Initial mainnet release

  • First production release of the Arcus API at https://api.arcus.xyz.
Releases 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.