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

# publish_opinion

> Publish the previewed opinion (step 2 of 2)

Publishes the opinion previewed by
[`preview_opinion`](/mcp/tools/preview-opinion) under the key owner's name.
Accepts **only** the `confirm_token`; the text is carried by the preview.

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

<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_opinion` |

## Returns

Captured live:

```json theme={null}
{
  "id": "b9931ee5-865e-4591-804a-86861adae8b1",
  "topic_id": "a3f21c48-6b19-4d7e-9c04-8e5b2f7a1d63",
  "content": "Core PCE has cooled for three straight prints and the labour market is loosening — a November cut looks more likely than the curve implies.",
  "side_option_id": "b1c0d9e8-4a72-4f31-95d6-0c1e7a83b402",
  "reply_to_id": null,
  "created_at": "2026-09-08T23:34:35Z"
}
```

## Not idempotent

Unlike the other two execute tools, publishing has **no safe retry**: the token
is strictly single-use and a retry answers `409 CONFIRM_TOKEN_USED`, as does
republishing the same text within a minute. This is deliberate — a duplicated
post is visible to everyone and cannot be quietly undone.

If a call times out with no response, check
[`list_my_opinions`](/mcp/tools/list-my-opinions) before assuming it failed.
Preview again only when the user actually wants a second post.

## Errors

| Code                     | HTTP | Meaning                                                  |
| ------------------------ | ---- | -------------------------------------------------------- |
| `CONFIRM_TOKEN_INVALID`  | 400  | Malformed, tampered with, or for another user/key/action |
| `CONFIRM_TOKEN_EXPIRED`  | 409  | Older than 5 minutes, or the staged text expired         |
| `CONFIRM_TOKEN_USED`     | 409  | Already published, or the same text within a minute      |
| `OPINION_NEEDS_POSITION` | 403  | The position went away between preview and execute       |
| `CONTENT_MODERATED`      | 400  | Rejected by moderation                                   |
| `FORBIDDEN_SCOPE`        | 403  | The key is read-only                                     |

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

## Example prompts

* "Yes, post it."
* "Publish that opinion."

## Related

[`preview_opinion`](/mcp/tools/preview-opinion) ·
[`list_my_opinions`](/mcp/tools/list-my-opinions)
