Skip to main content
Upcoming - beta access required. The RFQ events stream is part of the upcoming Combos API beta. Reach out to institutional@polymarket.us to join the beta test.
Subscribe to combo RFQ and quote lifecycle events using gRPC server-side streaming. Use this stream to avoid polling GetRFQs and GetQuotes while managing RFQ workflows.

Service Definition

Service: polymarket.v1.CombosAPI
RPC: StreamRFQEvents
Type: Server-side streaming
Required scope: read:orders
service CombosAPI {
    rpc StreamRFQEvents(StreamRFQEventsRequest)
        returns (stream StreamRFQEventsResponse);
}
StreamRFQEvents is gRPC-only. The REST Combos endpoints are documented in the Combos API Overview.

Request Parameters

StreamRFQEventsRequest

The request is currently empty.
from polymarket.v1 import combos_pb2

request = combos_pb2.StreamRFQEventsRequest()

Response Messages

The stream returns StreamRFQEventsResponse messages. Each response has one event value.
EventPayloadDescription
rfq_createdRFQCreatedEventA new RFQ was created.
rfq_expiredRFQExpiredEventAn RFQ expired.
rfq_action_rejectedRFQActionRejectedEventAn RFQ action was rejected.
quote_createdQuoteCreatedEventA quote was created.
quote_deletedQuoteDeletedEventA quote was deleted.
quote_acceptedQuoteAcceptedEventA quote was accepted.
quote_expiredQuoteExpiredEventA quote expired.
quote_passedQuotePassedEventA quote was passed.
quote_done_awayQuoteDoneAwayEventA quote was done away.
quote_pending_riskQuotePendingRiskEventA quote entered pending-risk state.
quote_pending_end_tradeQuotePendingEndTradeEventA quote entered pending end-trade state.
quote_status_rejectedQuoteStatusRejectedEventA quote status transition was rejected.

Event Payloads

RFQ

FieldTypeDescription
idstringRFQ ID.
qtyDecimalstringRequested quantity, when RFQ is quantity-based.
cashOrderQtystringRequested cash quantity, when RFQ is cash-based.
sideSideRequester’s side.
instrumentComboInstrumentCombo instrument details.
rfqCreatorUserIdstringPublic RFQ user ID for the requester.
clientRequestIdstringClient request ID supplied at creation time.
expirationTimeTimestampRFQ expiration time.
createdTimeTimestampRFQ creation time.

Quote

FieldTypeDescription
idstringQuote ID.
rfqIdstringRFQ being quoted.
creatorRfqUserIdstringPublic RFQ user ID for the quote creator.
symbolstringCombo symbol.
qtyDecimalstringQuote quantity.
sideSideQuote side.
pricestringQuote price.
statusQuoteStatusCurrent quote status.
createdTimeTimestampQuote creation time.
expirationTimeTimestampQuote expiration time.
clientRequestIdstringClient request ID supplied at creation time.

RFQActionReject

FieldTypeDescription
actionRFQActionRejectActionAction that was rejected.
reasonRFQActionRejectReasonRejection reason.
symbolstringRelated symbol, when available.
textstringHuman-readable rejection text.
rfqIdstringRelated RFQ ID, when available.
quoteIdstringRelated quote ID, when available.
clientRequestIdstringRelated client request ID, when available.

Complete Example

import grpc
from polymarket.v1 import combos_pb2, combos_pb2_grpc


class RFQEventsStreamer:
    def __init__(self, grpc_server: str = "grpc-api.preprod.polymarketexchange.com:443"):
        self.grpc_server = grpc_server

    def stream_rfq_events(self, access_token: str, participant_id: str):
        channel = grpc.secure_channel(
            self.grpc_server,
            grpc.ssl_channel_credentials()
        )
        stub = combos_pb2_grpc.CombosAPIStub(channel)
        metadata = [
            ("authorization", f"Bearer {access_token}"),
            ("x-participant-id", participant_id),
        ]
        request = combos_pb2.StreamRFQEventsRequest()

        for response in stub.StreamRFQEvents(request, metadata=metadata):
            event_type = response.WhichOneof("event")

            if event_type == "rfq_created":
                rfq = response.rfq_created.rfq
                print(f"RFQ created: {rfq.id} {rfq.side}")

            elif event_type == "quote_created":
                quote = response.quote_created.quote
                print(f"Quote created: {quote.id} for RFQ {quote.rfq_id}")

            elif event_type == "quote_accepted":
                quote = response.quote_accepted.quote
                print(f"Quote accepted: {quote.id}")

            elif event_type == "rfq_action_rejected":
                reject = response.rfq_action_rejected.reject
                print(f"RFQ action rejected: {reject.action} {reject.reason} {reject.text}")

Stream Behavior

BehaviorDescription
DeliveryServer pushes events as RFQs and quotes change.
FilteringThe request is currently empty; filtering is not currently exposed.
ReconnectsReconnect with backoff after transient UNAVAILABLE or network errors.
OrderingProcess events in receive order for a single stream.

Error Codes

gRPC CodeCause
INVALID_ARGUMENTMissing participant ID. Pass x-participant-id metadata or use a token with a participant_id claim.
UNAUTHENTICATEDMissing or invalid bearer token.
PERMISSION_DENIEDToken lacks read:orders or participant access.
FAILED_PRECONDITIONParticipant token setup is not ready or token state is invalid.
UNAVAILABLEUpstream Combos service or stream is unavailable.

See Also

Combos API

REST and unary gRPC RFQ operations

gRPC Streaming Overview

Endpoints, auth, and connection setup

Authentication

gRPC metadata and scopes

Error Handling

Reconnection and retry guidance