Skip to main content
Beta access is required. Contact institutional@polymarket.us for access.
REST and gRPC are currently supported. FIX support is coming soon.
A combo is an instrument with two or more legs. Each leg is a symbol and side. Combo instruments can trade on book like any instrument. Because few combos are liquid, most combo trades start with RFQ. Market makers interact with the RFQ Engine through the Combos API and RFQ Events Stream. The RFQ Engine intermediates negotiation: it creates RFQs, opens a quote submission window, selects by price-time priority, starts last look when the requester accepts, and reports final quote state. This guide is for market makers quoting requests distributed by the RFQ Engine. It covers maker-side behavior only. Requester-only endpoints and internal synchronous RPCs are intentionally omitted.

Flow: Preview Price Discovery

Preview is price discovery only. There is no accept, last look, or fill.

Flow: Quote RFQ Engine Request

On quote_pending_end_trade, last look has started. Confirm within 3 seconds to trade. Makers must confirm the vast majority of accepted quotes or risk removal from the RFQ program.

RFQ Engine

Requester-side RFQ Engine flows:
FlowWhat the RFQ Engine doesMaker sees
Price previewCreates a $10.0000 cash RFQ for indicative price discovery. It returns the price-time priority quote after the submission window.rfq_created, then quote_created for any maker quote. No accept, no last look, no fill.
Executable RFQCreates a cash RFQ for an open/increase or a quantity RFQ for a reduce/cash-out, waits through the quote submission window, and returns the selected quote to the requester. Only pending quotes whose expirationTime is later than selection time and rfq.createdTime + 5 seconds are eligible.rfq_created, then quote_created for any maker quote.
Requester acceptsAccepts the selected quote, starts last look, waits for maker confirmation and final execution, then returns the final result to the requester.Selected maker sees quote_pending_end_trade; non-selected makers see quote_done_away after acceptance.

Quote Rules

RuleBehavior
Quote sideMust equal RFQ side. This is the maker’s side.
Quote creatorMust differ from RFQ creator.
Quantity RFQQuote the RFQ qtyDecimal.
Cash RFQChoose contracts so price * qtyDecimal exactly equals RFQ cashOrderQty. Mismatched quotes are not selectable.
PriceMust land on instrument.tickSize; current combo instruments use 0.001. Valid prices are greater than 0.000 and less than 1.000.
QuantityMust have exactly 2 decimals, such as 40.00.
CashcashOrderQty is shown with 4 decimals. Request inputs may use fewer decimals and are padded.
Price-time prioritySIDE_BUY: lower price wins. SIDE_SELL: higher price wins. At the same price, earlier live quotes have priority.
Minimum quote remaining lifetimeWhen the submission window closes, the RFQ Engine considers only pending quotes whose expirationTime is later than selection time and strictly later than rfq.createdTime + 5 seconds. A quote expiring exactly at createdTime + 5 seconds is ineligible.
Accepted quote disciplineMakers must confirm the vast majority of accepted quotes. Makers who do not may be removed from the RFQ program.
Unary responses are acknowledgements. RFQ Events Stream messages are state. Always copy rfq.side into the quote.
RFQ and quote sideMaker executionRequester executionMaker role
SIDE_BUYBuySellPassive
SIDE_SELLSellBuyPassive
The requester is the aggressor. The maker is passive.

Timing Intervals

TimerStartsDurationMaker requirement
Quote submission windowRFQ creation completes1 secondQuote immediately on rfq_created; part of the window may have elapsed before the event arrives.
Minimum quote remaining lifetimeRFQ createdTime5-second thresholdSet quote expirationTime strictly later than rfq.createdTime + 5 seconds and later than selection time. Add network and acceptance slack.
Last look windowquote_pending_end_trade3 secondsConfirm or delete before the window closes.
Exposure PeriodMaker confirms1 secondThe requester order is placed on the public order book and can be filled against by any participant.

Stream Events

Each StreamRFQEventsResponse has one event.
EventWhen it arrivesMaker response
rfq_createdNew RFQ.Quote or ignore.
rfq_expiredRFQ expired.Stop quoting.
rfq_action_rejectedRequested action failed.Read reject.
quote_createdQuote is live.Track quoteId.
quote_deletedQuote was canceled.Stop using it.
quote_acceptedQuote was confirmed and accepted.Reconcile final execution through Drop Copy.
quote_expiredQuote expired.Stop using it.
quote_passedRequester passed.Stop using it.
quote_done_awayAnother quote won.Stop using it.
quote_pending_riskRisk check pending.Wait.
quote_pending_end_tradeRequester accepted; last look started.Confirm unless you must decline.
quote_status_rejectedQuote reached rejected status.Treat as failed.

Rate Limits

Maker operationRateBurst
GET /v1/combos/rfqs1 request/second1
GET /v1/combos/quotes1 request/second1
POST /v1/combos/quotes100 requests/second100
DELETE /v1/combos/rfqs/{rfqId}/quotes/{quoteId}100 requests/second100
PUT /v1/combos/rfqs/{rfqId}/quotes/{quoteId}/confirm100 requests/second100
Use the stream for live state. Reserve GetRFQs and GetQuotes for startup, recovery, and targeted reconciliation.