> ## Documentation Index
> Fetch the complete documentation index at: https://docs.seesaw.fun/llms.txt
> Use this file to discover all available pages before exploring further.

# place_order

> Place the previewed position (step 2 of 2)

Spends 100 coins and opens the position previewed by
[`preview_order`](/mcp/tools/preview-order). Accepts **only** the
`confirm_token` — the topic and option are read from it, so an agent cannot
reach this tool without having produced a summary first.

**Scope**: `write` · **Annotations**: `destructiveHint`, `idempotentHint`,
`_meta["anthropic/requiresUserInteraction"]`
**REST equivalent**: `POST /open/v1/orders`

<Warning>
  Call only after the user has reviewed the preview summary and explicitly
  confirmed. Tokens expire in **5 minutes** and are single-use.
</Warning>

## Parameters

| Name            | Type   | Required | Default | Notes                |
| --------------- | ------ | -------- | ------- | -------------------- |
| `confirm_token` | string | ✅        | —       | From `preview_order` |

## Returns

Captured live:

```json theme={null}
{
  "order": {
    "id": "87dffbea-78e8-4124-9ee0-b269d9c76265",
    "topic_id": "a3f21c48-6b19-4d7e-9c04-8e5b2f7a1d63",
    "option_id": "b1c0d9e8-4a72-4f31-95d6-0c1e7a83b402",
    "stake_coins": "100.0000",
    "units": "195.2372",
    "price": "0.5000",
    "placed_at": "2026-09-08T23:34:20.428685Z"
  },
  "price_locked": true,
  "previewed": {
    "units": "195.2372",
    "price": "0.5000"
  },
  "replayed": false
}
```

## Price locking — read this before reporting the fill

The preview captures a 60-second price lock:

* **Lock still live** → the order fills at the previewed units and
  `price_locked` is `true`.
* **Lock lapsed** (including under 2 seconds left) → the order fills at the
  **current market price**. It is *not* rejected. `price_locked` is `false`,
  `order.units` / `order.price` hold the **actual** fill, and `previewed` holds
  what the user confirmed.

<Warning>
  When `price_locked` is `false`, report `order.units` — the actual fill — to the
  user, not the number they confirmed.
</Warning>

## Retrying

Safe to retry with the same token: the original order comes back with
`replayed: true` and nothing is charged twice.

On a replay, `price_locked` describes **this call**, not the original fill —
the original's lock state is not stored. To reconcile, compare `order.units`
and `order.price` against `previewed`.

## Errors

| Code                    | HTTP | Meaning                                                             |
| ----------------------- | ---- | ------------------------------------------------------------------- |
| `CONFIRM_TOKEN_INVALID` | 400  | Malformed, tampered with, or issued for another user, key or action |
| `CONFIRM_TOKEN_EXPIRED` | 409  | Older than 5 minutes — preview again                                |
| `CONFIRM_TOKEN_USED`    | 409  | Already consumed by a different call                                |
| `TOPIC_ALREADY_STAKED`  | 409  | A position was opened between preview and execute                   |
| `TOPIC_CLOSED`          | 409  | Trading closed in the meantime                                      |
| `INSUFFICIENT_BALANCE`  | 400  | Balance dropped below 100 coins                                     |
| `FORBIDDEN_SCOPE`       | 403  | The key is read-only                                                |

See [Errors](/errors) for the full table.

## Example prompts

* "Yes, place it." (after a preview)
* "Confirmed — go ahead."

## Related

[`preview_order`](/mcp/tools/preview-order) ·
[`list_my_positions`](/mcp/tools/list-my-positions)
