Skip to main content
Send X-Kairos-Wallet-Api: 2 and either X-Kairos-Partner-Id or an API key on every request (authentication). Bodies are JSON with camelCase field names. The machine-readable schema is in the API reference.

Endpoints

“Needs a sign-in token” applies with a partner id. An API key whose account owns the wallet doesn’t need one. Preview endpoints are documented on fees, trade plans and on-chain intents.

Start an action

  • market is venue:market_id: polymarket:0x…, predictfun:1027194, hyperliquid:11492. A bare 0x… condition id is Polymarket.
  • price and size are strings. Prices are 0–1; sizes are shares.
  • If the wallet isn’t set up on the order’s venue, the order runs the missing setup first, in the same action.
  • Per-venue rules (time in force, decimals, minimums) are on venues.

clientOrderId

Your own id for an order, unique per wallet and venue. Use it to retry an order safely. Up to 128 characters, and it can’t start with trade-plan: (400 clientOrderId uses a reserved prefix). On Hyperliquid it must be 0x plus 32 lowercase hex characters. Terms compare as numbers, so "0.5" and "0.50" are the same price. An order whose outcome is unknown keeps its id.

The step

Every action response is a step:

Timing

expiresAtMs gives the exact deadline for each step. A signature that arrives later fails the action with SIGNATURE_EXPIRED. Once you post a signature, the work runs to completion on Kairos’s side, even if your request times out or drops. Posting the same signature again never places a second order: it returns the action as it is now.

Results

Setup

  • ready is true when every requested venue is ready. tradingWallet and transactionHash at the top are Polymarket’s.
  • A venue that needs funds (next: "fund") or can’t be used (next: "blocked") still ends the action done, with the reason in venueDetail.reason.
  • Setup continues past a venue that fails, and reports it as { ready: false, error }. The action fails only if every venue failed.
  • Predict.fun adds sessionExpiresAt.

Order

message is one of:
  • No fill: the venue matched none of this order
  • The order failed at the venue; any fills shown were reverted
  • The venue rejected the order
  • Outcome not confirmed yet; check this wallet's orders before placing it again
How results end:
  • A FAK, FOK or IOC order normally ends with final: true. One that matched nothing fails with NO_MATCH instead.
  • A GTC or GTD order that rests ends done with final: false. Follow it in orders.
  • Predict.fun reports no fills when an order is posted, so its results have final: false.
  • If a final match later fails to settle on-chain, the action shows status: "failed", the reverted fills, final: true and success: false.
Amounts are gross. Venue fees are charged on top, or out of proceeds, by the venue. Order results and order rows carry no fee fields.

Delayed markets

Some Polymarket markets hold every order that could take liquidity for a short delay before matching it. Sports markets do this during games (usually 1–3 seconds), and some others hold for 250 ms. Market data shows the delay as match_delay_ms (Show markets). A held order keeps its action working. The step carries holdUntilMs and a provisional result with final: false:
When the delay ends, the action becomes done with the real fill and final: true. If the venue matches none of it, it is still done, with filledSize: "0", final: true, success: false and message: "No fill: the venue matched none of this order". In the rare case that the action’s 15 minutes run out first, it ends done with what is known and final: false. You don’t need a sign-in token to follow a held order.

Cancel

  • Cancel by id: failed lists each order that couldn’t be cancelled, with reason. Ids that aren’t this wallet’s orders are reported as order not found.
  • Cancel all: failed is a count, and venueDetail holds per-venue counts: { "polymarket": { "cancelled": 1, "failed": 0 } }.
  • If no venue confirmed and one may have acted, the action fails with CANCEL_OUTCOME_UNKNOWN and keeps the result.

Login

{ "token": "…", "expiresAt": "2026-10-29T12:00:00Z" }. Send it as Authorization: SIWE <token> (details).

Wallet status

GET /v3/wallets/{address}:
venueDetail keys: Venues that aren’t offered on your deployment are left out.

Orders

GET /v3/wallets/{address}/orders?open=true&limit=50&venue=polymarket
status is one of pending, queued, locked, executing, live, partial, filled, cancelled, expired, failed, orphaned. venueDetail appears only when a venue couldn’t be read.

Positions

GET /v3/wallets/{address}/positions?venue=polymarket. The snapshot is nested under positions:
resolved lists positions whose market resolved; redeemable is true for winners (redeem them). closed lists positions closed to zero. For realized P&L on closed positions, use trader stats.

Errors

An error is JSON: { "error": "message" }, sometimes with code. The HTTP layer answers some malformed requests in plain text instead (details). After a signature is posted, failures come back as HTTP 200 with status: "failed" and an errorCode, not as error statuses.

Error codes

A failed action carries one of these in errorCode. The same codes appear as code on an HTTP error body. Failures without a code, such as a wallet that isn’t ready or too many orders; slow down, are described in error.
ORDER_OUTCOME_UNKNOWN: the order may be live. It happens when the venue doesn’t answer clearly (a timeout or a server error) and Kairos can’t find the order there afterwards. Check /v3/wallets/{address}/orders?open=true before placing it again, or retry with the same clientOrderId and terms: you get the existing order back, never a second one.