status to published, embeds the body into the vector index, and fires the article.published webhook. Unpublishing reverses the second and third.
The lifecycle
Four states, with predictable server-side effects on transition:
The article row itself is never deleted by a status change.
archived is a soft-deletion; use DELETE /articles/{id} for a hard delete.
published_at is auto-stamped by the server on the first transition into
published and is sticky from then on — re-publishing after an unpublish does
not move it, and it stays set even while the article is unpublished or
archived. It’s null only before the article’s first publish.Publishing on create
Setstatus: "published" on the initial POST. Indexing fires as soon as the row is written.
indexing_status: "pending". The pipeline runs out-of-band.
Publishing a draft
PATCH the article withstatus: "published". The same server-side effects fire as on a create-with-publish.
Unpublishing
PATCH withstatus: "unpublished" or status: "archived". Embeddings are removed asynchronously.
Embedding removal is enqueued, not synchronous. There is a short window after
the response in which the article may still appear in search results.
Reading the index status
indexing_status is your signal that the article is retrievable. The five states:
Poll the article detail endpoint after publishing if you need a hard signal:
Webhook signals
Four events frame the publish boundary and the indexing pipeline. Subscribe under Dashboard → Webhooks.
Payload shape:

