Spends the previewed stake_coins and opens the position previewed
by /topics/{id}/order-preview. Accepts only the
confirm_token; the stake travels inside it, so there is no
amount_coins here. Requires the write scope; counts against both
the write window (10/min, 200/day) and the read window.
If the 60-second price lock captured at preview is still live the order
fills at the previewed units and price_locked is true. Otherwise it
fills at the current market price — the order is not rejected —
and price_locked is false, with order.units/order.price holding
the actual fill next to the confirmed previewed values. A lock with
under 2 seconds left is treated as expired.
order.units is the raw unit count; what the order pays if correct
is order.payout_if_correct_rubies (units × the order’s ruby
multiplier at fill — a guaranteed minimum: if the topic settles while a ruby boost is live, it pays at the higher multiplier). Compare that with
previewed.payout_if_correct_rubies — not with units, which
differs from the payout whenever a ruby boost is running.
Retrying with the same token returns the original order and
replayed: true. Note that price_locked then describes this
call, not the original fill (whose lock state is not stored) — to
reconcile, compare order against previewed.
409 STAKE_OUT_OF_RANGE exists only as a safety mapping: a topic’s
range cannot change after the preview, so the normal flow never
reaches it.
Personal API key issued per SeeSaw user account:
Authorization: Bearer sspat_…. Manage keys on the app API
(/v1/users/me/api-keys). Revocation propagates within ~60 seconds
(validation cache window).
The key's scopes decide what it may do: every key has read; a key
created with ["read","write"] may also use the six write operations
(marked x-required-scope: write in this document). Scopes are fixed at
creation — to get write access, create a new key. A read-only key
calling a write operation gets 403 FORBIDDEN_SCOPE.
Body
application/json
The only accepted body of an execute operation. The token comes from
the matching preview, is valid 5 minutes and is bound to this user,
key, action and parameters.
true when this token had already been executed and the original order is being returned.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"SeeSaw Developer","colors":{"primary":"#04A363","light":"#0BC97D","dark":"#04A363"},"footer":{"socials":{"website":"https://seesaw.fun"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"seesaw","hasAudioNarration":false,"actualSubdomain":"seesaw","customDomains":["docs.seesaw.fun"],"gitSource":{"type":"github","owner":"seesawtech","repo":"seesaw-developer-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"collectionId":"f9af2bf3-38a8-4a14-bb52-4614900390d7","liveDeploymentHistoryId":"6ab4c2fa6db8efdbd0b1fe11","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ab4c2fa6db8efdbd0b1fe11"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ab4c2fa6db8efdbd0b1fe11","clientVersion":"0.0.4054","searchFilterCounts":[{"language":"default","tag":"Guides","count":31},{"language":"default","tag":"MCP Server","count":24},{"language":"default","tag":"API Reference","count":19},{"language":"default","tag":"Tools","count":19},{"language":"default","tag":"Endpoints","count":18},{"language":"default","tag":"Read","count":12},{"language":"default","tag":"Me","count":7},{"language":"default","tag":"Write","count":6},{"language":"default","tag":"Topics","count":5},{"language":"default","tag":"Client Setup","count":4}]},"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":"byok-sep-25","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":"billing-updated-9-15","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/trading/place-the-previewed-order-step-2-of-2","slug":"/api-reference/trading/place-the-previewed-order-step-2-of-2","pageMetadata":{"title":"Place the previewed order (step 2 of 2)","description":"Spends the previewed `stake_coins` and opens the position previewed\nby `/topics/{id}/order-preview`. Accepts **only** the\n`confirm_token`; the stake travels inside it, so there is no\n`amount_coins` here. Requires the `write` scope; counts against both\nthe write window (10/min, 200/day) and the read window.\n\nIf the 60-second price lock captured at preview is still live the order\nfills at the previewed units and `price_locked` is `true`. Otherwise it\nfills at the **current market price** — the order is not rejected —\nand `price_locked` is `false`, with `order.units`/`order.price` holding\nthe actual fill next to the confirmed `previewed` values. A lock with\nunder 2 seconds left is treated as expired.\n\n`order.units` is the raw unit count; what the order pays if correct\nis `order.payout_if_correct_rubies` (units × the order's ruby\nmultiplier at fill — a guaranteed minimum: if the topic settles while a ruby boost is live, it pays at the higher multiplier). Compare that with\n`previewed.payout_if_correct_rubies` — not with `units`, which\ndiffers from the payout whenever a ruby boost is running.\n\nRetrying with the same token returns the original order and\n`replayed: true`. Note that `price_locked` then describes **this\ncall**, not the original fill (whose lock state is not stored) — to\nreconcile, compare `order` against `previewed`.\n\n`409 STAKE_OUT_OF_RANGE` exists only as a safety mapping: a topic's\nrange cannot change after the preview, so the normal flow never\nreaches it.\n","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /orders","href":"/api-reference/trading/place-the-previewed-order-step-2-of-2","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 p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Spends the previewed \", _jsx(_components.code, {\n children: \"stake_coins\"\n }), \" and opens the position previewed\\nby \", _jsx(_components.code, {\n children: \"/topics/{id}/order-preview\"\n }), \". Accepts \", _jsx(_components.strong, {\n children: \"only\"\n }), \" the\\n\", _jsx(_components.code, {\n children: \"confirm_token\"\n }), \"; the stake travels inside it, so there is no\\n\", _jsx(_components.code, {\n children: \"amount_coins\"\n }), \" here. Requires the \", _jsx(_components.code, {\n children: \"write\"\n }), \" scope; counts against both\\nthe write window (10/min, 200/day) and the read window.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"If the 60-second price lock captured at preview is still live the order\\nfills at the previewed units and \", _jsx(_components.code, {\n children: \"price_locked\"\n }), \" is \", _jsx(_components.code, {\n children: \"true\"\n }), \". Otherwise it\\nfills at the \", _jsx(_components.strong, {\n children: \"current market price\"\n }), \" — the order is not rejected —\\nand \", _jsx(_components.code, {\n children: \"price_locked\"\n }), \" is \", _jsx(_components.code, {\n children: \"false\"\n }), \", with \", _jsx(_components.code, {\n children: \"order.units\"\n }), \"/\", _jsx(_components.code, {\n children: \"order.price\"\n }), \" holding\\nthe actual fill next to the confirmed \", _jsx(_components.code, {\n children: \"previewed\"\n }), \" values. A lock with\\nunder 2 seconds left is treated as expired.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"order.units\"\n }), \" is the raw unit count; what the order pays if correct\\nis \", _jsx(_components.code, {\n children: \"order.payout_if_correct_rubies\"\n }), \" (units × the order’s ruby\\nmultiplier at fill — a guaranteed minimum: if the topic settles while a ruby boost is live, it pays at the higher multiplier). Compare that with\\n\", _jsx(_components.code, {\n children: \"previewed.payout_if_correct_rubies\"\n }), \" — not with \", _jsx(_components.code, {\n children: \"units\"\n }), \", which\\ndiffers from the payout whenever a ruby boost is running.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Retrying with the same token returns the original order and\\n\", _jsx(_components.code, {\n children: \"replayed: true\"\n }), \". Note that \", _jsx(_components.code, {\n children: \"price_locked\"\n }), \" then describes \", _jsx(_components.strong, {\n children: \"this\\ncall\"\n }), \", not the original fill (whose lock state is not stored) — to\\nreconcile, compare \", _jsx(_components.code, {\n children: \"order\"\n }), \" against \", _jsx(_components.code, {\n children: \"previewed\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"409 STAKE_OUT_OF_RANGE\"\n }), \" exists only as a safety mapping: a topic’s\\nrange cannot change after the preview, so the normal flow never\\nreaches it.\"]\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":"Place the previewed order (step 2 of 2)","description":"Spends the previewed `stake_coins` and opens the position previewed\nby `/topics/{id}/order-preview`. Accepts **only** the\n`confirm_token`; the stake travels inside it, so there is no\n`amount_coins` here. Requires the `write` scope; counts against both\nthe write window (10/min, 200/day) and the read window.\n\nIf the 60-second price lock captured at preview is still live the order\nfills at the previewed units and `price_locked` is `true`. Otherwise it\nfills at the **current market price** — the order is not rejected —\nand `price_locked` is `false`, with `order.units`/`order.price` holding\nthe actual fill next to the confirmed `previewed` values. A lock with\nunder 2 seconds left is treated as expired.\n\n`order.units` is the raw unit count; what the order pays if correct\nis `order.payout_if_correct_rubies` (units × the order's ruby\nmultiplier at fill — a guaranteed minimum: if the topic settles while a ruby boost is live, it pays at the higher multiplier). Compare that with\n`previewed.payout_if_correct_rubies` — not with `units`, which\ndiffers from the payout whenever a ruby boost is running.\n\nRetrying with the same token returns the original order and\n`replayed: true`. Note that `price_locked` then describes **this\ncall**, not the original fill (whose lock state is not stored) — to\nreconcile, compare `order` against `previewed`.\n\n`409 STAKE_OUT_OF_RANGE` exists only as a safety mapping: a topic's\nrange cannot change after the preview, so the normal flow never\nreaches it.\n","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /orders","href":"/api-reference/trading/place-the-previewed-order-step-2-of-2","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"placeOrder","tags":["Trading"],"summary":"Place the previewed order (step 2 of 2)","x-required-scope":"write","description":"Spends the previewed `stake_coins` and opens the position previewed\nby `/topics/{id}/order-preview`. Accepts **only** the\n`confirm_token`; the stake travels inside it, so there is no\n`amount_coins` here. Requires the `write` scope; counts against both\nthe write window (10/min, 200/day) and the read window.\n\nIf the 60-second price lock captured at preview is still live the order\nfills at the previewed units and `price_locked` is `true`. Otherwise it\nfills at the **current market price** — the order is not rejected —\nand `price_locked` is `false`, with `order.units`/`order.price` holding\nthe actual fill next to the confirmed `previewed` values. A lock with\nunder 2 seconds left is treated as expired.\n\n`order.units` is the raw unit count; what the order pays if correct\nis `order.payout_if_correct_rubies` (units × the order's ruby\nmultiplier at fill — a guaranteed minimum: if the topic settles while a ruby boost is live, it pays at the higher multiplier). Compare that with\n`previewed.payout_if_correct_rubies` — not with `units`, which\ndiffers from the payout whenever a ruby boost is running.\n\nRetrying with the same token returns the original order and\n`replayed: true`. Note that `price_locked` then describes **this\ncall**, not the original fill (whose lock state is not stored) — to\nreconcile, compare `order` against `previewed`.\n\n`409 STAKE_OUT_OF_RANGE` exists only as a safety mapping: a topic's\nrange cannot change after the preview, so the normal flow never\nreaches it.\n","requestBody":"b4825e5c-908c-46e8-ae92-23df785ee6d6","responses":{"200":"f53c1d3b-722a-467a-b0b5-8a9af1e07b9f","400":"8bbd66c8-8f12-42c8-90a2-435443bb0599","401":"d35ef8d8-9187-4e81-bf8d-5dd990f1ff28","403":"88285064-135a-4a20-a049-f5ab9d4bfe20","404":"9407fd3f-17ae-48cc-9175-93c914accb2f","409":"4ac839d8-3578-44de-8743-5593e44aa1d5","429":"8270b12f-fd40-4a9b-b85a-8ea09b8b1283","500":"b07cc161-171b-420c-84d0-e2637d854595"},"method":"post","type":"path","servers":["8b57a1c3-4bcf-4125-a8ec-f3cb0c2082e6"],"security":["981d7369-b6b3-48d9-be19-e49d959eb5ba"],"path":"/orders","baseUrlOptions":["https://api.seesaw.fun/open/v1"],"title":"Place the previewed order (step 2 of 2)","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["confirm_token"],"description":"The only accepted body of an execute operation. The token comes from\nthe matching preview, is valid 5 minutes and is bound to this user,\nkey, action and parameters.\n","properties":{"confirm_token":{"type":"string","example":"oc1.eyJhIjoicGxhY2Vfb3JkZXIi….B7BIlLpN9gqCD8Ug2FcGEg","isRequired":true,"uniqueKey":"confirm_token","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"confirm_token":"oc1.eyJhIjoicGxhY2Vfb3JkZXIi….B7BIlLpN9gqCD8Ug2FcGEg"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"f53c1d3b-722a-467a-b0b5-8a9af1e07b9f":{"description":"The filled order","content":{"application/json":{"schema":{"type":"object","required":["order","price_locked","previewed","replayed"],"properties":{"order":{"type":"object","required":["id","topic_id","option_id","stake_coins","units","payout_if_correct_rubies","price","placed_at"],"properties":{"id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"order.id","typeLabel":"string\u003cuuid>"},"topic_id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"order.topic_id","typeLabel":"string\u003cuuid>"},"option_id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"order.option_id","typeLabel":"string\u003cuuid>"},"stake_coins":{"type":"string","isRequired":true,"uniqueKey":"order.stake_coins","typeLabel":"string"},"units":{"type":"string","description":"The ACTUAL fill — report this to the user, not the previewed\nvalue. Raw unit count, before any ruby boost.\n","isRequired":true,"uniqueKey":"order.units","typeLabel":"string"},"payout_if_correct_rubies":{"type":"string","description":"What this order pays at least if correct: `units × the order's\nruby multiplier at fill` — a guaranteed minimum: if the topic settles while a ruby boost is live, it pays at the higher multiplier. Report and reconcile this,\nnot `units`.\n","isRequired":true,"uniqueKey":"order.payout_if_correct_rubies","typeLabel":"string"},"price":{"type":"string","isRequired":true,"uniqueKey":"order.price","typeLabel":"string"},"placed_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"order.placed_at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"order","typeLabel":"object"},"price_locked":{"type":"boolean","description":"`true` when the preview's 60-second lock was still live and the fill\nmatched it. `false` means the order filled at the market instead.\n","isRequired":true,"uniqueKey":"price_locked","typeLabel":"boolean"},"previewed":{"type":"object","description":"The numbers the user confirmed, for comparison.","required":["units","payout_if_correct_rubies","price"],"properties":{"units":{"type":"string","isRequired":true,"uniqueKey":"previewed.units","typeLabel":"string"},"payout_if_correct_rubies":{"type":"string","description":"The `payout_if_correct_rubies` the preview summary showed.\nEmpty for a token minted before contract 2.1.0.\n","isRequired":true,"uniqueKey":"previewed.payout_if_correct_rubies","typeLabel":"string"},"price":{"type":"string","isRequired":true,"uniqueKey":"previewed.price","typeLabel":"string"}},"isRequired":true,"uniqueKey":"previewed","typeLabel":"object"},"replayed":{"type":"boolean","description":"`true` when this token had already been executed and the original order is being returned.","isRequired":true,"uniqueKey":"replayed","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"order":{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","topic_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","option_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","stake_coins":"\u003cstring>","units":"\u003cstring>","payout_if_correct_rubies":"\u003cstring>","price":"\u003cstring>","placed_at":"2023-11-07T05:31:56Z"},"price_locked":true,"previewed":{"units":"\u003cstring>","payout_if_correct_rubies":"\u003cstring>","price":"\u003cstring>"},"replayed":true}}},"exampleType":"generated"}},"exampleType":"generated"},"8bbd66c8-8f12-42c8-90a2-435443bb0599":{"description":"Invalid argument (`details.field` names the offending parameter)","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["UNAUTHORIZED","FORBIDDEN","FORBIDDEN_SCOPE","NOT_FOUND","OPINION_NOT_FOUND","INVALID_ARGUMENT","RATE_LIMITED","SERVICE_DISABLED","INTERNAL","CONFIRM_TOKEN_INVALID","CONFIRM_TOKEN_EXPIRED","CONFIRM_TOKEN_USED","CONFIRM_UNAVAILABLE","MECHANISM_UNSUPPORTED","PREVIEW_UNAVAILABLE","TOPIC_ALREADY_STAKED","TOPIC_CLOSED","TOPIC_QUOTE_EXPIRED","TOPIC_QUOTE_INVALID","TOPIC_MECHANISM_MISMATCH","STAKE_OUT_OF_RANGE","RETRY_IDEMPOTENCY_KEY","OPINION_ALREADY_BACKED","OPINION_BACK_PRICE_MOVED","OPINION_BACK_RETRY","OPINION_BACK_FULL","OPINION_BACK_CHAIN_BROKEN","OPINION_SIDE_REQUIRED","OPINION_SIDE_INVALID","OPINION_TOPIC_CLOSED","OPINION_TOPIC_HIDDEN","OPINIONS_UNAVAILABLE","INSUFFICIENT_BALANCE","CONTENT_INVALID","CONTENT_MODERATED","USER_PUNISHED"],"description":"Stable contract values. `SERVICE_DISABLED` (503) is the\nemergency kill switch; `FORBIDDEN_SCOPE` (403) means the key\nlacks the `write` scope. The `CONFIRM_TOKEN_*` and rule codes\nonly occur on the write surface. `OPINION_SIDE_REQUIRED` /\n`OPINION_SIDE_INVALID` are rare but reachable: `preview_opinion`\nalready answers a missing or invalid side with\n`can_publish: false` (reason `SIDE_REQUIRED`), so they surface\nas a 400 from `publish_opinion` only when the owner's position\nchanged between preview and publish (e.g. no position at\npreview, then an order on the other side before publishing) and\nthe side in the token no longer fits.\n","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"object","description":"Optional context, e.g. `{\"field\": \"limit\"}`, `{\"retry_after\": 12}` or `{\"required_scope\": \"write\"}`.","additionalProperties":true,"uniqueKey":"error.details","typeLabel":"object"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"UNAUTHORIZED","message":"\u003cstring>","details":{}}}}},"exampleType":"generated"}},"exampleType":"generated"},"d35ef8d8-9187-4e81-bf8d-5dd990f1ff28":{"description":"Missing, invalid, revoked, or expired API key (carries `WWW-Authenticate`)","headers":{"WWW-Authenticate":{"schema":{"type":"string"},"description":"Bearer realm=\"seesaw-open-api\""}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["UNAUTHORIZED","FORBIDDEN","FORBIDDEN_SCOPE","NOT_FOUND","OPINION_NOT_FOUND","INVALID_ARGUMENT","RATE_LIMITED","SERVICE_DISABLED","INTERNAL","CONFIRM_TOKEN_INVALID","CONFIRM_TOKEN_EXPIRED","CONFIRM_TOKEN_USED","CONFIRM_UNAVAILABLE","MECHANISM_UNSUPPORTED","PREVIEW_UNAVAILABLE","TOPIC_ALREADY_STAKED","TOPIC_CLOSED","TOPIC_QUOTE_EXPIRED","TOPIC_QUOTE_INVALID","TOPIC_MECHANISM_MISMATCH","STAKE_OUT_OF_RANGE","RETRY_IDEMPOTENCY_KEY","OPINION_ALREADY_BACKED","OPINION_BACK_PRICE_MOVED","OPINION_BACK_RETRY","OPINION_BACK_FULL","OPINION_BACK_CHAIN_BROKEN","OPINION_SIDE_REQUIRED","OPINION_SIDE_INVALID","OPINION_TOPIC_CLOSED","OPINION_TOPIC_HIDDEN","OPINIONS_UNAVAILABLE","INSUFFICIENT_BALANCE","CONTENT_INVALID","CONTENT_MODERATED","USER_PUNISHED"],"description":"Stable contract values. `SERVICE_DISABLED` (503) is the\nemergency kill switch; `FORBIDDEN_SCOPE` (403) means the key\nlacks the `write` scope. The `CONFIRM_TOKEN_*` and rule codes\nonly occur on the write surface. `OPINION_SIDE_REQUIRED` /\n`OPINION_SIDE_INVALID` are rare but reachable: `preview_opinion`\nalready answers a missing or invalid side with\n`can_publish: false` (reason `SIDE_REQUIRED`), so they surface\nas a 400 from `publish_opinion` only when the owner's position\nchanged between preview and publish (e.g. no position at\npreview, then an order on the other side before publishing) and\nthe side in the token no longer fits.\n","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"object","description":"Optional context, e.g. `{\"field\": \"limit\"}`, `{\"retry_after\": 12}` or `{\"required_scope\": \"write\"}`.","additionalProperties":true,"uniqueKey":"error.details","typeLabel":"object"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"UNAUTHORIZED","message":"\u003cstring>","details":{}}}}},"exampleType":"generated"}},"exampleType":"generated"},"88285064-135a-4a20-a049-f5ab9d4bfe20":{"description":"The key lacks the scope this operation needs — `FORBIDDEN_SCOPE`, with\n`details.required_scope`. Create a key with the `write` scope.\n","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["UNAUTHORIZED","FORBIDDEN","FORBIDDEN_SCOPE","NOT_FOUND","OPINION_NOT_FOUND","INVALID_ARGUMENT","RATE_LIMITED","SERVICE_DISABLED","INTERNAL","CONFIRM_TOKEN_INVALID","CONFIRM_TOKEN_EXPIRED","CONFIRM_TOKEN_USED","CONFIRM_UNAVAILABLE","MECHANISM_UNSUPPORTED","PREVIEW_UNAVAILABLE","TOPIC_ALREADY_STAKED","TOPIC_CLOSED","TOPIC_QUOTE_EXPIRED","TOPIC_QUOTE_INVALID","TOPIC_MECHANISM_MISMATCH","STAKE_OUT_OF_RANGE","RETRY_IDEMPOTENCY_KEY","OPINION_ALREADY_BACKED","OPINION_BACK_PRICE_MOVED","OPINION_BACK_RETRY","OPINION_BACK_FULL","OPINION_BACK_CHAIN_BROKEN","OPINION_SIDE_REQUIRED","OPINION_SIDE_INVALID","OPINION_TOPIC_CLOSED","OPINION_TOPIC_HIDDEN","OPINIONS_UNAVAILABLE","INSUFFICIENT_BALANCE","CONTENT_INVALID","CONTENT_MODERATED","USER_PUNISHED"],"description":"Stable contract values. `SERVICE_DISABLED` (503) is the\nemergency kill switch; `FORBIDDEN_SCOPE` (403) means the key\nlacks the `write` scope. The `CONFIRM_TOKEN_*` and rule codes\nonly occur on the write surface. `OPINION_SIDE_REQUIRED` /\n`OPINION_SIDE_INVALID` are rare but reachable: `preview_opinion`\nalready answers a missing or invalid side with\n`can_publish: false` (reason `SIDE_REQUIRED`), so they surface\nas a 400 from `publish_opinion` only when the owner's position\nchanged between preview and publish (e.g. no position at\npreview, then an order on the other side before publishing) and\nthe side in the token no longer fits.\n","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"object","description":"Optional context, e.g. `{\"field\": \"limit\"}`, `{\"retry_after\": 12}` or `{\"required_scope\": \"write\"}`.","additionalProperties":true,"uniqueKey":"error.details","typeLabel":"object"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"UNAUTHORIZED","message":"\u003cstring>","details":{}}}}},"exampleType":"generated"}},"exampleType":"generated"},"9407fd3f-17ae-48cc-9175-93c914accb2f":{"description":"Resource missing, or hidden by privacy/moderation (existence does not leak)","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["UNAUTHORIZED","FORBIDDEN","FORBIDDEN_SCOPE","NOT_FOUND","OPINION_NOT_FOUND","INVALID_ARGUMENT","RATE_LIMITED","SERVICE_DISABLED","INTERNAL","CONFIRM_TOKEN_INVALID","CONFIRM_TOKEN_EXPIRED","CONFIRM_TOKEN_USED","CONFIRM_UNAVAILABLE","MECHANISM_UNSUPPORTED","PREVIEW_UNAVAILABLE","TOPIC_ALREADY_STAKED","TOPIC_CLOSED","TOPIC_QUOTE_EXPIRED","TOPIC_QUOTE_INVALID","TOPIC_MECHANISM_MISMATCH","STAKE_OUT_OF_RANGE","RETRY_IDEMPOTENCY_KEY","OPINION_ALREADY_BACKED","OPINION_BACK_PRICE_MOVED","OPINION_BACK_RETRY","OPINION_BACK_FULL","OPINION_BACK_CHAIN_BROKEN","OPINION_SIDE_REQUIRED","OPINION_SIDE_INVALID","OPINION_TOPIC_CLOSED","OPINION_TOPIC_HIDDEN","OPINIONS_UNAVAILABLE","INSUFFICIENT_BALANCE","CONTENT_INVALID","CONTENT_MODERATED","USER_PUNISHED"],"description":"Stable contract values. `SERVICE_DISABLED` (503) is the\nemergency kill switch; `FORBIDDEN_SCOPE` (403) means the key\nlacks the `write` scope. The `CONFIRM_TOKEN_*` and rule codes\nonly occur on the write surface. `OPINION_SIDE_REQUIRED` /\n`OPINION_SIDE_INVALID` are rare but reachable: `preview_opinion`\nalready answers a missing or invalid side with\n`can_publish: false` (reason `SIDE_REQUIRED`), so they surface\nas a 400 from `publish_opinion` only when the owner's position\nchanged between preview and publish (e.g. no position at\npreview, then an order on the other side before publishing) and\nthe side in the token no longer fits.\n","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"object","description":"Optional context, e.g. `{\"field\": \"limit\"}`, `{\"retry_after\": 12}` or `{\"required_scope\": \"write\"}`.","additionalProperties":true,"uniqueKey":"error.details","typeLabel":"object"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"UNAUTHORIZED","message":"\u003cstring>","details":{}}}}},"exampleType":"generated"}},"exampleType":"generated"},"4ac839d8-3578-44de-8743-5593e44aa1d5":{"description":"The action was refused by a rule or by confirm-token state — expired or\nalready-used token, an existing position on the topic, a moved relay\nprice, a stake outside the topic's range. The `code` says which.\n","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["UNAUTHORIZED","FORBIDDEN","FORBIDDEN_SCOPE","NOT_FOUND","OPINION_NOT_FOUND","INVALID_ARGUMENT","RATE_LIMITED","SERVICE_DISABLED","INTERNAL","CONFIRM_TOKEN_INVALID","CONFIRM_TOKEN_EXPIRED","CONFIRM_TOKEN_USED","CONFIRM_UNAVAILABLE","MECHANISM_UNSUPPORTED","PREVIEW_UNAVAILABLE","TOPIC_ALREADY_STAKED","TOPIC_CLOSED","TOPIC_QUOTE_EXPIRED","TOPIC_QUOTE_INVALID","TOPIC_MECHANISM_MISMATCH","STAKE_OUT_OF_RANGE","RETRY_IDEMPOTENCY_KEY","OPINION_ALREADY_BACKED","OPINION_BACK_PRICE_MOVED","OPINION_BACK_RETRY","OPINION_BACK_FULL","OPINION_BACK_CHAIN_BROKEN","OPINION_SIDE_REQUIRED","OPINION_SIDE_INVALID","OPINION_TOPIC_CLOSED","OPINION_TOPIC_HIDDEN","OPINIONS_UNAVAILABLE","INSUFFICIENT_BALANCE","CONTENT_INVALID","CONTENT_MODERATED","USER_PUNISHED"],"description":"Stable contract values. `SERVICE_DISABLED` (503) is the\nemergency kill switch; `FORBIDDEN_SCOPE` (403) means the key\nlacks the `write` scope. The `CONFIRM_TOKEN_*` and rule codes\nonly occur on the write surface. `OPINION_SIDE_REQUIRED` /\n`OPINION_SIDE_INVALID` are rare but reachable: `preview_opinion`\nalready answers a missing or invalid side with\n`can_publish: false` (reason `SIDE_REQUIRED`), so they surface\nas a 400 from `publish_opinion` only when the owner's position\nchanged between preview and publish (e.g. no position at\npreview, then an order on the other side before publishing) and\nthe side in the token no longer fits.\n","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"object","description":"Optional context, e.g. `{\"field\": \"limit\"}`, `{\"retry_after\": 12}` or `{\"required_scope\": \"write\"}`.","additionalProperties":true,"uniqueKey":"error.details","typeLabel":"object"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"UNAUTHORIZED","message":"\u003cstring>","details":{}}}}},"exampleType":"generated"}},"exampleType":"generated"},"8270b12f-fd40-4a9b-b85a-8ea09b8b1283":{"description":"Rate limit exceeded (see `Retry-After` and `details.retry_after` seconds)","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["UNAUTHORIZED","FORBIDDEN","FORBIDDEN_SCOPE","NOT_FOUND","OPINION_NOT_FOUND","INVALID_ARGUMENT","RATE_LIMITED","SERVICE_DISABLED","INTERNAL","CONFIRM_TOKEN_INVALID","CONFIRM_TOKEN_EXPIRED","CONFIRM_TOKEN_USED","CONFIRM_UNAVAILABLE","MECHANISM_UNSUPPORTED","PREVIEW_UNAVAILABLE","TOPIC_ALREADY_STAKED","TOPIC_CLOSED","TOPIC_QUOTE_EXPIRED","TOPIC_QUOTE_INVALID","TOPIC_MECHANISM_MISMATCH","STAKE_OUT_OF_RANGE","RETRY_IDEMPOTENCY_KEY","OPINION_ALREADY_BACKED","OPINION_BACK_PRICE_MOVED","OPINION_BACK_RETRY","OPINION_BACK_FULL","OPINION_BACK_CHAIN_BROKEN","OPINION_SIDE_REQUIRED","OPINION_SIDE_INVALID","OPINION_TOPIC_CLOSED","OPINION_TOPIC_HIDDEN","OPINIONS_UNAVAILABLE","INSUFFICIENT_BALANCE","CONTENT_INVALID","CONTENT_MODERATED","USER_PUNISHED"],"description":"Stable contract values. `SERVICE_DISABLED` (503) is the\nemergency kill switch; `FORBIDDEN_SCOPE` (403) means the key\nlacks the `write` scope. The `CONFIRM_TOKEN_*` and rule codes\nonly occur on the write surface. `OPINION_SIDE_REQUIRED` /\n`OPINION_SIDE_INVALID` are rare but reachable: `preview_opinion`\nalready answers a missing or invalid side with\n`can_publish: false` (reason `SIDE_REQUIRED`), so they surface\nas a 400 from `publish_opinion` only when the owner's position\nchanged between preview and publish (e.g. no position at\npreview, then an order on the other side before publishing) and\nthe side in the token no longer fits.\n","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"object","description":"Optional context, e.g. `{\"field\": \"limit\"}`, `{\"retry_after\": 12}` or `{\"required_scope\": \"write\"}`.","additionalProperties":true,"uniqueKey":"error.details","typeLabel":"object"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"UNAUTHORIZED","message":"\u003cstring>","details":{}}}}},"exampleType":"generated"}},"exampleType":"generated"},"b07cc161-171b-420c-84d0-e2637d854595":{"description":"Internal error (`INTERNAL`, or `CONFIRM_UNAVAILABLE` when token signing is unavailable)","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["UNAUTHORIZED","FORBIDDEN","FORBIDDEN_SCOPE","NOT_FOUND","OPINION_NOT_FOUND","INVALID_ARGUMENT","RATE_LIMITED","SERVICE_DISABLED","INTERNAL","CONFIRM_TOKEN_INVALID","CONFIRM_TOKEN_EXPIRED","CONFIRM_TOKEN_USED","CONFIRM_UNAVAILABLE","MECHANISM_UNSUPPORTED","PREVIEW_UNAVAILABLE","TOPIC_ALREADY_STAKED","TOPIC_CLOSED","TOPIC_QUOTE_EXPIRED","TOPIC_QUOTE_INVALID","TOPIC_MECHANISM_MISMATCH","STAKE_OUT_OF_RANGE","RETRY_IDEMPOTENCY_KEY","OPINION_ALREADY_BACKED","OPINION_BACK_PRICE_MOVED","OPINION_BACK_RETRY","OPINION_BACK_FULL","OPINION_BACK_CHAIN_BROKEN","OPINION_SIDE_REQUIRED","OPINION_SIDE_INVALID","OPINION_TOPIC_CLOSED","OPINION_TOPIC_HIDDEN","OPINIONS_UNAVAILABLE","INSUFFICIENT_BALANCE","CONTENT_INVALID","CONTENT_MODERATED","USER_PUNISHED"],"description":"Stable contract values. `SERVICE_DISABLED` (503) is the\nemergency kill switch; `FORBIDDEN_SCOPE` (403) means the key\nlacks the `write` scope. The `CONFIRM_TOKEN_*` and rule codes\nonly occur on the write surface. `OPINION_SIDE_REQUIRED` /\n`OPINION_SIDE_INVALID` are rare but reachable: `preview_opinion`\nalready answers a missing or invalid side with\n`can_publish: false` (reason `SIDE_REQUIRED`), so they surface\nas a 400 from `publish_opinion` only when the owner's position\nchanged between preview and publish (e.g. no position at\npreview, then an order on the other side before publishing) and\nthe side in the token no longer fits.\n","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"object","description":"Optional context, e.g. `{\"field\": \"limit\"}`, `{\"retry_after\": 12}` or `{\"required_scope\": \"write\"}`.","additionalProperties":true,"uniqueKey":"error.details","typeLabel":"object"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"UNAUTHORIZED","message":"\u003cstring>","details":{}}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"981d7369-b6b3-48d9-be19-e49d959eb5ba":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"sspat_ personal API key","description":"Personal API key issued per SeeSaw user account:\n`Authorization: Bearer sspat_…`. Manage keys on the app API\n(`/v1/users/me/api-keys`). Revocation propagates within ~60 seconds\n(validation cache window).\n\nThe key's **scopes** decide what it may do: every key has `read`; a key\ncreated with `[\"read\",\"write\"]` may also use the six write operations\n(marked `x-required-scope: write` in this document). Scopes are fixed at\ncreation — to get write access, create a new key. A read-only key\ncalling a write operation gets `403 FORBIDDEN_SCOPE`.\n","scopes":[]}}},"servers":{"8b57a1c3-4bcf-4125-a8ec-f3cb0c2082e6":{"url":"https://api.seesaw.fun/open/v1","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"sspat_ personal API key","description":"Personal API key issued per SeeSaw user account:\n`Authorization: Bearer sspat_…`. Manage keys on the app API\n(`/v1/users/me/api-keys`). Revocation propagates within ~60 seconds\n(validation cache window).\n\nThe key's **scopes** decide what it may do: every key has `read`; a key\ncreated with `[\"read\",\"write\"]` may also use the six write operations\n(marked `x-required-scope: write` in this document). Scopes are fixed at\ncreation — to get write access, create a new key. A read-only key\ncalling a write operation gets `403 FORBIDDEN_SCOPE`.\n","scopes":[]},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Personal API key issued per SeeSaw user account:\n`Authorization: Bearer sspat_…`. Manage keys on the app API\n(`/v1/users/me/api-keys`). Revocation propagates within ~60 seconds\n(validation cache window).\n\nThe key's **scopes** decide what it may do: every key has `read`; a key\ncreated with `[\"read\",\"write\"]` may also use the six write operations\n(marked `x-required-scope: write` in this document). Scopes are fixed at\ncreation — to get write access, create a new key. A read-only key\ncalling a write operation gets `403 FORBIDDEN_SCOPE`.\n","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"apiKey","name":"Authorization"}],"title":"apiKey"}]},"originalFileLocation":"api-reference/openapi.yaml"},"subdomain":"seesaw","siteName":"SeeSaw Developer","title":"Place the previewed order (step 2 of 2) - SeeSaw Developer","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-23T20:08:07.075Z","originalFileLocation":"api-reference/trading/place-the-previewed-order-step-2-of-2.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=\"system\"}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=\"Spends the previewed stake_coins and opens the position previewed by /topics/{id}/order-preview. Accepts only the confirm_token; the stake travels inside it, so there is no amount_coins here. Requires the write scope; counts against both the write window (10/min, 200/day) and the read window. If the 60-second price lock captured at preview is still live the order fills at the previewed units and price_locked is true. Otherwise it fills at the current market price — the order is not rejected — and price_locked is false, with order.units/order.price holding the actual fill next to the confirmed previewed values. A lock with under 2 seconds left is treated as expired. order.units is the raw unit count; what the order pays if correct is order.payout_if_correct_rubies (units × the order\u0026#x27;s ruby multiplier at fill — a guaranteed minimum: if the topic settles while a ruby boost is live, it pays at the higher multiplier). Compare that with previewed.payout_if_correct_rubies — not with units, which differs from the payout whenever a ruby boost is running. Retrying with the same token returns the original order and replayed: true. Note that price_locked then describes this call, not the original fill (whose lock state is not stored) — to reconcile, compare order against previewed. 409 STAKE_OUT_OF_RANGE exists only as a safety mapping: a topic\u0026#x27;s range cannot change after the preview, so the normal flow never reaches it.\">\u003cmeta data-mint-head name=\"application-name\" content=\"SeeSaw Developer\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/seesaw/_generated/favicon/apple-touch-icon.png?v=3\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/seesaw/_generated/favicon/favicon-32x32.png?v=3\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/seesaw/_generated/favicon/favicon-16x16.png?v=3\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/seesaw/_generated/favicon/favicon.ico?v=3\">\u003cmeta data-mint-head property=\"og:title\" content=\"Place the previewed order (step 2 of 2) - SeeSaw Developer\">\u003cmeta data-mint-head property=\"og:description\" content=\"Spends the previewed stake_coins and opens the position previewed by /topics/{id}/order-preview. Accepts only the confirm_token; the stake travels inside it, so there is no amount_coins here. Requires the write scope; counts against both the write window (10/min, 200/day) and the read window. If the 60-second price lock captured at preview is still live the order fills at the previewed units and price_locked is true. Otherwise it fills at the current market price — the order is not rejected — and price_locked is false, with order.units/order.price holding the actual fill next to the confirmed previewed values. A lock with under 2 seconds left is treated as expired. order.units is the raw unit count; what the order pays if correct is order.payout_if_correct_rubies (units × the order\u0026#x27;s ruby multiplier at fill — a guaranteed minimum: if the topic settles while a ruby boost is live, it pays at the higher multiplier). Compare that with previewed.payout_if_correct_rubies — not with units, which differs from the payout whenever a ruby boost is running. Retrying with the same token returns the original order and replayed: true. Note that price_locked then describes this call, not the original fill (whose lock state is not stored) — to reconcile, compare order against previewed. 409 STAKE_OUT_OF_RANGE exists only as a safety mapping: a topic\u0026#x27;s range cannot change after the preview, so the normal flow never reaches it.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"SeeSaw Developer\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.seesaw.fun/api-reference/trading/place-the-previewed-order-step-2-of-2\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://seesaw.mintlify.app/_mintlify/api/og/v2?division=Trading\u0026amp;title=Place+the+previewed+order+%28step+2+of+2%29\u0026amp;description=Spends+the+previewed+%60stake_coins%60+and+opens+the+position+previewed%0Aby+%60%2Ftopics%2F%7Bid%7D%2Forder-preview%60.+Accepts+**only**+the%0A%60confirm_token%60%3B+the+stake+travels+ins\u0026amp;theme=f847ec8af40bd953769b2752\u0026amp;signature=b5572647bdcea14cd61b0cf6f8f23b658e08c695e03a50fc11ce1a888fae7e73\">\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=\"Place the previewed order (step 2 of 2) - SeeSaw Developer\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Spends the previewed stake_coins and opens the position previewed by /topics/{id}/order-preview. Accepts only the confirm_token; the stake travels inside it, so there is no amount_coins here. Requires the write scope; counts against both the write window (10/min, 200/day) and the read window. If the 60-second price lock captured at preview is still live the order fills at the previewed units and price_locked is true. Otherwise it fills at the current market price — the order is not rejected — and price_locked is false, with order.units/order.price holding the actual fill next to the confirmed previewed values. A lock with under 2 seconds left is treated as expired. order.units is the raw unit count; what the order pays if correct is order.payout_if_correct_rubies (units × the order\u0026#x27;s ruby multiplier at fill — a guaranteed minimum: if the topic settles while a ruby boost is live, it pays at the higher multiplier). Compare that with previewed.payout_if_correct_rubies — not with units, which differs from the payout whenever a ruby boost is running. Retrying with the same token returns the original order and replayed: true. Note that price_locked then describes this call, not the original fill (whose lock state is not stored) — to reconcile, compare order against previewed. 409 STAKE_OUT_OF_RANGE exists only as a safety mapping: a topic\u0026#x27;s range cannot change after the preview, so the normal flow never reaches it.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://seesaw.mintlify.app/_mintlify/api/og/v2?division=Trading\u0026amp;title=Place+the+previewed+order+%28step+2+of+2%29\u0026amp;description=Spends+the+previewed+%60stake_coins%60+and+opens+the+position+previewed%0Aby+%60%2Ftopics%2F%7Bid%7D%2Forder-preview%60.+Accepts+**only**+the%0A%60confirm_token%60%3B+the+stake+travels+ins\u0026amp;theme=f847ec8af40bd953769b2752\u0026amp;signature=b5572647bdcea14cd61b0cf6f8f23b658e08c695e03a50fc11ce1a888fae7e73\">\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=\"https://mintlify.s3.us-west-1.amazonaws.com/seesaw/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"SeeSaw Developer\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#04A363\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.seesaw.fun/api-reference/trading/place-the-previewed-order-step-2-of-2\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/trading/place-the-previewed-order-step-2-of-2.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.seesaw.fun/#organization\",\"name\":\"SeeSaw Developer\",\"url\":\"https://docs.seesaw.fun\"},{\"@type\":\"WebSite\",\"@id\":\"https://docs.seesaw.fun#website\",\"name\":\"SeeSaw Developer\",\"url\":\"https://docs.seesaw.fun\",\"publisher\":{\"@id\":\"https://docs.seesaw.fun/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.seesaw.fun/api-reference/trading/place-the-previewed-order-step-2-of-2#webpage\",\"url\":\"https://docs.seesaw.fun/api-reference/trading/place-the-previewed-order-step-2-of-2\",\"name\":\"Place the previewed order (step 2 of 2)\",\"description\":\"Spends the previewed stake_coins and opens the position previewed by /topics/{id}/order-preview. Accepts only the confirm_token; the stake travels inside it, so there is no amount_coins here. Requires the write scope; counts against both the write window (10/min, 200/day) and the read window. If the 60-second price lock captured at preview is still live the order fills at the previewed units and price_locked is true. Otherwise it fills at the current market price — the order is not rejected — and price_locked is false, with order.units/order.price holding the actual fill next to the confirmed previewed values. A lock with under 2 seconds left is treated as expired. order.units is the raw unit count; what the order pays if correct is order.payout_if_correct_rubies (units × the order's ruby multiplier at fill — a guaranteed minimum: if the topic settles while a ruby boost is live, it pays at the higher multiplier). Compare that with previewed.payout_if_correct_rubies — not with units, which differs from the payout whenever a ruby boost is running. Retrying with the same token returns the original order and replayed: true. Note that price_locked then describes this call, not the original fill (whose lock state is not stored) — to reconcile, compare order against previewed. 409 STAKE_OUT_OF_RANGE exists only as a safety mapping: a topic's range cannot change after the preview, so the normal flow never reaches it.\",\"dateModified\":\"2026-09-23T20:08:07.075Z\",\"isPartOf\":{\"@id\":\"https://docs.seesaw.fun#website\"},\"breadcrumb\":{\"@id\":\"https://docs.seesaw.fun/api-reference/trading/place-the-previewed-order-step-2-of-2#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.seesaw.fun/api-reference/trading/place-the-previewed-order-step-2-of-2#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Endpoints\",\"item\":\"https://docs.seesaw.fun/api-reference/topics/search-topics-by-keyword\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Trading\",\"item\":\"https://docs.seesaw.fun/api-reference/trading/preview-an-order-at-the-users-stake-step-1-of-2\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Place the previewed order (step 2 of 2)\",\"item\":\"https://docs.seesaw.fun/api-reference/trading/place-the-previewed-order-step-2-of-2\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.seesaw.fun/api-reference/trading/place-the-previewed-order-step-2-of-2#apireference\",\"headline\":\"Place the previewed order (step 2 of 2)\",\"name\":\"Place the previewed order (step 2 of 2)\",\"description\":\"Spends the previewed stake_coins and opens the position previewed by /topics/{id}/order-preview. Accepts only the confirm_token; the stake travels inside it, so there is no amount_coins here. Requires the write scope; counts against both the write window (10/min, 200/day) and the read window. If the 60-second price lock captured at preview is still live the order fills at the previewed units and price_locked is true. Otherwise it fills at the current market price — the order is not rejected — and price_locked is false, with order.units/order.price holding the actual fill next to the confirmed previewed values. A lock with under 2 seconds left is treated as expired. order.units is the raw unit count; what the order pays if correct is order.payout_if_correct_rubies (units × the order's ruby multiplier at fill — a guaranteed minimum: if the topic settles while a ruby boost is live, it pays at the higher multiplier). Compare that with previewed.payout_if_correct_rubies — not with units, which differs from the payout whenever a ruby boost is running. Retrying with the same token returns the original order and replayed: true. Note that price_locked then describes this call, not the original fill (whose lock state is not stored) — to reconcile, compare order against previewed. 409 STAKE_OUT_OF_RANGE exists only as a safety mapping: a topic's range cannot change after the preview, so the normal flow never reaches it.\",\"url\":\"https://docs.seesaw.fun/api-reference/trading/place-the-previewed-order-step-2-of-2\",\"mainEntityOfPage\":{\"@id\":\"https://docs.seesaw.fun/api-reference/trading/place-the-previewed-order-step-2-of-2#webpage\"},\"dateModified\":\"2026-09-23T20:08:07.075Z\",\"publisher\":{\"@id\":\"https://docs.seesaw.fun/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.seesaw.fun#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"SeeSaw Developer\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"SeeSaw Developer","nav":{"global":null,"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":""}]},{"tab":"API Reference","groups":[{"group":"REST API","pages":[{"title":"REST API","href":"/api-reference/introduction"}]},{"group":"Endpoints","pages":[{"group":"Topics","pages":[{"title":"Search topics by keyword","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /search","href":"/api-reference/topics/search-topics-by-keyword"},{"title":"Browse topics by ranking","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /topics","href":"/api-reference/topics/browse-topics-by-ranking"},{"title":"List the category channels","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /topic-categories","href":"/api-reference/topics/list-the-category-channels"},{"title":"Get one topic in full detail","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /topics/{id}","href":"/api-reference/topics/get-one-topic-in-full-detail"},{"title":"List top-level opinions of a topic","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /topics/{id}/opinions","href":"/api-reference/topics/list-top-level-opinions-of-a-topic"}]},{"group":"Me","pages":[{"title":"Get the key owner's profile and balances","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /me","href":"/api-reference/me/get-the-key-owners-profile-and-balances"},{"title":"List the key owner's positions","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /me/positions","href":"/api-reference/me/list-the-key-owners-positions"},{"title":"List opinions the key owner published","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /me/opinions","href":"/api-reference/me/list-opinions-the-key-owner-published"},{"title":"List opinions the key owner backed","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /me/backed-opinions","href":"/api-reference/me/list-opinions-the-key-owner-backed"},{"title":"List the key owner's watchlist","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /me/watchlist","href":"/api-reference/me/list-the-key-owners-watchlist"},{"title":"List the key owner's coin ledger","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /me/coin-ledger","href":"/api-reference/me/list-the-key-owners-coin-ledger"},{"title":"List the key owner's ruby ledger","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /me/ruby-ledger","href":"/api-reference/me/list-the-key-owners-ruby-ledger"}]},{"group":"Trading","pages":[{"title":"Preview an order at the user's stake (step 1 of 2)","description":"Computes the summary the user must confirm and, when the order is\ncurrently possible, mints a `confirm_token` for `POST /orders`.\n**Charges nothing.** Requires the `write` scope; counts against the\nread window only.\n\n**The stake is the user's choice.** If the user stated how many coins\nto stake, send exactly that as `amount_coins`; if they did not, ask\nthem before calling — never choose, infer or round an amount on their\nbehalf. The allowed range is the topic's `stake_rules`\n(`min_coins`..`max_coins`, whole coins, from `GET /topics/{id}`).\n\nWhen `can_place` is `false` the `reason` says why and no token is\nissued:\n- `STAKE_OUT_OF_RANGE` — `amount_coins` is outside the range.\n `TOPIC_CLOSED` and `ALREADY_STAKED` take precedence over it (the\n reason is then one of those and `details` is absent, while the\n summary keeps the shape described here); it takes precedence over\n `INSUFFICIENT_BALANCE`. `details` carries `min_coins` /\n `max_coins`, `summary.stake_coins` echoes the requested amount (it\n is **not** clamped), `balance_after` equals `balance_before`,\n `price_now` is the current display price, and `price_after`,\n `payout_if_correct_rubies`, `ruby_multiplier` and `avg_price` are\n empty strings.\n- `MECHANISM_UNSUPPORTED` (a `v2_share` topic) — the summary is\n partial: only `topic_title`, `option_label`, `stake_coins`, the\n balances, `price_now`, `close_time` and `mechanism` are meaningful.\n- `ALREADY_STAKED` — the owner already placed this topic's one order,\n including an order they have since sold in the app.\n- `INSUFFICIENT_BALANCE` — the balance is below `stake_coins`.\n\nThe stake is bound into the token: a different amount needs a new\npreview, and `POST /orders` spends exactly the previewed\n`stake_coins`.\n","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /topics/{id}/order-preview","href":"/api-reference/trading/preview-an-order-at-the-users-stake-step-1-of-2"},{"title":"Place the previewed order (step 2 of 2)","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /orders","href":"/api-reference/trading/place-the-previewed-order-step-2-of-2"}]},{"group":"Opinions","pages":[{"title":"Preview publishing an opinion (step 1 of 2)","description":"Checks the speaking rules — trading is still open, the text is 1–500\ncharacters, a side is settled — and returns the summary to confirm\nplus, when publishing is possible, a `confirm_token` for\n`POST /opinions`. **Charges nothing.** Requires the `write` scope;\ncounts against the read window only.\n\n🚨 **Changed 2026-09-15**: holding a position is no longer required,\nand publishing no longer costs a coin. The opinion list is still a\ntwo-sided debate, so a side must still be settled:\n\n- **the owner holds a position** ⇒ the side is their staked side and\n `side_option_id` in the request is ignored;\n- **no position** ⇒ `side_option_id` is **required**; omitting it\n returns `can_publish: false` with reason `SIDE_REQUIRED`, and an\n option id from another topic is a 400.\n\nThe side is part of the confirm token's parameter hash — previewing a\ndifferent side yields a different token, so a token can never publish\na side other than the one that was previewed.\n","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /topics/{id}/opinion-preview","href":"/api-reference/opinions/preview-publishing-an-opinion-step-1-of-2"},{"title":"Publish the previewed opinion (step 2 of 2)","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /opinions","href":"/api-reference/opinions/publish-the-previewed-opinion-step-2-of-2"},{"title":"Preview backing an opinion (step 1 of 2)","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /opinions/{id}/back-preview","href":"/api-reference/opinions/preview-backing-an-opinion-step-1-of-2"},{"title":"Back the previewed opinion (step 2 of 2)","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /backs","href":"/api-reference/opinions/back-the-previewed-opinion-step-2-of-2"}]}]}]}]},"basePath":"","title":"Place the previewed order (step 2 of 2) - SeeSaw Developer","buildId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","deploymentId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-C8RPHPxo.js","utils-0BK-9q6z.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DfjzsUJT.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-B4v9psJ4.js","snippetPresets-CpTQv-Ez.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-BNP-Fvr0.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BSgu6h1D.js","shallow-Biv1i9Gs.js","getApiPlaygroundDisplay-BoGOXhtF.js","CodeSnippet-DvQoT18_.js","CodeSnippets-Dnpa15xT.js","Page-Buji1S4J.js","getPastedJson-xAIyhUFE.js","icon-S6FBih11.js","MethodPill-SaYeUZyk.js","DuplicateIcon-Cs-p3v2Q.js","createIcon-DjCFEoHq.js","DynamicMarkdown-BcnBltEQ.js","SectionHeading-BUBl0eEF.js","axios-vUo_bRtp.js","Markdown-h4cOoD8d.js","clsx-B2v50t8t.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-DJnKvr0g.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BHrrjR1K.js"]}