Skip to main content
This page covers everything you send when placing an order on Kairos — the order kinds, how to name an outcome, time-in-force, price format — and everything you do afterwards: reading status and cancelling. Reach for it when you are building order submission and want to know which fields are required and which values a venue will actually accept. For the full request/response schema see the Orders API reference; for live try-it panels see the API Reference.

Market Orders

Execute immediately at the best available price.
Use market orders when you want immediate execution and are willing to accept the current market price.
price is required even for market orders. Kairos treats it as the limit you’re willing to cross to, not a market-price sentinel, and rejects the order without it. Submit the live same-outcome quote — ask for buys, bid for sells — pulled from the Market Data WebSocket or GET /markets/batch-prices.

Limit Orders

Place an order at a specific price. The order rests on the book until filled or cancelled.
Use limit orders when you want to specify your price. You pay maker fees if your order rests on the book.

Specifying the Outcome

Each prediction market has multiple outcomes. Name the one you’re trading with either field — not both:
  • outcome — the exact human-readable outcome label from market metadata
  • token_id — the token identifier for the outcome
Never submit a generic side alias (yes/no, long/short) as the outcome — use the exact label from market metadata, even for binary markets. Market and limit orders must include the price for the outcome you’re submitting; Kairos does not infer a price from the opposite outcome.

Order Sides

To close a position, sell the same outcome label you bought — not the opposite outcome.

Time in Force

Control how long your order stays active. GTC/GTD are resting (limit-style); FOK/FAK/IOC are immediate taker executions.

Per-venue support

An unrecognized non-empty time_in_force is rejected, not silently downgraded to GTC. A recognized value the target venue does not support is a separate error. Both are 400 VALIDATION_INVALID_ORDER — see Submission errors for the exact messages.
time_in_force and side are case-insensitive and trimmed on input. kind is case-sensitive — "Market" is a 400, only "market" and "limit" parse.

Order Parameters

*Provide either outcome or token_id.
quantity and price are decimal strings, not JSON numbers. That is the documented request contract, and it is the form Kairos serializes decimals back to you in responses — so a value that round-trips through your client stays exact. The parser does also accept an unquoted JSON number, but a fractional one is converted via a binary float on the way in, so the string form is the only one guaranteed to be preserved digit-for-digit. Send "0.45", not 0.45. expiration_minutes, max_slippage_cents, and max_retries are ordinary JSON integers — do not quote those.
expiration_minutes is validated and applied only when time_in_force is GTD. On any other TIF the field is accepted and silently discarded, so an out-of-range value there does not produce an error.
API-key buy minimum. Buy orders submitted with API-key credentials must be worth at least $5 notional (quantity × price).

Submission errors

EXCHANGE_UNSUPPORTED is reserved for an exchange_id that is not registered at all — it is not the error for a bad venue/TIF combination.

Order Status

Orders transition through multiple statuses during their lifecycle. Statuses visible to clients: Terminal statuses (no further transitions): filled, cancelled, expired, failed. partial is not terminal — a partially filled order is still working.
More statuses can appear on the wire. queued, locked, executing, and orphaned are internal states. queued/locked/orphaned are persisted as pending, so read-back reports pending for them; executing is persisted and returned by GET /orders / GET /orders/{order_id} while a worker submits the order to the venue. Treat all four as non-terminal, in-flight states.

Managing Orders

Cancel an Order

Cancels a single open order. Available from the Orders panel or the REST API.
Request Example
Response
This endpoint almost always returns 200, even when the cancel doesn’t happen. If the order is already terminal (filled/cancelled/expired/failed) or the venue currently refuses the cancel, you get success: false with an explanatory message — not a 4xx. Check success, not just the status code. Non-2xx codes are reserved for auth/ownership/not-found/infrastructure failures.

Cancel All

Cancels all your open orders on an exchange at once — the kill-switch path. Optionally restrict to a specific market.
Request Example
Response
Errors
Unlike single-order cancel, a bad exchange_id here is a real 400. This is the kill-switch path, so a caller-input problem must be visibly distinct from “the venue kept orders resting.”

Cancel a Batch

Cancels a specific list of order ids — up to 100 per request, deduplicated server-side, all on the same exchange.
Request Response fields: cancelled_count, noop_count, failed_count, cancelled_order_ids, noop_order_ids, and a failures array of {order_id, exchange_order_id, reason}. success is true only when failed_count is zero. Errors — note these differ from cancel-all:

Per-venue cancel semantics

The market_id form and cancel mechanism differ per venue — Polymarket accepts a numeric market id or a 0x… condition id, Kalshi expects the raw Kalshi ticker, and Predict.fun accepts a numeric market id only.
Predict.fun cancel-all is synthetic and non-atomic — it is composed of a listing plus batched per-order cancels, 100 per venue request. See per-venue semantics for the failure modes.

Price Format

Prediction market prices represent probabilities.
  • Price of 0.45 means 45% implied probability
  • Your payout if correct is always $1.00 per contract
  • Buying at 0.45 risks 0.45towin0.45 to win 0.55 profit
Kairos admits any price in (0, 1.0] — strictly greater than zero, and 1.0 itself is accepted — on every exchange. Out-of-range prices are rejected 400 VALIDATION_INVALID_PRICE; see Submission errors. That is the admission gate only. Your price must additionally sit on the venue’s tick grid, which is enforced downstream and rejects separately:
Venues also apply their own price bounds, so a price Kairos admits can still be rejected by the exchange.
For live prices to build market orders from, use GET /markets/batch-prices (see Markets) or subscribe to the Market Data WebSocket. For historical OHLCV instead, the dedicated Market Data API has a higher-throughput free tier.