Skip to main content
A parlay starts as a quote request — your legs, priced live by market makers — and becomes a real position the moment you accept a quote. From there it settles automatically when the underlying markets resolve, or you can close it early. You’ll see this progression in the status field on the parlay (RFQ) object: A parlay can also end at cancelled or expired before it’s funded.

Place a parlay

1

Open a quote request

Add 2–5 legs and a bet amount. Each leg names a market and a side (yes / no). The market_ticker is venue-specific:
  • Kalshi — the market ticker, e.g. KXBTC-25FEB07-T100000.
  • Polymarket — the condition_id (the 0x-prefixed hex string), not the slug or question id. Both sides of a binary share one condition_id, distinguished by side.
Totalis validates each market, applies leg-exclusion rules (correlated legs can’t be combined), and broadcasts the request to market makers. See Create quote request for the full field reference.The amount actually locked is your bet amount minus a 1% taker fee, charged upfront when you place the trade — so don’t expect the locked stake to exactly match bet_amount.
2

Market makers quote it

Makers stream the request and submit quotes with payout odds. You watch them arrive live on the quote-request stream. Each quote carries:
  • user_cost — your stake (the bet amount).
  • total_payoutbet_amount × payout_odds, what you receive if every leg wins.
  • payout_odds — the multiple on your stake.
  • book_seq — the SSE event’s sequence number, carried alongside the quote. You’ll need it later to prove your pricing was current when you commit.
3

Commit the best quote

Accept a quote to lock the trade. Totalis selects the best still-valid quote for the version you saw and creates the parlay with that quote already accepted.
The response returns the real rfq_id, the accepted quote, and the payout odds. Status: accepted.
4

The parlay funds on-chain

The maker confirms, and your stake and the maker’s collateral lock atomically in on-chain Solana vaults. Gas is sponsored — you only ever need USDC.Status moves to confirmed, then executed once the position is live on-chain. If the maker doesn’t confirm in time, the parlay reopens for other makers (or expires if its window has passed) and your funds are never touched.
5

It settles automatically

When every leg’s market has resolved, the position settles:
  • All legs win — you receive the full payout (the maker’s collateral, minus a protocol fee on profit).
  • Any leg loses — your stake transfers to the maker (minus fee).
Status: settled. Read the outcome and transaction signatures from GET /v1/rfqs/{id}.

Closing early (cashout)

Once a parlay is live (executed), you don’t have to wait for settlement — you can close it by accepting a buyback price from the maker that backs it. Your stake is always returned; the buyback amount is the net on top: the maker pays you when you’re in profit, you pay the maker when you’re underwater (gross of a profit fee). A cashout is its own short-lived request, separate from the parlay’s status:
1

Request a cashout

Read position_id from the parlay object (GET /v1/rfqs/{id}) once it’s executed — it’s set there and used to open the cashout.
2

The maker prices it

The backing maker re-values the position at current odds and either streams a buyback quote or declines (if a leg is already decided). The quote carries the net you’d receive.
3

Commit

The buyback executes on-chain. Once it confirms, your stake is released, the realized P&L lands on the parlay’s cashout object, and the parlay becomes bought_back.

Status reference

The status on a parlay (RFQ): Quotes carry their own status — withdrawn (the maker pulled it), expired (its validity lapsed), or rejected (you accepted a different quote on the same request).

Limits