---
title: "Update a node"
method: PATCH
path: "/forms/{formId}/nodes/{nodeId}"
tags: ["Nodes"]
---

# Update a node

`PATCH /forms/{formId}/nodes/{nodeId}`

## Request

- Base URL: `https://api.clipform.io/v1`
- URL: `https://api.clipform.io/v1/forms/{formId}/nodes/{nodeId}`
- Auth: HTTP bearer

Updates a node.

## Path parameters

- `formId` string, uuid, required
- `nodeId` string, uuid, required

## Request body

- object
  - `prompt` string
  - `type` 'choice' | 'open' | 'button' | 'details' | 'payment' | 'file_download' | 'redirect' | 'end_screen'
  - `required` boolean
  - `public_results_hidden` boolean: Hide this node's data from the public results portal without affecting the owner Results tab.
  - `config` object: Type-specific configuration, merged shallowly into the stored config. A null value deletes that key; nested objects are replaced wholesale. When type is changed in the same request, config replaces the stored configuration instead of merging.
  - `options` object[]: Upsert-by-id: the node's options are set to this array. Items with a known id are updated in place (ids preserved), items without one are inserted, and existing options absent from the array are deleted. Order follows array position. Omitting all ids performs a full replace.
    - `id` string, uuid: Existing option id to update in place. Omit to insert a new option.
    - `content` string, required
    - `score` number
    - `scores` object

## Response `200`

Node updated

- object
  - `node_id` string, uuid
  - `options` object[]: The node's resulting option set (real ids, in order), returned only when the request updated options. Lets callers reconcile optimistic temp ids without a refetch.
    - `id` string, uuid
    - `content` string
    - `order` integer
    - `score` number, nullable
    - `scores` object, nullable
  - `variables` FormVariable[]: The form's full stable variable registry (#4173), returned only when this request's options wrote a scores map - a new category key is auto-registered as a stable row so a conditional branch can route on its id.
    - `id` string, uuid
    - `key` string: Immutable internal identifier, frozen at creation. Never rewritten - a rename only edits `label`.
    - `label` string: Editable display name.
    - `type` 'number' | 'text'
    - `kind` 'builtin' | 'category' | 'custom'
  - `warnings` string[]: Advisory notices, returned only when present - e.g. scored options were written to a node whose choice.record_scores is explicitly false.

## Other responses

- `429`: Rate limit exceeded.

---

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