content is omitted and tag_names is added — so list payloads stay compact.
Identifiers
Always
"article".Server-generated identifier. Stable for the lifetime of the article.
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
Human title. Indexed for search.
The source body — markdown is the canonical input. External image URLs are rehosted on write (see overview). Omitted from list payloads.
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.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
Lifecycle state. One of:
draft— not indexed, not visiblepublished— indexed and surfaced according tovisibilityunpublished— taken down from public surfaces; embeddings removedarchived— soft-deleted; not indexed, hidden from UI
Who can see the article when
status === "published". One of:public— KB site visitors and chatbotsinternal— authenticated org agents onlychatbot_only— surfaced to chatbots; not rendered in the KB UI
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
State of the embedding pipeline for this article. One of:
not_started— never enqueuedpending— queued, not yet picked upprocessing— embedding in flightindexed— embeddings written; article searchablefailed— pipeline error; the article is not searchable
article.indexed / article.indexing_failed webhooks to detect completion. The underlying error string is not surfaced via the API.ISO-8601 timestamp of the most recent successful index write.
null until the first index completes.Categorization
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.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
ISO-8601 timestamp of insertion.
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.
Resolved names of every tag assigned to the article. Only present on list responses.
Related articles
Relations are returned byGET /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.

