Documentation menu
These are pre-release docs from the main branch.

API reference

23 operations in kb. Raw spec: openapi.json.

GET/api/v1/kb/articles

GET /api/kb/articles

Parameters

NameInTypeRequiredDescription
category_idquery—No
statusquerynull | KbArticleStatusNo
client_visiblequerybooleanNoOnly articles passing the effective client-facing gate.
qquery—NoTitle substring narrowing; ranked full-text search rides /api/search.

Responses

StatusDescription
200

Security: bearer

POST/api/v1/kb/articles

POST /api/kb/articles — instant-first (IF1/IF2).

Request body

CreateArticleRequest

Responses

StatusDescription
200
409slug already in use or idempotency key reused
422title/body rejected by KB rules

Security: bearer

GET/api/v1/kb/articles/{article_id}/embeds

GET /api/kb/articles/{article_id}/embeds

Parameters

NameInTypeRequiredDescription
article_idpathstringYes

Responses

StatusDescription
200

Security: bearer

POST/api/v1/kb/articles/{article_id}/embeds

POST /api/kb/articles/{article_id}/embeds — resolve-then-store; instant-first (IF1/IF2).

Parameters

NameInTypeRequiredDescription
article_idpathstringYes

Request body

CreateEmbedRequest

Responses

StatusDescription
200
404article not visible in scope
409url already attached or idempotency key reused
422url is not on the allowlist

Security: bearer

GET/api/v1/kb/articles/{id}

GET /api/kb/articles/{id} — with the sanitized read-only HTML projection (no editor package in any read bundle).

Parameters

NameInTypeRequiredDescription
idpathstringYes

Responses

StatusDescription
200
404article not visible in scope

Security: bearer

PATCH/api/v1/kb/articles/{id}

PATCH /api/kb/articles/{id} — instant-first (IF1/IF2). Archived articles refuse title/body edits until unarchived (typed conflict); status flips stay legal.

Parameters

NameInTypeRequiredDescription
idpathstringYes

Request body

UpdateArticleRequest

Responses

StatusDescription
200
404article not visible in scope
409archived content lock, version conflict, slug reuse, or idempotency key reused
422title/body rejected by KB rules

Security: bearer

DELETE/api/v1/kb/articles/{id}

DELETE /api/kb/articles/{id} — emits `kb_article.deleted` so the unified-search indexer drops the article's index entry.

Parameters

NameInTypeRequiredDescription
idpathstringYes

Responses

StatusDescription
200
404article not visible in scope

Security: bearer

GET/api/v1/kb/categories

GET /api/kb/categories

Responses

StatusDescription
200

Security: bearer

POST/api/v1/kb/categories

POST /api/kb/categories — instant-first (IF1/IF2).

Request body

CreateCategoryRequest

Responses

StatusDescription
200
409slug already in use or idempotency key reused

Security: bearer

PATCH/api/v1/kb/categories/{id}

PATCH /api/kb/categories/{id} — instant-first (IF1/IF2).

Parameters

NameInTypeRequiredDescription
idpathstringYes

Request body

UpdateCategoryRequest

Responses

StatusDescription
200
404category not visible in scope
409version conflict, slug reuse, or idempotency key reused

Security: bearer

DELETE/api/v1/kb/categories/{id}

DELETE /api/kb/categories/{id} — articles keep existing (category_id clears; ON DELETE SET NULL), so no content is lost behind a removal.

Parameters

NameInTypeRequiredDescription
idpathstringYes

Responses

StatusDescription
200
404category not visible in scope

Security: bearer

GET/api/v1/kb/embed-providers

GET /api/kb/embed-providers — system rows + the org's extensions.

Responses

StatusDescription
200

Security: bearer

POST/api/v1/kb/embed-providers

POST /api/kb/embed-providers — registry extension (admin-managed); instant-first (IF1/IF2). System rows are shipped, never created here.

Request body

CreateProviderRequest

Responses

StatusDescription
200
409slug already in use or idempotency key reused
422provider shape rejected (hosts/regex/endpoint)

Security: bearer

PATCH/api/v1/kb/embed-providers/{id}

PATCH /api/kb/embed-providers/{id} — org rows only; instant-first.

Parameters

NameInTypeRequiredDescription
idpathstringYes

Request body

UpdateProviderRequest

Responses

StatusDescription
200
404provider not visible in scope (system rows are not patchable through the org filter)
409system-row edit, version conflict, or idempotency key reused
422provider shape rejected

Security: bearer

DELETE/api/v1/kb/embed-providers/{id}

DELETE /api/kb/embed-providers/{id} — org rows only. Deleting a provider leaves its embeds in place with `provider_id` cleared (the FK is ON DELETE SET NULL) so they degrade to blocked, never to unvalidated.

Parameters

NameInTypeRequiredDescription
idpathstringYes

Responses

StatusDescription
200
404provider not visible in scope
409system rows are not deletable

Security: bearer

POST/api/v1/kb/embeds/resolve

POST /api/kb/embeds/resolve — validate a URL against the allowlist without attaching it to an article (live preview in the editor).

Request body

ResolveEmbedRequest

Responses

StatusDescription
200
422url is not on the allowlist
503provider oEmbed endpoint unreachable

Security: bearer

DELETE/api/v1/kb/embeds/{id}

DELETE /api/kb/embeds/{id}

Parameters

NameInTypeRequiredDescription
idpathstringYes

Responses

StatusDescription
200
404embed not visible in scope

Security: bearer

GET/api/v1/kb/external-documents

GET /api/kb/external-documents

Parameters

NameInTypeRequiredDescription
article_idquery—NoNarrow to one article's attachments.

Responses

StatusDescription
200

Security: bearer

POST/api/v1/kb/external-documents

POST /api/kb/external-documents — instant-first (IF1/IF2).

Request body

CreateExternalDocumentRequest

Responses

StatusDescription
200
404attached article not visible in scope
409idempotency key reused
422title/url rejected by KB rules

Security: bearer

GET/api/v1/kb/external-documents/{id}

GET /api/kb/external-documents/{id}

Parameters

NameInTypeRequiredDescription
idpathstringYes

Responses

StatusDescription
200
404external document not visible in scope

Security: bearer

PATCH/api/v1/kb/external-documents/{id}

PATCH /api/kb/external-documents/{id} — instant-first (IF1/IF2). A URL change resets the link-check columns: the old verification is about the old URL.

Parameters

NameInTypeRequiredDescription
idpathstringYes

Request body

UpdateExternalDocumentRequest

Responses

StatusDescription
200
404external document not visible in scope
409version conflict or idempotency key reused
422title/url rejected by KB rules

Security: bearer

DELETE/api/v1/kb/external-documents/{id}

DELETE /api/kb/external-documents/{id}

Parameters

NameInTypeRequiredDescription
idpathstringYes

Responses

StatusDescription
200
404external document not visible in scope

Security: bearer