Skip to main content
Combine two to ten Polymarket outcomes into a single combo (also called a parlay) — one position that pays out only if every leg wins. Combos are quoted and filled by makers over an RFQ (request-for-quote) gateway rather than resting on an order book, so a combo has no limit price and no partial resting state: you take a quote or you don’t. Use this page to price a parlay, fill it, list what you hold, sell it back before resolution, and collect a win. Full parameter reference and a live tester: API Reference.

Base URL

Provider support

Combos are Polymarket-only. There is no exchange_id parameter on any endpoint on this page. Connect a supported Polymarket wallet to use combos.

Authentication

Same API-key headers as Orders:
Examples below read credentials from KAIROS_CLIENT_ID, KAIROS_API_KEY, and KAIROS_API_SECRET in your shell. Scopes differ per endpoint, and so does the status code for a bad credential triple: If redemption returns AUTH_POLICY_OUTDATED, approve the pending trading-permissions update indicated by update_policies, then retry.

Field naming

Gotcha: every request and response field on this page is camelCase — legPositionIds, notionalUsd, blendedPriceE6, sharesBalance. Orders uses snake_case (time_in_force, client_order_id, filled_quantity) in the same service. A client that shares one serializer across both will silently send fields the combo endpoints ignore.

Number formats

Gotcha: every field suffixed E6 is six-decimal fixed point, serialized as a decimal string — "16393" means 0.016393. This applies to prices, proceeds, fees, and share counts alike. Divide by 1,000,000 to get a human value. Two fields break that pattern:
  • legs[].currentPrice on combo positions is a plain 0–1 decimal, not e6 and not cents.
  • maxPriceCents on execute is in cents per share (60 = $0.60), the only cents-scaled field on this page.
Combos settle in pUSD. The *Usdc field names are retained for compatibility. BUY execution and cash-out share the per-user order submission limit. Exceeding it returns 429; wait before submitting another order.

Wallet-type limits

Combo support depends on the kind of wallet backing your account, and the limits differ per action: Imported Deposit Wallets can request quotes. Buying and redemption are unavailable; cash-out requires an eligible wallet and returns 400 if unsupported.

Quote a combo

Prices a prospective combo without placing it. Use this endpoint while building a parlay. Scope trade:read. A bad credential triple is 401. BUY and cash-out quotes share a limit of 20 requests per minute per user by default; exceeding it returns 429.

Request

Fewer than two legs is 400 a combo needs at least 2 legs; more than ten is 400 a combo supports at most 10 legs. A notionalUsd that rounds to zero at six decimals is 400 notionalUsd too small or invalid.

Response

A quote is a maker price, not a reservation. If no maker will price the parlay you get 400 with a message explaining why — see Quote failures.

Execute a combo

Requests a quote and fills it in one call. There is no separate “accept quote” step and no quote id to pass in from /combo/quote. Scope trade:execute. A bad credential triple is 403.

Request

Response

If the price moved past maxPriceCents between quote and fill, nothing is traded and the call is 400 The price moved and the quote came back worse than your limit, so nothing was traded. Please try again.

List combo positions

Lists combo positions held by your wallet. Scope position:read. A bad credential triple is 401.

Request

No parameters.
Gotcha: The response includes up to 50 positions. Pagination is unavailable.

Response

Gotcha: branch on redeemable, never on status. status stays OPEN on a combo that has won and not yet been redeemed.
Every field is always present — this response contains no nulls and omits nothing. If positions cannot be loaded, the endpoint returns 500. Retry later.

Quote a cash-out

Prices selling a combo position back to a maker before its legs resolve. Unlike cash out itself, this accepts any positive share count, so you can price a hypothetical partial exit even though only full exits can be executed. Scope position:read. A bad credential triple is 403. Rate limit: 20 requests/minute per user by default, shared with BUY quotes. Exceeding it returns 429 with error_details.code = EXCHANGE_POLYMARKET_RATE_LIMITED.

Request

Response

minProceedsUsd on cash out is compared against proceedsE6, after venue fees but before the Kairos platform fee — not netProceedsE6. Set your floor accordingly, or the fee will eat into the amount you thought you were protecting.

Cash out a combo

Sells a combo position back to a maker before resolution. Scope trade:execute. A bad credential triple is 403. Partial cash-outs are not supported. shares must equal your entire held balance exactly; anything else is 400 partial parlay cash-outs are unavailable; cash out the full position.

Request

Gotcha: minProceedsUsd does not protect the amount you receive. The floor is checked after venue fees, and the Kairos platform fee is deducted afterwards, so a cash-out that passes your floor can still land below it in the wallet. To protect a true net figure, quote first and set minProceedsUsd to your target plus the feeE6 the quote returned.

Response

When cash-out is unavailable

A resolved combo has no maker to sell to, so these are all 400:

Redeem a combo

Collects the payout on a combo whose legs have all resolved in your favour. Redemption always takes the entire on-chain balance — there is no amount parameter. Scope trade:execute. A bad credential triple is 403. Deposit wallets only. EOA and imported wallets are rejected 400 combo redemption is currently supported only for Kairos deposit wallets.

Request

A condition id of the wrong length is 400 conditionId must be 31 bytes (a bytes31), got <n> bytes from '<value>'; one that is not on your wallet is 400 no combo with that conditionId on this wallet.

Response

Gotcha: batchTxId is a redemption reference, not an on-chain transaction hash. Do not feed it to a block explorer.
Redemption is idempotent on-chain, but a second call is reported as a 400, not a success: once the balance is zero you get 400 this parlay isn't redeemable — it hasn't resolved as a win yet, or has already been redeemed or 400 combo has no redeemable share balance (already redeemed?). Check redeemable on the position before calling.

Quote failures

POST /combo/quote, /combo/execute, /combo/cash-out-quote, and /combo/cash-out can return these quote-related 400s. All four are transient and safe to retry: If combo trading is unavailable, the API returns 503 with EXCHANGE_POLYMARKET_API_ERROR. Rate limits return 429. An execution whose outcome cannot be confirmed returns 503 with TRANSACTION_TIMEOUT and an RFQ reference in error_details.details. Do not automatically resubmit: the trade may still execute. Check your combo positions and retain the RFQ reference for support.

Errors

Endpoints on this page return the same structured envelope as order submission:
As on Orders, top-level code is a legacy PascalCase string and error_details.code is the canonical SCREAMING_SNAKE_CASE wire code — match on error_details.code. error_details.details and error_details.metadata are omitted when absent, never null. Authentication failures can return a bare {"error": "<message>"} with no error_details. The Code column below holds error_details.code where this page names one; most statuses on this page cover several conditions that do not share a distinct code, and those are —. The platform fee is returned separately by cash-out-quote; the cash-out response does not include a separate fee field.