Secrets
Encrypted secret items across nine categories with per-category detail schemas and shared-folder key wrapping.
Service: passwords.secrets
Encrypted secret items supporting nine categories: logins, passwords, credit cards, identities, secure notes, bank accounts, crypto wallets, SSH keys, and API credentials. Each secret stores two encrypted blobs: enc_overview (always loaded, drives list rendering) and enc_details (lazy-loaded on the detail screen). The secret category (type) lives inside the encrypted overview — the server never learns what kind of secret it is.
Fields
| Field | Type | Required | Description |
|---|---|---|---|
id |
string |
— | Primary key. Read-only, auto-generated |
folder_id |
string? |
Parent folder id. null = unfiled |
|
owner_id |
string |
— | Owner user id. Read-only |
owner_wrapped_key |
string |
✅ | Content key wrapped by owner’s account key (base64) |
folder_wrapped_key |
string? |
Content key wrapped by folder key. null when not in a shared folder |
|
favorite |
boolean |
Marked as favorite. Default false |
|
trashed |
boolean |
Moved to trash. Default false |
|
shared |
boolean |
Shared with other users. Default false |
|
position |
float |
Fractional drag-sort position within a folder | |
enc_overview |
string |
✅ | Encrypted overview object. See SecretOverview. Always loaded in list and detail views |
enc_details |
string? |
Encrypted details object. See SecretDetails. Nullable — loaded via detail projection only | |
created_at |
string |
— | ISO 8601 creation timestamp. Read-only |
updated_at |
string |
— | ISO 8601 last update timestamp. Read-only |
secret_tag |
string[] |
Assigned tag IDs |
Filterable: folder_id · favorite · trashed · shared
Encrypted field schemas
Each enc_* column is an AES-GCM blob. After decryption the plaintext is a JSON value whose structure is documented below.
Danger: The server cannot validate encrypted field structures. Writing an incorrect schema will produce corrupted data for all clients. Follow the type definitions below exactly.
SecretOverview
Decrypted content of enc_overview. Object. Always loaded for list rendering.
| Field | Type | Required | Allowed values | Description |
|---|---|---|---|---|
type |
string |
✅ | login · password · card · identity · note · bank · crypto · ssh · api |
Secret category. Determines which fields are used in enc_details |
title |
string |
✅ | — | Primary display label (e.g. site name, card name) |
subtitle |
string |
✅ | — | Secondary display line (e.g. username, card ending "•••• 4242") |
Warning: All three fields are required. Use
""fortitleandsubtitlewhen no value is available. Thetypefield determines the structure ofenc_details— see the per-category schemas below.
SecretDetails
Decrypted content of enc_details. Object. Nullable — null until the detail view requests it.
The fields present in the object depend on the type stored in SecretOverview. Each category uses a specific subset of the fields listed below. Include only the fields relevant to the category — omit fields that don’t apply.
Warning: All string fields within a category should be present in the object. Use
""for fields without a value. Thenotesfield is shared across all categories.
Login (type: "login")
Credentials for a website or application.
| Field | Type | Required | Description |
|---|---|---|---|
username |
string |
✅ | Login username or email |
password |
string |
✅ | Login password |
url |
string |
✅ | Website URL |
totpSecret |
string? |
TOTP secret key (base32). null if 2FA is not configured |
|
passwordChangedAt |
string |
ISO 8601 timestamp of last password change | |
history |
PasswordHistory[] | Previous password values | |
notes |
string |
Free-text notes |
Password (type: "password")
Standalone password without a login context.
| Field | Type | Required | Description |
|---|---|---|---|
password |
string |
✅ | The password |
passwordChangedAt |
string |
ISO 8601 timestamp of last password change | |
history |
PasswordHistory[] | Previous password values | |
notes |
string |
Free-text notes |
Credit Card (type: "card")
Payment card details.
| Field | Type | Required | Description |
|---|---|---|---|
cardholder |
string |
✅ | Name on the card |
cardNumber |
string |
✅ | Full card number |
expMonth |
string |
✅ | Expiration month ("01" – "12") |
expYear |
string |
✅ | Expiration year (4-digit, e.g. "2028") |
cvv |
string |
✅ | Card verification value |
pin |
string |
ATM PIN code | |
bank |
string |
Issuing bank name | |
notes |
string |
Free-text notes |
Identity (type: "identity")
Personal identity document or profile.
| Field | Type | Required | Description |
|---|---|---|---|
firstName |
string |
✅ | First name |
lastName |
string |
✅ | Last name |
email |
string |
Email address | |
phone |
string |
Phone number | |
address |
string |
Postal address (free-form) | |
notes |
string |
Free-text notes |
Secure Note (type: "note")
Free-form encrypted note.
| Field | Type | Required | Description |
|---|---|---|---|
notes |
string |
✅ | Note content (plain text) |
Bank Account (type: "bank")
Bank account details.
| Field | Type | Required | Description |
|---|---|---|---|
bank |
string |
✅ | Bank name |
cardNumber |
string |
✅ | Account number / IBAN |
routing |
string |
Routing number / BIC / SWIFT | |
pin |
string |
Online banking PIN | |
notes |
string |
Free-text notes |
Crypto Wallet (type: "crypto")
Cryptocurrency wallet credentials.
| Field | Type | Required | Description |
|---|---|---|---|
walletAddress |
string |
✅ | Public wallet address |
password |
string |
Wallet password | |
recovery |
string |
Seed phrase / recovery key | |
notes |
string |
Free-text notes |
Warning: The
recoveryfield typically contains a 12- or 24-word mnemonic seed phrase. Treat this as the most sensitive field — loss or exposure is irreversible.
SSH Key (type: "ssh")
SSH key pair and passphrase.
| Field | Type | Required | Description |
|---|---|---|---|
publicKey |
string |
✅ | Public key (e.g. "ssh-ed25519 AAAA...") |
privateKey |
string |
✅ | Private key (PEM format) |
passphrase |
string |
Private key passphrase | |
passwordChangedAt |
string |
ISO 8601 timestamp of last key rotation | |
history |
PasswordHistory[] | Previous private key values | |
notes |
string |
Free-text notes |
API Credential (type: "api")
API keys and secrets.
| Field | Type | Required | Description |
|---|---|---|---|
endpoint |
string |
✅ | API base URL or endpoint |
apiKey |
string |
✅ | API key / client ID |
apiSecret |
string |
API secret / client secret | |
notes |
string |
Free-text notes |
PasswordHistory
Array of previous password/key values, ordered newest first.
| Field | Type | Required | Description |
|---|---|---|---|
value |
string |
✅ | Previous password or key value |
changedAt |
string |
✅ | ISO 8601 timestamp when this value was replaced |
find
List secrets with filtering, sorting, and pagination. Uses list projection — enc_details is excluded for performance.
WebSocket
Request
{
"jsonrpc": "2.0",
"method": "passwords.secrets.find",
"params": {
"filter": { "trashed": { "$eq": false } },
"sort": [{ "field": "created_at", "dir": "desc" }],
"limit": 100,
"fields": [
"id", "folder_id", "favorite", "trashed", "shared", "position",
"created_at", "updated_at",
"enc_overview",
"owner_id", "owner_wrapped_key", "folder_wrapped_key",
"secret_tag"
]
},
"id": 1
}
Response
{
"jsonrpc": "2.0",
"result": {
"items": [
{
"id": "1920438291738",
"folder_id": "1920438291700",
"favorite": false,
"trashed": false,
"shared": false,
"position": 1000.0,
"created_at": "2026-05-01T10:30:00Z",
"updated_at": "2026-05-13T18:30:00Z",
"enc_overview": "<base64>",
"owner_id": "42",
"owner_wrapped_key": "<base64>",
"folder_wrapped_key": null,
"secret_tag": ["1920438291800"]
}
],
"total": 47
},
"id": 1
}
findOneById
Fetch a single secret with full detail including the encrypted details blob.
WebSocket
Request
{
"jsonrpc": "2.0",
"method": "passwords.secrets.findOneById",
"params": {
"id": "1920438291738",
"fields": [
"id", "folder_id", "favorite", "trashed", "shared", "position",
"created_at", "updated_at",
"enc_overview", "enc_details",
"owner_id", "owner_wrapped_key", "folder_wrapped_key",
"secret_tag"
]
},
"id": 2
}
Response
{
"jsonrpc": "2.0",
"result": {
"id": "1920438291738",
"folder_id": "1920438291700",
"favorite": false,
"trashed": false,
"shared": false,
"position": 1000.0,
"created_at": "2026-05-01T10:30:00Z",
"updated_at": "2026-05-13T18:30:00Z",
"enc_overview": "<base64>",
"enc_details": "<base64>",
"owner_id": "42",
"owner_wrapped_key": "<base64>",
"folder_wrapped_key": null,
"secret_tag": ["1920438291800"]
},
"id": 2
}
create
Create a new secret. The server assigns id, created_at, and updated_at.
WebSocket
Request
{
"jsonrpc": "2.0",
"method": "passwords.secrets.create",
"params": {
"document": {
"folder_id": "1920438291700",
"favorite": false,
"position": 1000.0,
"enc_overview": "<base64>",
"enc_details": "<base64>",
"owner_wrapped_key": "<base64>",
"secret_tag": ["1920438291800"]
}
},
"id": 3
}
Response
{
"jsonrpc": "2.0",
"result": {
"id": "1920438291738",
"enc_overview": "<base64>",
"created_at": "2026-05-13T18:30:00Z"
},
"id": 3
}
updateOneById
Partial update — only specified fields change; omitted fields are untouched. Nested collections are updated automatically: items with id are updated, items without id are created, items missing from the array are deleted.
WebSocket
Request
{
"jsonrpc": "2.0",
"method": "passwords.secrets.updateOneById",
"params": {
"id": "1920438291738",
"document": {
"enc_overview": "<base64-new>",
"enc_details": "<base64-new>"
}
},
"id": 4
}
Response
{
"jsonrpc": "2.0",
"result": {
"id": "1920438291738",
"enc_overview": "<base64-new>",
"updated_at": "2026-05-13T18:45:00Z"
},
"id": 4
}
replaceOneById
Full replacement — all writable fields must be provided. Unlike updateOneById, omitted fields are reset to defaults.
WebSocket
Request
{
"jsonrpc": "2.0",
"method": "passwords.secrets.replaceOneById",
"params": {
"id": "1920438291738",
"document": {
"folder_id": "1920438291700",
"favorite": false,
"position": 1000.0,
"enc_overview": "<base64>",
"enc_details": "<base64>"
}
},
"id": 4
}
deleteOneById
Delete a secret. All tag assignments are deleted with it.
WebSocket
Request
{
"jsonrpc": "2.0",
"method": "passwords.secrets.deleteOneById",
"params": {
"id": "1920438291738"
},
"id": 6
}
Response
{
"jsonrpc": "2.0",
"result": {
"id": "1920438291738",
"enc_overview": "<base64>"
},
"id": 6
}
update
Batch update multiple secrets in a single transaction (all-or-nothing). See Batch operations.
WebSocket
Request
{
"jsonrpc": "2.0",
"method": "passwords.secrets.update",
"params": {
"items": [
{ "id": "1920438291738", "document": { "favorite": true } },
{ "id": "1920438291739", "document": { "favorite": true } }
]
},
"id": 5
}
Response
{
"jsonrpc": "2.0",
"result": {
"affected": 2,
"items": [
{ "id": "1920438291738", "favorite": true },
{ "id": "1920438291739", "favorite": true }
]
},
"id": 5
}
delete
Batch delete secrets in a single transaction (all-or-nothing). See Batch operations.
WebSocket
Request
{
"jsonrpc": "2.0",
"method": "passwords.secrets.delete",
"params": {
"items": [
{ "id": "1920438291738" },
{ "id": "1920438291739" }
]
},
"id": 7
}
Response
{
"jsonrpc": "2.0",
"result": {
"affected": 2,
"items": [
{ "id": "1920438291738" },
{ "id": "1920438291739" }
]
},
"id": 7
}