Market Orders
Execute immediately at the best available 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.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 metadatatoken_id— the token identifier for the 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.
quantityandpriceare 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", not0.45.expiration_minutes,max_slippage_cents, andmax_retriesare ordinary JSON integers — do not quote those.
expiration_minutesis validated and applied only whentime_in_forceisGTD. 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.
Example
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.
Example
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.
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
Themarket_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.55 profit
(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.
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.
