API & MCP
Manifest & governance (v1)
The workspace manifest is one JSON document that tells a machine what a workspace knows and how much to trust it: corpus counts broken down by authority tier and lifecycle, the hub concepts of the graph, and review staleness. Around it sits the governance surface — per-entity curation verbs, revision history, change requests, document verification, and a SKOS export. All routes require an API key; the workspace is resolved from the key. Every operation is also in the OpenAPI reference.
The manifest
/api/v1/manifestBearer · kb:read or runs:readBuild and return the workspace manifest. Pure SQL — no LLM involved — so it is fast enough to fetch at session start. MCP clients read the identical document as the eli://workspace/manifest resource.
What hub concepts are for
hubConceptsto an agent at session start and it knows the workspace's load-bearing vocabulary — and how much of it is certified — before asking a single question. Draft and pending-review concepts never appear here.Curation verbs
Five POST verbs mutate a concept's governance state. All require kb:write, bump the entity version, append a revision, and write an audit event. Each returns the updated CurationMeta: { authority, lifecycleStatus, ownerId, stewardIds, version, lastReviewedAt, nextReviewAt, supersededBy, sourceRefs, editorialNote }.
/api/v1/entities/{id}/certifyBearer · kb:writeOwner/admin sign-off: authority becomes 'certified', the review clock restamps (now + reviewIntervalDays).
Request body
/api/v1/entities/{id}/reviewBearer · kb:writeMark reviewed: restamps lastReviewedAt/nextReviewAt only. A review of a machine_extracted concept promotes it to 'curated' (post-hoc promotion). No body.
/api/v1/entities/{id}/authorityBearer · kb:writeExplicitly set the authority tier, including demotion. Setting the current value is an idempotent no-op (no version bump).
Request body
/api/v1/entities/{id}/ownerBearer · kb:writeAssign the owner and steward list. Owner/stewards are the reviewers for the concept's change requests.
Request body
/api/v1/entities/{id}/deprecateBearer · kb:writeRetire a concept from active guidance. With supersededBy it becomes 'superseded' and links to its successor — which must be a live, published entity (404/400 otherwise; self-supersede is a 400). Already-deprecated concepts return 409.
Request body
/api/v1/entities/{id}/revisionsBearer · kb:readAppend-only revision history, newest first — version, changeKind, snapshot, field-level diff, PROV-O activity, changedBy, note, createdAt. See the guide for a worked example.
GET /api/v1/entities/{id}also returns the concept's CurationMeta alongside its card, so a single fetch tells a consumer both what a concept is and how much to trust it.
Change requests
The gated track for schema-level and destructive edits — semantics, payload shapes, and reviewer rules are covered in Curation & change management and walked end-to-end in the guide:
GET /api/v1/change-requests?status=open(kb:read) — list, newest first, with the target concept's name joined.POST /api/v1/change-requests(kb:write) —{ kind, entityId?, payload, note? }, payload strictly validated per kind.POST /api/v1/change-requests/{id}/approve·/reject·/withdraw(kb:write) — approve/reject take an optionalreviewNote; all three return409when the request is no longer open. Approval by a non-reviewer of an owned concept is a409.
Document verification
/api/v1/documents/{id}/verifyBearer · kb:writeSet a document's verification state (Glean model). 'verified' and 'certified' stamp verifiedBy/verifiedAt and schedule nextVerifyAt at now + reviewIntervalDays; 'unverified' and 'deprecated' clear the stamps. Audited as document.verify.
Request body
SKOS export
/api/v1/export/skosBearer · kb:readThe workspace's published and deprecated concepts as SKOS/PROV-O JSON-LD: skos:Concept with prefLabel, aliases as altLabel, graph edges as broader/related, lifecycle as adms:status, prov:wasAttributedTo and dct:modified. A static @context — load it into any thesaurus or catalog tool.
Errors
Governance endpoints use the standard conventions from Errors & rate limits, with three statuses doing the domain work:
400— invalid payloads: bad enum value, malformed change-request payload, self-supersede, or a successor that is not published.404— entity, document, or change request not found (or already deleted).409— conflicts: deprecating an already-deprecated concept, an invalid lifecycle transition, acting on a non-open change request, or approving without being the concept's owner/steward.