Asset inventory lists keys, active generations, authorities, owners, destruction state, and integrity status. Use historical=true with a logicalId to include that key's older generations.
Endpoint:
GET /v1/keeper/compliance/inventory
Query params:
| Param | Meaning |
|---|---|
logicalId |
filter by key id |
assetOwner |
filter by owner |
historical |
include old generations; requires logicalId |
lastSeen |
cursor |
limit |
max 200 |
Required permission:
tkeeper.compliance.inventory
Example:
curl \
-H 'X-DEV-TOKEN: dev-token' \
'http://localhost:8080/v1/keeper/compliance/inventory?logicalId=deployment-signing&assetOwner=customer-42&historical=true'
Response shape:
{
"inventory": {
"generatedAt": 1760000000000,
"peerId": 1,
"threshold": 2,
"totalPeers": 3,
"items": [
{
"logicalId": "deployment-signing",
"status": "ACTIVE",
"currentGeneration": 1,
"authorities": [
{
"id": "production-deployment",
"oci": "oci://registry.example/verdict/authorities/production-deployment@sha256:..."
}
],
"algorithm": "SECP256K1",
"createdAt": 1760000000000,
"updatedAt": 1760000000000,
"policy": null,
"hasActiveKey": true,
"lastPendingGeneration": null,
"assetOwner": "customer-42",
"tampered": false
}
]
},
"nextCursor": null,
"hasMore": false
}
External control-plane clients can call the inventory APIs with the same permissions.
tampered = true means local signed metadata failed integrity verification while inventory was being read.
Investigate tampered = true as a security incident. Stop relying on that node's inventory or key state until the cause is understood.
During reconciliation, compare this node's inventory with peer generations, audit history, and external ownership records.
Common problems
Inventory is empty
Check permissions first. Then check whether the key was created on this cluster and whether you are filtering by assetOwner, logicalId, or cursor.