This guide walks the full governance loop over the API: create a concept, propose an edit as a change request, approve it as a reviewer, certify the result, read the revision trail, then step back and read the whole workspace through the manifest and the SKOS export. The model behind every call is explained in Concept governance.
Prerequisites
A key with kb:write (mutations) and kb:read (reads), exported as $ELI_KEY. See Getting started.
A manually created entity starts at authority asserted — a human vouched for it — and lifecycle published, live by default. Version 1, revision kind create.
POST/api/v1/entitiesBearer · kb:write
Create the concept you are about to govern. Manual creation lands at authority 'asserted', lifecycle 'published'.
Instead of editing the definition directly, propose it. kind is one of create · update · deprecate · supersede · delete; the payload is validated per kind (an update takes any of name, type, aliases, description — at least one). Non-create kinds require an existing live entity.
POST/api/v1/change-requestsBearer · kb:write
Request body
kindrequired
string
create | update | deprecate | supersede | delete.
entityId
string
Target concept id. Omit only for kind create (proposes a new concept).
curl -s -X POST https://your-host/api/v1/change-requests \ -H "Authorization: Bearer $ELI_KEY" \ -H "Content-Type: application/json" \ -d '{ "kind": "update", "entityId": "01KZ40AAAAAAAAAAAAAAAAAAAA", "payload": { "description": "Recurring revenue retained from existing customers over 12 months, including expansion." }, "note": "Aligning the definition with the FY26 board deck" }'
Responsejson
{ "id": "01KZ41BBBBBBBBBBBBBBBBBBBB", "entityId": "01KZ40AAAAAAAAAAAAAAAAAAAA", "entityName": "Net Revenue Retention", "kind": "update", "payload": { "description": "Recurring revenue retained from existing customers over 12 months, including expansion." }, "status": "open", "note": "Aligning the definition with the FY26 board deck", "createdAt": "2026-07-21T09:00:00.000Z"}
Reviewers see the queue with GET /api/v1/change-requests?status=open (kb:read) — or on the workspace's Curation page.
3 · Approve it
If the concept has an owner or stewards, only they may approve or reject — anyone else gets a 409. Unowned concepts are approvable by any member. Approval applies the change atomically: the entity is updated, its authority is promoted to at least curated, and the revision's activity records change_request:<id>.
POST …/change-requests/{id}/reject (reviewer, with optional reviewNote) and POST …/change-requests/{id}/withdraw (proposer) close a request without applying it. All three verbs return 409 if the request is no longer open — first reviewer wins, double-applies are impossible.
4 · Certify
Certification is owner/admin sign-off — the only tier assistants state without hedging. It also starts the review clock: nextReviewAt lands at now + the workspace's reviewIntervalDays (default 180).
The lighter-weight sibling — POST …/entities/{id}/review — restamps the review clock without certifying, and promotes a still-machine-extracted concept to curated. The rest of the curation verb set (/authority, /owner, /deprecate) is documented in the API reference.
One GET summarizes the whole workspace — counts by authority, lifecycle, and document verification, the hub concepts by graph in-degree, and review staleness. Your newly certified metric now counts toward byAuthority.certified.
The full field reference is on the manifest page; MCP clients read the same document as the eli://workspace/manifest resource.
7 · Export SKOS
Finally, prove there is no lock-in: export the governed vocabulary as SKOS/PROV-O JSON-LD. Published and deprecated concepts ship with pref/alt labels, graph edges, lifecycle as adms:status, and attribution.
Govern documents the same way with POST /api/v1/documents/{id}/verify, and watch the review-due queue on the Curation page. The tiers your curation produces flow straight into structured answers — certified concepts are the ones an assistant states without hedging.