---
title: "Save your stance: a new, immutable version"
method: PUT
path: "/workspaces/{id}/questions/{questionId}/stance"
tags: ["stances"]
---

# Save your stance: a new, immutable version

`PUT /workspaces/{id}/questions/{questionId}/stance`

## Request

- Base URL: `https://api.swingfactor.ai/v1`
- URL: `https://api.swingfactor.ai/v1/workspaces/{id}/questions/{questionId}/stance`
- Auth: HTTP bearer

Every statement of the new version, whole. Nothing is required; a single sentence or a single choice is a whole stance. A body’s stance is recorded by someone it authorised, each statement with its adoption record.

## Path parameters

- `id` string, uuid, required
- `questionId` string, uuid, required

## Request body

- StanceBody: The whole of a new version. Every kind is optional; a single sentence or a single choice is a whole stance. Written only by its holder — never by a draft, a service or the assistant.
  - `body` string, uuid: A body the caller records for; absent, their own stance.
  - `basisSnapshotId` string, uuid: The snapshot the stance is made against. Absent: the model as it stands.
  - `statements` object[], required
    - `kind` 'relevance' | 'reliance' | 'reading' | 'value' | 'priority' | 'line' | 'uncertainty' | 'position' | 'choice' | 'explanation', required
    - `words` string
    - `firmness` 'firm' | 'provisional' | 'undecided'
    - `detail` object
    - `adoption` object: For a body: how it was adopted. Required there, refused nowhere.
      - `procedure` string, required
      - `reference` string
      - `adoptedOn` string, date
    - `refs` union[]
      - union
        - object
          - `role` 'about' | 'for' | 'a' | 'b' | 'relies-on' | 'adopts' | 'waits-for' | 'cites' | 'option' | 'configuration' | 'condition', required
          - `kind` 'option' | 'configuration' | 'proposition' | 'evidence' | 'variable' | 'estimate' | 'break-even' | 'scenario' | 'group' | 'dimension' | 'cell', required
          - `id` string, uuid, required
          - `expects` 'accepted' | 'rejected' | 'present' | 'answers' | 'happens'
          - `value` string
        - object
          - `role` 'about' | 'for' | 'a' | 'b' | 'relies-on' | 'adopts' | 'waits-for' | 'cites' | 'option' | 'configuration' | 'condition', required
          - `statement` integer, required

## Response `200`

The stance at its new version.

- Stance, nullable
  - `id` string, uuid, required
  - `workspaceId` string, uuid, required
  - `questionId` string, uuid, required
  - `holder` object, required
    - `kind` 'person' | 'body', required
    - `name` string, required
    - `bodyId` string, uuid
  - `mine` boolean, required
  - `visibility` 'private' | 'workspace' | 'published', required
  - `createdAt` string, required
  - `updatedAt` string, required
  - `versions` object[], required
    - `id` string, uuid, required
    - `number` integer, required
    - `savedAt` string, required
    - `savedByName` string
  - `history` object[]: The stance’s own history — its holder’s only. Never the question’s revisions.
    - `kind` string, required
    - `versionNumber` integer
    - `visibility` string
    - `byName` string
    - `at` string, required
  - `version` object
    - `number` integer, required
    - `savedAt` string, required
    - `savedByName` string
    - `basis` object, required
      - `snapshotId` string, uuid
      - `snapshotName` string
      - `at` string, required
    - `statements` object[], required
      - `id` string, uuid, required
      - `position` integer, required
      - `kind` 'relevance' | 'reliance' | 'reading' | 'value' | 'priority' | 'line' | 'uncertainty' | 'position' | 'choice' | 'explanation', required
      - `words` string
      - `firmness` 'firm' | 'provisional' | 'undecided'
      - `detail` unknown
      - `adoption` unknown
      - `refs` object[], required
        - `role` 'about' | 'for' | 'a' | 'b' | 'relies-on' | 'adopts' | 'waits-for' | 'cites' | 'option' | 'configuration' | 'condition', required
        - `kind` 'option' | 'configuration' | 'proposition' | 'evidence' | 'variable' | 'estimate' | 'break-even' | 'scenario' | 'group' | 'dimension' | 'cell' | 'statement', required
        - `id` string, uuid, required
        - `label` string, required
        - `expects` 'accepted' | 'rejected' | 'present' | 'answers' | 'happens'
        - `value` string
        - `now` object: Where it stands now: absent from the model, or rejected, it is kept and marked.
          - `present` boolean, required
          - `status` string, nullable
          - `label` string

## Other responses

- `401`: No token, or not a valid one: `unauthorized`.
- `403`: Only its holder writes a stance — never a draft, a service or the assistant.
- `404`: No such question, or a reference to nothing in its model.
- `422`: A statement lacks what its kind needs.

---

[API](https://skmtc.dev/swingfactor/apis/swingfactor-api.md) · [All operations](https://skmtc.dev/swingfactor/apis/swingfactor-api/llms.txt) · [OpenAPI document](https://skmtc.dev/swingfactor/apis/swingfactor-api/revisions/c2fe881a39c3?raw)
