private/* call and works over both WebSocket and HTTP POST. See
Authentication for session login and Endpoints for
endpoints.
Taker
Initiates the RFQ, collects incoming quotes, and signs the execution that fills the block.
Maker
Discovers open RFQs, prices them, and submits signed quotes that the taker can execute.
Legs and packages
An RFQ is defined by its legs. Each leg names an instrument, an amount, and a side:Instrument the leg trades (e.g.
ETH-PERP).Contract quantity as a decimal string.
buy or sell — the taker’s side of this leg.total_cost.
Instrument naming conventions are covered on the market-data reference. Resolve exact, currently-tradeable names with
public/get_all_live_instruments before submitting an RFQ.Signed actions and scopes
The RFQ request itself is an unsigned intent — it does not move funds. The state-changing steps are EIP-712 signed actions under the RFQ module:- The maker signs each quote (
private/send_quote,private/replace_quote). - The taker signs the execution (
private/execute_quote).
signer, signature, nonce, signature_expiry_sec, and max_fee,
and are re-verified by the protocol. See Action signing for the Action
struct, the RFQ module address, and the nonce/expiry conventions.
Each RFQ method requires the trade:rfq:<asset> protocol scope for every asset type its
legs touch (trade:rfq:option, trade:rfq:perp, trade:rfq:spot, or trade:rfq:all).
Cancel methods only require any one RFQ trade scope. See Access scopes.
Taker flow
1
Submit the RFQ
Call
private/send_rfq with the package legs. Leave counterparties empty to open the RFQ to all makers, or list
wallet addresses to direct it privately.2
Collect quotes
Poll
private/poll_quotes for quotes received on your RFQs, or subscribe to the {subaccount_id}.quotes and {subaccount_id}.best.quotes channels for live updates. Track your RFQ’s own status on {wallet}.rfqs.3
Pick the best quote
Call
private/rfq_get_best_quote with your legs and direction to get the best executable quote for the package.4
Execute
Sign and submit
private/execute_quote with the chosen quote_id. The engine re-reads the RFQ and maker quote and
settles the block atomically.Example: private/send_rfq
Identifier used to reference this RFQ in quotes, polls, and execution.
One of
open, filled, cancelled, expired.Millisecond timestamp after which the RFQ expires and no longer accepts quotes.
An RFQ is quotable only for a bounded window after creation (
valid_until). The default window is 10 minutes.The exact window is deployment-specific and may differ per environment; confirm it for your target environment.
send_rfq params: label, counterparties, min_total_cost, max_total_cost
(decimal strings bounding the acceptable package cost), partial_fill_step (minimum fill
increment, default 1), client, extra_fee, and referral_code.
Maker flow
1
Discover RFQs
Poll
private/poll_rfqs for RFQs visible to you (open-to-all, or those naming your wallet in counterparties), or
subscribe to the {wallet}.rfqs channel.2
Quote
Sign and submit
private/send_quote with priced legs (each leg adds a price to the RFQ’s instrument_name /
amount / direction), a direction, and max_fee. Set mmp to opt the quote into market-maker
protection.3
Update or pull
Use
private/replace_quote to atomically cancel and re-submit a quote (provide one of quote_id_to_cancel or
nonce_to_cancel), or private/cancel_quote / private/cancel_batch_quotes to withdraw quotes. Track your quotes
on {subaccount_id}.quotes.Subscription channels
RFQ workflows are event-driven; prefer the WebSocket channels over repeated polling.
See Subscriptions for the channel envelope and payload formats.
Related methods
The full RFQ surface — includingprivate/get_rfqs, private/get_quotes,
private/cancel_rfq, and private/cancel_batch_rfqs — is documented in the
API Reference tab.