Skip to main content
Upcoming - beta access required. The Combos API is not generally available yet. Reach out to institutional@polymarket.us to join the beta test.
The Combos API lets participants request and quote multi-leg combo trades. A requester creates an RFQ with one or more legs, makers respond with quotes, and the requester accepts one quote to execute the resulting order. For real-time RFQ and quote changes, use the RFQ Events Stream.

Endpoints

MethodEndpointRequired ScopeDescription
GET/v1/combos/rfq/user-idread:ordersGet your public RFQ user ID
GET/v1/combos/rfqsread:ordersQuery RFQs
POST/v1/combos/rfqswrite:ordersCreate an RFQ
GET/v1/combos/quotesread:ordersQuery quotes
POST/v1/combos/quoteswrite:ordersCreate a quote
DELETE/v1/combos/rfqs/{rfqId}/quotes/{quoteId}write:ordersDelete a quote
PUT/v1/combos/rfqs/{rfqId}/quotes/{quoteId}/acceptwrite:ordersAccept a quote
All Combos API calls require normal bearer-token authentication. Calls must also identify the acting participant either through the x-participant-id header or through a participant_id claim in the bearer token.

RFQ Flow

  1. Call GetRFQUserID to learn the public RFQ user ID for the authenticated participant.
  2. Call CreateRFQ with the combo legs, requested side, quantity or cash order quantity, and expiration time.
  3. Makers call GetRFQs and CreateQuote to respond.
  4. Requesters monitor GetQuotes or subscribe to StreamRFQEvents.
  5. The requester calls AcceptQuote to execute one quote.

Create RFQ

POST /v1/combos/rfqs

Request Body

FieldTypeRequiredDescription
qtyDecimalstringConditionalShare quantity for the RFQ. Provide this or cashOrderQty.
cashOrderQtystringConditionalCash notional for the RFQ. Provide this or qtyDecimal.
legsCreateRFQLeg[]YesCombo legs. Each leg has symbol and side.
sideSideYesRequester’s side for the combo.
clientRequestIdstringNoClient idempotency / correlation ID.
expirationTimeRFC3339YesTime when the RFQ expires.

Example

{
  "qtyDecimal": "100",
  "side": "SIDE_BUY",
  "clientRequestId": "rfq-20260613-001",
  "expirationTime": "2026-06-13T18:00:00Z",
  "legs": [
    {
      "symbol": "aec-mlb-nyy-bos-2026-06-13-nyy",
      "side": "SIDE_BUY"
    },
    {
      "symbol": "aec-mlb-nyy-bos-2026-06-13-bos",
      "side": "SIDE_SELL"
    }
  ]
}

Response

{
  "clientRequestId": "rfq-20260613-001"
}

Query RFQs

GET /v1/combos/rfqs?symbol=aec-mlb-nyy-bos-2026-06-13-nyy&pageSize=100

Query Parameters

ParameterTypeDescription
pageSizeintegerNumber of RFQs to return.
pageTokenstringPagination token from nextPageToken.
rfqIdstringFilter by RFQ ID.
rfqCreatorUserIdstringFilter by requester RFQ user ID.
symbolstringFilter by combo or leg symbol.
clientRequestIdstringFilter by client request ID.

Create Quote

POST /v1/combos/quotes

Request Body

FieldTypeRequiredDescription
rfqIdstringYesRFQ being quoted.
sideSideYesQuote side.
pricestringYesQuote price as a decimal string.
symbolstringYesCombo symbol.
qtyDecimalstringYesQuote quantity as a decimal string.
clientRequestIdstringNoClient idempotency / correlation ID.
expirationTimeRFC3339NoQuote expiration time.

Query Quotes

GET /v1/combos/quotes?rfqId=rfq_123&status=QUOTE_STATUS_PENDING

Query Parameters

ParameterTypeDescription
pageSizeintegerNumber of quotes to return.
pageTokenstringPagination token from nextPageToken.
quoteIdstringFilter by quote ID.
rfqIdstringFilter by RFQ ID.
creatorRfqUserIdstringFilter by quote creator RFQ user ID.
symbolstringFilter by combo symbol.
statusQuoteStatusFilter by quote status.
clientRequestIdstringFilter by client request ID.

Accept Quote

PUT /v1/combos/rfqs/{rfqId}/quotes/{quoteId}/accept
Accepting a quote inserts the resulting order. The body repeats the economic terms being accepted.
FieldTypeRequiredDescription
sideSideYesSide being accepted.
pricestringYesAccepted price.
symbolstringYesCombo symbol.
qtyDecimalstringYesAccepted quantity.

Quote Statuses

StatusDescription
QUOTE_STATUS_PENDINGQuote is active and can be accepted.
QUOTE_STATUS_ACCEPTEDQuote was accepted.
QUOTE_STATUS_DELETEDQuote was deleted by its creator.
QUOTE_STATUS_EXPIREDQuote expired.
QUOTE_STATUS_PASSEDQuote was passed.
QUOTE_STATUS_DONE_AWAYQuote was done away.
QUOTE_STATUS_PENDING_RISKQuote is waiting on risk checks.
QUOTE_STATUS_PENDING_END_TRADEQuote is waiting for end-trade processing.
QUOTE_STATUS_REJECTEDQuote was rejected.

Rate Limits

EndpointRateBurst
GET /v1/combos/rfq/user-idFirm-wide REST cap-
GET /v1/combos/rfqs1 req/sec1
GET /v1/combos/quotes1 req/sec1
POST /v1/combos/rfqs10 req/sec10
POST /v1/combos/quotes100 req/sec100
DELETE /v1/combos/rfqs/{rfqId}/quotes/{quoteId}100 req/sec100
PUT /v1/combos/rfqs/{rfqId}/quotes/{quoteId}/accept100 req/sec100
Exceeding these limits returns ResourceExhausted (429 Too Many Requests).

Error Codes

ErrorCause
InvalidArgumentMissing participant ID, invalid RFQ, quote, symbol, side, price, quantity, or pagination input.
UnauthenticatedMissing or invalid bearer token.
PermissionDeniedToken lacks the required scope or participant access.
FailedPreconditionParticipant token setup is not ready or token state is invalid.
UnavailableUpstream Combos service is unavailable.
ResourceExhaustedPer-firm rate limit exceeded.

See Also

RFQ Events Stream

Real-time RFQ and quote events

Trading API

Order entry and lifecycle APIs

Authentication

Required scopes and OAuth flow

Rate Limits

Endpoint-level request limits