16 KiB
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.99maintenance_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
- Base spread weight calculated as:
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))
- Non-spread longs:
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 for spread weight cap details
- See Liquidations for minimum liquidation penalty details
December 1, 2025
Query Enhancements
Pre-State Simulation for SubaccountInfo Query
- Added
pre_stateparameter toSubaccountInfoquery- Type:
string(accepts"true"or"false") - When set to
"true"along withtxns, returns apre_stateobject in the response pre_statecontains the subaccount state before the simulated transactions were applied- Useful for comparing before/after states when simulating trades
pre_stateincludes:healths: Health information before transactionshealth_contributions: Per-product health contributions before transactionsspot_balances: Spot balances before transactionsperp_balances: Perpetual balances before transactions
- Type:
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 for detailed examples.
November 20, 2025 - Initial Launch
Core Changes
1. Removal of LP Functionality
SubaccountInfono longer has:lp_balanceinspot_balancesandperp_balanceslp_stateinspot_productsandperp_productslp_spread_x18inbook_infoof bothspot_productsandperp_products
- Historical
eventsno longer include:net_entry_lp_unrealizednet_entry_lp_cumulative
2. Removal of Redundant Fields
SubaccountInfono longer has:last_cumulative_multiplier_x18inbalanceofspot_balances
3. Products Config Model Updates
- Added:
withdraw_fee_x18andmin_deposit_rate_x18tospot_products.config
4. Products Risk Model Updates
- Added:
price_x18to bothspot_products.riskandperp_products.risk - Removed:
large_position_penalty_x18
5. Deposit Rate Query
- Removed:
min_deposit_ratesquery - Use
min_deposit_rate_x18inspot_products.configinstead
Market Structure Changes
6. Removal of Virtual Books
Contractsquery no longer returnsbook_addrsPlaceOrderverify contract is nowaddress(product_id)
&#xNAN;Example: product 18 →0x0000000000000000000000000000000000000012
7. Minimum Size denomination
min_sizeis now USDT0 denominated (not base denominated)min_size = 10→ minimum order size = 10 USDT0 (order_price * order_amount)
size_incrementremains base denominated- Example: BTC with
size_increment = 0.0001andmin_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)
- Example: BTC with
Orders & Signing
8. Place Orders Execute
- Added:
place_ordersexecute - place multiple orders in a single request- Accepts array of orders with same structure as
place_order - Optional
stop_on_failureparameter to stop processing remaining orders on first failure - Returns array of results with
digest(if successful) orerror(if failed) for each order - Rate limit weight calculated per order
- Accepts array of orders with same structure as
See Place Orders for details.
9. EIP712 Order Struct Update
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 expirationis now strictly a timestampappendixbitfield:
| 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 →valueencodes TWAP settings (times,slippage_x6)isolated = 1→valueencodes isolated margin
- Constraints:
- Isolated orders cannot be TWAP
- TWAP orders must use IOC execution type
See Order Appendix Docs.
10. TWAP Order Execution
- Added
list_twap_executionsquery 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.
Query Updates
13. max_order_size
- Added:
isolatedparameter - when set totrue, calculates max order size for an isolated margin position. Defaults tofalse.
14. orders Query
- Added:
trigger_typesparameter - 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:
eventsandsubaccount_snapshotsqueries
- Available in:
16. subaccount_snapshots Query
- Added:
activeparameter - filter snapshots by position statustrue: returns only products with non-zero balance at the timestampfalse: returns products with event history before the timestamp (default)
17. Trigger Orders
- Added:
place_atfield - timestamp when trigger order should be placed
18. Removal of summary Query
- Removed:
summaryquery from indexer API - Use
subaccount_snapshotsquery instead for historical subaccount data
19. Query Renaming
- Renamed:
usdc_price→quote_pricequery- See Quote Price
20. Multi-Subaccount events, matches, orders
- The indexer
events,matches, andordersqueries now accept asubaccountsarray 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 for more details {% endhint %}
21. OrderUpdate
- Can now subscribe across all products by setting
product_id = null product_idtype changed fromu32→Option<u32>
22. Fill
- Added:
fee,submission_idx, andappendix - 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_idtype changed fromu32→Option<u32>- 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
{
"method": "subscribe",
"stream": {
"type": "funding_payment",
"product_id": 1
},
"id": 123
}
Response
{
"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_idornull(all products) - Emits liquidation info (liquidator, liquidatee, amount, price)
Request
{
"method": "subscribe",
"stream": {
"type": "liquidation",
"product_id": 1
},
"id": 123
}
Response
{
"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
{
"method": "subscribe",
"stream": {
"type": "latest_candlestick",
"product_id": 1,
"granularity": 60
},
"id": 123
}
Response
{
"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_idornull(all products) - Emits funding rate updates every 20 seconds
funding_rate_x18andupdate_timevalues are identical to those from the Funding Rate indexer endpoint
Request
{
"method": "subscribe",
"stream": {
"type": "funding_rate",
"product_id": 1
},
"id": 123
}
Subscribe to all products:
{
"method": "subscribe",
"stream": {
"type": "funding_rate",
"product_id": null
},
"id": 123
}
Response
{
"type": "funding_rate",
"timestamp": "1234567890123456789",
"product_id": 1,
"funding_rate_x18": "50000000000000000",
"update_time": "1234567890"
}