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
Maker and taker quote (send_quote) signature_expiry_sec must satisfy roughly:
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_typesandsrm_perp_margin_requirementsare gone. Infer instrument types from which ofoption,perpandspotare present.
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_changeis currently always"0"(not yet implemented in v3, unlike v2 which computed a real value).
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,Proving,Settling,Settled, and their errored counterpartsBatchingError,ExecutingError,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.
