---
title: "Create knowledge node"
method: POST
path: "/v1/kb/nodes"
tags: ["kb"]
---

# Create knowledge node

`POST /v1/kb/nodes`

Creates a manual knowledge node or directory. Requires a token with `read_write` access. Nodes created through this endpoint are always recorded with `source: manual`.

## Query parameters

- `workspace_id` string, required — Workspace to query.

## Request body

- object
  - `title` string, required — Node display title.
  - `body` string — Markdown or plain-text body. Ignored when `is_directory` is true.
  - `parent_id` string — Parent node id. Omit to create at workspace root.
  - `entity_ids` string[] — Scope the node to specific entities (listings, properties). Omit for workspace-wide.
  - `is_directory` boolean — Create as a folder with no body. Children can be nested underneath.
  - `metadata` object — Arbitrary JSON metadata. Not searchable.
  - `enabled` boolean — Defaults to true. Disabled nodes are excluded from agent search.

## Response `201`

Knowledge node created

- object
  - `data` object, required
    - `id` string, required
    - `workspace_id` string, required
    - `title` string, required
    - `body` string, required
    - `chunk_body` boolean, required — True when the body is chunked and embedded for search.
    - `entity_ids` string[], required
    - `parent_id` string, nullable, required
    - `ancestors` string[], required — Ordered ancestor node ids from root to immediate parent.
    - `depth` number, required — Depth in the tree, 0 = root.
    - `source` 'google_drive' | 'notion' | 'airtable' | 'link' | 'pms' | 'ingest' | 'manual', required
    - `source_type` 'pdf' | 'csv' | 'excel' | 'docx' | 'text' | 'html', nullable, required
    - `source_id` string, nullable, required
    - `is_directory` boolean, required — True for folder nodes that group children.
    - `metadata` object, nullable, required
    - `enabled` boolean, required
    - `created_by` string, nullable, required
    - `embed_status` string, nullable, required — Embedding pipeline state (pending, ready, failed).
    - `chunk_count` number, nullable, required
    - `version` number, required
    - `tags` string[], required
    - `created_at` string, required
    - `updated_at` string, required

## Other responses

- `400` — Invalid request
- `401` — Unauthorized
- `403` — Forbidden
- `404` — Not found
- `429` — Rate limit exceeded
- `500` — Internal error
- `503` — Knowledge service temporarily unavailable

---

[API](https://skmtc.dev/conduit/apis/conduit-api.md) · [All operations](https://skmtc.dev/conduit/apis/conduit-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/conduit/conduit-api/revisions/3ad7e17f96ad/schema)
