> ## 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.

# preview_opinion

> Preview publishing an opinion (step 1 of 2)

Checks the speaking rules and returns the summary to confirm before publishing,
plus the `confirm_token` [`publish_opinion`](/mcp/tools/publish-opinion) needs.

**Scope**: `write` · **Annotations**: `readOnlyHint`
**REST equivalent**: `POST /open/v1/topics/{id}/opinion-preview`

<Note>
  Only users who hold a position on the topic may publish an opinion on it — an
  opinion is a stated side, not a comment. This tool **charges nothing** and
  counts against the read window only.
</Note>

## Parameters

| Name                  | Type                                     | Required | Default | Notes                                     |
| --------------------- | ---------------------------------------- | -------- | ------- | ----------------------------------------- |
| `topic_id`            | string (uuid)                            | ✅        | —       | A topic the key owner holds a position on |
| `content`             | string                                   | ✅        | —       | 1–500 characters                          |
| `reply_to_opinion_id` | string (uuid)                            |          | —       | Omit for a top-level opinion              |
| `language`            | see [languages](/mcp/overview#languages) |          | `en`    |                                           |

## Returns

`side_option_label` is the side the opinion will be attributed to. It is
resolved **server-side** from the owner's position — never declared by the
caller and never inferred from the text.

Captured live:

```json theme={null}
{
  "can_publish": true,
  "summary": {
    "topic_title": "Will the Fed cut rates at the November 2026 meeting?",
    "fee_coins": "0.0000",
    "balance_after": "4900.0000",
    "side_option_label": "Yes",
    "content_preview": "Core PCE has cooled for three straight prints and the labour market is loosening — a November cut looks more likely than the curve implies.",
    "reply_to": null
  },
  "confirm_token": "oc1.eyJhIjoicHVibGlzaF9vcGlu…wGYcm8YxqCaKlzpg",
  "expires_at": "2026-09-08T23:39:28.246467Z"
}
```

<Note>
  `fee_coins` is currently `"0.0000"` — publishing an opinion is free today. Read
  the field rather than assuming; it exists so a future price change does not
  break agents.
</Note>

<Warning>
  **Show the summary to the user and get their explicit confirmation before
  calling the execute tool.** The token is what proves a preview happened — it is
  not a substitute for asking.
</Warning>

## When publishing isn't allowed

| `reason`          | Meaning                                                      |
| ----------------- | ------------------------------------------------------------ |
| `TOPIC_CLOSED`    | Not active, past `close_time`, or taken down (checked first) |
| `NO_POSITION`     | The owner holds no position on this topic                    |
| `CONTENT_INVALID` | Empty, or over 500 characters                                |

A `reply_to_opinion_id` that doesn't exist returns `OPINION_NOT_FOUND` (404).

## Example prompts

* "Post my take on this market: …"
* "Reply to that opinion saying I disagree because …"

## Related

[`publish_opinion`](/mcp/tools/publish-opinion) ·
[`list_topic_opinions`](/mcp/tools/list-topic-opinions) ·
[`list_my_opinions`](/mcp/tools/list-my-opinions)
