Skip to main content
POST
Preview publishing an opinion (step 1 of 2)

Authorizations

Authorization
string
header
required

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.

Path Parameters

id
string<uuid>
required

Topic UUID.

Body

application/json
content
string
required
Required string length: 1 - 500
reply_to_opinion_id
string<uuid>

Omit for a top-level opinion.

side_option_id
string<uuid>

Which side this opinion argues. Required when the owner holds no position on the topic; ignored (the staked side wins) when they do. Must be an option of this topic.

Response

The preview (check can_publish before confirming)

can_publish
boolean
required
summary
object
required

What the user confirms before POST /opinions. side_option_label is the side the opinion will be attributed to β€” the owner's staked side when they hold a position, otherwise the side they picked via side_option_id.

reason
enum<string>

Present only when can_publish is false. TOPIC_CLOSED takes priority; SIDE_REQUIRED means the owner holds no position and sent no side_option_id; CONTENT_INVALID means empty or over 500 characters.

⚠️ NO_POSITION was removed 2026-09-15 β€” holding a position is no longer a precondition for publishing.

Available options:
TOPIC_CLOSED,
SIDE_REQUIRED,
CONTENT_INVALID
confirm_token
string
expires_at
string<date-time>