Polymarket Combos (2026): How Parlays and the RFQ API Work

The Short Answer
A Polymarket Combo is a parlay-style position that joins 2 to 50 market outcomes into one YES or NO position: YES pays only if every leg wins, and NO pays if any leg loses. Pricing runs through request for quote: you ask for a price, market makers compete with signed quotes inside a 400-millisecond window, and you accept the best one before it expires. The API has a public catalog of eligible markets, a requester gateway, a quoter WebSocket and a Builder Gateway. Settlement multiplies leg outcomes, so a leg that resolves 50-50 halves a YES payout.
Key Takeaways
- Combos live on Polymarket's new Positions Framework, with their own YES and NO position IDs.
- Requests target the YES side: a BUY sets a pUSD budget including fees, and a SELL sets a share count.
- Makers quote within 400 milliseconds, can fill part of a request, and some confirm through a 1-second Last Look.
- Requesters need a Deposit, Proxy or Safe wallet, and each wallet can create 15 requests a minute.
- Collateral return releases pUSD from offsetting Combo positions before the legs resolve.
What is a Polymarket Combo?
Polymarket describes Combos as multi-leg positions that combine underlying market outcomes into one YES or NO position. A Combo of YES on market A, YES on B and NO on C pays out only if A and B resolve YES and C resolves NO. Its NO side is the complement and pays if any of those conditions fails. That is the shape of a parlay, although Polymarket's docs never use the word.
Each Combo has its own ERC-1155 YES and NO tokens, fully collateralized in pUSD, but they live on a new Positions Framework rather than the Conditional Tokens Framework. The leg markets keep trading on the CLOB as usual. One risk is worth stating plainly: a YES Combo pays nothing if any single leg loses.
How does Combo pricing work through RFQ?
Pricing runs through a request for quote auction:
- A user sends an unsigned request with the legs, direction and size.
- Connected market makers submit signed quotes within a 400-millisecond window.
- The RFQ system returns the best quote, and the user accepts it by signing the trade before it expires.
- Makers with Last Look enabled get 1 second to confirm or decline.
- The trade executes on-chain, both sides get execution updates, and connected makers see a trade broadcast.
Polymarket's overview gives a 10-second acceptance window, while its requester guide says five seconds, so treat each quote's expires_at as the real deadline.
How do you request a Combo quote through the API?
Pick legs from the public catalog, which needs no key. It returns active Combo-enabled markets ordered by volume, up to 100 per page, with position_ids, outcomes and outcome_prices aligned so index 0 is YES and index 1 is NO:
const res = await fetch('https://combos-rfq-api.polymarket.com/v1/rfq/combo-markets?limit=5');
const { markets, next_cursor } = await res.json();
for (const m of markets) {
const [yesPositionId] = m.position_ids;
const [yesPrice, noPrice] = m.outcome_prices;
console.log(m.title, { yesPrice, noPrice, yesPositionId });
}
console.log('next page cursor:', next_cursor);
Legs use these position IDs, not CLOB token IDs. In our checks on 3 October 2026, paging through the whole catalog returned more than 180,000 markets, nearly all of them sports.
Requests go to https://combos-rfq-gateway-requester-api.polymarket.com under /v1/requester/rfq, signed with CLOB L2 headers. EOA accounts are rejected, so use a Deposit, Proxy or Safe wallet. A BUY sets a budget including fees, in six-decimal units:
{
"signer_address": "YOUR_DEPOSIT_WALLET",
"maker_address": "YOUR_DEPOSIT_WALLET",
"signature_type": 3,
"leg_position_ids": ["YES_POSITION_ID_1", "YES_POSITION_ID_2"],
"direction": "BUY",
"side": "YES",
"requested_size": { "unit": "notional", "value_e6": "1000000" }
}
The gateway holds the call until the auction ends, then returns an rfq_id, the winning quote with total_required_e6 and net_receive_e6, and expires_at, or FAILED with NO_QUOTES. You sign an Exchange v3 order from those amounts, send it to /requests/{rfq_id}/accept, then poll until FILLED or CONFIRMED, or a terminal FAILED, EXPIRED or CANCELED. A create that times out has an unknown outcome and no idempotency key, so a blind retry can open a second request. Polymarket lists SDK support for this direct flow as coming soon.
How do market makers quote Combos?
Makers connect to wss://combos-rfq-gateway-quoter.polymarket.com/ws/rfq and must authenticate with CLOB credentials and their wallet identity within 30 seconds. Quotes are priced in pUSD per YES share. A maker can fill a buy-YES request by buying NO at 1 minus the price with collateral, or by selling YES from inventory. We type-checked this TypeScript skeleton against @polymarket/client 0.11.0:
import { createSecureClient, relayerApiKey } from "@polymarket/client";
import type { RfqQuoteRequestEvent } from "@polymarket/client";
import { privateKey } from "@polymarket/client/viem";
// Your pricing model: pUSD per YES share, or undefined to skip the request.
declare function priceCombo(event: RfqQuoteRequestEvent): string | undefined;
const client = await createSecureClient({
wallet: process.env.POLYMARKET_WALLET_ADDRESS!,
signer: privateKey(process.env.PRIVATE_KEY!),
apiKey: relayerApiKey({
key: process.env.RELAYER_API_KEY!,
address: process.env.RELAYER_API_KEY_ADDRESS!,
}),
});
await client.setupTradingApprovals();
async function handleQuoteRequest(event: RfqQuoteRequestEvent) {
const price = priceCombo(event);
if (price === undefined) return;
const ref = await event.quote({ price });
console.log("quoted", event.rfqId, event.legPositionIds.length, "legs", ref);
}
const session = await client.openRfqSession();
for await (const event of session) {
if (event.type === "quote_request") void handleQuoteRequest(event);
}
Pricing runs outside the session loop so a slow model never blocks new requests. Pass size to fill part of a request, or source: "inventory" to quote from positions you already hold.
Last Look is offered to makers with about $2,500 in Combo notional volume and an established line of communication with Polymarket, and makers that decline more than 15% of selected quotes over an hour may be paused for a few minutes. Polymarket's own warnings deserve a careful read: same-game legs are often correlated, a thin CLOB midpoint is a poor probability estimate, and 50-50 resolutions change payouts.
Makers who check legs against other venues can pull Polymarket and Kalshi order books from the Predictefy API, in one schema across 15+ venues.
How do Combos work for builders?
Approved builders request and accept Combo quotes for their users through the Builder Gateway, which runs the same auction. In the custodial model, the builder holds users' positions in one omnibus Deposit Wallet. In the non-custodial model, each user signs for their own Deposit Wallet while the builder's server signs its part through remoteBuilderSigning(), so the Builder API secret never reaches the browser. The SDK methods are requestComboQuote(), acceptComboQuote() and waitForComboFill(). Builder attribution only works through this gateway: the requester gateway rejects a non-zero builder field with BUILDER_ATTRIBUTION_NOT_ALLOWED.
What is Combo collateral return?
Quoting Combos can lock pUSD across related positions until every leg resolves. Collateral return finds positions that offset each other, merges the complementary exposure back into pUSD at 1 pUSD per matched share, and leaves the unmatched exposure in residual positions. The flow is plan-based: call planCollateralReturn(), inspect netPusdOut and the position summary, run executeCollateralReturnPlan({ plan }), wait for confirmation, and request a new plan while truncated is true. It needs a Relayer API key and a Deposit, Safe or Proxy wallet.
How do Polymarket Combos settle?
A YES Combo pays the product of its legs' outcomes. If every leg resolves to 1, a share redeems for 1 pUSD. If one leg resolves 50-50 and the rest resolve to 1, it redeems for 0.5, and the NO share redeems for the complement, 1 minus the YES value. When some legs resolve early, the position can be compressed into a simpler one that keeps only the open legs. Redeem winners with redeemPositions({ positionId }), or approve the AutoRedeemer contract for automatic redemption.
What contracts do Polymarket Combos use?
| Contract | Address on Polygon (proxy) |
|---|---|
| PositionManager | 0x006F54F7f9A22e0000CC2AB60031000000ae9fEF |
| BinaryModule | 0x1000008dD9001B968442c1000017eaE6E0dA00Ba |
| NegRiskModule | 0x200000900045e3B6259600682756002200028933 |
| CombinatorialModule | 0x30000034706C7d8e12009DAB006Be20000c031A8 |
| Exchange v3 | 0xe3333700cA9d93003F00f0F71f8515005F6c00Aa |
| AutoRedeemer | 0xa1200000d0002264C9a1698e001292D00E1b00af |
The market maker guide also lists a Router at 0x12121212006e4CD160D18e3f00711DA5c3372600 for splits and position management. Every address above returned deployed code from a Polygon node in our checks on 3 October 2026. Implementation addresses and the rest of Polymarket's contracts are in Polymarket contract addresses.
What are the limits on Polymarket Combos?
| Limit | Value |
|---|---|
| Legs | 2 to 50 unique, mutually compatible positions |
| Side | YES only, for buys and sells |
| Quote window | 400 milliseconds |
| Last Look | 1 second |
| Requester creates | 15 per rolling minute per maker_address |
| Requester and collateral return wallets | Deposit, Proxy or Safe, not EOA |
| Catalog page size | Up to 100 markets |
Kalshi runs its own version, which its API calls multivariate events, and its RFQ system covers those combo markets with an accept-then-confirm flow. The details are in Kalshi combos and the Kalshi RFQ API guide.
Frequently Asked Questions
What is a combo on Polymarket?
A multi-leg position that joins 2 to 50 market outcomes into one YES or NO position. YES pays only if every leg wins, and NO pays if any leg loses.
How are Polymarket combos priced?
Through request for quote. Market makers compete with signed quotes within 400 milliseconds, the best quote goes back to the user, and the user accepts it before it expires.
What happens if a combo leg resolves 50-50?
The YES payout is the product of the leg outcomes, so one 50-50 leg with every other leg winning pays 0.5 pUSD per share, and the NO side pays the remaining 0.5.
Can you sell a Polymarket combo before it resolves?
Yes. A SELL request names the number of Combo shares to sell, and the winning quote states the exact pUSD proceeds after fees.
Is there an API for Polymarket combos?
Yes: a public catalog of Combo-enabled markets, a requester gateway with CLOB L2 authentication, a WebSocket for market makers and a Builder Gateway for approved builders.