Skip to main content
An item is a stored credential. Every item belongs to a profile, inherits its storage mode, and carries a kind that suggests which fields are expected.

Schema

There is no separate contentNonce or keyNonce column — both nonces are prepended into the ciphertext/key fields. Labels and tags are stored in cleartext to allow listing without decryption.

The plaintext envelope

The plaintext that gets encrypted has a stable JSON shape:
For zero-knowledge items the entire JSON is encrypted with the item DEK. For server-managed items it’s encrypted with AES-256-GCM by the API.

Kinds and standard fields

Each kind suggests the standard fields readers will look for. The fields themselves are free-form, but using the standard names enables single-field auto-delivery. See Field delivery for the resolution rules when a reader requests a specific field.

Optimistic concurrency

Updates use contentVersion for optimistic concurrency. Pass the current version with the update; the server rejects stale writes with STALE_VERSION. Re-fetch and retry.

Lifecycle

Soft-delete preserves the ciphertext but prevents future access. Permissions cascade-deny with result: cascade audit entries.

Listing

Both operators and agents can list items, but the responses differ:
  • GET /v1/items (session) returns metadata for every item the user can see in the active organization.
  • GET /v1/items (agent) returns metadata only for items the calling agent has at least one permission row on. Agents without grants get an empty list.
Neither endpoint returns secret data. To read a secret, call POST /v1/access/{itemId}/read (or reserve a mount with POST /v1/access/{itemId}/use) with the appropriate capability.