Quoter Gateway
The primary channel is WebSocket. REST is a fallback for quoter commands and does not stream RFQ requests, confirmation requests, or execution updates. Quoter gateway websocket:| Transport | Path | Use |
|---|---|---|
| WebSocket | GET /ws or GET /ws/rfq | Auth, RFQ stream, quote submission, quote cancellation, last-look responses |
| REST | See REST Endpoints | Quote submission, quote cancellation, last-look responses |
Connection Requirements
- Send the
authmessage as the first WebSocket message within 30 seconds. - The gateway sends WebSocket ping control frames every 30 seconds with payload
rfq. - Your client must respond with pong control frames. Most WebSocket clients do this automatically.
- The gateway closes stale connections after 2 minutes without an inbound message or pong.
- The gateway responds to client ping control frames with pong control frames.
Authentication
WebSocket Auth
Authenticate with CLOB API credentials and the signer/maker identity used for RFQ orders. See Getting API Credentials to create or derive CLOB API keys.| Service | URL |
|---|---|
| CLOB | https://clob.polymarket.com |
| Quoter WebSocket | wss://combos-rfq-gateway-quoter.polymarket.com/ws/rfq |
137 is used for CLOB authentication and Exchange v3 order signing.
Create or derive production CLOB credentials:
apiKey, secret, and passphrase in the websocket auth message below.
| Field | Type | Description |
|---|---|---|
auth.apiKey | string | CLOB API key |
auth.secret | string | CLOB API secret |
auth.passphrase | string | CLOB API passphrase |
identity.signer_address | string | Address that signs orders |
identity.maker_address | string | Wallet that funds orders |
identity.signature_type | number | signature type |
| Signature type | signer_address | maker_address / funder |
|---|---|---|
0 EOA | EOA address | Same EOA address |
1 Proxy | Authenticated signing address | Derived proxy wallet |
2 Safe | Authenticated signing address | Derived Safe wallet |
3 POLY_1271 | Deposit wallet address | Same deposit wallet address |
POLY_1271, the CLOB API-key owner may be different from the deposit wallet, but the signed RFQ order must use the deposit wallet as both signer and maker.
For more detail, see CLOB signature types and the Deposit Wallet order signing guide.
Production Onboarding
Production RFQ participation is currently onboarding-based. Before connecting a production quoter:- Share the intended
signer_address,maker_address, andsignature_typewith your Polymarket onboarding contact. - Confirm the quoter’s RFQ tier and whether last look is enabled.
- Create or derive production CLOB credentials against
https://clob.polymarket.com. - Fund the
maker_addresswith the pUSD or combo positions needed for the orders it will quote. - Complete the Exchange v3 approvals from the
maker_address. - Connect to
wss://combos-rfq-gateway-quoter.polymarket.com/ws/rfq. - Send the
authmessage as the first application message.
Exchange v3 Approvals
Before submitting RFQ quotes, the quoter’smaker_address must approve Exchange v3 to spend the assets used for combinatorial RFQ settlement. AutoRedeemer approval is optional and only needed for redeeming resolved positions through AutoRedeemer.
| Approval | Required for RFQ execution? | Contract call |
|---|---|---|
| pUSD collateral | Yes | CollateralToken.approve(ExchangeV3, maxUint256) |
| Combo positions | Yes | PositionManager.setApprovalForAll(ExchangeV3, true) |
| AutoRedeemer position approval | No | PositionManager.setApprovalForAll(AutoRedeemer, true) |
| Contract | Address |
|---|---|
CollateralToken | 0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB |
PositionManager | 0x006F54F7f9A22e0000CC2AB60031000000ae9fEF |
ExchangeV3 | 0xe3333700cA9d93003F00f0F71f8515005F6c00Aa |
AutoRedeemer | 0xa1200000d0002264C9a1698e001292D00E1b00af |
maker_address is a contract wallet, proxy wallet, Safe, or deposit wallet, the approval transactions must be submitted by that wallet. An approvals UI for all wallet types, including deposit wallets, will be available shortly.
Message Schemas
RFQ_REQUEST
Gateway to quoter. Broadcasts an active RFQ request.
| Field | Type | Description |
|---|---|---|
type | string | Always RFQ_REQUEST |
rfq_id | string | Server-assigned RFQ ID |
requestor_public_id | string | Opaque public ID for the RFQ source |
leg_position_ids | array | Canonical leg position IDs in the combo |
condition_id | string | Derived combinatorial condition ID |
yes_position_id | string | Derived YES combo position ID |
no_position_id | string | Derived NO combo position ID |
direction | string | BUY or SELL |
side | string | Currently YES |
requested_size | object | Requested RFQ size and unit |
submission_deadline | number | Quote submission deadline in Unix milliseconds |
requested_size.unit is notional for requester BUY RFQs and shares for requester SELL RFQs. requested_size.value_e6 is a six-decimal fixed-point value encoded as a string.
leg_position_ids are the constituent legs for the combinatorial position being requested. Note that each leg can be either a YES or NO outcome.You can retrieve market information for each leg by using the following Gamma API endpoint: https://gamma-api.polymarket.com/markets?position_ids=<position_id>RFQ_QUOTE
Quoter to gateway. Submit before submission_deadline.
| Field | Type | Description |
|---|---|---|
type | string | Always RFQ_QUOTE |
rfq_id | string | RFQ ID from RFQ_REQUEST |
price_e6 | string | Quote price in six-decimal fixed-point units |
size_e6 | string | Fillable share count in six-decimal fixed-point units. Note that this differs from the request’s size field, which may be notional or share count. |
signed_order | object | Signed Exchange v3 order |
*_e6 fixed-point fields are encoded as strings to avoid number precision issues.
Use direction from RFQ_REQUEST to choose the signed order side and token:
RFQ direction | Quoter order | signed_order.side | signed_order.tokenId |
|---|---|---|---|
BUY | Buy the complementary NO position with pUSD | 0 | no_position_id |
BUY | Sell the YES position for pUSD | 1 | yes_position_id |
SELL | Buy the YES position with pUSD | 0 | yes_position_id |
SELL | Sell the complementary NO position for pUSD | 1 | no_position_id |
RFQ trades for Combinatorial positions settle through a distinct Exchange
contract, called Exchange v3. You can find more details about signing orders
for Exchange v3 here.
ACK_RFQ_QUOTE
Gateway to quoter.
RFQ_QUOTE_CANCEL
Quoter to gateway. Cancel an active quote before the end of the competition window.
| Field | Type | Description |
|---|---|---|
type | string | Always RFQ_QUOTE_CANCEL |
rfq_id | string | RFQ ID |
quote_id | string | Server-generated quote ID |
signer_address | string | Must match authenticated signer_address |
maker_address | string | Must match authenticated maker_address |
ACK_RFQ_QUOTE_CANCEL
Gateway to quoter.
RFQ_CONFIRMATION_REQUEST
Gateway to quoter. Sent when the quote’s maker is Tier 1 and has last-look enabled.
| Field | Type | Description |
|---|---|---|
type | string | Always RFQ_CONFIRMATION_REQUEST |
rfq_id | string | RFQ ID |
quote_id | string | Selected quote ID |
signer_address | string | Selected signer address |
maker_address | string | Selected quoter wallet |
signature_type | number | Selected signature type |
leg_position_ids | string[] | Combo leg position IDs |
condition_id | string | Derived combinatorial condition ID |
yes_position_id | string | Derived YES combo position ID |
no_position_id | string | Derived NO combo position ID |
direction | string | BUY or SELL |
side | string | Currently YES |
fill_size_e6 | string | Selected fill size in six-decimal fixed-point units |
price_e6 | string | Selected quote price in six-decimal fixed-point units |
confirm_by | number | Confirmation deadline in Unix milliseconds |
RFQ_CONFIRMATION_RESPONSE
Quoter to gateway. Respond before confirm_by.
| Field | Type | Description |
|---|---|---|
type | string | Always RFQ_CONFIRMATION_RESPONSE |
rfq_id | string | RFQ ID |
quote_id | string | Selected quote ID |
decision | string | CONFIRM or DECLINE |
signer_address, maker_address, or signature_type in RFQ_CONFIRMATION_RESPONSE. The gateway applies identity from the authenticated session.
ACK_RFQ_CONFIRMATION_RESPONSE
Gateway to quoter.
RFQ_EXECUTION_UPDATE
Gateway to selected quoters.
| Field | Type | Description |
|---|---|---|
type | string | Always RFQ_EXECUTION_UPDATE |
rfq_id | string | RFQ ID |
status | string | MATCHED, MINED, RETRYING, CONFIRMED, or FAILED |
tx_hash | string | Transaction hash, when available |
CONFIRMED and FAILED are terminal.
RFQ_ERROR
Gateway to quoter. Sent when a command fails validation or cannot be applied.
| Field | Type | Description |
|---|---|---|
type | string | Always RFQ_ERROR |
request_type | string | Inbound command that failed, when parsed |
rfq_id | string | RFQ ID, when present on the failed command |
quote_id | string | Quote ID, when present on the failed command |
code | string | Stable machine-readable error code |
error | string | Human-readable error detail for logging and debugging |
| Code | Meaning |
|---|---|
INVALID_MESSAGE | Message JSON or message type is invalid |
UNAUTHORIZED_ROLE | Message is not allowed for the authenticated gateway role |
ADDRESS_MISMATCH | Message identity does not match the authenticated session |
ALLOWANCE_VALIDATION_FAILED | Maker allowance is insufficient for the quoted order |
BALANCE_VALIDATION_FAILED | Maker balance is insufficient for the quoted order |
UNKNOWN_RFQ | RFQ ID is not active or no longer exists |
EXPIRED_RFQ | RFQ has expired |
SUBMISSION_WINDOW_CLOSED | Quote arrived after the submission window closed |
INVALID_QUOTE | Quote payload or signed order is invalid |
INVALID_RFQ_STATE | RFQ is not in a state that accepts the requested command |
INVALID_CONFIRMATION | Last-look confirmation payload is invalid |
MAKER_NOT_REQUIRED | This quote maker is not required for last-look confirmation |
MAKER_ALREADY_RESPONDED | This quote maker already responded to the confirmation request |
PRE_EXECUTION_BALANCE_RESERVATION_FAILED | Balance reservation failed before execution |
SERVICE_UNAVAILABLE | RFQ service dependency is temporarily unavailable |
Signing Orders With Viem
Use the Exchange v3 address and order-signing chain ID provided during onboarding. The example below signs a BUY order for the token the quoter should buy for a request.signed_order in RFQ_QUOTE.
REST Endpoints
Get Combo Markets
Returns active markets that can be used as combo legs. This endpoint is public and does not require CLOB authentication.| Query parameter | Type | Description |
|---|---|---|
limit | integer | Number of markets to return. Defaults to 50; maximum 100. |
cursor | string | Opaque cursor returned as next_cursor by the previous response. |
exclude | string | Comma-separated condition IDs to omit, such as markets already shown. |
next_cursor unchanged in the next request; a value of null indicates the final page.
position_ids, outcomes, and outcome_prices correspond by array index.
Authenticated Maker Commands
The remaining REST endpoints use CLOB L2 HTTP authentication. See Getting API Credentials and L2 Authentication Headers.| Method | Route | Use |
|---|---|---|
POST | /v1/maker/quotes | Submit a quote |
POST | /v1/maker/quotes/cancel | Cancel a quote |
POST | /v1/maker/confirmations | Confirm or decline last look |
POST /v1/maker/quotes
REST does not assign a quote ID. Generate quote_id client-side.
POST /v1/maker/quotes/cancel
POST /v1/maker/confirmations
Reading Combos (Data API)
Combos created through RFQ are queryable from the Data API. A combo trade in a user’s activity feed is flagged withisCombo (flag only — no legs embedded); its conditionId equals the combo’s combo_condition_id. Collect those ids and pass them as market_id (CSV) to fetch combo detail.
These endpoints are available on the Data API:
GET /v1/positions/combos
Current combo positions for a user, with per-leg breakdown. Also at /v1/data/user/{address}/positions/combos.
GET /v1/activity/combos
Combo lifecycle and redeem events (split / merge / convert / redeem) for a user, same per-leg shape. Also at /v1/data/user/{address}/activity/combos.