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

# Discover Capabilities

> Read the canonical schema version, authoring vocabulary, changeset operations, audiences, and asset limits before authoring.

Returns everything an agent needs to author valid [instruction manuals](/docs/developers/concepts/instruction-manuals) without guessing: the canonical schema version, the closed node/mark vocabulary, per-node attribute allowlists, the changeset operation kinds, node-level patch operations, audiences, render formats, tree depth bound, and per-kind asset size limits. Call this first in any authoring session.

**Requirements:** `instructions:read`.

## Response

<ResponseField name="apiVersion" type="string">
  The instructions API version.
</ResponseField>

<ResponseField name="schemaVersion" type="string">
  The canonical document schema identifier (`opentrain-tiptap/1`). Every document envelope must carry it.
</ResponseField>

<ResponseField name="maxTreeDepth" type="number">
  Maximum page nesting depth per manual.
</ResponseField>

<ResponseField name="audiences" type="string[]">
  Read-audience ladder: `ADMIN`, `CONTRIBUTOR`, `REVIEWER`, `WORKER`.
</ResponseField>

<ResponseField name="assetKinds" type="string[]">
  `IMAGE`, `FILE`, `AUDIO`, `VIDEO` — with per-kind byte limits in `maxAssetSizeBytes`.
</ResponseField>

<ResponseField name="changesetOperationKinds" type="string[]">
  The operation kinds accepted by [changesets](/docs/developers/api-reference/instructions/apply-changeset), e.g. `PATCH_CONTENT`, `CREATE_PAGE`, `MOVE_PAGE`.
</ResponseField>

<ResponseField name="nodePatchOps" type="string[]">
  Stable-node patch operations usable inside `PATCH_CONTENT` (`replace_node`, `insert_before`, `insert_after`, `append_children`, `set_attrs`, `delete_node`).
</ResponseField>

<ResponseField name="nodeTypes" type="string[]">
  The closed node vocabulary. Node types outside this list are **rejected** at write time.
</ResponseField>

<ResponseField name="markTypes" type="string[]">
  The closed mark vocabulary — same rejection rule.
</ResponseField>

<ResponseField name="nodeAttributes" type="object">
  Per-node-type attribute allowlists. Unknown attribute keys surface as validation warnings; invalid attribute values are errors.
</ResponseField>

<ResponseField name="renderFormats" type="string[]">
  `json` (canonical), `html`, `markdown` (derived; carries a loss report).
</ResponseField>

<RequestExample>
  ```bash curl theme={null}
  curl -sS https://app.opentrain.ai/api/public/v1/instructions/capabilities \
    -H "Authorization: Bearer $OT_API_TOKEN"
  ```
</RequestExample>
