> ## Documentation Index
> Fetch the complete documentation index at: https://opentrain.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Validate Changeset

> Dry-run a changeset against the current tree without writing.

Validates a changeset body against the current workspace state without writing anything: schema/vocabulary checks, revision and checksum guards, tree rules, and asset readiness. Use it before [apply](/docs/developers/api-reference/instructions/apply-changeset) or [submit](/docs/developers/api-reference/instructions/submit-changeset).

**Requirements:** `instructions:write` or `instructions:propose`, plus workspace `EDITOR` or `OWNER` access. A `REVIEWER` decides submitted changesets but is not a proposal author unless separately granted an authoring role.

## Request

The changeset body (shared by validate/diff/apply/submit):

<ParamField body="workspaceId" type="string" required>
  The workspace all operations must belong to.
</ParamField>

<ParamField body="description" type="string">
  Human-readable summary recorded on the changeset.
</ParamField>

<ParamField body="operations" type="object[]" required>
  Up to **250** operations, each discriminated by `kind`: `PATCH_CONTENT`, `REPLACE_CONTENT`, `CREATE_PAGE`, `RENAME_PAGE`, `MOVE_PAGE`, `SET_AUDIENCE`, `ARCHIVE_PAGE`, `RESTORE_PAGE`, `ATTACH_ASSET`. Discover exact per-kind fields via [capabilities](/docs/developers/api-reference/instructions/capabilities). A `CREATE_PAGE` with `clientPageKey: "x"` can be referenced by sibling operations as `parentPageId: "new:x"`, in any order.
</ParamField>

## Response

<ResponseField name="valid" type="boolean">
  Whether the changeset would apply cleanly right now.
</ResponseField>

<ResponseField name="conflicts" type="object[]">
  Structured conflicts: `{operationIndex, code, message, pageId, nodeId, currentRevisionNumber, currentChecksum}`. Codes include `REVISION_MISMATCH`, `CHECKSUM_MISMATCH`, `NODE_NOT_FOUND`, `SCHEMA_INVALID`, `DEPTH_EXCEEDED`, `REPLACE_NOT_CONFIRMED`, and more.
</ResponseField>

<ResponseField name="warnings" type="object[]">
  Non-blocking issues, e.g. attribute keys outside the vocabulary allowlist.
</ResponseField>
