Lifelong Entities API (non-fungible lifespan) — OpenAPI 1.0.0
<!-- GENERATED by scripts/render-platform-map-api-docs.mjs — do not hand-edit; edit apps/agent-bff/openapi/<spec>.json and re-run. --> Scope: The published reference for Lifelong Entities API (non-fungible lifespan). 37 paths — the measured spec-vs-implementation coverage lives in the complete API inventory. Status: rendered 2026-11-09 from the OpenAPI source for Lifelong Entities API (non-fungible lifespan) — regenerate with node scripts/render-platform-map-api-docs.mjs. See also: the OpenAPI spec index.
Servers
| URL | Notes |
|---|---|
| https://dev.agent.jijibora.online | Dokku DEV Agent BFF |
| https://uat.agent.jijibora.online | Dokku UAT Agent BFF |
| http://127.0.0.1:3030 | Local laptop only — not for public codegen |
Tags
| Tag | Summary |
|---|---|
| entities-lifespan | Mint, resolve, history, aliases, graph, thread |
| entities-projection | Search, query profiles, criteria, index projection |
| entities-governance | Leases, present, packages, backup, anchor, compaction, sourcing deltas |
Paths — 37 paths / 39 operations
| Method | Path | Operation ID | Summary |
|---|---|---|---|
| POST | /v1/entities | mintEntity | Mint an entity (lifelong claim + tip) |
| GET | /v1/entities/resolve | resolveEntity | Resolve an entity by reference (alias/VIN/plate/…). |
| GET | /v1/entities/ops/readiness | getEntitiesReadiness | Lifelong desk readiness (Soft≠LIVE honesty probe) |
| GET | /v1/entities/{entityId} | getEntityProjection | Read the index projection (scrubbed per indexability) |
| GET | /v1/entities/{entityId}/tip | getEntityTip | Read the current tip (hash chain head) |
| GET | /v1/entities/{entityId}/aliases | listEntityAliases | List entity aliases |
| POST | /v1/entities/{entityId}/aliases | registerEntityAlias | Register an alias |
| POST | /v1/entities/{entityId}/changes | appendEntityChange | Append a hash-chained change |
| GET | /v1/entities/{entityId}/history | listEntityHistory | Paged history (headers; lease-bound) |
| GET | /v1/entities/{entityId}/history/{changeId} | getEntityChange | Read one change |
| GET | /v1/entities/{entityId}/thread | getEntityThread | Entity thread (history + projection) |
| GET | /v1/entities/{entityId}/graph | getEntityGraph | Truth-graph neighbors (paged) |
| GET | /v1/entities/{entityId}/leases | listEntityLeases | List active leases |
| POST | /v1/entities/{entityId}/leases | issueEntityLease | Issue a purpose-scoped lease |
| POST | /v1/entities/{entityId}/leases/cascade-revoke | cascadeEntityLeases | Cascade-revoke leases for a grantee/subject |
| POST | /v1/entities/{entityId}/query | queryEntityProfile | Query-profile enforced query (search/match/hydrate) |
| POST | /v1/entities/query | queryEntities | Query without a path entity id (body carries entity_id) |
| POST | /v1/internal/entities/query | queryEntitiesInternal | Internal query alias (same enforcement as /v1/entities/query) |
| POST | /v1/entities/search | searchEntities | Search indexed facets (allow-listed only) |
| POST | /v1/entities/{entityId}/present | presentEntity | BBS+ selective-disclosure presentation |
| POST | /v1/entities/{entityId}/packages | issueEntityPackage | Issue a sync package for the entity |
| POST | /v1/entities/{entityId}/backup/blind | blindBackupEntity | Register a blind backup (ciphertext only) |
| POST | /v1/entities/{entityId}/anchor | anchorEntity | Request a fabric anchor for the entity tip |
| POST | /v1/entities/{entityId}/series/chunks | registerSeriesChunk | Register a series chunk |
| GET | /v1/entities/{entityId}/compaction/plan | planCompaction | Compaction plan (declarative, no side effects) |
| POST | /v1/entities/{entityId}/compaction/run | runCompaction | Run compaction (LIVE-gated; refuses until the worker adapter exists) |
| POST | /v1/entities/{entityId}/criteria/normalize | normalizeEntityCriteria | Soft-normalize a change to platform.criteria.v1.entity_state |
| POST | /v1/entities/{entityId}/criteria/publish | publishEntityCriteria | Publish the criteria event (LIVE only with ENTITY_CRITERIA_LIVE=1) |
| POST | /v1/entities/{entityId}/sourcing/offer-delta | buildOfferDelta | Build a scrubbed offer/capacity delta (Soft, no publish) |
| POST | /v1/entities/{entityId}/sourcing/offer-delta/publish | publishOfferDelta | Append change → outbox delta → meter/prefilter update (Soft chain) |
| GET | /v1/entities/{entityId}/sourcing/offer-delta/prove | proveOfferDelta | Prove meter-wake readback (no Surreal poll) |
| POST | /v1/entities/emergency/scrub | emergencyScrub | Emergency CAP scrub to the sourcing-safe projection (INTRQ-15) |
| POST | /v1/entities/{entityId}/sourcing/publish | publishSourcery | Publish-sourcable recipe (exposure + scrubbed claim + outbox → meter) |
| POST | /v1/entities/{entityId}/sourcing/onboard | onboardProvider | Onboard a provider (affiliation + leases + exposure publish) |
| POST | /v1/entities/{entityId}/panel-mesh | standUpPanelMesh | Panel mesh recipe (affiliation approve + role lease) |
| POST | /v1/provider-capability/attestations | registerCapabilityAttestation | Register a customer-signed capability attestation |
| POST | /v1/provider-capability/attestations/verify | verifyCapabilityAttestation | Verify an attestation (check only) |
| POST | /v1/provider-capability/intake | intakeCapability | Intake a provider capability feed (field-map → upsert) |
| POST | /v1/sourcing/admit | gateSourcingAdmit | Verifier gate for sourcing admits (customer-key atest check) |
Operations
POST /v1/entities
Summary: Mint an entity (lifelong claim + tip)
Tags: entities-lifespan Operation ID: mintEntity Responses:
| Status | Meaning |
|---|---|
| 201 | Entity minted; returns entity_id and tip hash |
| 402 | Membership/tip gate refused |
GET /v1/entities/resolve
Summary: Resolve an entity by reference (alias/VIN/plate/…).
Tags: entities-lifespan Operation ID: resolveEntity
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| ref | query | no | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Canonical entity binding |
| 404 | unresolvable ref |
GET /v1/entities/ops/readiness
Summary: Lifelong desk readiness (Soft≠LIVE honesty probe)
Tags: entities-governance Operation ID: getEntitiesReadiness Responses:
| Status | Meaning |
|---|---|
| 200 | Tip KV / index / criteria + fabric probe status |
GET /v1/entities/{entityId}
Summary: Read the index projection (scrubbed per indexability)
Tags: entities-lifespan Operation ID: getEntityProjection
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Scrubbed projection (facets only) |
| 404 | entity_not_found |
GET /v1/entities/{entityId}/tip
Summary: Read the current tip (hash chain head)
Tags: entities-lifespan Operation ID: getEntityTip
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Tip record |
GET /v1/entities/{entityId}/aliases
Summary: List entity aliases
Tags: entities-lifespan Operation ID: listEntityAliases
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Alias bindings |
POST /v1/entities/{entityId}/aliases
Summary: Register an alias
Tags: entities-lifespan Operation ID: registerEntityAlias
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Alias bound |
POST /v1/entities/{entityId}/changes
Summary: Append a hash-chained change
Tags: entities-lifespan Operation ID: appendEntityChange
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 201 | Change appended; returns change_id + tip hash |
GET /v1/entities/{entityId}/history
Summary: Paged history (headers; lease-bound)
Tags: entities-lifespan Operation ID: listEntityHistory
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string | |
| limit | query | no | int | |
| cursor | query | no | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | History page |
GET /v1/entities/{entityId}/history/{changeId}
Summary: Read one change
Tags: entities-lifespan Operation ID: getEntityChange
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string | |
| changeId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Change record |
| 404 | change_not_found |
GET /v1/entities/{entityId}/thread
Summary: Entity thread (history + projection)
Tags: entities-lifespan Operation ID: getEntityThread
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Thread view |
GET /v1/entities/{entityId}/graph
Summary: Truth-graph neighbors (paged)
Tags: entities-lifespan Operation ID: getEntityGraph
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Graph page |
GET /v1/entities/{entityId}/leases
Summary: List active leases
Tags: entities-governance Operation ID: listEntityLeases
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Active leases |
POST /v1/entities/{entityId}/leases
Summary: Issue a purpose-scoped lease
Tags: entities-governance Operation ID: issueEntityLease
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 201 | Lease issued (purpose + TTL + grantee) |
| 422 | Lease refused (purpose not permitted for the grantee) |
POST /v1/entities/{entityId}/leases/cascade-revoke
Summary: Cascade-revoke leases for a grantee/subject
Tags: entities-governance Operation ID: cascadeEntityLeases
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Cascade complete |
POST /v1/entities/{entityId}/query
Summary: Query-profile enforced query (search/match/hydrate) Description: Mode is gated by the consumer's query_profile (forbidden modes refuse). Hydrate is forbidden for sourcing consumers and returns the sealed-payload guidance.
Tags: entities-projection Operation ID: queryEntityProfile
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Request body:
Content type: application/json
| Field | Type | Notes |
|---|---|---|
| mode | string enum: projection, resolve, history_headers, thread, proof, predicate, hydrate, graph,… | |
| consumer | string | |
| lease_id | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Profile-enforced result |
| 403 | mode_forbidden_for_consumer / mode_not_allowed |
| 422 | query_profile_missing (fail closed) or use_dedicated_opaque_path |
POST /v1/entities/query
Summary: Query without a path entity id (body carries entity_id)
Tags: entities-projection Operation ID: queryEntities Responses:
| Status | Meaning |
|---|---|
| 200 | Profile-enforced result |
| 403 | Forbidden mode |
POST /v1/internal/entities/query
Summary: Internal query alias (same enforcement as /v1/entities/query)
Tags: entities-projection Operation ID: queryEntitiesInternal Responses:
| Status | Meaning |
|---|---|
| 200 | Profile-enforced result |
| 403 | Forbidden mode |
POST /v1/entities/search
Summary: Search indexed facets (allow-listed only)
Tags: entities-projection Operation ID: searchEntities Responses:
| Status | Meaning |
|---|---|
| 200 | Facet search results |
POST /v1/entities/{entityId}/present
Summary: BBS+ selective-disclosure presentation
Tags: entities-governance Operation ID: presentEntity
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Credential envelope (no sealed payload) |
| 422 | Lease required for present |
POST /v1/entities/{entityId}/packages
Summary: Issue a sync package for the entity
Tags: entities-governance Operation ID: issueEntityPackage
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Package issued |
POST /v1/entities/{entityId}/backup/blind
Summary: Register a blind backup (ciphertext only)
Tags: entities-governance Operation ID: blindBackupEntity
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Blind backup registered |
POST /v1/entities/{entityId}/anchor
Summary: Request a fabric anchor for the entity tip
Tags: entities-governance Operation ID: anchorEntity
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 202 | Anchor requested |
POST /v1/entities/{entityId}/series/chunks
Summary: Register a series chunk
Tags: entities-lifespan Operation ID: registerSeriesChunk
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 201 | Chunk registered |
GET /v1/entities/{entityId}/compaction/plan
Summary: Compaction plan (declarative, no side effects)
Tags: entities-governance Operation ID: planCompaction
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Compaction plan |
POST /v1/entities/{entityId}/compaction/run
Summary: Run compaction (LIVE-gated; refuses until the worker adapter exists)
Tags: entities-governance Operation ID: runCompaction
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 503 | invent_refuse_live (no LIVE compaction adapter yet) |
POST /v1/entities/{entityId}/criteria/normalize
Summary: Soft-normalize a change to platform.criteria.v1.entity_state Description: Facets only (indexability-scrubbed); raw metadata refused. No publish.
Tags: entities-projection Operation ID: normalizeEntityCriteria
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Request body:
Content type: application/json
| Field | Type | Notes |
|---|---|---|
| facets | object | |
| event_type | string | |
| change_hash | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Criteria envelope (Soft; live: false) |
| 422 | facets_required_not_raw_metadata |
POST /v1/entities/{entityId}/criteria/publish
Summary: Publish the criteria event (LIVE only with ENTITY_CRITERIA_LIVE=1)
Tags: entities-projection Operation ID: publishEntityCriteria
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Published |
| 503 | invent_refuse_live (no criteria plane) |
POST /v1/entities/{entityId}/sourcing/offer-delta
Summary: Build a scrubbed offer/capacity delta (Soft, no publish)
Tags: entities-governance Operation ID: buildOfferDelta
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Delta envelope preview |
| 422 | exposure_sourcing_required / cap_scrub_leak |
POST /v1/entities/{entityId}/sourcing/offer-delta/publish
Summary: Append change → outbox delta → meter/prefilter update (Soft chain)
Tags: entities-governance Operation ID: publishOfferDelta
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Chain result (meter wake) |
| 503 | counter_plane_down (invent_refuse on LIVE) |
GET /v1/entities/{entityId}/sourcing/offer-delta/prove
Summary: Prove meter-wake readback (no Surreal poll)
Tags: entities-governance Operation ID: proveOfferDelta
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string | |
| meter_key | query | no | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Wake proof (surreally_polled: false) |
POST /v1/entities/emergency/scrub
Summary: Emergency CAP scrub to the sourcing-safe projection (INTRQ-15)
Tags: entities-governance Operation ID: emergencyScrub Responses:
| Status | Meaning |
|---|---|
| 200 | Scrubbed projection |
| 422 | scrub_profile_missing / cap_scrub_leak |
POST /v1/entities/{entityId}/sourcing/publish
Summary: Publish-sourcable recipe (exposure + scrubbed claim + outbox → meter)
Tags: entities-governance Operation ID: publishSourcery
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Published offer (claim + meter) |
| 422 | profile missing / sealed leak / default-deny |
| 503 | counter plane down (LIVE) |
POST /v1/entities/{entityId}/sourcing/onboard
Summary: Onboard a provider (affiliation + leases + exposure publish)
Tags: entities-governance Operation ID: onboardProvider
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Per-step ledger |
POST /v1/entities/{entityId}/panel-mesh
Summary: Panel mesh recipe (affiliation approve + role lease)
Tags: entities-governance Operation ID: standUpPanelMesh
Parameters:
| Name | In | Required | Type | Notes |
|---|---|---|---|---|
| entityId | path | yes | string |
Responses:
| Status | Meaning |
|---|---|
| 200 | Affiliation + lease |
| 503 | affiliation_plane_down (invent_refuse) |
POST /v1/provider-capability/attestations
Summary: Register a customer-signed capability attestation
Tags: entities-governance Operation ID: registerCapabilityAttestation Responses:
| Status | Meaning |
|---|---|
| 201 | Attestation registered (verified) |
| 422 | vendor key / expired / invalid signature |
POST /v1/provider-capability/attestations/verify
Summary: Verify an attestation (check only)
Tags: entities-governance Operation ID: verifyCapabilityAttestation Responses:
| Status | Meaning |
|---|---|
| 200 | Valid attestation |
| 422 | Invalid attestation |
POST /v1/provider-capability/intake
Summary: Intake a provider capability feed (field-map → upsert)
Tags: entities-governance Operation ID: intakeCapability Responses:
| Status | Meaning |
|---|---|
| 200 | Intake mapped + validated (Soft) |
| 422 | Map unknown / contract violation |
POST /v1/sourcing/admit
Summary: Verifier gate for sourcing admits (customer-key atest check)
Tags: entities-governance Operation ID: gateSourcingAdmit Responses:
| Status | Meaning |
|---|---|
| 200 | Admitted (verified attestation) |
| 422 | attestation_required / invalid / expired |
Full specification — verbatim source of truth
{
"openapi": "3.1.0",
"info": {
"title": "Lifelong Entities API (non-fungible lifespan)",
"version": "1.0.0",
"description": "Universal lifelong entity façade: mint, resolve, change-append (hash-chained history), index projection, search, query profiles, leases, evidence present, packages, blind backup, fabric anchor, series chunks, and sourcing offer deltas. Any non-fungible asset CNS type (vehicle, building, person, organization, resource) shares this single surface; disclosure is controlled per type by indexability profiles (allow/deny fields) and query profiles (forbid-hydrate for sourcing). Soft≠LIVE: sealed payloads require purpose leases; hydrate through this façade is forbidden for sourcing consumers. Never invent sealed/LIVE success."
},
"servers": [
{
"url": "https://dev.agent.jijibora.online",
"description": "Dokku DEV Agent BFF"
},
{
"url": "https://uat.agent.jijibora.online",
"description": "Dokku UAT Agent BFF"
},
{
"url": "http://127.0.0.1:3030",
"description": "Local laptop only — not for public codegen"
}
],
"tags": [
{
"name": "entities-lifespan",
"description": "Mint, resolve, history, aliases, graph, thread"
},
{
"name": "entities-projection",
"description": "Search, query profiles, criteria, index projection"
},
{
"name": "entities-governance",
"description": "Leases, present, packages, backup, anchor, compaction, sourcing deltas"
}
],
"paths": {
"/v1/entities": {
"post": {
"tags": [
"entities-lifespan"
],
"summary": "Mint an entity (lifelong claim + tip)",
"operationId": "mintEntity",
"responses": {
"201": {
"description": "Entity minted; returns entity_id and tip hash"
},
"402": {
"description": "Membership/tip gate refused"
}
}
}
},
"/v1/entities/resolve": {
"get": {
"tags": [
"entities-lifespan"
],
"summary": "Resolve an entity by reference (alias/VIN/plate/…).",
"operationId": "resolveEntity",
"parameters": [
{
"name": "ref",
"in": "query",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Canonical entity binding"
},
"404": {
"description": "unresolvable ref"
}
}
}
},
"/v1/entities/ops/readiness": {
"get": {
"tags": [
"entities-governance"
],
"summary": "Lifelong desk readiness (Soft≠LIVE honesty probe)",
"operationId": "getEntitiesReadiness",
"responses": {
"200": {
"description": "Tip KV / index / criteria + fabric probe status"
}
}
}
},
"/v1/entities/{entityId}": {
"get": {
"tags": [
"entities-lifespan"
],
"summary": "Read the index projection (scrubbed per indexability)",
"operationId": "getEntityProjection",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Scrubbed projection (facets only)"
},
"404": {
"description": "entity_not_found"
}
}
}
},
"/v1/entities/{entityId}/tip": {
"get": {
"tags": [
"entities-lifespan"
],
"summary": "Read the current tip (hash chain head)",
"operationId": "getEntityTip",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Tip record"
}
}
}
},
"/v1/entities/{entityId}/aliases": {
"get": {
"tags": [
"entities-lifespan"
],
"summary": "List entity aliases",
"operationId": "listEntityAliases",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Alias bindings"
}
}
},
"post": {
"tags": [
"entities-lifespan"
],
"summary": "Register an alias",
"operationId": "registerEntityAlias",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Alias bound"
}
}
}
},
"/v1/entities/{entityId}/changes": {
"post": {
"tags": [
"entities-lifespan"
],
"summary": "Append a hash-chained change",
"operationId": "appendEntityChange",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"201": {
"description": "Change appended; returns change_id + tip hash"
}
}
}
},
"/v1/entities/{entityId}/history": {
"get": {
"tags": [
"entities-lifespan"
],
"summary": "Paged history (headers; lease-bound)",
"operationId": "listEntityHistory",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "limit",
"in": "query",
"schema": {
"type": "integer"
}
},
{
"name": "cursor",
"in": "query",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "History page"
}
}
}
},
"/v1/entities/{entityId}/history/{changeId}": {
"get": {
"tags": [
"entities-lifespan"
],
"summary": "Read one change",
"operationId": "getEntityChange",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "changeId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Change record"
},
"404": {
"description": "change_not_found"
}
}
}
},
"/v1/entities/{entityId}/thread": {
"get": {
"tags": [
"entities-lifespan"
],
"summary": "Entity thread (history + projection)",
"operationId": "getEntityThread",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Thread view"
}
}
}
},
"/v1/entities/{entityId}/graph": {
"get": {
"tags": [
"entities-lifespan"
],
"summary": "Truth-graph neighbors (paged)",
"operationId": "getEntityGraph",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Graph page"
}
}
}
},
"/v1/entities/{entityId}/leases": {
"get": {
"tags": [
"entities-governance"
],
"summary": "List active leases",
"operationId": "listEntityLeases",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Active leases"
}
}
},
"post": {
"tags": [
"entities-governance"
],
"summary": "Issue a purpose-scoped lease",
"operationId": "issueEntityLease",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"201": {
"description": "Lease issued (purpose + TTL + grantee)"
},
"422": {
"description": "Lease refused (purpose not permitted for the grantee)"
}
}
}
},
"/v1/entities/{entityId}/leases/cascade-revoke": {
"post": {
"tags": [
"entities-governance"
],
"summary": "Cascade-revoke leases for a grantee/subject",
"operationId": "cascadeEntityLeases",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Cascade complete"
}
}
}
},
"/v1/entities/{entityId}/query": {
"post": {
"tags": [
"entities-projection"
],
"summary": "Query-profile enforced query (search/match/hydrate)",
"description": "Mode is gated by the consumer's query_profile (forbidden modes refuse). Hydrate is forbidden for sourcing consumers and returns the sealed-payload guidance.",
"operationId": "queryEntityProfile",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"mode": {
"type": "string",
"enum": [
"projection",
"resolve",
"history_headers",
"thread",
"proof",
"predicate",
"hydrate",
"graph",
"anchor",
"search"
]
},
"consumer": {
"type": "string",
"example": "sourcing"
},
"lease_id": {
"type": "string"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Profile-enforced result"
},
"403": {
"description": "mode_forbidden_for_consumer / mode_not_allowed"
},
"422": {
"description": "query_profile_missing (fail closed) or use_dedicated_opaque_path"
}
}
}
},
"/v1/entities/query": {
"post": {
"tags": [
"entities-projection"
],
"summary": "Query without a path entity id (body carries entity_id)",
"operationId": "queryEntities",
"responses": {
"200": {
"description": "Profile-enforced result"
},
"403": {
"description": "Forbidden mode"
}
}
}
},
"/v1/internal/entities/query": {
"post": {
"tags": [
"entities-projection"
],
"summary": "Internal query alias (same enforcement as /v1/entities/query)",
"operationId": "queryEntitiesInternal",
"responses": {
"200": {
"description": "Profile-enforced result"
},
"403": {
"description": "Forbidden mode"
}
}
}
},
"/v1/entities/search": {
"post": {
"tags": [
"entities-projection"
],
"summary": "Search indexed facets (allow-listed only)",
"operationId": "searchEntities",
"responses": {
"200": {
"description": "Facet search results"
}
}
}
},
"/v1/entities/{entityId}/present": {
"post": {
"tags": [
"entities-governance"
],
"summary": "BBS+ selective-disclosure presentation",
"operationId": "presentEntity",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Credential envelope (no sealed payload)"
},
"422": {
"description": "Lease required for present"
}
}
}
},
"/v1/entities/{entityId}/packages": {
"post": {
"tags": [
"entities-governance"
],
"summary": "Issue a sync package for the entity",
"operationId": "issueEntityPackage",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Package issued"
}
}
}
},
"/v1/entities/{entityId}/backup/blind": {
"post": {
"tags": [
"entities-governance"
],
"summary": "Register a blind backup (ciphertext only)",
"operationId": "blindBackupEntity",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Blind backup registered"
}
}
}
},
"/v1/entities/{entityId}/anchor": {
"post": {
"tags": [
"entities-governance"
],
"summary": "Request a fabric anchor for the entity tip",
"operationId": "anchorEntity",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"202": {
"description": "Anchor requested"
}
}
}
},
"/v1/entities/{entityId}/series/chunks": {
"post": {
"tags": [
"entities-lifespan"
],
"summary": "Register a series chunk",
"operationId": "registerSeriesChunk",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"201": {
"description": "Chunk registered"
}
}
}
},
"/v1/entities/{entityId}/compaction/plan": {
"get": {
"tags": [
"entities-governance"
],
"summary": "Compaction plan (declarative, no side effects)",
"operationId": "planCompaction",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Compaction plan"
}
}
}
},
"/v1/entities/{entityId}/compaction/run": {
"post": {
"tags": [
"entities-governance"
],
"summary": "Run compaction (LIVE-gated; refuses until the worker adapter exists)",
"operationId": "runCompaction",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"503": {
"description": "invent_refuse_live (no LIVE compaction adapter yet)"
}
}
}
},
"/v1/entities/{entityId}/criteria/normalize": {
"post": {
"tags": [
"entities-projection"
],
"summary": "Soft-normalize a change to platform.criteria.v1.entity_state",
"description": "Facets only (indexability-scrubbed); raw metadata refused. No publish.",
"operationId": "normalizeEntityCriteria",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"facets": {
"type": "object"
},
"event_type": {
"type": "string"
},
"change_hash": {
"type": "string"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Criteria envelope (Soft; live: false)"
},
"422": {
"description": "facets_required_not_raw_metadata"
}
}
}
},
"/v1/entities/{entityId}/criteria/publish": {
"post": {
"tags": [
"entities-projection"
],
"summary": "Publish the criteria event (LIVE only with ENTITY_CRITERIA_LIVE=1)",
"operationId": "publishEntityCriteria",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Published"
},
"503": {
"description": "invent_refuse_live (no criteria plane)"
}
}
}
},
"/v1/entities/{entityId}/sourcing/offer-delta": {
"post": {
"tags": [
"entities-governance"
],
"summary": "Build a scrubbed offer/capacity delta (Soft, no publish)",
"operationId": "buildOfferDelta",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Delta envelope preview"
},
"422": {
"description": "exposure_sourcing_required / cap_scrub_leak"
}
}
}
},
"/v1/entities/{entityId}/sourcing/offer-delta/publish": {
"post": {
"tags": [
"entities-governance"
],
"summary": "Append change → outbox delta → meter/prefilter update (Soft chain)",
"operationId": "publishOfferDelta",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Chain result (meter wake)"
},
"503": {
"description": "counter_plane_down (invent_refuse on LIVE)"
}
}
}
},
"/v1/entities/{entityId}/sourcing/offer-delta/prove": {
"get": {
"tags": [
"entities-governance"
],
"summary": "Prove meter-wake readback (no Surreal poll)",
"operationId": "proveOfferDelta",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "meter_key",
"in": "query",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Wake proof (surreally_polled: false)"
}
}
}
},
"/v1/entities/emergency/scrub": {
"post": {
"tags": [
"entities-governance"
],
"summary": "Emergency CAP scrub to the sourcing-safe projection (INTRQ-15)",
"operationId": "emergencyScrub",
"responses": {
"200": {
"description": "Scrubbed projection"
},
"422": {
"description": "scrub_profile_missing / cap_scrub_leak"
}
}
}
},
"/v1/entities/{entityId}/sourcing/publish": {
"post": {
"tags": [
"entities-governance"
],
"summary": "Publish-sourcable recipe (exposure + scrubbed claim + outbox → meter)",
"operationId": "publishSourcery",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Published offer (claim + meter)"
},
"422": {
"description": "profile missing / sealed leak / default-deny"
},
"503": {
"description": "counter plane down (LIVE)"
}
}
}
},
"/v1/entities/{entityId}/sourcing/onboard": {
"post": {
"tags": [
"entities-governance"
],
"summary": "Onboard a provider (affiliation + leases + exposure publish)",
"operationId": "onboardProvider",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Per-step ledger"
}
}
}
},
"/v1/entities/{entityId}/panel-mesh": {
"post": {
"tags": [
"entities-governance"
],
"summary": "Panel mesh recipe (affiliation approve + role lease)",
"operationId": "standUpPanelMesh",
"parameters": [
{
"name": "entityId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Affiliation + lease"
},
"503": {
"description": "affiliation_plane_down (invent_refuse)"
}
}
}
},
"/v1/provider-capability/attestations": {
"post": {
"tags": [
"entities-governance"
],
"summary": "Register a customer-signed capability attestation",
"operationId": "registerCapabilityAttestation",
"responses": {
"201": {
"description": "Attestation registered (verified)"
},
"422": {
"description": "vendor key / expired / invalid signature"
}
}
}
},
"/v1/provider-capability/attestations/verify": {
"post": {
"tags": [
"entities-governance"
],
"summary": "Verify an attestation (check only)",
"operationId": "verifyCapabilityAttestation",
"responses": {
"200": {
"description": "Valid attestation"
},
"422": {
"description": "Invalid attestation"
}
}
}
},
"/v1/provider-capability/intake": {
"post": {
"tags": [
"entities-governance"
],
"summary": "Intake a provider capability feed (field-map → upsert)",
"operationId": "intakeCapability",
"responses": {
"200": {
"description": "Intake mapped + validated (Soft)"
},
"422": {
"description": "Map unknown / contract violation"
}
}
}
},
"/v1/sourcing/admit": {
"post": {
"tags": [
"entities-governance"
],
"summary": "Verifier gate for sourcing admits (customer-key atest check)",
"operationId": "gateSourcingAdmit",
"responses": {
"200": {
"description": "Admitted (verified attestation)"
},
"422": {
"description": "attestation_required / invalid / expired"
}
}
}
}
},
"x-cross-vertical": {
"note": "One façade for every non-fungible asset CNS type. Never insurance-named: the lifecycles here are the same for vehicle, building, person, organization and resource principals; insurer/motor filing is one pack among many (claim_processing.md), not a branch.",
"cns_type_examples": [
"cns://claim/type/entity/vehicle",
"cns://claim/type/entity/building",
"cns://claim/type/person",
"cns://claim/type/organization",
"cns://claim/type/resource"
],
"compose_with_claims": "Processing claims link entities via metadata.entity_id; entities link claims via links. The voyage (correlation_id) joins both planes.",
"query_profiles": "sourcing forbids hydrate (CAPSRC-03); emergency mirrors the rule (INTRQ-15)."
}
}