Skip to main content
The RFQ (request-for-quote) workflow lets a taker request a price on a package of one or more instruments and execute it as a single atomic block trade against a maker’s quote. It is the venue for large or multi-leg structures that would be hard to fill on the public orderbook. Every RFQ method is a 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_name
string
required
Instrument the leg trades (e.g. ETH-PERP).
amount
string
required
Contract quantity as a decimal string.
direction
string
required
buy or sell — the taker’s side of this leg.
A single-leg RFQ is a simple block; multi-leg RFQs let you price spreads, straddles, and delta-hedged option structures as one package that fills all-or-nothing at a single 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).
These signatures carry a 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

rfq_id
string (uuid)
Identifier used to reference this RFQ in quotes, polls, and execution.
status
string
One of open, filled, cancelled, expired.
valid_until
integer
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.
Optional 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.
Preview a quote or execution signature before sending with the public public/send_quote_debug and public/execute_quote_debug helpers — they return the EIP-712 encoded payload and hashes so you can byte-compare a rejected signature. They are a debugging aid, not a required step.

Subscription channels

RFQ workflows are event-driven; prefer the WebSocket channels over repeated polling. See Subscriptions for the channel envelope and payload formats. The full RFQ surface — including private/get_rfqs, private/get_quotes, private/cancel_rfq, and private/cancel_batch_rfqs — is documented in the API Reference tab.