Market makers should read the Combos guide before integrating. It explains quote construction, visibility, last look, and recovery.
polymarket.v1.RFQAPI gRPC service creates, reads, and manages combo RFQs and quotes. An RFQ references the exact symbol of a combo instrument. The service also exposes the gRPC-only RFQ event stream.
Every REST endpoint below has an equivalent unary gRPC RPC. REST JSON uses lower camel case; protobuf fields use snake case.
Endpoints
All calls require bearer-token authentication and an acting participant, supplied through
x-participant-id or the token’s participant_id claim.
Each unary method has a separate per-firm rate-limit bucket with one second of burst capacity. Opening StreamRFQEvents is limited to one new stream per second per firm. See Rate Limits.
RFQ Lifecycle
SuccessfulAcceptQuote produces both rfq_closed and quote_accepted. A client may receive the public rfq_closed event first. Stop creating or replacing quotes for that RFQ, but keep existing quote state until the private quote event arrives or GetQuotes confirms its current status.
Create an RFQ
POST /v1/rfqs
The response contains the new
rfqId. A created RFQ starts in RFQ_STATUS_OPEN.
Query RFQs
GET /v1/rfqs?limit=10&status=RFQ_STATUS_OPEN
The response has
rfqs and an opaque cursor. An exact RFQ ID that is absent or not visible returns an empty rfqs array.
Each RFQ includes the combo’s ordered leg snapshot:
settlementPrice is a canonical decimal string such as "0", "0.4", or "1". It is not inverted for SIDE_SELL legs. An absent field means no valid settlement is currently available; it is distinct from a present "0". Treat absence as unavailable, not proof that the leg is unresolved.
Leg order and sides are fixed when the RFQ is created. Settlement prices are hydrated when the RFQ is returned, so later exact and list reads can expose settlements that were unavailable at creation. Historical RFQs created before leg snapshots were introduced can have an empty comboLegs array.
Close an RFQ
DELETE /v1/rfqs/{rfqId} closes an open RFQ. Only its requester can close it. The response is {}.
Quotes
A quote can offer both requester sides:buyPriceis the price for a requester buy; the maker sells.sellPriceis the price for a requester sell; the maker buys.
"0". At least one side must be positive. Nonzero prices must be within the instrument’s price limits and land on its tick size.
Create or Replace a Quote
POST /v1/rfqs/quotes
The service derives
buyQtyDecimal and sellQtyDecimal from the RFQ:
- A quantity RFQ uses its
qtyDecimalfor every offered side. - A cash RFQ derives each side independently from
cashOrderQty / price, rounded down to the instrument’s fractional quantity scale.
CreateQuote again replaces that maker’s quote in place, resets it to QUOTE_STATUS_ACTIVE, and returns the same quoteId.
Query Quotes
GET /v1/rfqs/quotes?rfqId=rfq_...
Without
rfqId, provide exactly one of userFilter=USER_FILTER_SELF or rfqUserFilter=USER_FILTER_SELF. The response has quotes and an opaque cursor.
Each visible Quote carries durable execution state once available:
The requester and quoter can both see both exchange order IDs. A
Quote does not expose client order IDs. GetQuotes is the durable recovery path when a stream event is missed.
For compatibility, stream events retain their existing recipient-specific wrapper fields. The embedded Quote contains the durable fields above.
Accept a Quote
PUT /v1/rfqs/{rfqId}/quotes/{quoteId}/accept
SIDE_BUY selects buyPrice; SIDE_SELL selects sellPrice. The selected price must be positive. Acceptance closes the RFQ, emits public rfq_closed, changes the quote to QUOTE_STATUS_ACCEPTED, emits participant-private quote_accepted, and starts last look.
Delete a Quote
DELETE /v1/rfqs/{rfqId}/quotes/{quoteId} deletes the caller’s active quote while the RFQ is open. The selected maker can also delete its accepted quote before the confirmation deadline to decline during last look. The response is {}.
Confirm a Quote
PUT /v1/rfqs/{rfqId}/quotes/{quoteId}/confirm
The selected maker must confirm before confirmationDeadline. Confirmation changes the quote to QUOTE_STATUS_CONFIRMED and schedules paired order submission. The response is {}.
Statuses
Events and Recovery
RFQAPI.StreamRFQEvents is a live, best-effort gRPC stream. Public RFQ events are visible to participants; quote events are private to the requester and relevant maker. The stream has no replay, gap-free handoff, ordering, or deduplication guarantee.
Open the stream for low-latency changes. On startup, reconnect, or after a suspected missed event, reconcile durable state with GetRFQs and GetQuotes. See RFQ Events Stream.
See Also
Combos API
Create and read combo instruments
Combos Guide
Maker workflow and quote rules
RFQ Events Stream
Current event payloads and recovery behavior
Authentication
OAuth metadata and required scopes