Skip to main content
Every article returned by the API conforms to the shape below. List endpoints return a lightweight projection — content is omitted and tag_names is added — so list payloads stay compact.

Identifiers

string
required
Always "article".
uuid
required
Server-generated identifier. Stable for the lifetime of the article.
string
required
URL-safe handle. Lowercase letters, numbers, and dashes only (/^[a-z0-9-]+$/), maximum 200 characters. Unique per organization (and per-language for translations) — reusing a slug already taken by another article in your org is rejected. You set this on create; you can change it via PATCH, but inbound deep links to the old slug will 404.

Content

string
required
Human title. Indexed for search.
string
required
The source body — markdown is the canonical input. External image URLs are rehosted on write (see overview). Omitted from list payloads.
string | null
Plain-text mirror of content used for retrieval, embeddings, and previews. Derived server-side from the markdown you send — you don’t supply it, and any value sent in the request body is ignored.
string
required
ISO 639-1 two-letter language code for the primary body. Translations carry their own language on the satellite resource.
Supported codes: en, ja, de, fr, ko, zh, nl, sv, es, it, no. Sending any other value returns invalid_payload. Defaults to en when omitted on create.

Status & visibility

enum
required
Lifecycle state. One of:
  • draft — not indexed, not visible
  • published — indexed and surfaced according to visibility
  • unpublished — taken down from public surfaces; embeddings removed
  • archived — soft-deleted; not indexed, hidden from UI
See Publishing & indexing for transition semantics.
enum
required
Who can see the article when status === "published". One of:
  • public — KB site visitors and chatbots
  • internal — authenticated org agents only
  • chatbot_only — surfaced to chatbots; not rendered in the KB UI
datetime | null
ISO-8601 timestamp of the first transition to published. Auto-set by the server on that first publish and sticky thereafter — it is not re-stamped on later re-publishes, and stays set even after the article is unpublished or archived. null until the article has been published at least once.

Indexing

enum
required
State of the embedding pipeline for this article. One of:
  • not_started — never enqueued
  • pending — queued, not yet picked up
  • processing — embedding in flight
  • indexed — embeddings written; article searchable
  • failed — pipeline error; the article is not searchable
Poll this field or subscribe to the article.indexed / article.indexing_failed webhooks to detect completion. The underlying error string is not surfaced via the API.
datetime | null
ISO-8601 timestamp of the most recent successful index write. null until the first index completes.

Categorization

uuid | null
The knowledge base this article belongs to. Required on create — every new article must be scoped to a knowledge base. The id must belong to your organization; a foreign or nonexistent knowledge_base_id is rejected. May be null on older articles created before this was enforced.
uuid | null
The category (folder) this article sits inside. null for articles that live at the root of a knowledge base. The id must belong to your organization; a foreign or nonexistent category_id is rejected. See Article Categories.

Timestamps

datetime
required
ISO-8601 timestamp of insertion.
datetime
required
ISO-8601 timestamp of the most recent write.

List projection

List endpoints (GET /articles) drop content and add tag_names — the resolved tag names attached to the article. Use the detail endpoint to fetch the full body.
string[]
Resolved names of every tag assigned to the article. Only present on list responses.
Relations are returned by GET /articles/{id}/relations. Each entry carries the related article’s id and resolved title — slugs aren’t included; use GET /articles/{relatedId} if you need the full record.

Example

List example