Start a wallet action (setup, order, cancel, login)
Starts one action for a self-custody wallet and returns its first step. Kairos never holds the wallet’s key: each step either asks the wallet for one EIP-1193 request (status: needs_signature) or reports progress (working) or the outcome (done / failed).
The step loop.
POST /v3/actions → a step.
While status is needs_signature: switch the wallet to chainId (when non-null), run request through the wallet’s EIP-1193 provider, and POST /v3/actions/{id} with {"signature": "0x…"} (or {"result": …} for wallet_sendCalls). Answer before expiresAtMs.
While status is working: GET /v3/actions/{id} every 1–2 s (or after holdUntilMs when present).
Stop at done (read result) or failed (read error and errorCode).
Action types.setup prepares the wallet on each requested venue; order places one order and runs any missing setup first, in the same action; cancel cancels orders on every venue with one Polygon signature; login returns a sign-in token for the private reads. There are no other action types.
Body rules. Field names are camelCase only: unknown fields — including snake_case spellings such as time_in_force, post_only, client_order_id, expires_at, order_ids — are silently ignored, so a snake_case order becomes a GTC, non-post-only order without a client id. price and size must be JSON strings; a JSON number is rejected with a plain-text 422. expiresAt is an integer (Unix seconds).
Idempotency.Idempotency-Key is not honoured here. Use clientOrderId on orders: the same clientOrderId with the same terms returns the existing order (nothing is signed), and different terms are refused with CLIENT_ORDER_ID_CONFLICT.
Timing. An action lives 15 minutes from creation and stays readable for 10 more minutes, then reads 404. Polymarket and Predict.fun order signatures are accepted for about 60 s, Hyperliquid order signatures for 300 s, and cancel signatures (every venue) for 300 s; expiresAtMs on the step is authoritative.
Errors before the first signature are HTTP errors. When the action fails before the wallet was ever asked to sign (for example every requested venue is unavailable), the response is that error’s status and body rather than a failed step.
Send X-Kairos-Wallet-Api: 2; without it this route serves the original Polymarket-only contract.
Wallet API partner id, issued by Kairos together with the partner's base URL. Identifies the partner (tenant) on every /v3 call; sent instead of an API key. Letters, digits and ._:-, at most 64 characters, case-insensitive. A partner id issued for an individual account cannot be sent this way — that account sends its API key triple instead.
Wallet API contract version. Send 2 — the multi-venue contract this reference documents. Without the header (or with any other value) /v3/actions and /v3/wallets/* serve the original Polymarket-only contract, which ignores venue prefixes, expiresAt and setup.venues, omits chainId, venue and fallbackRequests from steps, refuses orders on a wallet that is not set up (409), and returns snake_case order and position rows.
Available options:
2
Body
application/json
Body of POST /v3/actions. camelCase only — unknown fields, including snake_case spellings, are ignored without error.
The action's first step. Usually needs_signature; done when nothing needs signing (a wallet already set up, or a clientOrderId that already names this exact order).
The current step of an action. Every response from /v3/actions and /v3/actions/{id} is one of these.
EIP-155 chain id (hex) the wallet must be on to answer — 0x89 Polygon, 0x38 BNB Chain, 0xa4b1 Arbitrum One (0x66eee Arbitrum Sepolia on Hyperliquid testnet). null for personal_sign and when nothing is asked.
Present with wallet_sendCalls requests only — the same calls as individual eth_sendTransaction requests, for wallets without EIP-5792. Send them in order and answer with {"result": ["0xhash", …]}.
Machine-readable reason on a failed step; the key is omitted when the failure has no code. Codes may be added; treat an unknown code as a failure whose order was not placed.
Code
Meaning
Order placed?
NO_MATCH
An immediate order (FOK/FAK/IOC) found nothing to match.
No
VENUE_REJECTED
The venue refused the order.
No
ORDER_OUTCOME_UNKNOWN
The submission's outcome is unknown. Read the wallet's orders before placing again.
Maybe
CANCEL_OUTCOME_UNKNOWN
Some venue may have cancelled. Read the wallet's orders.
Maybe
SIGNATURE_EXPIRED
The signing window closed before a signature was accepted. Nothing was sent.
No
CLIENT_ORDER_ID_CONFLICT
The clientOrderId names an order with different terms.
No
HYPERLIQUID_AGENT_MISSING
Hyperliquid no longer lists this wallet's trading approval. Run setup again.
{"docsConfig":{"theme":"luma","$schema":"https://mintlify.com/docs.json","name":"Kairos","colors":{"primary":"#807dfe","light":"#6d6ae0","dark":"#a5a3ff"},"logo":{"light":"https://mintcdn.com/kairos-c5456474/JzYk92-enXUuMl0B/logo/kairos-wing.png?fit=max\u0026auto=format\u0026n=JzYk92-enXUuMl0B\u0026q=85\u0026s=c7c397bb87847c7f0e27019d68594bff","dark":"https://mintcdn.com/kairos-c5456474/JzYk92-enXUuMl0B/logo/wordmark.png?fit=max\u0026auto=format\u0026n=JzYk92-enXUuMl0B\u0026q=85\u0026s=8f2796ccf6273359a7ad0713bc86686d"},"favicon":"https://mintcdn.com/kairos-c5456474/JzYk92-enXUuMl0B/logo/kairos-wing.png?fit=max\u0026auto=format\u0026n=JzYk92-enXUuMl0B\u0026q=85\u0026s=c7c397bb87847c7f0e27019d68594bff","appearance":{"default":"dark"},"background":{"color":{"light":"#ffffff","dark":"#0a0a0f"}},"navbar":{"primary":{"type":"button","label":"Launch App","href":"https://app.kairos.trade"}},"contextual":{"options":["copy","view","download-spec","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"kairos-c5456474","hasAudioNarration":false,"actualSubdomain":"kairos-c5456474","customDomains":["docs.kairos.trade"],"gitSource":{"type":"github","owner":"kairoslive","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6aead0641411fefa89136024","collectionId":"4b502bda-1c32-4823-b83c-8b1fef053274","liveDeploymentHistoryId":"6aead0641411fefa89136024","schemaVersion":"v3"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"DISABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6aead0641411fefa89136024","clientVersion":"0.0.4067","searchFilterCounts":[{"language":"default","tag":"API Reference","count":139},{"language":"default","tag":"Data API","count":77},{"language":"default","tag":"Execution API","count":53},{"language":"default","tag":"Partner API","count":36},{"language":"default","tag":"Trading API","count":27},{"language":"default","tag":"Markets","count":20},{"language":"default","tag":"Sports","count":20},{"language":"default","tag":"Endpoints","count":19},{"language":"default","tag":"Documentation","count":18},{"language":"default","tag":"Market Data","count":17}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/partner/actions/start-a-wallet-action-setup-order-cancel-login","slug":"/api-reference/partner/actions/start-a-wallet-action-setup-order-cancel-login","pageMetadata":{"title":"Start a wallet action (setup, order, cancel, login)","description":"Starts one action for a self-custody wallet and returns its first **step**. Kairos never holds the wallet's key: each step either asks the wallet for one EIP-1193 request (`status: needs_signature`) or reports progress (`working`) or the outcome (`done` / `failed`).\n\n**The step loop.**\n1. `POST /v3/actions` → a step.\n2. While `status` is `needs_signature`: switch the wallet to `chainId` (when non-null), run `request` through the wallet's EIP-1193 provider, and `POST /v3/actions/{id}` with `{\"signature\": \"0x…\"}` (or `{\"result\": …}` for `wallet_sendCalls`). Answer before `expiresAtMs`.\n3. While `status` is `working`: `GET /v3/actions/{id}` every 1–2 s (or after `holdUntilMs` when present).\n4. Stop at `done` (read `result`) or `failed` (read `error` and `errorCode`).\n\n**Action types.** `setup` prepares the wallet on each requested venue; `order` places one order and runs any missing setup first, in the same action; `cancel` cancels orders on every venue with one Polygon signature; `login` returns a sign-in token for the private reads. There are no other action types.\n\n**Body rules.** Field names are **camelCase only**: unknown fields — including snake_case spellings such as `time_in_force`, `post_only`, `client_order_id`, `expires_at`, `order_ids` — are silently ignored, so a snake_case order becomes a `GTC`, non-post-only order without a client id. `price` and `size` must be JSON **strings**; a JSON number is rejected with a plain-text `422`. `expiresAt` is an integer (Unix seconds).\n\n**Idempotency.** `Idempotency-Key` is **not** honoured here. Use `clientOrderId` on orders: the same `clientOrderId` with the same terms returns the existing order (nothing is signed), and different terms are refused with `CLIENT_ORDER_ID_CONFLICT`.\n\n**Timing.** An action lives 15 minutes from creation and stays readable for 10 more minutes, then reads `404`. Polymarket and Predict.fun order signatures are accepted for about 60 s, Hyperliquid order signatures for 300 s, and cancel signatures (every venue) for 300 s; `expiresAtMs` on the step is authoritative.\n\n**Errors before the first signature are HTTP errors.** When the action fails before the wallet was ever asked to sign (for example every requested venue is unavailable), the response is that error's status and body rather than a `failed` step.\n\nSend `X-Kairos-Wallet-Api: 2`; without it this route serves the original Polymarket-only contract.","deprecated":null,"version":null,"openapi":"/openapi/wallet-api.json post /v3/actions","href":"/api-reference/partner/actions/start-a-wallet-action-setup-order-cancel-login","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n li: \"li\",\n ol: \"ol\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Starts one action for a self-custody wallet and returns its first \", _jsx(_components.strong, {\n children: \"step\"\n }), \". Kairos never holds the wallet’s key: each step either asks the wallet for one EIP-1193 request (\", _jsx(_components.code, {\n children: \"status: needs_signature\"\n }), \") or reports progress (\", _jsx(_components.code, {\n children: \"working\"\n }), \") or the outcome (\", _jsx(_components.code, {\n children: \"done\"\n }), \" / \", _jsx(_components.code, {\n children: \"failed\"\n }), \").\"]\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"The step loop.\"\n })\n }), \"\\n\", _jsxs(_components.ol, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"POST /v3/actions\"\n }), \" → a step.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"While \", _jsx(_components.code, {\n children: \"status\"\n }), \" is \", _jsx(_components.code, {\n children: \"needs_signature\"\n }), \": switch the wallet to \", _jsx(_components.code, {\n children: \"chainId\"\n }), \" (when non-null), run \", _jsx(_components.code, {\n children: \"request\"\n }), \" through the wallet’s EIP-1193 provider, and \", _jsx(_components.code, {\n children: \"POST /v3/actions/{id}\"\n }), \" with \", _jsx(_components.code, {\n children: \"{\\\"signature\\\": \\\"0x…\\\"}\"\n }), \" (or \", _jsx(_components.code, {\n children: \"{\\\"result\\\": …}\"\n }), \" for \", _jsx(_components.code, {\n children: \"wallet_sendCalls\"\n }), \"). Answer before \", _jsx(_components.code, {\n children: \"expiresAtMs\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"While \", _jsx(_components.code, {\n children: \"status\"\n }), \" is \", _jsx(_components.code, {\n children: \"working\"\n }), \": \", _jsx(_components.code, {\n children: \"GET /v3/actions/{id}\"\n }), \" every 1–2 s (or after \", _jsx(_components.code, {\n children: \"holdUntilMs\"\n }), \" when present).\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Stop at \", _jsx(_components.code, {\n children: \"done\"\n }), \" (read \", _jsx(_components.code, {\n children: \"result\"\n }), \") or \", _jsx(_components.code, {\n children: \"failed\"\n }), \" (read \", _jsx(_components.code, {\n children: \"error\"\n }), \" and \", _jsx(_components.code, {\n children: \"errorCode\"\n }), \").\"]\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Action types.\"\n }), \" \", _jsx(_components.code, {\n children: \"setup\"\n }), \" prepares the wallet on each requested venue; \", _jsx(_components.code, {\n children: \"order\"\n }), \" places one order and runs any missing setup first, in the same action; \", _jsx(_components.code, {\n children: \"cancel\"\n }), \" cancels orders on every venue with one Polygon signature; \", _jsx(_components.code, {\n children: \"login\"\n }), \" returns a sign-in token for the private reads. There are no other action types.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Body rules.\"\n }), \" Field names are \", _jsx(_components.strong, {\n children: \"camelCase only\"\n }), \": unknown fields — including snake_case spellings such as \", _jsx(_components.code, {\n children: \"time_in_force\"\n }), \", \", _jsx(_components.code, {\n children: \"post_only\"\n }), \", \", _jsx(_components.code, {\n children: \"client_order_id\"\n }), \", \", _jsx(_components.code, {\n children: \"expires_at\"\n }), \", \", _jsx(_components.code, {\n children: \"order_ids\"\n }), \" — are silently ignored, so a snake_case order becomes a \", _jsx(_components.code, {\n children: \"GTC\"\n }), \", non-post-only order without a client id. \", _jsx(_components.code, {\n children: \"price\"\n }), \" and \", _jsx(_components.code, {\n children: \"size\"\n }), \" must be JSON \", _jsx(_components.strong, {\n children: \"strings\"\n }), \"; a JSON number is rejected with a plain-text \", _jsx(_components.code, {\n children: \"422\"\n }), \". \", _jsx(_components.code, {\n children: \"expiresAt\"\n }), \" is an integer (Unix seconds).\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Idempotency.\"\n }), \" \", _jsx(_components.code, {\n children: \"Idempotency-Key\"\n }), \" is \", _jsx(_components.strong, {\n children: \"not\"\n }), \" honoured here. Use \", _jsx(_components.code, {\n children: \"clientOrderId\"\n }), \" on orders: the same \", _jsx(_components.code, {\n children: \"clientOrderId\"\n }), \" with the same terms returns the existing order (nothing is signed), and different terms are refused with \", _jsx(_components.code, {\n children: \"CLIENT_ORDER_ID_CONFLICT\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Timing.\"\n }), \" An action lives 15 minutes from creation and stays readable for 10 more minutes, then reads \", _jsx(_components.code, {\n children: \"404\"\n }), \". Polymarket and Predict.fun order signatures are accepted for about 60 s, Hyperliquid order signatures for 300 s, and cancel signatures (every venue) for 300 s; \", _jsx(_components.code, {\n children: \"expiresAtMs\"\n }), \" on the step is authoritative.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Errors before the first signature are HTTP errors.\"\n }), \" When the action fails before the wallet was ever asked to sign (for example every requested venue is unavailable), the response is that error’s status and body rather than a \", _jsx(_components.code, {\n children: \"failed\"\n }), \" step.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Send \", _jsx(_components.code, {\n children: \"X-Kairos-Wallet-Api: 2\"\n }), \"; without it this route serves the original Polymarket-only contract.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Start a wallet action (setup, order, cancel, login)","description":"Starts one action for a self-custody wallet and returns its first **step**. Kairos never holds the wallet's key: each step either asks the wallet for one EIP-1193 request (`status: needs_signature`) or reports progress (`working`) or the outcome (`done` / `failed`).\n\n**The step loop.**\n1. `POST /v3/actions` → a step.\n2. While `status` is `needs_signature`: switch the wallet to `chainId` (when non-null), run `request` through the wallet's EIP-1193 provider, and `POST /v3/actions/{id}` with `{\"signature\": \"0x…\"}` (or `{\"result\": …}` for `wallet_sendCalls`). Answer before `expiresAtMs`.\n3. While `status` is `working`: `GET /v3/actions/{id}` every 1–2 s (or after `holdUntilMs` when present).\n4. Stop at `done` (read `result`) or `failed` (read `error` and `errorCode`).\n\n**Action types.** `setup` prepares the wallet on each requested venue; `order` places one order and runs any missing setup first, in the same action; `cancel` cancels orders on every venue with one Polygon signature; `login` returns a sign-in token for the private reads. There are no other action types.\n\n**Body rules.** Field names are **camelCase only**: unknown fields — including snake_case spellings such as `time_in_force`, `post_only`, `client_order_id`, `expires_at`, `order_ids` — are silently ignored, so a snake_case order becomes a `GTC`, non-post-only order without a client id. `price` and `size` must be JSON **strings**; a JSON number is rejected with a plain-text `422`. `expiresAt` is an integer (Unix seconds).\n\n**Idempotency.** `Idempotency-Key` is **not** honoured here. Use `clientOrderId` on orders: the same `clientOrderId` with the same terms returns the existing order (nothing is signed), and different terms are refused with `CLIENT_ORDER_ID_CONFLICT`.\n\n**Timing.** An action lives 15 minutes from creation and stays readable for 10 more minutes, then reads `404`. Polymarket and Predict.fun order signatures are accepted for about 60 s, Hyperliquid order signatures for 300 s, and cancel signatures (every venue) for 300 s; `expiresAtMs` on the step is authoritative.\n\n**Errors before the first signature are HTTP errors.** When the action fails before the wallet was ever asked to sign (for example every requested venue is unavailable), the response is that error's status and body rather than a `failed` step.\n\nSend `X-Kairos-Wallet-Api: 2`; without it this route serves the original Polymarket-only contract.","deprecated":null,"version":null,"openapi":"/openapi/wallet-api.json post /v3/actions","href":"/api-reference/partner/actions/start-a-wallet-action-setup-order-cancel-login","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"startWalletAction","summary":"Start a wallet action (setup, order, cancel, login)","description":"Starts one action for a self-custody wallet and returns its first **step**. Kairos never holds the wallet's key: each step either asks the wallet for one EIP-1193 request (`status: needs_signature`) or reports progress (`working`) or the outcome (`done` / `failed`).\n\n**The step loop.**\n1. `POST /v3/actions` → a step.\n2. While `status` is `needs_signature`: switch the wallet to `chainId` (when non-null), run `request` through the wallet's EIP-1193 provider, and `POST /v3/actions/{id}` with `{\"signature\": \"0x…\"}` (or `{\"result\": …}` for `wallet_sendCalls`). Answer before `expiresAtMs`.\n3. While `status` is `working`: `GET /v3/actions/{id}` every 1–2 s (or after `holdUntilMs` when present).\n4. Stop at `done` (read `result`) or `failed` (read `error` and `errorCode`).\n\n**Action types.** `setup` prepares the wallet on each requested venue; `order` places one order and runs any missing setup first, in the same action; `cancel` cancels orders on every venue with one Polygon signature; `login` returns a sign-in token for the private reads. There are no other action types.\n\n**Body rules.** Field names are **camelCase only**: unknown fields — including snake_case spellings such as `time_in_force`, `post_only`, `client_order_id`, `expires_at`, `order_ids` — are silently ignored, so a snake_case order becomes a `GTC`, non-post-only order without a client id. `price` and `size` must be JSON **strings**; a JSON number is rejected with a plain-text `422`. `expiresAt` is an integer (Unix seconds).\n\n**Idempotency.** `Idempotency-Key` is **not** honoured here. Use `clientOrderId` on orders: the same `clientOrderId` with the same terms returns the existing order (nothing is signed), and different terms are refused with `CLIENT_ORDER_ID_CONFLICT`.\n\n**Timing.** An action lives 15 minutes from creation and stays readable for 10 more minutes, then reads `404`. Polymarket and Predict.fun order signatures are accepted for about 60 s, Hyperliquid order signatures for 300 s, and cancel signatures (every venue) for 300 s; `expiresAtMs` on the step is authoritative.\n\n**Errors before the first signature are HTTP errors.** When the action fails before the wallet was ever asked to sign (for example every requested venue is unavailable), the response is that error's status and body rather than a `failed` step.\n\nSend `X-Kairos-Wallet-Api: 2`; without it this route serves the original Polymarket-only contract.","tags":["Actions"],"x-kairos-auth":"partner id (X-Kairos-Partner-Id) or API key triple","x-kairos-scope":"trade:execute (API-key callers)","x-kairos-rate-limit":"120 requests/minute per client IP per route; 1000/minute when X-Client-Id is sent","security":["152ae4d6-3f7b-411e-bf21-fb5a778af612","522c79c2-6df0-4c0c-ab3e-0a4597a293c9"],"parameters":["8388656d-a83b-417e-ab00-efdef66d61e8"],"requestBody":"07d35923-0b46-49c5-9e2b-9b427610f8e4","responses":{"200":"79fedd0a-309f-44da-a98e-46be7afa2437","400":"2332b9e7-c438-4fad-a938-8b0a8f78bd75","401":"e1396705-e427-41f3-abd3-1ebb4e7306a3","403":"8dbad733-7b22-455f-bfcb-eeeb6f013cf6","409":"290eb316-a76e-47c8-b3e2-4e8819fe341b","413":"bff60533-000d-4087-825c-1a3e34b7c00c","415":"ff79ef12-7241-44fc-81ba-77e967509ad4","422":"f490b88c-8b8f-4970-9e4d-77c0835361e0","429":"cba85f60-6407-43bd-8022-5acaff14a917","500":"a24ae48c-89c5-43dc-ac93-cd2a1a106e7a","502":"e8329771-7032-4dd7-8019-9129b7ed1874","503":"d69b8e11-af6e-4efd-9fad-294f377e154b","504":"70d05b7f-e53c-45b1-aebb-356972c901fe"},"method":"post","type":"path","servers":["330d272c-627a-4ff5-ad01-0263b300ce7a","83635983-3d27-4bb6-bc26-42ecc043c06c"],"path":"/v3/actions","baseUrlOptions":["https://execution.kairos.trade","https://staging-execution.kairos.trade"],"title":"Start a wallet action (setup, order, cancel, login)","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"8388656d-a83b-417e-ab00-efdef66d61e8":{"name":"X-Kairos-Wallet-Api","in":"header","required":true,"description":"Wallet API contract version. Send `2` — the multi-venue contract this reference documents. Without the header (or with any other value) `/v3/actions` and `/v3/wallets/*` serve the original Polymarket-only contract, which ignores venue prefixes, `expiresAt` and `setup.venues`, omits `chainId`, `venue` and `fallbackRequests` from steps, refuses orders on a wallet that is not set up (`409`), and returns snake_case order and position rows.","schema":{"type":"string","enum":["2"],"isRequired":true,"description":"Wallet API contract version. Send `2` — the multi-venue contract this reference documents. Without the header (or with any other value) `/v3/actions` and `/v3/wallets/*` serve the original Polymarket-only contract, which ignores venue prefixes, `expiresAt` and `setup.venues`, omits `chainId`, `venue` and `fallbackRequests` from steps, refuses orders on a wallet that is not set up (`409`), and returns snake_case order and position rows.","uniqueKey":"","typeLabel":"enum\u003cstring>"},"example":"2"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Body of `POST /v3/actions`. **camelCase only** — unknown fields, including snake_case spellings, are ignored without error.","required":["wallet","action"],"properties":{"wallet":{"type":"string","description":"EVM address, `0x` + 40 hex.","pattern":"^0x[0-9a-fA-F]{40}$","example":"0x8ba1f109551bd432803012645ac136ddd64dba72","isRequired":true,"uniqueKey":"wallet","typeLabel":"string"},"action":{"oneOf":[{"type":"object","description":"The action to run, tagged by `type`.","required":["type"],"properties":{"type":{"type":"string","const":"setup","isRequired":true,"uniqueKey":"action.oneOf.0.type","typeLabel":"string"},"venues":{"type":"array","description":"Venues to set up. Omitted or empty means every venue offered on this deployment. Case-insensitive; duplicates are ignored.","items":{"type":"string","description":"Venue id. `predict.fun` is accepted as an input alias of `predictfun`.","enum":["polymarket","predictfun","hyperliquid"],"uniqueKey":"action.oneOf.0.venues.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"action.oneOf.0.venues","typeLabel":"enum\u003cstring>[]"}},"isRequired":true,"uniqueKey":"action.oneOf.0","typeLabel":"object"},{"type":"object","description":"The action to run, tagged by `type`.","required":["type","market","outcome","side","price","size"],"properties":{"type":{"type":"string","const":"order","isRequired":true,"uniqueKey":"action.oneOf.1.type","typeLabel":"string"},"market":{"type":"string","description":"`venue:market_id` — `polymarket:0x\u003c64-hex condition id>`, `predictfun:\u003cdigits>`, `hyperliquid:\u003cdigits>` — or a bare Polymarket condition id.","example":"predictfun:1027194","isRequired":true,"uniqueKey":"action.oneOf.1.market","typeLabel":"string"},"outcome":{"type":"string","description":"Outcome name as the venue lists it, e.g. `Yes`.","example":"Yes","isRequired":true,"uniqueKey":"action.oneOf.1.outcome","typeLabel":"string"},"side":{"type":"string","description":"Case-insensitive.","enum":["buy","sell"],"isRequired":true,"uniqueKey":"action.oneOf.1.side","typeLabel":"enum\u003cstring>"},"price":{"type":"string","description":"Limit price on the 0–1 scale, as a **string**. A JSON number is rejected (`422`).","example":"0.52","isRequired":true,"uniqueKey":"action.oneOf.1.price","typeLabel":"string"},"size":{"type":"string","description":"Shares, as a **string**.","example":"10","isRequired":true,"uniqueKey":"action.oneOf.1.size","typeLabel":"string"},"timeInForce":{"type":"string","description":"Case-insensitive. `GTD` requires `expiresAt`. On Predict.fun a `GTC` order rests until shortly before the venue session ends.","enum":["GTC","GTD","FOK","FAK","IOC"],"default":"GTC","uniqueKey":"action.oneOf.1.timeInForce","typeLabel":"enum\u003cstring>"},"postOnly":{"type":"boolean","default":false,"uniqueKey":"action.oneOf.1.postOnly","typeLabel":"boolean"},"clientOrderId":{"type":"string","maxLength":128,"description":"Your idempotency key for this order. The same id with the same terms returns the existing order without a new signature; different terms fail with `CLIENT_ORDER_ID_CONFLICT`. Must not be blank or start with `trade-plan:`. Hyperliquid requires `0x` + 32 lowercase hex.","example":"acme-7f3a91","uniqueKey":"action.oneOf.1.clientOrderId","typeLabel":"string"},"expiresAt":{"type":"integer","format":"int64","description":"Expiry for `GTD`, Unix **seconds** (an integer, not a string). Predict.fun caps it shortly before the venue session ends.","example":1793300000,"uniqueKey":"action.oneOf.1.expiresAt","typeLabel":"integer\u003cint64>"}},"isRequired":true,"uniqueKey":"action.oneOf.1","typeLabel":"object"},{"type":"object","description":"The action to run, tagged by `type`.","required":["type"],"properties":{"type":{"type":"string","const":"cancel","isRequired":true,"uniqueKey":"action.oneOf.2.type","typeLabel":"string"},"orderIds":{"type":"array","description":"Kairos `orderId`s (UUIDs), not venue order ids. A non-UUID is a plain-text `422`.","minItems":1,"maxItems":100,"items":{"type":"string","format":"uuid","uniqueKey":"action.oneOf.2.orderIds.items.[INDEX]","typeLabel":"string\u003cuuid>"},"uniqueKey":"action.oneOf.2.orderIds","typeLabel":"string\u003cuuid>[]"},"all":{"type":"boolean","description":"Cancel every open order of this wallet on every venue.","uniqueKey":"action.oneOf.2.all","typeLabel":"boolean"}},"isRequired":true,"uniqueKey":"action.oneOf.2","typeLabel":"object"},{"type":"object","description":"The action to run, tagged by `type`.","required":["type"],"properties":{"type":{"type":"string","const":"login","isRequired":true,"uniqueKey":"action.oneOf.3.type","typeLabel":"string"}},"isRequired":true,"uniqueKey":"action.oneOf.3","typeLabel":"object"}],"isRequired":true,"uniqueKey":"action","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"setup":{"title":"setup","value":{"wallet":"0x8ba1f109551bd432803012645ac136ddd64dba72","action":{"type":"setup","venues":["polymarket","predictfun"]}}},"order":{"title":"order","value":{"wallet":"0x8ba1f109551bd432803012645ac136ddd64dba72","action":{"type":"order","market":"predictfun:1027194","outcome":"Yes","side":"buy","price":"0.52","size":"10","timeInForce":"GTD","expiresAt":1793300000,"clientOrderId":"acme-7f3a91"}}},"hyperliquidOrder":{"title":"hyperliquidOrder","value":{"wallet":"0x8ba1f109551bd432803012645ac136ddd64dba72","action":{"type":"order","market":"hyperliquid:1","outcome":"Yes","side":"buy","price":"0.45","size":"25","timeInForce":"GTC","clientOrderId":"0x7d2f0c1e9a4b4f6c8e3d2a1b0c9f8e7d"}}},"cancel":{"title":"cancel","value":{"wallet":"0x8ba1f109551bd432803012645ac136ddd64dba72","action":{"type":"cancel","orderIds":["3f2b8c1e-5d4a-4e6f-9b7c-1a2d3e4f5a6b","9c8d7e6f-5a4b-4c3d-8e2f-1a0b9c8d7e6f"]}}},"cancelAll":{"title":"cancelAll","value":{"wallet":"0x8ba1f109551bd432803012645ac136ddd64dba72","action":{"type":"cancel","all":true}}},"login":{"title":"login","value":{"wallet":"0x8ba1f109551bd432803012645ac136ddd64dba72","action":{"type":"login"}}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"79fedd0a-309f-44da-a98e-46be7afa2437":{"description":"The action's first step. Usually `needs_signature`; `done` when nothing needs signing (a wallet already set up, or a `clientOrderId` that already names this exact order).","content":{"application/json":{"schema":{"type":"object","description":"The current step of an action. Every response from `/v3/actions` and `/v3/actions/{id}` is one of these.","required":["id","type","status","request","description","chainId","venue","result","error"],"properties":{"id":{"type":"string","format":"uuid","description":"Action id. One id for the whole action, across venues.","isRequired":true,"uniqueKey":"id","typeLabel":"string\u003cuuid>"},"type":{"type":"string","enum":["setup","order","cancel","login"],"isRequired":true,"uniqueKey":"type","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"`needs_signature` — run `request` and answer; `working` — poll; `done` — read `result`; `failed` — read `error` and `errorCode`.","enum":["needs_signature","working","done","failed"],"isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"request":{"oneOf":[{"type":"object","description":"What the wallet must run. Non-null only while `needs_signature`.","required":["method","params"],"example":{"method":"personal_sign","params":["0x6b6169726f732e7472616465207761…","0x8ba1f109551bD432803012645Ac136ddd64DBA72"]},"properties":{"method":{"type":"string","enum":["eth_signTypedData_v4","personal_sign","wallet_sendCalls","eth_sendTransaction"],"isRequired":true,"uniqueKey":"request.oneOf.0.method","typeLabel":"enum\u003cstring>"},"params":{"type":"array","items":{"oneOf":[{}],"uniqueKey":"request.oneOf.0.params.items.[INDEX]","typeLabel":"any"},"isRequired":true,"uniqueKey":"request.oneOf.0.params","typeLabel":"any[]"}},"isRequired":true,"uniqueKey":"request.oneOf.0","typeLabel":"object"},{"type":"null","description":"What the wallet must run. Non-null only while `needs_signature`.","isRequired":true,"uniqueKey":"request.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"request","typeLabel":"object | null"},"description":{"oneOf":[{"type":"string","description":"Text to show with the wallet prompt (e.g. `Confirm this Hyperliquid order`), or progress text while `working`.","isRequired":true,"uniqueKey":"description.oneOf.0","typeLabel":"string"},{"type":"null","description":"Text to show with the wallet prompt (e.g. `Confirm this Hyperliquid order`), or progress text while `working`.","isRequired":true,"uniqueKey":"description.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"description","typeLabel":"string | null"},"chainId":{"oneOf":[{"type":"string","description":"EIP-155 chain id (hex) the wallet must be on to answer — `0x89` Polygon, `0x38` BNB Chain, `0xa4b1` Arbitrum One (`0x66eee` Arbitrum Sepolia on Hyperliquid testnet). `null` for `personal_sign` and when nothing is asked.","example":"0x38","isRequired":true,"uniqueKey":"chainId.oneOf.0","typeLabel":"string"},{"type":"null","description":"EIP-155 chain id (hex) the wallet must be on to answer — `0x89` Polygon, `0x38` BNB Chain, `0xa4b1` Arbitrum One (`0x66eee` Arbitrum Sepolia on Hyperliquid testnet). `null` for `personal_sign` and when nothing is asked.","example":"0x38","isRequired":true,"uniqueKey":"chainId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"chainId","typeLabel":"string | null"},"venue":{"oneOf":[{"type":"string","description":"Venue of the current prompt; `null` when finished and on cancels.","enum":["polymarket","predictfun","hyperliquid"],"isRequired":true,"uniqueKey":"venue.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Venue of the current prompt; `null` when finished and on cancels.","isRequired":true,"uniqueKey":"venue.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"venue","typeLabel":"enum\u003cstring> | null"},"result":{"oneOf":[{"type":"object","description":"Outcome on `done` (and the provisional outcome of a held order). Shape depends on `type`.","required":["ready"],"example":{"ready":false,"venues":{"polymarket":{"ready":true,"tradingWallet":"0x2f9c4b8e1d7a6c5b4a3f2e1d0c9b8a7f6e5d4c3b","transactionHash":"0x7c3e9a1b5d2f4c6e8a0b2d4f6a8c0e2b4d6f8a0c2e4b6d8f0a2c4e6b8d0f2a4c"},"predictfun":{"ready":false,"next":"fund","tradingWallet":"0x8ba1f109551bd432803012645ac136ddd64dba72","venueDetail":{"reason":"needs about 0.0004 BNB on BNB Chain to pay gas for 2 Predict.fun approvals","approvals":2,"gasWei":"400000000000000"}}},"tradingWallet":"0x2f9c4b8e1d7a6c5b4a3f2e1d0c9b8a7f6e5d4c3b","transactionHash":"0x7c3e9a1b5d2f4c6e8a0b2d4f6a8c0e2b4d6f8a0c2e4b6d8f0a2c4e6b8d0f2a4c"},"properties":{"ready":{"type":"boolean","description":"Every requested venue is ready.","isRequired":true,"uniqueKey":"result.oneOf.0.ready","typeLabel":"boolean"},"venues":{"type":"object","description":"Outcome per requested venue.","additionalProperties":{"type":"object","description":"One venue's setup outcome.","required":["ready"],"properties":{"ready":{"type":"boolean","isRequired":true,"uniqueKey":"result.oneOf.0.venues.additionalProperties.ready","typeLabel":"boolean"},"tradingWallet":{"type":"string","description":"EVM address, `0x` + 40 hex.","pattern":"^0x[0-9a-fA-F]{40}$","example":"0x8ba1f109551bd432803012645ac136ddd64dba72","uniqueKey":"result.oneOf.0.venues.additionalProperties.tradingWallet","typeLabel":"string"},"transactionHash":{"oneOf":[{"type":"string","description":"Polymarket — the approval transaction, or `null` when none was needed.","uniqueKey":"result.oneOf.0.venues.additionalProperties.transactionHash.oneOf.0","typeLabel":"string"},{"type":"null","description":"Polymarket — the approval transaction, or `null` when none was needed.","uniqueKey":"result.oneOf.0.venues.additionalProperties.transactionHash.oneOf.1","typeLabel":"null"}],"uniqueKey":"result.oneOf.0.venues.additionalProperties.transactionHash","typeLabel":"string | null"},"sessionExpiresAt":{"type":"string","format":"date-time","description":"Predict.fun — when the venue session ends.","uniqueKey":"result.oneOf.0.venues.additionalProperties.sessionExpiresAt","typeLabel":"string\u003cdate-time>"},"next":{"type":"string","enum":["fund","blocked"],"description":"Why a venue that finished setup is not ready: `fund` (deposit, or BNB for gas) or `blocked`.","uniqueKey":"result.oneOf.0.venues.additionalProperties.next","typeLabel":"enum\u003cstring>"},"venueDetail":{"type":"object","description":"Venue-specific detail. Keys appear only where they apply.","properties":{"chainId":{"type":"string","description":"Chain the venue settles on (hex).","example":"0x89","uniqueKey":"result.oneOf.0.venues.additionalProperties.venueDetail.chainId","typeLabel":"string"},"gasBalance":{"oneOf":[{"type":"string","description":"Predict.fun — BNB balance for gas, whole units.","uniqueKey":"result.oneOf.0.venues.additionalProperties.venueDetail.gasBalance.oneOf.0","typeLabel":"string"},{"type":"null","description":"Predict.fun — BNB balance for gas, whole units.","uniqueKey":"result.oneOf.0.venues.additionalProperties.venueDetail.gasBalance.oneOf.1","typeLabel":"null"}],"uniqueKey":"result.oneOf.0.venues.additionalProperties.venueDetail.gasBalance","typeLabel":"string | null"},"missingApprovals":{"type":"integer","description":"Predict.fun — approvals still to send.","uniqueKey":"result.oneOf.0.venues.additionalProperties.venueDetail.missingApprovals","typeLabel":"integer"},"sessionExpiresAt":{"oneOf":[{"type":"string","format":"date-time","description":"Predict.fun — when the venue session ends.","uniqueKey":"result.oneOf.0.venues.additionalProperties.venueDetail.sessionExpiresAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Predict.fun — when the venue session ends.","uniqueKey":"result.oneOf.0.venues.additionalProperties.venueDetail.sessionExpiresAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"result.oneOf.0.venues.additionalProperties.venueDetail.sessionExpiresAt","typeLabel":"string\u003cdate-time> | null"},"network":{"type":"string","description":"Hyperliquid — `Mainnet` or `Testnet`.","uniqueKey":"result.oneOf.0.venues.additionalProperties.venueDetail.network","typeLabel":"string"},"transferFromPerps":{"type":"object","description":"Hyperliquid — USDC in perps the next order can move to spot (with an extra prompt).","properties":{"available":{"type":"string","example":"12.5","uniqueKey":"result.oneOf.0.venues.additionalProperties.venueDetail.transferFromPerps.available","typeLabel":"string"},"note":{"type":"string","uniqueKey":"result.oneOf.0.venues.additionalProperties.venueDetail.transferFromPerps.note","typeLabel":"string"}},"uniqueKey":"result.oneOf.0.venues.additionalProperties.venueDetail.transferFromPerps","typeLabel":"object"},"code":{"type":"string","description":"Hyperliquid — `HYPERLIQUID_AGENT_MISSING` when the trading approval must be renewed by `setup`.","uniqueKey":"result.oneOf.0.venues.additionalProperties.venueDetail.code","typeLabel":"string"},"reason":{"type":"string","description":"Why the venue is not ready (fund, blocked, or approval renewal).","uniqueKey":"result.oneOf.0.venues.additionalProperties.venueDetail.reason","typeLabel":"string"},"blocked":{"type":"boolean","description":"Hyperliquid — this account cannot be enrolled.","uniqueKey":"result.oneOf.0.venues.additionalProperties.venueDetail.blocked","typeLabel":"boolean"},"accountMode":{"type":"string","description":"Hyperliquid — the account mode that blocks enrollment.","uniqueKey":"result.oneOf.0.venues.additionalProperties.venueDetail.accountMode","typeLabel":"string"},"approvals":{"type":"integer","description":"Setup result, Predict.fun — approvals the wallet needs gas for.","uniqueKey":"result.oneOf.0.venues.additionalProperties.venueDetail.approvals","typeLabel":"integer"},"gasWei":{"type":"string","description":"Setup result, Predict.fun — estimated BNB gas needed, in wei.","uniqueKey":"result.oneOf.0.venues.additionalProperties.venueDetail.gasWei","typeLabel":"string"}},"additionalProperties":true,"uniqueKey":"result.oneOf.0.venues.additionalProperties.venueDetail","typeLabel":"object"},"error":{"type":"string","description":"This venue failed; the others may still have succeeded.","uniqueKey":"result.oneOf.0.venues.additionalProperties.error","typeLabel":"string"}},"uniqueKey":"result.oneOf.0.venues.additionalProperties","typeLabel":"object"},"uniqueKey":"result.oneOf.0.venues","typeLabel":"object"},"tradingWallet":{"oneOf":[{"type":"string","description":"Polymarket's trading wallet, when Polymarket was set up; `null` when Polymarket's setup failed.","uniqueKey":"result.oneOf.0.tradingWallet.oneOf.0","typeLabel":"string"},{"type":"null","description":"Polymarket's trading wallet, when Polymarket was set up; `null` when Polymarket's setup failed.","uniqueKey":"result.oneOf.0.tradingWallet.oneOf.1","typeLabel":"null"}],"uniqueKey":"result.oneOf.0.tradingWallet","typeLabel":"string | null"},"transactionHash":{"oneOf":[{"type":"string","description":"Polymarket's approval transaction, when Polymarket was set up.","uniqueKey":"result.oneOf.0.transactionHash.oneOf.0","typeLabel":"string"},{"type":"null","description":"Polymarket's approval transaction, when Polymarket was set up.","uniqueKey":"result.oneOf.0.transactionHash.oneOf.1","typeLabel":"null"}],"uniqueKey":"result.oneOf.0.transactionHash","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"result.oneOf.0","typeLabel":"object"},{"type":"object","description":"Outcome on `done` (and the provisional outcome of a held order). Shape depends on `type`.","required":["orderId","status","final","success"],"properties":{"orderId":{"type":"string","format":"uuid","description":"Kairos order id — use it to cancel.","isRequired":true,"uniqueKey":"result.oneOf.1.orderId","typeLabel":"string\u003cuuid>"},"status":{"type":"string","description":"Order status: Polymarket's answer (`matched`, `live`, `delayed`, `unmatched`) or the Kairos order status on Hyperliquid (`executing`, `live`, `partial`, `filled`, `cancelled`, `failed`, …). Read `final` and `success` rather than matching on this.","example":"matched","isRequired":true,"uniqueKey":"result.oneOf.1.status","typeLabel":"string"},"final":{"type":"boolean","description":"Matching is finished.","isRequired":true,"uniqueKey":"result.oneOf.1.final","typeLabel":"boolean"},"success":{"type":"boolean","description":"`false` when the order did nothing, failed, or is not confirmed yet.","isRequired":true,"uniqueKey":"result.oneOf.1.success","typeLabel":"boolean"},"venueOrderId":{"oneOf":[{"type":"string","uniqueKey":"result.oneOf.1.venueOrderId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"result.oneOf.1.venueOrderId.oneOf.1","typeLabel":"null"}],"uniqueKey":"result.oneOf.1.venueOrderId","typeLabel":"string | null"},"venueStatus":{"oneOf":[{"type":"string","description":"The venue's first answer.","uniqueKey":"result.oneOf.1.venueStatus.oneOf.0","typeLabel":"string"},{"type":"null","description":"The venue's first answer.","uniqueKey":"result.oneOf.1.venueStatus.oneOf.1","typeLabel":"null"}],"uniqueKey":"result.oneOf.1.venueStatus","typeLabel":"string | null"},"filledSize":{"oneOf":[{"type":"string","description":"Shares filled; `null` when unknown.","example":"7.140348","uniqueKey":"result.oneOf.1.filledSize.oneOf.0","typeLabel":"string"},{"type":"null","description":"Shares filled; `null` when unknown.","example":"7.140348","uniqueKey":"result.oneOf.1.filledSize.oneOf.1","typeLabel":"null"}],"uniqueKey":"result.oneOf.1.filledSize","typeLabel":"string | null"},"filledNotional":{"oneOf":[{"type":"string","description":"Collateral spent or received, before venue fees.","example":"4.069998","uniqueKey":"result.oneOf.1.filledNotional.oneOf.0","typeLabel":"string"},{"type":"null","description":"Collateral spent or received, before venue fees.","example":"4.069998","uniqueKey":"result.oneOf.1.filledNotional.oneOf.1","typeLabel":"null"}],"uniqueKey":"result.oneOf.1.filledNotional","typeLabel":"string | null"},"avgPrice":{"oneOf":[{"type":"string","example":"0.57","uniqueKey":"result.oneOf.1.avgPrice.oneOf.0","typeLabel":"string"},{"type":"null","example":"0.57","uniqueKey":"result.oneOf.1.avgPrice.oneOf.1","typeLabel":"null"}],"uniqueKey":"result.oneOf.1.avgPrice","typeLabel":"string | null"},"message":{"oneOf":[{"type":"string","description":"Set when `success` is false:\n- `No fill: the venue matched none of this order`\n- `The order failed at the venue; any fills shown were reverted`\n- `The venue rejected the order`\n- `Outcome not confirmed yet; check this wallet's orders before placing it again`","uniqueKey":"result.oneOf.1.message.oneOf.0","typeLabel":"string"},{"type":"null","description":"Set when `success` is false:\n- `No fill: the venue matched none of this order`\n- `The order failed at the venue; any fills shown were reverted`\n- `The venue rejected the order`\n- `Outcome not confirmed yet; check this wallet's orders before placing it again`","uniqueKey":"result.oneOf.1.message.oneOf.1","typeLabel":"null"}],"uniqueKey":"result.oneOf.1.message","typeLabel":"string | null"},"venue":{"type":"string","description":"Venue id. `predict.fun` is accepted as an input alias of `predictfun`.","enum":["polymarket","predictfun","hyperliquid"],"uniqueKey":"result.oneOf.1.venue","typeLabel":"enum\u003cstring>"},"market":{"type":"string","description":"`venue:market_id`.","uniqueKey":"result.oneOf.1.market","typeLabel":"string"}},"isRequired":true,"uniqueKey":"result.oneOf.1","typeLabel":"object"},{"type":"object","description":"Outcome on `done` (and the provisional outcome of a held order). Shape depends on `type`.","required":["cancelled","failed","venueDetail"],"example":{"cancelled":["3f2b8c1e-5d4a-4e6f-9b7c-1a2d3e4f5a6b"],"alreadyClosed":[],"failed":[{"orderId":"9c8d7e6f-5a4b-4c3d-8e2f-1a0b9c8d7e6f","reason":"order not found"}],"venueDetail":{}},"properties":{"cancelled":{"type":"array","items":{"type":"string","uniqueKey":"result.oneOf.2.cancelled.items.[INDEX]","typeLabel":"string"},"description":"Order ids cancelled.","isRequired":true,"uniqueKey":"result.oneOf.2.cancelled","typeLabel":"string[]"},"failed":{"oneOf":[{"type":"array","items":{"type":"object","required":["orderId","reason"],"properties":{"orderId":{"type":"string","isRequired":true,"uniqueKey":"result.oneOf.2.failed.oneOf.0.items.[INDEX].orderId","typeLabel":"string"},"reason":{"type":"string","description":"The venue's reason, `cancel failed; retry`, `order not found` (also for ids that are not this wallet's), `venue unavailable; retry`, or an outcome-unknown message.","isRequired":true,"uniqueKey":"result.oneOf.2.failed.oneOf.0.items.[INDEX].reason","typeLabel":"string"},"code":{"type":"string","description":"`CANCEL_OUTCOME_UNKNOWN` when the venue may have cancelled.","uniqueKey":"result.oneOf.2.failed.oneOf.0.items.[INDEX].code","typeLabel":"string"}},"uniqueKey":"result.oneOf.2.failed.oneOf.0.items.[INDEX]","typeLabel":"object"},"description":"By id — the failures; with `all` — the number of failures.","isRequired":true,"uniqueKey":"result.oneOf.2.failed.oneOf.0","typeLabel":"object[]"},{"type":"integer","description":"By id — the failures; with `all` — the number of failures.","isRequired":true,"uniqueKey":"result.oneOf.2.failed.oneOf.1","typeLabel":"integer"}],"isRequired":true,"uniqueKey":"result.oneOf.2.failed","typeLabel":"object[] | integer"},"venueDetail":{"type":"object","description":"Per venue: `{cancelled, failed}` counts for `all`, or `{error}` when the venue could not be reached (`{error, code: \"CANCEL_OUTCOME_UNKNOWN\"}` when it may have cancelled). Empty when every venue answered on a by-id cancel.","additionalProperties":{"type":"object","properties":{"cancelled":{"type":"integer","uniqueKey":"result.oneOf.2.venueDetail.additionalProperties.cancelled","typeLabel":"integer"},"failed":{"type":"integer","uniqueKey":"result.oneOf.2.venueDetail.additionalProperties.failed","typeLabel":"integer"},"error":{"type":"string","uniqueKey":"result.oneOf.2.venueDetail.additionalProperties.error","typeLabel":"string"},"code":{"type":"string","uniqueKey":"result.oneOf.2.venueDetail.additionalProperties.code","typeLabel":"string"}},"uniqueKey":"result.oneOf.2.venueDetail.additionalProperties","typeLabel":"object"},"isRequired":true,"uniqueKey":"result.oneOf.2.venueDetail","typeLabel":"object"},"alreadyClosed":{"type":"array","items":{"type":"string","uniqueKey":"result.oneOf.2.alreadyClosed.items.[INDEX]","typeLabel":"string"},"description":"By id — orders already filled, cancelled or expired.","uniqueKey":"result.oneOf.2.alreadyClosed","typeLabel":"string[]"}},"isRequired":true,"uniqueKey":"result.oneOf.2","typeLabel":"object"},{"type":"object","description":"Outcome on `done` (and the provisional outcome of a held order). Shape depends on `type`.","required":["token","expiresAt"],"properties":{"token":{"type":"string","description":"Opaque sign-in token (at most 4096 bytes).","isRequired":true,"uniqueKey":"result.oneOf.3.token","typeLabel":"string"},"expiresAt":{"type":"string","format":"date-time","description":"24 hours after issue.","isRequired":true,"uniqueKey":"result.oneOf.3.expiresAt","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"result.oneOf.3","typeLabel":"object"},{"type":"null","description":"Outcome on `done` (and the provisional outcome of a held order). Shape depends on `type`.","isRequired":true,"uniqueKey":"result.oneOf.4","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result","typeLabel":"object · object · object · object · null"},"error":{"oneOf":[{"type":"string","description":"Why the action failed; non-null on `failed`.","isRequired":true,"uniqueKey":"error.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why the action failed; non-null on `failed`.","isRequired":true,"uniqueKey":"error.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error","typeLabel":"string | null"},"fallbackRequests":{"type":"array","description":"Present with `wallet_sendCalls` requests only — the same calls as individual `eth_sendTransaction` requests, for wallets without EIP-5792. Send them in order and answer with `{\"result\": [\"0xhash\", …]}`.","items":{"type":"object","description":"An EIP-1193 request to run through the wallet's provider exactly as given (`provider.request({method, params})`).\n- `eth_signTypedData_v4`: `params` = `[address, typedData]` — `typedData` is a **JSON string**; pass it unchanged.\n- `personal_sign`: `params` = `[hexMessage, address]`.\n- `wallet_sendCalls` (EIP-5792): `params` = `[{version, chainId, from, atomicRequired, calls}]`; the wallet pays gas.\n- `eth_sendTransaction`: `params` = `[{from, to, data, value, chainId?}]`; the wallet pays gas.","required":["method","params"],"properties":{"method":{"type":"string","enum":["eth_signTypedData_v4","personal_sign","wallet_sendCalls","eth_sendTransaction"],"isRequired":true,"uniqueKey":"fallbackRequests.items.[INDEX].method","typeLabel":"enum\u003cstring>"},"params":{"type":"array","items":{"oneOf":[{}],"uniqueKey":"fallbackRequests.items.[INDEX].params.items.[INDEX]","typeLabel":"any"},"isRequired":true,"uniqueKey":"fallbackRequests.items.[INDEX].params","typeLabel":"any[]"}},"example":{"method":"personal_sign","params":["0x6b6169726f732e7472616465207761…","0x8ba1f109551bD432803012645Ac136ddd64DBA72"]},"uniqueKey":"fallbackRequests.items.[INDEX]","typeLabel":"object"},"uniqueKey":"fallbackRequests","typeLabel":"object[]"},"expiresAtMs":{"type":"integer","format":"int64","description":"Last accepted millisecond (Unix ms) for answering this prompt. Answers after it fail the action with `SIGNATURE_EXPIRED`.","example":1793130772999,"uniqueKey":"expiresAtMs","typeLabel":"integer\u003cint64>"},"holdUntilMs":{"type":"integer","format":"int64","description":"On a `working` order the venue is still matching — poll again after this time (Unix ms). `result` then holds a provisional outcome with `final: false`.","uniqueKey":"holdUntilMs","typeLabel":"integer\u003cint64>"},"errorCode":{"type":"string","description":"Machine-readable reason on a `failed` step; the key is omitted when the failure has no code. Codes may be added; treat an unknown code as a failure whose order was not placed.\n\n| Code | Meaning | Order placed? |\n|---|---|---|\n| `NO_MATCH` | An immediate order (FOK/FAK/IOC) found nothing to match. | No |\n| `VENUE_REJECTED` | The venue refused the order. | No |\n| `ORDER_OUTCOME_UNKNOWN` | The submission's outcome is unknown. Read the wallet's orders before placing again. | Maybe |\n| `CANCEL_OUTCOME_UNKNOWN` | Some venue may have cancelled. Read the wallet's orders. | Maybe |\n| `SIGNATURE_EXPIRED` | The signing window closed before a signature was accepted. Nothing was sent. | No |\n| `CLIENT_ORDER_ID_CONFLICT` | The `clientOrderId` names an order with different terms. | No |\n| `HYPERLIQUID_AGENT_MISSING` | Hyperliquid no longer lists this wallet's trading approval. Run `setup` again. | No |","enum":["NO_MATCH","VENUE_REJECTED","ORDER_OUTCOME_UNKNOWN","CANCEL_OUTCOME_UNKNOWN","SIGNATURE_EXPIRED","CLIENT_ORDER_ID_CONFLICT","HYPERLIQUID_AGENT_MISSING"],"uniqueKey":"errorCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"","typeLabel":"object"},"examples":{"needsSignature":{"title":"needsSignature","value":{"id":"6a1f9e2c-3b4d-4c5e-8f6a-7b8c9d0e1f2a","type":"order","status":"needs_signature","request":{"method":"eth_signTypedData_v4","params":["0x8ba1f109551bD432803012645Ac136ddd64DBA72","{\"types\":{\"EIP712Domain\":[…],\"Order\":[…]},\"domain\":{\"name\":\"predict.fun CTF Exchange\",\"version\":\"1\",\"chainId\":56,\"verifyingContract\":\"0x…\"},\"primaryType\":\"Order\",\"message\":{…}}"]},"description":"Confirm this Predict.fun order","chainId":"0x38","venue":"predictfun","expiresAtMs":1793130772999,"result":null,"error":null}},"alreadyReady":{"title":"alreadyReady","value":{"id":"0b7e4d2a-1c3f-4a5b-9d8e-7f6a5b4c3d2e","type":"setup","status":"done","request":null,"description":null,"chainId":null,"venue":null,"result":{"ready":true,"venues":{"polymarket":{"ready":true,"tradingWallet":"0x2f9c4b8e1d7a6c5b4a3f2e1d0c9b8a7f6e5d4c3b","transactionHash":null}},"tradingWallet":"0x2f9c4b8e1d7a6c5b4a3f2e1d0c9b8a7f6e5d4c3b","transactionHash":null},"error":null}}},"exampleType":"examples"}},"exampleType":"examples"},"2332b9e7-c438-4fad-a938-8b0a8f78bd75":{"description":"JSON `{\"error\": …}` for a request Kairos refuses before any signature, for example:\n- `wallet must be a 0x address`; `partner id header is not valid ASCII` or a malformed partner id\n- `unknown venue \"x\"`; `market is required`; `market must be venue:market_id, e.g. predictfun:1027194, or a Polymarket condition id`; `a Polymarket market is its condition id (0x + 64 hex)`; `a Predict.fun market is predictfun:\u003cmarket_id>`; `a Hyperliquid market is hyperliquid:\u003cmarket_id>`; `unknown venue in market \"…\"`\n- `unknown Polymarket market; for another venue use venue:market_id`; `unknown Predict.fun market`; `unknown Hyperliquid market or outcome: market=… outcome=\"…\"`\n- `side must be buy or sell`; `price must be a decimal string`; `timeInForce must be GTC, GTD, FOK, FAK, or IOC`; `expiresAt is required for GTD`\n- Hyperliquid: `timeInForce on Hyperliquid must be GTC, FAK, or IOC`; `postOnly needs timeInForce GTC`; `clientOrderId must be 0x followed by 32 lowercase hex characters on this exchange`; price, size and minimum-notional refusals\n- `clientOrderId uses a reserved prefix` (ids starting `trade-plan:` are reserved); a blank or over-128-character `clientOrderId`\n- `pass either orderIds or all: true`; `at most 100 orderIds per cancel`\n\nA **plain-text** `400` (not JSON) means the body is not valid JSON.","content":{"application/json":{"schema":{"type":"object","description":"Wallet API error body. `error` is a human-readable message; `code` is set on a few structured refusals (e.g. `CLIENT_ORDER_ID_CONFLICT`, `POLYMARKET_V2_TRADING_DISABLED`, `SIGNATURE_EXPIRED`); `errorCode` mirrors `code` where the same refusal can also surface on a failed step. Most `/v3` errors carry only `error`. Framework rejections (malformed JSON, wrong shape, missing content type) are plain text, not this body.","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable message.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Stable code, present on structured refusals only.","uniqueKey":"code","typeLabel":"string"},"errorCode":{"type":"string","description":"Same as `code`; present where the refusal can also appear as a failed step's `errorCode`.","uniqueKey":"errorCode","typeLabel":"string"}},"example":{"error":"unknown or expired action"},"uniqueKey":"","typeLabel":"object"},"example":{"error":"pass either orderIds or all: true"},"examples":{"Example":{"title":"Example","value":{"error":"pass either orderIds or all: true"}}},"exampleType":"examples"},"text/plain":{"schema":{"type":"string","description":"A plain-text (non-JSON) rejection from request parsing — malformed JSON, a body of the wrong shape, a missing `Content-Type`, a malformed path id or query. Do not JSON-parse it.","example":"Failed to deserialize the JSON body into the target type: action.price: invalid type: floating point `0.52`, expected a string","uniqueKey":"","typeLabel":"string"},"examples":{"Example":{"title":"Example","value":"Failed to deserialize the JSON body into the target type: action.price: invalid type: floating point `0.52`, expected a string"}},"exampleType":"generated"}},"exampleType":"examples"},"e1396705-e427-41f3-abd3-1ebb4e7306a3":{"description":"`send X-Kairos-Partner-Id or your API key (X-Client-Id, X-Api-Key, X-Api-Secret)` — no partner id and no API key (a delegation header never qualifies); `invalid API key`.","content":{"application/json":{"schema":{"type":"object","description":"Wallet API error body. `error` is a human-readable message; `code` is set on a few structured refusals (e.g. `CLIENT_ORDER_ID_CONFLICT`, `POLYMARKET_V2_TRADING_DISABLED`, `SIGNATURE_EXPIRED`); `errorCode` mirrors `code` where the same refusal can also surface on a failed step. Most `/v3` errors carry only `error`. Framework rejections (malformed JSON, wrong shape, missing content type) are plain text, not this body.","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable message.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Stable code, present on structured refusals only.","uniqueKey":"code","typeLabel":"string"},"errorCode":{"type":"string","description":"Same as `code`; present where the refusal can also appear as a failed step's `errorCode`.","uniqueKey":"errorCode","typeLabel":"string"}},"example":{"error":"unknown or expired action"},"uniqueKey":"","typeLabel":"object"},"example":{"error":"send X-Kairos-Partner-Id or your API key (X-Client-Id, X-Api-Key, X-Api-Secret)"},"examples":{"Example":{"title":"Example","value":{"error":"send X-Kairos-Partner-Id or your API key (X-Client-Id, X-Api-Key, X-Api-Secret)"}}},"exampleType":"examples"}},"exampleType":"examples"},"8dbad733-7b22-455f-bfcb-eeeb6f013cf6":{"description":"Tenant refusals (`unknown partner id`; `this partner id is used with its API key; send the key instead of X-Kairos-Partner-Id`; `this API key lacks the trade:execute scope`; `the wallet API is not enabled for this account`), or a trading refusal: `API-key access to \u003cvenue> is disabled`, `this wallet is disabled`, `Hyperliquid trading is disabled for this wallet`, `external-signing execution is not enabled for this account`.","content":{"application/json":{"schema":{"type":"object","description":"Wallet API error body. `error` is a human-readable message; `code` is set on a few structured refusals (e.g. `CLIENT_ORDER_ID_CONFLICT`, `POLYMARKET_V2_TRADING_DISABLED`, `SIGNATURE_EXPIRED`); `errorCode` mirrors `code` where the same refusal can also surface on a failed step. Most `/v3` errors carry only `error`. Framework rejections (malformed JSON, wrong shape, missing content type) are plain text, not this body.","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable message.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Stable code, present on structured refusals only.","uniqueKey":"code","typeLabel":"string"},"errorCode":{"type":"string","description":"Same as `code`; present where the refusal can also appear as a failed step's `errorCode`.","uniqueKey":"errorCode","typeLabel":"string"}},"example":{"error":"unknown or expired action"},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"unknown or expired action"}}},"exampleType":"generated"}},"exampleType":"generated"},"290eb316-a76e-47c8-b3e2-4e8819fe341b":{"description":"- `this wallet is not set up yet; run a setup action first` — `cancel` and `login` need a wallet that has completed setup on at least one venue.\n- `this wallet is linked to a Kairos account; trade with it in the Kairos app`.\n- `client_order_id already names a different order` with `code` and `errorCode` = `CLIENT_ORDER_ID_CONFLICT`.\n- `code: POLYMARKET_V2_TRADING_DISABLED` — the market trades on a Polymarket contract version Kairos has not enabled yet.","content":{"application/json":{"schema":{"type":"object","description":"Wallet API error body. `error` is a human-readable message; `code` is set on a few structured refusals (e.g. `CLIENT_ORDER_ID_CONFLICT`, `POLYMARKET_V2_TRADING_DISABLED`, `SIGNATURE_EXPIRED`); `errorCode` mirrors `code` where the same refusal can also surface on a failed step. Most `/v3` errors carry only `error`. Framework rejections (malformed JSON, wrong shape, missing content type) are plain text, not this body.","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable message.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Stable code, present on structured refusals only.","uniqueKey":"code","typeLabel":"string"},"errorCode":{"type":"string","description":"Same as `code`; present where the refusal can also appear as a failed step's `errorCode`.","uniqueKey":"errorCode","typeLabel":"string"}},"example":{"error":"unknown or expired action"},"uniqueKey":"","typeLabel":"object"},"example":{"error":"client_order_id already names a different order","code":"CLIENT_ORDER_ID_CONFLICT","errorCode":"CLIENT_ORDER_ID_CONFLICT"},"examples":{"Example":{"title":"Example","value":{"error":"client_order_id already names a different order","code":"CLIENT_ORDER_ID_CONFLICT","errorCode":"CLIENT_ORDER_ID_CONFLICT"}}},"exampleType":"examples"}},"exampleType":"examples"},"bff60533-000d-4087-825c-1a3e34b7c00c":{"description":"Plain text (`Failed to buffer the request body: length limit exceeded`) when the body is over the limit: 16 KiB for fee settlements, 64 KiB for trade plans and on-chain intents, the server-wide 2 MiB for actions. Above 64 KiB the answer may instead be `{\"error\": \"request body too large\"}`.","content":{"text/plain":{"schema":{"type":"string","description":"A plain-text (non-JSON) rejection from request parsing — malformed JSON, a body of the wrong shape, a missing `Content-Type`, a malformed path id or query. Do not JSON-parse it.","example":"Failed to deserialize the JSON body into the target type: action.price: invalid type: floating point `0.52`, expected a string","uniqueKey":"","typeLabel":"string"},"examples":{"Example":{"title":"Example","value":"Failed to deserialize the JSON body into the target type: action.price: invalid type: floating point `0.52`, expected a string"}},"exampleType":"generated"},"application/json":{"schema":{"type":"object","description":"Wallet API error body. `error` is a human-readable message; `code` is set on a few structured refusals (e.g. `CLIENT_ORDER_ID_CONFLICT`, `POLYMARKET_V2_TRADING_DISABLED`, `SIGNATURE_EXPIRED`); `errorCode` mirrors `code` where the same refusal can also surface on a failed step. Most `/v3` errors carry only `error`. Framework rejections (malformed JSON, wrong shape, missing content type) are plain text, not this body.","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable message.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Stable code, present on structured refusals only.","uniqueKey":"code","typeLabel":"string"},"errorCode":{"type":"string","description":"Same as `code`; present where the refusal can also appear as a failed step's `errorCode`.","uniqueKey":"errorCode","typeLabel":"string"}},"example":{"error":"unknown or expired action"},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"unknown or expired action"}}},"exampleType":"generated"}},"exampleType":"generated"},"ff79ef12-7241-44fc-81ba-77e967509ad4":{"description":"Plain text — the request has no `Content-Type: application/json` header.","content":{"text/plain":{"schema":{"type":"string","description":"A plain-text (non-JSON) rejection from request parsing — malformed JSON, a body of the wrong shape, a missing `Content-Type`, a malformed path id or query. Do not JSON-parse it.","example":"Failed to deserialize the JSON body into the target type: action.price: invalid type: floating point `0.52`, expected a string","uniqueKey":"","typeLabel":"string"},"examples":{"Example":{"title":"Example","value":"Failed to deserialize the JSON body into the target type: action.price: invalid type: floating point `0.52`, expected a string"}},"exampleType":"generated"}},"exampleType":"generated"},"f490b88c-8b8f-4970-9e4d-77c0835361e0":{"description":"**Plain text** when the body is valid JSON of the wrong shape: a missing required field, an unknown `type`, a non-UUID in `orderIds`, `price`/`size` sent as numbers, or `expiresAt` sent as a string.\n\nJSON when Hyperliquid refuses before signing: `not enough USDC on Hyperliquid for this order: it needs N, spot has S and perps can release W`.","content":{"text/plain":{"schema":{"type":"string","description":"A plain-text (non-JSON) rejection from request parsing — malformed JSON, a body of the wrong shape, a missing `Content-Type`, a malformed path id or query. Do not JSON-parse it.","example":"Failed to deserialize the JSON body into the target type: action.price: invalid type: floating point `0.52`, expected a string","uniqueKey":"","typeLabel":"string"},"examples":{"Example":{"title":"Example","value":"Failed to deserialize the JSON body into the target type: action.price: invalid type: floating point `0.52`, expected a string"}},"exampleType":"generated"},"application/json":{"schema":{"type":"object","description":"Wallet API error body. `error` is a human-readable message; `code` is set on a few structured refusals (e.g. `CLIENT_ORDER_ID_CONFLICT`, `POLYMARKET_V2_TRADING_DISABLED`, `SIGNATURE_EXPIRED`); `errorCode` mirrors `code` where the same refusal can also surface on a failed step. Most `/v3` errors carry only `error`. Framework rejections (malformed JSON, wrong shape, missing content type) are plain text, not this body.","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable message.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Stable code, present on structured refusals only.","uniqueKey":"code","typeLabel":"string"},"errorCode":{"type":"string","description":"Same as `code`; present where the refusal can also appear as a failed step's `errorCode`.","uniqueKey":"errorCode","typeLabel":"string"}},"example":{"error":"unknown or expired action"},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"unknown or expired action"}}},"exampleType":"generated"}},"exampleType":"generated"},"cba85f60-6407-43bd-8022-5acaff14a917":{"description":"`rate limit exceeded for this endpoint; retry later`. The default limit is 120 requests per minute per client IP per path (1000 when `X-Client-Id` is sent), over a sliding 60 s window; `GET` and `POST` on one path share it. No `Retry-After` header is sent.","content":{"application/json":{"schema":{"type":"object","description":"Wallet API error body. `error` is a human-readable message; `code` is set on a few structured refusals (e.g. `CLIENT_ORDER_ID_CONFLICT`, `POLYMARKET_V2_TRADING_DISABLED`, `SIGNATURE_EXPIRED`); `errorCode` mirrors `code` where the same refusal can also surface on a failed step. Most `/v3` errors carry only `error`. Framework rejections (malformed JSON, wrong shape, missing content type) are plain text, not this body.","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable message.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Stable code, present on structured refusals only.","uniqueKey":"code","typeLabel":"string"},"errorCode":{"type":"string","description":"Same as `code`; present where the refusal can also appear as a failed step's `errorCode`.","uniqueKey":"errorCode","typeLabel":"string"}},"example":{"error":"unknown or expired action"},"uniqueKey":"","typeLabel":"object"},"example":{"error":"rate limit exceeded for this endpoint; retry later"},"examples":{"Example":{"title":"Example","value":{"error":"rate limit exceeded for this endpoint; retry later"}}},"exampleType":"examples"}},"exampleType":"examples"},"a24ae48c-89c5-43dc-ac93-cd2a1a106e7a":{"description":"`internal error`.","content":{"application/json":{"schema":{"type":"object","description":"Wallet API error body. `error` is a human-readable message; `code` is set on a few structured refusals (e.g. `CLIENT_ORDER_ID_CONFLICT`, `POLYMARKET_V2_TRADING_DISABLED`, `SIGNATURE_EXPIRED`); `errorCode` mirrors `code` where the same refusal can also surface on a failed step. Most `/v3` errors carry only `error`. Framework rejections (malformed JSON, wrong shape, missing content type) are plain text, not this body.","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable message.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Stable code, present on structured refusals only.","uniqueKey":"code","typeLabel":"string"},"errorCode":{"type":"string","description":"Same as `code`; present where the refusal can also appear as a failed step's `errorCode`.","uniqueKey":"errorCode","typeLabel":"string"}},"example":{"error":"unknown or expired action"},"uniqueKey":"","typeLabel":"object"},"example":{"error":"internal error"},"examples":{"Example":{"title":"Example","value":{"error":"internal error"}}},"exampleType":"examples"}},"exampleType":"examples"},"e8329771-7032-4dd7-8019-9129b7ed1874":{"description":"A venue did not answer cleanly, e.g. `Hyperliquid is unavailable; retry shortly`, `Predict.fun is unavailable; retry shortly`. Nothing was signed; retry.","content":{"application/json":{"schema":{"type":"object","description":"Wallet API error body. `error` is a human-readable message; `code` is set on a few structured refusals (e.g. `CLIENT_ORDER_ID_CONFLICT`, `POLYMARKET_V2_TRADING_DISABLED`, `SIGNATURE_EXPIRED`); `errorCode` mirrors `code` where the same refusal can also surface on a failed step. Most `/v3` errors carry only `error`. Framework rejections (malformed JSON, wrong shape, missing content type) are plain text, not this body.","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable message.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Stable code, present on structured refusals only.","uniqueKey":"code","typeLabel":"string"},"errorCode":{"type":"string","description":"Same as `code`; present where the refusal can also appear as a failed step's `errorCode`.","uniqueKey":"errorCode","typeLabel":"string"}},"example":{"error":"unknown or expired action"},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"unknown or expired action"}}},"exampleType":"generated"}},"exampleType":"generated"},"d69b8e11-af6e-4efd-9fad-294f377e154b":{"description":"`partner registry unavailable; retry shortly`; `rate limiter unavailable`; `\u003cvenue> is not available right now`; `no venue is available right now`; `wallet sign-in is not configured` (login); `API-key access to \u003cvenue> is unavailable`. Nothing was signed; retry later.","content":{"application/json":{"schema":{"type":"object","description":"Wallet API error body. `error` is a human-readable message; `code` is set on a few structured refusals (e.g. `CLIENT_ORDER_ID_CONFLICT`, `POLYMARKET_V2_TRADING_DISABLED`, `SIGNATURE_EXPIRED`); `errorCode` mirrors `code` where the same refusal can also surface on a failed step. Most `/v3` errors carry only `error`. Framework rejections (malformed JSON, wrong shape, missing content type) are plain text, not this body.","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable message.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Stable code, present on structured refusals only.","uniqueKey":"code","typeLabel":"string"},"errorCode":{"type":"string","description":"Same as `code`; present where the refusal can also appear as a failed step's `errorCode`.","uniqueKey":"errorCode","typeLabel":"string"}},"example":{"error":"unknown or expired action"},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"unknown or expired action"}}},"exampleType":"generated"}},"exampleType":"generated"},"70d05b7f-e53c-45b1-aebb-356972c901fe":{"description":"`… did not answer in time; GET /v3/actions/{id} before retrying`. The action may have progressed: read it before starting another.","content":{"application/json":{"schema":{"type":"object","description":"Wallet API error body. `error` is a human-readable message; `code` is set on a few structured refusals (e.g. `CLIENT_ORDER_ID_CONFLICT`, `POLYMARKET_V2_TRADING_DISABLED`, `SIGNATURE_EXPIRED`); `errorCode` mirrors `code` where the same refusal can also surface on a failed step. Most `/v3` errors carry only `error`. Framework rejections (malformed JSON, wrong shape, missing content type) are plain text, not this body.","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable message.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Stable code, present on structured refusals only.","uniqueKey":"code","typeLabel":"string"},"errorCode":{"type":"string","description":"Same as `code`; present where the refusal can also appear as a failed step's `errorCode`.","uniqueKey":"errorCode","typeLabel":"string"}},"example":{"error":"unknown or expired action"},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"unknown or expired action"}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"152ae4d6-3f7b-411e-bf21-fb5a778af612":{"walletPartnerId":{"type":"apiKey","in":"header","name":"X-Kairos-Partner-Id","description":"Wallet API partner id, issued by Kairos together with the partner's base URL. Identifies the partner (tenant) on every `/v3` call; sent instead of an API key. Letters, digits and `._:-`, at most 64 characters, case-insensitive. A partner id issued for an individual account cannot be sent this way — that account sends its API key triple instead.","scopes":[],"schemeName":"walletPartnerId"}},"522c79c2-6df0-4c0c-ab3e-0a4597a293c9":{"apiKeyClientId":{"type":"apiKey","in":"header","name":"X-Client-Id","description":"Credential client id (`kairos_ck_...`). Must be sent together with X-Api-Key and X-Api-Secret.","scopes":[],"schemeName":"apiKeyClientId"},"apiKeyKey":{"type":"apiKey","in":"header","name":"X-Api-Key","description":"64-char hex API key.","scopes":[],"schemeName":"apiKeyKey"},"apiKeySecret":{"type":"apiKey","in":"header","name":"X-Api-Secret","description":"64-char hex API secret.","scopes":[],"schemeName":"apiKeySecret"}}},"servers":{"330d272c-627a-4ff5-ad01-0263b300ce7a":{"url":"https://execution.kairos.trade","description":"Production"},"83635983-3d27-4bb6-bc26-42ecc043c06c":{"url":"https://staging-execution.kairos.trade","description":"Staging"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"X-Kairos-Partner-Id","description":"Wallet API partner id, issued by Kairos together with the partner's base URL. Identifies the partner (tenant) on every `/v3` call; sent instead of an API key. Letters, digits and `._:-`, at most 64 characters, case-insensitive. A partner id issued for an individual account cannot be sent this way — that account sends its API key triple instead.","scopes":[],"schemeName":"walletPartnerId"},"schema":{"title":"X-Kairos-Partner-Id","type":"string","description":"Wallet API partner id, issued by Kairos together with the partner's base URL. Identifies the partner (tenant) on every `/v3` call; sent instead of an API key. Letters, digits and `._:-`, at most 64 characters, case-insensitive. A partner id issued for an individual account cannot be sent this way — that account sends its API key triple instead.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"walletPartnerId","name":"X-Kairos-Partner-Id"}],"title":"walletPartnerId"},{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"X-Client-Id","description":"Credential client id (`kairos_ck_...`). Must be sent together with X-Api-Key and X-Api-Secret.","scopes":[],"schemeName":"apiKeyClientId"},"schema":{"title":"X-Client-Id","type":"string","description":"Credential client id (`kairos_ck_...`). Must be sent together with X-Api-Key and X-Api-Secret.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"apiKeyClientId","name":"X-Client-Id"},{"scheme":{"type":"apiKey","in":"header","name":"X-Api-Key","description":"64-char hex API key.","scopes":[],"schemeName":"apiKeyKey"},"schema":{"title":"X-Api-Key","type":"string","description":"64-char hex API key.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"apiKeyKey","name":"X-Api-Key"},{"scheme":{"type":"apiKey","in":"header","name":"X-Api-Secret","description":"64-char hex API secret.","scopes":[],"schemeName":"apiKeySecret"},"schema":{"title":"X-Api-Secret","type":"string","description":"64-char hex API secret.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"apiKeySecret","name":"X-Api-Secret"}],"title":"apiKeyClientId \u0026 apiKeyKey \u0026 apiKeySecret"}]},"originalFileLocation":"openapi/wallet-api.json"},"subdomain":"kairos-c5456474","siteName":"Kairos","title":"Start a wallet action (setup, order, cancel, login) - Kairos","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-29T04:21:19.479Z","originalFileLocation":"api-reference/partner/actions/start-a-wallet-action-setup-order-cancel-login.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Starts one action for a self-custody wallet and returns its first step. Kairos never holds the wallet\u0026#x27;s key: each step either asks the wallet for one EIP-1193 request (status: needs_signature) or reports progress (working) or the outcome (done / failed). The step loop. 1. POST /v3/actions → a step. 2. While status is needs_signature: switch the wallet to chainId (when non-null), run request through the wallet\u0026#x27;s EIP-1193 provider, and POST /v3/actions/{id} with {\u0026quot;signature\u0026quot;: \u0026quot;0x…\u0026quot;} (or {\u0026quot;result\u0026quot;: …} for wallet_sendCalls). Answer before expiresAtMs. 3. While status is working: GET /v3/actions/{id} every 1–2 s (or after holdUntilMs when present). 4. Stop at done (read result) or failed (read error and errorCode). Action types. setup prepares the wallet on each requested venue; order places one order and runs any missing setup first, in the same action; cancel cancels orders on every venue with one Polygon signature; login returns a sign-in token for the private reads. There are no other action types. Body rules. Field names are camelCase only: unknown fields — including snake_case spellings such as time_in_force, post_only, client_order_id, expires_at, order_ids — are silently ignored, so a snake_case order becomes a GTC, non-post-only order without a client id. price and size must be JSON strings; a JSON number is rejected with a plain-text 422. expiresAt is an integer (Unix seconds). Idempotency. Idempotency-Key is not honoured here. Use clientOrderId on orders: the same clientOrderId with the same terms returns the existing order (nothing is signed), and different terms are refused with CLIENT_ORDER_ID_CONFLICT. Timing. An action lives 15 minutes from creation and stays readable for 10 more minutes, then reads 404. Polymarket and Predict.fun order signatures are accepted for about 60 s, Hyperliquid order signatures for 300 s, and cancel signatures (every venue) for 300 s; expiresAtMs on the step is authoritative. Errors before the first signature are HTTP errors. When the action fails before the wallet was ever asked to sign (for example every requested venue is unavailable), the response is that error\u0026#x27;s status and body rather than a failed step. Send X-Kairos-Wallet-Api: 2; without it this route serves the original Polymarket-only contract.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Kairos\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/kairos-c5456474/9YOcCIzMBy0Rv1b-/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/kairos-c5456474/9YOcCIzMBy0Rv1b-/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/kairos-c5456474/9YOcCIzMBy0Rv1b-/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/kairos-c5456474/9YOcCIzMBy0Rv1b-/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/kairos-c5456474/9YOcCIzMBy0Rv1b-/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/kairos-c5456474/9YOcCIzMBy0Rv1b-/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/kairos-c5456474/9YOcCIzMBy0Rv1b-/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/kairos-c5456474/9YOcCIzMBy0Rv1b-/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/kairos-c5456474/9YOcCIzMBy0Rv1b-/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Start a wallet action (setup, order, cancel, login) - Kairos\">\u003cmeta data-mint-head property=\"og:description\" content=\"Starts one action for a self-custody wallet and returns its first step. Kairos never holds the wallet\u0026#x27;s key: each step either asks the wallet for one EIP-1193 request (status: needs_signature) or reports progress (working) or the outcome (done / failed). The step loop. 1. POST /v3/actions → a step. 2. While status is needs_signature: switch the wallet to chainId (when non-null), run request through the wallet\u0026#x27;s EIP-1193 provider, and POST /v3/actions/{id} with {\u0026quot;signature\u0026quot;: \u0026quot;0x…\u0026quot;} (or {\u0026quot;result\u0026quot;: …} for wallet_sendCalls). Answer before expiresAtMs. 3. While status is working: GET /v3/actions/{id} every 1–2 s (or after holdUntilMs when present). 4. Stop at done (read result) or failed (read error and errorCode). Action types. setup prepares the wallet on each requested venue; order places one order and runs any missing setup first, in the same action; cancel cancels orders on every venue with one Polygon signature; login returns a sign-in token for the private reads. There are no other action types. Body rules. Field names are camelCase only: unknown fields — including snake_case spellings such as time_in_force, post_only, client_order_id, expires_at, order_ids — are silently ignored, so a snake_case order becomes a GTC, non-post-only order without a client id. price and size must be JSON strings; a JSON number is rejected with a plain-text 422. expiresAt is an integer (Unix seconds). Idempotency. Idempotency-Key is not honoured here. Use clientOrderId on orders: the same clientOrderId with the same terms returns the existing order (nothing is signed), and different terms are refused with CLIENT_ORDER_ID_CONFLICT. Timing. An action lives 15 minutes from creation and stays readable for 10 more minutes, then reads 404. Polymarket and Predict.fun order signatures are accepted for about 60 s, Hyperliquid order signatures for 300 s, and cancel signatures (every venue) for 300 s; expiresAtMs on the step is authoritative. Errors before the first signature are HTTP errors. When the action fails before the wallet was ever asked to sign (for example every requested venue is unavailable), the response is that error\u0026#x27;s status and body rather than a failed step. Send X-Kairos-Wallet-Api: 2; without it this route serves the original Polymarket-only contract.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Kairos\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.kairos.trade/api-reference/partner/actions/start-a-wallet-action-setup-order-cancel-login\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://kairos-c5456474.mintlify.app/_mintlify/api/og/v2?division=Actions\u0026amp;title=Start+a+wallet+action+%28setup%2C+order%2C+cancel%2C+login%29\u0026amp;description=Starts+one+action+for+a+self-custody+wallet+and+returns+its+first+**step**.+Kairos+never+holds+the+wallet%27s+key%3A+each+step+either+asks+the+wallet+for+one+EIP-11\u0026amp;theme=530643ae41273bc052a9a850\u0026amp;signature=614f0da94ac6600ae1b843517d74f4031e7d79bb7d35cc5f0e7772034551960c\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Start a wallet action (setup, order, cancel, login) - Kairos\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Starts one action for a self-custody wallet and returns its first step. Kairos never holds the wallet\u0026#x27;s key: each step either asks the wallet for one EIP-1193 request (status: needs_signature) or reports progress (working) or the outcome (done / failed). The step loop. 1. POST /v3/actions → a step. 2. While status is needs_signature: switch the wallet to chainId (when non-null), run request through the wallet\u0026#x27;s EIP-1193 provider, and POST /v3/actions/{id} with {\u0026quot;signature\u0026quot;: \u0026quot;0x…\u0026quot;} (or {\u0026quot;result\u0026quot;: …} for wallet_sendCalls). Answer before expiresAtMs. 3. While status is working: GET /v3/actions/{id} every 1–2 s (or after holdUntilMs when present). 4. Stop at done (read result) or failed (read error and errorCode). Action types. setup prepares the wallet on each requested venue; order places one order and runs any missing setup first, in the same action; cancel cancels orders on every venue with one Polygon signature; login returns a sign-in token for the private reads. There are no other action types. Body rules. Field names are camelCase only: unknown fields — including snake_case spellings such as time_in_force, post_only, client_order_id, expires_at, order_ids — are silently ignored, so a snake_case order becomes a GTC, non-post-only order without a client id. price and size must be JSON strings; a JSON number is rejected with a plain-text 422. expiresAt is an integer (Unix seconds). Idempotency. Idempotency-Key is not honoured here. Use clientOrderId on orders: the same clientOrderId with the same terms returns the existing order (nothing is signed), and different terms are refused with CLIENT_ORDER_ID_CONFLICT. Timing. An action lives 15 minutes from creation and stays readable for 10 more minutes, then reads 404. Polymarket and Predict.fun order signatures are accepted for about 60 s, Hyperliquid order signatures for 300 s, and cancel signatures (every venue) for 300 s; expiresAtMs on the step is authoritative. Errors before the first signature are HTTP errors. When the action fails before the wallet was ever asked to sign (for example every requested venue is unavailable), the response is that error\u0026#x27;s status and body rather than a failed step. Send X-Kairos-Wallet-Api: 2; without it this route serves the original Polymarket-only contract.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://kairos-c5456474.mintlify.app/_mintlify/api/og/v2?division=Actions\u0026amp;title=Start+a+wallet+action+%28setup%2C+order%2C+cancel%2C+login%29\u0026amp;description=Starts+one+action+for+a+self-custody+wallet+and+returns+its+first+**step**.+Kairos+never+holds+the+wallet%27s+key%3A+each+step+either+asks+the+wallet+for+one+EIP-11\u0026amp;theme=530643ae41273bc052a9a850\u0026amp;signature=614f0da94ac6600ae1b843517d74f4031e7d79bb7d35cc5f0e7772034551960c\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/kairos-c5456474/9YOcCIzMBy0Rv1b-/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Kairos\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#807dfe\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.kairos.trade/api-reference/partner/actions/start-a-wallet-action-setup-order-cancel-login\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/partner/actions/start-a-wallet-action-setup-order-cancel-login.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.kairos.trade/#organization\",\"name\":\"Kairos\",\"url\":\"https://docs.kairos.trade\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/kairos-c5456474/JzYk92-enXUuMl0B/logo/kairos-wing.png?fit=max\u0026auto=format\u0026n=JzYk92-enXUuMl0B\u0026q=85\u0026s=c7c397bb87847c7f0e27019d68594bff\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.kairos.trade#website\",\"name\":\"Kairos\",\"url\":\"https://docs.kairos.trade\",\"publisher\":{\"@id\":\"https://docs.kairos.trade/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.kairos.trade/api-reference/partner/actions/start-a-wallet-action-setup-order-cancel-login#webpage\",\"url\":\"https://docs.kairos.trade/api-reference/partner/actions/start-a-wallet-action-setup-order-cancel-login\",\"name\":\"Start a wallet action (setup, order, cancel, login)\",\"description\":\"Starts one action for a self-custody wallet and returns its first step. Kairos never holds the wallet's key: each step either asks the wallet for one EIP-1193 request (status: needs_signature) or reports progress (working) or the outcome (done / failed). The step loop. 1. POST /v3/actions → a step. 2. While status is needs_signature: switch the wallet to chainId (when non-null), run request through the wallet's EIP-1193 provider, and POST /v3/actions/{id} with {\\\"signature\\\": \\\"0x…\\\"} (or {\\\"result\\\": …} for wallet_sendCalls). Answer before expiresAtMs. 3. While status is working: GET /v3/actions/{id} every 1–2 s (or after holdUntilMs when present). 4. Stop at done (read result) or failed (read error and errorCode). Action types. setup prepares the wallet on each requested venue; order places one order and runs any missing setup first, in the same action; cancel cancels orders on every venue with one Polygon signature; login returns a sign-in token for the private reads. There are no other action types. Body rules. Field names are camelCase only: unknown fields — including snake_case spellings such as time_in_force, post_only, client_order_id, expires_at, order_ids — are silently ignored, so a snake_case order becomes a GTC, non-post-only order without a client id. price and size must be JSON strings; a JSON number is rejected with a plain-text 422. expiresAt is an integer (Unix seconds). Idempotency. Idempotency-Key is not honoured here. Use clientOrderId on orders: the same clientOrderId with the same terms returns the existing order (nothing is signed), and different terms are refused with CLIENT_ORDER_ID_CONFLICT. Timing. An action lives 15 minutes from creation and stays readable for 10 more minutes, then reads 404. Polymarket and Predict.fun order signatures are accepted for about 60 s, Hyperliquid order signatures for 300 s, and cancel signatures (every venue) for 300 s; expiresAtMs on the step is authoritative. Errors before the first signature are HTTP errors. When the action fails before the wallet was ever asked to sign (for example every requested venue is unavailable), the response is that error's status and body rather than a failed step. Send X-Kairos-Wallet-Api: 2; without it this route serves the original Polymarket-only contract.\",\"dateModified\":\"2026-10-29T04:21:19.479Z\",\"isPartOf\":{\"@id\":\"https://docs.kairos.trade#website\"},\"breadcrumb\":{\"@id\":\"https://docs.kairos.trade/api-reference/partner/actions/start-a-wallet-action-setup-order-cancel-login#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.kairos.trade/api-reference/partner/actions/start-a-wallet-action-setup-order-cancel-login#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Kairos\",\"item\":\"https://docs.kairos.trade\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Start a wallet action (setup, order, cancel, login)\",\"item\":\"https://docs.kairos.trade/api-reference/partner/actions/start-a-wallet-action-setup-order-cancel-login\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.kairos.trade/api-reference/partner/actions/start-a-wallet-action-setup-order-cancel-login#apireference\",\"headline\":\"Start a wallet action (setup, order, cancel, login)\",\"name\":\"Start a wallet action (setup, order, cancel, login)\",\"description\":\"Starts one action for a self-custody wallet and returns its first step. Kairos never holds the wallet's key: each step either asks the wallet for one EIP-1193 request (status: needs_signature) or reports progress (working) or the outcome (done / failed). The step loop. 1. POST /v3/actions → a step. 2. While status is needs_signature: switch the wallet to chainId (when non-null), run request through the wallet's EIP-1193 provider, and POST /v3/actions/{id} with {\\\"signature\\\": \\\"0x…\\\"} (or {\\\"result\\\": …} for wallet_sendCalls). Answer before expiresAtMs. 3. While status is working: GET /v3/actions/{id} every 1–2 s (or after holdUntilMs when present). 4. Stop at done (read result) or failed (read error and errorCode). Action types. setup prepares the wallet on each requested venue; order places one order and runs any missing setup first, in the same action; cancel cancels orders on every venue with one Polygon signature; login returns a sign-in token for the private reads. There are no other action types. Body rules. Field names are camelCase only: unknown fields — including snake_case spellings such as time_in_force, post_only, client_order_id, expires_at, order_ids — are silently ignored, so a snake_case order becomes a GTC, non-post-only order without a client id. price and size must be JSON strings; a JSON number is rejected with a plain-text 422. expiresAt is an integer (Unix seconds). Idempotency. Idempotency-Key is not honoured here. Use clientOrderId on orders: the same clientOrderId with the same terms returns the existing order (nothing is signed), and different terms are refused with CLIENT_ORDER_ID_CONFLICT. Timing. An action lives 15 minutes from creation and stays readable for 10 more minutes, then reads 404. Polymarket and Predict.fun order signatures are accepted for about 60 s, Hyperliquid order signatures for 300 s, and cancel signatures (every venue) for 300 s; expiresAtMs on the step is authoritative. Errors before the first signature are HTTP errors. When the action fails before the wallet was ever asked to sign (for example every requested venue is unavailable), the response is that error's status and body rather than a failed step. Send X-Kairos-Wallet-Api: 2; without it this route serves the original Polymarket-only contract.\",\"url\":\"https://docs.kairos.trade/api-reference/partner/actions/start-a-wallet-action-setup-order-cancel-login\",\"mainEntityOfPage\":{\"@id\":\"https://docs.kairos.trade/api-reference/partner/actions/start-a-wallet-action-setup-order-cancel-login#webpage\"},\"dateModified\":\"2026-10-29T04:21:19.479Z\",\"publisher\":{\"@id\":\"https://docs.kairos.trade/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.kairos.trade#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Kairos\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Kairos","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/introduction"}]},{"tab":"Partner API","groups":[{"group":"Get started","icon":"rocket","pages":[{"title":"Kairos Partner API","sidebarTitle":"Introduction","icon":"wallet","href":"/wallets/overview"},{"title":"Onboarding and go-live","sidebarTitle":"Onboarding and go-live","icon":"list-check","href":"/wallets/onboarding"},{"title":"Quickstart: your first order","sidebarTitle":"Quickstart","icon":"rocket","href":"/wallets/quickstart"},{"title":"Partner API authentication","sidebarTitle":"Authentication","icon":"key","href":"/wallets/authentication"}]},{"group":"Onboard users","icon":"user-plus","pages":[{"title":"Set up and fund a wallet","sidebarTitle":"Set up and fund a wallet","icon":"user-plus","href":"/wallets/setup"},{"title":"Venue rules","sidebarTitle":"Venue rules","icon":"building-columns","href":"/wallets/venues"}]},{"group":"Trade","icon":"arrow-right-arrow-left","pages":[{"title":"Show markets","sidebarTitle":"Show markets","icon":"chart-line","href":"/wallets/markets"},{"title":"Place and cancel orders","sidebarTitle":"Place and cancel orders","icon":"arrow-right-arrow-left","href":"/wallets/trade"},{"title":"Show orders and positions","sidebarTitle":"Show orders and positions","icon":"briefcase","href":"/wallets/portfolio"},{"title":"What the wallet signs","sidebarTitle":"What the wallet signs","icon":"signature","href":"/wallets/signing"}]},{"group":"Route and fund","icon":"route","pages":[{"title":"Routing across venues","sidebarTitle":"Routing across venues","icon":"route","href":"/wallets/routing"},{"title":"Funded trade plans","tag":"Preview","sidebarTitle":"Funded trade plans","icon":"route","href":"/wallets/trade-plans"},{"title":"Split, merge and redeem","tag":"Preview","sidebarTitle":"Split, merge, redeem","icon":"link","href":"/wallets/onchain"}]},{"group":"Partner fees","icon":"receipt","pages":[{"title":"Partner fees and settlement","tag":"Preview","sidebarTitle":"Partner fees","icon":"receipt","href":"/wallets/fees"}]},{"group":"Build","icon":"code","pages":[{"title":"TypeScript SDK","sidebarTitle":"TypeScript SDK","icon":"js","href":"/wallets/sdk"},{"title":"Without the SDK: plain HTTP","sidebarTitle":"Plain HTTP clients","icon":"terminal","href":"/wallets/http"},{"title":"Errors, limits and idempotency","sidebarTitle":"Errors and limits","description":"Every endpoint, field, result and error of the wallet API.","icon":"book","href":"/wallets/reference"}]},{"group":"Endpoints","icon":"brackets-curly","pages":[{"group":"Actions","pages":[{"title":"Start a wallet action (setup, order, cancel, login)","deprecated":null,"version":null,"openapi":"/openapi/wallet-api.json post /v3/actions","href":"/api-reference/partner/actions/start-a-wallet-action-setup-order-cancel-login"},{"title":"Read an action's current step","description":"Returns the action's current step. Poll this while `status` is `working`; when the step carries `holdUntilMs` (an order the venue is still matching), wait until then before polling.\n\nAn action is readable for 10 minutes after its 15-minute lifetime ends. Unknown, expired, and other partners' actions all read `404`.","deprecated":null,"version":null,"openapi":"/openapi/wallet-api.json get /v3/actions/{id}","href":"/api-reference/partner/actions/read-an-actions-current-step"},{"title":"Answer the current step (signature or wallet result)","deprecated":null,"version":null,"openapi":"/openapi/wallet-api.json post /v3/actions/{id}","href":"/api-reference/partner/actions/answer-the-current-step-signature-or-wallet-result"}]},{"group":"Reads","pages":[{"title":"Read a wallet's readiness and balances per venue","deprecated":null,"version":null,"openapi":"/openapi/wallet-api.json get /v3/wallets/{address}","href":"/api-reference/partner/reads/read-a-wallets-readiness-and-balances-per-venue"},{"title":"List a wallet's orders across venues","deprecated":null,"version":null,"openapi":"/openapi/wallet-api.json get /v3/wallets/{address}/orders","href":"/api-reference/partner/reads/list-a-wallets-orders-across-venues"},{"title":"List a wallet's positions across venues","deprecated":null,"version":null,"openapi":"/openapi/wallet-api.json get /v3/wallets/{address}/positions","href":"/api-reference/partner/reads/list-a-wallets-positions-across-venues"}]},{"group":"Fees (preview)","pages":[{"title":"Read a wallet's unpaid trading fees per venue","deprecated":null,"version":null,"openapi":"/openapi/wallet-api.json get /v3/fees","href":"/api-reference/partner/fees-preview/read-a-wallets-unpaid-trading-fees-per-venue"},{"title":"Open a settlement for a wallet's unpaid fees on one venue","deprecated":null,"version":null,"openapi":"/openapi/wallet-api.json post /v3/fees/settlements","href":"/api-reference/partner/fees-preview/open-a-settlement-for-a-wallets-unpaid-fees-on-one-venue"},{"title":"Read (and advance) a fee settlement","deprecated":null,"version":null,"openapi":"/openapi/wallet-api.json get /v3/fees/settlements/{id}","href":"/api-reference/partner/fees-preview/read-and-advance-a-fee-settlement"},{"title":"Post the wallet's signature or transaction hash for a settlement","deprecated":null,"version":null,"openapi":"/openapi/wallet-api.json post /v3/fees/settlements/{id}/answer","href":"/api-reference/partner/fees-preview/post-the-wallets-signature-or-transaction-hash-for-a-settlement"}]},{"group":"Trade plans (preview)","pages":[{"title":"Prepare a trade plan (one buy, optionally funded cross-chain)","deprecated":null,"version":null,"openapi":"/openapi/wallet-api.json post /v3/trade-plans","href":"/api-reference/partner/trade-plans-preview/prepare-a-trade-plan-one-buy-optionally-funded-cross-chain"},{"title":"Read a trade plan","deprecated":null,"version":null,"openapi":"/openapi/wallet-api.json get /v3/trade-plans/{id}","href":"/api-reference/partner/trade-plans-preview/read-a-trade-plan"},{"title":"Post signatures for a trade plan's requests","deprecated":null,"version":null,"openapi":"/openapi/wallet-api.json post /v3/trade-plans/{id}/answers","href":"/api-reference/partner/trade-plans-preview/post-signatures-for-a-trade-plans-requests"},{"title":"Commit a trade plan for execution","deprecated":null,"version":null,"openapi":"/openapi/wallet-api.json post /v3/trade-plans/{id}/execute","href":"/api-reference/partner/trade-plans-preview/commit-a-trade-plan-for-execution"},{"title":"Report client-submitted funding permits","deprecated":null,"version":null,"openapi":"/openapi/wallet-api.json post /v3/trade-plans/{id}/reports","href":"/api-reference/partner/trade-plans-preview/report-client-submitted-funding-permits"}]},{"group":"On-chain intents (preview)","pages":[{"title":"Prepare a split, merge or redeem on a Polymarket deposit wallet","deprecated":null,"version":null,"openapi":"/openapi/wallet-api.json post /v3/onchain-intents","href":"/api-reference/partner/on-chain-intents-preview/prepare-a-split-merge-or-redeem-on-a-polymarket-deposit-wallet"},{"title":"Read an on-chain intent","deprecated":null,"version":null,"openapi":"/openapi/wallet-api.json get /v3/onchain-intents/{id}","href":"/api-reference/partner/on-chain-intents-preview/read-an-on-chain-intent"},{"title":"Commit an on-chain intent with its signatures","deprecated":null,"version":null,"openapi":"/openapi/wallet-api.json post /v3/onchain-intents/{id}/execute","href":"/api-reference/partner/on-chain-intents-preview/commit-an-on-chain-intent-with-its-signatures"},{"title":"Report the transaction hash of a client-submitted intent","deprecated":null,"version":null,"openapi":"/openapi/wallet-api.json post /v3/onchain-intents/{id}/reports","href":"/api-reference/partner/on-chain-intents-preview/report-the-transaction-hash-of-a-client-submitted-intent"}]}]}]},{"tab":"Trading API","pages":[{"title":"Trading API","href":"/guides/order-types"}]},{"tab":"Market Data","pages":[{"title":"Market Data","href":"/market-data/overview"}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference"}]}]},"basePath":"","title":"Start a wallet action (setup, order, cancel, login) - Kairos","buildId":"dpl_9VVk5y1P8k1ATeJguVngy9Q3cmbD","deploymentId":"dpl_9VVk5y1P8k1ATeJguVngy9Q3cmbD","dynamics":["c2aa737661","b0f84f53ff","a9bb46feb3","2b790eda92"],"chunks":["OpenApiReferenceProvider-DX1Meug0.js","utils-B_OMIQVC.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-ChxhRPMa.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-CuKvD8Iv.js","snippetPresets-C5d7p2hp.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","Page-BAvA99GL.js","ApiExamples-CfHcE8m4.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-C1zZV314.js","shallow-CmQhqCJn.js","getApiPlaygroundDisplay-YRo9s1O7.js","CodeSnippet-RN1MTdfk.js","CodeSnippets-DKLPHxJA.js","getPastedJson-bz0M41mU.js","icon-CsmhpPrv.js","MethodPill-CNGsVE77.js","DuplicateIcon-DilfU_Z2.js","createIcon-BdsYzQck.js","DynamicMarkdown-CbqEDjbV.js","SectionHeading-O6hXpFCN.js","axios-vUo_bRtp.js","Markdown-nKm-uidQ.js","clsx-ClVdStUn.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CIQkMg3R.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-ImrFS4Fy.js"]}