Read the Combos guide before integrating. It explains quote construction, visibility, last look, and recovery.
StreamRFQEvents is a gRPC server-side stream for live RFQ, quote, and trade events.
Regenerate your client from the updated proto bundle to consume rfq_trade events.
Service Definition
- Service:
polymarket.v1.RFQAPI - RPC:
StreamRFQEvents - Type: Server-side streaming
- Required scope:
read:orders
StreamRFQEvents is gRPC-only. REST and unary gRPC operations are documented in the RFQ API Overview.
Rate Limit
Each firm can open one newStreamRFQEvents connection per second, with one open attempt of burst capacity. The limit is checked only when the stream opens; it does not throttle server-pushed events on an established stream. Reconnect with backoff after a disconnect.
Events
Each response contains exactly one event payload.
Ignore unrecognized event variants and keep reading. Older protobuf clients may report no recognized
event when they receive a newly added variant.
Confirm or decline using quote_accepted.quote.id. See quote replacement.
Successful quote acceptance produces both events: public rfq_closed and participant-private quote_accepted. A client may receive rfq_closed first. Treat it as “stop quoting this RFQ,” not “no quote was accepted.” Keep existing quote state until the private quote event arrives, or reconcile it with GetQuotes.
The current public stream does not emit expiration, done-away, pending-risk, pending-end-trade, action-rejected, or status-rejected events.
Core Payloads
RFQ
Each
RFQComboLeg contains symbol, side, and an optional settlementPrice. The settlement is the raw YES/LONG price normalized to [0,1]; it is never inverted for a SIDE_SELL leg. Presence matters: "0" is a valid settled price, while an absent field means no valid settlement was available when the event was published.
rfq_created includes settlement prices available at creation. The stream does not emit a separate event when a leg later settles; use GetRFQs during reconciliation to obtain the latest available settlement projection. Historical RFQs can have no comboLegs.
Quote prices must be multiples of tickSize and within the instrument’s price limits. If tickSize is absent, use GetCombos with rfq.symbol.
Quote
The requester and quoter can both see both exchange order IDs on the embedded
Quote. Client order IDs are not part of durable Quote state.
RFQTrade
Therfq_trade event (field 15) wraps an RFQTrade in RFQTradeEvent.trade. Read it from response.rfq_trade.trade. These anonymous fills are visible to all authorized subscribers; see RFQ trade history for which fills are included.
Protobuf field names use snake case:
trade_id, qty_decimal, aggressor_side, and executed_time. One submitted order can produce several fills.
Lifecycle-Specific Fields
These existing recipient-specific wrapper fields remain for compatibility. The embedded
Quote contains the durable execution timestamps and both participants’ exchange order IDs.
quote_executed reports successful paired order submission, not a fill. Reconcile the subsequent exchange order and fill lifecycle through Drop Copy.
Python Example
Delivery and Recovery
On startup:
- Open the stream.
- Read current RFQs with
GetRFQs. - Read the participant’s current quotes with
GetQuotes. - Apply subsequent events idempotently by RFQ or quote ID and
updatedTime.
GetQuotes is the durable recovery path for the current Quote execution state. An empty read collection is a valid snapshot.
For trade events, open the stream before querying GetRFQTrades and merge both sources by trade_id. After a disconnect, reopen the stream and query an overlapping execution-time window. History is eventually visible; a fresh query can find fills absent from an earlier traversal. See pagination and history constraints.
Errors
See Also
Combos Guide
Maker workflow and quote rules
RFQ API
RFQ and quote REST and unary gRPC operations
gRPC Authentication
Metadata, tokens, and scopes
Drop Copy
Exchange order and fill reconciliation