Approval and the AI label
On this page
Only a person approves #
POST /articles/{id}/approve is not one of the 36 routes a key may call; a key that tries it receives 403 key_not_allowed.
A REST key, whatever its scopes, cannot approve. The exportscope renders and delivers; it never approves.An MCP agent has eight tools and none of them approves or asks for approval. An agent’s article stops at needsReviewand waits.An export is not an approval. Exporting an unapproved article either succeeds with the label saying “no”, or is refused by a workspace rule.
The label is derived #
label object on the article is computed from the approval record of the exact current version. It has no setter: no request body, header or scope changes it.
{
"reviewedByHuman": true,
"approvedVersion": 3,
"approvedAt": "2026-10-06T12:31:40Z",
"approvedBy": "Maya Chen"
}| Where | What it reads |
|---|---|
GET /articles/{id} | label.reviewedByHuman, with approvedVersion, approvedAt and approvedBy when true. |
Generated with sources · reviewed by a human: yes · Approved by <name>, version v<n> or … reviewed by a human: no. | |
Each language version is approved on its own #
languageVersions on any of them shows which are approved. A version’s label says reviewed by a human only when a person approved that version of that article. See Write in several languages.
A new version removes the approval #
approved to needsReview and label.reviewedByHuman becomes false until a person approves the new version. A key or an agent that edits an approved article therefore un-approves it.
newer_version; they read the new version and approve again. If the post-write check left statements the sources do not carry, the person acknowledges each with a note, or approval is refused with 409 unsupported_statements_open.
Workspace export rules #
| Rule | Refusal |
|---|---|
approval_required | |
export_blocked_flagged |