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 "" for title and subtitle when no value is available. The type field determines the structure of enc_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. The notes field 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 recovery field 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
}