This page covers changes in the v3 API in detail. We recommend using the drop down button in the top right to directly copy this page into your LLM / coding agent as a
SKILL.MD./openapi.json— REST methods/websocket.asyncapi.json— WebSocket-only RPC methods/subscriptions.asyncapi.json— subscription channels and their payloads
No more intermediate “Derive Wallet”
There is no longer a distinction between your “wallet” and a separate “Derive Wallet” or “Smart Contract Wallet”. Everywallet / owner field is your own EOA or multisig.
Note that during the v2 -> v3 state migration all “Derive Wallets” will be automatically transferred to the user’s EOA or multisig.
Signed-action changes
Nonces
In v3, a nonce is a UTC timestamp in nanoseconds (~19 digits for 2025, e.g.1751558400000000000) instead of ms in v2. A millisecond- or microsecond-scale nonce will be rejected.
Beyond the unit change, nonces now have varying validitiy windows depending on action type:
Deposits
Deposits now happen directly on the ETH L1 instead of aprivate/deposit RPC call.
Refer to the Depositing guide or SDKs for more information.
Transfers
private/withdraw- gainsmax_fee_usd,force_batch, andrecipientfields to allow for withdrawals to non owner accounts.private/transfer_spot- replacesprivate/transfer_erc20, and adds amax_fee_usdfield to allow for automatic creation of new subaccounts.- [deprecated]
private/transfer_position- same effect can be achieved withprivate/transfer_positions(single-leg). - [new]
private/transfer_spot_external— transfers spot to other wallets.
Session keys
private/set_session_key— replaces onchain session key registeration calls andprivate/register_scoped_session_keyprivate/edit_session_key— existed in v2, but now edits only off-chain fields (label,ip_whitelist,offchain_scopes). Its v2disableflag was removed.- To retire a key, re-register the same key via
private/set_session_keywith a past or zero expiry. Replaces thederegister_session_keyendpoint.
RFQ quote signatures
The maker quote (send_quote) and taker execute (execute_quote) signature_expiry_sec must satisfy:
Constants
The hosts and signing constants that changed between v2 and v3.Endpoints
Note, for users with dedicated connections, there is no change in hostnames (the ‘v3’ path prefix can also be ignored).
See Endpoints for the canonical host/path list and Connecting
for the WebSocket handshake.
Module addresses are now shared across deployments
The per-action module contracts — themodule field selected inside a signed Action — are
identical on testnet and mainnet in v3. They are fixed protocol constants; hardcoding them
is safe.
Domain separator is recomputed per chain
Unlike the module addresses, the EIP-712 domain separator is not shared: v3 recomputes it per chain. Note, since v3 is now on Ethereum Sepolia & Mainnet, the domain separators must be recomputer. TheverifyingContract is constant across every network (the v2 mainnet Matching,
0xeB8d770ec18DB98Db922E9D83260A585b9F0DeAD); only chainId differs, so testnet and mainnet
resolve to different separators.
Auth headers: X-Lyra* → X-Derive*
See Action signing or SDKs for more information.
Settlement changes
In v2, every action was a transaction on the Derive chain. In v3, every action is a zkVM op which is batched and settled together as one Ethereum L1 transaction.transaction_id->op_uuidtx_hashon Derive Chain ->tx_hashon Ethereum L1 for whole batchtx_status->batch_status
op_uuid → operation → batch → L1 tx, and tx_hash (plus l1_block) is populated from the batch once it settles.
BatchStatus
Note, all routes that return
tx_status in v2 now return batch_status in v3.
Other changes
Note for all of these, refer to the API Reference and json specs listed at the beginning of this document.public/get_currency & public/get_all_currencies
v3 introduces risk universes. A universe is a set of assets, managers and lending pools
that share one security module. Everything risk-related is keyed by (asset, risk_universe_id),
so the same asset can carry different collateral discounts, OI caps and lending terms in
different universes. An insolvency is full contained to one universe.
Start with Managers & Risk Universes — it covers
manager ids, universes, and how they decide what a subaccount can trade and hold.
Both routes keep their names and params. The per-currency object is restructured around that
model:
- Risk data is per universe, not per manager address.
managers[]now carries a numericrisk_universe_idplussm/pmmanager ids. Discounts, OI caps and lending sit underoption/perp/spot[]→universes[]. Match on therisk_universe_idreturned byprivate/get_subaccount. spotis a list. A currency can have several collateral assets, each with its own address,erc20details, discounts and lending. This is the most likely break for clients that assumed one spot asset per currency.- Lending is no longer USDC-only, and
instrument_typesis gone. Infer instrument types from which ofoption,perpandspotare present. srm_perp_margin_requirementsmoved. It keeps its v2 fields (im_perp_req,mm_perp_req,max_leverage) but is no longer top-level: the rates are per risk universe, so it now sits on each entry ofperp.universes[].public/get_instrumentreports the same object insideperp_detailsfor that instrument’s universe.
private/get_subaccount
New fields: manager_id (u32) and risk_universe_id (u32, the key into the
per-universe currency data above). Also:
currencychanged from a single string to astring[]— a breaking shape change.margin_typewidened from a fixed enum (PM|SM|PM2) to an open string.- New
failed_to_fetch(bool) andvault_deposit_holds(array) fields. projected_margin_changeprojects to a minute past the account’s own next option expiry, not v2’s fixed 08:01 UTC.
public/get_ticker & public/get_tickers
public/get_ticker now returns the slim ticker. It is the same object as one entry of
public/get_tickers and the data of a ticker_slim.{instrument_name}.{interval} update. v2
returned the full ticker, which v3 dropped along with its channel (see
Channel changes).
- Live fields use the slim short keys.
best_bid_price/best_ask_price→b/a,best_bid_amount/best_ask_amount→B/A,index_price→I,mark_price→M,min_price/max_price→minp/maxp,timestamp→t.option_pricinguses short keys too (d,g,v,i, …). - Instrument metadata moved to
public/get_instrument. Tick and amount steps, fees, activation times,option_details,perp_detailsanderc20_detailsare no longer on the ticker. - Dropped:
five_percent_bid_depth,five_percent_ask_depthand the per-margin-typeopen_interestmap. Total open interest isstats.oi. OI caps are per risk universe inpublic/get_currency. - New: 24h
stats, andf, the hourly funding rate (perps only).
public/get_tickers is unchanged from v2. It takes the same params and returns the same
map of instrument name to slim ticker.
public/get_all_instruments
v2 described expired as “include expired instruments”: with expired: true, options came back
live and expired together. In v3 the flag selects one or the other. For options, expired: true
returns only expired options, and expired: false returns live options as before. To list
both, make both calls and merge by instrument_name.
- An empty listing returns
instrument_not_found(12001), as in v2. Treat it as empty when merging. - Perps and spot ignore
expired. - An option enters the
expired: truelisting up to a minute before it expires, so it does not drop out of both listings at expiry.
History routes
public/get_trade_historyno longer accepts atx_hashquery param.- Status field: deposit / withdrawal / erc20-transfer history and trade history (public
and private) expose the settlement status as
batch_status(v2’stx_statusis renamed). All use the same set of status values (PascalCase strings) — success stagesBatching,Executing,Da,Proving,Settling,Settled, and their errored counterpartsBatchingError,ExecutingError,DaError,ProvingError,SettlingError,SettledError. The value isnulluntil the operation is picked up for settlement. - Deposit / withdrawal / erc20-transfer history: each row now carries
operation_id(string UUID),batch_uuid, andbatch_status.tx_hashis still present (nullable) — it is not removed, but it now resolves to the settling L1 transaction.
Channel changes
The subscription surface went from 16 channels in v2 to 13 in v3. The full ticker feed and the settlement-filtered trade channels were removed; every other channel carried over.Market maker protection
The MMP methods keep their names, params and responses. What a freeze stops is narrower:- A freeze stops only
mmp: trueorders and quotes. In v2, a frozen subaccount’s resting orders could not fill in that currency, with or withoutmmp. In v3, its resting orders withoutmmpstill fill. Setmmp: trueon every order and quote that a freeze must stop. - A freeze cancels open MMP quotes, not all quotes. In v2, a freeze tripped by an orderbook fill cancelled every
open quote. In v3, quotes without
mmpstay open.
