# API Changelog
This document tracks all changes to the Nado API.
***
December 11, 2025
**Risk System Updates**
**Spread Weight Caps**
* Introduced upper bounds for spread weights to manage risk at extreme leverage levels:
* `initial_spread_weight`: Maximum **0.99**
* `maintenance_spread_weight`: Maximum **0.994**
* **Impact**:
* Existing markets (≤20x leverage): No change in behavior
* Future high-leverage markets (30x+): Spread positions will have capped health benefits
* Prevents extreme leverage abuse via spread positions
* **Technical Details**:
* Base spread weight calculated as: `spread_weight = 1 - (1 - product_weight) / 5`
* Final spread weight: `min(spread_weight, cap)`
* Cap applies during health calculations for spread positions
**Minimum Liquidation Penalties**
* Introduced minimum distance requirements between oracle price and liquidation price:
* **Non-spread liquidations**: Minimum **0.5%** from oracle price
* **Spread liquidations**: Minimum **0.25%** from oracle price
* **Impact**:
* Ensures liquidators always have sufficient incentive to execute liquidations
* Prevents unprofitable liquidation scenarios for low-volatility assets
* Particularly important for high-leverage positions where natural penalties may be very small
* **Technical Details**:
* **Non-spread longs**: `oracle_price × (1 - max((1 - maint_asset_weight) / 5, 0.005))`
* **Non-spread shorts**: `oracle_price × (1 + max((maint_liability_weight - 1) / 5, 0.005))`
* **Spread selling**: `spot_price × (1 - max((1 - perp_maint_asset_weight) / 10, 0.0025))`
* **Spread buying**: `spot_price × (1 + max((spot_maint_liability_weight - 1) / 10, 0.0025))`
**API Response Changes**
* No breaking changes to API response structure
* Health calculations and liquidation prices automatically reflect new risk parameters
**Documentation Updates**
* See [Subaccounts & Health](https://docs.nado.xyz/subaccounts-and-health#spreads) for spread weight cap details
* See [Liquidations](https://docs.nado.xyz/liquidations#liquidation-price) for minimum liquidation penalty details
***
December 1, 2025
**Query Enhancements**
**Pre-State Simulation for SubaccountInfo Query**
* Added `pre_state` parameter to `SubaccountInfo` query
* Type: `string` (accepts `"true"` or `"false"`)
* When set to `"true"` along with `txns`, returns a `pre_state` object in the response
* `pre_state` contains the subaccount state **before** the simulated transactions were applied
* Useful for comparing before/after states when simulating trades
* `pre_state` includes:
* `healths`: Health information before transactions
* `health_contributions`: Per-product health contributions before transactions
* `spot_balances`: Spot balances before transactions
* `perp_balances`: Perpetual balances before transactions
**Use Cases:**
* Position simulation and preview
* Risk analysis for potential trades
* UI/UX for showing before/after comparisons
* Testing transaction impacts without on-chain execution
**Documentation:** See [Subaccount Info Query](https://docs.nado.xyz/developer-resources/gateway/queries/subaccount-info#example-with-pre_state) for detailed examples.
***
November 20, 2025 - Initial Launch
#### Core Changes
**1. Removal of LP Functionality**
* `SubaccountInfo` no longer has:
* `lp_balance` in `spot_balances` and `perp_balances`
* `lp_state` in `spot_products` and `perp_products`
* `lp_spread_x18` in `book_info` of both `spot_products` and `perp_products`
* Historical `events` no longer include:
* `net_entry_lp_unrealized`
* `net_entry_lp_cumulative`
**2. Removal of Redundant Fields**
* `SubaccountInfo` no longer has:
* `last_cumulative_multiplier_x18` in `balance` of `spot_balances`
**3. Products Config Model Updates**
* Added: `withdraw_fee_x18` and `min_deposit_rate_x18` to `spot_products.config`
**4. Products Risk Model Updates**
* Added: `price_x18` to both `spot_products.risk` and `perp_products.risk`
* Removed: `large_position_penalty_x18`
**5. Deposit Rate Query**
* Removed: `min_deposit_rates` query
* Use `min_deposit_rate_x18` in `spot_products.config` instead
#### Market Structure Changes
**6. Removal of Virtual Books**
* `Contracts` query no longer returns `book_addrs`
* `PlaceOrder` verify contract is now `address(product_id)`\
\NAN;*Example: product 18 → `0x0000000000000000000000000000000000000012`*
**7. Minimum Size denomination**
* `min_size` is now **USDT0 denominated** (not base denominated)
* `min_size = 10` → minimum order size = 10 USDT0 (`order_price * order_amount`)
* `size_increment` remains **base denominated**
* Example: BTC with `size_increment = 0.0001` and `min_size = 20`:
* ✅ Valid: 100,000 \* 0.0002 = 20 USDT0
* ❌ Invalid: 100,000 \* 0.0001 = 10 USDT0
* ❌ Invalid: 100,000 \* 0.00025 (not multiple of 0.0001)
#### Orders & Signing
**8. Place Orders Execute**
* Added: `place_orders` execute - place multiple orders in a single request
* Accepts array of orders with same structure as `place_order`
* Optional `stop_on_failure` parameter to stop processing remaining orders on first failure
* Returns array of results with `digest` (if successful) or `error` (if failed) for each order
* Rate limit weight calculated per order
See [Place Orders](https://docs.nado.xyz/developer-resources/api/gateway/executes/place-orders) for details.
**9. EIP712 `Order` Struct Update**
```solidity
struct Order {
bytes32 sender;
int128 priceX18;
int128 amount;
uint64 expiration;
uint64 nonce;
uint128 appendix;
}
```
* New field: `appendix`
* All order flags (IOC, post only, reduce-only, triggers) moved into `appendix`
* `expiration` is now strictly a timestamp
* `appendix` bitfield:
```json
| value | reserved | trigger | reduce only | order type | isolated | version |
| 64 bits | 50 bits | 2 bits | 1 bit | 2 bits | 1 bit | 8 bits |
```
* Special encodings:
* `trigger` = 2 or 3 → `value` encodes TWAP settings (`times`, `slippage_x6`)
* `isolated = 1` → `value` encodes isolated margin
* Constraints:
* Isolated orders cannot be TWAP
* TWAP orders must use IOC execution type
See [Order Appendix Docs](https://docs.nado.xyz/developer-resources/api/order-appendix).
**10. TWAP Order Execution**
* Added `list_twap_executions` query to trigger service
* TWAP orders track individual execution status (pending, executed, failed, cancelled)
* TWAP execution statuses include execution time and engine response data
**11. Trigger Service Rate Limits**
* Updated trigger order limits from 100 pending orders per subaccount to `25 pending orders per product per subaccount`
**12. EIP712 Domain Change**
* Signing domain updated from **`Vertex` → `Nado`**\
See [Signing Docs](https://docs.nado.xyz/developer-resources/api/gateway/signing).
#### Query Updates
**13. ****`max_order_size`**
* Added: `isolated` parameter - when set to `true`, calculates max order size for an isolated margin position. Defaults to `false`.
**14. ****`orders`**** Query**
* Added: `trigger_types` parameter - filter orders by trigger type(s)
**15. Historical Events**
* Added: `quote_volume_cumulative` - tracks cumulative trading volume for the subaccount in quote units
* Available in: `events` and `subaccount_snapshots` queries
**16. ****`subaccount_snapshots`**** Query**
* Added: `active` parameter - filter snapshots by position status
* `true`: returns only products with **non-zero balance** at the timestamp
* `false`: returns products with **event history** before the timestamp (default)
**17. Trigger Orders**
* Added: `place_at` field - timestamp when trigger order should be placed
**18. Removal of ****`summary`**** Query**
* Removed: `summary` query from indexer API
* Use `subaccount_snapshots` query instead for historical subaccount data
**19. Query Renaming**
* Renamed: `usdc_price` → `quote_price` query
* See [Quote Price](https://docs.nado.xyz/developer-resources/api/archive-indexer/quote-price)
**20. Multi-Subaccount `events`, `matches`, `orders`**
* The indexer `events`, `matches`, and `orders` queries now accept a `subaccounts` array so you can fetch history for multiple subaccounts in a single request instead of fanning out per subaccount. Please note that the old single-subaccount version is **no longer supported**.
#### Streams
{% hint style="info" %}
See [Subscriptions > Streams](https://docs.nado.xyz/developer-resources/api/subscriptions/streams) for more details
{% endhint %}
**21. ****`OrderUpdate`**
* Can now subscribe across all products by setting `product_id = null`
* `product_id` type changed from `u32` → `Option`
**22. ****`Fill`**
* Added: `fee`, `submission_idx`, and `appendix`
* Can now subscribe across all products by setting `product_id = null`
**23. ****`PositionChange`**
* Can now subscribe across all products by setting `product_id = null`
* `product_id` type changed from `u32` → `Option`
* Added: `isolated` - indicates whether the position change is for an isolated margin position
**24. ****`FundingPayment`**
* New stream: `FundingPayment`
* Param: `product_id: u32`
* Emits hourly funding payment events
**Request**
```json
{
"method": "subscribe",
"stream": {
"type": "funding_payment",
"product_id": 1
},
"id": 123
}
```
**Response**
```json
{
"type": "funding_payment",
"timestamp": 1234567890000,
"product_id": 1,
"payment_amount": "1000000000000000000",
"open_interest": "50000000000000000000",
"cumulative_funding_long_x18": "100000000000000000",
"cumulative_funding_short_x18": "-100000000000000000",
"dt": 3600000
}
```
**25. ****`Liquidation`**
* New stream: `Liquidation`
* Param: `product_id` or `null` (all products)
* Emits liquidation info (liquidator, liquidatee, amount, price)
**Request**
```json
{
"method": "subscribe",
"stream": {
"type": "liquidation",
"product_id": 1
},
"id": 123
}
```
**Response**
```json
{
"type": "liquidation",
"timestamp": "1234567890000",
"product_ids": [1],
"liquidator": "0x7a5ec2748e9065794491a8d29dcf3f9edb8d7c43746573743000000000000000",
"liquidatee": "0x8b6fd3859f7065794491a8d29dcf3f9edb8d7c43746573743000000000000000",
"amount": "1000000000000000000",
"price": "50000000000000000000"
}
```
**26. ****`LatestCandlestick`**
* New stream: `LatestCandlestick`
* Params: `product_id`, `granularity` (seconds)
* Emits candlestick updates on every trade
**Request**
```json
{
"method": "subscribe",
"stream": {
"type": "latest_candlestick",
"product_id": 1,
"granularity": 60
},
"id": 123
}
```
**Response**
```json
{
"type": "latest_candlestick",
"timestamp": 1234567890000,
"product_id": 1,
"granularity": 60,
"open_x18": "50000000000000000000",
"high_x18": "51000000000000000000",
"low_x18": "49000000000000000000",
"close_x18": "50500000000000000000",
"volume": "1000000000000000000"
}
```
**27. ****`FundingRate`**
* New stream: `FundingRate`
* Param: `product_id` or `null` (all products)
* Emits funding rate updates every 20 seconds
* `funding_rate_x18` and `update_time` values are identical to those from the [Funding Rate](https://docs.nado.xyz/developer-resources/api/archive-indexer/funding-rate) indexer endpoint
**Request**
```json
{
"method": "subscribe",
"stream": {
"type": "funding_rate",
"product_id": 1
},
"id": 123
}
```
**Subscribe to all products:**
```json
{
"method": "subscribe",
"stream": {
"type": "funding_rate",
"product_id": null
},
"id": 123
}
```
**Response**
```json
{
"type": "funding_rate",
"timestamp": "1234567890123456789",
"product_id": 1,
"funding_rate_x18": "50000000000000000",
"update_time": "1234567890"
}
```